[
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Règles de contribution\n\n## 🔐 Signaler une vulnérabilité\n\nNous prenons la sécurité **très au sérieux**. Si tu découvres une **vulnérabilité** dans **Papillon**, merci de suivre notre [**politique de sécurité**](https://github.com/PapillonApp/Papillon/.github/blob/main/SECURITY.md) : **n’ouvre pas d’issue publique** et signale-la directement à l’adresse suivante : <mark style=\"color:$danger;\">**support@papillon.bzh**</mark>.\n\n## 📤 Soumettre une Pull Request\n\nNous serions ravis d’intégrer tes modifications à Papillon. Cependant, avant de fusionner avec la branche principale, merci de respecter les règles ci-dessous. En cas de non-respect, ta Pull Request sera considérée comme **invalide** et ne sera pas traitée tant que les corrections nécessaires n’auront pas été apportées.\n\n* [x] Tu ne dois pas soumettre plusieurs fonctionnalités ou corrections de bugs dans une même Pull Request. Chaque modification doit rester isolée afin de faciliter son traitement et, si nécessaire, son éventuel retour.\n* [x] Si ta Pull Request concerne des changements majeurs, merci d'ouvrir une Issue pour discuter avec les mainteneurs de la stratégie à adopter pour ne pas faire de gros travaux pour rien.\n* [x] Ta Pull Request doit respecter les conventions [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) et [Conventional Branch](https://conventional-branch.github.io/), ainsi que le style de code de l’application.\n* [x] Si ta Pull Request modifie une partie documentée, comme la structure, l’architecture ou autre, assure-toi d’avoir mis à jour la documentation en conséquence.\n* [x] J'ai testé mes changements sur iOS et Android et l'application compile correctement.\n* [x] J'utilise un langage informel (tutoiement).\n\n#### ❓ Comment vérifier le Lint ?\n\nPar défaut, en effectuant la commande ci-dessous, ESLint essayera de résoudre automatiquement les problèmes, s'il n'y arrive pas, tu dois les corriger manuellement.\n\n```bash\n$ npm run lint\n```\n\n## 📥 Ouvrir une issue\n\nAvant d’ouvrir une issue, assure-toi d’utiliser la **dernière version** de **Papillon**, teste si le problème persiste après mise à jour, et vérifie qu’une issue similaire n’a pas **déjà** été ouverte. Une issue bien écrite facilite son traitement et est toujours plus agréable pour nous à lire, afin que le traitement se passe au mieux, voici quelques conseils :\n\n1. **Elle porte un nom explicite**, qui permet d’identifier **immédiatement** son **sujet principal**.\n2. **Aucune issue semblable n’existe déjà** : il est inutile d’en créer plusieurs pour le même problème, **cela ne fait que ralentir son traitement**. Si tu es concerné par une issue existante, **réagis** simplement avec un👍\n3. **Elle contient une description détaillée**, si c’est une fonctionnalité, elle est **clairement expliquée**, idéalement accompagnée d’une **capture d’écran** ou d’un **design Figma,** s’il s’agit d’un bug, la description précise **le comportement actuel**, **le comportement attendu**, ainsi que **les étapes pour le reproduire**.\n4. Si tu rencontres **le même problème** ou souhaite **la même fonctionnalité**, privilégie les **réactions** aux commentaires.\n5. **Compléte le modèle fourni lors de la création de ton issue**, il a été rédigé pour t'aider à **structurer ta demande, ne rien oublier d’important et gagner du temps**."
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "ko_fi: thepapillonapp\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yml",
    "content": "name: 🐛 Signaler un bug\ndescription: Signaler des bugs nous permet d'améliorer Papillon !\ntitle: \"[Bug]: \"\n\nbody:\n  - type: textarea\n    attributes:\n      label: Description du bug\n      description: Plus il y a de détails, plus vite nous pourrons trouver le bug !\n      placeholder: La connexion à mon établissement ne fonctionne pas, j'ai un chargement infini lors de la connexion\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: Étapes à reproduire\n      description: Comment pouvons-nous reproduire le bug ?\n      placeholder: |\n        1. Ouvrir l'application\n        2. Se connecter à l'établissement\n        3. Observer le comportement\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: Comportement attendu\n      description: Ce que Papillon devrait faire\n      placeholder: Que la connexion à mon établissement fonctionne et qu'il n'y ait pas de chargement infini\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: Appareil\n      description: Sur quel appareil tu as rencontré ce bug ?\n      placeholder: iPhone 13, Samsung Galaxy S23...\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: Version du système d'exploitation\n      description: Paramètres (du Téléphone) -> À propos (Android)/Général (Apple)\n      placeholder: iOS 18, Android 15...\n    validations:\n      required: true\n\n  - type: dropdown\n    attributes:\n      label: Papillon testé depuis\n      description: Tu as testé/installé Papillon depuis...\n      options:\n        - Play/App Store (version stable)\n        - Play Store/TestFlight (version bêta)\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: Version utilisée\n      description: Paramètres (de Papillon) -> Version affichée en bas de la page\n      placeholder: \"8.0.0\"\n    validations:\n      required: true\n\n  - type: dropdown\n    attributes:\n      label: Service scolaire/cantine\n      description: 🎒 = Service scolaire et 🍽️ = Service de cantine\n      options:\n        - 🎒🦋 Pronote\n        - 🎒🟦 ÉcoleDirecte\n        - 🎒🟡 Skolengo\n        - 🎒🏫 Universités et autres (à préciser dans la description du bug)\n        - 🍽️🟢 Alise\n        - 🍽️🔴 Turboself\n        - 🍽️🟣 ARD\n        - 🍽️🔵 Izly\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: \"Capture(s) d'écran / vidéo\"\n      description: Cela permettra une résolution encore plus rapide du bug\n      placeholder: Il faut cliquer sur l'icône 📎 pour pouvoir importer une/des photo(s)/vidéo(s)\n    validations:\n      required: false"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n\ncontact_links:\n  - name: Une faille de sécurité ?\n    url: https://github.com/PapillonApp/Papillon/security/advisories/new\n    about: Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabilité, veuillez remplir ce formulaire.\n\n  - name: Une question ? Un problème ?\n    url: https://discord.gg/xn3NstgjuT\n    about: Rejoignez nous sur Discord et obtenez de l’aide rapidement !"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature.yml",
    "content": "name: ✨ Amélioration/Fonctionnalité\ndescription: Comment pouvons-nous améliorer Papillon ?\ntitle: \"[Feature]: \"\n\nbody:\n  - type: textarea\n    attributes:\n      label: Description de la fonctionnalité\n      description: Fais place à ta créativité en détaillant ce que tu veux\n      placeholder: Ça serait cool une intégration d'un simulateur permettant de savoir si on aura le bac/brevet \n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: Davantage de détails ?\n      description: Une image pour montrer à quoi ça ressemblerait ? Ce n'est pas obligatoire\n      placeholder: Ah, même si j'ai des idées, je ne suis pas designer 😂\n    validations:\n      required: false"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "![Contribution](https://github.com/PapillonApp/papillon-v8/raw/main/.github/assets/contribution_header.png)\n\n# Règles de contribution\n> [!CAUTION]\n> Afin de garantir une application stable et pérenne dans le temps, nous t'invitons à vérifier que tu as bien respecté les règles de contribution. Sans cela, ta Pull Request ne pourra pas être examinée.\n\n- [ ] Cette Pull Request porte sur une seule fonctionnalité ou un seul correctif.\n- [ ] Cette Pull Request n'est pas faite essentiellement avec de l'IA.\n- [ ] Pour tout changement majeur, j’ai créé une issue afin d’échanger avec les mainteneurs de Papillon sur la meilleure façon de l’intégrer.\n- [ ] Ma Pull Request respecte les conventions Conventional Commits et Conventional Branch ainsi que les conventions de codage de l'application.\n- [ ] J’ai testé mes modifications sur iOS et Android, et l’application fonctionne correctement.\n- [ ] J’emploie un langage informel, clair et concis dans mes messages.\n- [ ] J’ai documenté mes changements de manière appropriée, soit dans la description de la Pull Request, soit dans le GitBook.\n- [ ] J’ai ajouté les traductions nécessaires dans au moins un fichier de langue.\n\n# Résumé des changements\n\n> [!NOTE]\n> Une description détaillée des changements apportés dans cette Pull Request permet un traitement plus efficace et rapide.\n\n# Capture(s) d'écran\n\n> [!NOTE]\n> Si tes changements concernent l'interface utilisateur, inclue des captures d'écran pour illustrer tes modifications.\n\n# Informations supplémentaires\n> [!NOTE]\n> Numéro des issues concernées par cette Pull Request, détail sur le fonctionnement ou les choix techniques effectués, ainsi que toute autre information pertinente.\n"
  },
  {
    "path": ".github/bot/package.json",
    "content": "{\n  \"name\": \"bot\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"build\": \"tsc\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"type\": \"commonjs\",\n  \"devDependencies\": {\n    \"@actions/core\": \"^2.0.1\",\n    \"@actions/github\": \"^6.0.1\",\n    \"@octokit/rest\": \"^22.0.1\",\n    \"@types/node\": \"^25.0.0\",\n    \"typescript\": \"^5.9.3\"\n  }\n}\n"
  },
  {
    "path": ".github/bot/src/issue/index.ts",
    "content": "import * as github from '@actions/github';\nimport * as core from '@actions/core';\nimport { getLabelsFromTitle } from './labeler';\nimport { postWelcomeMessage } from './message';\n\nasync function run() {\n  try {\n    const context = github.context;\n    const token = process.env.GITHUB_TOKEN;\n\n    if (!token) {\n      throw new Error(\"GITHUB_TOKEN is missing\");\n    }\n\n    const octokit = github.getOctokit(token);\n\n    if (!context.payload.issue) {\n      core.info(\"Not an issue event, skipping.\");\n      return;\n    }\n\n    const { title, number, user } = context.payload.issue;\n    const { owner, repo } = context.repo;\n\n    core.info(`Processing Issue #${number}: ${title}`);\n\n    const labelsToAdd = getLabelsFromTitle(title);\n    \n    if (context.payload.action === 'opened') {\n      labelsToAdd.push('status: needs triage');\n    }\n\n    if (labelsToAdd.length > 0) {\n      await octokit.rest.issues.addLabels({\n        owner,\n        repo,\n        issue_number: number,\n        labels: labelsToAdd,\n      });\n      core.info(`Added labels: ${labelsToAdd.join(', ')}`);\n    }\n\n    if (context.payload.action === 'opened') {\n        await postWelcomeMessage(octokit, owner, repo, number, user.login);\n    }\n\n  } catch (error) {\n    if (error instanceof Error) core.setFailed(error.message);\n  }\n}\n\nrun();\n"
  },
  {
    "path": ".github/bot/src/issue/labeler.ts",
    "content": "export function getLabelsFromTitle(title: string): string[] {\n  const labels: string[] = [];\n  \n  const lowerTitle = title.toLowerCase();\n  \n  if (lowerTitle.startsWith('[bug]')) {\n    labels.push('type: bug');\n  } else if (lowerTitle.startsWith('[feature]')) {\n    labels.push('type: enhancement');\n  }\n\n  return labels;\n}\n"
  },
  {
    "path": ".github/bot/src/issue/message.ts",
    "content": "import { Octokit } from '@octokit/rest';\n\nexport async function postWelcomeMessage(\n  octokit: any,\n  owner: string,\n  repo: string,\n  issueNumber: number,\n  author: string\n) {\n  const message = `\n# 🦋 Merci pour ta contribution sur Papillon\n\nMerci pour l'intérêt que tu portes au projet **Papillon** !\nNous espérons te revoir très bientôt avec une nouvelle issue !\n\nÀ très vite sur **Papillon** 🦋\n`.trim();\n\n  const comments = await octokit.rest.issues.listComments({\n    owner,\n    repo,\n    issue_number: issueNumber,\n  });\n\n  const botComment = comments.data.find((comment: any) => \n    comment.body && comment.body.includes(\"Merci pour ta contribution sur Papillon\")\n  );\n\n  if (!botComment) {\n    await octokit.rest.issues.createComment({\n      owner,\n      repo,\n      issue_number: issueNumber,\n      body: message,\n    });\n  }\n}\n"
  },
  {
    "path": ".github/bot/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"commonjs\",\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true\n  },\n  \"include\": [\"src/**/*\"]\n}\n"
  },
  {
    "path": ".github/workflows/build-android.yml",
    "content": "name: Build Android\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  build:\n    name: Build & Upload to Play Store\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n\n      - name: Setup Node\n        uses: actions/setup-node@v4\n        with:\n          node-version: 20\n          cache: npm\n\n      - name: Setup Java\n        uses: actions/setup-java@v4\n        with:\n          distribution: temurin\n          java-version: 17\n\n      - name: Setup Gradle\n        uses: gradle/actions/setup-gradle@v4\n\n      - name: Install dependencies\n        run: npm install --legacy-peer-deps\n\n      - name: Cache Expo prebuild\n        id: prebuild-cache\n        uses: actions/cache@v4\n        with:\n          path: android/\n          key: ${{ runner.os }}-expo-prebuild-${{ hashFiles('app.json', 'package-lock.json') }}\n          restore-keys: ${{ runner.os }}-expo-prebuild-\n\n      - name: Create secrets.json\n        run: |\n          echo '{\n            \"APP_KEY\": \"${{ secrets.COUNTLY_APP_KEY }}\",\n            \"SALT\": \"${{ secrets.COUNTLY_SALT }}\",\n            \"SERVER_URL\": \"${{ secrets.COUNTLY_SERVER_URL }}\"\n          }' > secrets.json\n\n      - name: Prebuild Android\n        if: steps.prebuild-cache.outputs.cache-hit != 'true'\n        run: npx expo prebuild --platform android --clean\n\n      - name: Decode keystore\n        run: echo \"${{ secrets.KEYSTORE }}\" | base64 --decode > android/app/release.keystore\n\n      - name: Calculate version code\n        run: |\n          VERSION_CODE=$(node -e \"\n            const version = require('./package.json').version;\n            const cleanVersion = parseInt(version.replace(/\\./g, ''));\n            const runNumber = parseInt(process.env.GITHUB_RUN_NUMBER || '0');\n            console.log(cleanVersion * 100000 + runNumber);\n          \")\n          echo \"VERSION_CODE=$VERSION_CODE\" >> $GITHUB_ENV\n\n      - name: Configure signing\n        run: |\n          sed -i '/signingConfigs {/a\\        release {\\n            storeFile file('\\''release.keystore'\\'')\\n            storePassword '\\''${{ secrets.KEYSTORE_PASSWORD }}'\\''\\n            keyAlias '\\''${{ secrets.KEY_ALIAS }}'\\''\\n            keyPassword '\\''${{ secrets.KEY_PASSWORD }}'\\''\\n        }' android/app/build.gradle\n          sed -i 's/signingConfig signingConfigs.debug/signingConfig signingConfigs.release/' android/app/build.gradle\n          sed -i \"s/versionCode .*/versionCode ${{ env.VERSION_CODE }}/\" android/app/build.gradle\n\n      - name: Configure Gradle\n        run: |\n          chmod +x android/gradlew\n          echo \"org.gradle.jvmargs=-Xmx6144m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError\" >> android/gradle.properties\n          echo \"org.gradle.parallel=true\" >> android/gradle.properties\n          echo \"org.gradle.caching=true\" >> android/gradle.properties\n          echo \"org.gradle.configuration-cache=true\" >> android/gradle.properties\n          echo \"android.enable16KbPageSizes=true\" >> android/gradle.properties\n\n      - name: Build AAB\n        run: cd android && ./gradlew bundleRelease --no-daemon\n\n      - name: Upload AAB artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: app-release.aab\n          path: android/app/build/outputs/bundle/release/*.aab\n\n      - name: Upload to Play Store\n        uses: r0adkll/upload-google-play@v1\n        with:\n          serviceAccountJsonPlainText: ${{ secrets.PLAY_STORE_KEY }}\n          packageName: xyz.getpapillon.app\n          releaseFiles: android/app/build/outputs/bundle/release/*.aab\n          track: internal\n          inAppUpdatePriority: 3\n          status: draft\n"
  },
  {
    "path": ".github/workflows/merge.yml",
    "content": "name: Merge dev into main\n\non:\n  workflow_dispatch:\n\njobs:\n  merge:\n    name: Merge\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Generate app token\n        id: app-token\n        uses: actions/create-github-app-token@v3\n        with:\n          app-id: ${{ vars.APP_ID }}\n          private-key: ${{ secrets.APP_PRIVATE_KEY }}\n\n      - name: Checkout repository\n        uses: actions/checkout@v4\n        with:\n          token: ${{ steps.app-token.outputs.token }}\n          fetch-depth: 0\n\n      - name: Configure git\n        run: |\n          git config user.name \"papillon-release[bot]\"\n          git config user.email \"papillon-release[bot]@users.noreply.github.com\"\n\n      - name: Merge dev into main\n        run: |\n          git checkout main\n          git merge origin/dev --no-edit\n          git push origin main\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: \"Numéro de version (x.x.x)\"\n        required: true\n        type: string\n\njobs:\n  release:\n    name: Merge & Release\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Validate version format\n        run: |\n          if ! echo \"${{ inputs.version }}\" | grep -Eq '^[0-9]+\\.[0-9]+\\.[0-9]+$'; then\n            echo \"::error::Version invalide '${{ inputs.version }}'. Format attendu : x.x.x (ex: 7.2.0)\"\n            exit 1\n          fi\n\n      - name: Generate app token\n        id: app-token\n        uses: actions/create-github-app-token@v3\n        with:\n          app-id: ${{ vars.APP_ID }}\n          private-key: ${{ secrets.APP_PRIVATE_KEY }}\n\n      - name: Checkout repository\n        uses: actions/checkout@v4\n        with:\n          token: ${{ steps.app-token.outputs.token }}\n          fetch-depth: 0\n\n      - name: Configure git\n        run: |\n          git config user.name \"papillon-release[bot]\"\n          git config user.email \"papillon-release[bot]@users.noreply.github.com\"\n\n      - name: Merge dev into main\n        run: |\n          git checkout main\n          git merge origin/dev --no-edit\n          git push origin main\n\n      - name: Create release\n        uses: softprops/action-gh-release@v2\n        with:\n          token: ${{ steps.app-token.outputs.token }}\n          tag_name: v${{ inputs.version }}\n          name: v${{ inputs.version }}\n          target_commitish: main\n          make_latest: true\n          body: |\n            <a href=\"https://github.com/PapillonApp/Papillon\"><picture><source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/8bffdf1a-6e18-4545-874d-94c3978fb1c3\"><source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/cc4a4903-fbf6-45ab-bb91-467351c89803\"><img alt=\"Papillon\" src=\"https://github.com/user-attachments/assets/cc4a4903-fbf6-45ab-bb91-467351c89803\"></picture></a>\n\n            **Notes de mise à jour :** https://papillon.bzh/release-notes/${{ inputs.version }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files\n\n# dependencies\nnode_modules/\n\n# Expo\n.expo/\ndist/\nweb-build/\nexpo-env.d.ts\n.idea/\n\n# Native\n.kotlin/\n*.orig.*\n*.jks\n*.p8\n*.p12\n*.key\n*.mobileprovision\n\n# Metro\n.metro-health-check*\n\n# debug\nnpm-debug.*\nyarn-debug.*\nyarn-error.*\n\n# macOS\n.DS_Store\n*.pem\n\n# local env files\n.env*.local\n\n# typescript\n*.tsbuildinfo\n\nios/\n!ios/Papillon\n!ios/Papillon.xcodeproj/xcshareddata/xcschemes\nios/Podfile\nandroid/**\nandroid/*\n!android/app/\n!android/app/src/\n!android/app/src/main/\n!android/app/src/main/AndroidManifest.xml\n\nbun.lock\nyarn.lock\n\nsecrets.json\n.vscode/\n.idea/"
  },
  {
    "path": ".prettierignore",
    "content": "# Dependencies\nnode_modules/\nbun.lock\npackage-lock.json\nyarn.lock\n\n# Build outputs\ndist/\nbuild/\n.expo/\nandroid/build/\nios/build/\n\n# Generated files\n*.log\n.DS_Store\n.vscode/\n.idea/\n\n# Platform specific\nandroid/\nios/Pods/\nios/Papillon.xcworkspace/\nios/Papillon.xcodeproj/\n\n# Patches\npatches/\n"
  },
  {
    "path": ".prettierrc.json",
    "content": "{\n  \"semi\": true,\n  \"trailingComma\": \"es5\",\n  \"singleQuote\": false,\n  \"printWidth\": 80,\n  \"tabWidth\": 2,\n  \"useTabs\": false,\n  \"bracketSpacing\": true,\n  \"bracketSameLine\": false,\n  \"arrowParens\": \"avoid\",\n  \"endOfLine\": \"lf\"\n}\n"
  },
  {
    "path": "CODEOWNERS",
    "content": "services/* @raphckrman\ndatabase/* @raphckrman\nstores/* @raphckrman\n\n.github/* @ryzenixx\n\nutils/magic/* @tryon-dev\n\nui/* @ecnivtwelve\napp/* @ecnivtwelve\ncomponents/* @ecnivtwelve\nutils/* @ecnivtwelve\n\nui/components/Pattern/* @godetremy\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <a href=\"https://github.com/PapillonApp/Papillon\"><picture><source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/8bffdf1a-6e18-4545-874d-94c3978fb1c3\"><source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/cc4a4903-fbf6-45ab-bb91-467351c89803\"><img alt=\"Papillon\" src=\"https://github.com/user-attachments/assets/cc4a4903-fbf6-45ab-bb91-467351c89803\"></picture></a>\n</p>\n\n<p align=\"center\">\n  L'application libre et open source <b>ultime</b> pour gérer toute ta vie scolaire sans compromis.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://papillon.bzh/download\"><picture><source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/58713fdf-1768-4093-9aba-cf09d01e296b\"><source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/5ce75010-f06f-446f-bee5-94745bf8ab15\"><img alt=\"Télécharger\" src=\"https://github.com/user-attachments/assets/5ce75010-f06f-446f-bee5-94745bf8ab15\"></picture></a> <a href=\"https://papillon.bzh/\"><picture><source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/43883003-54bd-4ad6-8660-4a23b1b6fe2b\"><source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/f435b124-3d2c-491d-9b59-e5b2ed90d024\"><img alt=\"Site web\" src=\"https://github.com/user-attachments/assets/f435b124-3d2c-491d-9b59-e5b2ed90d024\"></picture></a> <a href=\"https://docs.papillon.bzh/\"><picture><source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/fe722cf6-45e9-4cb4-a958-b7e21eb5cf0a\"><source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/2545f95a-d0e3-49e6-b628-0f16b009cf97\"><img alt=\"Documentation\" src=\"https://github.com/user-attachments/assets/2545f95a-d0e3-49e6-b628-0f16b009cf97\"></picture></a>\n</p>\n\n#\n<br />\n\n<p align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/53902bcf-6f5b-40ec-84a6-490183e731bc\">\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/18e38796-0258-401f-a026-9ddaa69bdf01\">\n    <img alt=\"Interface intuitive\" src=\"https://github.com/user-attachments/assets/18e38796-0258-401f-a026-9ddaa69bdf01\">\n  </picture>\n  \n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/b336b00d-801a-4180-91d7-46cabe3277dd\">\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/d66a0dcd-4b4a-4316-9cac-043fe4a93ef7\">\n    <img alt=\"Données précises\" src=\"https://github.com/user-attachments/assets/d66a0dcd-4b4a-4316-9cac-043fe4a93ef7\">\n  </picture>\n\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/user-attachments/assets/ceecdfce-0b3f-493d-933d-fc22f21966c8\">\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://github.com/user-attachments/assets/8cae7eed-bcdd-4763-84a5-3cb6d9a142ba\">\n    <img alt=\"Affichage intelligent\" src=\"https://github.com/user-attachments/assets/8cae7eed-bcdd-4763-84a5-3cb6d9a142ba\">\n  </picture>\n</p>\n\n#\n<br />\n\n<p align=\"center\">\n  <img alt=\"Bienvenue !\" src=\"https://github.com/user-attachments/assets/b9b5be6f-49cb-4327-a4dc-1c4325cff113\" />\n  \n  <p align=\"center\">\n  <b>Si tu souhaites contribuer à Papillon, tu es au bon endroit !</b><br/>\n  Retrouve les resources importantes pour t'aider à commencer dans l'univers Papillon ci-dessous.\n  </p>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://docs.papillon.bzh/developper/compile\"><img alt=\"Compiler\" src=\"https://github.com/user-attachments/assets/3555367e-3813-4edc-9d60-998b2c1a9f79\" /></a>\n  <a href=\"https://docs.papillon.bzh/ui\"><img alt=\"Papillon UI\" src=\"https://github.com/user-attachments/assets/75176fa7-4745-4c70-8464-569f61e3ac2b\" /></a>\n  <a href=\"https://discord.gg/wVKWBRTbfh\"><img alt=\"Community\" src=\"https://github.com/user-attachments/assets/bac194cc-9183-4167-9bef-5787c9929b95\" /></a>\n</p>\n\n#\n<br />\n\n<p align=\"center\">\n<img alt=\"L'équipe\" src=\"https://github.com/user-attachments/assets/cf7f8edf-016f-4c03-bb78-5c54b4690986\" />\n\n<p align=\"center\">\n<table><tr>\n<td>\n<p align=\"center\">\n<a href=\"https://github.com/ecnivtwelve\"><img alt=\"\" src=\"https://github.com/user-attachments/assets/73e73e9c-b771-47ef-8d87-adf634fda95a\" /></a>\n<p align=\"center\">Vince</p>\n</p>\n</td>\n\n<td>\n<p align=\"center\">\n<a href=\"https://github.com/tryon-dev\"><img alt=\"\" src=\"https://github.com/user-attachments/assets/7ab04024-2cdc-47e7-91e9-ba234efb1d3d\" /></a>\n<p align=\"center\">Lucas</p>\n</p>\n</td>\n\n<td>\n<p align=\"center\">\n<a href=\"https://github.com/godetremy\"><img alt=\"\" src=\"https://github.com/user-attachments/assets/64ba327b-9095-4972-b8a8-d2e81819b327\" /></a>\n<p align=\"center\">Rémy</p>\n</p>\n</td>\n\n<td>\n<p align=\"center\">\n<a href=\"https://github.com/tom-things\"><img alt=\"\" src=\"https://github.com/user-attachments/assets/79437727-c6a7-443c-b20a-3b83e6d1d46e\" /></a>\n<p align=\"center\">Tom</p>\n</p>\n</td>\n\n<td>\n<p align=\"center\">\n<a href=\"https://github.com/ryzenixx\"><img alt=\"\" src=\"https://github.com/user-attachments/assets/5e61c4e6-48a9-41b9-a859-5cce653494f8\" /></a>\n<p align=\"center\">Mael</p>\n</p>\n</td>\n\n<td>\n<p align=\"center\">\n<a href=\"https://github.com/raphckrman\"><img width=\"250\" height=\"250\" alt=\"\" src=\"https://github.com/user-attachments/assets/70c8c6c7-484d-4dd3-8679-9cbb0fcaf993\" />\n</a>\n<p align=\"center\">Raphaël</p>\n</p>\n</td>\n</tr></table>\n</p>\n</p>\n"
  },
  {
    "path": "app/(features)/(cards)/cards.tsx",
    "content": "import { getManager } from \"@/services/shared\";\nimport { Balance } from \"@/services/shared/balance\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { Services } from \"@/stores/account/types\";\nimport Button from \"@/ui/new/Button\";\nimport ChipButton from \"@/ui/components/ChipButton\";\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport { EmptyItem } from \"@/ui/components/EmptyItem\";\nimport Icon from \"@/ui/components/Icon\";\nimport { NativeHeaderPressable, NativeHeaderSide, NativeHeaderTitle } from \"@/ui/components/NativeHeader\";\nimport Stack from \"@/ui/components/Stack\";\nimport TabHeader from \"@/ui/components/TabHeader\";\nimport TabHeaderTitle from \"@/ui/components/TabHeaderTitle\";\nimport Typography from \"@/ui/components/Typography\";\nimport { PapillonAppearIn, PapillonAppearOut } from \"@/ui/utils/Transition\";\nimport { getServiceBackground, getServiceLogo, getServiceName } from \"@/utils/services/helper\";\nimport { Papicons, Plus } from \"@getpapillon/papicons\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport { router, useFocusEffect } from \"expo-router\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Image, Platform, Pressable, View } from \"react-native\";\nimport { ScrollView } from \"react-native-gesture-handler\";\n\nexport default function QRCodeAndCardsPage() {\n  const [wallets, setWallets] = useState<Balance[]>([]);\n  const accounts = useAccountStore((state) => state.accounts);\n  const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);\n\n  const account = accounts.find((a) => a.id === lastUsedAccount);\n\n  async function fetchWallets() {\n    const manager = getManager()\n    const balances = await manager.getCanteenBalances()\n    const result: Balance[] = []\n    for (const balance of balances) {\n      result.push(balance)\n    }\n    setWallets(result);\n  }\n\n  useEffect(() => {\n    setWallets([])\n    fetchWallets();\n  }, [accounts])\n\n  const { t } = useTranslation();\n\n  const [headerHeight, setHeaderHeight] = useState(0);\n\n  return (\n    <>\n      <TabHeader\n        showAndroidBackButton\n        modal\n        onHeightChanged={setHeaderHeight}\n        title={\n          <TabHeaderTitle\n            chevron={false}\n            leading={t(\"Profile_QRCards\")}\n            subtitle={t(\"Profile_QRCards_Subtitle\", { count: wallets.length })}\n          />\n        }\n        trailing={Platform.OS === \"ios\" && (\n          <ChipButton\n            single\n            icon=\"cross\"\n            onPress={() => {\n              router.dismiss();\n            }}\n          />\n        )}\n      />\n\n      <ScrollView\n        contentInsetAdjustmentBehavior=\"automatic\" style={{ flex: 1, paddingTop: headerHeight - 16 }} contentContainerStyle={{ padding: 20, gap: 16 }}\n      >\n        {wallets.map((c, i) => {\n          return (\n            <Dynamic\n              animated\n              key={c.createdByAccount + c.label}\n              entering={PapillonAppearIn}\n              exiting={PapillonAppearOut}\n            >\n              <Card\n                key={c.createdByAccount + c.label}\n                index={i}\n                wallet={c}\n                service={account?.services.find(service => service.id === c.createdByAccount)?.serviceId ?? Services.TURBOSELF}\n                totalCards={wallets.length}\n              />\n            </Dynamic>\n          );\n        })}\n\n        {wallets.length === 0 && (\n          <Dynamic\n            animated\n            entering={PapillonAppearIn}\n            exiting={PapillonAppearOut}\n          >\n            <EmptyItem\n              icon=\"Card\"\n              title={t(\"Settings_Cards_None_Title\")}\n              description={t(\"Settings_Cards_None_Description\")}\n              margin={0}\n            />\n          </Dynamic>\n        )}\n\n        <Dynamic animated>\n          <Button\n            fullWidth\n            label=\"Ajouter\"\n            leading={<Plus color=\"#FFF\" />}\n            onPress={() => {\n              router.navigate({\n                pathname: \"/(onboarding)/restaurants/method\"\n              });\n            }}\n          />\n        </Dynamic>\n      </ScrollView >\n    </>\n  );\n}\n\nexport function Card({\n  index = 0,\n  wallet,\n  service,\n  disabled,\n}: {\n  index: number;\n  wallet: Balance;\n  service: Services;\n  disabled?: boolean;\n  inSpecificView?: boolean;\n  totalCards?: number;\n}) {\n  const [pressed, setPressed] = useState(false);\n\n  return (\n    <Pressable\n      onPress={() => {\n        if (!disabled) {\n          router.push({\n            pathname: \"/(features)/(cards)/specific\",\n            params: { serviceName: getServiceName(service), service: service, wallet: JSON.stringify(wallet) }\n          });\n        }\n      }}\n      onPressIn={() => setPressed(true)}\n      onPressOut={() => setPressed(false)}\n      style={{\n        width: \"100%\",\n        minHeight: 210,\n        borderRadius: 20,\n        overflow: \"hidden\",\n        marginTop: index === 0 ? 0 : -140,\n        zIndex: 100 + index,\n        top: 0,\n        left: 0,\n        right: 0,\n      }}\n      disabled={disabled}\n    >\n      <Image\n        source={getServiceBackground(service)}\n        style={{\n          position: \"absolute\",\n          bottom: 0,\n          right: 0,\n          left: 0,\n          width: \"100%\",\n          height: '100%',\n        }}\n        resizeMode=\"cover\"\n      />\n      <LinearGradient\n        colors={[\"#00000080\", \"transparent\"]}\n        locations={[0, 0.87]}\n        start={{ x: 0.5, y: 0 }}\n        end={{ x: 0.5, y: 1 }}\n        style={{\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n        }}\n      />\n\n      {pressed && (\n        <View style={{\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n          backgroundColor: \"rgba(0, 0, 0, 0.2)\",\n        }} />\n      )}\n\n      <View style={{ padding: 15, flex: 1 }}>\n        <Stack\n          direction=\"horizontal\"\n          style={{ justifyContent: \"space-between\" }}\n          hAlign=\"center\"\n        >\n          <Stack direction=\"horizontal\" hAlign=\"center\" gap={8}>\n            <Image\n              style={{\n                width: 32,\n                height: 32,\n                borderRadius: 10,\n                borderWidth: 1,\n                borderColor: \"#0000001F\",\n              }}\n              source={getServiceLogo(service)}\n              resizeMode=\"cover\"\n            />\n            <Typography variant=\"title\" color={\"#FFFFFF\"}>{getServiceName(service)}</Typography>\n          </Stack>\n\n          <Stack gap={0} direction=\"vertical\">\n            <Typography variant=\"caption\" align=\"right\" color={\"#FFFFFF\" + 90} style={{ width: \"100%\", lineHeight: 0 }}>\n              {wallet.label}\n            </Typography>\n            <Typography variant=\"title\" align=\"right\" color={\"#FFFFFF\"} style={{ width: \"100%\", lineHeight: 0 }}>\n              {(wallet.amount / 100).toFixed(2)} {wallet.currency}\n            </Typography>\n          </Stack>\n        </Stack>\n      </View>\n    </Pressable>\n  )\n}\n"
  },
  {
    "path": "app/(features)/(cards)/qrcode.tsx",
    "content": "import Barcode, { Format } from \"@aramir/react-native-barcode\";\nimport { Phone } from \"@getpapillon/papicons\";\nimport { BlurView } from \"expo-blur\";\nimport { router, useLocalSearchParams } from \"expo-router\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Dimensions, Platform } from \"react-native\";\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\";\nimport QRCode from \"react-native-qrcode-svg\";\nimport Reanimated, {\n  FlipInEasyX,\n  runOnJS,\n  useSharedValue,\n  withSpring,\n  ZoomInDown,\n} from \"react-native-reanimated\";\n\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport { Services } from \"@/stores/account/types\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\n\nexport default function QRCodePage() {\n\n  const search = useLocalSearchParams();\n  const qr = String(search.qrcode);\n  const type = String(search.type || \"QR\");\n  const service = Number(search.service || Services.TURBOSELF);\n\n  const { t } = useTranslation();\n\n  const translationY = useSharedValue(0);\n  const opacity = useSharedValue(1);\n  const scale = useSharedValue(1);\n\n  const finalTranslation = Dimensions.get(\"window\").height / 2;\n\n  const panGesture = Gesture.Pan()\n    .onUpdate((e) => {\n      translationY.value = e.translationY < 0 ? e.translationY / 10 : e.translationY;\n      if (e.translationY < 0) { return; }\n      opacity.value = 1 - Math.min(Math.abs(e.translationY) / 300, 0.7);\n      scale.value = 1 - Math.min(Math.abs(e.translationY) / 600, 0.4);\n    })\n    .onEnd((e) => {\n      if (e.translationY > 150) {\n        translationY.value = withSpring(finalTranslation, { damping: 150, stiffness: 1500 });\n        opacity.value = withSpring(0, { damping: 150, stiffness: 1500 });\n        scale.value = withSpring(0.6, { damping: 150, stiffness: 1500 });\n        setTimeout(() => {\n          runOnJS(router.back)();\n        }, 200);\n        return;\n      }\n      translationY.value = withSpring(0, { damping: 150, stiffness: 1500 });\n      opacity.value = withSpring(1, { damping: 150, stiffness: 1500 });\n      scale.value = withSpring(1, { damping: 150, stiffness: 1500 });\n    });\n\n\n  return (\n    <GestureDetector\n      gesture={panGesture}\n    >\n      <BlurView style={{ flex: 1, backgroundColor: Platform.OS === \"ios\" ? undefined : \"#000\" }}\n        tint={\"dark\"}\n      >\n        <Reanimated.View\n          entering={ZoomInDown.springify()}\n          style={{\n            flex: 1,\n            justifyContent: \"center\",\n            alignItems: \"center\",\n            gap: 20,\n            transform: [{ translateY: translationY }, { scale: scale }],\n            opacity: opacity,\n            padding: 20,\n          }}\n        >\n          <Reanimated.View\n            style={{\n              aspectRatio: 1,\n              width: \"100%\",\n              backgroundColor: \"#FFF\",\n              position: \"relative\",\n              justifyContent: \"center\",\n              alignItems: \"center\",\n              shadowRadius: 20,\n              shadowColor: \"#000\",\n              shadowOpacity: 0.3,\n              borderRadius: 25,\n            }}\n            entering={FlipInEasyX.springify().delay(100)}\n          >\n            {type === \"QR\" ? (\n              <QRCode\n                value={qr}\n                size={Dimensions.get(\"window\").width * 0.8}\n                backgroundColor={\"transparent\"}\n                color={\"#000\"}\n              />\n            ) : (\n              <Barcode\n                value={qr}\n                format={type as Format}\n                background={\"transparent\"}\n              />\n            )}\n          </Reanimated.View>\n\n          <Stack\n            style={{ width: 240 }}\n            hAlign=\"center\"\n          >\n            <Phone fill={\"#FFFFFF\"} />\n            <Typography variant=\"body2\"\n              align=\"center\"\n              color=\"#FFFFFF\"\n            >{t(\"Profile_Cards_Scan_Orientation\")}</Typography>\n          </Stack>\n        </Reanimated.View>\n        <OnboardingBackButton icon={\"Cross\"}\n          position={\"right\"}\n        />\n      </BlurView>\n    </GestureDetector>\n  );\n}"
  },
  {
    "path": "app/(features)/(cards)/specific.tsx",
    "content": "import { useCallback, useEffect, useState, useMemo } from \"react\";\nimport { Platform, ScrollView, View } from \"react-native\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport { router, useLocalSearchParams } from \"expo-router\";\nimport { Switch } from \"react-native-gesture-handler\";\n\nimport adjust from \"@/utils/adjustColor\";\nimport { getCodeType, getServiceColor } from \"@/utils/services/helper\";\nimport { warn } from \"@/utils/logger/logger\";\nimport { getWeekNumberFromDate } from \"@/database/useHomework\";\n\nimport { getManager } from \"@/services/shared\";\nimport { Balance } from \"@/services/shared/balance\";\nimport { BookingDay, CanteenHistoryItem, CanteenKind } from \"@/services/shared/canteen\";\n\nimport ContainedNumber from \"@/ui/components/ContainedNumber\";\nimport Icon from \"@/ui/components/Icon\";\nimport { NativeHeaderPressable, NativeHeaderSide, NativeHeaderTitle } from \"@/ui/components/NativeHeader\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport List from \"@/ui/components/List\";\nimport Item, { Trailing } from \"@/ui/components/Item\";\nimport Calendar from \"@/ui/components/Calendar\";\nimport { Card } from \"./cards\";\n\nimport { Calendar as CalendarIcon, ChevronDown, Clock, Papicons, QrCode } from \"@getpapillon/papicons\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport { Services } from \"@/stores/account/types\";\nimport { useTranslation } from \"react-i18next\";\nimport { Capabilities } from \"@/services/shared/types\";\nimport i18n from \"@/utils/i18n\";\nimport TabHeader from \"@/ui/components/TabHeader\";\nimport TabHeaderTitle from \"@/ui/components/TabHeaderTitle\";\nimport ChipButton from \"@/ui/components/ChipButton\";\nimport ActivityIndicator from \"@/ui/components/ActivityIndicator\";\nimport NativeSwitch from \"@/ui/native/NativeSwitch\";\n\nexport default function QRCodeAndCardsPage() {\n  const alert = useAlert();\n  const search = useLocalSearchParams();\n  const serviceName = String(search.serviceName);\n  const service = Number(search.service) as Services;\n  const wallet = JSON.parse(String(search.wallet)) as Balance;\n\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const manager = getManager();\n  const hasBookingCapacity = manager?.clientHasCapatibility(Capabilities.CANTEEN_BOOKINGS, wallet.createdByAccount)\n\n  const [history, setHistory] = useState<CanteenHistoryItem[]>([]);\n  const [qrcode, setQR] = useState(\"\");\n  const [accountKind, setAccountKind] = useState<CanteenKind>(CanteenKind.ARGENT)\n  const [date, setDate] = useState(new Date());\n  const [weekNumber, setWeekNumber] = useState(getWeekNumberFromDate(date));\n  const [bookingWeek, setBookingWeek] = useState<BookingDay[]>([]);\n  const [showDatePicker, setShowDatePicker] = useState(false);\n\n  const bookingDay = useMemo(() => {\n    const target = new Date(date);\n    target.setUTCHours(0, 0, 0, 0);\n    return bookingWeek.find(day => {\n      const dayDate = new Date(day.date);\n      dayDate.setUTCHours(0, 0, 0, 0);\n      return dayDate.getTime() === target.getTime();\n    });\n  }, [date, bookingWeek]);\n\n  const fetchQRCode = useCallback(async () => {\n    try {\n      const { data } = await manager.getCanteenQRCodes(wallet.createdByAccount);\n      setQR(data);\n    } catch (error) {\n      warn(String(error));\n    }\n  }, [manager, wallet.createdByAccount]);\n\n  const [loadingHistory, setLoadingHistory] = useState(false);\n\n  const fetchHistory = useCallback(async () => {\n    setLoadingHistory(true);\n    const history = await manager.getCanteenTransactionsHistory(wallet.createdByAccount);\n    setHistory(history);\n    setLoadingHistory(false);\n  }, [manager, wallet.createdByAccount]);\n\n  const fetchBookingWeek = useCallback(async () => {\n    const bookings = await manager.getCanteenBookingWeek(weekNumber, wallet.createdByAccount);\n    setBookingWeek(bookings);\n  }, [manager, weekNumber, wallet.createdByAccount]);\n\n  const fetchKind = useCallback(async () => {\n    const kind = await manager.getCanteenKind(wallet.createdByAccount);\n    setAccountKind(kind);\n  }, [manager, weekNumber, wallet.createdByAccount]);\n\n  useEffect(() => {\n    fetchQRCode();\n    fetchHistory();\n    fetchKind();\n  }, [fetchQRCode, fetchHistory]);\n\n  useEffect(() => {\n    fetchBookingWeek();\n  }, [fetchBookingWeek]);\n\n  const handleDateChange = useCallback(\n    (newDate: Date) => {\n      setDate(newDate);\n      const newWeek = getWeekNumberFromDate(newDate);\n      if (newWeek !== weekNumber) setWeekNumber(newWeek);\n      if (Platform.OS === \"ios\") setShowDatePicker(false);\n    },\n    [weekNumber]\n  );\n\n  const serviceColor = useMemo(() => adjust(getServiceColor(service), -0.1), [service]);\n\n  const handleToggle = async (index: number) => {\n    if (!bookingDay) return;\n    const updatedBookingDay = { ...bookingDay };\n    const item = updatedBookingDay.available[index];\n    const previous = item.booked;\n    item.booked = !previous;\n    setBookingWeek(prev =>\n      prev.map(day => (day.date === bookingDay.date ? updatedBookingDay : day))\n    );\n\n    try {\n      await manager.setMealAsBooked(item);\n    } catch (error) {\n      alert.showAlert({\n        title: \"Erreur lors de la réservation\",\n        description: \"Une erreur est survenue lors de la réservation de ton repas, il n'a donc pas été réservé.\",\n        icon: \"AlertTriangle\",\n        color: \"#D60046\",\n        technical: String(error),\n        withoutNavbar: false\n      });\n      item.booked = previous;\n      setBookingWeek(prev =>\n        prev.map(day => (day.date === bookingDay.date ? updatedBookingDay : day))\n      );\n    }\n  };\n\n  const { t } = useTranslation();\n\n  const [headerHeight, setHeaderHeight] = useState(0);\n\n  return (\n    <>\n      <Calendar\n        key={`calendar-${date.toISOString()}`}\n        date={date}\n        onDateChange={handleDateChange}\n        showDatePicker={showDatePicker}\n        setShowDatePicker={setShowDatePicker}\n      />\n\n      <LinearGradient\n        colors={[getServiceColor(service) + 40, colors.background, colors.background, colors.background]}\n        locations={[0, 0.87]}\n        start={{ x: 0.5, y: 0 }}\n        end={{ x: 0.5, y: 0.6 }}\n        style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0 }}\n      />\n\n      <TabHeader\n        modal\n        onHeightChanged={setHeaderHeight}\n        title={\n          <TabHeaderTitle\n            chevron={false}\n            leading={serviceName}\n            subtitle={(wallet.amount / 100).toFixed(2) + \" \" + wallet.currency}\n          />\n        }\n        trailing={\n          <ChipButton\n            single\n            icon=\"cross\"\n            onPress={() => {\n              router.dismiss();\n            }}\n          />\n        }\n      />\n\n      <ScrollView contentInsetAdjustmentBehavior=\"automatic\" contentContainerStyle={{ paddingTop: headerHeight - 12 }}>\n        <View style={{ padding: 15, flex: 1, gap: 20 }}>\n          <Card index={0} service={service} wallet={wallet} disabled inSpecificView />\n\n          {qrcode && (\n            <AnimatedPressable\n              onPress={() => router.push({ pathname: \"/(features)/(cards)/qrcode\", params: { qrcode, type: getCodeType(service), service } })}\n              style={{\n                width: \"100%\",\n                backgroundColor: colors.background,\n                paddingVertical: 18,\n                borderRadius: 25,\n                borderWidth: 1,\n                borderColor: colors.border,\n              }}\n            >\n              <Stack direction=\"horizontal\" hAlign=\"center\" vAlign=\"center\" gap={10}>\n                <QrCode color={getServiceColor(service)} />\n                <Typography variant=\"h6\">Afficher le QR-Code</Typography>\n              </Stack>\n            </AnimatedPressable>\n          )}\n\n          <Stack card direction=\"horizontal\" width=\"100%\">\n            <Stack\n              width=\"50%\"\n              vAlign=\"center\"\n              hAlign=\"center\"\n              style={{ borderRightWidth: 1, borderRightColor: colors.border }}\n              padding={12}\n            >\n              <Icon papicon opacity={0.5}>\n                <Papicons name=\"PiggyBank\" />\n              </Icon>\n              <Typography color=\"secondary\">Solde</Typography>\n              <ContainedNumber color={serviceColor}>\n                {(wallet.amount / 100).toFixed(2)} {wallet.currency}\n              </ContainedNumber>\n            </Stack>\n\n            <Stack width=\"50%\" vAlign=\"center\" hAlign=\"center\" padding={12}>\n              <Icon papicon opacity={0.5}>\n                <Papicons name=\"Cutlery\" />\n              </Icon>\n              <Typography color=\"secondary\">Repas restants</Typography>\n              <ContainedNumber color={serviceColor}>{wallet.lunchPrice > 0 ? String(Math.floor(wallet.amount / wallet.lunchPrice)) : \"Indéterminé\"}</ContainedNumber>\n            </Stack>\n          </Stack>\n\n          {hasBookingCapacity && (\n            <View>\n              <AnimatedPressable onPress={() => setShowDatePicker(prev => !prev)}>\n                <Stack hAlign=\"center\" vAlign=\"center\" style={{ padding: 20 }}>\n                  <Stack direction=\"horizontal\" gap={5}>\n                    <Typography color=\"secondary\">Réserver mon repas</Typography>\n                  </Stack>\n                  <Stack direction=\"horizontal\" gap={5} hAlign=\"center\" vAlign=\"center\">\n                    <Typography color=\"secondary\">\n                      {date.toLocaleDateString(i18n.language, { weekday: \"long\", day: \"numeric\", month: \"long\" })}\n                    </Typography>\n                    <ChevronDown opacity={0.5} size={18} />\n                  </Stack>\n                  {bookingDay ? (\n                    <List style={{ marginTop: 10 }}>\n                      {bookingDay.available.map((item, index) => (\n                        <Item key={item.label}>\n                          <Typography>\n                            Borne {item.label}\n                          </Typography>\n                          <Trailing>\n                            <NativeSwitch\n                              disabled={accountKind === CanteenKind.FORFAIT ? false : !item.canBook || (wallet.lunchRemaining < 1 && wallet.lunchPrice !== 0)}\n                              value={item.booked}\n                              onValueChange={() => handleToggle(index)}\n                            />\n                          </Trailing>\n                        </Item>\n                      ))}\n                    </List>\n                  ) : (\n                    <Stack hAlign=\"center\" vAlign=\"center\" margin={16} gap={16}>\n                      <View style={{ alignItems: \"center\" }}>\n                        <Icon papicon opacity={0.5} size={32} style={{ marginBottom: 3 }}>\n                          <Papicons name=\"Card\" />\n                        </Icon>\n                        <Typography variant=\"h4\" color=\"text\" align=\"center\">\n                          {t(\"Profile_Cards_No_Reservation\")}\n                        </Typography>\n                        <Typography variant=\"body2\" color=\"secondary\" align=\"center\">\n                          {t(\"Profile_Cards_No_Available_Reservation\")}\n                        </Typography>\n                      </View>\n                    </Stack>\n                  )}\n                </Stack>\n              </AnimatedPressable>\n            </View>\n          )}\n\n          {loadingHistory && history.length === 0 && (\n            <Stack padding={20} hAlign=\"center\" vAlign=\"center\" gap={4}>\n              <ActivityIndicator size={42} />\n              <Typography align=\"center\" variant=\"title\" color=\"text\" style={{ marginTop: 8 }}>\n                {t(\"Profile_Cards_Loading_History\")}\n              </Typography>\n              <Typography align=\"center\" variant=\"body2\" color=\"secondary\">\n                {t(\"Profile_Cards_Loading_History_Description\")}\n              </Typography>\n            </Stack>\n          )}\n\n          {history.length > 0 && (\n            <View style={{ display: \"flex\", gap: 13.5 }}>\n              <Stack direction=\"horizontal\" style={{ flex: 1, borderRightWidth: 1, borderRightColor: colors.border }} gap={5}>\n                <Icon papicon opacity={0.5}>\n                  <Clock />\n                </Icon>\n                <Typography color=\"secondary\">{t(\"Profile_Cards_History\")}</Typography>\n              </Stack>\n              <List>\n                {history.slice(0, 10).map((c, index) =>\n                  <Item key={`${c.label}-${c.date.getTime()}-${index}`}>\n                    <Trailing>\n                      <ContainedNumber color={adjust(c.amount < 0 ? \"#C50000\" : \"#42C500\", -0.1)}>\n                        {c.amount > 0 ? \"+\" : \"\"}{(c.amount / 100).toFixed(2)} {c.currency}\n                      </ContainedNumber>\n                    </Trailing>\n                    <Typography>{c.label}</Typography>\n                    <Stack direction=\"horizontal\" hAlign=\"center\">\n                      <Typography color=\"secondary\">{c.date.toLocaleDateString(i18n.language, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" })}</Typography>\n                      <View style={{ height: 4, width: 4, borderRadius: 2, backgroundColor: colors.text + 80 }} />\n                      <Typography color=\"secondary\">\n                        {c.date.toLocaleTimeString(i18n.language, { hour: \"2-digit\", minute: \"2-digit\", hour12: false })}\n                      </Typography>\n                    </Stack>\n                  </Item>)}\n              </List>\n            </View>\n          )}\n        </View>\n      </ScrollView>\n    </>\n  );\n}\n"
  },
  {
    "path": "app/(features)/(news)/specific.tsx",
    "content": "import { getManager } from \"@/services/shared\";\nimport { News } from \"@/services/shared/news\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { Services } from \"@/stores/account/types\";\nimport Stack from \"@/ui/components/Stack\";\nimport TypographyLegacy from \"@/ui/components/Typography\";\nimport { useLocalSearchParams, useNavigation } from \"expo-router\"\nimport { useEffect, useState } from \"react\";\nimport { Linking, Platform, ScrollView, StyleSheet, View } from \"react-native\";\nimport { Attachment, News as SkolengoNews } from \"skolengojs\"\nimport * as Papicons from '@getpapillon/papicons';\n\nimport { VARIANTS } from \"@/ui/components/Typography\";\n\nimport HTMLView from 'react-native-htmlview';\nimport * as WebBrowser from 'expo-web-browser';\nimport { useTheme } from \"@react-navigation/native\";\nimport { NativeHeaderPressable, NativeHeaderSide } from \"@/ui/components/NativeHeader\";\nimport { MenuView } from \"@react-native-menu/menu\";\nimport Icon from \"@/ui/components/Icon\";\nimport { t } from \"i18next\";\nimport ListLegacy from \"@/ui/components/List\";\nimport Item from \"@/ui/components/Item\";\nimport ActionMenu from \"@/ui/components/ActionMenu\";\nimport Typography from \"@/ui/new/Typography\";\nimport List from \"@/ui/new/List\";\n\nexport default function NewsPage() {\n  const search = useLocalSearchParams();\n  const news = JSON.parse(String(search.news)) as News\n\n  const navigation = useNavigation()\n\n  useEffect(() => {\n    const acknowledgeNews = async () => {\n      if (!news.acknowledged) {\n        const manager = getManager();\n\n        const store = useAccountStore.getState()\n        const account = store.accounts.find(account => account.id === store.lastUsedAccount)\n        const service = account?.services.find(service => service.id === news.createdByAccount)\n\n        if (service?.serviceId === Services.SKOLENGO) {\n          const attachment = new Attachment(\"\", \"\", \"\")\n          const ref = new SkolengoNews(news.id, news.createdAt, news.title ?? \"\", news.content, news.content, { id: \"\", name: \"\" }, \"\", attachment)\n          news.ref = ref\n        }\n\n        await manager.setNewsAsDone(news);\n      }\n    };\n\n    acknowledgeNews();\n  }, [])\n\n\n  const { colors } = useTheme();\n\n  const styles = {\n    \"papillon\": {\n      background: colors.background,\n      foreground: colors.text,\n      html: StyleSheet.create({\n        ...VARIANTS,\n        p: {\n          ...VARIANTS.body1,\n        },\n        div: {\n          ...VARIANTS.body1,\n        },\n        a: {\n          color: colors.primary,\n          textDecorationLine: 'underline',\n        },\n      })\n    },\n    \"reading\": {\n      background: \"#ffe1a9ff\",\n      foreground: \"#634000ff\",\n      html: StyleSheet.create({\n        ...VARIANTS,\n        p: {\n          fontFamily: \"serif_medium\"\n        },\n        div: {\n          fontFamily: \"serif_medium\"\n        },\n        h1: {\n          fontFamily: \"serif_bold\"\n        },\n        a: {\n          color: \"#a26900ff\",\n          textDecorationLine: 'underline',\n          fontFamily: \"serif_medium\"\n        },\n      })\n    }\n  };\n\n  const [style, setStyle] = useState(\"papillon\");\n\n  useEffect(() => {\n    navigation.setOptions({\n      headerTitle: news.title ?? \"News\",\n      headerTitleStyle: {\n        color: styles[style].foreground,\n        fontFamily: styles[style].html.p.fontFamily\n      },\n      headerLargeTitleStyle: {\n        color: styles[style].foreground,\n        fontFamily: styles[style].html.h1.fontFamily\n      }\n    })\n  }, [styles, style])\n\n  // Replace all color properties in currentHTMLStyle with foreground\n  const foreground = styles[style].foreground;\n  const currentHTMLStyle = (() => {\n    const htmlStyle = { ...styles[style].html };\n    Object.keys(htmlStyle).forEach(key => {\n      htmlStyle[key] = { ...htmlStyle[key], color: foreground };\n    });\n    return htmlStyle;\n  })();\n\n  const themes = [\n    {\n      title: t(\"News_Theme_Papillon_Title\"),\n      description: t(\"News_Theme_Papillon_Description\"),\n      value: \"papillon\"\n    },\n    {\n      title: t(\"News_Theme_Reading_Title\"),\n      description: t(\"News_Theme_Reading_Description\"),\n      value: \"reading\"\n    }\n  ]\n\n  return (\n    <>\n      <ScrollView\n        contentInsetAdjustmentBehavior=\"automatic\"\n        style={{ flex: 1, backgroundColor: styles[style].background }}\n      >\n        {news.attachments.length > 0 && (\n          <View style={{ padding: 16, width: \"100%\" }}>\n            <ListLegacy>\n              {news.attachments.map((attachment, i) => (\n                <Item key={i}\n                  onPress={() => {\n                    WebBrowser.openBrowserAsync(\n                      attachment.url,\n                      {\n                        controlsColor: colors.primary,\n                        dismissButtonStyle: 'done'\n                      }\n                    )\n                  }}\n                >\n                  <Icon papicon>\n                    {attachment.type === 0 ? (\n                      <Papicons.Link />\n                    ) : (\n                      <Papicons.Paper />\n                    )}\n                  </Icon>\n                  <TypographyLegacy nowrap variant=\"title\">{attachment.name}</TypographyLegacy>\n                  <TypographyLegacy nowrap variant=\"caption\">{attachment.url}</TypographyLegacy>\n                </Item>\n              ))}\n            </ListLegacy>\n          </View>\n        )}\n\n        <List>\n          <List.Item>\n            <Typography>\n              Cette news contient un sondage\n            </Typography>\n          </List.Item>\n        </List>\n\n        <HTMLView\n          value={news.content}\n          stylesheet={currentHTMLStyle}\n          style={{\n            padding: 16,\n            paddingTop: 0\n          }}\n        />\n      </ScrollView>\n\n      <NativeHeaderSide side=\"Right\">\n        <ActionMenu\n          actions={\n            themes.map(theme => ({\n              id: theme.value,\n              title: theme.title,\n              subtitle: theme.description,\n              state: theme.value === style ? 'on' : 'off'\n            }))\n          }\n          onPressAction={({ nativeEvent }) => {\n            const selectedTheme = themes.find(theme => theme.value === nativeEvent.event);\n            if (selectedTheme) {\n              setStyle(selectedTheme.value);\n            }\n          }}\n        >\n          <NativeHeaderPressable>\n            <Icon papicon>\n              <Papicons.Palette />\n            </Icon>\n          </NativeHeaderPressable>\n        </ActionMenu>\n      </NativeHeaderSide>\n    </>\n  )\n}"
  },
  {
    "path": "app/(features)/attendance.tsx",
    "content": "import Icon from \"@/ui/components/Icon\";\nimport { NativeHeaderHighlight, NativeHeaderPressable, NativeHeaderSide, NativeHeaderTitle } from \"@/ui/components/NativeHeader\";\nimport { router, useLocalSearchParams } from \"expo-router\";\nimport { Platform, ScrollView, View } from \"react-native\";\nimport { Papicons } from \"@getpapillon/papicons\"\nimport { useTheme } from \"@react-navigation/native\";\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport { MenuView } from \"@react-native-menu/menu\";\nimport { Period } from \"@/services/shared/grade\";\nimport { getPeriodName, getPeriodNumber, isPeriodWithNumber } from \"@/utils/services/periods\";\nimport { useMemo, useState } from \"react\";\nimport { Attendance } from \"@/services/shared/attendance\";\nimport Stack from \"@/ui/components/Stack\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport AnimatedNumber from \"@/ui/components/AnimatedNumber\";\nimport adjust from \"@/utils/adjustColor\";\nimport { error } from \"@/utils/logger/logger\";\nimport { getManager } from \"@/services/shared\";\nimport { t } from \"i18next\";\nimport i18n from \"@/utils/i18n\";\nimport ActionMenu from \"@/ui/components/ActionMenu\";\nimport AndroidBackButton from \"@/utils/theme/AndroidBackButton\";\nimport TabHeader from \"@/ui/components/TabHeader\";\nimport TabHeaderTitle from \"@/ui/components/TabHeaderTitle\";\nimport List from \"@/ui/new/List\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport Typography from \"@/ui/new/Typography\";\nimport { formatDate, formatDistanceToNow, formatDistanceToNowStrict } from \"date-fns\";\nimport * as DateLocale from 'date-fns/locale';\n\nconst formatEventTime = (durationData: number, detailed: boolean) => {\n  if(detailed) {\n    return durationData >= 60\n      ? t(\"Attendance_Duration_HoursMinutes_Detailed\", { hours: Math.floor(durationData / 60), minutes: lz(durationData % 60) })\n      : t(\"Attendance_Duration_Minutes\", { value: durationData })\n  }\n\n  return durationData >= 60\n    ? t(\"Attendance_Duration_HoursMinutes_Compact\", { hours: Math.floor(durationData / 60), minutes: lz(durationData % 60) })\n    : t(\"Attendance_Duration_Minutes\", { value: durationData })\n}\n\nexport default function AttendanceView() {\n  try {\n    const theme = useTheme()\n    const { colors } = theme;\n    const header = useHeaderHeight();\n\n    const search = useLocalSearchParams();\n    const currentPeriod = JSON.parse(String(search.currentPeriod)) as Period;\n    const periods = JSON.parse(String(search.periods)) as Period[];\n    const attendancesFromSearch = JSON.parse(String(search.attendances)) as Attendance[];\n\n    const [attendances, setAttendances] = useState<Attendance[]>(attendancesFromSearch);\n    const [period, setPeriod] = useState<Period>(currentPeriod);\n\n    const { missedTime, missedTimeUnjustified, unjustifiedAbsenceCount, unjustifiedDelayCount, absenceCount, delayCount } = useMemo(() => {\n      let missed = 0;\n      let unjustified = 0;\n      let unjustifiedAbs = 0;\n      let unjustifiedDelays = 0;\n      let Abs = 0\n      let Delays = 0\n      for (const attendance of attendances) {\n        for (const absence of attendance.absences) {\n          Abs += 1;\n          missed += absence.timeMissed;\n          if (!absence.justified) {\n            unjustified += absence.timeMissed;\n            unjustifiedAbs += 1;\n          }\n        }\n        for (const delay of attendance.delays) {\n          Delays += 1;\n          if (!delay.justified) {\n            unjustifiedDelays += 1;\n            unjustified += delay.duration\n          }\n          missed += delay.duration\n        }\n      }\n      return { missedTime: missed, missedTimeUnjustified: unjustified, unjustifiedAbsenceCount: unjustifiedAbs, unjustifiedDelayCount: unjustifiedDelays, absenceCount: Abs, delayCount: Delays };\n    }, [period, attendances]);\n\n    const [headerHeight, setHeaderHeight] = useState(0);\n    const insets = useSafeAreaInsets();\n\n    const dangerColor = adjust(\"#C50000\", theme.dark ? 0.4 : -0.1);\n    const dangerBg = adjust(\"#C50000\", theme.dark ? -0.65 : 0.85);\n\n    const successColor = adjust(\"#00C851\", theme.dark ? 0.3 : -0.1);\n    const successBg = adjust(\"#00C851\", theme.dark ? -0.75 : 0.85);\n\n    return (\n      <>\n        <TabHeader\n          showAndroidBackButton\n          modal={Platform.OS !== \"android\"}\n          onHeightChanged={setHeaderHeight}\n          title={\n            <ActionMenu\n                key={String(period?.id ?? \"\")}\n                onPressAction={async ({ nativeEvent }) => {\n                  const actionId = nativeEvent.event;\n\n                  if (actionId.startsWith(\"period:\")) {\n                    const selectedPeriodId = actionId.replace(\"period:\", \"\");\n                    const selectedPeriod: Period | undefined = periods.find(item => item.id === selectedPeriodId)\n\n                    if (!selectedPeriod) {\n                      error(t(\"Attendance_InvalidPeriod\"))\n                    }\n\n                    const manager = getManager()\n                    const attendancesFetched = await manager.getAttendanceForPeriod(selectedPeriod.name)\n\n                    setAttendances(attendancesFetched)\n                    setPeriod(selectedPeriod)\n                  }\n                }}\n                actions={\n                  periods.map((item) => ({\n                    id: \"period:\" + item.id,\n                    title: (getPeriodName(item.name || \"\") + \" \" + (isPeriodWithNumber(item.name || \"\") ? getPeriodNumber(item.name || \"0\") : \"\")).trim(),\n                    subtitle: `${new Date(item.start).toLocaleDateString(i18n.language, {\n                      month: \"short\",\n                      year: \"numeric\",\n                    })} - ${new Date(item.end).toLocaleDateString(i18n.language, {\n                      month: \"short\",\n                      year: \"numeric\",\n                    })}`,\n                    state: String(period?.id ?? \"\") === String(item.id ?? \"\") ? \"on\" : \"off\",\n                    image: Platform.select({\n                      ios: (getPeriodNumber(item.name || \"0\")) + \".calendar\"\n                    }),\n                    imageColor: colors.text,\n                  }))}\n            >\n              <TabHeaderTitle\n                chevron={true}\n                leading={getPeriodName(period?.name ?? \"\")}\n                number={getPeriodNumber(period?.name ?? \"\")}\n              />\n            </ActionMenu>\n          }\n        />\n\n        <List\n          contentContainerStyle={{\n            padding: 16,\n            paddingTop: headerHeight,\n            paddingBottom: insets.bottom + 16,\n          }}\n        >\n          {attendances.some(attendance => attendance.absences.length == 0) && attendances.some(attendance => attendance.delays.length == 0) ? (\n            <List.Item>\n              <List.Leading>\n                <Icon>\n                  <Papicons name=\"Ghost\" />\n                </Icon>\n              </List.Leading>\n\n              <Typography variant=\"title\">\n                {t(\"Attendance_NoEvent_Title\")}\n              </Typography>\n              <Typography color=\"textSecondary\">\n                {t(\"Attendance_NoEvent_Description\")}\n              </Typography>\n            </List.Item>\n          ) : (\n            <List.Section>\n              {missedTimeUnjustified > 0 ? (\n                <List.Item\n                  style={{\n                    backgroundColor: dangerBg,\n                  }}\n                >\n                  <List.Leading>\n                    <Icon fill={dangerColor}>\n                      <Papicons name=\"AlertTriangle\" />\n                    </Icon>\n                  </List.Leading>\n\n                  <Typography variant=\"title\" color={dangerColor}>\n                    {t(\"Attendance_Hours_Unjustified_Value\", { duration: formatEventTime(missedTimeUnjustified, true) })}\n                  </Typography>\n                  <Typography color=\"textSecondary\" color={dangerColor}>\n                    {t(\"Attendance_Unjustified_Description\")}\n                  </Typography>\n                </List.Item>\n              ) : (\n                <List.Item\n                  style={{\n                    backgroundColor: successBg,\n                  }}\n                >\n                  <List.Leading>\n                    <Icon fill={successColor}>\n                      <Papicons name=\"Check\" />\n                    </Icon>\n                  </List.Leading>\n\n                  <Typography variant=\"title\" color={successColor}>\n                    {t(\"Attendance_NoUnjustified_Title\")}\n                  </Typography>\n                  <Typography color=\"textSecondary\" color={successColor}>\n                    {t(\"Attendance_NoUnjustified_Description\")}\n                  </Typography>\n                </List.Item>\n              )}\n\n              <List.Item>\n                <Typography variant=\"action\">\n                  {t(\"Attendance_Hours_Missed\")}\n                </Typography>\n                <List.Trailing>\n                  <Typography variant=\"title\" weight=\"bold\" color={missedTimeUnjustified > 0 ? dangerColor : \"textSecondary\"}>\n                    {formatEventTime(missedTime, true)}\n                  </Typography>\n                </List.Trailing>\n              </List.Item>\n            </List.Section>\n          )}\n\n          {attendances.some(attendance => attendance.absences.length > 0) && (\n            <List.Section>\n              <List.SectionTitle>\n                <Icon opacity={0.5} size={20}>\n                  <Papicons name=\"UserCross\" />\n                </Icon>\n                <Typography variant=\"body1\" weight=\"semibold\" color=\"textSecondary\" style={{ flex: 1 }}>\n                  {t(\"Attendance_Missing\")}\n                </Typography>\n                <Typography variant=\"title\" weight=\"medium\" color={\"textSecondary\"}>\n                  {absenceCount}\n                </Typography>\n              </List.SectionTitle>\n\n              {attendances.map((attendance, index) =>\n                attendance.absences.map((absence, absenceIndex) => {\n                  const fromDate = new Date(absence.from);\n                  const dateString = formatDistanceToNowStrict(fromDate, {\n                    locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,\n                    addSuffix: true\n                  })\n                  const dayString = formatDate(fromDate, \"eeee d MMMM\", {\n                    locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,\n                  })\n\n                  return (\n                    <List.Item>\n                      <Typography variant=\"title\">\n                        {absence.reason || t(\"Attendance_NoReason\")}\n                      </Typography>\n                      <Typography color=\"textSecondary\" numberOfLines={1}>\n                        {dateString} · {dayString}\n                      </Typography>\n                      <List.Trailing>\n                        <AttendanceTimer evt={absence} />\n                      </List.Trailing>\n                    </List.Item>\n                  )\n                })\n              )}\n            </List.Section>\n          )}\n\n          {attendances.some(attendance => attendance.delays.length > 0) && (\n            <List.Section>\n              <List.SectionTitle>\n                <Icon opacity={0.5} size={20}>\n                  <Papicons name=\"Clock\" />\n                </Icon>\n                <Typography variant=\"body1\" weight=\"semibold\" color=\"textSecondary\" style={{ flex: 1 }}>\n                  {t(\"Attendance_Delays\")}\n                </Typography>\n                <Typography variant=\"title\" weight=\"medium\" color={\"textSecondary\"}>\n                  {delayCount}\n                </Typography>\n              </List.SectionTitle>\n\n              {attendances.map((attendance, index) =>\n                attendance.delays.map((delay, absenceIndex) => {\n                  const fromDate = new Date(delay.givenAt);\n                  const date = fromDate.getTime();\n                  const dateString = formatDistanceToNowStrict(date, {\n                    locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,\n                    addSuffix: true\n                  })\n                  const dayFormatted = formatDate(date, \"eeee d MMMM\", {\n                    locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,\n                  })\n                  \n                  return (\n                    <List.Item>\n                      <Typography variant=\"title\">\n                        {delay.reason || t(\"Attendance_NoReason\")}\n                      </Typography>\n                      <Typography color=\"textSecondary\">\n                        {dateString} · {dayFormatted}\n                      </Typography>\n                      <List.Trailing>\n                        <AttendanceTimer evt={delay} />\n                      </List.Trailing>\n                    </List.Item>\n                  )\n                })\n              )}\n            </List.Section>\n          )}\n\n        </List>\n      </>\n    )\n  } catch (err) {\n    error(err.toString());\n    return null;\n  }\n}\n\nconst lz = (num: number) => num.toString().padStart(2, \"0\");\n\nconst AttendanceTimer = ({ evt }: { evt: any }) => {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const dangerColor = adjust(\"#C50000\", theme.dark ? 0.4 : -0.1);\n  const dangerBg = dangerColor + \"30\";\n\n  const durationData = evt.timeMissed || evt.duration || 0;\n\n  const durationText = formatEventTime(durationData);\n\n  return (\n    <Stack direction=\"horizontal\" hAlign=\"center\" gap={8}>\n      {!evt.justified && (\n        <Icon papicon fill={dangerColor}>\n          <Papicons name={\"Minus\"} />\n        </Icon>\n      )}\n      <View style={{ padding: 6, paddingHorizontal: evt.justified ? 3 : 12, backgroundColor: evt.justified ? \"transparent\" : dangerBg, borderRadius: 25, overflow: \"hidden\" }}>\n        <Typography variant=\"title\" color={evt.justified ? colors.text : dangerColor}>{durationText}</Typography>\n      </View>\n    </Stack>\n  )\n}\n"
  },
  {
    "path": "app/(features)/soon.tsx",
    "content": "import Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport React from \"react\";\nimport { Linking, View } from \"react-native\";\n\nexport default function Soon() {\n  return (\n    <View\n      style={{\n        padding: 20,\n        paddingBottom: 0,\n      }}\n    >\n      <Stack\n        padding={20}\n        gap={10}\n        vAlign=\"center\"\n        hAlign=\"center\"\n      >\n        <Icon size={42}>\n          <Papicons name=\"clock\" color=\"#29947A\" />\n        </Icon>\n        <Typography variant=\"h2\" align=\"center\">\n          Promis, ça arrive (vraiment) bientôt !\n        </Typography>\n        <Typography variant=\"body1\" color=\"secondary\" align=\"center\">\n          L'onglet est toujours en cours de développement. Il arrivera prochainement dans une version future de Papillon.\n        </Typography>\n        <Typography variant=\"body1\" color=\"primary\" align=\"center\" onPress={() => {\n          Linking.openURL(\"https://www.instagram.com/thepapillonapp/\");\n        }} style={{\n          textDecorationLine: \"underline\",\n        }}>\n          Et pour rester au courant, tu peux nous suivre sur les réseaux sociaux !\n        </Typography>\n      </Stack>\n    </View>\n  );\n}"
  },
  {
    "path": "app/(modals)/address.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport * as Linking from \"expo-linking\";\nimport * as Location from \"expo-location\";\nimport * as React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n  ActivityIndicator,\n  Dimensions,\n  KeyboardAvoidingView,\n  Platform,\n  ScrollView,\n  TouchableNativeFeedback,\n  View,\n} from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport Transit from \"@/services/transit\";\nimport { PlaceSuggestion } from \"@/services/transit/models/PlaceSuggestion\";\nimport { Stop } from \"@/services/transit/models/Stop\";\nimport { TransportAddress } from \"@/stores/account/types\";\nimport Button from \"@/ui/components/Button\";\nimport Item, { Leading, Trailing } from \"@/ui/components/Item\";\nimport List from \"@/ui/components/List\";\nimport Search from \"@/ui/components/Search\";\nimport Typography from \"@/ui/components/Typography\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport AndroidBackButton, { AndroidBackButtonStyles } from \"@/utils/theme/AndroidBackButton\";\nimport Icon from \"@/ui/components/Icon\";\n\nexport interface AddressModalProps {\n  canUseCurrentLocation: boolean;\n  onCancel: () => void;\n  onConfirm: (address: TransportAddress) => void;\n}\n\ninterface AddressItemProps {\n  icon: string;\n  firstLine: string;\n  secondLine: string;\n  convertFunction: () => Promise<TransportAddress>;\n  save: (addess: TransportAddress) => void;\n  lineLimit?: number;\n}\n\nconst AddressItem = ({\n  icon,\n  firstLine,\n  secondLine,\n  convertFunction,\n  save,\n  lineLimit = 1,\n}: AddressItemProps) => {\n  const theme = useTheme();\n\n  const [savingAddress, setSavingAddress] = useState<boolean>(false);\n\n  const saveAddress = async () => {\n    setSavingAddress(true);\n    const address = await convertFunction();\n    save(address);\n    setSavingAddress(false);\n  };\n\n  return (\n    <Item onPress={saveAddress} disablePadding={true} isLast={true}>\n      <Leading>\n        <Papicons name={icon} fill={theme.colors.text} />\n      </Leading>\n      {savingAddress && (\n        <Trailing>\n          <ActivityIndicator />\n        </Trailing>\n      )}\n      <Typography variant={\"title\"} numberOfLines={1}>\n        {firstLine}\n      </Typography>\n      <Typography color={\"secondary\"} variant={\"body2\"} numberOfLines={lineLimit}>\n        {secondLine}\n      </Typography>\n    </Item>\n  );\n};\n\nexport const AddressModal = ({\n  canUseCurrentLocation,\n  onCancel,\n  onConfirm,\n}: AddressModalProps) => {\n  const theme = useTheme();\n  const { t } = useTranslation();\n  const insets = useSafeAreaInsets();\n  const transit = new Transit();\n\n  const [status, requestPermission] = Location.useForegroundPermissions();\n  const [searchTerm, setSearchTerm] = useState(\"\");\n  const [searchPlaceResults, setSearchPlaceResults] = useState<\n    PlaceSuggestion[]\n  >([]);\n  const [searchStopResults, setSearchStopResults] = useState<Stop[]>([]);\n\n  let timeout: number | null = null;\n\n  const search = async () => {\n    const location = await Location.getCurrentPositionAsync();\n    const res = await transit.suggestions(\n      location.coords.latitude,\n      location.coords.longitude,\n      searchTerm\n    );\n\n    setSearchPlaceResults(res.suggestions.places);\n    setSearchStopResults(res.suggestions.stops);\n  };\n\n  const currentLocationToTransportAddress =\n    async (): Promise<TransportAddress> => {\n      return new Promise(resolve => {\n        resolve({\n          firstTitle: \"current_location\",\n          secondTitle: \"current_location\",\n          address: \"current_location\",\n          latitude: -1,\n          longitude: -1,\n        });\n      });\n    };\n\n  const placeToTransportAddress = async (\n    place: PlaceSuggestion\n  ): Promise<TransportAddress> => {\n    const details = await transit.locationDetails(place.place_id);\n\n    return {\n      firstTitle: place.structured_formatting.main_text,\n      secondTitle: place.structured_formatting.secondary_text,\n      address: details.placeDetails.result.formatted_address,\n      latitude: details.placeDetails.result.geometry.location.lat,\n      longitude: details.placeDetails.result.geometry.location.lng,\n    };\n  };\n\n  const stopToTransportAddress = async (\n    stop: Stop\n  ): Promise<TransportAddress> => {\n    return new Promise(resolve => {\n      resolve({\n        firstTitle: stop.stop_name,\n        secondTitle: stop.city_name,\n        address: `${stop.stop_name}, ${stop.city_name}`,\n        latitude: stop.stop_lat,\n        longitude: stop.stop_lon,\n      });\n    });\n  };\n\n  useEffect(() => {\n    if (timeout !== null) {\n      clearTimeout(timeout);\n    }\n    if (searchTerm.length === 0) {\n      setSearchPlaceResults([]);\n      setSearchStopResults([]);\n      return;\n    }\n    timeout = setTimeout(() => search(), 200);\n  }, [searchTerm]);\n\n  const finalHeaderHeight = Platform.select({\n    android: insets.top,\n    default: 0\n  });\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        paddingTop: 0 + finalHeaderHeight,\n        paddingBottom: insets.bottom,\n        backgroundColor: theme.colors.background,\n      }}\n    >\n      <View\n        style={{\n          marginTop: 14,\n          top: finalHeaderHeight,\n          position: \"absolute\",\n          zIndex: 9999,\n          left: 14,\n          right: 14,\n          flexDirection: \"row\",\n        }}\n      >\n        {Platform.OS === \"android\" && (\n          <TouchableNativeFeedback\n            onPress={onCancel}\n            useForeground\n          >\n            <View style={AndroidBackButtonStyles.container}>\n              <Icon size={26}>\n                <Papicons name=\"arrowleft\" />\n              </Icon>\n            </View>\n          </TouchableNativeFeedback>\n        )}\n        <Search\n          placeholder={t(\"Settings_Transport_Search_Address_Placeholder\")}\n          color=\"#E8901C\"\n          onTextChange={setSearchTerm}\n          style={{\n            width: Dimensions.get(\"window\").width - (14 * 2) - (Platform.OS === \"android\" ? 52 : 0),\n          }}\n        />\n      </View>\n      {status === null || status?.granted ? (\n        <KeyboardAvoidingView\n          style={{\n            height: \"100%\",\n          }}\n          behavior={\"height\"}\n          keyboardVerticalOffset={70}\n        >\n          <ScrollView\n            style={{\n              position: \"absolute\",\n              top: 0,\n              left: 0,\n              right: 0,\n              bottom: 0,\n            }}\n            contentContainerStyle={{\n              paddingTop: 56 + 14,\n              paddingHorizontal: 16,\n              paddingBottom: 56 + 14,\n              gap: 8,\n            }}\n          >\n            {searchTerm.length === 0 && canUseCurrentLocation && (\n              <List>\n                <AddressItem\n                  icon={\"MapPin\"}\n                  firstLine={t(\"Settings_Transport_Current_Position\")}\n                  secondLine={t(\n                    \"Settings_Transport_Current_Position_Description\"\n                  )}\n                  convertFunction={currentLocationToTransportAddress}\n                  save={onConfirm}\n                  lineLimit={2}\n                />\n              </List>\n            )}\n\n            {searchPlaceResults.length > 0 && (\n              <>\n                <Typography variant={\"h6\"} color={\"secondary\"}>\n                  {t(\"Settings_Transport_Place\")}\n                </Typography>\n                <List>\n                  {searchPlaceResults.map((item: PlaceSuggestion) => (\n                    <AddressItem\n                      key={item.place_id}\n                      icon={\"MapPin\"}\n                      firstLine={item.structured_formatting.main_text}\n                      secondLine={item.structured_formatting.secondary_text}\n                      convertFunction={() => placeToTransportAddress(item)}\n                      save={onConfirm}\n                    />\n                  ))}\n                </List>\n              </>\n            )}\n\n            {searchStopResults.length > 0 && (\n              <>\n                <Typography variant={\"h6\"} color={\"secondary\"}>\n                  {t(\"Settings_Transport_Stops\")}\n                </Typography>\n                <List>\n                  {searchStopResults.map((item: Stop) => (\n                    <AddressItem\n                      key={item.raw_stop_id}\n                      icon={\"Bus\"}\n                      firstLine={item.stop_name}\n                      secondLine={item.city_name}\n                      convertFunction={() => stopToTransportAddress(item)}\n                      save={onConfirm}\n                    />\n                  ))}\n                </List>\n              </>\n            )}\n          </ScrollView>\n          <View\n            style={{\n              padding: 16,\n              marginTop: \"auto\",\n            }}\n          >\n            <Button\n              title={t(\"Cancel\")}\n              variant={\"ghost\"}\n              inline={true}\n              onPress={onCancel}\n            />\n          </View>\n        </KeyboardAvoidingView>\n      ) : (\n        <View\n          style={{\n            height: \"100%\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            paddingHorizontal: 16,\n          }}\n        >\n          <Papicons\n            name={\"Ghost\"}\n            size={64}\n            style={{ marginBottom: 16 }}\n            fill={theme.colors.text}\n          />\n          <Typography variant={\"h3\"} style={{ textAlign: \"center\" }}>\n            {t(\"Settings_Transport_Localisation_Needed\")}\n          </Typography>\n          <Typography\n            variant={\"body1\"}\n            color={\"secondary\"}\n            style={{\n              textAlign: \"center\",\n              marginBottom: 20,\n            }}\n          >\n            {t(\"Settings_Transport_Localisation_Needed_Description\")}\n          </Typography>\n          <Button\n            title={t(\"Settings_Transport_Localisation_Request\")}\n            variant={\"light\"}\n            color={\"blue\"}\n            onPress={() => {\n              if (status?.canAskAgain) {\n                requestPermission();\n              } else {\n                Linking.openSettings();\n              }\n            }}\n          />\n        </View>\n      )}\n    </View>\n  );\n};"
  },
  {
    "path": "app/(modals)/course.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport { useRoute, useTheme } from \"@react-navigation/native\";\nimport { formatDistanceStrict, formatDistanceToNow } from 'date-fns'\nimport * as DateLocale from 'date-fns/locale';\nimport i18n, { t } from \"i18next\";\nimport React from \"react\";\nimport { Platform } from 'react-native';\nimport LinearGradient from \"react-native-linear-gradient\";\n\nimport ModalOverhead from \"@/components/ModalOverhead\";\nimport { Course as SharedCourse } from \"@/services/shared/timetable\";\nimport Icon from \"@/ui/components/Icon\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport { getSubjectName } from '@/utils/subjects/name';\n\nimport { getStatusText } from \"../(tabs)/calendar/components/CalendarDay\";\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\ninterface SubjectInfo {\n  name: string;\n  originalName: string;\n  emoji: string;\n  color: string;\n}\n\ninterface GradesModalProps {\n  course: SharedCourse;\n  subjectInfo: SubjectInfo;\n}\n\nexport default function CourseModal() {\n  const { params } = useRoute();\n  const { colors } = useTheme();\n\n  if (!params) {\n    return null;\n  }\n\n  const { course, subjectInfo } = params as GradesModalProps;\n  const item = course;\n\n  const startTime = Math.floor(course.from.getTime() / 1000);\n  const endTime = Math.floor(course.to.getTime() / 1000);\n\n  const insets = useSafeAreaInsets();\n  const finalHeaderHeight = Platform.select({\n    android: insets.top + 32,\n    default: 0\n  });\n\n  return (\n    <>\n      {Platform.OS !== 'android' && (\n        <LinearGradient\n          colors={[subjectInfo.color, colors.background]}\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            height: 500,\n            width: \"100%\",\n            zIndex: -9,\n            opacity: 0.6\n          }}\n        />\n      )}\n\n      <List\n        ListHeaderComponent={\n          <ModalOverhead\n            subject={getSubjectName(item.subject)}\n            title={item.customStatus || getStatusText(item.status)}\n            color={Platform.OS === 'ios' ? subjectInfo.color : colors.primary}\n            emoji={subjectInfo.emoji}\n            subjectVariant=\"h3\"\n            date={new Date(startTime * 1000)}\n            dateFormat={{\n              day: \"numeric\",\n              month: \"long\",\n              year: \"numeric\",\n              hour: \"numeric\",\n              minute: \"numeric\"\n            }}\n            style={{\n              marginBottom: 24,\n              marginTop: 24,\n              paddingTop: finalHeaderHeight\n            }}\n          />\n        }\n        style={{ backgroundColor: \"transparent\" }}\n        contentContainerStyle={{ padding: 16 }}\n      >\n        {getStatusText(course.status) ? (\n          <List.Section>\n            <List.Item>\n              <List.Leading>\n                <Icon>\n                  <Papicons name=\"Info\" />\n                </Icon>\n              </List.Leading>\n              <Typography variant=\"title\">\n                {getStatusText(course.status)}\n              </Typography>\n            </List.Item>\n          </List.Section>\n        ) : null}\n\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>{t(\"Modal_Course_Time\")}</List.Label>\n          </List.SectionTitle>\n\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name=\"Logout\" />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">\n              {t(\"Modal_Course_Start\")}\n            </Typography>\n            <Typography variant=\"body1\" color=\"textSecondary\">\n              {formatDistanceToNow(startTime * 1000, {\n                locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,\n                addSuffix: true\n              })}\n            </Typography>\n            <List.Trailing>\n              <Typography variant=\"title\">\n                {new Date(startTime * 1000).toLocaleString(undefined, {\n                  hour: \"numeric\",\n                  minute: \"numeric\"\n                })}\n              </Typography>\n            </List.Trailing>\n          </List.Item>\n\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name=\"Login\" />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">\n              {t(\"Modal_Course_End\")}\n            </Typography>\n            <List.Trailing>\n              <Typography variant=\"title\">\n                {new Date(endTime * 1000).toLocaleString(undefined, {\n                  hour: \"numeric\",\n                  minute: \"numeric\"\n                })}\n              </Typography>\n            </List.Trailing>\n          </List.Item>\n        </List.Section>\n\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>{t(\"Modal_Course_Details\")}</List.Label>\n          </List.SectionTitle>\n\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name=\"User\" />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">\n              {t(\"Modal_Course_Teacher\")}\n            </Typography>\n            <Typography variant=\"body1\" color=\"textSecondary\">\n              {item.teacher}\n            </Typography>\n          </List.Item>\n\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name=\"MapPin\" />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">\n              {t(\"Modal_Course_Room\")}\n            </Typography>\n            <Typography variant=\"body1\" color=\"textSecondary\">\n              {item.room || t(\"No_Course_Room\")}\n            </Typography>\n          </List.Item>\n\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name=\"Clock\" />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">\n              {t(\"Modal_Course_Duration\")}\n            </Typography>\n            <Typography variant=\"body1\" color=\"textSecondary\">\n              {formatDistanceStrict(startTime * 1000, endTime * 1000, {\n                locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS\n              })}\n            </Typography>\n          </List.Item>\n        </List.Section>\n      </List>\n    </>\n  )\n}\n"
  },
  {
    "path": "app/(modals)/grade.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport { useRoute, useTheme } from \"@react-navigation/native\";\nimport { t } from \"i18next\";\nimport React from \"react\";\nimport { Platform, View } from \"react-native\";\nimport LinearGradient from \"react-native-linear-gradient\";\n\nimport ModalOverhead, { ModalOverHeadScore } from '@/components/ModalOverhead';\nimport { Grade as SharedGrade } from \"@/services/shared/grade\";\nimport ContainedNumber from \"@/ui/components/ContainedNumber\";\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport TableFlatList from \"@/ui/components/TableFlatList\";\nimport TypographyLegacy from \"@/ui/components/Typography\";\nimport adjust from '@/utils/adjustColor';\nimport { colorCheck } from '@/utils/colorCheck';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport List from '@/ui/new/List';\nimport Typography from '@/ui/new/Typography';\n\ninterface SubjectInfo {\n  name: string;\n  originalName: string;\n  emoji: string;\n  color: string;\n}\n\ninterface GradesModalProps {\n  grade: SharedGrade;\n  subjectInfo: SubjectInfo;\n  avgInfluence: number;\n  avgClass: number;\n}\n\ninterface GradeBadgeProps {\n  icon: string;\n  label: string;\n  color: string;\n  theme: any;\n  is_outlined?: boolean;\n}\n\nconst GradeBadge = ({ icon, label, color, theme, is_outlined = false }: GradeBadgeProps) => {\n  const backgroundColor = is_outlined ? \"transparent\" : adjust(color, theme.dark ? 0.3 : -0.3);\n  const textColor = is_outlined ? color : (colorCheck(\"#FFFFFF\", [backgroundColor]) ? \"#FFFFFF\" : \"#000000\");\n  const borderStyle = is_outlined ? { borderWidth: 1, borderColor: color } : undefined;\n\n  return (\n    <Stack direction=\"horizontal\" gap={8} backgroundColor={backgroundColor} vAlign=\"center\" hAlign=\"center\" padding={[12, 6]} radius={32} style={borderStyle}>\n      <Papicons size={20} name={icon} color={textColor} />\n      <TypographyLegacy color={textColor} variant='body2'>\n        {label}\n      </TypographyLegacy>\n    </Stack>\n  );\n};\n\nexport default function GradesModal() {\n  const { params } = useRoute();\n  const theme = useTheme();\n  const colors = theme.colors;\n\n  if (!params) {\n    return null;\n  }\n  const { grade, subjectInfo, avgInfluence = 0, avgClass = 0 } = params as GradesModalProps;\n\n  const insets = useSafeAreaInsets();\n  const finalHeaderHeight = Platform.select({\n    android: insets.top + 32,\n    default: 0\n  });\n\n  return (\n    <>\n      {Platform.OS !== 'android' && (\n        <LinearGradient\n          colors={[subjectInfo.color, colors.background]}\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            height: 300,\n            width: \"100%\",\n            zIndex: -9,\n            opacity: 0.4\n          }}\n        />\n      )}\n\n      <List\n        ListHeaderComponent={\n          <View\n            style={{\n              alignItems: \"center\",\n              justifyContent: \"center\",\n              gap: 16,\n              marginVertical: 20,\n              paddingTop: finalHeaderHeight\n            }}\n          >\n            <ModalOverhead\n              color={Platform.OS === 'ios' ? subjectInfo.color : colors.primary}\n              emoji={subjectInfo.emoji}\n              subject={subjectInfo.name}\n              title={grade.description}\n              date={new Date(grade.givenAt)}\n              overhead={\n                <ModalOverHeadScore\n                  color={Platform.OS === 'ios' ? subjectInfo.color : colors.primary}\n                  score={grade.studentScore?.disabled ? String(grade.studentScore?.status) : String(grade.studentScore?.value.toFixed(2))}\n                  outOf={grade.outOf?.value}\n                />\n              }\n            />\n\n            {grade.studentScore?.value === grade.maxScore?.value && !grade.studentScore?.disabled &&\n              <GradeBadge\n                icon=\"crown\"\n                label={t(\"Modal_Grades_BestGrade\")}\n                color={subjectInfo.color}\n                theme={theme}\n                is_outlined={false}\n              />\n            }\n            {grade.optional &&\n              <GradeBadge\n                icon=\"info\"\n                label={t(\"Modal_Grades_OptionalGrade\")}\n                color={subjectInfo.color}\n                theme={theme}\n                is_outlined={true}\n              />\n            }\n\n            {grade.bonus &&\n              <GradeBadge\n                icon=\"info\"\n                label={t(\"Modal_Grades_BonusGrade\")}\n                color={subjectInfo.color}\n                theme={theme}\n                is_outlined={true}\n              />\n            }\n            <Stack\n              card\n              direction=\"horizontal\"\n              width={\"100%\"}\n              style={{ marginTop: 8 }}\n            >\n              <Stack\n                width={\"50%\"}\n                vAlign=\"center\"\n                hAlign=\"center\"\n                style={{ borderRightWidth: 1, borderRightColor: colors.border }}\n                padding={12}\n              >\n                <Icon papicon opacity={0.5}>\n                  <Papicons name={\"Coefficient\"} />\n                </Icon>\n                <TypographyLegacy color=\"secondary\">\n                  {t(\"Grades_Coefficient\")}\n                </TypographyLegacy>\n                <ContainedNumber color={Platform.OS === 'android' ? theme.colors.tint : adjust(subjectInfo.color, theme.dark ? 0.3 : -0.3)}>\n                  x{(grade.coefficient ?? 1).toFixed(2)}\n                </ContainedNumber>\n              </Stack>\n              <Stack\n                width={\"50%\"}\n                vAlign=\"center\"\n                hAlign=\"center\"\n                padding={12}\n              >\n                <Icon papicon opacity={0.5}>\n                  <Papicons name={\"Apple\"} />\n                </Icon>\n                <TypographyLegacy color=\"secondary\">\n                  {t(\"Grades_Avg_Group_Short\")}\n                </TypographyLegacy>\n                <ContainedNumber color={Platform.OS === 'android' ? theme.colors.tint : adjust(subjectInfo.color, theme.dark ? 0.3 : -0.3)} denominator={\"/\" + grade.outOf?.value}>\n                  {grade.averageScore?.value.toFixed(2)}\n                </ContainedNumber>\n              </Stack>\n            </Stack>\n          </View>\n        }\n        style={{ backgroundColor: \"transparent\" }}\n        contentContainerStyle={{ padding: 16,\n              paddingBottom: 16 + insets.bottom }}\n      >\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>{t(\"Grades_Details_Title\")}</List.Label>\n          </List.SectionTitle>\n\n          {grade.studentScore && grade.outOf && grade.outOf.value !== 20 ? (\n            <List.Item>\n              <List.Leading>\n                <Icon>\n                  <Papicons name={\"Star\"} />\n                </Icon>\n              </List.Leading>\n              <Typography variant=\"title\">\n                {t(\"Grades_NormalizedGrade_Title\")}\n              </Typography>\n              <Typography variant=\"body1\" color=\"textSecondary\">\n                {t(\"Grades_NormalizedGrade_Description\")}\n              </Typography>\n              <List.Trailing>\n                <ContainedNumber\n                  color={subjectInfo.color}\n                  denominator={\"/20\"}\n                >\n                  {((grade.studentScore.value / grade.outOf.value) * 20).toFixed(2)}\n                </ContainedNumber>\n              </List.Trailing>\n            </List.Item>\n          ) : null}\n\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name={\"Plus\"} />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">\n              {t(\"Grades_HighestGrade_Title\")}\n            </Typography>\n            <Typography variant=\"body1\" color=\"textSecondary\">\n              {t(\"Grades_HighestGrade_Description\")}\n            </Typography>\n            <List.Trailing>\n              <ContainedNumber\n                color={Platform.OS === 'android' ? theme.colors.tint : adjust(subjectInfo.color, theme.dark ? 0.3 : -0.3)}\n                denominator={\"/\" + grade.outOf?.value}\n              >\n                {grade.maxScore?.value.toFixed(2)}\n              </ContainedNumber>\n            </List.Trailing>\n          </List.Item>\n\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name={\"Minus\"} />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">\n              {t(\"Grades_LowestGrade_Title\")}\n            </Typography>\n            <Typography variant=\"body1\" color=\"textSecondary\">\n              {t(\"Grades_LowestGrade_Description\")}\n            </Typography>\n            <List.Trailing>\n              <ContainedNumber\n                color={Platform.OS === 'android' ? theme.colors.tint : adjust(subjectInfo.color, theme.dark ? 0.3 : -0.3)}\n                denominator={\"/\" + grade.outOf?.value}\n              >\n                {grade.minScore?.value.toFixed(2)}\n              </ContainedNumber>\n            </List.Trailing>\n          </List.Item>\n        </List.Section>\n\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>{t(\"Grades_Influence_Title\")}</List.Label>\n          </List.SectionTitle>\n\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name={\"Grades\"} />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">\n              {t(\"Grades_Avg_All_Title\")}\n            </Typography>\n            <List.Trailing>\n              <ContainedNumber\n                color={avgInfluence === 0 ? \"#757575\" : avgInfluence >= 0 ? \"#2e8900\" : \"#990000\"}\n                denominator=\"pts\"\n              >\n                {avgInfluence >= 0 ? `+${avgInfluence.toFixed(2)}` : avgInfluence.toFixed(2)}\n              </ContainedNumber>\n            </List.Trailing>\n          </List.Item>\n\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name={\"Apple\"} />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">\n              {t(\"Grades_Avg_Group_Title\")}\n            </Typography>\n            <List.Trailing>\n              <ContainedNumber\n                color={avgClass === 0 ? \"#757575\" : avgClass >= 0 ? \"#2e8900\" : \"#990000\"}\n                denominator=\"pts\"\n              >\n                {avgClass >= 0 ? `+${avgClass.toFixed(2)}` : avgClass.toFixed(2)}\n              </ContainedNumber>\n            </List.Trailing>\n          </List.Item>\n        </List.Section>\n      </List>\n    </>\n  )\n}\n"
  },
  {
    "path": "app/(modals)/news.tsx",
    "content": "import { getManager } from \"@/services/shared\";\nimport { News } from \"@/services/shared/news\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { Services } from \"@/stores/account/types\";\nimport Stack from \"@/ui/components/Stack\";\nimport TypographyLegacy from \"@/ui/components/Typography\";\nimport { useLocalSearchParams, useNavigation, useRouter } from \"expo-router\"\nimport { useEffect, useState } from \"react\";\nimport { Linking, Platform, ScrollView, StyleSheet, View } from \"react-native\";\nimport { Attachment, News as SkolengoNews } from \"skolengojs\"\n\nimport { VARIANTS } from \"@/ui/components/Typography\";\n\nimport HTMLView from 'react-native-htmlview';\nimport * as WebBrowser from 'expo-web-browser';\nimport { useTheme } from \"@react-navigation/native\";\nimport { NativeHeaderPressable, NativeHeaderSide } from \"@/ui/components/NativeHeader\";\nimport { MenuView } from \"@react-native-menu/menu\";\nimport Icon from \"@/ui/components/Icon\";\nimport { t } from \"i18next\";\nimport ListLegacy from \"@/ui/components/List\";\nimport Item, { Leading } from \"@/ui/components/Item\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { cleanHtmlForArticle } from \"@/utils/news/cleanUpHTMLNews\";\nimport { news } from \"pawnote\";\nimport Avatar from \"@/ui/components/Avatar\";\nimport { getInitials } from \"@/utils/chats/initials\";\nimport { HeaderBackButton } from \"@react-navigation/elements\";\nimport { runsIOS26 } from \"@/ui/utils/IsLiquidGlass\";\nimport { IconNames, Papicons } from \"@getpapillon/papicons\";\nimport { getAttachmentIcon } from \"@/utils/news/getAttachmentIcon\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\n\nconst NewsModal = () => {\n  const search = useLocalSearchParams();\n  const news = JSON.parse(String(search.news)) as News\n  const insets = useSafeAreaInsets();\n\n  const navigation = useNavigation()\n  const router = useRouter()\n\n  useEffect(() => {\n    const acknowledgeNews = async () => {\n      if (!news.acknowledged) {\n        const manager = getManager();\n\n        const store = useAccountStore.getState()\n        const account = store.accounts.find(account => account.id === store.lastUsedAccount)\n        const service = account?.services.find(service => service.id === news.createdByAccount)\n\n        if (service?.serviceId === Services.SKOLENGO) {\n          const attachment = new Attachment(\"\", \"\", \"\")\n          const ref = new SkolengoNews(news.id, news.createdAt, news.title ?? \"\", news.content, news.content, { id: \"\", name: \"\" }, \"\", attachment)\n          news.ref = ref\n        }\n\n        await manager.setNewsAsDone(news);\n      }\n    };\n\n    acknowledgeNews();\n  }, [])\n\n\n  const { colors } = useTheme();\n\n  const stylesheet = StyleSheet.create({\n    ...VARIANTS,\n    p: {\n      ...VARIANTS.body1,\n      color: colors.text,\n    },\n    div: {\n      ...VARIANTS.body1,\n      color: colors.text,\n    },\n    a: {\n      color: colors.primary,\n      textDecorationLine: 'underline'\n    },\n    ul: {\n      ...VARIANTS.body1,\n      paddingHorizontal: 4,\n      color: colors.text,\n    },\n  });\n\n  const [HTMLCleanupEnabled, setHTMLCleanupEnabled] = useState(true)\n  const cleanedContent = HTMLCleanupEnabled ? cleanHtmlForArticle(news.content) : news.content\n\n  return (\n    <ScrollView\n      contentInsetAdjustmentBehavior=\"automatic\"\n      style={{ flex: 1 }}\n      contentContainerStyle={{\n        paddingHorizontal: 20,\n        paddingTop: 20,\n        paddingBottom: 20 + insets.bottom,\n        gap: 24\n      }}\n    >\n      {\n        Platform.OS === 'ios' && (\n          <NativeHeaderSide side=\"Left\">\n            <HeaderBackButton\n              tintColor={runsIOS26 ? colors.text : colors.primary}\n              onPress={() => router.back()}\n\n              style={{\n                marginLeft: runsIOS26 ? 3 : -32,\n              }}\n            />\n          </NativeHeaderSide>\n        )\n      }\n\n      <Stack gap={10}>\n        <Stack padding={[10, 4]} radius={200} backgroundColor={colors.text + \"16\"}>\n          <TypographyLegacy variant=\"body2\">\n            {news.category}\n          </TypographyLegacy>\n        </Stack>\n\n        <TypographyLegacy variant=\"h3\">\n          {news.title}\n        </TypographyLegacy>\n\n        <Stack direction=\"horizontal\" hAlign=\"center\">\n          <Stack direction=\"horizontal\" gap={8} inline flex hAlign=\"center\">\n            <Avatar initials={getInitials(news.author)} size={28} />\n            <TypographyLegacy nowrap variant=\"body2\">\n              {news.author}\n            </TypographyLegacy>\n          </Stack>\n\n          <TypographyLegacy nowrap variant=\"body2\" color=\"secondary\">\n            {new Date(news.createdAt).toLocaleDateString(undefined, {\n              day: '2-digit',\n              month: 'short',\n              year: 'numeric'\n            })}\n          </TypographyLegacy>\n        </Stack>\n      </Stack>\n\n      {news.question && (\n        <List scrollEnabled={false}>\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name=\"pie\" />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">\n              Cette actualité contient un sondage\n            </Typography>\n            <Typography variant=\"body1\" color=\"textSecondary\">\n              PRONOTE ne nous permet pas d'afficher les sondages pour le moment.\n            </Typography>\n          </List.Item>\n        </List>\n      )}\n\n      <HTMLView\n        value={cleanedContent}\n        stylesheet={stylesheet}\n        style={{\n          gap: 12\n        }}\n        paragraphBreak=\"\"\n        bullet=\"  •  \"\n      />\n\n      {news.attachments.length > 0 && (\n        <ListLegacy>\n          {news.attachments.map((attachment, index) => (\n            <Item key={index} onPress={() => Linking.openURL(attachment.url)}>\n              <Leading>\n                <Icon size={28}>\n                  <Papicons name={getAttachmentIcon(attachment)} />\n                </Icon>\n              </Leading>\n              <TypographyLegacy variant=\"title\">\n                {attachment.name}\n              </TypographyLegacy>\n              <TypographyLegacy variant=\"body1\" nowrap color=\"secondary\">\n                {attachment.url}\n              </TypographyLegacy>\n            </Item>\n          ))}\n        </ListLegacy>\n      )}\n\n      <Stack gap={0} style={{ opacity: 0.4 }}>\n        <TypographyLegacy variant=\"caption\">\n          Si cette actualité ne s'affiche pas correctement,\n        </TypographyLegacy>\n        <TypographyLegacy variant=\"caption\" style={{\n          textDecorationLine: 'underline'\n        }} onPress={() => setHTMLCleanupEnabled(!HTMLCleanupEnabled)}>\n          {HTMLCleanupEnabled ? \"désactiver\" : \"activer\"} le formattage automatique\n        </TypographyLegacy>\n      </Stack>\n    </ScrollView >\n  );\n};\n\nexport default NewsModal;"
  },
  {
    "path": "app/(modals)/notifications.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { useTranslation } from \"react-i18next\";\n\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\n\nexport default function NotificationsModal() {\n  const { colors } = useTheme();\n  const { t } = useTranslation();\n\n  return (\n    <Stack\n      hAlign={\"center\"}\n      vAlign={\"top\"}\n      paddingTop={150}\n      paddingHorizontal={20}\n      paddingBottom={20}\n      style={{\n        width: \"100%\",\n        height: \"100%\",\n        backgroundColor: colors.background\n      }}\n    >\n      <Papicons name={\"Clock\"} size={80} style={{ marginBottom: 10 }} opacity={0.5} color={colors.text} />\n      <Typography variant=\"h2\" align={\"center\"}>\n        {t(\"Feature_Soon\")}\n      </Typography>\n      <Typography variant={\"caption\"} align={\"center\"} color={\"secondary\"}>\n        {t(\"Feature_Soon_Notification\")}\n      </Typography>\n    </Stack>\n  )\n}"
  },
  {
    "path": "app/(modals)/profile.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { MenuView, NativeActionEvent } from \"@react-native-menu/menu\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport { useTheme } from \"@react-navigation/native\";\nimport * as ImagePicker from \"expo-image-picker\"\nimport { router } from \"expo-router\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n  Alert,\n  KeyboardAvoidingView,\n  Platform,\n  ScrollView,\n  View,\n} from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport OnboardingInput from \"@/components/onboarding/OnboardingInput\";\nimport { useAccountStore } from \"@/stores/account\";\nimport Avatar from \"@/ui/components/Avatar\";\nimport Button from \"@/ui/components/Button\";\nimport Icon from \"@/ui/components/Icon\";\nimport { NativeHeaderPressable, NativeHeaderSide } from \"@/ui/components/NativeHeader\";\nimport Typography from \"@/ui/components/Typography\";\nimport { getInitials } from \"@/utils/chats/initials\";\nimport ActionMenu from \"@/ui/components/ActionMenu\";\n\nexport default function CustomProfileScreen() {\n  const { t } = useTranslation();\n  const store = useAccountStore.getState();\n  const accounts = useAccountStore((state) => state.accounts);\n  const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);\n\n  const account = accounts.find((a) => a.id === lastUsedAccount);\n\n  const [firstName, setFirstName] = useState<string>(account?.firstName ?? \"\");\n  const [lastName, setLastName] = useState<string>(account?.lastName ?? \"\");\n  const [profilePictureUrl, setProfilePictureUrl] = useState<string | null>(account?.customisation?.profilePicture ? `data:image/png;base64,${account.customisation.profilePicture}` : null);\n\n  useEffect(() => {\n    if (account) {\n      setFirstName(account.firstName);\n      setLastName(account.lastName);\n      setProfilePictureUrl(account.customisation?.profilePicture ? `data:image/png;base64,${account.customisation.profilePicture}` : null);\n    }\n  }, [account]);\n\n  const insets = useSafeAreaInsets()\n\n  const updateProfilePictureFromLibrary = async () => {\n    const result = await ImagePicker.launchImageLibraryAsync({\n      mediaTypes: ['images', 'videos'],\n      allowsEditing: true,\n      aspect: [4, 3],\n      quality: 1,\n      base64: true\n    });\n\n    if (!result.canceled) {\n      const b64 = result.assets[0].base64 ?? \"\";\n      store.setAccountProfilePicture(lastUsedAccount, b64);\n    }\n  }\n\n  const updateProfilePictureFromService = async () => {\n    Alert.alert(\n      t(\"Feature_Soon\"),\n      \"Cette fonctionnalité n'est pas encore disponible, mais elle le sera dans une prochaine mise à jour.\",\n      [{ text: \"OK\" }]\n    );\n  }\n\n  const { colors } = useTheme();\n  const height = useHeaderHeight();\n\n  return (\n    <KeyboardAvoidingView\n      behavior={\"position\"}\n      keyboardVerticalOffset={-insets.top * 3.2}\n      style={{ flex: 1 }}\n    >\n      <ScrollView\n        contentInsetAdjustmentBehavior=\"automatic\"\n        style={{ height: \"100%\" }}\n      >\n        <View style={{ paddingHorizontal: 50, alignItems: \"center\", gap: 15, paddingTop: 20 }}>\n          <Avatar\n            size={117}\n            initials={getInitials(`${firstName} ${lastName}`)}\n            imageUrl={profilePictureUrl || undefined}\n          />\n\n          <ActionMenu\n            actions={[\n              {\n                id: 'photo_library',\n                title: t(\"Button_Change_ProfilePicture_FromLibrary\"),\n                papicon: 'gallery',\n                image: Platform.select({\n                  ios: 'photo',\n                  android: 'ic_menu_gallery',\n                }),\n                imageColor: colors.text\n              },\n              {\n                id: 'from_service',\n                title: t(\"Button_Change_ProfilePicture_FromService\"),\n                papicon: 'crown',\n                image: Platform.select({\n                  ios: 'square.and.arrow.down',\n                  android: 'ic_menu_save',\n                }),\n                imageColor: colors.text\n              },\n              {\n                id: 'remove_photo',\n                title: t(\"Button_Change_ProfilePicture_Remove\"),\n                attributes: { destructive: true },\n                papicon: 'trash',\n                image: Platform.select({\n                  ios: 'trash',\n                  android: 'ic_menu_delete',\n                }),\n                imageColor: \"#FF0000\"\n              }\n            ]}\n            onPressAction={(e: NativeActionEvent) => {\n              switch (e.nativeEvent.event) {\n                case 'photo_library':\n                  updateProfilePictureFromLibrary();\n                  break;\n                case 'from_service':\n                  updateProfilePictureFromService();\n                  break;\n                case 'remove_photo':\n                  store.setAccountProfilePicture(lastUsedAccount, \"\");\n                  break;\n              }\n            }}\n          >\n            <Button\n              inline\n              size=\"small\"\n              icon={<Papicons name=\"Camera\" />}\n              title={t(\"Button_Change_ProfilePicture\")}\n            />\n          </ActionMenu>\n        </View>\n\n        <View style={{ paddingHorizontal: 20, paddingTop: 30, gap: 15 }}>\n          <View style={{ gap: 10 }}>\n            <Typography color=\"secondary\">Prénom</Typography>\n            <OnboardingInput\n              placeholder={\"Prénom\"}\n              text={firstName}\n              setText={setFirstName}\n              icon={\"Font\"}\n              inputProps={{}}\n            />\n            <Typography color=\"secondary\">Nom</Typography>\n            <OnboardingInput\n              placeholder={\"Nom\"}\n              text={lastName}\n              setText={setLastName}\n              icon={\"Bold\"}\n              inputProps={{}}\n            />\n          </View>\n        </View>\n        <NativeHeaderSide side=\"Left\" key={`${firstName}-${lastName}`}>\n          <NativeHeaderPressable\n            onPressIn={() => {\n              useAccountStore.getState().setAccountName(lastUsedAccount, firstName, lastName);\n              router.back();\n            }}\n          >\n            <Icon papicon size={26}>\n              <Papicons name=\"ArrowLeft\" />\n            </Icon>\n          </NativeHeaderPressable>\n\n        </NativeHeaderSide>\n      </ScrollView>\n    </ KeyboardAvoidingView >\n  );\n}"
  },
  {
    "path": "app/(modals)/task.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useRoute, useTheme } from \"@react-navigation/native\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport * as WebBrowser from \"expo-web-browser\";\nimport { t } from \"i18next\";\nimport React, { useState } from \"react\";\n\nimport ModalOverhead from \"@/components/ModalOverhead\";\nimport Homework from \"@/database/models/Homework\";\nimport { updateHomeworkIsDone } from \"@/database/useHomework\";\nimport { getManager } from \"@/services/shared\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport TableFlatList from \"@/ui/components/TableFlatList\";\nimport { formatHTML } from \"@/utils/format/html\";\nimport { generateId } from \"@/utils/generateId\";\nimport { getAttachmentIcon } from \"@/utils/news/getAttachmentIcon\";\nimport { getSubjectColor } from \"@/utils/subjects/colors\";\nimport { getSubjectEmoji } from \"@/utils/subjects/emoji\";\nimport { getSubjectName } from \"@/utils/subjects/name\";\nimport { Platform } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\n\nconst Task = () => {\n  const { params } = useRoute();\n  const theme = useTheme();\n  const colors = theme.colors;\n\n  const { task } = params as { task: Homework };\n\n  const subjectInfo = {\n    color: getSubjectColor(task.subject),\n    emoji: getSubjectEmoji(task.subject),\n    name: getSubjectName(task.subject)\n  }\n\n  const [isDone, setIsDone] = useState(task.isDone);\n\n  const setAsDone = async (done: boolean) => {\n    const manager = getManager();\n    await manager.setHomeworkCompletion(task, done);\n\n    const id = generateId(\n      task.subject +\n      task.content +\n      task.createdByAccount +\n      new Date(task.dueDate).toDateString()\n    );\n\n    updateHomeworkIsDone(id, done);\n    setIsDone(done);\n  }\n\n  const insets = useSafeAreaInsets();\n  const finalHeaderHeight = Platform.select({\n    android: insets.top + 32,\n    default: 0\n  });\n\n  return (\n    <>\n      {Platform.OS !== 'android' && (\n        <LinearGradient\n          colors={[subjectInfo.color, colors.background]}\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n          right: 0,\n          height: 300,\n          width: \"100%\",\n          zIndex: -9,\n          opacity: 0.4\n        }}\n      />\n      )}\n\n      <List\n        ListHeaderComponent={\n          <ModalOverhead\n            emoji={subjectInfo.emoji}\n            subject={subjectInfo.name}\n            subjectVariant=\"header\"\n            color={Platform.OS === 'ios' ? subjectInfo.color : colors.primary}\n            date={new Date(task.dueDate)}\n            style={{\n              marginVertical: 24,\n              paddingTop: finalHeaderHeight,\n            }}\n          />\n        }\n        style={{\n          backgroundColor: \"transparent\"\n        }}\n        contentContainerStyle={{\n          padding: 16\n        }}\n      >\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>{t(\"Modal_Task_Status\")}</List.Label>\n          </List.SectionTitle>\n\n          <List.Item>\n            <List.Leading>\n              <AnimatedPressable onPress={() => setAsDone(!isDone)}>\n                <Stack\n                  backgroundColor={isDone ? (Platform.OS === 'ios' ? subjectInfo.color : theme.colors.primary) : theme.colors.card}\n                  card\n                  radius={100}\n                  width={28}\n                  height={28}\n                  vAlign=\"center\"\n                  hAlign=\"center\"\n                >\n                  {isDone &&\n                    <Papicons name=\"check\" size={22} color=\"white\" />\n                  }\n                </Stack>\n              </AnimatedPressable>\n            </List.Leading>\n            <Typography variant=\"title\">\n              {isDone ? t(\"Task_Done\") : t(\"Task_Undone\")}\n            </Typography>\n          </List.Item>\n        </List.Section>\n\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>{t(\"Modal_Task_Description\")}</List.Label>\n          </List.SectionTitle>\n\n          <List.Item>\n            <Typography>\n              {formatHTML(task.content)}\n            </Typography>\n          </List.Item>\n        </List.Section>\n\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>{t(\"Modal_Task_Attachments\")}</List.Label>\n          </List.SectionTitle>\n\n          {task.attachments.map((attachment) => (\n            <List.Item onPress={() => WebBrowser.openBrowserAsync(attachment.url, {\n              presentationStyle: \"formSheet\"\n            })}>\n              <List.Leading>\n                <Icon>\n                  <Papicons name={getAttachmentIcon(attachment)} />\n                </Icon>\n              </List.Leading>\n              <Typography variant=\"title\" numberOfLines={1}>\n                {attachment.name || attachment.url}\n              </Typography>\n              <Typography variant=\"body1\" color=\"textSecondary\" numberOfLines={1}>\n                {attachment.url}\n              </Typography>\n            </List.Item>\n          ))}\n        </List.Section>\n      </List>\n    </>\n  );\n};\n\nexport default Task;\n"
  },
  {
    "path": "app/(modals)/wallpaper.tsx",
    "content": "import { useAccountStore } from \"@/stores/account\"\nimport { useSettingsStore } from \"@/stores/settings\"\nimport { Wallpaper } from \"@/stores/settings/types\"\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\"\nimport Stack from \"@/ui/components/Stack\"\nimport Typography from \"@/ui/components/Typography\"\nimport { useTheme } from \"@react-navigation/native\"\nimport React, { useEffect, useState } from \"react\"\nimport { FlatList, Image, Platform, RefreshControl, View } from \"react-native\"\nimport { File, Directory, Paths } from 'expo-file-system';\nimport ActivityIndicator from \"@/components/ActivityIndicator\"\nimport { NativeHeaderPressable, NativeHeaderSide } from \"@/ui/components/NativeHeader\"\nimport Icon from \"@/ui/components/Icon\"\nimport { router } from \"expo-router\";\nimport { Papicons } from \"@getpapillon/papicons\"\nimport { t } from \"i18next\";\n\nimport * as ImagePicker from 'expo-image-picker';\nimport ActionMenu from \"@/ui/components/ActionMenu\"\n\nconst COLLECTIONS_SOURCE = \"https://raw.githubusercontent.com/PapillonApp/datasets/refs/heads/main/wallpapers/index.json\";\n\ninterface Collection {\n  name: string;\n  icon?: string;\n  link?: string;\n  images: Wallpaper[];\n}\n\nconst WallpaperModal = () => {\n  const { colors } = useTheme()\n\n  const [collections, setCollections] = useState<Collection[]>([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const fetchCollections = async () => {\n    try {\n      setLoading(true);\n      const response = await fetch(COLLECTIONS_SOURCE);\n      const data = await response.json();\n      setCollections(data);\n    } catch (error) {\n      setError(error as string);\n    } finally {\n      setLoading(false);\n    }\n  }\n\n  useEffect(() => {\n    fetchCollections();\n  }, []);\n\n\n\n  const [currentlyDownloading, setCurrentlyDownloading] = useState<string[]>([]);\n\n  const settingsStore = useSettingsStore(state => state.personalization);\n  const mutateProperty = useSettingsStore(state => state.mutateProperty);\n\n  const currentWallpaper = settingsStore.wallpaper;\n  const selectedId = currentWallpaper?.id;\n  const hasCustomWallpaper = selectedId?.startsWith(\"custom:\") ?? false;\n\n  const flatListRef = React.useRef<FlatList>(null);\n\n  useEffect(() => {\n    if (collections.length > 0 && currentWallpaper) {\n      const collectionIndex = collections.findIndex((collection) => collection.images.find((image) => image.id === currentWallpaper.id));\n      if (collectionIndex !== -1) {\n        setTimeout(() => {\n          flatListRef.current?.scrollToIndex({ index: collectionIndex, animated: true });\n        }, 500);\n      }\n    }\n  }, [collections, currentWallpaper]);\n\n  const wallpaperDirectory = new Directory(Paths.document, \"wallpapers\");\n\n  const downloadAndSelect = (wallpaper: Wallpaper) => {\n    const fileName = `${wallpaper.id}.jpg`;\n\n    const wallpaperFile = new File(wallpaperDirectory, fileName);\n    if (wallpaperFile.exists) {\n      mutateProperty(\"personalization\", {\n        wallpaper: {\n          id: wallpaper.id,\n          path: {\n            directory: wallpaperDirectory.name,\n            name: wallpaperFile.name\n          }\n        }\n      })\n      return;\n    }\n\n    setCurrentlyDownloading((prev) => [...prev, wallpaper.id]);\n\n    if (!wallpaperDirectory.exists) {\n      wallpaperDirectory.create();\n    }\n    File.downloadFileAsync(wallpaper.url!, wallpaperFile).then((result) => {\n      mutateProperty(\"personalization\", {\n        wallpaper: {\n          id: wallpaper.id,\n          path: {\n            directory: wallpaperDirectory.name,\n            name: result.name\n          }\n        }\n      })\n    }).finally(() => {\n      setCurrentlyDownloading((prev) => prev.filter((id) => id !== wallpaper.id));\n    })\n  }\n\n  const uploadCustomWallpaper = () => {\n    try {\n      ImagePicker.launchImageLibraryAsync({\n        allowsEditing: true,\n        aspect: [4, 3],\n        quality: 1,\n      }).then((result) => {\n        if (result.canceled) return;\n\n        const asset = result.assets[0];\n        const sourceFile = new File(asset.uri);\n\n        if (!wallpaperDirectory.exists) {\n          wallpaperDirectory.create();\n        }\n\n        const newFileName = `custom:${Date.now()}.jpg`;\n        const destFile = new File(wallpaperDirectory, newFileName);\n\n        sourceFile.copy(destFile);\n\n        mutateProperty(\"personalization\", {\n          wallpaper: {\n            id: `custom:${Date.now()}`,\n            path: {\n              directory: wallpaperDirectory.name,\n              name: destFile.name\n            }\n          }\n        })\n      })\n    } catch (error) {\n      console.log(error);\n    }\n  }\n\n  return (\n    <>\n      <FlatList\n        ref={flatListRef}\n        data={collections}\n        style={{\n          flex: 1,\n        }}\n        contentContainerStyle={{\n          gap: 16,\n          paddingTop: Platform.OS === 'android' ? 20 : 72\n        }}\n        renderItem={({ item, index }) => (\n          <View>\n            <Stack direction=\"horizontal\" alignItems=\"center\" gap={8} padding={[16, 10]}>\n              {item.icon &&\n                <Image\n                  source={{ uri: item.icon }}\n                  style={{\n                    width: 24,\n                    height: 24,\n                    borderRadius: 6\n                  }}\n                />\n              }\n\n              <Typography style={{ flex: 1 }} variant=\"body1\" color=\"text\">{item.name}</Typography>\n\n              {item.images.find((image) => image.id === currentWallpaper?.id) && item.images.find((image) => image.id === currentWallpaper?.id)?.credit &&\n                <Typography variant=\"caption\" color=\"secondary\">{item.images.find((image) => image.id === currentWallpaper?.id)?.credit}</Typography>\n              }\n            </Stack>\n\n            <FlatList\n              data={item.images}\n              horizontal\n              style={{\n                width: \"100%\",\n                paddingHorizontal: 12\n              }}\n              contentContainerStyle={{\n                gap: 6,\n                paddingRight: 12\n              }}\n              showsHorizontalScrollIndicator={false}\n              renderItem={({ item }) => <WallpaperImage item={item} onPress={() => downloadAndSelect(item)} selectedId={currentWallpaper?.id} isDownloading={currentlyDownloading.includes(item.id)} />}\n              getItemLayout={(data, index) => (\n                { length: 160 + 6, offset: (160 + 6) * index, index }\n              )}\n              initialScrollIndex={item.images.findIndex((image) => image.id === currentWallpaper?.id) !== -1 ? item.images.findIndex((image) => image.id === currentWallpaper?.id) : undefined}\n            />\n          </View>\n        )}\n        refreshControl={\n          <RefreshControl\n            refreshing={loading}\n            onRefresh={fetchCollections}\n            progressViewOffset={72}\n          />\n        }\n      />\n\n      <NativeHeaderSide side=\"Left\" key={currentWallpaper?.id + \":\" + \"upload:\" + (hasCustomWallpaper ? \"true\" : \"false\")}>\n        {Platform.OS === 'android' ? (\n          <NativeHeaderPressable onPress={() => router.back()}>\n            <Icon size={28}>\n              <Papicons name=\"Cross\" />\n            </Icon>\n          </NativeHeaderPressable>\n        ) : (\n          <NativeHeaderPressable onPress={() => uploadCustomWallpaper()}>\n            <Icon size={28} fill={hasCustomWallpaper ? colors.primary : undefined}>\n              <Papicons name=\"Gallery\" />\n            </Icon>\n          </NativeHeaderPressable>\n        )}\n      </NativeHeaderSide>\n\n      <NativeHeaderSide side=\"Right\" key={currentWallpaper?.id + \":\" + wallpaperDirectory.exists}>\n        {Platform.OS === 'android' && (\n          <NativeHeaderPressable onPress={() => uploadCustomWallpaper()}>\n            <Icon size={28} fill={hasCustomWallpaper ? colors.primary : undefined}>\n              <Papicons name=\"Gallery\" />\n            </Icon>\n          </NativeHeaderPressable>\n        )}\n        <ActionMenu\n          actions={[\n            {\n              id: \"background:clear\",\n              title: t(\"Modal_Wallpaper_Clear\"),\n              imageColor: \"#FF0000\",\n              image: Platform.select({\n                ios: \"trash.fill\"\n              }),\n              attributes: { \"destructive\": true, \"disabled\": !currentWallpaper }\n            },\n            {\n              id: \"background:downloads\",\n              title: t(\"Modal_Wallpaper_Downloads\"),\n              imageColor: colors.text,\n              image: Platform.select({\n                ios: \"square.and.arrow.down\"\n              }),\n              displayInline: false,\n              subactions: [\n                {\n                  title: t(\"Modal_Wallpaper_Downloads_Size\"),\n                  subtitle: (wallpaperDirectory.info().size / (1024 * 1024)).toFixed(2) + \" MB\"\n                },\n                {\n                  id: \"downloads:clear\",\n                  title: t(\"Modal_Wallpaper_ClearDownloads\"),\n                  imageColor: \"#FF0000\",\n                  image: Platform.select({\n                    ios: \"trash.fill\"\n                  }),\n                  attributes: { \"destructive\": true, \"disabled\": !wallpaperDirectory.exists }\n                }\n              ]\n            },\n          ]}\n          placement=\"below\"\n          onPressAction={({ nativeEvent }) => {\n            const action = nativeEvent.event;\n            if (action === \"downloads:clear\") {\n              wallpaperDirectory.delete();\n              mutateProperty(\"personalization\", {\n                wallpaper: undefined\n              })\n            }\n            if (action === \"background:clear\") {\n              mutateProperty(\"personalization\", {\n                wallpaper: undefined\n              })\n            }\n          }}\n        >\n          <NativeHeaderPressable>\n            <Icon size={28}>\n              <Papicons name=\"Gears\" />\n            </Icon>\n          </NativeHeaderPressable>\n        </ActionMenu>\n      </NativeHeaderSide>\n    </>\n  )\n}\n\nconst WallpaperImage = ({ item, onPress, selectedId, isDownloading }: { item: WallpaperCollection, onPress: () => void, selectedId: string, isDownloading: boolean }) => {\n  const [imageLoaded, setImageLoaded] = useState(false);\n  const { colors } = useTheme();\n\n  return (\n\n    <AnimatedPressable\n      onPress={onPress}\n    >\n      <View\n        style={{\n          width: 160,\n          height: 100,\n          padding: 2,\n          borderRadius: 16,\n          borderCurve: \"continuous\",\n          borderWidth: selectedId === item.id ? 2 : 0,\n          borderColor: selectedId === item.id ? colors.primary : \"transparent\"\n        }}\n        key={item.id}\n      >\n        {\n          (!imageLoaded || isDownloading) &&\n          <View\n            style={{\n              position: \"absolute\",\n              top: 2,\n              left: 2,\n              width: \"100%\",\n              height: \"100%\",\n              justifyContent: \"center\",\n              alignItems: \"center\",\n              zIndex: 1,\n              borderRadius: 12,\n              backgroundColor: \"rgba(0, 0, 0, 0.5)\"\n            }}\n          >\n            <ActivityIndicator color=\"#ffffff\" />\n          </View>\n        }\n\n        <Image\n          source={{ uri: item.thumbnail || item.url }}\n          style={{ width: \"100%\", height: \"100%\", borderRadius: 12 }}\n          onLoad={() => setImageLoaded(true)}\n        />\n      </View>\n    </AnimatedPressable>\n  );\n};\n\nexport default WallpaperModal\n"
  },
  {
    "path": "app/(modals)/wrapped/_layout.tsx",
    "content": "import { Stack } from \"expo-router\";\nimport React from \"react\";\n\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\n\nexport default function Layout() {\n  return (\n    <Stack screenOptions={screenOptions}>\n      <Stack.Screen\n        name=\"index\"\n        options={{\n          headerShown: false,\n        }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(modals)/wrapped/index.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Dimensions, FlatList, Pressable, StatusBar, View } from 'react-native';\n\nimport { useVideoPlayer, VideoView, VideoPlayer } from 'expo-video';\nimport { useEvent } from \"expo\";\nimport AnimatedPressable from '@/ui/components/AnimatedPressable';\n\nimport { LiquidGlassView } from '@sbaiahmed1/react-native-blur';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { Papicons } from '@getpapillon/papicons';\nimport { useNavigation } from 'expo-router';\n\nimport Reanimated, { FadeIn, FadeInDown, FadeInLeft, FadeInRight, FadeInUp, FadeOut, FadeOutUp, LinearTransition, ZoomIn, ZoomOut } from 'react-native-reanimated';\nimport Typography from '@/ui/components/Typography';\nimport { Cooking, Warning } from '@/app/(modals)/wrapped/stories/consent';\nimport { Welcome } from '@/app/(modals)/wrapped/stories/welcome';\n\nconst WrappedView = () => {\n  const insets = useSafeAreaInsets();\n  const navigation = useNavigation();\n\n  const [aboutToExit, setAboutToExit] = useState(false);\n  const [currentIndex, setCurrentIndex] = useState(0);\n\n  const mainBackground = useVideoPlayer({\n    assetId: require('@/assets/video/wrapped.mp4'),\n  }, player => {\n    player.loop = true;\n    player.play();\n  });\n\n  const altBackground = useVideoPlayer({\n    assetId: require('@/assets/video/wrapped_alt.mp4'),\n  }, player => {\n    player.loop = true;\n    player.play();\n  });\n\n  const redBackground = useVideoPlayer({\n    assetId: require('@/assets/video/wrapped_red.mp4'),\n  }, player => {\n    player.loop = true;\n    player.play();\n  });\n\n  const slides = [Welcome, Warning, Cooking];\n  const sliderRef = useRef<FlatList>(null);\n\n  return (\n    <View style={{ flex: 1, backgroundColor: 'black' }}>\n      {!aboutToExit && (\n        <>\n          {(currentIndex == 0 || currentIndex == 1 || currentIndex == 2) && (\n            <>\n              <StatusBar barStyle={\"light-content\"} />\n              <WrappedBackgroundVideo player={mainBackground} />\n            </>\n          )}\n        </>\n      )}\n\n      <LiquidGlassView\n        style={{\n          position: 'absolute',\n          top: insets.top + 2,\n          right: 16,\n          zIndex: 100,\n          borderRadius: 120,\n        }}\n        glassType=\"clear\"\n        isInteractive={true}\n        glassOpacity={0.6}\n        glassTintColor={\"#000\"}\n      >\n        <Pressable\n          style={{\n            padding: 10\n          }}\n          onPress={() => {\n            setTimeout(() => {\n              setAboutToExit(true);\n            }, 0);\n            setTimeout(() => {\n              navigation.goBack();\n            }, 50);\n          }}\n        >\n          <Papicons name=\"cross\" size={24} color='white' />\n        </Pressable>\n      </LiquidGlassView>\n\n      <View\n        style={{\n          position: 'absolute',\n          top: 0,\n          bottom: 0,\n          left: 0,\n          padding: 16,\n          gap: 8,\n          zIndex: 100,\n          justifyContent: 'center',\n          alignItems: 'center',\n          flexDirection: 'column',\n        }}\n      >\n        {slides.map((_, index) => (\n          <Reanimated.View\n            layout={LinearTransition.springify().duration(300)}\n            key={index}\n            style={{\n              width: index === currentIndex ? 8 : 6,\n              height: index === currentIndex ? 42 : 6,\n              borderRadius: 5,\n              backgroundColor: index === currentIndex ? '#FFF' : '#FFFFFF95',\n\n              shadowColor: '#000',\n              shadowOffset: {\n                width: 0,\n                height: 0,\n              },\n              shadowOpacity: index === currentIndex ? 0.3 : 1,\n              shadowRadius: 5,\n            }}\n          />\n        ))}\n      </View>\n\n      <FlatList\n        removeClippedSubviews={true}\n        windowSize={1}\n        data={slides}\n        renderItem={({ item: Item, index }) => (\n          <Item isCurrent={index === currentIndex} sliderRef={sliderRef} />\n        )}\n        keyExtractor={(item, index) => index.toString()}\n        style={{\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n          zIndex: 10,\n        }}\n        showsVerticalScrollIndicator={false}\n        showsHorizontalScrollIndicator={false}\n        scrollEventThrottle={16}\n        snapToInterval={Dimensions.get('screen').height}\n        decelerationRate=\"fast\"\n        onScroll={e => {\n          const index = Math.round(e.nativeEvent.contentOffset.y / Dimensions.get('screen').height);\n          setCurrentIndex(index);\n        }}\n        ref={sliderRef}\n      />\n    </View>\n  );\n};\n\nconst WrappedBackgroundVideo = ({ player }: { player: VideoPlayer }) => {\n  const { isPlaying, oldIsPlaying } = useEvent(player, 'playingChange', { isPlaying: player.playing });\n\n  useEffect(() => {\n    if (!isPlaying) {\n      player.play();\n    }\n  }, [isPlaying]);\n\n  return (\n    <Reanimated.View\n      style={{\n        width: '100%',\n        height: '100%',\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        zIndex: 1,\n      }}\n      entering={FadeIn.duration(300)}\n      exiting={FadeOut.duration(300)}\n    >\n      <VideoView\n        player={player}\n        style={{\n          width: '100%',\n          height: '100%',\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n        }}\n        contentFit=\"cover\"\n        nativeControls={false}\n      />\n    </Reanimated.View>\n  );\n};\n\nexport default WrappedView;"
  },
  {
    "path": "app/(modals)/wrapped/stories/consent.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport { useTheme } from '@react-navigation/native';\nimport { LiquidGlassView } from '@sbaiahmed1/react-native-blur';\nimport React, { memo, useCallback, useState } from 'react';\nimport { Dimensions, FlatList, StyleSheet, Switch, View } from 'react-native';\nimport Reanimated, { FadeInDown, FadeOut, FadeOutUp } from 'react-native-reanimated';\n\nimport Stack from '@/ui/components/Stack';\nimport Typography from \"@/ui/components/Typography\";\nimport adjust from '@/utils/adjustColor';\nimport NativeSwitch from '@/ui/native/NativeSwitch';\n\ntype ConsentItem = {\n  title: string;\n  icon: string;\n  enabled: boolean;\n};\n\nconst ConsentButton = memo(({\n  item,\n  index,\n  borderColor,\n  onToggle\n}: {\n  item: ConsentItem;\n  index: number;\n  borderColor: string;\n  onToggle: (index: number) => void;\n}) => (\n  <Reanimated.View\n    entering={FadeInDown.springify().duration(400).delay(index * 100 + 500)}\n    exiting={FadeOutUp.springify().duration(400).delay(index * 100 + 500)}\n  >\n    <LiquidGlassView\n      glassTintColor='white'\n      glassOpacity={0.2}\n      glassType='clear'\n      isInteractive\n      style={{\n        justifyContent: \"space-between\",\n        borderRadius: 20,\n        borderCurve: \"circular\",\n        borderWidth: 1,\n        borderColor,\n        width: 300\n      }}>\n      <Stack\n        direction='horizontal'\n        padding={15}\n      >\n        <Stack direction='horizontal' style={{ alignItems: \"center\", flex: 1 }} gap={10}>\n          <Papicons name={item.icon} color={ICON_COLOR} />\n          <Typography variant='title' color={ICON_COLOR}>{item.title}</Typography>\n        </Stack>\n        <NativeSwitch value={item.enabled} onValueChange={() => onToggle(index)} trackColor={TRACK_COLOR} />\n      </Stack>\n    </LiquidGlassView>\n  </Reanimated.View>\n));\n\nConsentButton.displayName = 'ConsentButton';\n\nconst INITIAL_ITEMS: ConsentItem[] = [\n  { title: \"Mes notes\", icon: \"Pie\", enabled: true },\n  { title: \"Absences et retards\", icon: \"Chair\", enabled: true },\n  { title: \"Emploi du temps\", icon: \"Calendar\", enabled: true },\n  { title: \"Tâches\", icon: \"Tasks\", enabled: true }\n];\n\nconst ICON_COLOR = '#31424A';\nconst TRACK_COLOR = { true: \"#C50000\" };\n\nexport const Warning = ({ isCurrent }: { isCurrent: boolean, sliderRef: React.RefObject<FlatList> }) => {\n  const { colors } = useTheme();\n  const [consentItems, setConsentItems] = useState(INITIAL_ITEMS);\n\n  const toggleConsent = useCallback((index: number) => {\n    setConsentItems(prev => prev.map((item, i) =>\n      i === index ? { ...item, enabled: !item.enabled } : item\n    ));\n  }, []);\n\n  const renderItem = useCallback(({ item, index }: { item: ConsentItem; index: number }) => (\n    <ConsentButton item={item} index={index} borderColor={colors.border} onToggle={toggleConsent} />\n  ), [colors.border, toggleConsent]);\n\n  return (\n    <View style={{ width: \"100%\", height: Dimensions.get('screen').height, justifyContent: 'center', alignItems: 'center' }}>\n      {isCurrent && (\n        <View\n          style={{\n            flex: 1,\n            alignItems: \"center\",\n            alignContent: \"center\",\n            justifyContent: \"center\"\n          }}>\n          <Reanimated.View\n            entering={FadeInDown.springify().dampingRatio(0.5).duration(1800).delay(200)}\n            exiting={FadeOut.duration(800)}\n          >\n            <Typography variant=\"h4\" align='center' color={adjust(colors.background, 0.1)} style={styles.title}>\n              Ton Yearbook contient un récap de toutes tes statistiques liées à ta vie d&apos;étudiant, choisis ce que tu souhaites afficher avant de commencer :\n            </Typography>\n            <FlatList\n              data={consentItems}\n              renderItem={renderItem}\n              removeClippedSubviews\n              style={styles.listContent}\n            />\n          </Reanimated.View>\n        </View>\n      )}\n    </View>\n  );\n};\n\nexport const Cooking = ({ isCurrent }: { isCurrent: boolean, sliderRef: React.RefObject<FlatList> }) => {\n  const { colors } = useTheme();\n\n  return (\n    <View style={{ width: \"100%\", height: Dimensions.get('screen').height, justifyContent: 'center', alignItems: 'center' }}>\n      {isCurrent && (\n        <Reanimated.View\n          entering={FadeInDown.springify().dampingRatio(0.5).duration(1800).delay(200)}\n          exiting={FadeOut.duration(800)}\n        >\n          <Typography variant=\"h4\" align='center' color='white' style={styles.title}>\n            Ton Yearbook contient un récap de toutes tes statistiques liées à ta vie d&apos;étudiant, choisis ce que tu souhaites afficher avant de commencer :\n          </Typography>\n        </Reanimated.View>\n      )}\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  title: {\n    width: 350,\n    marginBottom: 40\n  },\n  listContent: {\n    gap: 20,\n    alignItems: \"center\"\n  }\n})"
  },
  {
    "path": "app/(modals)/wrapped/stories/welcome.tsx",
    "content": "import Stack from '@/ui/components/Stack';\nimport Typography from '@/ui/components/Typography';\nimport { Papicons } from '@getpapillon/papicons';\nimport React from 'react';\nimport { Dimensions, FlatList, View } from 'react-native';\nimport Reanimated, { FadeOut, ZoomIn } from 'react-native-reanimated';\n\n\nexport const Welcome = ({ isCurrent }: { isCurrent: boolean, sliderRef: React.RefObject<FlatList> }) => {\n  return (\n    <View style={{ width: \"100%\", height: Dimensions.get('screen').height, justifyContent: 'center', alignItems: 'center' }}>\n      {isCurrent && (\n        <>\n          <Reanimated.Image\n            entering={ZoomIn.delay(100).springify().duration(800).dampingRatio(0.5)}\n            exiting={FadeOut.duration(300)}\n            // eslint-disable-next-line @typescript-eslint/no-require-imports\n            source={require('@/assets/images/monYearbook.png')}\n            style={{\n              height: 180,\n              width: 280,\n              overflow: 'visible',\n              shadowColor: '#000',\n              shadowOffset: {\n                width: 0,\n                height: 2,\n              },\n              shadowOpacity: 0.2,\n              shadowRadius: 10,\n            }}\n            resizeMode=\"contain\"\n          />\n\n          <Reanimated.View\n            entering={ZoomIn.delay(400).springify().duration(800).dampingRatio(0.5)}\n            exiting={FadeOut.duration(300)}\n            style={{\n              position: \"absolute\",\n              bottom: 70\n            }}\n          >\n            <Stack direction='horizontal' hAlign='center' gap={5}>\n              <Papicons name='ArrowUp' color='white' />\n              <Typography variant='h4' color='white'>Swipe pour le révéler</Typography>\n            </Stack>\n          </Reanimated.View>\n        </>\n      )}\n    </View>\n  );\n};"
  },
  {
    "path": "app/(new)/_layout.tsx",
    "content": "import { Stack } from \"expo-router\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\n\nexport default function Layout() {\n  const { t } = useTranslation();\n\n  const newScreenOptions = React.useMemo(() => ({\n    ...screenOptions,\n    headerShown: true,\n    headerLargeTitle: false\n  }), []);\n\n  return (\n    <Stack screenOptions={newScreenOptions}>\n      <Stack.Screen\n        name=\"event\"\n        options={{\n          headerTitle: t(\"Tab_New_Event\"),\n        }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(new)/event.tsx",
    "content": "import DateTimePicker, { DateTimePickerAndroid } from '@react-native-community/datetimepicker';\nimport { useTheme } from \"@react-navigation/native\";\nimport * as Localization from \"expo-localization\";\nimport { useRouter } from \"expo-router\";\nimport { CalendarDays, Check, Clock4Icon, MapPinIcon, TypeIcon, User2Icon, X } from \"lucide-react-native\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport React, { Platform, Pressable, ScrollView, StyleSheet, TextInput } from \"react-native\";\n\nimport { useDatabase } from \"@/database/DatabaseProvider\";\nimport Icon from \"@/ui/components/Icon\";\nimport Item, { Trailing } from \"@/ui/components/Item\";\nimport List from \"@/ui/components/List\";\nimport { NativeHeaderPressable, NativeHeaderSide } from \"@/ui/components/NativeHeader\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\n\nexport default function NewEventScreen() {\n  const router = useRouter();\n  const { colors } = useTheme();\n  const { t } = useTranslation();\n  const database = useDatabase();\n\n  const [canSave, setCanSave] = useState(false);\n\n  const [inputTitle, setInputTitle] = useState(\"\");\n  const [inputLocation, setInputLocation] = useState(\"\");\n\n  const [inputOrganizer, setInputOrganizer] = useState(\"\");\n\n  const [inputStartDate, setInputStartDate] = useState(new Date());\n\n  const inHour = new Date();\n  inHour.setHours(new Date().getHours() + 1, 0, 0, 0); // Set to one hour later\n\n  const [inputEndDate, setInputEndDate] = useState(inHour);\n\n  const checkCanSave = () => {\n    const titleValid = inputTitle.length > 0;\n    const locationValid = inputLocation.length > 0;\n    const organizerValid = inputOrganizer.length > 0;\n\n    const startDateValid = inputStartDate instanceof Date && !isNaN(inputStartDate.getTime());\n    const endDateValid = inputEndDate instanceof Date && !isNaN(inputEndDate.getTime());\n\n    const endDateAfterStartDate = inputEndDate.getTime() > inputStartDate.getTime();\n\n    setCanSave(titleValid && locationValid && organizerValid && startDateValid && endDateValid && endDateAfterStartDate);\n  };\n\n  useEffect(() => {\n    checkCanSave();\n  }, [inputTitle, inputLocation, inputOrganizer, inputStartDate, inputEndDate]);\n\n\n  // Helper to create an event without linking to subject\n  async function createEvent(eventData: {\n    title: string;\n    start: number;\n    end: number;\n    color?: string;\n    room?: string;\n    teacher?: string;\n    status?: string;\n    canceled?: boolean;\n  }) {\n    await database.write(async () => {\n      await database.get<Event>('events').create((ev: Event) => {\n        ev.title = eventData.title;\n        ev.start = eventData.start;\n        ev.end = eventData.end;\n        if (eventData.color) {ev.color = eventData.color;}\n        if (eventData.room) {ev.room = eventData.room;}\n        if (eventData.teacher) {ev.teacher = eventData.teacher;}\n        if (eventData.status) {ev.status = eventData.status;}\n        if (typeof eventData.canceled === 'boolean') {ev.canceled = eventData.canceled;}\n      });\n    });\n  }\n\n  const saveEvent = useCallback(async () => {\n    if (!canSave) {return;}\n\n    // Create event data\n    const eventData = {\n      title: inputTitle,\n      start: inputStartDate.getTime(),\n      end: inputEndDate.getTime(),\n      color: \"#888888\", // Default color, can be changed later\n      room: inputLocation,\n      teacher: inputOrganizer,\n      status: null, // Default status\n      canceled: false // Default not canceled\n    };\n\n    createEvent(eventData)\n      .then(() => {\n        router.back();\n      })\n      .catch((error) => {\n        console.error(\"Error creating event:\", error);\n        alert(t(\"Error_CreatingEvent\"));\n      });\n  }, [canSave, inputTitle, inputLocation, inputOrganizer, inputStartDate, inputEndDate, router, t, database]);\n\n  return (\n    <>\n      <NativeHeaderSide side=\"Left\">\n        <NativeHeaderPressable onPress={() => { router.back() }}>\n          <Icon>\n            <X />\n          </Icon>\n        </NativeHeaderPressable>\n      </NativeHeaderSide>\n\n      <NativeHeaderSide\n        side=\"Right\"\n        // @ts-expect-error TypeScript doesn't recognize the `key` prop on NativeHeaderSide\n        key={\"saveIcon_save=\" + canSave + inputTitle + inputLocation + inputOrganizer + inputStartDate.getTime() + inputEndDate.getTime()}\n      >\n        <NativeHeaderPressable disabled={!canSave} onPress={() => { saveEvent() }}>\n          <Check style={{ opacity: canSave ? 1 : 0.5 }} color={canSave ? colors.primary : colors.text} />\n        </NativeHeaderPressable>\n      </NativeHeaderSide>\n\n      <ScrollView\n        contentInsetAdjustmentBehavior=\"automatic\"\n        contentContainerStyle={styles.containerContent}\n        style={styles.container}\n      >\n        <List>\n          <Item>\n            <Icon>\n              <TypeIcon opacity={inputTitle.length > 0 ? 1 : 0.5} />\n            </Icon>\n            <TextInput\n              placeholder={t(\"Form_Title\")}\n              value={inputTitle}\n              onChangeText={setInputTitle}\n              style={{ flex: 1, paddingVertical: 8, fontSize: 16, fontFamily: \"medium\" }}\n            />\n          </Item>\n          <Item>\n            <Icon>\n              <MapPinIcon opacity={inputLocation.length > 0 ? 1 : 0.5} />\n            </Icon>\n            <TextInput\n              placeholder={t(\"Form_Location\")}\n              value={inputLocation}\n              onChangeText={setInputLocation}\n              style={{ flex: 1, paddingVertical: 8, fontSize: 16, fontFamily: \"medium\" }}\n            />\n          </Item>\n        </List>\n\n        <List>\n          <Item>\n            <Icon>\n              <User2Icon opacity={inputOrganizer.length > 0 ? 1 : 0.5} />\n            </Icon>\n            <TextInput\n              placeholder={t(\"Form_Organizer\")}\n              autoCorrect={false}\n              autoComplete={\"off\"}\n              value={inputOrganizer}\n              onChangeText={text => {\n                setInputOrganizer(text);\n              }}\n              style={{ flex: 1, paddingVertical: 8, fontSize: 16, fontFamily: \"medium\" }}\n            />\n          </Item>\n        </List>\n\n        <List>\n          <Item>\n            <Icon>\n              <CalendarDays />\n            </Icon>\n            <Typography variant=\"body1\" style={{ flex: 1, paddingVertical: 6 }}>\n              {t(\"Form_Start\")}\n            </Typography>\n            <Trailing>\n              {Platform.OS === \"ios\" ? (\n                <DateTimePicker\n                  value={inputStartDate}\n                  mode=\"datetime\"\n                  accentColor={colors.primary}\n                  locale={Localization.getLocales()[0].languageTag}\n                  display=\"compact\"\n                  onChange={(event, date) => {\n                    if (date) {\n                      // When changing the start date, update the date part of end date to match, but keep the time part\n                      setInputStartDate(date);\n                      setInputEndDate(prevEnd => {\n                        const newEnd = new Date(date);\n                        newEnd.setHours(prevEnd.getHours(), prevEnd.getMinutes(), 0, 0);\n                        // If new end is before or equal to new start, add 1 hour\n                        if (newEnd.getTime() <= date.getTime()) {\n                          newEnd.setTime(date.getTime() + 60 * 60 * 1000);\n                        }\n                        return newEnd;\n                      });\n                    }\n                  }}\n                />\n              ) : (\n                <Stack direction=\"horizontal\" gap={8}>\n                  <Pressable\n                    onPress={() => {\n                      DateTimePickerAndroid.open({\n                        value: inputStartDate,\n                        mode: \"date\",\n                        design: \"material\",\n                        locale: Localization.getLocales()[0].languageTag,\n                        onChange: (event, date) => {\n                          if (date) {\n                            setInputStartDate(date);\n                          }\n                        }\n                      });\n                    }}\n                  >\n                    <Typography variant=\"h5\" color=\"primary\">\n                      {inputStartDate.toLocaleDateString(Localization.getLocales()[0].languageTag, {\n                        day: \"2-digit\",\n                        month: \"short\",\n                        year: \"numeric\"\n                      })}{\" \"}\n                    </Typography>\n                  </Pressable>\n\n                  <Pressable\n                    onPress={() => {\n                      DateTimePickerAndroid.open({\n                        value: inputStartDate,\n                        mode: \"time\",\n                        design: \"material\",\n                        locale: Localization.getLocales()[0].languageTag,\n                        onChange: (event, date) => {\n                          if (date) {\n                            setInputStartDate(date);\n                          }\n                        }\n                      });\n                    }}\n                  >\n                    <Typography variant=\"h5\" color=\"primary\">\n                      {inputStartDate.toLocaleTimeString(Localization.getLocales()[0].languageTag, {\n                        hour: \"2-digit\",\n                        minute: \"2-digit\"\n                      })}{\" \"}\n                    </Typography>\n                  </Pressable>\n                </Stack>\n              )}\n            </Trailing>\n          </Item>\n          <Item>\n            <Icon>\n              <Clock4Icon />\n            </Icon>\n            <Typography variant=\"body1\" style={{ flex: 1, paddingVertical: 6 }}>\n              {t(\"Form_End\")}\n            </Typography>\n            <Trailing>\n              {Platform.OS === \"ios\" ? (\n                <DateTimePicker\n                  value={inputEndDate}\n                  mode=\"time\"\n                  accentColor={colors.primary}\n                  locale={Localization.getLocales()[0].languageTag}\n                  display=\"compact\"\n                  onChange={(event, date) => {\n                    if (date) {\n                      // Only update the time part of end date, keep the date part\n                      setInputEndDate(prevEnd => {\n                        const newEnd = new Date(prevEnd);\n                        newEnd.setHours(date.getHours(), date.getMinutes(), 0, 0);\n                        // If new end is before or equal to start, move to next day\n                        if (newEnd.getTime() <= inputStartDate.getTime()) {\n                          newEnd.setDate(newEnd.getDate() + 1);\n                        }\n                        return newEnd;\n                      });\n                    }\n                  }}\n                />\n              ) : (\n                <Stack direction=\"horizontal\" gap={8}>\n                  <Pressable\n                    onPress={() => {\n                      DateTimePickerAndroid.open({\n                        value: inputEndDate,\n                        mode: \"time\",\n                        design: \"material\",\n                        locale: Localization.getLocales()[0].languageTag,\n                        onChange: (event, date) => {\n                          if (date) {\n                            setInputEndDate(date);\n                          }\n                        }\n                      });\n                    }}\n                  >\n                    <Typography variant=\"h5\" color=\"primary\">\n                      {inputEndDate.toLocaleTimeString(Localization.getLocales()[0].languageTag, {\n                        hour: \"2-digit\",\n                        minute: \"2-digit\"\n                      })}{\" \"}\n                    </Typography>\n                  </Pressable>\n                </Stack>\n              )}\n            </Trailing>\n          </Item>\n        </List>\n      </ScrollView>\n    </>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    padding: 16\n  },\n  containerContent: {\n    justifyContent: \"center\",\n    alignItems: \"center\",\n  }\n});\n"
  },
  {
    "path": "app/(onboarding)/_layout.tsx",
    "content": "import React from 'react';\nimport { Platform, StatusBar, View } from 'react-native';\nimport { Stack } from \"expo-router\";\n\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport AndroidHeaderBackground, { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';\nimport { t } from 'i18next';\n\nexport default function OnboardingLayout() {\n  const newScreenOptions = React.useMemo(() => ({\n    ...screenOptions,\n    headerShown: true,\n    ...AndroidHeaderProps,\n    headerTransparent: true,\n    headerBackButtonDisplayMode: \"minimal\",\n    headerLargeTitle: false,\n  }), []);\n\n  return (\n    <View style={{ flex: 1, backgroundColor: Platform.OS === \"ios\" ? \"black\" : undefined }}>\n      <Stack>\n        <Stack.Screen\n          name=\"welcome\"\n          options={{ ...newScreenOptions, title: \"\", headerLeft: () => null, headerShown: false, headerBackground: null }}\n        />\n        <Stack.Screen\n          name=\"ageSelection\"\n          options={{ ...newScreenOptions, title: t(\"ONBOARDING_HEADER_ABOUTYOU\") }}\n        />\n        <Stack.Screen\n          name=\"serviceSelection\"\n          options={{ ...newScreenOptions, title: t(\"ONBOARDING_HEADER_SCHOOLSERVICE\") }}\n        />\n        <Stack.Screen\n          name=\"restaurants\"\n          options={{ headerShown: false, title: t(\"ONBOARDING_RESTAURANTS\") }}\n        />\n\n        <Stack.Screen\n          name=\"services/pronote\"\n          options={{ headerShown: false, title: \"\", presentation: \"modal\" }}\n        />\n        <Stack.Screen\n          name=\"services/ed\"\n          options={{ headerShown: false, title: \"\", presentation: \"modal\" }}\n        />\n        <Stack.Screen\n          name=\"services/skolengo\"\n          options={{ headerShown: false, title: \"\", presentation: \"modal\" }}\n        />\n        <Stack.Screen\n          name=\"services/lannion\"\n          options={{ headerShown: false, title: \"\", presentation: \"modal\" }}\n        />\n        <Stack.Screen\n          name=\"services/multi\"\n          options={{ headerShown: false, title: \"\", presentation: \"modal\" }}\n        />\n      </Stack>\n    </View>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/ageSelection.tsx",
    "content": "import { useHeaderHeight } from \"@react-navigation/elements\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { useNavigation } from \"expo-router\";\nimport React, { useState } from \"react\";\nimport { FlatList, StatusBar, View } from \"react-native\";\nimport { useTranslation } from \"react-i18next\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport Stack from \"@/ui/components/Stack\";\nimport Button from \"@/ui/new/Button\";\nimport Divider from \"@/ui/new/Divider\";\nimport Typography from \"@/ui/new/Typography\";\n\nimport HighSchoolIllustration from \"./components/ageSelection/illustrations/highSchool\";\nimport MiddleSchoolIllustration from \"./components/ageSelection/illustrations/middleSchool\";\nimport ParentsIllustration from \"./components/ageSelection/illustrations/parents\";\nimport SupSchoolIllustration from \"./components/ageSelection/illustrations/supSchool\";\nimport TeacherIllustration from \"./components/ageSelection/illustrations/teacher\";\nimport OnboardingSelector from \"./components/OnboardingSelector\";\n\nconst LEVELS = [\n  {\n    key: \"middle-school\",\n    labelKey: \"ONBOARDING_LEVEL_MIDDLE_SCHOOL\",\n    color: \"#008CFF\",\n    icon: MiddleSchoolIllustration,\n    type: \"school\"\n  },\n  {\n    key: \"high-school\",\n    labelKey: \"ONBOARDING_LEVEL_HIGH_SCHOOL\",\n    color: \"#FFC800\",\n    icon: HighSchoolIllustration,\n    type: \"school\"\n  },\n  {\n    key: \"sup-school\",\n    labelKey: \"ONBOARDING_LEVEL_UNIVERSITY\",\n    color: \"#68F000\",\n    icon: SupSchoolIllustration,\n    type: \"univ\"\n  },\n  {\n    type: 'separator'\n  },\n  {\n    key: \"parents\",\n    labelKey: \"ONBOARDING_LEVEL_PARENT\",\n    color: \"#ff4d4d\",\n    icon: ParentsIllustration,\n    type: \"parents\"\n  },\n  {\n    key: \"teacher\",\n    labelKey: \"ONBOARDING_LEVEL_TEACHER\",\n    color: \"#FF0084\",\n    icon: TeacherIllustration,\n    type: \"teacher\"\n  }\n]\n\nexport default function AgeSelection() {\n  const headerHeight = useHeaderHeight();\n  const theme = useTheme();\n  const { colors } = theme;\n  const insets = useSafeAreaInsets();\n  const navigation = useNavigation();\n  const { t } = useTranslation();\n\n  const [selectedLevel, setSelectedLevel] = useState(null);\n\n  return (\n    <View style={{ flex: 1 }}>\n      <StatusBar barStyle={theme.dark ? \"light-content\" : \"dark-content\"} translucent />\n          \n      <FlatList\n        ListHeaderComponent={() => (\n          <Stack>\n            <Typography variant=\"h2\">{t(\"ONBOARDING_AGE_TITLE\")}</Typography>\n            <Typography variant=\"action\" color=\"textSecondary\">{t(\"ONBOARDING_AGE_DESCRIPTION\")}</Typography>\n            <Divider height={6} ghost />\n          </Stack>\n        )}\n        data={LEVELS.map((level) => (\"labelKey\" in level ? { ...level, label: t(level.labelKey) } : level))}\n        renderItem={({ item }) => <OnboardingSelector item={item} selected={selectedLevel} setSelected={setSelectedLevel} />}\n        contentContainerStyle={{\n          padding: 20,\n          flexGrow: 1,\n          gap: 10,\n          paddingTop: headerHeight + 20\n        }}\n        initialNumToRender={2}\n        maxToRenderPerBatch={2}\n        windowSize={3}\n        style={{ flex: 1 }}\n      />\n\n      <View\n        style={{\n          padding: 20,\n          paddingBottom: insets.bottom + 20,\n          borderTopColor: colors.border,\n          borderTopWidth: 1\n        }}\n      >\n        <Button\n          label={t(\"ONBOARDING_CONTINUE\")}\n          onPress={() => {\n            navigation.navigate(\"serviceSelection\", {\n              type: LEVELS.find((level) => level.key === selectedLevel)?.type\n            })\n          }}\n          disabled={!selectedLevel}\n        />\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/components/LoginView.tsx",
    "content": "import { useTheme } from '@react-navigation/native';\nimport React from 'react';\nimport { Alert, Image, View } from 'react-native';\nimport { useTranslation } from \"react-i18next\";\n\nimport ActivityIndicator from '@/ui/components/ActivityIndicator';\nimport { Dynamic } from '@/ui/components/Dynamic';\nimport Stack from '@/ui/components/Stack';\nimport Button from '@/ui/new/Button';\nimport TextInput from '@/ui/new/TextInput';\nimport Typography from '@/ui/new/Typography';\n\ninterface LoginViewProps {\n  color: string;\n  serviceName: string;\n  serviceIcon: any;\n  loading?: boolean;\n  fields?: {\n    name: string;\n    placeholder: string;\n    secureTextEntry: boolean;\n    textContentType?: \"username\" | \"password\";\n    keyboardType?: \"default\" | \"number-pad\" | \"decimal-pad\" | \"email-address\" | \"phone-pad\" | \"url\" | \"numeric\";\n  }[];\n  actions?: {\n    label: string;\n    variant?: \"primary\" | \"secondary\" | \"outlined\" | \"ghost\" | \"text\";\n    submit?: boolean;\n    onPress?: () => void;\n  }[];\n  onSubmit?: (fieldValues: { [key: string]: string }) => void;\n}\n\nexport default function LoginView({\n  color,\n  serviceName,\n  serviceIcon,\n  loading = false,\n  fields,\n  actions,\n  onSubmit,\n}: LoginViewProps) {\n  const { colors } = useTheme();\n  const { t } = useTranslation();\n\n  const [fieldValues, setFieldValues] = React.useState<{ [key: string]: string }>({});\n\n  const defaultFields = fields ?? [\n    {\n      name: \"username\",\n      placeholder: t(\"INPUT_USERNAME\"),\n      secureTextEntry: false,\n      textContentType: \"username\" as const,\n    },\n    {\n      name: \"password\",\n      placeholder: t(\"INPUT_PASSWORD\"),\n      secureTextEntry: true,\n      textContentType: \"password\" as const,\n    }\n  ];\n\n  const defaultActions = actions ?? [\n    {\n      label: t(\"LOGIN_BTN\"),\n      variant: \"primary\" as const,\n      submit: true,\n    },\n    {\n      label: t(\"ONBOARDING_LOGIN_HELP_ACTION\"),\n      variant: \"secondary\" as const,\n      onPress: () => {\n        Alert.alert(t(\"ONBOARDING_LOGIN_HELP_TITLE\"), t(\"ONBOARDING_LOGIN_HELP_DESCRIPTION\"));\n      },\n    }\n  ];\n\n  const handleChange = (name: string, value: string) => {\n    setFieldValues(prev => ({ ...prev, [name]: value }));\n  };\n\n  const handleSubmit = () => {\n    if (onSubmit) {\n      onSubmit(fieldValues);\n    }\n  };\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        padding: 20,\n      }}\n    >\n      <View\n        style={{\n          borderColor: colors.text + \"20\",\n          backgroundColor: !serviceIcon ? (color ?? colors.primary) : colors.card,\n          borderWidth: 1,\n          width: 72,\n          height: 72,\n          borderRadius: 16,\n          marginBottom: 16,\n          shadowColor: 'black',\n          shadowOffset: {\n            width: 0,\n            height: 2,\n          },\n          shadowOpacity: 0.05,\n          shadowRadius: 2,\n          alignItems: 'center',\n          justifyContent: 'center',\n        }}\n      >\n        {serviceIcon && (\n          <Image\n            source={serviceIcon}\n            style={{\n              width: \"100%\",\n              height: \"100%\",\n              borderRadius: 16,\n            }}\n          />\n        )}\n\n        {!serviceIcon && (\n          <Typography variant=\"h1\" color=\"white\">\n            {serviceName[0]}\n          </Typography>\n        )}\n      </View>\n\n      <Typography variant=\"body\" align=\"center\" color=\"textSecondary\">\n        {t(\"ONBOARDING_LOGIN_TO_SERVICE\")}\n      </Typography>\n\n      <Stack animated direction='horizontal' hAlign='center' gap={10}>\n        <Dynamic animated>\n          <Typography variant=\"h3\" align=\"center\">\n            {serviceName || t(\"ONBOARDING_UNKNOWN_SERVICE\")}\n          </Typography>\n        </Dynamic>\n        {loading &&\n          <Dynamic animated>\n            <ActivityIndicator color={color} size={22} strokeWidth={3.5} />\n          </Dynamic>\n        }\n      </Stack>\n\n      <Stack\n        padding={[0, 20]}\n        width={\"100%\"}\n        gap={8}\n      >\n        {defaultFields.map((field, index) => (\n          <TextInput\n            key={index}\n            color={color}\n            placeholder={field.placeholder}\n            secureTextEntry={field.secureTextEntry}\n            onChangeText={(value) => handleChange(field.name, value)}\n            textContentType={field.textContentType ? field.textContentType : undefined}\n            keyboardType={field.keyboardType ? field.keyboardType : 'default'}\n          />\n        ))}\n      </Stack>\n\n      <Stack\n        width={\"100%\"}\n        gap={8}\n      >\n        {defaultActions.map((action, index) => (\n          <Button\n            key={index}\n            color={color}\n            fullWidth\n            label={action.label}\n            variant={action.variant}\n            onPress={action.onPress ? action.onPress : action.submit ? handleSubmit : undefined}\n          />\n        ))}\n      </Stack>\n\n      <Typography variant=\"caption\" align=\"center\" color=\"textSecondary\" style={{ marginVertical: 16, marginBottom: 32 }}>\n        {t(\"ONBOARDING_LOGIN_DISCLAIMER\", { service: serviceName || t(\"ONBOARDING_THIS_SERVICE\") })}\n      </Typography>\n    </View>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/components/OnboardingSelector.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport React from \"react\";\nimport { View } from \"react-native\";\n\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport Divider from \"@/ui/new/Divider\";\nimport Ripple from \"@/ui/new/RippleEffect\";\nimport Typography from \"@/ui/new/Typography\";\nimport { PapillonZoomIn, PapillonZoomOut } from \"@/ui/utils/Transition\";\nimport adjust from \"@/utils/adjustColor\";\nimport { LayoutAnimationConfig } from \"react-native-reanimated\";\n\n\n\nexport default function OnboardingSelector({ item, selected, setSelected }) {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  if (item.type == 'separator') {\n    return <Stack padding={[32, 10]}><Divider height={1.5} /></Stack>\n  }\n\n  const color = adjust(item.color, theme.dark ? -0.5 : 0.3);\n  const dark = adjust(item.color, theme.dark ? 0.4 : -0.4);\n\n  return (\n    <LayoutAnimationConfig skipEntering>\n      <Ripple\n        style={\n          {\n            height: 74,\n            padding: 20,\n            borderRadius: 20,\n            borderCurve: \"continuous\",\n            borderColor: selected == item.key ? dark : theme.dark ? colors.text + \"22\" : colors.text + \"36\",\n            borderWidth: selected == item.key ? 2 : 1,\n            flexDirection: \"row\",\n            justifyContent: \"center\",\n            alignItems: \"center\",\n            overflow: \"hidden\"\n          }\n        }\n        onTap={() => { selected == item.key ? setSelected(null) : setSelected(item.key) }}\n      >\n        {selected == item.key && (\n          <LinearGradient\n            colors={theme.dark ? [color, color + \"44\"] : [color + \"44\", color]}\n            style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0 }}\n          />\n        )}\n\n        <View style={{ flex: 1, flexDirection: \"row\", alignItems: \"center\", gap: 8 }}>\n          {selected == item.key && (\n            <Dynamic animated entering={PapillonZoomIn} exiting={PapillonZoomOut}>\n              <Icon fill={dark}>\n                <Papicons name=\"check\" />\n              </Icon>\n            </Dynamic>\n          )}\n          <Dynamic animated>\n            <Typography numberOfLines={1} variant=\"title\" color={selected == item.key ? dark : \"textSecondary\"}>{item.label}</Typography>\n          </Dynamic>\n        </View>\n\n        <View style={{ flex: 1, alignItems: \"flex-end\", marginBottom: -10 }}>\n          <item.icon color={selected == item.key ? color : \"transparent\"} dark={selected == item.key ? dark : theme.dark ? colors.text + \"22\" : colors.text + \"36\"} />\n        </View>\n      </Ripple>\n    </LayoutAnimationConfig>\n  )\n};"
  },
  {
    "path": "app/(onboarding)/components/OnboardingWebView.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport React from \"react\";\nimport { Platform, View } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport WebView from \"react-native-webview\";\n\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Typography from \"@/ui/new/Typography\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport AndroidBackButton from \"@/utils/theme/AndroidBackButton\";\n\nexport default function OnboardingWebView({ webViewRef, ...props }: React.ComponentProps<typeof WebView>) {\n  const insets = useSafeAreaInsets();\n  const { colors } = useTheme();\n\n  const [currentUrl, setCurrentUrl] = React.useState<string>(props.source.uri || \"\");\n  const [loading, setLoading] = React.useState<boolean>(true);\n  const [loadingProgress, setLoadingProgress] = React.useState<number>(0);\n\n  const extractDomain = (url: string) => {\n    try {\n      if (url.trim().length === 0) { return \"about:blank\"; }\n\n      const { hostname } = new URL(url);\n      return hostname.replace(\"www.\", \"\");\n    } catch (e) {\n      return url;\n    }\n  }\n\n  const finalHeaderHeight = Platform.select({\n    android: insets.top,\n    default: 0\n  });\n\n  return (\n    <View\n      style={{\n        width: \"100%\",\n        height: \"100%\",\n        flex: 1,\n        flexDirection: \"column\",\n      }}\n    >\n      {Platform.OS === 'android' && (<View style={{\n        position: \"absolute\",\n        left: 16,\n        top: finalHeaderHeight + 11,\n        zIndex: 200000,\n      }}>\n        <AndroidBackButton />\n      </View>)}\n\n      <View\n        style={{\n          width: \"100%\",\n          borderBottomWidth: 1,\n          borderBottomColor: colors.border,\n          backgroundColor: colors.card,\n          zIndex: 1,\n          paddingVertical: 16,\n          height: 64 + finalHeaderHeight,\n          justifyContent: \"center\",\n          alignItems: \"center\",\n          flexDirection: \"row\",\n          gap: 12,\n          paddingTop: finalHeaderHeight + 16,\n        }}\n      >\n        <View\n          style={{\n            flexDirection: \"row\",\n            alignItems: \"center\",\n            gap: 8,\n            maxWidth: \"80%\",\n          }}\n        >\n          {currentUrl.startsWith(\"https://\") && (\n            <Dynamic animated>\n              <Papicons size={20} name=\"lock\" color=\"#37BB12\" />\n            </Dynamic>\n          )}\n          <Dynamic animated key={extractDomain(currentUrl)}>\n            <Typography variant=\"title\" numberOfLines={1}>\n              {extractDomain(currentUrl)}\n            </Typography>\n          </Dynamic>\n        </View>\n\n        {loading && (\n          <View\n            style={{\n              height: 3,\n              width: `100%`,\n              zIndex: 10,\n              position: \"absolute\",\n              bottom: 0,\n              left: 0,\n            }}\n          >\n            <View style={{\n              height: \"100%\",\n              width: `${(loadingProgress + 0.05) * 100}%`,\n              backgroundColor: colors.primary,\n              zIndex: 1,\n              borderRadius: 200,\n            }} />\n          </View>\n        )}\n      </View>\n\n      <WebView\n        style={{\n          flex: 1,\n          width: \"100%\",\n          height: \"100%\"\n        }}\n        {...props}\n        onNavigationStateChange={(navState) => {\n          setCurrentUrl(navState.url);\n          if (props.onNavigationStateChange) {\n            props.onNavigationStateChange(navState);\n          }\n        }}\n        onLoadStart={(args) => {\n          setLoading(true);\n          if (props.onLoadStart) {\n            props.onLoadStart(args);\n          }\n        }}\n        onLoadEnd={(args) => {\n          setLoading(false);\n          if (props.onLoadEnd) {\n            props.onLoadEnd(args);\n          }\n        }}\n        onLoadProgress={(args) => {\n          setLoadingProgress(args.nativeEvent.progress);\n          if (props.onLoadProgress) {\n            props.onLoadProgress(args);\n          }\n        }}\n        ref={webViewRef}\n      />\n    </View>\n  )\n}"
  },
  {
    "path": "app/(onboarding)/components/ageSelection/illustrations/highSchool.tsx",
    "content": "import * as React from \"react\";\nimport type { SvgProps } from \"react-native-svg\";\nimport Svg, { Path } from \"react-native-svg\";\nconst HighSchoolIllustration = (props: SvgProps) => (\n  <Svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={100}\n    height={67}\n    fill=\"none\"\n    {...props}\n  >\n    <Path\n      fill={props.color}\n      d=\"m13.045 22.111 36.45-21.086 47.076 6.32-1.636 9.34-8.942 5.367-.381 9.576 11.413-.72-4.925 12.2 4.633 1.584c-3.614 3.524-2.78 7.618-2.252 11.672L62.71 77.284l-46.991-3.339c-6.38-4.337-2.223-6.503-3.019-9.69l-5.697-4.782c-8.142-2.38-3.119-4.882-3.742-7.332l10.255-5.733 4.746-13.08s-12.393-.792-5.216-11.217\"\n    />\n    <Path\n      fill={props.dark}\n      d=\"M54.787 78.209c-8.89-.345-15.709-.878-33.424-2.612-6.668-.653-6.644-.649-7.982-1.513-2.064-1.334-2.964-2.903-3.047-5.316-.057-1.64.276-2.508 1.362-3.55l1.003-.963-1.935-.015a227 227 0 0 0-2.715-.007c-.683.006-.863-.123-1.43-1.026-.48-.766-.627-1.268-.566-1.939.07-.783.014-.91-.418-.938-.274-.017-.613.07-.753.193-.175.155-.576.13-1.29-.08-2.63-.773-3.797-2.587-3.563-5.542.341-4.335 3.477-4.666 5.815-5.98.767-.45 2.001-1.09 2.742-1.42.74-.332 1.886-.92 2.544-1.307 2.212-1.3 2.075-1.124 1.908-2.45-.366-2.893-.245-4.299.512-5.974.885-1.96 1.291-2.52 2.08-2.875l.619-.278-.679-.206c-2.208-.674-2.926-1.11-4.23-2.572-1.636-1.834-1.999-2.962-1.432-4.453 1.16-4.944 5.284-7.346 9.058-9.812 2.425-1.596 5.724-3.556 5.96-3.54.146.009 3.726-2.248 3.976-2.507.068-.07.364-.243.659-.384 1.283-.613 1.604-.78 1.884-.98.325-.233.636-.424 4.556-2.79 1.47-.888 2.979-1.774 3.354-1.97.808-.42 1.24-.666 2.746-1.558.623-.368 2.023-1.096 3.112-1.617 1.09-.521 2.514-1.266 3.165-1.655.908-.543 1.32-.663 1.763-.514.573.192 1.505.263 4.372.33.824.02 2.164.144 2.98.277 3.975.645 7.964 1.07 17.864 1.898 3.722.311 7.229.636 7.794.721 3.246.49 10.909 1.207 11.575 1.083.128-.024.41.049.628.161.217.113.678.169 1.024.125.747-.094 2.186.695 2.395 1.314.725 2.914-2.202 1.377-3.172 6.875l-.107 1.19.764.093c1.151.14 1.297.45.764 1.623-.456 1.005-2.552 3.126-2.982 3.019-.125-.031-.875.37-1.666.89-.792.52-1.496.942-1.565.938-.07-.004-.837.442-1.707.992-1.325.838-1.556 1.076-1.43 1.473.225.7.225.7-.558 1.494-.755.764-1.368 2.619-1.23 3.72.038.31.405 1.011.814 1.56.653.875.781.954 1.04.643.212-.257.925-.37 2.594-.416 1.265-.034 2.666-.098 3.113-.142a92 92 0 0 1 2.768-.192c1.465-.8 4.805-.085 3.484 1.774-.29.39-.529.469-1.05.352-.51-.115-.743-.044-.949.29-.471.765-.396 1.737.182 2.358.756.812.665 1.818-.193 2.13-1.642.596-3.816 2.12-3.424 2.4.317.227.169 1.367-.24 1.844-.517.602-.553 1.632-.065 1.805 5.913.688 5.97 2.74 2.998 4.405-1.574.882-1.89 1.492-2.075 4.008-.151 2.063.116 3.63.625 3.662.48.031.904.759.867 1.483-.025.487-.254.727-1.104 1.157-4.798 2.512-9.713 6.508-13.585 8.76-1.718.999-2.29 1.36-4.638 2.923-2.328 1.982-5.142 3.487-7.387 5.184-.649.494-1.925 1.424-2.836 2.066-.91.643-2.175 1.63-2.81 2.196-2.232 1.185-6.518-.207-9.226-.316m-17.44-3.777c.008-.127-.14-.241-.33-.253-.189-.012-.35.081-.359.209-.008.127.14.24.33.253.19.012.351-.082.36-.21m6.517.424c-.206-.225-1.803-.427-4.275-.54-2.725-.126-1.494.291 1.548.524 1.604.123 2.831.13 2.727.016m16.047 1c.74.09.739.094.314-.972-.312-.784-.4-.836-1.721-1.031-.766-.113-1.6-.209-1.853-.212-.254-.003-2.264-.2-4.469-.439-8.308-.898-13.324-1.28-21.11-1.605-2.34-.097-4.41-.185-4.6-.194s-.862-.036-1.495-.059c-.632-.022-2.368-.12-3.857-.216-1.9-.123-2.687-.096-2.638.09.038.145.576.315 1.196.377 1.833.183 13.512.936 20.073 1.293 5.274.287 11.625.933 11.889 1.21.046.048-.054.236-.224.417-.247.263-.895.287-3.242.12-3.006-.213-3.913-.147-3.94.288-.012.175 2.195.337 7.516.551 4.142.167 7.815.339 8.16.381zm-43.19-3.404c.007-.102-.364-.386-.824-.63-.884-.468-1.724-1.724-1.863-2.784-.046-.35.044-1.07.2-1.603.327-1.117.188-1.21-.642-.428-.802.756-.977 2.935-.318 3.955.61.943 3.405 2.152 3.448 1.49m47.639 2.154c.202-.213-.048-.292-1.148-.363-.773-.05-1.41-.02-1.416.068-.005.086.197.41.45.717.445.543.479.55 1.157.206.384-.195.814-.477.957-.627m2.373-1.776a51 51 0 0 1 2.07-1.462c3.12-2.238 6.262-4.453 9.297-6.327 3.04-1.836 8.012-5.15 10.459-6.974.639-.476 1.912-1.23 3.424-2.03 1.593-.843 1.595-.845 1.33-1.457-.338-.785-.576-2.488-.509-3.65.032-.54-.047-.989-.174-.997s-.883.53-1.682 1.198-1.858 1.448-2.357 1.735c-.498.287-1.234.786-1.635 1.109s-1.237.838-1.858 1.145c-.62.306-1.446.815-1.834 1.13-2.123 1.199-3.997 2.337-5.909 3.653-2.159 1.558-4.694 2.98-6.61 4.243-.729.48-1.974 1.43-2.768 2.113-.794.682-1.484 1.238-1.533 1.235-.05-.004-.507.289-1.016.649s-1.319.763-1.8.895c-.757.209-.94.401-1.385 1.449-.77 1.819-.735 1.969.519 2.234.594.125 1.489.334 1.988.464s.958.249 1.02.263.496-.264.963-.618m-6.725-2.156c.292-.747.747-1.563 1.01-1.814l.48-.457-1.843-.11c-1.587-.094-1.913-.184-2.345-.648-.451-.484-.55-.508-.969-.229-.652.433-1.572.334-2.207-.238-.51-.46-1.035-.521-9.93-1.16-5.165-.37-12.829-.87-17.03-1.11-4.203-.24-7.717-.454-7.81-.475s-.51-.047-.926-.06c-.695-.019-.737.02-.528.483.165.364.154.569-.039.74-.147.13-.272.32-.279.422-.006.103 6.68.614 14.858 1.136 14.346.915 20.657 1.429 20.895 1.7.371.425-.913.5-5.633.33-2.91-.105-5.759-.181-6.33-.171-3.347.06-6.41-.05-15.076-.55-5.312-.305-9.788-.485-9.947-.4a.68.68 0 0 0-.312.506c-.02.31.787.386 6.818.642 9.073.386 24.07 1.358 27.498 1.783 1.51.186 3.774.483 5.031.659s2.69.333 3.184.349c.89.029.904.015 1.43-1.329m-6.044-1.53c.09-.196.264-.35.387-.342.302.02.08.532-.271.625-.171.046-.216-.063-.116-.283M15.868 65.17l1.026-.855-1.11-.077c-.789-.055-1.086.008-1.029.217.044.163-.019.576-.138.919-.304.865.037.81 1.251-.204m45.6.72c.732-.041 1.336-.169 1.344-.284.007-.114.266-.127.575-.027.457.147.76.004 1.627-.76 1.207-1.067 3.032-2.421 4.275-3.172.462-.279.95-.62 1.086-.76.213-.216.867-.627 3.813-2.391.28-.168 1.16-.743 1.955-1.279a51 51 0 0 1 2.88-1.782c1.377-1.061 3.157-1.737 4.438-2.71a19 19 0 0 1 1.565-1.036c.527-.312 1.45-.961 2.052-1.442.601-.482 2.534-1.888 4.294-3.126 1.761-1.238 3.128-2.327 3.037-2.42s-.684-.26-1.318-.373c-1.047-.185-1.242-.142-2.12.471-1.585 1.105-3.025 2.147-3.366 2.434-.176.148-.404.264-.508.258-.263-.014-4.02 2.493-4.131 2.758-.05.119-.185.21-.3.203-.114-.008-.687.294-1.274.671-.586.377-1.467.92-1.957 1.207s-1.208.785-1.595 1.106-.741.56-.786.53-.863.469-1.818 1.109-2.067 1.373-2.47 1.63-.798.543-.878.639-.685.498-1.344.897c-.66.398-1.964 1.33-2.9 2.073-.934.741-2.2 1.656-2.814 2.032l-3.302 2.02c-2.381 1.453-2.834 1.847-1.95 1.694.308-.053 1.158-.13 1.89-.17m-3.711-1.566c.556-.327 1.07-.676 1.14-.775.07-.1-.346-.277-.924-.395-1.772-.362-1.901-.337-1.943.366-.059 1.004.142 1.703.444 1.542.15-.079.726-.411 1.283-.738M20.48 62.29c4.298.222 13.532.76 20.52 1.194l12.705.79-.097-.488a4 4 0 0 1-.084-.755c.01-.2-3.735-.482-14.977-1.126-23.797-1.364-29.07-1.602-29.267-1.323-.066.095-.012.461.122.814.238.632.266.64 1.753.566.832-.041 5.028.106 9.325.328m40.008.274c.181-.193.545-.42.81-.503.675-.213 4.216-2.705 4.234-2.98a.23.23 0 0 1 .247-.21c.188.012 5.26-3.571 8.287-5.854.378-.285 1.73-1.153 3.005-1.929a113 113 0 0 0 3.734-2.372c1.458-.99 2.028-1.346 5.313-3.329 2.639-1.592 3.555-2.262 4.47-3.267 1.14-1.255.844-1.5-.6-.497-.688.479-1.32.866-1.405.86-.085-.005-.445.259-.8.586-.356.328-.918.75-1.25.939-.775.439-6.201 4.167-6.72 4.617-.428.37-.935.715-3.507 2.386-.926.602-1.74 1.157-1.808 1.233s-.881.635-1.808 1.24c-.926.606-2.355 1.576-3.175 2.157-.82.58-1.598 1.049-1.727 1.04-.13-.008-.326.115-.438.274-.111.158-.58.513-1.041.789-2.159 1.289-6.751 4.63-6.77 4.926-.022.338.597.27.949-.106M14.63 58.208c1.584.03 2.982.063 3.108.075 1.866.178 3.51.266 4.826.258.888-.006 8.505.403 16.928.908s15.366.87 15.43.81.075-.529.024-1.042c-.11-1.1.49-.95-6.157-1.545-6.332-.567-41.896-3.006-42.987-2.948-1.133.009-2.494 2.3-1.141 2.529.162.01.35.193.415.406.107.344.485.394 3.398.442 1.803.03 4.573.078 6.156.107m44.42 1.795c.325-.266.856-.637 1.18-.824.325-.187 1.785-1.17 3.244-2.184 4.072-2.83 4.258-2.956 4.92-3.345.677-.397 2.222-1.448 6.07-4.133 1.38-.964 2.782-1.94 3.113-2.17.332-.231 1.108-.781 1.725-1.223.618-.442 1.743-1.233 2.5-1.759.758-.525 1.841-1.29 2.407-1.7 2.589-1.875 3.119-2.24 3.36-2.313.321-.098 2.444-1.607 4.37-3.108.802-.624 1.69-1.311 1.977-1.527.323-.245.587-.762.699-1.368.163-.889.134-.976-.332-1.007-.28-.018-.939.284-1.462.67s-1.871 1.31-2.996 2.05c-1.126.742-2.102 1.407-2.17 1.477-.067.07-.554.377-1.08.682-.527.306-1.309.854-1.737 1.22-.429.365-.844.66-.922.654-.16-.01-1.722.99-2.28 1.46-.386.325-3.106 1.929-4.459 2.629-.438.226-1.377.917-2.085 1.535-2.14 1.868-3.419 2.864-3.656 2.849-.124-.008-.683.347-1.243.79-1.737 1.372-3.559 2.71-4.175 3.066-.325.188-.89.631-1.257.986-.366.356-.783.68-.927.721-.31.09-3.925 2.768-5.082 3.765-.448.386-.901.696-1.008.69-.106-.008-.335.137-.508.321-.24.256-.261.473-.091.922.283.75 1.108.825 1.904.174m1.274-6.047c.014-.216-.433-.045-.912.35-.433.356-.608.387-.856.151-.172-.163-.906-.373-1.631-.466a39 39 0 0 1-2.23-.353c-.5-.101-1.837-.293-2.97-.427-5.035-.596-9.998-1.256-11.89-1.581-2.754-.474-8.423-1.033-16.611-1.64-5.631-.416-6.902-.571-7.55-.922-.948-.513-1.614-.991-1.803-1.294-.077-.124-.611.113-1.186.527s-1.367.905-1.76 1.092c-.392.186-.92.454-1.175.596-.254.141-1.356.748-2.449 1.348s-1.99 1.136-1.993 1.19c-.004.056 3.948.312 8.781.57 12.303.137 20.54 1.216 28.375 1.691 3.753.228 14.576 1.211 14.692 1.336.077.083 3.16-2.026 3.168-2.168m-2.22-3.887c-.987-1.096-1.935-3.28-1.87-4.307l.045-.694-15.678-.924c-8.623-.509-15.965-.902-16.315-.874s-1.853-.006-3.339-.075l-2.701-.126.64.644c.607.61.733.641 2.383.606 4.908-.104 20.513.728 25.632 1.367 1.636.204 3.825.466 4.865.583 1.773.198 3 .62 2.664.917-.22.194-1.848.618-1.993.519-.069-.048-.625-.04-1.235.013-.61.055-1.153.018-1.205-.08-.053-.1-4.202-.459-9.222-.798-11.11-.752-11.223-.76-15.762-.938-3.32-.13-3.696-.103-4.157.305-.279.247-.464.492-.41.545.052.054 3.294.372 7.204.708 8.615.739 10.435.937 12.938 1.409 1.065.2 4.41.64 7.432.977s5.803.655 6.18.707 1.605.18 2.73.286l2.043.193zm-38.363-3.32c.004-.062-.37-.3-.831-.53-1.068-.532-1.95-1.49-2.488-2.702-.335-.756-.394-1.34-.282-2.799.14-1.821.136-1.834-.246-1.061-.518 1.045-.63 3.044-.269 4.752.397 1.874.806 2.239 2.641 2.357.807.052 1.47.044 1.475-.018m42.061.556c.94-.67 2.667-1.888 3.84-2.705 1.171-.817 3.775-2.71 5.784-4.206a669 669 0 0 1 3.896-2.888c.132-.092 1.146-.826 2.253-1.63 2.482-1.804 3.934-2.667 4.186-2.487.106.076.111.392.012.703l-.18.566.735-.458c.405-.252 1.309-.934 2.01-1.515l1.273-1.057-.604-.617c-.746-.763-1.593-2.883-1.523-3.814.029-.38.216-1.074.416-1.541s.285-.904.19-.972-.86.327-1.7.878c-.842.551-1.868 1.19-2.281 1.418-1.193.659-4.448 2.947-5.517 3.878a13.7 13.7 0 0 1-2.05 1.431c-.592.32-1.302.786-1.578 1.036-.76.686-2.03 1.631-2.18 1.621-.251-.016-4.327 3.022-4.976 3.708-.498.528-.61.806-.488 1.216.2.672.278.672 1.082-.005.363-.305 1.746-1.322 3.074-2.261s2.525-1.824 2.661-1.967 1.168-.864 2.293-1.601c1.125-.738 2.156-1.456 2.292-1.596s.406-.315.601-.388.612-.297.928-.497l.573-.363-.454.773c-.25.426-.625.946-.833 1.156-.22.222-.272.388-.124.397.14.01.345-.108.456-.26s.377-.37.591-.484c.337-.18 1.7-1.16 4.13-2.973.559-.416.698-.439.908-.147.197.271.127.468-.333.937-1.023 1.042-2.519 2.297-3.76 3.154a30 30 0 0 0-2.1 1.604 89 89 0 0 1-2.395 1.95 182 182 0 0 0-6.784 5.593c-4.93 4.243-5.866 4.956-6.452 4.918-.554-.036-.743.179-.451.512.334.383.97.132 2.579-1.017m1.478-3.796a421 421 0 0 1 4.99-4.295c.788-.656 1.365-1.198 1.283-1.203-.324-.021-1.2.567-2.754 1.849-.895.737-1.709 1.337-1.808 1.333s-.923.647-1.832 1.45c-.908.802-2.326 1.937-3.15 2.522s-1.502 1.148-1.51 1.251c-.006.104.092.42.22.702l.233.514.386-.51c.212-.282 1.986-1.907 3.942-3.613m5.728 4.438c.008-.127-.031-.233-.087-.237s-.172.093-.258.215-.047.23.087.238a.24.24 0 0 0 .258-.215m3.537-2.38c.435-.26.797-.55.804-.645.006-.095.142-.165.3-.155.386.022 2.722-1.863 2.55-2.059-.117-.134-1.338.675-4.15 2.752-.905.667-.57.74.496.106m-12.417-2.583c1.392-1.128 1.418-1.381.177-1.728-.495-.139-.793-.097-1.017.142-.174.185-.24.342-.146.348s.056.134-.085.285c-.368.394-.736 1.982-.463 2 .124.007.814-.464 1.534-1.047M30.834 41.66c5.29.197 17.493 1.027 21.373 1.453 1.927.211 3.67.337 3.873.28.304-.087 1.478-2.19 1.316-2.358-.027-.028-1.31-.201-2.852-.384-2.73-.324-2.822-.32-3.585.185-.735.485-1.027.512-4.697.424-2.153-.052-6.086-.2-8.741-.33s-6.692-.283-8.97-.342c-2.28-.058-5.333-.186-6.785-.285-3.07-.209-3.448-.158-3.488.468-.03.453.07.467 4.561.613 2.525.081 6.123.206 7.995.276m-13.756-3.884c.004-.135-.156-.053-.358.182-.2.234-.369.536-.374.671-.004.135.157.053.358-.181.201-.235.37-.537.374-.672m5.235.796c1.602-.003 2.084-.09 1.87-.334-.226-.258-3.748-.567-4.04-.355-.472.346-.433.916.055.794.226-.056 1.177-.103 2.115-.105m54.67 3.629c.009-.127-.03-.234-.086-.238s-.172.094-.258.216-.047.229.087.237a.24.24 0 0 0 .258-.215M25.92 38.447c.093-.132-.175-.243-.661-.275-.45-.029-.824.052-.832.179s.29.25.66.274c.372.024.746-.056.833-.178m5.527.332c.08-.113-1.01-.273-2.514-.37-1.671-.108-2.66-.083-2.67.067-.018.298 4.982.59 5.184.303M78.94 40.78c.262-.288.164-.27-.391.07-.408.25-.899.627-1.091.839-.262.288-.163.27.391-.07.408-.25.899-.627 1.091-.839m5.153-3.392c1.061-.728 2.2-1.514 2.532-1.745l2.503-1.746c1.045-.729 1.782-1.373 1.638-1.432-.464-.19-1.408.095-1.43.43-.01.18-.318.522-.682.761l-.903.598c-.132.09-.51.263-.841.385-.33.123-1.197.695-1.926 1.272s-1.757 1.325-2.286 1.662c-1.15.734-3.258 2.508-3.283 2.762-.018.191 1.518-.777 4.678-2.947m-64.098-1.642c.33.021.666.115.748.208s.897.179 1.813.19 4.377.206 7.692.434c3.545.243 6.032.325 6.04.199.007-.117-.58-.262-1.306-.322-.725-.06-3.073-.26-5.217-.445l-7.567-.655c-3.13-.27-3.712-.267-3.96.028-.473.56.007 1.028.65.635.28-.171.777-.294 1.107-.273zm39.09 3c-.258-.274-6.018-.856-6.181-.624-.069.097.522.25 1.312.339 3.437.387 5.054.481 4.869.285m-8.669-.866c.101-.09-.53-.217-1.403-.283-3.727-.283-8.813-.778-10.326-1.005-1.593-.24-2.341-.05-1.627.413.406.263 13.107 1.094 13.356.875m2.045.19c-.07-.133-.483-.264-.918-.292-.434-.028-.796.053-.804.18s.404.258.917.291c.563.037.882-.035.805-.18m23.322 1.27a.23.23 0 0 0-.215-.246.231.231 0 0 0-.029.462.23.23 0 0 0 .244-.216m-4.2-2.822c.007-.127-.032-.234-.087-.237-.056-.004-.172.093-.258.215s-.047.229.086.237a.24.24 0 0 0 .258-.215m-11.238-.954c.064-.013-.106-.13-.377-.261-1.41-.68-2.15-4.27-1.205-5.85.24-.403.385-.793.32-.867s-.507-.185-.982-.246c-1.366-.177-4.213-.617-5.086-.787-1.498-.29-4.221-.668-6.97-.966-5.183-.561-25.014-1.862-26.866-1.761l-2.105.113c-.14.007-.48.58-.756 1.275-.276.694-.594 1.356-.705 1.47-.312.318-.383 2.486-.104 3.194.177.452.473.682 1.043.81.884.199 8.69.875 21.212 1.838 4.543.35 9.238.75 10.434.892 1.196.141 4.08.441 6.41.667s4.269.45 4.311.498c.065.074 1.023.06 1.426-.02m3.538-.66c.615-.448 1.302-.978 1.528-1.177s.483-.358.572-.352c.09.005.493-.256.898-.58.405-.325 1.545-1.163 2.534-1.862 2.244-1.587 3.048-2.188 3.93-2.94.384-.326.755-.589.825-.584.109.007.622-.361 2.487-1.784.2-.152.74-.504 1.202-.782s.895-.559.962-.624c.254-.247 5.273-3.319 8.038-4.92 1.58-.916 2.982-1.74 3.114-1.832 1.16-.806 3.006-1.876 3.546-2.055.485-.161.625-.323.522-.607-.077-.213-.143-1.093-.146-1.956l-.006-1.569-1.175.74c-.645.406-1.264.732-1.375.725s-.339.134-.507.314c-.26.277-1.41.924-3.345 1.882a7 7 0 0 0-.758.442c-.18.126-.817.46-1.415.743-1.925.909-2.233 1.067-2.665 1.373a9 9 0 0 1-.854.524c-3.11 2.153-5.804 3.458-7.965 4.842-1.785 1.145-2.374 1.481-4.302 2.453-2.56 1.609-6.423 2.608-8.617 4.425-1.16 1.12-.937 3.124.48 4.317.373.314.752.81.843 1.102.092.293.248.538.348.544s.685-.354 1.3-.802M14.25 26.861c.257-.65.405-1.251.33-1.338-2.733 1.31-2.73 3.271-1.067 4.968l.135-1.225c.074-.674.345-1.756.602-2.405m48.424-1.576c2.21-.89 3.587-1.597 6.457-3.315 3.248-1.944 3.71-2.23 5-3.101 3.75-2.53 7.128-4.524 8.756-5.165 3.072-1.776 4.751-2.625 6.697-3.735 2.007-1.145 3.654-2.163 3.66-2.262.007-.098-1.172-.245-2.62-.325-1.447-.08-2.71-.2-2.807-.267s-1.567-.28-3.267-.474-3.759-.444-4.576-.557c-.817-.112-4.582-.453-8.367-.757-3.786-.305-7.485-.645-8.221-.756-5.914-.894-9.573-1.197-12.12-1.002-2.094.16-2.787.335-3.702.935-.199.13-.851.467-1.45.75-1.821.858-2.21 1.062-2.553 1.341-.182.148-.433.262-.558.254s-.724.319-1.331.726-1.198.735-1.313.727c-4.812 2.935-9.385 5.731-14.555 8.406-2.079 1.065-4.255 2.32-5.744 3.31-.464.308-1.297.76-1.851 1.005-1.105.487-1.384.974-.46.803.317-.06 2.855.028 5.64.194 6.679.135 13.155.631 19.513 1.222 1.708.153 3.568.345 4.133.427.566.081 2.109.288 3.43.459 2.677.346 6.088.911 7.985 1.323 2.146.467 2.706.444 4.224-.166\"\n    />\n  </Svg>\n);\nexport default HighSchoolIllustration;"
  },
  {
    "path": "app/(onboarding)/components/ageSelection/illustrations/middleSchool.tsx",
    "content": "import * as React from \"react\";\nimport type { SvgProps } from \"react-native-svg\";\nimport Svg, { Path } from \"react-native-svg\";\n\nconst MiddleSchoolIllustration = (props: SvgProps) => (\n  <Svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={94}\n    height={64}\n    fill=\"none\"\n    {...props}\n  >\n    <Path\n      fill={props.color}\n      d=\"M28 5.79C8.469 14.938 2.427 32.08 2.129 41.78c-.434 14.09 6.799 25.305 8.455 28.268l13.766-5.65-1.472-4.93 52.43-23.712 2.59 3.649 14.757-6.89s-1.301-8.89-10.621-18.365-31.053-18.17-52.1-9.22q-.987.42-1.932.861m7.3 11.151q.375-.175.763-.345c16.534-7.325 31.274 2.567 32.629 3.91s3.275 4.785 3.275 4.785L18.44 47.538s-1.513-5.214-.886-9.07c.618-3.794 1.935-14.216 17.746-21.527\"\n    />\n    <Path\n      fill={props.dark}\n      d=\"M80.654 39.66c-2.701.992-3.651.823-4.679-.835l-.768-1.24-21.171 9.294C42.392 51.991 30.968 57.04 28.65 58.1l-4.214 1.925.686 2.157c.378 1.186.489 2.463.246 2.838-.494.767-14.083 6.657-14.84 6.424-1.061-.32-4.835-5.465-6.325-8.625-5.088-10.794-5.546-21.412-1.436-33.316 1.83-5.3 2.653-6.83 5.703-10.593 4.066-5.018 5.805-6.441 13.354-10.93C28 4.305 35.523 1.248 43.228.288 50.749-.648 61.854.756 69.417 3.6c9.91 3.727 16.352 11.367 21.41 20.264 4.386 7.714 3.856 9.69-3.489 12.982-2.428 1.089-5.436 2.354-6.684 2.813m5.74-5.846c4.308-2.148 5.168-2.206 4.001-3.487-.561-.902-1.076-1.118-1.901-.799-1.437.555-2.008.343-2.094-.78-.038-.49.481-1.15 1.153-1.466 1.17-.552 1.165-.668-.14-2.777-2.547-4.117-2.717-4.256-4.292-3.514-1.817.857-2.6-.383-1.05-1.658 1.234-1.014 1.015-1.376-2.865-4.726-2.425-2.095-2.978-2.226-3.475-.826-.159.447-.76.846-1.335.884-.965.065-.991-.048-.333-1.436.874-1.845 1.574-3.588-3.076-5.606l-3.175-1.377-.641 1.642c-.508 1.3-.826 1.576-1.524 1.322-.698-.253-.852-.707-.739-2.173l.144-1.852-3.988-.798c-4.257-.852-5.275-.723-5.17.656.037.477-.268 1.025-.677 1.218-.875.412-1.706-1.046-1.28-2.245.224-.632-.913-.85-4.7-.897-2.748-.035-5.28.07-5.63.235-.356.168-.373.85-.039 1.559.908 1.924-1.005 2.165-2.134.269-.853-1.433-1.03-1.637-5.29-.505l-5.266 1.398.487 1.427c.356 1.043.218 1.554-.51 1.898-.826.389-1.077.206-1.464-1.065-.607-1.99-2.287-1.22-6.281 1.545-2.91 2.014-2.987 2.128-2.433 3.672.679 1.896-.406 2.704-1.887 1.406-1.229-1.076-1.622-.9-4.397 1.963-2.54 2.62-2.71 3.15-1.334 4.178 1.514 1.132.098 2.368-1.651 1.44l-1.321-.7-.924 1.764c-.509.97-1.426 3.073-2.04 4.672l-1.115 2.907 1.473.373c1.353.341 1.416.432.775 1.112-.385.407-1.123.629-1.64.494-.75-.196-1.081.34-1.636 2.65-.637 2.651-.942 5.226-.684 5.773.057.121.622.124 1.255.007 1.744-.322 1.565 1.192-.221 1.867-1.41.532-1.513.816-1.328 3.619.333 5.065.653 5.992 1.937 5.615 1.479-.433 1.842.445.594 1.44-1.107.886-.907 2.487.792 6.335.95 2.151 1.137 2.307 2.174 1.818.624-.294 1.346-.457 1.606-.363.737.267.11 1.948-.904 2.427-.732.344-.638.75-.043 2.264.613 1.559 1.369 1.642 3.172.833l7.849-3.377c2.21-.943 2.185-.933 1.207-3.008-.737-1.562-.742-2.107-.026-2.774.49-.457 6.97-3.5 14.4-6.76 13.022-5.717 13.488-5.96 12.907-6.763-.425-.587-1.126-.643-2.375-.19-2.808 1.02-3.451.324-.839-.908 1.938-.913 2.217-1.221 1.837-2.027-.247-.523-.294-1.19-.105-1.483.195-.302.6.01.935.721.555 1.178.738 1.184 3.021.107 3.091-1.457 3.607-.629.633 1.016-1.684.932-2.175 1.466-1.993 2.17.226.866 1.038.558 11.43-4.341 6.152-2.9 11.848-5.324 12.658-5.384 1.255-.095 1.614.19 2.432 1.924.888 2.155.821 2.13 2.64.872a87 87 0 0 1 6.453-3.428m-24.548-3.142c-5.78 2.299-17.674 7.516-26.432 11.595-17.065 7.949-18.213 8.309-18.087 5.688.034-.71-.15-1.736-.407-2.282-1.097-2.328-.973-7.538.275-11.533 1.622-5.191 3.613-8.39 7.739-12.436 2.796-2.742 4-3.54 8.605-5.697 4.897-2.292 5.898-2.57 11.716-3.232 9.174-1.042 16.94.576 22.088 4.604 3.268 2.556 6.375 6.239 6.315 7.485-.032.664-.338 1.303-.68 1.419-.343.115-5.352 2.091-11.132 4.39m5.024-8.695c-5.447-5.277-11.507-7.017-21.672-6.22-8.363.655-14.144 3.525-19.841 9.85-4.734 5.256-7.321 13.37-6.35 19.918.165 1.104.361 1.024 15.776-6.408 8.586-4.14 18.765-8.776 22.621-10.303s8.044-3.224 9.307-3.771l2.296-.997z\"\n    />\n  </Svg>\n);\nexport default MiddleSchoolIllustration;"
  },
  {
    "path": "app/(onboarding)/components/ageSelection/illustrations/parents.tsx",
    "content": "import * as React from \"react\";\nimport type { SvgProps } from \"react-native-svg\";\nimport Svg, { Path } from \"react-native-svg\";\nconst ParentsIllustration = (props: SvgProps) => (\n  <Svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={100}\n    height={71}\n    fill=\"none\"\n    {...props}\n  >\n    <Path\n      fill={props.color}\n      d=\"M24.106 3.657c-2.206.01-4.79.386-7.397 1.046-3.942.261-7.69 1.897-10.651 4.65-2.054 1.491-3.482 3.193-3.809 5.007-4.528 12.17 5.972 27.458 15.574 27.77 9.73 0 17.654-8.24 17.78-18.49l1.15-12.926c-.96-6.192-8.487-6.977-12.211-7.053a20 20 0 0 0-.436-.004m44.278 5.68c-.061-.004-.104.01-.104.065 0 .45-.863.033-1.231.084-3.71.517-10.714 7.285-13.294 15.18a20.4 20.4 0 0 0-1.222 6.973c0 9.933 6.988 17.986 15.61 17.986 2.669 0 5.294-.79 7.623-2.291 3.254 1.995 9.333.797 11.582 1.11 2.573.358 3.74-5.262 4.98-5.22s.071-5.199 1.662-5.22 3.367-2.693 3.67-4.524c.305-1.831-3.927-1.895-3.927-1.895s-4.771-13.301-7.858-13.26c-3.087.043-3.251-1.6-4.514-4.398-1.105-2.45-8.225-4.432-12.62-4.522-.098-.003-.254-.06-.357-.068M38.99 45.677a15.7 15.7 0 0 0-10.737 4.205c-1.76-.857-3.866-1.306-6.394-1.265q-.732.013-1.514.08C1.547 50.364 4.692 58.49 2.067 85.473 13.03 88.03 20.98 88.199 26.55 87.505q-.087.172-.177.343c9.204 2.156 34.24 9.246 54.768 1.898 4.85-.907 8.47-1.939 8.47-2.304q-.026-.91-.059-1.838c2.168-1.614 1.862-2.678-.157-3.32-.772-12.998-3.58-26.535-13.885-26.543-2.163-.002-4.658.593-7.533 1.915-10.452 4.805-10.992 11.106-10.925 25.359-.305 6.038-2.033 4.068-4.409 4.36-1.625-2.07-7.462-7.626-12.913-7.735q-.547-.01-1.128.005c-.369.01-.72.027-1.062.049a375 375 0 0 0-.138-3.638q.782.079 1.586.079c8.6 0 15.57-6.818 15.571-15.229s-6.971-15.23-15.571-15.23\"\n    />\n    <Path\n      fill={props.dark}\n      d=\"M18.96.003a23 23 0 0 0-.91.003C16.446.04 14.91.25 13.48.652c-4.542 0-6.942.045-10.6 3.855C-.06 7.632-.329 10.684.244 13.97c1.449 8.294-1.984 13.09 2.263 20.423 2.791 5.045 5.209 6.987 10.32 8.29 6.335 1.616 12.32-.032 17.012-4.423.345.353.962.752 1.664 1.047 1.88.788 1.894.83.356 1.098-2.2.382-2.008 1.88.355 2.777l1.955.743-1.8.74c-1.303.536-3.095 2.04-4.752 3.842-2.945-.8-5.57-1.175-7.904-1.174C2.893 47.343 1.03 66.72.838 84.63c.272.71.934 1.143 1.473.964.693-.231 1.028-6.464 1.146-12.8.426-10.978 8.22-24.416 18.94-23.125q1.877.252 3.49.898c-.835 1.093-1.557 2.203-2.044 3.21-.913 1.884-1.399 4.356-1.396 7.106-.344 9.347 6.089 14.859 13.451 16.106q.05 1.07.14 2.04c-1.854.291-3.517.739-4.77 1.345-4.51 2.183-7.832 7.916-4.578 7.898.466-.002 1.387-.955 2.048-2.117 1.83-3.216 5.073-5.52 10.92-5.365 8.27.218 6.848 1.034 10.07 5.657 1.465 2.102 2.266 2.623 2.916.929-1.65-5.867-5.884-8.798-11.273-8.751-.995.002-1.99.044-2.96.123q.06-.761.106-1.495c6.529.209 13.242-2.853 16.283-9.473 1.066-1.653 1.012-2.605 1.402-2.544 1.928.15 3-1.863-.022-3.022.575-2.714.504-5.707-.776-8.342-2.598-5.157-8.707-9.735-12.995-9.735-1.165 0-2.286-.27-2.49-.602-.577-.933 2.306-3.661 3.868-3.661 1.822 0 1.802-1.447-.027-1.926-1.565-.409-1.846-1.281-.65-2.02.553-.342.556-.695.004-1.245-.55-.55-1.357-.202-2.848 1.226l-2.083 1.995-.232-2.03c-.151-1.314-.706-2.118-1.579-2.283a4 4 0 0 0-.399-.058 2 2 0 0 0-.142-.005c-.673.013-.675.59-.334 2.721.501 3.136.154 3.453-1.997 1.826-.766-.579-1.712-.92-2.486-1 1.716-1.867 3.233-4.13 4.49-6.766 1.018-2.136 1.754-2.804 2.745-2.49 2.134.678 2.774-1.326.835-2.613-1.447-.961-1.702-1.87-1.702-6.082 0-2.724.368-5.179.817-5.456s.601-1.268.34-2.202c-1.299-4.625-2.359-6.19-5.165-7.622C28.612 1.507 23.541.084 18.961.003zm13.738 5.455c.4 0 1.299.87 1.996 1.933s1.147 2.25 1 2.637c-.15.386-1.049-.485-1.999-1.935s-1.399-2.635-.997-2.635M17.28 5.48c3.337 1.026 4.323 1.938 8.79 4.334 8.813 4.727 9.448 5.603 8.824 12.154-.215 2.25-.565 2.69-2.146 2.69-2.405 0-3.126 1.922-.935 2.495 1.988.52 2.028.9.355 3.405-2.39 3.581-6.129 7.157-9.059 8.667-4.586 2.364-9.256 1.991-13.256-1.06-4.849-3.698-6.562-7.036-6.527-12.723.019-2.975.385-3.702.375-7.796C6.056 9.284 10.046 5.379 17.281 5.48m6.899.077c1.328-.007 3.946 1.116 5.037 2.322.745.823 1.035 1.481.645 1.462-1.202-.058-6.757-3.191-6.36-3.587.134-.135.37-.196.678-.197m44.699 2.811c-1.501.04-2.905.357-3.984.969-9.907 5.62-12.927 9.96-13.486 19.384-.306 5.16-.574 6.064-1.905 6.412-1.866.488-1.124 2.079.968 2.079 1 0 1.98 1.118 2.996 3.416 1.675 3.788 5.34 6.969 9.996 8.675 1.685.617 4.298 1.14 5.807 1.16 3.26.045 8.42-2.175 10.506-4.52 1.693-1.902 2.977-2.22 2.349-.582-.485 1.263 2.495 3.606 4.586 3.606 1.92 0 2.739-2.352 1.13-3.252-.714-.4-1.064-1.23-.803-1.909.304-.792-.107-1.35-1.208-1.639-2.498-.653-1.998-2.151 1.345-4.03 2.164-1.216 3.035-.8 1.316.627-1.956 1.623-1.5 3.391.764 2.958 1.314-.25 1.96-.023 1.96.692 0 2.078 2.781 1.091 3.687-1.308.783-2.076.688-2.57-.76-3.92-1.633-1.521-1.635-1.56-.137-2.693.836-.632 1.784-1.16 2.108-1.174.86-.037.718 1.37-.196 1.934-1.167.721-.947 1.959.347 1.959 1.487 0 3.567-3.017 3.036-4.4-.23-.598-.869-1.086-1.423-1.086-.553 0-1.217-.84-1.475-1.865-.257-1.026-1.178-2.052-2.044-2.279-1.059-.276-1.577-1.067-1.577-2.405 0-1.097-.497-2.276-1.106-2.62s-1.227-1.686-1.372-2.98c-.25-2.234-.427-2.34-3.541-2.146-3.056.19-3.296.058-3.527-1.958-.186-1.618-.854-2.362-2.644-2.948-1.317-.431-3.41-1.451-4.65-2.267-1.797-1.182-4.176-1.832-6.415-1.89a13 13 0 0 0-.648 0m1.223 1.419c.029-.007.092.019.129.022.696.047 1.679.417 2.614 1.124 1.501 1.135 1.499 1.15-.047 1.114-2.107-.05-3.527-.671-3.527-1.545 0-.408.262-.63.68-.682.044-.005.135.035.135-.012q0-.017.017-.02zm-4.067 3.756c.433.012 1.17.427 1.467.548 1.268.517 1.254.613-.19 1.206-2.194.903-6.661.907-6.661.007 0-.756 2.884-1.456 5.054-1.462 0-.226.133-.304.33-.298m13.439 1.123c0 .826 1.553.77 1.553 1.824 0 1.439-1.109 1.45-2.293.023-.627-.756-.658-1.266-.096-1.613.273-.17.56-.242.836-.234m-7.073.755 2.55 1.718c4.8 3.234 8.722 13.058 7.497 18.784-.875 4.086-3.306 7.297-7.572 10.003-3.494 2.216-6.388 2.928-6.388 1.572 0-.377 1.047-.894 2.326-1.15 3.403-.68 7.862-8.423 7.862-13.65 0-1.732-.258-1.887-2.547-1.538-1.4.215-5.608 1.737-9.348 3.385-6.426 2.83-6.798 3.126-6.76 5.378.023 1.31.765 3.177 1.648 4.147 1.828 2.007.94 2.34-1.563.588-1.988-1.393-4.941-5.96-4.941-7.643 0-.653.706-1.372 1.567-1.598 2.395-.626 1.906-2.275-.587-1.983-2.146.25-2.156.232-2.085-4.451.048-3.17.626-5.783 1.771-8.017 1.673-3.26 1.755-3.307 5.023-2.863 2.33.316 4.554-.018 7.436-1.116zm-53.894.64c-1.201.012-2.474 1.78-1.92 2.675.755 1.223 3.161.702 3.161-.685 0-.604-.45-1.8-.88-1.937a1.1 1.1 0 0 0-.36-.053m10.38 1.599a1.7 1.7 0 0 0-.377.03c-.789.153-1.412 1.15-1.564 1.939-.2 1.035.503 1.567 1.539 1.368.788-.152 1.558-.92 1.71-1.71.174-.905-.454-1.6-1.308-1.627m57.952 1.89c.371.023.458.457.458 1.447 0 1.026-.661 2.464-1.47 3.196-1.301 1.178-1.525 1.192-1.936.122-.633-1.649.157-3.444 1.93-4.394.47-.251.795-.385 1.018-.371m-17.318 3.663c-.71-.025-1.032.421-1.032 1.403 0 1.121.502 1.624 1.624 1.624 2.008 0 1.78-2.593-.263-2.987a2 2 0 0 0-.329-.04m-6.435.049c-1.5-.056-1.638 1.398-1.651 1.745 0 1.517.401 2.017 1.62 2.017 1.232 0 1.563-.422 1.373-1.755-.186-1.303-.64-1.946-1.342-2.007m-53.722 1.04c-.622-.023-.979 1.077-.979 3.016 0 2.286.57 3.663 2.273 5.487 1.961 2.1 2.796 2.425 6.074 2.376 4.381-.066 8.503-2.14 8.503-4.279 0-1.15-1.604-2.015-7.446-4.014-4.094-1.402-7.886-2.565-8.425-2.586m80.6 2.264c.155.003.254.015.282.04.114.098-.526 1.111-1.422 2.25-2.36 3.001-.04 5.407 2.392 2.478.536-.647 1.301-1.175 1.7-1.175 1.056 0-1.88 3.745-3.268 4.167-.646.197-1.732.588-2.411.87-.983.408-1.227-.015-1.19-2.067.026-1.418-.222-3.33-.55-4.25-.52-1.45-.258-1.722 1.973-2.061 1.06-.162 2.028-.256 2.494-.252m-78.563.963q.089 0 .194.007c1.96.151 7.983 2.665 8.365 3.661.225.586-.083 1.376-.685 1.757-1.18.747-3.622.838-5.225.193-1.178-.474-3.613-4.925-3.02-5.519.066-.064.193-.096.37-.099m64.385 5.848q.151.01.153.11c0 .034.055 0 .065.009.65.649-2.1 7.216-3.76 8.984-2.365 2.517-6.79 2.435-9.238-.171-1.011-1.076-1.69-2.1-1.51-2.273.767-.737 12.79-6.779 14.29-6.66m-37.05 13.117c3.59.057 7.27 1.517 10.795 3.839 2.38 1.017 5.062 6.419 4.759 9.58-.187 1.94-.049 1.79-.244 2.137-3.688.445-1.184 2.6-.608 2.833-4.412 14.18-24.381 11.62-28.078 2.306-2.031-7.316-.439-12.754 5.277-18.022 2.568-1.911 5.307-2.717 8.099-2.673m38.029 8.222c-4.233.037-9.991 1.267-11.402 2.517-7.901 5.152-10.303 12.027-10.142 22.595-.006 9.108.576 11.348 2.245 10.316.514-.318.836-4.02.836-9.627 0-11.021 1.127-13.96 7.542-19.677C86.712 48.967 88.242 74.005 87.97 82.185c-.223 5.893-.127 6.36 1.308 6.36 1.332 0 1.53-.495 1.423-3.527-.512-22.117-2.566-27.166-10.43-29.897-.854-.296-2.095-.417-3.506-.405m-41.363 4.696c-.53.03-.88.57-.88 1.52 0 .521.64.948 1.422.948 2.074-.662 1.57-2.456-.434-2.468a1 1 0 0 0-.108 0m10.168.459c-.702-.014-1.092.73-1.1 1.299 0 1.07.372 1.453 1.245 1.285.684-.132 1.244-.71 1.244-1.285 0-.576-.56-1.154-1.244-1.286a1 1 0 0 0-.145-.013m-.576 7.074c-1.054.009-2.795.396-5.858.144-5.973-.49-5.478 2.272.559 4.033 2.007.38 2.993 1.08 5.04-.434 1.225-.907 2.867-2.646 1.108-3.587-.222-.119-.498-.159-.85-.156\"\n    />\n  </Svg>\n);\nexport default ParentsIllustration;"
  },
  {
    "path": "app/(onboarding)/components/ageSelection/illustrations/supSchool.tsx",
    "content": "import * as React from \"react\";\nimport type { SvgProps } from \"react-native-svg\";\nimport Svg, { Path } from \"react-native-svg\";\nconst SupSchoolIllustration = (props: SvgProps) => (\n  <Svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={104}\n    height={57}\n    fill=\"none\"\n    {...props}\n  >\n    <Path\n      fill={props.color}\n      d=\"M1.328 29.946 43.746 1.934l55.187 1.018-23.486 18.033 6.293 28.078S74.486 61.941 60.307 63.57C46.13 65.2 34.19 59.34 34.19 59.34l-6.577-25.712S2.018 33.11 1.328 29.946\"\n    />\n    <Path\n      fill={props.dark}\n      d=\"M43.44 65.231c-3.082-1.072-7.345-2.482-10.005-3.994-.992-.613-1.036-.707-1.87-3.991-.985-2.99-4.713-22.632-5.885-22.452-7.967 1.144-16.134-1.313-23.63-1.287-2.532-.87-2.54-5.12-.997-6.257C14.743 17.644 30.395 8.791 42.603.576c.931-.614 3.518.006 5.607-.086C54.1.189 58.847.599 64.64.313 72.915.224 79.38.15 86.683.015c3.164-.055 6.733.17 8.81-.007 2.976-.138 7.437 1.573 5.933 3.973-1.763 2.553-6.314 4.866-10.446 7.763 1.285 6.863 2.932 12.747 4.25 19.647 2.345.827 4.52 2.739 5.89 4.546 1.048 1.414 1.403 2.159 1.674 3.516.559 2.797.531 3.183-.267 3.753-1.293.923-1.368.847-2.126-2.142-.947-3.735-1.615-4.576-.943-1.187.671 3.385.825 5.218.493 5.861-1.347 1.24-2.587-3.323-3.135-4.902.662 2.759-.853 10.18-1.994 5.372-2.116-6.293-1.645-.91-2.706-.726-.751.142-.933-1.03-1.134-2.626-.383-3.037.631-11.308 1.405-11.454-1.388-6.16-2.596-12.363-3.796-17.675-4.05 2.592-7.124 5.211-10.828 7.653l.86 3.7c3.197 21.763 5.642 23.173 5.333 23.57-2.186 5.676-8.98 10.523-12.618 13.375-7.022 4.696-19.717 5.347-27.897 3.206m22.993-5.388c4.168-2.053 11.807-6.74 13.055-12.062.19-1.079-4.921-23.744-5.292-23.674-5.211 2.992-10.22 7.164-14.65 10.536-2.272 1.636-4.33 1.747-6.727 1.34-6.858-.358-15.55-2.537-22.433-.887-.236.228.049 2.203 1.218 8.431 3.264 11.928 3.841 13.744 5.516 15 4.718 2.051 13.69 4.387 8.953 3.297 7.434 1.202 14.108.554 20.36-1.98M59.296 29.8c11.29-8.21 24.32-16.928 34.545-24.331 1.08-.552 1.393-1.194.096-1.187a45 45 0 0 1-2.86-.114c-10.262-.055-21.11-.105-30.284.243-5.018-.273-9.871.258-14.997-.515-1.308-.291-3.602 1.278-4.6 2.026-8.55 6.028-16.381 11.36-25.074 16.72-3.167 1.685-5.612 3.939-8.935 5.38-2.48 1.017-3.917 2.085-3.356 2.493.21.153 2.428.396 5.53.607 9.25.759 17.976.695 25.325.267 5.799-.272 12.279.284 17.274.475 3.673.14 5.147-.277 7.336-2.064\"\n    />\n  </Svg>\n);\nexport default SupSchoolIllustration;"
  },
  {
    "path": "app/(onboarding)/components/ageSelection/illustrations/teacher.tsx",
    "content": "import * as React from \"react\";\nimport type { SvgProps } from \"react-native-svg\";\nimport Svg, { Path } from \"react-native-svg\";\nconst TeacherIllustration = (props: SvgProps) => (\n  <Svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={119}\n    height={68}\n    fill=\"none\"\n    {...props}\n  >\n    <Path\n      fill={props.color}\n      d=\"M50.312 1.193c-3.823.007-9.485 1.586-13.179 6.605-4.547 6.177-1.315 10.911-1.315 10.911-2.816 4.061.194 12.2 4.72 16.203 4.525 4.002 14.308 1.636 18.251-1.25s7.176-11.258 8.749-12.971 4.202-5.176.797-10.622-12.304-7.89-15.716-8.653c-.64-.143-1.424-.225-2.307-.223m-17.89 37.02C21.62 38.1 12.356 52.424 7.133 62.412c-6.077 11.623-5.689 36.158-4.891 51.303 18.79 8.294 34.671 2.752 35.081-1.597s-1.12-2.367-.043-12.162 5.71-29.077 7.822-34.446 5.818-19.782-7.262-25.998c-1.84-.874-3.648-1.279-5.416-1.297m59.317-18.68a3 3 0 0 0-.25.002c-4.18.241-7.25 3.326-8.246 4.265-.995.94-3.483-1.707-6.973.464-3.49 2.17-6.006 6.633-3.27 10.048s2.979 3.802 2.979 3.802-7.243 4.183-6.326 7.998c.917 3.814 1.379 4.982 3.824 4.849s2.527 2.941 3.995 1.714c2.025-1.695 3.131-4.249 3.131-4.249 2.26 1.39 7.243 5.814 11.941 4.59 4.699-1.226 7.186-3.847 7.186-3.847s-.611 3.06 1.813 4.278c2.423 1.219 5.935 2.85 7.705 1.206 1.769-1.644 1.656-7.04 1.265-8.315-.391-1.276 3.71-2.609 3.568-7.547s-4.087-7.896-7.293-8.69c-3.205-.793-.416-3.819-3.686-5.33-3.167-1.463-8.685-5.145-11.363-5.239m5.585 37.96a15 15 0 0 0-1.652.084c-5.947.635-9.417 3.406-11.205 7.91-1.789 4.502-1.68 9.93-1.68 9.93l-9.91-.495-19.053 21.027c8.555 3.387 25.721 1.385 25.204 3.136-1.669 5.651 1.948 4.561 7.55 5.6s19.89 2.598 20.342.731c.453-1.866 1.531-3.829 2.759-10.487 1.228-6.659 2.374-27.016-.237-31.001-2.366-3.612-6.868-6.415-12.118-6.436\"\n    />\n    <Path\n      fill={props.dark}\n      fillRule=\"evenodd\"\n      d=\"M44.698.718c1.218-.451 2.55-.7 3.901-.717a11.4 11.4 0 0 1 4.02.665c3.206.213 5.446 1.06 7.82 1.958l.605.228c3.518 1.347 6.518 3.517 8.09 5.854 2.297 3.414 3.081 7.44 1.935 9.944-.507 1.105-2.053 2.743-3.227 3.417-.245.14-.89 1.32-1.433 2.62-1.196 2.864-2.92 5.566-4.879 7.649-1.164 1.238-1.46 1.77-1.46 2.623 0 1.38-.72 1.9-1.822 1.314-.706-.375-.972-.324-2.721.522-3.196 1.661-7.282 1.976-10.65 1.135-7.841-2.096-11.637-7.96-10.646-16.449.213-.734-.067-1.537-.391-2.468-.35-1-.749-2.146-.64-3.508-.288-5.3 5.417-12.474 11.498-14.787m5.275 1.68c-.387-.002-.84-.004-1.282-.002-.744.004-1.451.021-1.735.073-1.13.207-2.142.824-3.434 1.611q-.288.176-.596.361c-.928.559-.438.737.146.737 3.346-.913 3.285.231 1.766.774-3.08 1.507-3.92 2.081-5.469 3.74-1.007 1.079-2.097 2.432-2.423 3.008-.462.816-.017.504 2.006-1.413 2.771-3.127 7.577-3.734 4.03-1.093-2.487 1.758-3.443 3.148-4.06 4.044q-.153.226-.287.41c-.31.577-.48.822-.424.893s.348-.036.97-.156c1.59-.308 4.369-1.312 6.914-3.156 1.658-1.202 2.756-2.318 3.914-3.98.112-.16.227-.34.346-.526.722-1.13 1.601-2.506 2.85-.948.38.46 1.722 1.907 2.981 3.213 1.876 1.947 2.842 2.658 5.35 3.936 1.546.788 2.209 1.079 3.553 1.668l.373.163c-.21-2.155-2.022-4.815-4.56-6.175-3.27-2.158-4.39-3.34-2-3.334 2.615.007 7.15 3.895 8.395 7.195.326.874.608 1.972.83 3.037.37.957.514.454.342-1.2-.349-3.348-2.36-6.44-5.485-8.433C59.31 4.591 55.032 2.656 50.648 2.4c-.175.001-.41 0-.675-.001m2.673 7.054c-.217-.417-.333-.639-.481-.622-.169.02-.38.352-.832 1.065l-.17.269c-2.05 3.041-8.261 6.75-11.776 7.03-1.333.105-2.024.3-2.141.605-.096.247-.318 1.728-.494 3.291-.82 7.31 1.771 11.746 8.19 14.021 2.197.779 6.5.6 8.714-.364 2.178-.948 2.433-1.298 1.764-2.423-.576-.967-.432-1.886.296-1.886.247 0 .863.346 1.37.769l.92.769 1.65-1.813c2.076-2.284 3.485-4.592 4.439-7.275 1.142-3.21 1.065-3.619-.861-4.58-5.451-2.72-8.141-4.822-10.005-7.818-.26-.42-.443-.769-.583-1.038m.59 16.85c-.255-.66.715-1.989 1.45-1.989.797 0 1.083.754.647 1.704-.391.853-1.803 1.044-2.097.284m4.466.355c.381-.341.743-.493 1.04-.49.65.002.978.737.478 1.775-.378.786-1.417 1.217-1.863.773-.412-.408-.22-1.55.345-2.058m-15.292 2.77c.294-.323.723-.49 1.197-.492.79-.002 1.706.461 2.337 1.444.557.867 1.209 1.197 1.72 1.455.415.21.737.373.838.74.583 2.124-2.345 1.533-4.701.2-1.627-.932-2.177-2.485-1.391-3.347m-11.29 7.83q.84-.055 1.626-.041c7.856.136 11.642 5.297 14.228 10.14 2.822 5.453 2.454 9.846-1.89 22.59-1.35 3.959-2.798 8.573-3.217 10.256l-.762 3.058-.566 3.224c-.622 3.888-2.606 5.9-2.638 9.825-.004 1.516 1.072 15.396.966 16.034-.237 1.426-1.79 2.995-2.604 1.207-.73-5.054.51-20.051 1.518-26.716l.413-2.56-2.153-2.647c-5.786-7.11-9.1-14.48-11.32-26.203-1.129-5.963-1.446-12.799 1.108-11.776.357.354.526 1.387.653 3.97.16 3.277 1.022 7.98 2.578 14.06.745 2.91 2.623 7.689 4.407 11.214 1.478 2.92 5.005 7.9 5.417 7.647.136-.084.422-.951.635-1.927s1.62-5.427 3.125-9.89c3.132-9.289 3.84-13.042 3.399-15.695-1.222-7.334-7.129-13.855-13.84-13.397-11.311.55-17.43 10.317-21.789 18.678-5.128 9.938-7.11 23.607-7.061 47.303.002 1.205.036 2.339.066 3.363.088 3.024-1.108-3.614-1.948-3.426-2.563.573-1.052-.885-.795-11.126.046-1.845.092-3.692.122-5.48.242-14.432 2.159-21.704 6.659-30.634 2.474-4.91 4.9-8.644 8.056-12.404 5.507-6.559 8.75-8.192 15.607-8.647m53.256-15.981c1.84-1.823 4.55-2.769 7.923-2.764 1.867.004 2.445.14 3.769.893.86.49 1.944 1.384 2.408 1.987.514.67 1.109 1.1 1.522 1.102.957.004 3.428.782 4.311 1.356 1.095.712 2.659 3.014 2.932 4.316.224 1.073.345 1.17 2.146 1.718 2.14.653 4.208 2.075 5.253 3.614 2.216 3.264 1.547 8.12-1.594 11.562l-1.283 1.406.707 1.387c1.192 2.335.831 4.362-1.179 6.633-1.865 2.108-3.861 2.501-6.263 1.234-.798-.421-1.911-.766-2.474-.766-1.26 0-2.578-.981-3.153-2.348-.236-.562-.496-1.02-.577-1.02s-.783.48-1.56 1.068c-1.946 1.475-4.224 2.079-7.34 1.947-2.285-.097-2.584-.042-3.22.59-.582.577-.812.637-1.348.353-.514-.273-.612-.544-.483-1.335.142-.866.038-1.065-.808-1.562-.533-.312-1.548-1.097-2.255-1.743l-1.285-1.176-.684 1.404c-.717 1.468-1.461 2.117-2.804 2.444-.605.148-1.046-.01-1.813-.65-.797-.667-1.285-.832-2.286-.778-1.67.09-3.063-.778-3.917-2.44-.86-1.671-.734-4.374.302-6.494.729-1.49 4.105-5.218 4.965-5.482.328-.1.004-.555-1.123-1.564-1.78-1.597-2.507-3.081-2.78-5.686-.238-2.252.52-4.063 2.501-5.973 2.395-2.31 6.344-3.278 8.954-2.196l1.05.436zm12.736 2.301c-1.466-1.927-2.989-2.836-4.832-2.86a6 6 0 0 0-.81.043c-2.63.307-4.821 1.096-5.984 2.153-.952.866-1.05 1.081-.746 1.643.421.782.18 1.514-.643 1.951-.494.262-.906.143-2.144-.62-2.062-1.272-3.824-1.283-6.012-.038-2.017 1.148-2.89 2.508-2.881 4.487.01 2.138.86 3.717 3.072 5.703 2.373 2.131 2.353 2.653-.166 4.213-1.944 1.205-3.563 3.008-4.458 4.963-.73 1.597-.764 2.44-.145 3.629.36.692.685.904 1.385.904.74 0 .994-.19 1.334-.996.57-1.355 1.265-1.87 2.203-1.637.976.243 1.311 1.444.797 2.855-.656 1.801.286 1.773 1.687-.05l.843-1.097-.559-2.642c-.494-2.338-.516-3.021-.192-5.919.406-3.62 1.07-5.975 1.938-6.882.769-.803.945-.524.554.879-.423 1.522-.043 1.92 1.217 1.274 1.2-.616 2.642-2.11 3.647-3.778.775-1.288 1.381-1.559 2.257-1.01.327.206.432.777.38 2.074-.09 2.25.372 2.997 1.675 2.713 1.175-.256 2.466-1.446 3.035-2.796.62-1.471 1.418-1.387 2.182.23.336.71.766 1.336.957 1.392.192.056.638-.386.993-.983.355-.596.831-1.084 1.058-1.084.597 0 2.694 1.986 2.694 2.551 0 .264-.357 1.14-.794 1.95-.83 1.538-.868 3.04-.097 3.963.495.591.879.019.887-1.319.007-1.486.292-1.939 1.222-1.939 2.261 0 2.072 5.824-.316 9.723-1.341 2.191-1.628 4.213-.725 5.109.57.565 1.408.624 1.902.133.262-.26.727-.1 1.835.627 1.591 1.046 2.501 1.066 3.603.08 1.408-1.26 1.83-3.337.933-4.607-.37-.525-.707-.67-1.296-.558-1.695.321-2.94-.893-2.243-2.187.181-.335.925-.738 1.736-.94 3.724-.93 6.186-6.176 4.468-9.518-.997-1.938-4.256-3.966-6.397-3.98-1.115-.008-1.446-.443-1.729-2.266-.102-.653-.503-1.667-.892-2.254-.711-1.072-3.088-2.453-3.28-1.906-.057.162-.503.294-.993.294-.717 0-1.137-.325-2.16-1.67m-9.724 12.49-.646-.95-.749.588c-1.364 1.072-3.025 1.792-4.132 1.792H80.77v2.62c0 3.336.736 6.603 1.76 7.81.43.507 1.412 1.352 2.184 1.879l1.403.958.559-.685c.772-.946 1.646-.717 1.692.441.021.502.054 1.015.077 1.142.02.126.979.228 2.125.226 1.533-.004 2.49-.191 3.626-.718 1.615-.75 5.478-4.502 5.858-5.69.154-.48-.101-.987-1.016-2.018-1.419-1.6-1.976-3.399-1.626-5.25.24-1.264.232-1.278-.77-1.465-.557-.103-1.333-.445-1.723-.759-.698-.56-.725-.558-1.579.155-2.054 1.715-4.759 1.68-5.951-.076m-3.852 9.986c-.433-.803.091-1.512 1.118-1.512.807 0 1.459.924 1.173 1.662-.28.724-1.876.619-2.29-.15m6.724 2.145c-.983-.58-.468-2.126.708-2.126.28 0 .767.284 1.083.63 1.01 1.107-.423 2.303-1.791 1.496m1.438 8.37c2.36-.584 4.733-.949 7.06-.941 1.809.006 3.59.238 5.318.769 2.734.853 4.86 2.343 6.632 4.648l3.348 4.356c3.926 5.11 5.121 8.522 4.923 14.055-.192 5.394-1.392 7.486-5.266 9.187-.79.347-1.504.739-1.586.87-.082.132-.367 1.583-.633 3.225-.625 3.853-2.214 10.94-2.683 11.958-.656 1.019-1.015.909-1.91.588-.543-.195-.187-2.395.841-7.556.576-2.89 1.125-5.788 1.22-6.437.17-1.154.155-1.178-.66-1.003-.459.098-2.072.4-3.583.67l-2.747.491-2.037 2.071c-2.65 2.695-5.535 4.18-7.582 3.901-1.051-.143-1.143-.058-1.758.506-.165.151-.367.337-.635.562-1.427 1.542-2.101 1.48-3.775 1.329a56 56 0 0 0-.99-.085c-1.89-.155-7.291-.601-13.53-.82-15.466-.54-18.292-.936-18.837-2.64-.152-.474.038-.903.72-1.611.846-.881.913-1.102.766-2.543-.207-2.02.812-4.35 2.84-6.502 1.196-1.27 1.939-1.713 4.574-2.737 1.73-.672 3.424-1.312 3.763-1.42.34-.109 1.989-1.775 3.665-3.704l3.048-3.506 3.473-.034c2.166-2.579 3.363-4.834 4.602-7.168.366-.69.736-1.386 1.135-2.1 1.448-2.6 2.002-3.296 3.45-4.326.948-.674 2.312-1.675 3.03-2.224.72-.548 2.43-1.371 3.804-1.828m13.003 3.11c-2.335-.958-5.116-1.546-7.409-1.532-.529.004-1.032.039-1.497.109-3.495.54-5.691 1.503-7.465 3.273-2.184 2.183-3.119 4.253-4.018 8.897-.42 2.173-.765 3.99-.765 4.04 0 .294 5.147-.004 9.061-.525 4.999-.665 11.895-.812 12.906-.276.49.26.59.531.451 1.224-.199.986-3.723 7.54-5.335 9.922-.568.84-1.034 1.608-1.034 1.705 0 .098.556.487 1.235.866s1.234.818 1.234.975c0 .397.039.391 3.896-.51l3.431-.801.195-1.85c.291-2.757.218-11.691-.117-14.315-.447-3.511-1.207-6.384-2.26-8.546-.849-1.743-1.127-2.038-2.509-2.657m10.292 13.131c-.799-1.881-2.601-4.9-2.914-4.906q-.015 0-.024.01c-.067.065.017 1.07.187 2.232s.31 5.192.314 8.956l.003 6.842 1.003-.573c.552-.315 1.281-1.12 1.621-1.789.519-1.023.617-1.826.617-5.045 0-3.439-.082-4.02-.807-5.727m-33.298-.736.03-1.95c-1.167 1.735-2.02 2.822-3.117 4.066 0 .057.181.072.625.11q.165.012.379.032c.721.064 1.485.141 1.697.17.281.04.357-.618.386-2.428m20.988 3.584c0-.116-.361-.177-1.035-.187-1.484-.02-4.481.21-8.476.667-5.558.636-6.372.658-12.037.32-3.342-.198-6.36-.44-6.708-.538-.517-.146-1.427.706-4.988 4.665-2.396 2.664-4.798 5.257-5.337 5.762-1.31 1.228-1.776 2.183-2.029 4.163-.04.316-.062.735-.084 1.161-.043.804-.086 1.632-.256 1.824-.654.745-1.933.7-2.137-.076l-.03-.112c-.105-.407-.32-1.24-.432-1.24-.355 0-3.717 3.273-3.546 3.445.353.356 7.076.774 15.305.968 4.838.114 13.162.63 14.944.75 1.243.12 2.272-.516 4.438-3.317l3.875-4.732-.75.249c-1.425.474-2.284.338-2.387-.38-.127-.886 1.684-2.107 3.831-2.584 1.546-.343 1.67-.448 2.988-2.536 1.864-2.952 4.851-8.046 4.851-8.272M92.424 81.27c-2.01-1.162-.796-4.011 1.545-3.925q.113.005.23.018c.992.115 1.454.867.533.867-.328 0-.844.273-1.148.606-.516.566-.518.62-.03.806.288.11.873.042 1.3-.15.426-.193.903-.272 1.06-.176.514.315.304 1.64-.311 1.966-.755.4-2.478.394-3.18-.012zm-9.93-3.663a2.5 2.5 0 0 1 .95-.154c1.412.032 2.88 1.099 2.88 2.334 0 1.012-.66 1.744-1.796 1.99-.455.099-.966.219-1.136.267s-.62-.028-1.003-.17c-1.01-.372-.912-1.44.155-1.676 1.615-.357 1.929-.48 1.929-.753 0-.423-1.115-.917-1.875-.832-1.008.113-1.086-.635-.105-1.006m-9.237 1.178c.89-.836 1.701-1.245 2.455-1.236q.377.006.736.15l.772.31-1.016.227c-2.439.547-3.976 3.573-2.61 5.14.297.34.886.707 1.31.814.648.163.685.14.232-.142-.755-.47-.676-1.707.146-2.278.803-.558 1.928-.609 3.26-.148 1.923.665 2.61 3.189 1.13 4.151-.91.591-3.308.827-4.507.444-3.983-1.273-4.854-4.666-1.908-7.431m15.691.716a1 1 0 0 1 .267-.024c.198.022.198.196.061.636-.123.396-.3 1.065-.395 1.486l-.171.766.79-.722c.862-.785 1.454-.665 1.454.296q0 .61-1.07 1.054c-1.227.508-1.69.543-2.286.168-1.001-.63.021-3.401 1.35-3.66m-11.605 3.121-1.05-.049.995.202c1.132.23 1.03.608-.377 1.4l-.926.52 1.208-.159c.664-.087 1.356-.305 1.536-.484.565-.56-.226-1.376-1.386-1.43m13.92 1.295c0-.628.927-1.051 1.798-1.07.523-.012 1.025.122 1.295.444.505.603.449.637-1.473.88-1.326.168-1.62.122-1.62-.254m-24.279 2.748a6.05 6.05 0 0 1 2.95-.818c.961-.004 1.825.259 2.361.791.996.988.956 1.76-.157 3.017l-.914 1.033.914.671c.647.474.915.93.915 1.556 0 1.48-.459 2.214-1.029 1.649-.113-.113-.206-.656-.206-1.207 0-1.275-.343-1.47-2.62-1.485-1.666-.012-1.865-.081-1.951-.681-.075-.52.283-.908 1.62-1.757.945-.6 1.717-1.227 1.717-1.394 0-.56-1.374-.649-2.908-.188-2.418.727-2.814.047-.692-1.187m18.425-.184c.235-.436.645-.626 1.093-.614.748.02 1.604.604 1.939 1.556.428 1.22-.008 2.363-1.05 2.757-.505.19-.724.29-.92.258s-.37-.192-.778-.52c-.762-.612-.604-1.275.303-1.275.31 0 .71-.177.89-.393.453-.541-.057-1.278-.712-1.029-.775.295-1.135-.054-.765-.74m-7.808.75q.355-.065.697-.057c1.597.037 2.946 1.232 3.188 2.948.064.456.537.956 1.312 1.386 1.016.563 1.227.851 1.306 1.778.076.897-.064 1.228-.737 1.753-1.102.86-2.993.869-3.852.016-.95-.942-.6-1.373 1.029-1.27.774.05 1.493-.047 1.597-.214.228-.367-.954-1.05-1.372-.793-.163.1-.593.023-.956-.17-.55-.292-.634-.547-.501-1.526.3-2.217-1.692-2.867-3.625-1.182-1 .871-1.09.897-1.09.317 0-1.016 1.746-2.752 3.004-2.986\"\n      clipRule=\"evenodd\"\n    />\n  </Svg>\n);\nexport default TeacherIllustration;"
  },
  {
    "path": "app/(onboarding)/restaurants/_layout.tsx",
    "content": "import React from 'react';\nimport { useTranslation } from \"react-i18next\";\n\nimport { Stack } from 'expo-router';\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport { Platform } from 'react-native';\n\nexport default function OnboardingLayout() {\n  const { t } = useTranslation();\n  const newScreenOptions = React.useMemo(() => ({\n    ...screenOptions,\n    headerShown: true,\n    headerBackVisible: Platform.select({ android: false, default: true }),\n    headerTransparent: true,\n    headerBackButtonDisplayMode: \"minimal\",\n    headerLargeTitle: false,\n  }), []);\n\n  return (\n    <Stack>\n      <Stack.Screen\n        name=\"method\"\n        options={{ ...newScreenOptions, headerTitle: \"\" }}\n      />\n      <Stack.Screen\n        name=\"turboself\"\n        options={{ ...newScreenOptions, headerTitle: t(\"ONBOARDING_SERVICE_TURBOSELF\") }}\n      />\n      <Stack.Screen\n        name=\"turboselfHost\"\n        options={{ ...newScreenOptions, headerTitle: t(\"ONBOARDING_SERVICE_TURBOSELF\") }}\n      />\n      <Stack.Screen\n        name=\"ard\"\n        options={{ ...newScreenOptions, headerTitle: t(\"ONBOARDING_SERVICE_ARD\") }}\n      />\n      <Stack.Screen\n        name=\"alise\"\n        options={{ ...newScreenOptions, headerTitle: t(\"ONBOARDING_SERVICE_ALISE\") }}\n      />\n      <Stack.Screen\n        name=\"izly\"\n        options={{ ...newScreenOptions, headerTitle: t(\"ONBOARDING_SERVICE_IZLY\") }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/restaurants/alise.tsx",
    "content": "import { router, useLocalSearchParams } from \"expo-router\";\nimport LottieView from \"lottie-react-native\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { Keyboard, KeyboardAvoidingView, View } from \"react-native\";\nimport Reanimated, { useSharedValue, withTiming } from \"react-native-reanimated\";\n\nimport { useAccountStore } from \"@/stores/account\";\nimport { Services } from \"@/stores/account/types\";\nimport Button from \"@/ui/components/Button\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport uuid from \"@/utils/uuid/uuid\";\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport { t } from \"i18next\";\nimport OnboardingInput from \"@/components/onboarding/OnboardingInput\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { Alise } from \"@/services/alise\";\nimport { authenticateWithCredentials } from \"alise-api\";\nimport { initializeAccountManager } from \"@/services/shared\";\n\nconst ANIMATION_DURATION = 100;\n\nexport default function AliseLoginWithCredentials() {\n  const insets = useSafeAreaInsets();\n  const theme = useTheme();\n\n  const [username, setUsername] = useState<string>(\"\");\n  const [password, setPassword] = useState<string>(\"\");\n  const [siteId, setSiteId] = useState<string>(\"\");\n  const params = useLocalSearchParams();\n  const action = String(params.action);\n\n  const opacity = useSharedValue(1);\n  const scale = useSharedValue(1);\n  const alert = useAlert();\n\n  const keyboardListeners = useMemo(() => ({\n    show: () => {\n      \"worklet\";\n      opacity.value = withTiming(0, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });\n    },\n    hide: () => {\n      \"worklet\";\n      opacity.value = withTiming(1, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(1, { duration: ANIMATION_DURATION });\n    },\n  }), [opacity]);\n\n  useEffect(() => {\n    const showSub = Keyboard.addListener(\"keyboardWillShow\", keyboardListeners.show);\n    const hideSub = Keyboard.addListener(\"keyboardWillHide\", keyboardListeners.hide);\n    return () => {\n      showSub.remove();\n      hideSub.remove();\n    };\n  }, [keyboardListeners]);\n\n  const loginAlise = async () => {\n    try {\n      const accountId = uuid();\n      const store = useAccountStore.getState();\n\n      const client = await authenticateWithCredentials(username, password, siteId);\n\n      const alise = new Alise(accountId);\n      const auth = {\n        additionals: {\n          username,\n          password,\n          site: siteId\n        }\n      };\n\n      alise.session = client;\n      alise.authData = auth;\n\n      const service = {\n        id: accountId,\n        auth,\n        serviceId: Services.ALISE,\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString(),\n      };\n      if (action === \"addService\") {\n        store.addServiceToAccount(store.lastUsedAccount, service);\n        await initializeAccountManager()\n        router.back();\n        return router.back();\n      }\n      store.addAccount({\n        id: accountId,\n        firstName: client.account?.firstName || \"\",\n        lastName: client.account?.lastName || \"\",\n        schoolName: client.account?.establishment || \"\",\n        services: [service],\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString(),\n      });\n      store.setLastUsedAccount(accountId);\n      return router.push({\n        pathname: \"../end/color\",\n        params: { accountId },\n      });\n    } catch (error) {\n      alert.showAlert({\n        title: t(\"Alert_Auth_Error\"),\n        description: t(\"ONBOARDING_ALERT_ALISE_LOGIN_ABORTED\"),\n        icon: \"AlertTriangle\",\n        color: \"#D60046\",\n        technical: String(error),\n        withoutNavbar: true,\n      });\n    }\n  };\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1, marginBottom: insets.bottom }} behavior=\"padding\">\n      <View style={{\n        alignItems: \"center\",\n        justifyContent: \"flex-end\",\n        borderBottomLeftRadius: 42,\n        borderBottomRightRadius: 42,\n        padding: 20,\n        paddingTop: insets.top + 20,\n        paddingBottom: 34,\n        borderCurve: \"continuous\",\n        flex: 1,\n        backgroundColor: \"#275F8A\",\n      }}>\n        <Reanimated.View style={{\n          flex: 1,\n          marginBottom: 16,\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          opacity: opacity,\n          transform: [{ scale: scale }],\n        }}>\n          <LottieView\n            autoPlay\n            loop={false}\n            style={{ width: 230, height: 230 }}\n            source={require(\"@/assets/lotties/alise.json\")}\n          />\n        </Reanimated.View>\n        <Reanimated.View style={{\n          width: \"100%\",\n          gap: 12,\n          opacity: opacity,\n          transform: [{ scale: scale }],\n        }}>\n          <Stack direction=\"horizontal\">\n            <Typography variant=\"h5\" style={{ color: \"#FFF\", lineHeight: 22, fontSize: 18 }}>\n              {t(\"STEP\")} 2\n            </Typography>\n            <Typography variant=\"h5\" style={{ color: \"#FFFFFF90\", lineHeight: 22, fontSize: 18 }}>\n              {t(\"STEP_OUTOF\")} 3\n            </Typography>\n          </Stack>\n          <Typography variant=\"h1\" style={{ color: \"#FFF\", fontSize: 32, lineHeight: 34 }}>\n            {t(\"ONBOARDING_LOGIN_CREDENTIALS\")} Alise\n          </Typography>\n        </Reanimated.View>\n      </View>\n      <Stack padding={20} gap={10}>\n        <OnboardingInput\n          icon={\"Link\"}\n          placeholder={t(\"INPUT_ETABID\")}\n          text={siteId}\n          setText={setSiteId}\n          isPassword={false}\n          keyboardType={\"default\"}\n          inputProps={{\n            autoCapitalize: \"none\",\n            autoCorrect: false,\n            spellCheck: false,\n          }}\n        />\n        <OnboardingInput\n          icon={\"User\"}\n          placeholder={t(\"INPUT_USERNAME\")}\n          text={username}\n          setText={setUsername}\n          isPassword={false}\n          keyboardType={\"default\"}\n          inputProps={{\n            autoCapitalize: \"none\",\n            autoCorrect: false,\n            spellCheck: false,\n            textContentType: \"username\",\n          }}\n        />\n        <OnboardingInput\n          icon={\"Lock\"}\n          placeholder={t(\"INPUT_PASSWORD\")}\n          text={password}\n          setText={setPassword}\n          isPassword={true}\n          keyboardType={\"default\"}\n          inputProps={{\n            autoCapitalize: \"none\",\n            autoCorrect: false,\n            spellCheck: false,\n            textContentType: \"password\",\n            onSubmitEditing: () => {\n              Keyboard.dismiss();\n              loginAlise();\n            },\n            returnKeyType: \"done\",\n          }}\n        />\n        <Button\n          title={t(\"LOGIN_BTN\")}\n          style={{ backgroundColor: theme.dark ? theme.colors.border : \"black\" }}\n          size=\"large\"\n          disableAnimation\n          onPress={loginAlise}\n        />\n      </Stack>\n    </KeyboardAvoidingView>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/restaurants/ard.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-require-imports */\nimport { useTheme } from \"@react-navigation/native\";\nimport { router, useLocalSearchParams, useNavigation } from \"expo-router\";\nimport { t } from \"i18next\";\nimport LottieView from \"lottie-react-native\";\n// import { Authenticator } from \"pawrd\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { Alert, Keyboard, KeyboardAvoidingView, ScrollView, View } from \"react-native\";\nimport Reanimated, {\n  useSharedValue,\n  withTiming,\n} from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport OnboardingInput from \"@/components/onboarding/OnboardingInput\";\nimport { fetchARDHistory } from \"@/services/ard/history\";\nimport { initializeAccountManager } from \"@/services/shared\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { Services } from \"@/stores/account/types\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport Button from \"@/ui/components/Button\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport { detectMealPrice } from \"@/utils/restaurant/detect-price\";\nimport uuid from \"@/utils/uuid/uuid\";\nimport LoginView from \"../components/LoginView\";\n\nconst ANIMATION_DURATION = 100;\n\nexport default function TurboSelfLoginWithCredentials() {\n  const insets = useSafeAreaInsets();\n  const theme = useTheme();\n  const navigation = useNavigation();\n\n  const [username, setUsername] = useState<string>(\"\");\n  const [password, setPassword] = useState<string>(\"\");\n  const [siteId, setSiteId] = useState<string>(\"\");\n  const [isLoggingIn, setIsLoggingIn] = useState<boolean>(false);\n  const params = useLocalSearchParams();\n  const action = String(params.action);\n\n  const opacity = useSharedValue(1);\n  const scale = useSharedValue(1);\n  const alert = useAlert();\n\n  const keyboardListeners = useMemo(() => ({\n    show: () => {\n      \"worklet\";\n      opacity.value = withTiming(0, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });\n    },\n    hide: () => {\n      \"worklet\";\n      opacity.value = withTiming(1, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(1, { duration: ANIMATION_DURATION });\n    },\n  }), [opacity]);\n\n  useEffect(() => {\n    const showSub = Keyboard.addListener(\"keyboardWillShow\", keyboardListeners.show);\n    const hideSub = Keyboard.addListener(\"keyboardWillHide\", keyboardListeners.hide);\n\n    return () => {\n      showSub.remove();\n      hideSub.remove();\n    };\n  }, [keyboardListeners]);\n\n  const loginARD = async () => {\n    try {\n      throw new Error(\"ARD service is currently unavailable\");\n      setIsLoggingIn(true);\n      const authenticator = new Authenticator();\n      // ARD require 2 connections, WHY ?\n      const authentification = await authenticator.fromCredentials(siteId, username, password);\n      const accountId = uuid();\n      const store = useAccountStore.getState();\n\n      const history = await fetchARDHistory(authentification, \"\")\n      const mealPrice = detectMealPrice(history)\n\n      const service = {\n        id: accountId,\n        auth: {\n          additionals: {\n            schoolId: siteId,\n            password,\n            username,\n            mealPrice: String(mealPrice)\n          },\n        },\n        serviceId: Services.ARD,\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString(),\n      };\n        setIsLoggingIn(false);\n\n      if (action === \"addService\") {\n        store.addServiceToAccount(store.lastUsedAccount, service);\n        await initializeAccountManager()\n         const parent = navigation.getParent();\n                if (parent) {\n                  parent.goBack();\n                  \n                  const parentsParent = parent.getParent();\n                  if (parentsParent) {\n                    parentsParent.goBack();\n                  }\n                }\n        \n                router.back();\n                router.dismissAll();\n      }\n\n      store.addAccount({\n        id: accountId,\n        firstName: \"\",\n        lastName: \"\",\n        schoolName: authentification.schoolName,\n        services: [service],\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString(),\n      });\n\n      store.setLastUsedAccount(accountId);\n       const parent = navigation.getParent();\n              if (parent) {\n                parent.goBack();\n                \n                const parentsParent = parent.getParent();\n                if (parentsParent) {\n                  parentsParent.goBack();\n                }\n              }\n      \n              router.back();\n              router.dismissAll();\n              return router.push(\"/\");\n    } catch (error) {\n        setIsLoggingIn(false);\n      Alert.alert(t(\"Alert_Auth_Error\"), t(\"ONBOARDING_ALERT_LOGIN_ABORTED\"));\n    }\n  };\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1 }} behavior=\"padding\" keyboardVerticalOffset={32}>\n      <ScrollView contentContainerStyle={{ paddingTop: insets.top, paddingBottom: insets.bottom }}>\n        <LoginView\n          color=\"#00b7cf\"\n          serviceName=\"ARD\"\n          fields={[\n            {\n              name: \"siteId\",\n              placeholder: t(\"INPUT_ETABID\"),\n              secureTextEntry: false\n            },\n            {\n              name: \"username\",\n              placeholder: t(\"INPUT_USERNAME\"),\n              secureTextEntry: false,\n              textContentType: \"username\"\n            },\n            {\n              name: \"password\",\n              placeholder: t(\"INPUT_PASSWORD\"),\n              secureTextEntry: true,\n              textContentType: \"password\"\n            }\n          ]}\n          serviceIcon={require('@/assets/images/ard.png')}\n          loading={isLoggingIn}\n          onSubmit={(values) => {\n            if (!isLoggingIn && values.username && values.password) {\n              setPassword(values.password);\n              setUsername(values.username);\n              setSiteId(values.siteId);\n              loginARD();\n            }\n          }}\n        />\n      </ScrollView>\n    </KeyboardAvoidingView>\n  );\n\n  return (\n    <KeyboardAvoidingView\n      style={{ flex: 1, marginBottom: insets.bottom }}\n      behavior=\"padding\"\n    >\n      <View\n        style={{\n          alignItems: \"center\",\n          justifyContent: \"flex-end\",\n          borderBottomLeftRadius: 42,\n          borderBottomRightRadius: 42,\n          padding: 20,\n          paddingTop: insets.top + 20,\n          paddingBottom: 34,\n          borderCurve: \"continuous\",\n          flex: 1,\n          backgroundColor: \"#275F8A\",\n        }}\n      >\n        <Reanimated.View\n          style={{\n            flex: 1,\n            marginBottom: 16,\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            opacity: opacity,\n            transform: [{ scale: scale }],\n          }}\n        >\n          <LottieView\n            autoPlay\n            loop={false}\n            style={{ width: 230, height: 230 }}\n            source={require(\"@/assets/lotties/ard.json\")}\n          />\n        </Reanimated.View>\n        <Reanimated.View\n          style={{\n            width: \"100%\",\n            gap: 12,\n            opacity: opacity,\n            transform: [{ scale: scale }],\n          }}\n        >\n          <Stack\n            direction=\"horizontal\"\n          >\n            <Typography\n              variant=\"h5\"\n              style={{ color: \"#FFF\", lineHeight: 22, fontSize: 18 }}\n            >\n              {t(\"STEP\")} 2\n            </Typography>\n            <Typography\n              variant=\"h5\"\n              style={{ color: \"#FFFFFF90\", lineHeight: 22, fontSize: 18 }}\n            >\n              {t(\"STEP_OUTOF\")} 3\n            </Typography>\n          </Stack>\n          <Typography\n            variant=\"h1\"\n            style={{ color: \"#FFF\", fontSize: 32, lineHeight: 34 }}\n          >\n            {t(\"ONBOARDING_LOGIN_CREDENTIALS\")} ARD\n          </Typography>\n        </Reanimated.View>\n      </View>\n      <Stack padding={20}\n        gap={10}\n      >\n        <OnboardingInput\n          icon={\"Link\"}\n          placeholder={t(\"INPUT_ETABID\")}\n          text={siteId}\n          setText={setSiteId}\n          isPassword={false}\n          keyboardType={\"default\"}\n          inputProps={{\n            autoCapitalize: \"none\",\n            autoCorrect: false,\n            spellCheck: false,\n          }}\n        />\n        <OnboardingInput\n          icon={\"User\"}\n          placeholder={t(\"INPUT_USERNAME\")}\n          text={username}\n          setText={setUsername}\n          isPassword={false}\n          keyboardType={\"default\"}\n          inputProps={{\n            autoCapitalize: \"none\",\n            autoCorrect: false,\n            spellCheck: false,\n            textContentType: \"username\",\n          }}\n        />\n        <OnboardingInput\n          icon={\"Lock\"}\n          placeholder={t(\"INPUT_PASSWORD\")}\n          text={password}\n          setText={setPassword}\n          isPassword={true}\n          keyboardType={\"default\"}\n          inputProps={{\n            autoCapitalize: \"none\",\n            autoCorrect: false,\n            spellCheck: false,\n            textContentType: \"password\",\n            onSubmitEditing: () => {\n              Keyboard.dismiss();\n              // Trigger login\n              loginARD();\n            },\n            returnKeyType: \"done\",\n          }}\n        />\n        <Button\n          title={t(\"LOGIN_BTN\")}\n          style={{\n            backgroundColor: theme.dark ? theme.colors.border : \"black\",\n          }}\n          size=\"large\"\n          disableAnimation\n          onPress={loginARD}\n        />\n      </Stack>\n    </KeyboardAvoidingView>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/restaurants/izly.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-require-imports */\nimport { useTheme } from \"@react-navigation/native\";\nimport { router, useLocalSearchParams, useNavigation } from \"expo-router\";\nimport { login, tokenize } from \"ezly\";\nimport LottieView from \"lottie-react-native\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n  ActivityIndicator,\n  Alert,\n  Keyboard,\n  KeyboardAvoidingView,\n  Linking,\n  ScrollView,\n  View,\n} from \"react-native\";\nimport Reanimated, {\n  useSharedValue,\n  withTiming,\n} from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport OnboardingInput from \"@/components/onboarding/OnboardingInput\";\nimport { initializeAccountManager } from \"@/services/shared\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { ServiceAccount, Services } from \"@/stores/account/types\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport Button from \"@/ui/components/Button\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport { log } from \"@/utils/logger/logger\";\nimport uuid from \"@/utils/uuid/uuid\";\nimport LoginView from \"../components/LoginView\";\n\nconst ANIMATION_DURATION = 100;\n\nexport default function TurboSelfLoginWithCredentials() {\n  const insets = useSafeAreaInsets();\n  const theme = useTheme();\n  const navigation = useNavigation();\n\n  const [username, setUsername] = useState<string>(\"\");\n  const [password, setPassword] = useState<string>(\"\");\n  const [linkSended, setLinkSended] = useState<boolean>(false);\n  const [isLoggingIn, setIsLoggingIn] = useState<boolean>(false);\n\n  const params = useLocalSearchParams();\n  const action = String(params.action);\n\n  const opacity = useSharedValue(1);\n  const scale = useSharedValue(1);\n\n  const keyboardListeners = useMemo(() => ({\n    show: () => {\n      \"worklet\";\n      opacity.value = withTiming(0, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });\n    },\n    hide: () => {\n      \"worklet\";\n      opacity.value = withTiming(1, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(1, { duration: ANIMATION_DURATION });\n    },\n  }), [opacity]);\n\n  useEffect(() => {\n    const showSub = Keyboard.addListener(\"keyboardWillShow\", keyboardListeners.show);\n    const hideSub = Keyboard.addListener(\"keyboardWillHide\", keyboardListeners.hide);\n\n    return () => {\n      showSub.remove();\n      hideSub.remove();\n    };\n  }, [keyboardListeners]);\n\n  const { t } = useTranslation();\n  const alert = useAlert();\n\n  const handleActivation = useCallback(async (url: string) => {\n    const id = uuid();\n    const { identification, profile } = await tokenize(url);\n    const service: ServiceAccount = {\n      id,\n      auth: {\n        session: identification,\n        additionals: {\n          secret: password,\n        },\n      },\n      serviceId: Services.IZLY,\n      createdAt: (new Date()).toISOString(),\n      updatedAt: (new Date()).toISOString(),\n    };\n\n    const store = useAccountStore.getState();\n\n    if (action === \"addService\") {\n      store.addServiceToAccount(store.lastUsedAccount, service);\n      await initializeAccountManager()\n      const parent = navigation.getParent();\n            if (parent) {\n              parent.goBack();\n              \n              const parentsParent = parent.getParent();\n              if (parentsParent) {\n                parentsParent.goBack();\n              }\n            }\n    \n            router.back();\n            router.dismissAll();\n    }\n\n    store.addAccount({\n      id,\n      firstName: profile.firstName,\n      lastName: profile.lastName,\n      services: [service],\n      createdAt: (new Date()).toISOString(),\n      updatedAt: (new Date()).toISOString(),\n    });\n    store.setLastUsedAccount(id);\n\n     const parent = navigation.getParent();\n            if (parent) {\n              parent.goBack();\n              \n              const parentsParent = parent.getParent();\n              if (parentsParent) {\n                parentsParent.goBack();\n              }\n            }\n    \n            router.back();\n            router.dismissAll();\n            return router.push('/')\n  }, [password, action]);\n\n  useEffect(() => {\n    const handleDeepLink = (event: { url: string }) => {\n      const url = event.url;\n      const scheme = url.split(\":\")[0];\n      if (scheme === \"izly\") {\n        log(\"[IzlyActivation] Activation link received:\", url);\n        handleActivation(url);\n      } else {\n        log(\"[IzlyActivation] Ignoring link:\", url);\n      }\n    };\n\n    Linking.getInitialURL().then((url) => {\n      if (url) {\n        handleDeepLink({ url });\n      }\n    });\n\n    const listener = Linking.addEventListener(\"url\", handleDeepLink);\n\n    return () => {\n      listener?.remove();\n    };\n  }, [handleActivation]);\n\n  async function handleLogin(username: string, password: string) {\n    try {\n      setIsLoggingIn(true);\n      await login(username, password)\n      setIsLoggingIn(false);\n      setLinkSended(true);\n      Alert.alert(t(\"ONBOARDING_SMS_SENT_TITLE\"), t(\"ONBOARDING_IZLY_SMS_SENT_DESCRIPTION\"));\n    } catch (error) {\n      setIsLoggingIn(false);\n      Alert.alert(t(\"Alert_Auth_Error\"), t(\"ONBOARDING_ALERT_LOGIN_ABORTED\"));\n    }\n  }\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1 }} behavior=\"padding\" keyboardVerticalOffset={32}>\n      <ScrollView contentContainerStyle={{ paddingTop: insets.top, paddingBottom: insets.bottom }}>\n        <LoginView\n          color=\"#00b7cf\"\n          serviceName=\"Izly\"\n          fields={[\n            {\n              name: \"username\",\n              placeholder: t(\"INPUT_PHONE_OR_MAIL\"),\n              secureTextEntry: false,\n              textContentType: \"username\",\n              keyboardType: \"email-address\",\n            },\n            {\n              name: \"password\",\n              placeholder: t(\"INPUT_PASSWORD_CODE\"),\n              secureTextEntry: true,\n              textContentType: \"password\",\n              keyboardType: \"number-pad\",\n            }\n          ]}\n          serviceIcon={require('@/assets/images/izly.png')}\n          loading={isLoggingIn}\n          onSubmit={(values) => {\n            if (!isLoggingIn && values.username && values.password) {\n              handleLogin(values.username, values.password);\n            }\n          }}\n        />\n      </ScrollView>\n    </KeyboardAvoidingView>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/restaurants/method.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport { useRoute, useTheme } from \"@react-navigation/native\";\nimport { useRouter } from \"expo-router\";\nimport React, { useMemo, useState } from \"react\";\nimport { Image, ScrollView, View } from \"react-native\";\nimport { useTranslation } from \"react-i18next\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport Button from \"@/ui/new/Button\";\nimport Divider from \"@/ui/new/Divider\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport { PapillonZoomIn, PapillonZoomOut } from \"@/ui/utils/Transition\";\nimport adjust from \"@/utils/adjustColor\";\n\nimport { GetSupportedServices } from './utils/constants';\nimport { GetSupportedRestaurants } from \"../utils/constants\";\n\nexport default function ServiceSelection() {\n  const headerHeight = useHeaderHeight();\n  const theme = useTheme();\n  const { colors } = theme;\n  const insets = useSafeAreaInsets();\n  const router = useRouter();\n  const { t } = useTranslation();\n\n  const { params } = useRoute();\n  const { type } = params;\n\n  const [selectedService, setSelectedService] = useState(null);\n\n  const services = GetSupportedRestaurants((path: { pathname: string }) => {\n    router.push({\n      pathname: path.pathname as unknown as RelativePathString,\n      params: path.options ?? {} as unknown as UnknownInputParams\n    });\n  });\n\n  const filteredServices = services;\n\n  const titleString = t(\"ONBOARDING_RESTAURANT_SELECTION_TITLE\");\n\n  const hasServiceRoute = services.find(service => service.name === selectedService)?.route || services.find(service => service.name === selectedService)?.onPress;\n\n  const loginToService = (serviceName: string) => {\n    const serviceRoute = services.find(service => service.name === serviceName)?.route;\n    if(!serviceRoute) {\n      services.find(service => service.name === serviceName)?.onPress();\n      return;\n    }\n    const newRoute = './services/' + serviceRoute;\n    router.push(newRoute);\n  };\n\n  return (\n    <View style={{ flex: 1 }}>\n      <List\n        ListHeaderComponent={() => (\n          <Stack padding={[4, 0]}>\n            <Typography variant=\"h2\">{titleString}</Typography>\n            <Typography variant=\"action\" color=\"textSecondary\">{t(\"ONBOARDING_SERVICE_SELECTION_DESCRIPTION\")}</Typography>\n            <Divider height={18} ghost />\n          </Stack>\n        )}\n        contentContainerStyle={{\n          padding: 16,\n          flexGrow: 1,\n          gap: 10,\n          paddingTop: headerHeight + 20\n        }}\n        style={{ flex: 1 }}\n      >\n        {filteredServices.map((app) => (\n          <List.Item key={app.name} onPress={() => setSelectedService(app.name)} style={{\n            backgroundColor: selectedService === app.name ? adjust(colors.primary, theme.dark ? -0.8 : 0.9) : colors.card,\n            minHeight: 62\n          }}>\n            <List.Leading>\n              <Stack animated direction=\"horizontal\" hAlign=\"center\" gap={12}>\n                {selectedService === app.name && <Dynamic animated entering={PapillonZoomIn} exiting={PapillonZoomOut}><Icon fill={colors.primary}><Papicons name=\"check\" /></Icon></Dynamic>}\n\n                <Dynamic animated>\n                  <Image source={app.image} style={{ width: 32, height: 32, borderRadius: 10 }} />\n                </Dynamic>\n              </Stack>\n            </List.Leading>\n            <Dynamic animated><Typography variant=\"action\">{app.title}</Typography></Dynamic>\n          </List.Item>\n        ))}\n      </List>\n\n      <View\n        style={{\n          padding: 20,\n          paddingBottom: insets.bottom + 20,\n          borderTopColor: colors.border,\n          borderTopWidth: 1,\n          backgroundColor: colors.background,\n          flexDirection: \"column\",\n          gap: 8\n        }}\n      >\n        <Button\n          label={t(\"ONBOARDING_CONTINUE\")}\n          onPress={() => { loginToService(selectedService) }}\n          disabled={!selectedService || !hasServiceRoute}\n        />\n        <Button\n          label={t(\"ONBOARDING_CANCEL\")}\n          onPress={() => { router.back() }}\n          variant=\"secondary\"\n        />\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/restaurants/turboself.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-require-imports */\nimport { useTheme } from \"@react-navigation/native\";\nimport { router, useLocalSearchParams, useNavigation } from 'expo-router';\nimport LottieView from 'lottie-react-native';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert, Keyboard, KeyboardAvoidingView, ScrollView, View } from \"react-native\";\nimport Reanimated, {\n  useSharedValue,\n  withTiming\n} from 'react-native-reanimated';\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { authenticateWithCredentials } from 'turboself-api'\n\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport OnboardingInput from \"@/components/onboarding/OnboardingInput\";\nimport { initializeAccountManager } from \"@/services/shared\";\nimport { useAccountStore } from '@/stores/account';\nimport { Services } from '@/stores/account/types';\nimport { useAlert } from '@/ui/components/AlertProvider';\nimport Button from '@/ui/components/Button';\nimport Stack from '@/ui/components/Stack';\nimport Typography from '@/ui/components/Typography';\nimport uuid from '@/utils/uuid/uuid';\nimport LoginView from \"../components/LoginView\";\n\nconst ANIMATION_DURATION = 100;\n\nexport default function TurboSelfLoginWithCredentials() {\n  const theme = useTheme();\n  const insets = useSafeAreaInsets();\n  const { t } = useTranslation();\n  const navigation = useNavigation();\n\n  const [username, setUsername] = useState<string>(\"\")\n  const [password, setPassword] = useState<string>(\"\");\n  const [isLoggingIn, setIsLoggingIn] = useState<boolean>(false);\n  const params = useLocalSearchParams();\n  const action = String(params.action);\n\n  const opacity = useSharedValue(1);\n  const alert = useAlert();\n  const scale = useSharedValue(1);\n\n  const keyboardListeners = useMemo(() => ({\n    show: () => {\n      \"worklet\";\n      opacity.value = withTiming(0, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });\n    },\n    hide: () => {\n      \"worklet\";\n      opacity.value = withTiming(1, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(1, { duration: ANIMATION_DURATION });\n    },\n  }), [opacity]);\n\n  useEffect(() => {\n    const showSub = Keyboard.addListener(\"keyboardWillShow\", keyboardListeners.show);\n    const hideSub = Keyboard.addListener(\"keyboardWillHide\", keyboardListeners.hide);\n\n    return () => {\n      showSub.remove();\n      hideSub.remove();\n    };\n  }, [keyboardListeners]);\n\n  const loginTurboself = async () => {\n    try {\n      setIsLoggingIn(true);\n      const authentification = await authenticateWithCredentials(username, password, true, false)\n      const siblings = await authentification.getSiblings();\n      if (siblings.length === 0) {\n        const accountId = uuid()\n        const store = useAccountStore.getState()\n        const service = {\n          id: accountId,\n          auth: {\n            additionals: {\n              username,\n              password,\n              \"hoteId\": authentification.host?.id ?? \"N/A\"\n            }\n          },\n          serviceId: Services.TURBOSELF,\n          createdAt: (new Date()).toISOString(),\n          updatedAt: (new Date()).toISOString()\n        }\n\n        if (action === \"addService\") {\n          store.addServiceToAccount(store.lastUsedAccount, service)\n          await initializeAccountManager()\n          router.back();\n          router.back();\n          return router.back();\n        }\n\n        store.addAccount({\n          id: accountId,\n          firstName: authentification.host?.firstName ?? \"N/A\",\n          lastName: authentification.host?.lastName ?? \"N/A\",\n          schoolName: authentification.establishment?.name,\n          className: authentification.host?.division,\n          services: [service],\n          createdAt: (new Date()).toISOString(),\n          updatedAt: (new Date()).toISOString()\n        })\n\n        store.setLastUsedAccount(accountId)\n        setIsLoggingIn(false);\n        const parent = navigation.getParent();\n        if (parent) {\n          parent.goBack();\n          \n          const parentsParent = parent.getParent();\n          if (parentsParent) {\n            parentsParent.goBack();\n          }\n        }\n\n        router.back();\n        router.dismissAll();\n      }\n      setIsLoggingIn(false);\n\n      const global = [authentification.host, ...siblings].flat()\n      return router.push({\n        pathname: \"/(onboarding)/restaurants/turboselfHost\",\n        params: {\n          siblings: JSON.stringify(global),\n          username,\n          password\n        }\n      });\n    } catch (error) {\n      setIsLoggingIn(false);\n      Alert.alert(t(\"Alert_Auth_Error\"), t(\"ONBOARDING_ALERT_BAD_CREDENTIALS_TURBOSELF\"));\n    }\n  }\n\n  return (\n      <KeyboardAvoidingView style={{ flex: 1 }} behavior=\"padding\" keyboardVerticalOffset={32}>\n        <ScrollView contentContainerStyle={{ paddingTop: insets.top, paddingBottom: insets.bottom }}>\n          <LoginView\n            color=\"#cf0000\"\n            serviceName=\"TurboSelf\"\n            serviceIcon={require('@/assets/images/turboself.png')}\n            loading={isLoggingIn}\n            onSubmit={(values) => {\n              if (!isLoggingIn && values.username && values.password) {\n                setPassword(values.password);\n                setUsername(values.username);\n                loginTurboself();\n              }\n            }}\n          />\n        </ScrollView>\n      </KeyboardAvoidingView>\n    );\n}\n"
  },
  {
    "path": "app/(onboarding)/restaurants/turboselfHost.tsx",
    "content": "import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { StyleSheet, Pressable, TextInput, Keyboard, View, FlatList } from 'react-native';\nimport { router, useFocusEffect, useLocalSearchParams } from 'expo-router';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport LottieView from 'lottie-react-native';\n\nimport Typography from '@/ui/components/Typography';\nimport Stack from '@/ui/components/Stack';\n\nimport { Papicons } from '@getpapillon/papicons';\nimport { authenticateWithCredentials, Host } from 'turboself-api'\nimport Icon from '@/ui/components/Icon';\nimport ViewContainer from '@/ui/components/ViewContainer';\nimport Reanimated, {\n  Extrapolate,\n  interpolate,\n  useAnimatedStyle,\n  useSharedValue,\n  withTiming\n} from 'react-native-reanimated';\nimport Button from '@/ui/components/Button';\nimport uuid from '@/utils/uuid/uuid';\nimport { useAccountStore } from '@/stores/account';\nimport { Services } from '@/stores/account/types';\nimport { useTheme } from '@react-navigation/native';\nimport AnimatedPressable from '@/ui/components/AnimatedPressable';\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport { useTranslation } from 'react-i18next';\n\nconst INITIAL_HEIGHT = 570;\nconst COLLAPSED_HEIGHT = 270;\n\nconst staticStyles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n  pressableContainer: {\n    flex: 1,\n  },\n  stackContainer: {\n    alignItems: 'center',\n    justifyContent: 'flex-end',\n    borderBottomLeftRadius: 42,\n    borderBottomRightRadius: 42,\n    paddingBottom: 34,\n    borderCurve: \"continuous\",\n    height: \"100%\",\n  },\n  backButton: {\n    position: 'absolute',\n    left: 16,\n    zIndex: 200,\n    backgroundColor: '#ffffff42',\n    padding: 10,\n    borderRadius: 100,\n  },\n  inputContainer: {\n    flex: 1,\n    padding: 20,\n    backgroundColor: \"#F2F2F2\",\n    borderRadius: 300,\n    borderWidth: 1,\n    borderColor: \"#0000001F\",\n  },\n  textInput: {\n    color: \"#5B5B5B\",\n    fontSize: 18,\n    fontWeight: \"600\",\n    flex: 1,\n  },\n  iconBackground: {\n    backgroundColor: \"transparent\",\n  },\n});\n\nexport default function TurboSelfSelectHost() {\n  const insets = useSafeAreaInsets();\n  const animation = React.useRef<LottieView>(null);\n\n  const search = useLocalSearchParams();\n  const height = useSharedValue(INITIAL_HEIGHT);\n\n  const siblings = useMemo(() => {\n    const parsedRef = Array.isArray(search.siblings)\n      ? search.siblings\n      : typeof search.siblings === \"string\"\n        ? JSON.parse(search.siblings)\n        : [];\n\n    return parsedRef.map(\n      (sibling: any) =>\n        new Host(\n          sibling.id,\n          sibling.localId,\n          sibling.etabId,\n          sibling.firstName,\n          sibling.lastName,\n          sibling.mode,\n          sibling.quality,\n          sibling.division,\n          sibling.lunchPrice,\n          sibling.type,\n          sibling.cardNumber,\n          sibling.cafeteriaUrl,\n          sibling.premissions\n        )\n    );\n  }, [search.siblings]);\n\n  const AnimatedHeaderStyle = useAnimatedStyle(() => {\n    'worklet';\n    const heightDiff = height.value - COLLAPSED_HEIGHT;\n\n    return {\n      maxHeight: interpolate(\n        0,\n        [0, heightDiff],\n        [height.value, COLLAPSED_HEIGHT],\n        Extrapolate.CLAMP\n      ),\n      height: height.value,\n      position: \"absolute\",\n      top: 0,\n      left: 0,\n      right: 0,\n      zIndex: 2,\n    };\n  }, []);\n\n  const AnimatedInputContainerStyle = useAnimatedStyle(() => {\n    'worklet';\n    return {\n      paddingTop: height.value + 16,\n      paddingHorizontal: 21,\n      gap: 9\n    };\n  }, []);\n\n  const animationCallback = useCallback(() => {\n    if (animation.current) {\n      animation.current.reset();\n      animation.current.play();\n    }\n  }, []);\n\n  useFocusEffect(animationCallback);\n\n  const AnimatedLottieContainerStyle = useAnimatedStyle(() => {\n    'worklet';\n    return {\n      shadowColor: \"#000\",\n      shadowOffset: { width: 0, height: 4 },\n      shadowOpacity: 0.25,\n      shadowRadius: 4,\n      elevation: 4,\n      paddingBottom: 20\n    };\n  }, []);\n\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const { t } = useTranslation();\n\n  return (\n    <Pressable style={staticStyles.pressableContainer} onPress={Keyboard.dismiss}>\n      <ViewContainer>\n        <Reanimated.View style={AnimatedHeaderStyle}>\n          <Stack\n            padding={32}\n            backgroundColor={'#E70026'}\n            gap={20}\n            style={staticStyles.stackContainer}\n          >\n            <Reanimated.View style={AnimatedLottieContainerStyle}>\n              <LottieView\n                autoPlay\n                loop={false}\n                style={{ width: 230, height: 230 }}\n                source={require('@/assets/lotties/turboself.json')}\n              />\n            </Reanimated.View>\n            <Stack\n              vAlign='start'\n              hAlign='start'\n              width=\"100%\"\n              gap={12}\n            >\n              <Stack flex direction=\"horizontal\">\n                <Typography\n                  variant=\"h5\"\n                  style={{ color: \"white\", lineHeight: 22, fontSize: 18 }}\n                >\n                  {t(\"STEP\")} 3\n                </Typography>\n                <Typography\n                  variant=\"h5\"\n                  style={{ color: \"#FFFFFFA6\", lineHeight: 22, fontSize: 18 }}\n                >\n                  {t(\"STEP_OUTOF\")} 3\n                </Typography>\n              </Stack>\n              <Typography\n                variant=\"h1\"\n                style={{ color: \"white\", fontSize: 32, lineHeight: 34 }}\n              >\n                {t(\"ONBOARDING_TURBOSELF_SELECTHOST\")}\n              </Typography>\n            </Stack>\n          </Stack>\n        </Reanimated.View>\n\n        <Reanimated.View style={[AnimatedInputContainerStyle, { gap: 10 }]}>\n          <FlatList\n            scrollEnabled={false}\n            data={siblings}\n            numColumns={2}\n            renderItem={({ item }) => (\n              <AnimatedPressable style={{ flex: 1 }} onPress={async () => {\n                const user = item as Host\n                const authentification = await authenticateWithCredentials(String(search.username), String(search.password), true, false, user.id)\n                const accountId = uuid()\n                const store = useAccountStore.getState()\n\n                store.addAccount({\n                  id: accountId,\n                  firstName: authentification.host?.firstName ?? \"N/A\",\n                  lastName: authentification.host?.lastName ?? \"N/A\",\n                  schoolName: authentification.establishment?.name,\n                  className: authentification.host?.division,\n                  services: [{\n                    id: accountId,\n                    auth: {\n                      additionals: {\n                        username: String(search.username),\n                        password: String(search.password),\n                        \"hoteId\": authentification.host?.id ?? \"N/A\"\n                      }\n                    },\n                    serviceId: Services.TURBOSELF,\n                    createdAt: (new Date()).toISOString(),\n                    updatedAt: (new Date()).toISOString()\n                  }],\n                  createdAt: (new Date()).toISOString(),\n                  updatedAt: (new Date()).toISOString()\n                })\n\n                store.setLastUsedAccount(accountId)\n                return router.push({\n                  pathname: \"../end/color\",\n                  params: {\n                    accountId\n                  }\n                });\n              }}>\n                <Stack\n                  hAlign=\"center\"\n                  style={{\n                    flex: 1,\n                    borderColor: colors.border,\n                    borderWidth: 1,\n                    padding: 15,\n                    borderRadius: 25,\n                    margin: 7.5,\n                  }}\n                >\n                  <Icon papicon opacity={0.6} style={{ marginLeft: 4 }}>\n                    <Papicons name={\"User\"} />\n                  </Icon>\n                  <Typography variant=\"body2\" nowrap ellipsizeMode=\"tail\">\n                    {`${(item as Host).lastName.toUpperCase()} ${(item as Host).firstName}`}\n                  </Typography>\n                </Stack>\n              </AnimatedPressable>\n            )}\n            keyExtractor={item => item.firstName}\n            showsHorizontalScrollIndicator={false}\n            contentContainerStyle={{ justifyContent: \"space-between\" }}\n          />\n        </Reanimated.View>\n      </ViewContainer >\n    </Pressable>\n  );\n}"
  },
  {
    "path": "app/(onboarding)/serviceSelection.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport { useRoute, useTheme } from \"@react-navigation/native\";\nimport { useRouter } from \"expo-router\";\nimport React, { useMemo, useState } from \"react\";\nimport { Image, ScrollView, View } from \"react-native\";\nimport { useTranslation } from \"react-i18next\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport Button from \"@/ui/new/Button\";\nimport Divider from \"@/ui/new/Divider\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport { PapillonZoomIn, PapillonZoomOut } from \"@/ui/utils/Transition\";\nimport adjust from \"@/utils/adjustColor\";\n\nimport { GetSupportedServices } from './utils/constants';\n\nexport default function ServiceSelection() {\n  const headerHeight = useHeaderHeight();\n  const theme = useTheme();\n  const { colors } = theme;\n  const insets = useSafeAreaInsets();\n  const router = useRouter();\n  const { t } = useTranslation();\n\n  const { params } = useRoute();\n  const { type } = params;\n\n  const [selectedService, setSelectedService] = useState(null);\n\n  const services = GetSupportedServices((path: { pathname: string, options?: UnknownInputParams }) => {\n    router.push({\n      pathname: path.pathname as unknown as RelativePathString,\n      params: path.options ?? {} as unknown as UnknownInputParams\n    });\n  });\n\n  const filteredServices = useMemo(() => {\n    return services.filter((service) => service.type.includes(type));\n  }, [services, type]);\n\n  const titleString = useMemo(() => {\n    switch (type) {\n    case \"univ\":\n      return t(\"ONBOARDING_SERVICE_SELECTION_TITLE_UNIV\");\n    default:\n      return t(\"ONBOARDING_SERVICE_SELECTION_TITLE_SCHOOL\");\n    }\n  }, [type, t]);\n\n\n  const hasServiceRoute = services.find(service => service.name === selectedService)?.route || services.find(service => service.name === selectedService)?.onPress;\n\n  const loginToService = (serviceName: string) => {\n    const serviceRoute = services.find(service => service.name === serviceName)?.route;\n    if(!serviceRoute) {\n      services.find(service => service.name === serviceName)?.onPress();\n      return;\n    }\n    const newRoute = './services/' + serviceRoute;\n    router.push(newRoute);\n  };\n\n  if (![\"school\", \"univ\"].includes(type)) {\n    return (\n      <ScrollView\n        contentContainerStyle={{\n          padding: 20,\n          flexGrow: 1,\n          gap: 10,\n          paddingTop: headerHeight + 32,\n          paddingBottom: insets.bottom + 20\n        }}\n      >\n        <Stack\n          vAlign=\"center\"\n          hAlign=\"center\"\n          gap={8}\n        >\n          <Image\n            source={require(\"@/assets/images/icon.png\")}\n            style={{ width: 86, height: 86, borderRadius: 24 }}\n          />\n          <Divider height={8} ghost />\n          <Typography variant=\"h3\" align=\"center\">{t(\"ONBOARDING_UNSUPPORTED_TITLE\")}</Typography>\n          <Typography align=\"center\" variant=\"body1\" color=\"textSecondary\">{t(\"ONBOARDING_UNSUPPORTED_DESCRIPTION\")}</Typography>\n          <Divider height={16} ghost />\n          <Button\n            label={t(\"Global_Back\")}\n            variant=\"secondary\"\n            onPress={() => {\n              router.back();\n            }}\n            fullWidth\n          />\n        </Stack>\n      </ScrollView>\n    )\n  }\n\n  return (\n    <View style={{ flex: 1 }}>\n      <List\n        ListHeaderComponent={() => (\n          <Stack padding={[4, 0]}>\n            <Typography variant=\"h2\">{titleString}</Typography>\n            <Typography variant=\"action\" color=\"textSecondary\">{t(\"ONBOARDING_SERVICE_SELECTION_DESCRIPTION\")}</Typography>\n            <Divider height={18} ghost />\n          </Stack>\n        )}\n        contentContainerStyle={{\n          padding: 16,\n          flexGrow: 1,\n          gap: 10,\n          paddingTop: headerHeight + 20\n        }}\n        style={{ flex: 1 }}\n      >\n        {filteredServices.map((app) => (\n          <List.Item key={app.name} onPress={() => setSelectedService(app.name)} style={{\n            backgroundColor: selectedService === app.name ? adjust(colors.tint, theme.dark ? -0.8 : 0.9) : colors.item,\n            minHeight: 62\n          }}>\n            <List.Leading>\n              <Stack animated direction=\"horizontal\" hAlign=\"center\" gap={12}>\n                {selectedService === app.name && <Dynamic animated entering={PapillonZoomIn} exiting={PapillonZoomOut}><Icon fill={colors.primary}><Papicons name=\"check\" /></Icon></Dynamic>}\n\n                <Dynamic animated>\n                  <Image source={app.image} style={{ width: 32, height: 32, borderRadius: 10 }} />\n                </Dynamic>\n              </Stack>\n            </List.Leading>\n            <Dynamic animated><Typography variant=\"action\">{app.title}</Typography></Dynamic>\n          </List.Item>\n        ))}\n      </List>\n\n      <View\n        style={{\n          padding: 20,\n          paddingBottom: insets.bottom + 20,\n          borderTopColor: colors.border,\n          borderTopWidth: 1,\n          backgroundColor: colors.background\n        }}\n      >\n        <Button\n          label={t(\"ONBOARDING_CONTINUE\")}\n          onPress={() => { loginToService(selectedService) }}\n          disabled={!selectedService || !hasServiceRoute}\n        />\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/appscho/_layout.tsx",
    "content": "import React from 'react';\n\nimport { Stack } from 'expo-router';\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport { Platform } from 'react-native';\nimport { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';\n\nexport default function OnboardingLayout() {\n  const newScreenOptions = React.useMemo(() => ({\n    ...screenOptions,\n    headerShown: false,\n    ...AndroidHeaderProps,\n    headerTransparent: true,\n    headerBackButtonDisplayMode: \"minimal\",\n    headerLargeTitle: false,\n  }), []);\n\n  return (\n    <Stack>\n      <Stack.Screen\n        name=\"list\"\n        options={{ ...newScreenOptions }}\n      />\n      <Stack.Screen\n        name=\"credentials\"\n        options={{ ...newScreenOptions }}\n      />\n      <Stack.Screen\n        name=\"webview\"\n        options={{ ...newScreenOptions }}\n      />\n    </Stack>\n  );\n}"
  },
  {
    "path": "app/(onboarding)/services/appscho/credentials.tsx",
    "content": "import { router, useLocalSearchParams } from \"expo-router\";\nimport LottieView from \"lottie-react-native\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport {\n  ActivityIndicator,\n  Keyboard,\n  KeyboardAvoidingView,\n  View,\n} from \"react-native\";\nimport Reanimated, {\n  useSharedValue,\n  withTiming,\n} from \"react-native-reanimated\";\n\nimport Button from \"@/ui/components/Button\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { ServiceAccount, Services } from \"@/stores/account/types\";\nimport uuid from \"@/utils/uuid/uuid\";\nimport { useTranslation } from \"react-i18next\";\nimport OnboardingInput from \"@/components/onboarding/OnboardingInput\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { INSTANCES, loginWithCredentials } from \"appscho\";\n\nconst ANIMATION_DURATION = 100;\n\nexport default function AppSchoCredentials() {\n  const insets = useSafeAreaInsets();\n  const theme = useTheme();\n  const { instanceId } = useLocalSearchParams<{ instanceId: string }>();\n\n  const [username, setUsername] = useState<string>(\"\");\n  const [password, setPassword] = useState<string>(\"\");\n  const [isLoading, setIsLoading] = useState<boolean>(false);\n\n  const instance = INSTANCES.find(inst => inst.id === instanceId);\n\n  const opacity = useSharedValue(1);\n  const scale = useSharedValue(1);\n\n  const keyboardListeners = useMemo(() => ({\n    show: () => {\n      \"worklet\";\n      opacity.value = withTiming(0, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });\n    },\n    hide: () => {\n      \"worklet\";\n      opacity.value = withTiming(1, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(1, { duration: ANIMATION_DURATION });\n    },\n  }), [opacity]);\n\n  useEffect(() => {\n    const showSub = Keyboard.addListener(\"keyboardWillShow\", keyboardListeners.show);\n    const hideSub = Keyboard.addListener(\"keyboardWillHide\", keyboardListeners.hide);\n\n    return () => {\n      showSub.remove();\n      hideSub.remove();\n    };\n  }, [keyboardListeners]);\n\n  const { t } = useTranslation();\n  const alert = useAlert();\n\n  async function handleLogin(username: string, password: string) {\n    if (!instance) {\n      alert.showAlert({\n        title: t(\"ONBOARDING_ERROR\"),\n        description: t(\"ONBOARDING_APPSCHO_INSTANCE_NOT_FOUND\"),\n        icon: \"AlertTriangle\",\n        color: \"#D60046\",\n        withoutNavbar: true,\n      });\n      return;\n    }\n\n    if (!username.trim() || !password.trim()) {\n      alert.showAlert({\n        title: t(\"ONBOARDING_REQUIRED_FIELDS\"),\n        description: t(\"ONBOARDING_FILL_ALL_FIELDS\"),\n        icon: \"AlertTriangle\",\n        color: \"#D60046\",\n        withoutNavbar: true,\n      });\n      return;\n    }\n\n    setIsLoading(true);\n\n    try {\n      const response = await loginWithCredentials(instance.id, username, password);\n\n      const id = uuid();\n      const service: ServiceAccount = {\n        id,\n        auth: {\n          additionals: {\n            instanceId: instance.id,\n            username: username,\n            password: password,\n          },\n        },\n        serviceId: Services.APPSCHO,\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString(),\n      };\n\n      const store = useAccountStore.getState();\n\n      store.addAccount({\n        id,\n        firstName: response.firstname,\n        lastName: response.lastname,\n        schoolName: instance.name,\n        className: response.program ?? undefined,\n        services: [service],\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString(),\n      });\n\n      store.setLastUsedAccount(id);\n\n      return router.push({\n        pathname: \"/(onboarding)/end/color\",\n        params: {\n          accountId: id,\n        },\n      });\n    } catch (error) {\n      alert.showAlert({\n        title: t(\"Alert_Auth_Error\"),\n        description: t(\"ONBOARDING_ALERT_LOGIN_ABORTED\"),\n        icon: \"AlertTriangle\",\n        color: \"#D60046\",\n        technical: String(error),\n        withoutNavbar: true,\n      });\n    } finally {\n      setIsLoading(false);\n    }\n  }\n\n  return (\n    <KeyboardAvoidingView\n      style={{ flex: 1, marginBottom: insets.bottom }}\n      behavior=\"padding\"\n    >\n      <View\n        style={{\n          alignItems: \"center\",\n          justifyContent: \"flex-end\",\n          borderBottomLeftRadius: 42,\n          borderBottomRightRadius: 42,\n          padding: 20,\n          paddingTop: insets.top + 20,\n          paddingBottom: 34,\n          borderCurve: \"continuous\",\n          flex: 1,\n          backgroundColor: \"#1E3035\",\n        }}\n      >\n        <Reanimated.View\n          style={{\n            flex: 1,\n            marginBottom: 16,\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            opacity: opacity,\n            transform: [{ scale: scale }],\n          }}\n        >\n          <LottieView\n            source={require(\"@/assets/lotties/uni-services.json\")}\n            autoPlay\n            loop={false}\n            style={{\n              aspectRatio: 1,\n              height: \"100%\",\n              maxHeight: 250,\n            }}\n          />\n        </Reanimated.View>\n        <Stack\n          vAlign=\"start\"\n          hAlign=\"start\"\n          width=\"100%\"\n          gap={12}\n        >\n          <Stack\n            direction=\"horizontal\"\n          >\n            <Typography\n              variant=\"h5\"\n              style={{ color: \"#FFF\", lineHeight: 22, fontSize: 18 }}\n            >\n              {t(\"STEP\")} 2\n            </Typography>\n            <Typography\n              variant=\"h5\"\n              style={{ color: \"#FFFFFF90\", lineHeight: 22, fontSize: 18 }}\n            >\n              {t(\"STEP_OUTOF\")} 3\n            </Typography>\n          </Stack>\n          <Typography\n            variant=\"h1\"\n            style={{ color: \"#FFF\", fontSize: 32, lineHeight: 34 }}\n          >\n            {t(\"ONBOARDING_LOGIN_CREDENTIALS\")} {instance?.name || \"AppScho\"}\n          </Typography>\n        </Stack>\n      </View>\n\n      {isLoading ? (\n        <View\n          style={{\n            alignItems: \"center\",\n            gap: 10,\n            padding: 20,\n            height: 200,\n            justifyContent: \"center\",\n          }}\n        >\n          <ActivityIndicator />\n          <View>\n            <Typography variant=\"h4\" color=\"text\" align=\"center\">\n              {t(\"WAITING\")}\n            </Typography>\n            <Typography variant=\"body2\" color=\"secondary\" align=\"center\">\n              {t(\"ONBOARDING_LOADING_LOGIN\")}\n            </Typography>\n          </View>\n        </View>\n      ) : (\n        <Stack padding={20} gap={10}>\n          <OnboardingInput\n            icon=\"User\"\n            placeholder={t(\"INPUT_USERNAME\")}\n            text={username}\n            setText={setUsername}\n            isPassword={false}\n            inputProps={{\n              autoCapitalize: \"none\",\n              autoCorrect: false,\n              spellCheck: false,\n              textContentType: \"username\",\n            }}\n          />\n          <OnboardingInput\n            icon=\"Lock\"\n            placeholder={t(\"INPUT_PASSWORD\")}\n            text={password}\n            setText={setPassword}\n            isPassword={true}\n            inputProps={{\n              autoCapitalize: \"none\",\n              autoCorrect: false,\n              spellCheck: false,\n              textContentType: \"password\",\n              onSubmitEditing: () => {\n                Keyboard.dismiss();\n                handleLogin(username, password);\n              },\n              returnKeyType: \"done\",\n            }}\n          />\n          <Button\n            title={t(\"LOGIN_BTN\")}\n            style={{\n              backgroundColor: theme.dark ? theme.colors.border : \"black\",\n            }}\n            size=\"large\"\n            disableAnimation\n            onPress={() => handleLogin(username, password)}\n          />\n        </Stack>\n      )}\n      \n      <OnboardingBackButton />\n    </KeyboardAvoidingView>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/appscho/list.tsx",
    "content": "import { Image, View } from \"react-native\";\nimport { useTheme } from \"@react-navigation/native\";\nimport React, { useMemo, useState } from \"react\";\nimport Reanimated, {\n  FadeInDown\n} from \"react-native-reanimated\";\n\nimport Typography from \"@/ui/components/Typography\";\nimport { useTranslation } from \"react-i18next\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport OnboardingScrollingFlatList from \"@/components/onboarding/OnboardingScrollingFlatList\";\nimport OnboardingInput from \"@/components/onboarding/OnboardingInput\";\nimport { RelativePathString, router } from \"expo-router\";\nimport { INSTANCES } from \"appscho\";\n\n\nconst UNIVERSITY_LOGOS: { [key: string]: any } = {\n  alijia: require('@/assets/images/univ/alijia.webp'),\n  bsb: require('@/assets/images/univ/bsb.webp'),\n  digitalcampus: require('@/assets/images/univ/digitalcampus.webp'),\n  edhec: require('@/assets/images/univ/edhec.webp'),\n  eigsi: require('@/assets/images/univ/eigsi.webp'),\n  emstra: require('@/assets/images/univ/emstra.webp'),\n  epp: require('@/assets/images/univ/epp.webp'),\n  esaip: require('@/assets/images/univ/esaip.webp'),\n  esarc: require('@/assets/images/univ/esarc.webp'),\n  esg: require('@/assets/images/univ/esg.webp'),\n  esigelec: require('@/assets/images/univ/esigelec.webp'),\n  essca: require('@/assets/images/univ/essca.webp'),\n  essec: require('@/assets/images/univ/essec.webp'),\n  estp: require('@/assets/images/univ/estp.webp'),\n  hec: require('@/assets/images/univ/hec.webp'),\n  icp: require('@/assets/images/univ/icp.png'),\n  ieu: require('@/assets/images/univ/ieu.webp'),\n  iicp: require('@/assets/images/univ/iicp.webp'),\n  ipp: require('@/assets/images/univ/ipp.webp'),\n  iseg: require('@/assets/images/univ/iseg.webp'),\n  lisaa: require('@/assets/images/univ/lisaa.webp'),\n  macromedia: require('@/assets/images/univ/macromedia.webp'),\n  mbs: require('@/assets/images/univ/mbs.webp'),\n  merkure: require('@/assets/images/univ/merkure.webp'),\n  psb: require('@/assets/images/univ/psb.jpg'),\n  pstb: require('@/assets/images/univ/pstb.webp'),\n  regent: require('@/assets/images/univ/regent.webp'),\n  sciencespo: require('@/assets/images/univ/sciencepo.webp'),\n  scpoaix: require('@/assets/images/univ/scpoaix.webp'),\n  ubmont: require('@/assets/images/univ/ubmont.webp'),\n  uclouvain: require('@/assets/images/univ/uclouvain.webp'),\n  ucly: require('@/assets/images/univ/ucly.webp'),\n  ueve: require('@/assets/images/univ/ueve.webp'),\n  uniassas: require('@/assets/images/univ/uniassas.webp'),\n  unilyon3: require('@/assets/images/univ/unilyon3.webp'),\n  unimes: require('@/assets/images/univ/unimes.webp'),\n  unimons: require('@/assets/images/univ/unimons.webp'),\n  unitoulon: require('@/assets/images/univ/unitoulon.webp'),\n  univangers: require('@/assets/images/univ/univangers.webp'),\n  unieiffel: require('@/assets/images/univ/univeiffel.webp'),\n  univpoitiers: require('@/assets/images/univ/univpoitiers.webp'),\n  upjv: require('@/assets/images/univ/upjv.webp'),\n  wsfactory: require('@/assets/images/univ/wsfactory.png'),\n};\n\n\nexport default function AppschoInstancesList() {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const [search, setSearch] = useState<string>(\"\");\n  const { t } = useTranslation();\n\n  const filteredInstances = useMemo(() => {\n    if (!search.trim()) return INSTANCES;\n    return INSTANCES.filter(instance => \n      instance.name.toLowerCase().includes(search.toLowerCase())\n    );\n  }, [search]);\n\n  return (\n    <OnboardingScrollingFlatList\n      color={'#1E3035'}\n      lottie={require('@/assets/lotties/uni-services.json')}\n      title={t(\"ONBOARDING_SELECT_UNIVERSITIESERVICE\")}\n      step={1}\n      totalSteps={3}\n      elements={[\n        { isSearchBar: true },\n        ...filteredInstances\n      ]}\n      renderItem={({ item, index }) => {\n        if (item.isSearchBar) {\n          return (\n            <View style={{ marginBottom: 15 }}>\n              <OnboardingInput\n                placeholder={t(\"SEARCH_UNIV_PLACEHOLDER\")}\n                text={search}\n                setText={setSearch}\n                icon=\"Search\"\n                inputProps={{}}\n              />\n            </View>\n          );\n        }\n\n        return (\n          <Reanimated.View\n            entering={FadeInDown.springify().duration(400).delay(index * 80 + 150)}\n          >\n            <AnimatedPressable\n              onPress={() => {\n                requestAnimationFrame(() => {\n                  if (item.casurl) {\n                    router.push({pathname: '/(onboarding)/services/appscho/webview', params: { instanceId: item.id }})\n                  } else {\n                    router.push({pathname: '/(onboarding)/services/appscho/credentials', params: { instanceId: item.id }})\n                  }\n                });\n              }}\n              style={{\n                paddingHorizontal: 18,\n                paddingVertical: 14,\n                borderColor: colors.border,\n                borderWidth: 1.5,\n                borderRadius: 80,\n                borderCurve: \"continuous\",\n                flexDirection: 'row',\n                alignItems: 'center',\n                justifyContent: 'flex-start',\n                display: 'flex',\n                gap: 16,\n              }}\n            >\n              <View style={{ width: 32, height: 32, alignItems: 'center', justifyContent: 'center' }}>\n                  {UNIVERSITY_LOGOS[item.id] ? (\n                    <Image\n                      source={UNIVERSITY_LOGOS[item.id]}\n                      style={{ width: 32, height: 32 }}\n                      resizeMode=\"cover\"\n                    />\n                  ) : (\n                    <View style={{ width: 32, height: 32, backgroundColor: colors.border, borderRadius: 16 }} />\n                  )}\n              </View>\n              <Typography style={{ flex: 1 }} nowrap variant='title'>{item.name}</Typography>\n            </AnimatedPressable>\n          </Reanimated.View>\n        );\n      }}\n    />\n  );\n}"
  },
  {
    "path": "app/(onboarding)/services/appscho/webview.tsx",
    "content": "import OnboardingWebview from \"@/components/onboarding/OnboardingWebview\";\nimport { router, useLocalSearchParams } from \"expo-router\";\nimport { INSTANCES, getCASURL, loginWithOAuth } from \"appscho\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { ServiceAccount, Services } from \"@/stores/account/types\";\nimport uuid from \"@/utils/uuid/uuid\";\nimport { useState } from \"react\";\n\nexport default function AppschoWebView() {\n  const { instanceId } = useLocalSearchParams<{ instanceId: string }>();\n  const { t } = useTranslation();\n  const alert = useAlert();\n  const [isProcessing, setIsProcessing] = useState(false);\n  \n  const instance = INSTANCES.find(inst => inst.id === instanceId);\n  const loginURL = getCASURL(instance?.id as string);\n\n  const handleRequest = async (url: string) => {\n    \n    const urlObj = new URL(url);\n    const code = urlObj.searchParams.get('code');\n    \n    if (code && !isProcessing && instance) {\n      setIsProcessing(true);\n      \n      try {\n        const response = await loginWithOAuth(instance.id, code);\n\n        const id = uuid();\n        const service: ServiceAccount = {\n          id,\n          auth: {\n            additionals: {\n              instanceId: instance.id,\n              code: code,\n              refreshToken: response.refreshToken || \"\",\n            },\n          },\n          serviceId: Services.APPSCHO,\n          createdAt: (new Date()).toISOString(),\n          updatedAt: (new Date()).toISOString(),\n        };\n\n        const store = useAccountStore.getState();\n\n        store.addAccount({\n          id,\n          firstName: response.firstname || t(\"ONBOARDING_DEFAULT_USER_FIRSTNAME\"),\n          lastName: response.lastname || instance.name,\n          schoolName: response.program || instance.name,\n          className: response.department ?? undefined,\n          services: [service],\n          createdAt: (new Date()).toISOString(),\n          updatedAt: (new Date()).toISOString(),\n        });\n        \n        store.setLastUsedAccount(id);\n\n        return router.push({\n          pathname: \"/(onboarding)/end/color\",\n          params: {\n            accountId: id,\n          },\n        });\n      } catch (error) {\n        Error(`OAuth login error: ${error}`);\n        alert.showAlert({\n          title: t(\"Alert_Auth_Error\"),\n          description: t(\"ONBOARDING_ALERT_OAUTH_LOGIN_ABORTED\"),\n          icon: \"AlertTriangle\",\n          color: \"#D60046\",\n          technical: String(error),\n          withoutNavbar: true,\n        });\n        setIsProcessing(false);\n      }\n    }\n  };\n\n  return (\n    <OnboardingWebview\n      title={t(\"ONBOARDING_WEBVIEW_TITLE\")}\n      color={\"#1E3035\"}\n      step={2}\n      totalSteps={3}\n      webviewProps={{\n        source: loginURL\n          ? { uri: loginURL }\n          : { html: `<h1>${t(\"ONBOARDING_LOADING\")}</h1>` },\n        onShouldStartLoadWithRequest: (request) => {\n          handleRequest(request.url);\n          return true;\n        }\n      }}\n    />\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/ed/_layout.tsx",
    "content": "import React from 'react';\nimport { useTranslation } from \"react-i18next\";\n\nimport { Stack } from 'expo-router';\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport { Platform } from 'react-native';\nimport { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';\n\nexport default function OnboardingLayout() {\n  const { t } = useTranslation();\n  const newScreenOptions = React.useMemo(() => ({\n    ...screenOptions,\n    headerShown: true,\n    ...AndroidHeaderProps,\n    headerTransparent: true,\n    headerBackButtonDisplayMode: \"minimal\",\n    headerLargeTitle: false,\n  }), []);\n\n  return (\n    <Stack>\n      <Stack.Screen\n        name=\"credentials\"\n        options={{ ...newScreenOptions, headerTitle: t(\"ONBOARDING_HEADER_ED_LOGIN\") }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/ed/credentials.tsx",
    "content": "\nimport { Client, DoubleAuthQuestions, DoubleAuthResult, Require2FA } from \"@blockshub/blocksdirecte\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { router } from \"expo-router\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n  Alert,\n  Keyboard,\n  KeyboardAvoidingView,\n  Modal,\n  Platform,\n  Pressable,\n  View,\n} from \"react-native\";\nimport Reanimated, {\n  FadeInDown,\n  FadeOutUp,\n  useSharedValue,\n  withTiming,\n} from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport OnboardingInput from \"@/components/onboarding/OnboardingInput\";\nimport OnboardingScrollingFlatList from \"@/components/onboarding/OnboardingScrollingFlatList\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { Account, Services } from \"@/stores/account/types\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport Button from \"@/ui/components/Button\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport uuid from \"@/utils/uuid/uuid\";\nimport { ScrollView } from \"react-native-gesture-handler\";\nimport LoginView from \"../../components/LoginView\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\n\nconst ANIMATION_DURATION = 170;\nexport const PlatformPressable = Platform.OS === 'android' ? Pressable : AnimatedPressable;\n\nexport default function EDLoginWithCredentials() {\n  const insets = useSafeAreaInsets();\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const alert = useAlert();\n  const { t } = useTranslation();\n\n  const [challengeModalVisible, setChallengeModalVisible] = useState<boolean>(false);\n  const [doubleAuthChallenge, setDoubleAuthChallenge] = useState<DoubleAuthQuestions | null>(null);\n\n  const [session, setSession] = useState<Client | null>(null);\n  const [token, setToken] = useState<string>();\n\n  const [username, setUsername] = useState<string>(\"\");\n  const [password, setPassword] = useState<string>(\"\");\n\n  const [isLoggingIn, setIsLoggingIn] = useState<boolean>(false);\n\n  const opacity = useSharedValue(1);\n  const scale = useSharedValue(1);\n\n  const keyboardListeners = useMemo(() => ({\n    show: () => {\n      \"worklet\";\n      opacity.value = withTiming(0, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });\n    },\n    hide: () => {\n      \"worklet\";\n      opacity.value = withTiming(1, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(1, { duration: ANIMATION_DURATION });\n    },\n  }), [opacity]);\n\n  useEffect(() => {\n    const showSub = Keyboard.addListener(\"keyboardWillShow\", keyboardListeners.show);\n    const hideSub = Keyboard.addListener(\"keyboardWillHide\", keyboardListeners.hide);\n\n    return () => {\n      showSub.remove();\n      hideSub.remove();\n    };\n  }, [keyboardListeners]);\n\n  const handleLogin = async (username: string, password: string, keys?: DoubleAuthResult) => {\n    const client = new Client();\n    const device = uuid();\n    const store = useAccountStore.getState();\n\n    try {\n      const tokens = await client.auth.loginUsername(username, password, keys?.cn, keys?.cv, true, device);\n      if (tokens) {\n        client.auth.setAccount(0);\n        const authentication = client.auth.getAccount();\n        const account: Account = {\n          id: device,\n          firstName: authentication.prenom,\n          lastName: authentication.nom,\n          schoolName: authentication.nomEtablissement,\n          services: [\n            {\n              id: device,\n              auth: {\n                additionals: {\n                  \"username\": username,\n                  \"token\": authentication.accessToken,\n                  \"cn\": keys?.cn ?? \"\",\n                  \"cv\": keys?.cv ?? \"\",\n                  \"deviceUUID\": device\n                }\n              },\n              serviceId: Services.ECOLEDIRECTE,\n              createdAt: new Date().toISOString(),\n              updatedAt: new Date().toISOString()\n            },\n          ],\n          createdAt: new Date().toISOString(),\n          updatedAt: new Date().toISOString(),\n        };\n\n        store.addAccount(account);\n        store.setLastUsedAccount(device);\n\n        queueMicrotask(() => {\n          router.push({\n            pathname: \"../end/color\",\n            params: { accountId: device },\n          });\n        });\n      }\n    } catch (e) {\n      setIsLoggingIn(false);\n      if (e instanceof Require2FA) {\n        const questions = await client.auth.get2FAQuestion(e.token);\n        setDoubleAuthChallenge(questions);\n        setSession(client);\n        setChallengeModalVisible(true);\n        setToken(e.token);\n      } else {\n        Alert.alert(t(\"Alert_Auth_Error\"), t(\"ONBOARDING_ALERT_LOGIN_ABORTED\"));\n      }\n    }\n  }\n\n  const loginED = async () => {\n    if (!username.trim() || !password.trim()) { return; }\n    setIsLoggingIn(true);\n    Keyboard.dismiss();\n    await handleLogin(username, password);\n    setIsLoggingIn(false);\n  };\n\n  async function handleChallenge(index: number) {\n    setChallengeModalVisible(false);\n\n    if (!session || !doubleAuthChallenge?.propositions?.[index]) { return }\n    try {\n      const keys = await session.auth.send2FAQuestion(doubleAuthChallenge.propositions[index], token ?? \"\");\n      queueMicrotask(() => void handleLogin(username, password, keys));\n    } catch {\n      throw new Error(\"2FA challenge failed\");\n    }\n  }\n\n  function questionComponent({ item, index }: { item: unknown; index: number }) {\n    return (\n      <Reanimated.View\n        entering={FadeInDown.springify().duration(400).delay(index * 80 + 150)}\n        exiting={FadeOutUp.springify().duration(400).delay(index * 80 + 150)}\n      >\n        <PlatformPressable\n          onPress={() => {\n            handleChallenge(index);\n          }}\n          style={{\n            paddingHorizontal: 10,\n            paddingVertical: 10,\n            paddingRight: 18,\n            borderColor: colors.border,\n            borderWidth: 1.5,\n            borderRadius: 80,\n            flexDirection: \"row\",\n            alignItems: \"center\",\n            gap: 16,\n          }}\n        >\n          <Stack\n            width={45}\n            height={45}\n            vAlign=\"center\"\n            hAlign=\"center\"\n            radius={80}\n            backgroundColor={colors.border}\n          >\n            <Typography variant=\"h4\" color={colors.text}>\n              {index + 1}\n            </Typography>\n          </Stack>\n          <Stack gap={0} style={{ width: \"80%\" }}>\n            <Typography nowrap variant=\"title\" style={{ width: \"100%\" }}>\n              {String(item)}\n            </Typography>\n          </Stack>\n        </PlatformPressable>\n      </Reanimated.View>\n    );\n  }\n\n  const headerHeight = useHeaderHeight();\n  const finalHeaderHeight = Platform.select({\n    android: headerHeight,\n    default: insets.top\n  });\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1, marginBottom: insets.bottom }} behavior=\"padding\">\n      <ScrollView contentContainerStyle={{ paddingTop: finalHeaderHeight, paddingBottom: insets.bottom }}>\n              <LoginView\n                color=\"#1788bc\"\n                serviceName=\"ÉcoleDirecte\"\n                serviceIcon={require('@/assets/images/service_ed.png')}\n                loading={isLoggingIn}\n                onSubmit={(values) => {\n                  if (!isLoggingIn && values.username && values.password) {\n                    setUsername(values.username);\n                    setPassword(values.password);\n                    loginED();\n                  }\n                }}\n              />\n            </ScrollView>\n\n      <Modal\n        visible={challengeModalVisible}\n        animationType=\"slide\"\n        presentationStyle=\"pageSheet\"\n        onRequestClose={() => setChallengeModalVisible(false)}\n      >\n        <OnboardingScrollingFlatList\n          title={doubleAuthChallenge?.question ?? t(\"ONBOARDING_DOUBLE_AUTH\")}\n          color={\"#E50052\"}\n          step={3}\n          hasReturnButton={false}\n          totalSteps={3}\n          elements={doubleAuthChallenge?.propositions ?? []}\n          renderItem={questionComponent}\n        />\n      </Modal>\n    </KeyboardAvoidingView>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/lannion/_layout.tsx",
    "content": "import React from 'react';\nimport { useTranslation } from \"react-i18next\";\n\nimport { Stack } from 'expo-router';\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport { Platform } from 'react-native';\nimport { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';\n\nexport default function OnboardingLayout() {\n  const { t } = useTranslation();\n  const newScreenOptions = React.useMemo(() => ({\n    ...screenOptions,\n    headerShown: true,\n    ...AndroidHeaderProps,\n    headerTransparent: true,\n    headerBackButtonDisplayMode: \"minimal\",\n    headerLargeTitle: false,\n  }), []);\n\n  return (\n    <Stack>\n      <Stack.Screen\n        name=\"credentials\"\n        options={{ ...newScreenOptions, headerTitle: t(\"ONBOARDING_SERVICE_LANNION\") }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/lannion/credentials.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport { router, useNavigation } from \"expo-router\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n  Alert,\n  Keyboard,\n  KeyboardAvoidingView,\n  Platform,\n  View,\n} from \"react-native\";\nimport { ScrollView } from \"react-native-gesture-handler\";\nimport {\n  useSharedValue,\n  withTiming,\n} from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport { authenticateWithCredentials, LannionAPI } from \"@/services/lannion/module\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { Account, Services } from \"@/stores/account/types\";\nimport { useSettingsStore } from \"@/stores/settings\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport Button from \"@/ui/components/Button\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport uuid from \"@/utils/uuid/uuid\";\n\nimport LoginView from \"../../components/LoginView\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\n\nconst ANIMATION_DURATION = 170;\n\nconst upperFirst = (str: string) => {\n  return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\nexport default function LannionCredentials() {\n  const insets = useSafeAreaInsets();\n  const theme = useTheme();\n  const navigation = useNavigation();\n\n  const alert = useAlert();\n  const { t } = useTranslation();\n\n  const [username, setUsername] = useState<string>(\"\");\n  const [password, setPassword] = useState<string>(\"\");\n\n  const [isLoggingIn, setIsLoggingIn] = useState<boolean>(false);\n\n  const opacity = useSharedValue(1);\n  const scale = useSharedValue(1);\n\n  const university = \"IUT de Lannion\";\n  const color = \"#e0001a\";\n\n  const keyboardListeners = useMemo(() => ({\n    show: () => {\n      \"worklet\";\n      opacity.value = withTiming(0, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });\n    },\n    hide: () => {\n      \"worklet\";\n      opacity.value = withTiming(1, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(1, { duration: ANIMATION_DURATION });\n    },\n  }), [opacity]);\n\n  useEffect(() => {\n    const showSub = Keyboard.addListener(\"keyboardWillShow\", keyboardListeners.show);\n    const hideSub = Keyboard.addListener(\"keyboardWillHide\", keyboardListeners.hide);\n\n    return () => {\n      showSub.remove();\n      hideSub.remove();\n    };\n  }, [keyboardListeners]);\n\n  async function handleLogin(password: string, username: string) {\n    setIsLoggingIn(true);\n    try {\n      const store = useAccountStore.getState();\n\n      const client = await authenticateWithCredentials(username, password);\n\n      const api = new LannionAPI(client);\n      const relevesResult = await api.getAllReleves();\n\n      if (!relevesResult.success || !relevesResult.data || relevesResult.data.length === 0) {\n        throw new Error(relevesResult.error || \"Failed to fetch student data\");\n      }\n      const firstReleve: any = relevesResult.data[0];\n      const etudiant = firstReleve.relevé?.etudiant;\n\n      const accountUUID = String(uuid());\n      const studentName = upperFirst(etudiant?.nom) || t(\"ONBOARDING_UNKNOWN_NAME\");\n      const studentFirstName = upperFirst(etudiant?.prenom) || t(\"ONBOARDING_UNKNOWN_STUDENT\");\n\n      const account: Account = {\n        id: accountUUID,\n        firstName: studentFirstName,\n        lastName: studentName,\n        schoolName: university,\n        services: [\n          {\n            id: uuid(),\n            auth: {\n              additionals: {\n                username: username,\n                password: password\n              },\n            },\n            serviceId: Services.LANNION,\n            createdAt: (new Date()).toISOString(),\n            updatedAt: (new Date()).toISOString()\n          }\n        ],\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString()\n      };\n\n      store.addAccount(account);\n      store.setLastUsedAccount(accountUUID);\n\n      const settingsStore = useSettingsStore.getState();\n      const disabledTabs = settingsStore.personalization.disabledTabs || [];\n      const newDisabledTabs = Array.from(new Set([...disabledTabs, \"news\", \"tasks\"]));\n\n      settingsStore.mutateProperty(\"personalization\", {\n        disabledTabs: newDisabledTabs\n      });\n\n      setIsLoggingIn(false);\n\n      const parent = navigation.getParent();\n              if (parent) {\n                parent.goBack();\n                \n                const parentsParent = parent.getParent();\n                if (parentsParent) {\n                  parentsParent.goBack();\n                }\n              }\n      \n              router.back();\n              router.dismissAll();\n              return router.push(\"/\");\n    } catch (error) {\n      console.error(error);\n      if (error instanceof Error) {\n        Alert.alert(t(\"Alert_Auth_Error\"), t(\"Alert_Auth_Bad_Creds\"));\n      }\n      setIsLoggingIn(false);\n    }\n  }\n\n  const headerHeight = useHeaderHeight();\n    const finalHeaderHeight = Platform.select({\n      android: headerHeight,\n      default: insets.top\n    });\n\n\n  if (Platform.OS === 'android') {\n    return (\n      <Stack padding={20} gap={8} style={{ paddingTop: finalHeaderHeight + 20 }}>\n        <Typography variant=\"h3\">\n                    {t(\"ONBOARDING_LANNION_ANDROID_TITLE\")}\n        </Typography>\n        <Typography variant=\"body1\" color=\"secondary\">\n                    {t(\"ONBOARDING_LANNION_ANDROID_DESCRIPTION\")}\n        </Typography>\n        <View style={{ marginTop: 24 }} />\n        <Button\n          title={t(\"Global_Back\")}\n          onPress={() => router.back()}\n        />\n      </Stack>\n    )\n  }\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1 }} behavior=\"padding\" keyboardVerticalOffset={32}>\n      <ScrollView contentContainerStyle={{ paddingTop: finalHeaderHeight, paddingBottom: insets.bottom }}>\n        <LoginView\n          color=\"#910063\"\n          serviceName=\"IUT de Lannion\"\n          serviceIcon={require('@/assets/images/univ_lannion.png')}\n          loading={isLoggingIn}\n          onSubmit={(values) => {\n            if (!isLoggingIn && values.username && values.password) {\n              handleLogin(values.password, values.username);\n            }\n          }}\n        />\n      </ScrollView>\n    </KeyboardAvoidingView>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/multi/_layout.tsx",
    "content": "import React from 'react';\n\nimport { Stack } from 'expo-router';\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport { useLocalSearchParams } from 'expo-router';\nimport { useTranslation } from \"react-i18next\";\nimport { Platform } from 'react-native';\nimport { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';\n\nexport default function OnboardingLayout() {\n  const { t } = useTranslation();\n  const newScreenOptions = React.useMemo(() => ({\n    ...screenOptions,\n    headerShown: true,\n    ...AndroidHeaderProps,\n    headerTransparent: true,\n    headerBackButtonDisplayMode: \"minimal\",\n    headerLargeTitle: false,\n  }), []);\n  \n  const param = useLocalSearchParams();\n\n  return (\n    <Stack>\n      <Stack.Screen\n        name=\"credentials\"\n        options={{ ...newScreenOptions, headerTitle: t(\"ONBOARDING_HEADER_UNIVERSITY_LOGIN\"), params: param }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/multi/credentials.tsx",
    "content": "\nimport { useTheme } from \"@react-navigation/native\";\nimport { authWithCredentials } from 'esup-multi.js';\nimport { router, useLocalSearchParams, useNavigation } from \"expo-router\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n  Keyboard,\n  KeyboardAvoidingView,\n  Platform,\n  ScrollView,\n  View,\n} from \"react-native\";\nimport Reanimated, {\n  useSharedValue,\n  withTiming,\n} from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport OnboardingInput from \"@/components/onboarding/OnboardingInput\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { Account, Services } from \"@/stores/account/types\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport Button from \"@/ui/components/Button\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport uuid from \"@/utils/uuid/uuid\";\nimport LoginView from \"../../components/LoginView\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\n\nconst ANIMATION_DURATION = 170;\n\nexport default function MultiLoginWithCredentials() {\n  const insets = useSafeAreaInsets();\n  const theme = useTheme();\n  const navigation = useNavigation();\n\n  const alert = useAlert();\n  const { t } = useTranslation();\n\n  const [username, setUsername] = useState<string>(\"\");\n  const [password, setPassword] = useState<string>(\"\");\n\n  const [isLoggingIn, setIsLoggingIn] = useState<boolean>(false);\n\n  const opacity = useSharedValue(1);\n  const scale = useSharedValue(1);\n\n  const param = useLocalSearchParams();\n  console.log(param);\n  const instanceUrl = String(param.url);\n  const university = String(param.university);\n  const color = String(param.color);\n\n  const keyboardListeners = useMemo(() => ({\n    show: () => {\n      \"worklet\";\n      opacity.value = withTiming(0, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(0.8, { duration: ANIMATION_DURATION });\n    },\n    hide: () => {\n      \"worklet\";\n      opacity.value = withTiming(1, { duration: ANIMATION_DURATION });\n      scale.value = withTiming(1, { duration: ANIMATION_DURATION });\n    },\n  }), [opacity]);\n\n  useEffect(() => {\n    const showSub = Keyboard.addListener(\"keyboardWillShow\", keyboardListeners.show);\n    const hideSub = Keyboard.addListener(\"keyboardWillHide\", keyboardListeners.hide);\n\n    return () => {\n      showSub.remove();\n      hideSub.remove();\n    };\n  }, [keyboardListeners]);\n\n  async function handleLogin(password: string, username: string) {\n    setIsLoggingIn(true);\n    try {\n      const store = useAccountStore.getState()\n      const MultiAccount = await authWithCredentials(instanceUrl, { username, password });\n      const accountUUID = String(uuid());\n\n      const account: Account = {\n        id: accountUUID,\n        firstName: MultiAccount?.userData.firstname ?? \"\",\n        lastName: MultiAccount?.userData.name ?? \"\",\n        schoolName: university,\n        services: [\n          {\n            id: uuid(),\n            auth: {\n              refreshToken: MultiAccount.userData.refreshAuthToken,\n              additionals: { instanceUrl: instanceUrl },\n            },\n            serviceId: Services.MULTI,\n            createdAt: (new Date()).toISOString(),\n            updatedAt: (new Date()).toISOString()\n          }\n        ],\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString()\n      }\n\n      store.addAccount(account)\n      store.setLastUsedAccount(accountUUID)\n\n      setIsLoggingIn(false);\n\n      const parent = navigation.getParent();\n                    if (parent) {\n                      parent.goBack();\n                      \n                      const parentsParent = parent.getParent();\n                      if (parentsParent) {\n                        parentsParent.goBack();\n                      }\n                    }\n            \n                    router.back();\n                    router.dismissAll();\n                    return router.push(\"/\");\n    } catch (error) {\n      if (error instanceof Error) {\n        alert.showAlert({\n          title: t(\"Alert_Auth_Error\"),\n          description: t(\"Alert_Auth_Bad_Creds\"),\n          icon: \"AlertTriangle\",\n          color: \"#D60046\",\n          withoutNavbar: true\n        });\n      }\n      setIsLoggingIn(false);\n    }\n  }\n\n  const headerHeight = useHeaderHeight();\n    const finalHeaderHeight = Platform.select({\n      android: headerHeight,\n      default: insets.top\n    });\n\n  return (\n      <KeyboardAvoidingView style={{ flex: 1 }} behavior=\"padding\">\n        <ScrollView contentContainerStyle={{ paddingTop: finalHeaderHeight, paddingBottom: insets.bottom }}>\n          <LoginView\n            color={color ?? theme.colors.primary}\n            serviceName={String(param.university)}\n            loading={isLoggingIn}\n            onSubmit={(values) => {\n              if (!isLoggingIn && values.username && values.password) {\n                handleLogin(values.password, values.username);\n              }\n            }}\n          />\n        </ScrollView>\n      </KeyboardAvoidingView>\n    );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/pronote/2fa.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport * as Device from \"expo-device\"\nimport { router } from \"expo-router\";\nimport { finishLoginManually, SecurityError, securitySave, securitySource, SessionHandle } from \"pawnote\";\nimport React, { useCallback, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { FlatList, View } from \"react-native\";\nimport { ScrollView } from \"react-native-gesture-handler\";\nimport Reanimated from \"react-native-reanimated\"\n\nimport { useAccountStore } from \"@/stores/account\";\nimport { Services } from \"@/stores/account/types\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\n\nimport { PlatformPressable } from \"../ed/credentials\";\n\nexport function Pronote2FAModal({ doubleAuthSession, doubleAuthError, setChallengeModalVisible, deviceId }: { doubleAuthSession: SessionHandle | null, doubleAuthError: SecurityError | null, setChallengeModalVisible: (visible: boolean) => void, deviceId: string }) {\n  const { t } = useTranslation();\n  const { colors, dark } = useTheme();\n  const alert = useAlert();\n\n  const [pinCode, setPinCode] = useState<string>(\"\");\n\n  const solveDoubleAuth = async (pinCode: string) => {\n    try {\n      if (!doubleAuthSession || !doubleAuthError) { return; }\n\n      const error = doubleAuthError\n      const session = doubleAuthSession\n      const deviceName = Device.deviceName\n      const source = \"Papillon sur \" + deviceName\n      await securitySource(session, source.length > 30 ? \"Papillon\" : \"Papillon sur \" + deviceName)\n      await securitySave(session, error.handle, {\n        pin: pinCode,\n        deviceName: source.length > 30 ? \"Papillon\" : \"Papillon sur \" + deviceName || \"Papillon\"\n      })\n\n      const context = error.handle.context;\n      const refresh = await finishLoginManually(\n        session,\n        context.authentication,\n        context.identity,\n        context.initialUsername\n      )\n      const splittedUsername = session.user.name.split(\" \")\n      const firstName = splittedUsername[splittedUsername.length - 1]\n      const lastName = splittedUsername.slice(0, splittedUsername.length - 1).join(\" \")\n      const schoolName = session.user.resources[0].establishmentName\n      const className = session.user.resources[0].className\n\n      const account = {\n        id: deviceId,\n        firstName,\n        lastName,\n        schoolName,\n        className,\n        services: [{\n          id: deviceId,\n          auth: {\n            accessToken: refresh.token,\n            refreshToken: refresh.token,\n            additionals: {\n              instanceURL: refresh.url,\n              kind: refresh.kind,\n              username: refresh.username,\n              deviceUUID: deviceId\n            }\n          },\n          serviceId: Services.PRONOTE,\n          createdAt: (new Date()).toISOString(),\n          updatedAt: (new Date()).toISOString()\n        }],\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString()\n      }\n\n      const store = useAccountStore.getState()\n      store.addAccount(account)\n      store.setLastUsedAccount(deviceId)\n\n      router.push({\n        pathname: \"../end/color\",\n        params: {\n          accountId: deviceId\n        }\n      });\n    } catch (error) {\n      return alert.showAlert({\n        title: t(\"Alert_Auth_Error\"),\n        description: t(\"ONBOARDING_ALERT_BAD_CREDENTIALS_PRONOTE\"),\n        icon: \"AlertTriangle\",\n        color: \"#D60046\",\n        technical: String(error),\n        withoutNavbar: true\n      })\n    }\n  }\n\n  function addPinCodeChar(char: string): void {\n    if (pinCode.length < 4) {\n      setPinCode((prev) => prev + char);\n    }\n  }\n\n  const data = [\n    {\n      name: \"1\",\n      onPress: () => {\n        addPinCodeChar(\"1\")\n      }\n    },\n    {\n      name: \"2\",\n      onPress: () => {\n        addPinCodeChar(\"2\")\n      }\n    },\n    {\n      name: \"3\",\n      onPress: () => {\n        addPinCodeChar(\"3\")\n      }\n    },\n    {\n      name: \"4\",\n      onPress: () => {\n        addPinCodeChar(\"4\")\n      }\n    },\n    {\n      name: \"5\",\n      onPress: () => {\n        addPinCodeChar(\"5\")\n      }\n    },\n    {\n      name: \"6\",\n      onPress: () => {\n        addPinCodeChar(\"6\")\n      }\n    },\n    {\n      name: \"7\",\n      onPress: () => {\n        addPinCodeChar(\"7\")\n      }\n    },\n    {\n      name: \"8\",\n      onPress: () => {\n        addPinCodeChar(\"8\")\n      }\n    },\n    {\n      name: \"9\",\n      onPress: () => {\n        addPinCodeChar(\"9\")\n      }\n    },\n    {\n      name: \"del\",\n      icon: <Papicons name=\"ArrowLeft\" fill={colors.text} />,\n      onPress: () => {\n        setPinCode((prev) => prev.slice(0, -1));\n      }\n    },\n    {\n      name: \"0\",\n      onPress: () => {\n        addPinCodeChar(\"0\")\n      }\n    },\n    {\n      name: \"check\",\n      icon: <Papicons name=\"Check\" fill={colors.text} />,\n      onPress: () => {\n        solveDoubleAuth(pinCode);\n\n        if (!doubleAuthSession || !doubleAuthError || pinCode.length < 4) { return; }\n        setChallengeModalVisible(false);\n      }\n    }\n  ]\n\n  const renderItem = useCallback(({ item }: { item: typeof data[0] }) => (\n    <PlatformPressable\n      onPress={item.onPress}\n      style={{\n        width: 80,\n        height: 80,\n        borderWidth: 1,\n        alignItems: \"center\",\n        justifyContent: \"center\",\n        borderColor: colors.border,\n        borderRadius: 100\n      }}>\n      {!item.icon ? (<Typography variant=\"h1\">{item.name}</Typography>) : (item.icon)}\n    </PlatformPressable>\n  ), [data]);\n\n  return (\n    <View style={{ backgroundColor: colors.background, width: \"100%\", height: \"100%\" }}>\n      <View\n        style={{\n          alignItems: \"center\",\n          justifyContent: \"flex-end\",\n          borderBottomLeftRadius: 42,\n          borderBottomRightRadius: 42,\n          padding: 20,\n          paddingBottom: 34,\n          backgroundColor: \"#E50052\",\n        }}\n      >\n        <Reanimated.View\n          style={{\n            marginBottom: 16,\n            alignItems: \"center\",\n            justifyContent: \"center\",\n          }}\n        />\n        <Stack vAlign=\"start\" hAlign=\"start\" width=\"100%\" gap={12}>\n          <Stack direction=\"horizontal\">\n            <Typography variant=\"h5\" style={{ color: \"#FFF\", fontSize: 18 }}>\n              {t(\"STEP\")} 3\n            </Typography>\n            <Typography variant=\"h5\" style={{ color: \"#FFFFFF90\", fontSize: 18 }}>\n              {t(\"STEP_OUTOF\")} 3\n            </Typography>\n          </Stack>\n          <Typography variant=\"h1\" style={{ color: \"#FFF\", fontSize: 32 }}>\n            {t(\"ONBOARDING_LOGIN_PINCODE\")}\n          </Typography>\n        </Stack>\n      </View>\n      <ScrollView>\n        <Stack flex direction=\"horizontal\" style={{ paddingHorizontal: 50, paddingVertical: 30 }}>\n          <Stack\n            flex\n            direction=\"horizontal\"\n            hAlign=\"center\"\n            gap={10}\n            style={{\n              flex: 1,\n              padding: 20,\n              backgroundColor: colors.text + (dark ? \"15\" : \"08\"),\n              borderRadius: 300,\n              borderWidth: 1,\n              borderColor: colors.border\n            }}\n          >\n            <Icon\n              papicon\n              size={24}\n              fill={colors.text + \"AF\"}\n            >\n              <Papicons name={\"Password\"} />\n            </Icon>\n            <Typography variant=\"h5\" color={pinCode.trim() ? colors.text + \"AF\" : \"secondary\"}>{pinCode.trim() ? pinCode : t(\"INPUT_PIN\")}</Typography>\n          </Stack>\n        </Stack>\n        <FlatList\n          scrollEnabled={false}\n          data={data}\n          numColumns={3}\n          renderItem={renderItem}\n          showsHorizontalScrollIndicator={false}\n          contentContainerStyle={{\n            paddingHorizontal: 50,\n            gap: 15\n          }}\n          columnWrapperStyle={{\n            justifyContent: \"space-between\",\n            alignItems: \"center\"\n          }}\n          style={{\n            width: \"100%\",\n            overflow: \"hidden\"\n          }}\n          removeClippedSubviews\n          maxToRenderPerBatch={6}\n          windowSize={1}\n        />\n      </ScrollView>\n    </View>\n  )\n}\n"
  },
  {
    "path": "app/(onboarding)/services/pronote/_layout.tsx",
    "content": "import React from 'react';\nimport { Platform, PlatformColor, View } from 'react-native';\nimport { useTranslation } from \"react-i18next\";\n\nimport { Stack } from 'expo-router';\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport AndroidHeaderBackground, { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';\n\nexport default function OnboardingLayout() {\n  const { t } = useTranslation();\n  const newScreenOptions = React.useMemo(() => ({\n    ...screenOptions,\n    headerShown: true,\n    ...AndroidHeaderProps,\n    headerTransparent: true,\n    headerBackButtonDisplayMode: \"minimal\",\n    headerLargeTitle: false,\n  }), []);\n\n  return (\n    <View style={{ flex: 1 }}>\n      <Stack>\n        <Stack.Screen\n          name=\"locate\"\n          options={{ ...newScreenOptions, title: t(\"ONBOARDING_HEADER_LOCATION_SEARCH\") }}\n        />\n        <Stack.Screen\n          name=\"select\"\n          options={{ ...newScreenOptions, title: t(\"ONBOARDING_HEADER_SCHOOLS\") }}\n        />\n        <Stack.Screen\n          name=\"url\"\n          options={{ ...newScreenOptions, title: t(\"ONBOARDING_HEADER_SCHOOL_URL\") }}\n        />\n        <Stack.Screen\n          name=\"browser\"\n          options={{ ...newScreenOptions, title: t(\"ONBOARDING_HEADER_ENT_LOGIN\"), presentation: \"modal\", headerBackground: null }}\n        />\n        <Stack.Screen\n          name=\"qrcode\"\n          options={{ ...newScreenOptions, title: t(\"ONBOARDING_HEADER_QRCODE_LOGIN\") }}\n        />\n      </Stack>\n    </View>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/pronote/browser.tsx",
    "content": "import { useRoute, useTheme } from \"@react-navigation/native\";\nimport { router, useNavigation } from \"expo-router\";\nimport { AccountKind, createSessionHandle, loginToken, SecurityError, SessionHandle } from \"pawnote\";\nimport React, { createRef, RefObject, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Alert, KeyboardAvoidingView, Modal } from \"react-native\";\nimport Reanimated, { FadeIn, FadeOut } from \"react-native-reanimated\";\nimport WebView from \"react-native-webview\";\nimport { WebViewErrorEvent, WebViewMessage, WebViewNavigationEvent } from \"react-native-webview/lib/WebViewTypes\";\n\nimport { useAccountStore } from \"@/stores/account\";\nimport { Services } from \"@/stores/account/types\";\nimport ActivityIndicator from \"@/ui/components/ActivityIndicator\";\nimport Stack from \"@/ui/components/Stack\";\nimport Divider from \"@/ui/new/Divider\";\nimport Typography from \"@/ui/new/Typography\";\nimport { URLToBase64 } from \"@/utils/attachments/helper\";\nimport { customFetcher } from \"@/utils/pronote/fetcher\";\nimport { GetIdentityFromPronoteUsername } from \"@/utils/pronote/name\";\nimport uuid from \"@/utils/uuid/uuid\";\n\nimport OnboardingWebView from \"../../components/OnboardingWebView\";\nimport { Pronote2FAModal } from \"./2fa\";\nimport Button from \"@/ui/new/Button\";\n\nexport default function PronoteENTLogin() {\n  const { colors } = useTheme();\n  const { t } = useTranslation();\n  const navigation = useNavigation();\n  const { params } = useRoute();\n  const { url, school } = params;\n  const baseURL = url.split(\"/pronote\")[0];\n\n  // UI Logic\n  const [browserVisible, setBrowserVisible] = React.useState(false);\n\n  const [hasLoadingBeenTooLong, setHasLoadingBeenTooLong] = useState(false);\n  const [loadingHidden, setLoadingHidden] = useState(false);\n\n  useEffect(() => {\n    navigation.setOptions({ headerShown: false });\n  }, []);\n\n  useEffect(() => {\n    if (browserVisible) {\n      setHasLoadingBeenTooLong(false);\n      return;\n    }\n\n    const timeout = setTimeout(() => {\n      setHasLoadingBeenTooLong(true);\n    }, 15000);\n\n    return () => clearTimeout(timeout);\n  }, [browserVisible]);\n\n  const webViewRef: RefObject<WebView<{}> | null> = createRef<WebView>();\n\n  // Login logic\n  const infoMobileURL = url + \"/InfoMobileApp.json?id=0D264427-EEFC-4810-A9E9-346942A862A4\";\n\n  const [deviceUUID] = useState(uuid());\n  const [received, setReceived] = useState<boolean>(false);\n  console.log(\"WebViewScreen initialized with URL:\", url);\n\n  const [challengeModalVisible, setChallengeModalVisible] = useState<boolean>(false);\n  const [doubleAuthError, setDoubleAuthError] = useState<SecurityError | null>(null);\n  const [doubleAuthSession, setDoubleAuthSession] = useState<SessionHandle | null>(null);\n  const [deviceId, setDeviceId] = useState<string>(\"\");\n  const [hasShownConnectionErrorAlert, setHasShownConnectionErrorAlert] = useState(false);\n\n  const PRONOTE_COOKIE_EXPIRED = new Date(0).toUTCString();\n  const PRONOTE_COOKIE_VALIDATION_EXPIRES = new Date(\n    new Date().getTime() + 5 * 60 * 1000,\n  ).toUTCString();\n  const PRONOTE_COOKIE_LANGUAGE_EXPIRES = new Date(\n    new Date().getTime() + 365 * 24 * 60 * 60 * 1000,\n  ).toUTCString();\n\n  const INJECT_PRONOTE_INITIAL_LOGIN_HOOK = `\n    window.hookAccesDepuisAppli = function() {\n      this.passerEnModeValidationAppliMobile('', '${deviceUUID}');\n    };\n    try {\n          window.GInterface.passerEnModeValidationAppliMobile('', '${deviceUUID}', '', '', '{\"model\": \"random\", \"platform\": \"android\"}');\n    } catch {}\n    `.trim();\n\n  const INJECT_PRONOTE_JSON = `\n      (function () {\n        try {\n          const json = JSON.parse(document.body.innerText);\n          const lJetonCas = !!json && !!json.CAS && json.CAS.jetonCAS;\n          \n          document.cookie = \"appliMobile=; expires=${PRONOTE_COOKIE_EXPIRED}\"\n\n          if (!!lJetonCas) {\n            document.cookie = \"validationAppliMobile=\" + lJetonCas + \"; expires=${PRONOTE_COOKIE_VALIDATION_EXPIRES}\";\n            document.cookie = \"uuidAppliMobile=${deviceUUID}; expires=${PRONOTE_COOKIE_VALIDATION_EXPIRES}\";\n            // 1036 = French\n            document.cookie = \"ielang=1036; expires=${PRONOTE_COOKIE_LANGUAGE_EXPIRES}\";\n          }\n\n          console.log(lJetonCas)\n\n          window.location.assign(\"${url}/mobile.eleve.html?fd=1\");\n        }\n        catch (error) {\n          console.error(\"Error parsing JSON or injecting cookies:\", error);\n        }\n      })();\n    `.trim();\n\n  const INJECT_PRONOTE_CURRENT_LOGIN_STATE = `\n    (function () {\n      setInterval(function() {\n        const state = window && window.loginState ? window.loginState : void 0;\n\n        window.ReactNativeWebView.postMessage(JSON.stringify({\n          type: 'pronote.loginState',\n          data: state\n        }));\n      }, 1000);\n    })();\n    `.trim();\n\n  const INJECT_PRONOTE_CONNECTION_ERROR_WATCHER = `\n    (function () {\n      if (window.__pronoteConnImpossibleWatcherInstalled) return;\n      window.__pronoteConnImpossibleWatcherInstalled = true;\n\n      function hasConnectionError() {\n        const nodes = document.querySelectorAll('div');\n        for (let i = 0; i < nodes.length; i += 1) {\n          const node = nodes[i];\n          const raw = node && node.textContent ? node.textContent : \"\";\n          const text = raw\n            .normalize(\"NFD\")\n            .replace(/[\\\\u0300-\\\\u036f]/g, \"\")\n            .toLowerCase()\n            .trim();\n\n          if (!text) continue;\n          if (text.includes(\"connexion impossible\") || text.includes(\"erreur\")) {\n            return true;\n          }\n        }\n\n        return false;\n      }\n\n      function notifyIfNeeded() {\n        if (window.__pronoteConnImpossibleSent) return;\n        if (!hasConnectionError()) return;\n        window.__pronoteConnImpossibleSent = true;\n        window.ReactNativeWebView.postMessage(JSON.stringify({\n          type: 'pronote.connectionError'\n        }));\n      }\n\n      notifyIfNeeded();\n      setInterval(notifyIfNeeded, 1000);\n\n      const observer = new MutationObserver(notifyIfNeeded);\n      observer.observe(document.documentElement || document.body, { childList: true, subtree: true, characterData: true });\n    })();\n    `.trim();\n\n  const onWebviewMessage = async ({ nativeEvent }: { nativeEvent: WebViewMessage }) => {\n    let message: { type?: string; data?: any };\n    try {\n      message = JSON.parse(nativeEvent.data);\n    } catch {\n      return;\n    }\n    console.log(\"Message received from WebView:\", message);\n\n    if (message.type === \"pronote.connectionError\") {\n      setBrowserVisible(true);\n      if (!hasShownConnectionErrorAlert) {\n        setHasShownConnectionErrorAlert(true);\n        Alert.alert(\"Connexion impossible\", \"La connexion à Pronote est impossible. Cele vient probablement de votre établissement ou d'une erreur de configuration.\");\n      }\n      return;\n    }\n\n    if (received) { return; }\n\n    if (message.type === \"pronote.loginState\") {\n      console.log(\"Login state message received:\", message.data);\n\n      if (!message.data) {\n        console.warn(\"No login data in message\");\n        return;\n      }\n      if (message.data.status !== 0) {\n        console.warn(\"Login status is not valid:\", message.data.status);\n        return;\n      }\n      setReceived(true);\n\n      console.log(message.data.login, message.data.mdp);\n      console.log(\"Creating session handle...\");\n      const session = createSessionHandle(customFetcher);\n      try {\n        const refresh = await loginToken(\n          session,\n          {\n            url: url,\n            kind: AccountKind.STUDENT,\n            username: message.data.login,\n            token: message.data.mdp,\n            deviceUUID,\n          },\n        );\n\n        if (!refresh) {\n          throw new Error(\"Erreur lors de la connexion\");\n        }\n\n        console.log(\"Login successful, adding account to store...\");\n        const schoolName = session.user.resources[0].establishmentName;\n        const className = session.user.resources[0].className;\n        const { firstName, lastName } = GetIdentityFromPronoteUsername(session.user.name)\n\n        let pp = \"\";\n        if (session.user.resources[0].profilePicture?.url) {\n          pp = await URLToBase64(session.user.resources[0].profilePicture?.url)\n        }\n\n        useAccountStore.getState().addAccount({\n          id: deviceUUID,\n          firstName,\n          lastName,\n          schoolName,\n          className,\n          customisation: {\n            profilePicture: pp,\n            subjects: {}\n          },\n          services: [{\n            id: deviceUUID,\n            auth: {\n              accessToken: refresh.token,\n              refreshToken: refresh.token,\n              additionals: {\n                instanceURL: refresh.url,\n                kind: refresh.kind,\n                username: refresh.username,\n                deviceUUID,\n              },\n            },\n            serviceId: Services.PRONOTE,\n            createdAt: (new Date()).toISOString(),\n            updatedAt: (new Date()).toISOString(),\n          }],\n          createdAt: (new Date()).toISOString(),\n          updatedAt: (new Date()).toISOString(),\n        });\n        useAccountStore.getState().setLastUsedAccount(deviceUUID);\n\n        const parent = navigation.getParent();\n        if (parent) {\n          parent.goBack();\n          \n          const parentsParent = parent.getParent();\n          if (parentsParent) {\n            parentsParent.goBack();\n          }\n        }\n\n        router.back();\n        router.dismissAll();\n        return router.push(\"/\");\n      } catch (error) {\n        if (error instanceof SecurityError && !error.handle.shouldCustomPassword && !error.handle.shouldCustomDoubleAuth) {\n          setDoubleAuthError(error)\n          setDoubleAuthSession(session)\n          setDeviceId(deviceUUID)\n          setChallengeModalVisible(true)\n        } else {\n          console.error(\"Error during login:\", error);\n          Alert.alert(\"Erreur\", \"Une erreur est survenue lors de la connexion à Pronote. Veuillez réessayer.\");\n          throw error;\n        }\n      }\n    }\n  };\n\n  const onWebviewLoadEnd = (e: WebViewNavigationEvent | WebViewErrorEvent) => {\n    const { url } = e.nativeEvent;\n    console.log(\"WebView finished loading URL:\", url);\n\n    if (url === infoMobileURL) {\n      setBrowserVisible(false);\n    } else {\n      setBrowserVisible(true);\n    }\n\n    webViewRef.current?.injectJavaScript(\n      INJECT_PRONOTE_INITIAL_LOGIN_HOOK,\n    );\n\n    if (url.startsWith(baseURL)) {\n      webViewRef.current?.injectJavaScript(\n        INJECT_PRONOTE_CONNECTION_ERROR_WATCHER,\n      );\n    }\n\n    if (url === infoMobileURL) {\n      console.log(\"Injecting JSON script for InfoMobileURL\");\n      webViewRef.current?.injectJavaScript(INJECT_PRONOTE_JSON);\n    } else if (url.includes(\"mobile.eleve.html\")) {\n      console.log(\"Injecting login state scripts for student account\");\n      webViewRef.current?.injectJavaScript(\n        INJECT_PRONOTE_INITIAL_LOGIN_HOOK,\n      );\n      webViewRef.current?.injectJavaScript(\n        INJECT_PRONOTE_CURRENT_LOGIN_STATE,\n      );\n    }\n  };\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1 }} behavior=\"padding\" keyboardVerticalOffset={20}>\n      {!browserVisible && !loadingHidden &&\n        <Reanimated.View\n          style={{\n            height: \"100%\",\n            width: \"100%\",\n            position: \"absolute\",\n            backgroundColor: colors.card,\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            zIndex: 1000,\n          }}\n          entering={FadeIn.duration(130)}\n          exiting={FadeOut.duration(130)}\n        >\n          <Stack vAlign=\"center\" hAlign=\"center\" width={\"100%\"} gap={3} padding={20}>\n            <ActivityIndicator />\n            <Divider height={12} ghost />\n            <Typography align=\"center\" variant=\"h4\">{t(\"ONBOARDING_LOGIN_TO\")} {school && school.name ? school.name : t(\"ONBOARDING_YOUR_SCHOOL\")}</Typography>\n            <Typography align=\"center\" variant=\"body\" color=\"textSecondary\">{t(\"ONBOARDING_SCHOOLS_SEARCHING_HINT\")}</Typography>\n\n            {hasLoadingBeenTooLong && (\n              <Button label=\"Masquer\" variant=\"text\" onPress={() => setLoadingHidden(true)} />\n            )}\n          </Stack>\n        </Reanimated.View>\n      }\n\n      <OnboardingWebView\n        source={{ uri: infoMobileURL }}\n        webViewRef={webViewRef}\n        incognito={true}\n        userAgent=\"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36\"\n        onMessage={onWebviewMessage}\n        onLoadEnd={onWebviewLoadEnd}\n        startInLoadingState\n        onOpenWindow={(evt) => {\n          webViewRef.current?.stopLoading();\n          webViewRef.current?.injectJavaScript(`window.location.assign(\"${evt.nativeEvent.targetUrl}\");`); // Yes, this is tricky, but it's in official documentation\n        }}\n        injectedJavaScript={`\n        var meta = document.createElement('meta');\n        meta.setAttribute('name', 'viewport');\n        meta.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no');\n        document.getElementsByTagName('head')[0].appendChild(meta);\n        `}\n      />\n\n      <Modal\n        visible={challengeModalVisible}\n        animationType=\"slide\"\n        presentationStyle=\"pageSheet\"\n        onRequestClose={() => setChallengeModalVisible(false)}\n      >\n        <Pronote2FAModal doubleAuthSession={doubleAuthSession} doubleAuthError={doubleAuthError} setChallengeModalVisible={setChallengeModalVisible} deviceId={deviceId} />\n      </Modal>\n    </KeyboardAvoidingView>\n  )\n}\n"
  },
  {
    "path": "app/(onboarding)/services/pronote/locate.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport { useNavigation } from \"expo-router\";\nimport React, { memo, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { KeyboardAvoidingView, Platform } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport ActivityIndicator from \"@/ui/components/ActivityIndicator\";\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Icon from \"@/ui/components/Icon\";\nimport Search from \"@/ui/components/Search\";\nimport Stack from \"@/ui/components/Stack\";\nimport Divider from \"@/ui/new/Divider\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport { GeographicSearchCities } from \"@/utils/native/georeverse\";\n\nconst convertPostalCode\n= (postalCode: string) => {\n  if (postalCode.length < 5) {\n    return \"0\" + postalCode;\n  }\n  return postalCode;\n}\n\nexport interface School {\n  name: string,\n  distance: number,\n  url: string\n}\n\nconst PronoteSearchHeader = memo(({\n  city,\n  setCity,\n  loading,\n  showElse,\n  t\n}: {\n  city: string,\n  setCity: (text: string) => void,\n  loading: boolean,\n  showElse: boolean,\n  t: (key: string, options?: any) => string\n}) => (\n  <Stack padding={[4, 0]}>\n    <Typography variant=\"h2\">{t(\"ONBOARDING_SEARCH_TITLE\")}</Typography>\n    <Typography variant=\"action\" color=\"textSecondary\">{t(\"ONBOARDING_PRONOTE_LOCATION_HELP\")}</Typography>\n    <Divider height={6} ghost />\n    <Search placeholder={t(\"ONBOARDING_METHOD_SEARCH\")} style={{ width: \"100%\" }} value={city} setValue={setCity} onTextChange={setCity} autoFocus={city.trim().length === 0} />\n    \n    {loading &&\n      <Dynamic animated>\n        <Stack vAlign=\"center\" hAlign=\"center\" width={\"100%\"} gap={2}>\n          <Divider height={18} ghost />\n          <ActivityIndicator />\n          <Divider height={12} ghost />\n          <Typography align=\"center\" variant=\"h5\">{t(\"ONBOARDING_SCHOOLS_SEARCHING\")}</Typography>\n          <Typography align=\"center\" variant=\"body\" color=\"textSecondary\">{t(\"ONBOARDING_SCHOOLS_SEARCHING_HINT\")}</Typography>\n        </Stack>\n      </Dynamic>\n    }\n\n    <Divider height={18} ghost />\n  </Stack>\n));\n\nexport default function PronoteLoginMethod() {\n  const headerHeight = useHeaderHeight();\n  const insets = useSafeAreaInsets();\n  const navigation = useNavigation();\n  const { t } = useTranslation();\n\n  const [city, setCity] = useState<string>(\"\");\n  const [debouncedCity, setDebouncedCity] = useState<string>(\"\");\n  const [cities, setCities] = useState<Array<School>>([]);\n  const [loading, setLoading] = useState<boolean>(false);\n\n  useEffect(() => {\n    const timeout = setTimeout(() => {\n      setDebouncedCity(city.trim());\n    }, 350);\n\n    return () => {\n      clearTimeout(timeout);\n    };\n  }, [city]);\n\n  useEffect(() => {\n    if(!debouncedCity || debouncedCity.length < 3) {\n      setCities([]);\n      setLoading(false);\n    } else {\n      let canceled = false;\n\n      setLoading(true);\n      GeographicSearchCities(debouncedCity)\n        .then((cities) => {\n          if(canceled) {\n            return;\n          }\n          setCities(cities.sort((a, b) => b.importance - a.importance).splice(0, 10));\n        })\n        .finally(() => {\n          if(canceled) {\n            return;\n          }\n          setLoading(false);\n        });\n\n      return () => {\n        canceled = true;\n      };\n    }\n  }, [debouncedCity]);\n\n  const selectCity = (city: School) => {\n    navigation.navigate(`select`, { city: city });\n  }\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1 }} behavior={Platform.OS === 'ios' ? 'padding' : 'height'} keyboardVerticalOffset={Platform.select({ android: 0, default: 20 })}>\n      <List\n        ListHeaderComponent={<PronoteSearchHeader city={city} setCity={setCity} loading={loading && cities.length === 0} showElse={cities.length === 0 && !loading} t={t} />}\n        contentContainerStyle={{\n          padding: 16,\n          flexGrow: 1,\n          gap: 10,\n          paddingTop: headerHeight + 20,\n          paddingBottom: insets.bottom + 20,\n        }}\n        style={{ flex: 1 }}\n        animated\n      >\n        {cities.length === 0 && !loading && (\n          <List.Item animated onPress={() => navigation.navigate(\"qrcode\")}>\n            <List.Leading>\n              <Icon><Papicons name=\"qrcode\" /></Icon>\n            </List.Leading>\n            <Typography variant='title'>{t(\"ONBOARDING_PRONOTE_LOGIN_QRCODE\")}</Typography>\n            <Typography variant='body' color=\"textSecondary\">\n              {t(\"ONBOARDING_PRONOTE_LOGIN_QRCODE_DESCRIPTION\")}\n            </Typography>\n          </List.Item>\n        )}\n\n        {cities.length === 0 && !loading && (\n          <List.Item animated onPress={() => navigation.navigate(\"url\")}>\n            <List.Leading>\n              <Icon><Papicons name=\"link\" /></Icon>\n            </List.Leading>\n            <Typography variant='title'>{t(\"ONBOARDING_PRONOTE_LOGIN_URL\")}</Typography>\n          </List.Item>\n        )}\n\n        {cities.map((city, i) => (\n          <List.Item animated={true} key={city.id} id={city.id} onPress={() => {selectCity(city)}}>\n            <List.Leading>\n              <Icon><Papicons name=\"mappin\" /></Icon>\n            </List.Leading>\n            <Typography variant=\"title\">{city.city}</Typography>\n            <Typography variant=\"body1\" color=\"textSecondary\">\n              {city.context}\n            </Typography>\n            <List.Trailing>\n              <Typography variant=\"body1\" color=\"textSecondary\">\n                {convertPostalCode(city.postalCode.toString())}\n              </Typography>\n            </List.Trailing>\n          </List.Item>\n        ))}\n      </List>\n    </KeyboardAvoidingView>\n  )\n}\n"
  },
  {
    "path": "app/(onboarding)/services/pronote/qrcode.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport MaskedView from \"@react-native-masked-view/masked-view\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { CameraView, useCameraPermissions } from \"expo-camera\";\nimport * as Haptics from \"expo-haptics\";\nimport { router, useGlobalSearchParams } from \"expo-router\";\nimport { AuthenticateError, createSessionHandle, loginQrCode, SecurityError } from \"pawnote\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ActivityIndicator, Keyboard, KeyboardAvoidingView, Modal, StyleSheet, TextInput, View } from \"react-native\";\nimport Reanimated, { FadeInUp, FadeOutUp, LinearTransition } from \"react-native-reanimated\";\nimport { SafeAreaView, useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport { useAccountStore } from \"@/stores/account\";\nimport { Services } from \"@/stores/account/types\";\nimport Button from \"@/ui/components/Button\";\nimport Icon from \"@/ui/components/Icon\";\nimport Typography from \"@/ui/components/Typography\";\nimport { URLToBase64 } from \"@/utils/attachments/helper\";\nimport { customFetcher } from \"@/utils/pronote/fetcher\";\nimport { GetIdentityFromPronoteUsername } from \"@/utils/pronote/name\";\nimport uuid from \"@/utils/uuid/uuid\";\n\nexport default function PronoteLoginWithQR() {\n  const theme = useTheme();\n  const insets = useSafeAreaInsets();\n\n  const { colors } = theme;\n  const [permission, requestPermission] = useCameraPermissions();\n  const [scanned, setScanned] = useState(false);\n\n  const [keyboardOpen, setKeyboardOpen] = useState(false);\n\n  const [QRValidationCode, setQRValidationCode] = useState(\"\");\n  const [pinModalVisible, setPinModalVisible] = useState(false);\n\n  const [loadingModalVisible, setLoadingModalVisible] = useState(false);\n\n  const codeInput = React.createRef<TextInput>();\n  const [QRData, setQRData] = useState<string | null>(null);\n\n  async function loginQR() {\n    setScanned(false);\n    setLoadingModalVisible(true);\n\n    if (QRValidationCode === \"\" || QRValidationCode.length !== 4) {\n      // Handle error\n      return;\n    }\n\n    const accountID = uuid();\n\n    try {\n      const decodedJSON = JSON.parse(QRData!);\n\n      const data = {\n        jeton: decodedJSON.jeton,\n        login: decodedJSON.login,\n        url: decodedJSON.url,\n      };\n\n      const session = createSessionHandle(customFetcher);\n      const refresh = await loginQrCode(session, {\n        qr: data,\n        pin: QRValidationCode,\n        deviceUUID: accountID\n      }).catch((error) => {\n        if (error instanceof SecurityError && !error.handle.shouldCustomPassword && !error.handle.shouldCustomDoubleAuth) {\n          router.push({\n            pathname: \"/(onboarding)/services/pronote/2fa\",\n            params: {\n              error: JSON.stringify(error),\n              session: JSON.stringify(session),\n              deviceId: accountID\n            }\n          });\n        } else {\n          throw error;\n        }\n      });\n\n      if (!refresh) { throw AuthenticateError; }\n\n      const user = session.user.resources[0];\n      const schoolName = user.establishmentName;\n      const className = user.className;\n      const { firstName, lastName } = GetIdentityFromPronoteUsername(session.user.name)\n      let pp = \"\";\n      if (session.user.resources[0].profilePicture?.url) {\n        pp = await URLToBase64(session.user.resources[0].profilePicture?.url)\n      }\n\n      useAccountStore.getState().addAccount({\n        id: accountID,\n        firstName,\n        lastName,\n        schoolName,\n        className,\n        customisation: {\n          profilePicture: pp,\n          subjects: {}\n        },\n        services: [{\n          id: accountID,\n          auth: {\n            accessToken: refresh.token,\n            refreshToken: refresh.token,\n            additionals: {\n              instanceURL: refresh.url,\n              kind: refresh.kind,\n              username: refresh.username,\n              deviceUUID: accountID\n            }\n          },\n          serviceId: Services.PRONOTE,\n          createdAt: (new Date()).toISOString(),\n          updatedAt: (new Date()).toISOString()\n        }],\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString()\n      });\n      useAccountStore.getState().setLastUsedAccount(accountID)\n      setTimeout(() => {\n        setLoadingModalVisible(false);\n        router.push({\n          pathname: \"../end/color\",\n          params: {\n            accountId: accountID\n          }\n        });\n      }, 1000);\n    } catch (error) {\n      console.error(error);\n      // Handle error\n    }\n  }\n\n  useEffect(() => {\n    if (!permission?.granted) {\n      requestPermission();\n    }\n  }, [permission?.granted, requestPermission]);\n\n  const handleBarCodeScanned = ({\n    type,\n    data,\n  }: {\n    type: string;\n    data: string;\n  }) => {\n    setScanned(true);\n    Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);\n    setQRData(data);\n    setPinModalVisible(true);\n  };\n\n  useEffect(() => {\n    if (!pinModalVisible) {\n      setScanned(false);\n      setQRData(null);\n    }\n  }, [pinModalVisible]);\n\n  const keyboardDidShow = () => setKeyboardOpen(true);\n  const keyboardDidHide = () => setKeyboardOpen(false);\n\n  useEffect(() => {\n    const keyboardDidShowListener = Keyboard.addListener(\"keyboardDidShow\", keyboardDidShow);\n    const keyboardDidHideListener = Keyboard.addListener(\"keyboardDidHide\", keyboardDidHide);\n\n    return () => {\n      keyboardDidShowListener?.remove();\n      keyboardDidHideListener?.remove();\n    };\n  }, []);\n\n  const local = useGlobalSearchParams();\n\n  const { t } = useTranslation();\n\n  return (\n    <SafeAreaView style={styles.container}>\n      <Modal\n        visible={loadingModalVisible}\n        animationType=\"slide\"\n        presentationStyle=\"pageSheet\"\n      >\n        <View\n          style={{\n            flex: 1,\n            backgroundColor: colors.background,\n            justifyContent: \"center\",\n            alignItems: \"center\",\n          }}\n        >\n          <View style={{ flex: 1 }} />\n\n          <ActivityIndicator\n            size=\"large\"\n          />\n\n          <Typography\n            style={{\n              fontSize: 18,\n              fontWeight: \"600\",\n              color: colors.text,\n              marginTop: 16,\n            }}\n          >\n            {t(\"ONBOARDING_LOADING_LOGIN\")}\n          </Typography>\n\n          <Typography\n            style={{\n              fontSize: 16,\n              fontWeight: \"400\",\n              color: colors.text + \"80\",\n              marginTop: 4,\n            }}\n          >\n            {t(\"ONBOARDING_QRCODE_WAIT\")}\n          </Typography>\n\n          <View style={{ flex: 1 }} />\n\n          <View\n            style={{\n              width: \"100%\",\n              paddingHorizontal: 16,\n              paddingBottom: insets.bottom,\n              gap: 8,\n            }}\n          >\n            <Button\n              title={t(\"CANCEL_BTN\")}\n              onPress={() => {\n                setLoadingModalVisible(false);\n                router.back();\n              }}\n            />\n          </View>\n        </View>\n      </Modal>\n\n      <Modal\n        visible={pinModalVisible}\n        animationType=\"slide\"\n        presentationStyle=\"pageSheet\"\n        onRequestClose={() => {\n          setPinModalVisible(!pinModalVisible);\n        }}\n      >\n        <KeyboardAvoidingView\n          style={{\n            flex: 1,\n            backgroundColor: colors.background,\n          }}\n          behavior=\"padding\"\n          keyboardVerticalOffset={insets.top}\n        >\n          <View\n            style={{\n              justifyContent: \"center\",\n              alignItems: \"center\",\n              marginBottom: 24,\n              paddingVertical: 16,\n              paddingHorizontal: 20,\n              borderBottomColor: colors.border,\n              borderBottomWidth: 0.5,\n            }}\n          >\n            <Typography\n              style={{\n                fontSize: 17,\n                fontWeight: \"600\",\n                color: colors.text,\n                textAlign: \"center\",\n              }}\n            >\n              {t(\"ONBOARDING_QRCODE_VALIDATION\")}\n            </Typography>\n          </View>\n\n          <Reanimated.View\n            entering={FadeInUp.duration(250)}\n            exiting={FadeOutUp.duration(150)}\n            style={{\n              zIndex: 9999,\n              paddingTop: keyboardOpen ? 20 : 100,\n              alignItems: \"center\",\n            }}\n            layout={LinearTransition}\n          >\n            <Typography style={{\n              color: colors.text,\n              fontSize: 16,\n              textAlign: \"center\",\n              marginHorizontal: 24,\n              fontWeight: \"400\",\n              width: 300,\n              marginBottom: 12\n            }}>\n              {t(\"ONBOARDING_PRONOTE_PIN\")}\n            </Typography>\n          </Reanimated.View>\n\n          <View\n            style={{\n              flex: 1,\n              alignItems: \"center\",\n              marginBottom: \"7%\",\n            }}\n          >\n            <TextInput\n              style={{\n                width: \"90%\",\n                paddingHorizontal: 20,\n                paddingVertical: 15,\n                backgroundColor: colors.card,\n                borderRadius: 12,\n                fontSize: 24,\n                color: colors.text,\n                textAlign: \"center\",\n                borderColor: colors.border,\n                borderWidth: 2,\n                fontWeight: \"500\",\n              }}\n              placeholderTextColor={colors.text + \"80\"}\n              placeholder=\"••••\"\n              keyboardType=\"number-pad\"\n              maxLength={4}\n              secureTextEntry\n              value={QRValidationCode}\n              onChangeText={(text) => setQRValidationCode(text)}\n              ref={codeInput}\n              autoFocus\n            />\n          </View>\n\n          <View\n            style={{\n              width: \"100%\",\n              paddingHorizontal: 16,\n              paddingBottom: insets.bottom + 16,\n              gap: 8,\n            }}\n          >\n            <Button\n              title={t(\"CONFIRM_BTN\")}\n              onPress={() => {\n                setPinModalVisible(false);\n                loginQR();\n              }}\n            />\n            <Button\n              title={t(\"CANCEL_BTN\")}\n              variant=\"outline\"\n              onPress={() => {\n                setPinModalVisible(false);\n              }}\n            />\n          </View>\n        </KeyboardAvoidingView>\n      </Modal>\n\n      <View style={[styles.explainations,\n        { top: insets.top + 48 + 10 }\n      ]}>\n        <Icon size={40} fill={\"white\"} papicon>\n          <Papicons name=\"QrCode\" />\n        </Icon>\n        <Typography style={styles.title}>\n          {t(\"ONBOARDING_LOGIN_TO\")} PRONOTE\n        </Typography>\n        <Typography style={styles.text}>\n          {t(\"ONBOARDING_SCAN_QRCODE\")}\n        </Typography>\n      </View>\n\n      <MaskedView\n        style={StyleSheet.absoluteFillObject}\n        maskElement={\n          <View style={styles.maskContainer}>\n            <View style={styles.transparentSquare} />\n          </View>\n        }\n      >\n        <View\n          style={styles.maskContainer}\n        />\n        {permission?.granted && (\n          <CameraView\n            facing=\"back\"\n            barcodeScannerSettings={{ barcodeTypes: [\"qr\"] }}\n            onBarcodeScanned={\n              scanned ? undefined : handleBarCodeScanned\n            }\n            style={StyleSheet.absoluteFillObject}\n          />\n        )}\n        {permission?.granted && (\n          <View style={styles.transparentSquareBorder} />\n        )}\n      </MaskedView>\n    </SafeAreaView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    backgroundColor: \"black\",\n  },\n  maskContainer: {\n    flex: 1,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    backgroundColor: \"rgba(0, 0, 0, 0.3)\",\n  },\n  transparentSquare: {\n    position: \"absolute\",\n    width: 300,\n    height: 300,\n    backgroundColor: \"black\",\n    borderWidth: 2,\n    borderColor: \"#fff\",\n    borderRadius: 30,\n    borderCurve: \"continuous\",\n    alignSelf: \"center\",\n    top: \"35%\",\n  },\n  backButton: {\n    position: 'absolute',\n    left: 16,\n    zIndex: 200,\n    backgroundColor: '#ffffff42',\n    padding: 10,\n    borderRadius: 100,\n  },\n  transparentSquareBorder: {\n    position: \"absolute\",\n    width: 300,\n    height: 300,\n    backgroundColor: \"transparent\",\n    borderWidth: 2,\n    borderColor: \"#fff\",\n    borderRadius: 30,\n    borderCurve: \"continuous\",\n    alignSelf: \"center\",\n    top: \"35%\",\n  },\n\n  explainations: {\n    position: \"absolute\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    marginHorizontal: 24,\n    gap: 4,\n    zIndex: 9999,\n  },\n  title: {\n    fontSize: 18,\n    fontWeight: \"600\",\n    color: \"white\",\n    textAlign: \"center\",\n  },\n  text: {\n    fontSize: 16,\n    fontWeight: \"400\",\n    color: \"white\",\n    textAlign: \"center\",\n    opacity: 0.8,\n  },\n});\n"
  },
  {
    "path": "app/(onboarding)/services/pronote/select.tsx",
    "content": "import { useHeaderHeight } from \"@react-navigation/elements\";\nimport { useRoute, useTheme } from \"@react-navigation/native\";\nimport { useNavigation } from \"expo-router\";\nimport { geolocation } from \"pawnote\";\nimport React, { memo, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Image, KeyboardAvoidingView, Platform } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport ActivityIndicator from \"@/ui/components/ActivityIndicator\";\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Search from \"@/ui/components/Search\";\nimport Stack from \"@/ui/components/Stack\";\nimport Divider from \"@/ui/new/Divider\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\n\n\nexport interface School {\n  name: string,\n  distance: number,\n  url: string\n}\n\nconst PronoteSearchHeader = memo(({\n  search,\n  setSearch,\n  loading,\n  t\n}: {\n  search: string,\n  setSearch: (text: string) => void,\n  loading: boolean,\n  t: (key: string, options?: any) => string\n}) => (\n  <Stack padding={[4, 0]}>\n    <Typography variant=\"h2\">{t(\"ONBOARDING_SELECT_SCHOOL\")}</Typography>\n    <Typography variant=\"action\" color=\"textSecondary\">{t(\"ONBOARDING_PRONOTE_LOCATION_HELP\")}</Typography>\n    <Divider height={6} ghost />\n    <Search placeholder={t(\"ONBOARDING_SEARCH_SCHOOL_PLACEHOLDER\")} style={{ width: \"100%\" }} value={search} setValue={setSearch} onTextChange={setSearch} />\n\n    {loading &&\n      <Dynamic animated>\n        <Stack vAlign=\"center\" hAlign=\"center\" width={\"100%\"} gap={2}>\n          <Divider height={18} ghost />\n          <ActivityIndicator />\n          <Divider height={12} ghost />\n          <Typography align=\"center\" variant=\"h5\">{t(\"ONBOARDING_SCHOOLS_SEARCHING\")}</Typography>\n          <Typography align=\"center\" variant=\"body\" color=\"textSecondary\">{t(\"ONBOARDING_SCHOOLS_SEARCHING_HINT\")}</Typography>\n        </Stack>\n      </Dynamic>\n    }\n\n    <Divider height={18} ghost />\n  </Stack>\n));\n\nexport default function PronoteLoginSelectEtab() {\n  const headerHeight = useHeaderHeight();\n  const { colors } = useTheme();\n  const insets = useSafeAreaInsets();\n  const navigation = useNavigation();\n  const { t } = useTranslation();\n\n  const { params } = useRoute();\n  const { city } = params;\n\n  const [search, setSearch] = useState<string>(\"\");\n  const [schools, setSchools] = useState<Array<School>>([]);\n  const [loading, setLoading] = useState<boolean>(true);\n\n  useEffect(() => {\n    if(!city) {return;}\n    navigation.setOptions({ headerTitle: t(\"ONBOARDING_SCHOOLS_IN_CITY\", { city: city.city }) });\n    geolocation({ latitude: city?.latitude ?? 0, longitude: city?.longitude ?? 0 }).then((schoolsFound) => {\n      setSchools(schoolsFound);\n      setLoading(false);\n    });\n  }, [city, navigation, t]);\n\n  const filteredSchools = schools.filter(school => school.name.toLowerCase().includes(search.toLowerCase()));\n\n  const selectSchool = (school: School) => {\n    navigation.navigate(\"browser\", { url: school.url, school });\n  }\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1 }} behavior={Platform.OS === 'ios' ? 'padding' : 'height'} keyboardVerticalOffset={Platform.select({ android: 0, default: 20 })}>\n      <List\n        animated\n        ListHeaderComponent={<PronoteSearchHeader search={search} setSearch={setSearch} loading={loading} t={t} />}\n        contentContainerStyle={{\n          padding: 16,\n          flexGrow: 1,\n          gap: 10,\n          paddingTop: headerHeight + 20,\n          paddingBottom: insets.bottom + 20,\n        }}\n        style={{ flex: 1 }}\n      >\n\n        {filteredSchools.map((school, i) => (\n          <List.Item animated={true} id={school.url} key={school.url} onPress={() => selectSchool(school)}>\n            <List.Leading>\n              <Image\n                source={require(\"@/assets/images/service_pronote.png\")}\n                style={{ width: 32, height: 32, borderRadius: 8 }}\n              />\n            </List.Leading>\n            <Typography variant=\"title\" numberOfLines={2}>\n              {school.name}\n            </Typography>\n            <Typography variant=\"body\" color=\"textSecondary\" numberOfLines={1}>\n              {school.url}\n            </Typography>\n          </List.Item>\n        ))}\n      </List>\n    </KeyboardAvoidingView>\n  )\n}\n"
  },
  {
    "path": "app/(onboarding)/services/pronote/url.tsx",
    "content": "import { useHeaderHeight } from \"@react-navigation/elements\";\nimport { useNavigation } from \"expo-router\";\nimport React, { memo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { KeyboardAvoidingView } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport Search from \"@/ui/components/Search\";\nimport Stack from \"@/ui/components/Stack\";\nimport Button from \"@/ui/new/Button\";\nimport Divider from \"@/ui/new/Divider\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\n\nconst PronoteSearchHeader = memo(({\n}: {\n}) => {\n  const navigation = useNavigation();\n  const { t } = useTranslation();\n  const [url, setUrl] = React.useState(\"\");\n\n  const submitURL = () => {\n    if (url.trim().length === 0) {return;}\n    navigation.navigate(\"browser\", { url });\n  };\n\n  const urlValid = url.trim().length > 0 && (url.startsWith(\"http://\") || url.startsWith(\"https://\"));\n\n  return (\n    <Stack padding={[4, 0]}>\n      <Typography variant=\"h2\">{t(\"ONBOARDING_URL\")}</Typography>\n      <Typography variant=\"action\" color=\"textSecondary\">{t(\"ONBOARDING_PRONOTE_LOCATION_HELP\")}</Typography>\n      <Divider height={6} ghost />\n      <Search icon=\"link\" placeholder={t(\"ONBOARDING_URL_PLACEHOLDER\")} style={{ width: \"100%\" }} value={url} setValue={setUrl} onTextChange={setUrl} autoFocus={url.trim().length === 0} />\n\n      <Divider height={3} ghost />\n      <Button label={t(\"CONFIRM_BTN\")} fullWidth height={44} onPress={() => submitURL()} disabled={!urlValid} />\n\n      <Divider height={18} ghost />\n    </Stack>\n  )\n});\n\nexport default function PronoteLoginURL() {\n  const headerHeight = useHeaderHeight();\n  const insets = useSafeAreaInsets();\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1 }} behavior=\"padding\" keyboardVerticalOffset={20}>\n      <List\n        ListHeaderComponent={<PronoteSearchHeader />}\n        contentContainerStyle={{\n          padding: 16,\n          flexGrow: 1,\n          gap: 10,\n          paddingTop: headerHeight + 20,\n          paddingBottom: insets.bottom + 20,\n        }}\n        style={{ flex: 1 }}\n        animated\n      >\n      </List>\n    </KeyboardAvoidingView>\n  )\n}\n"
  },
  {
    "path": "app/(onboarding)/services/skolengo/_layout.tsx",
    "content": "import React from 'react';\nimport { useTranslation } from \"react-i18next\";\n\nimport { Stack } from 'expo-router';\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport { Platform } from 'react-native';\nimport { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';\n\nexport default function OnboardingLayout() {\n  const { t } = useTranslation();\n  const newScreenOptions = React.useMemo(() => ({\n    ...screenOptions,\n    headerShown: true,\n    ...AndroidHeaderProps,\n    headerTransparent: true,\n    headerBackButtonDisplayMode: \"minimal\",\n    headerLargeTitle: false,\n  }), []);\n\n  return (\n    <Stack>\n      <Stack.Screen\n        name=\"locate\"\n        options={{ ...newScreenOptions, headerTitle: t(\"ONBOARDING_HEADER_SKOLENGO_LOGIN\") }}\n      />\n      <Stack.Screen\n        name=\"webview\"\n        options={{ ...newScreenOptions, headerShown: false, presentation: \"modal\" }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/services/skolengo/locate.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport { router, useNavigation } from \"expo-router\";\nimport React, { memo, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { KeyboardAvoidingView, Platform } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { SearchSchools } from \"skolengojs\";\n\nimport ActivityIndicator from \"@/ui/components/ActivityIndicator\";\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Icon from \"@/ui/components/Icon\";\nimport Search from \"@/ui/components/Search\";\nimport Stack from \"@/ui/components/Stack\";\nimport Divider from \"@/ui/new/Divider\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\n\n\nexport interface School {\n  name: string,\n  distance: number,\n  url: string\n}\n\nconst PronoteSearchHeader = memo(({\n  city,\n  setCity,\n  loading,\n  showElse,\n  t\n}: {\n  city: string,\n  setCity: (text: string) => void,\n  loading: boolean,\n  showElse: boolean,\n  t: (key: string, options?: any) => string\n}) => (\n  <Stack padding={[4, 0]}>\n    <Typography variant=\"h2\">{t(\"ONBOARDING_SEARCH_TITLE\")}</Typography>\n    <Typography variant=\"action\" color=\"textSecondary\">{t(\"ONBOARDING_PRONOTE_LOCATION_HELP\")}</Typography>\n    <Divider height={6} ghost />\n    <Search placeholder={t(\"ONBOARDING_METHOD_SEARCH\")} style={{ width: \"100%\" }} value={city} setValue={setCity} onTextChange={setCity} autoFocus={city.trim().length === 0} />\n    \n    {loading &&\n      <Dynamic animated>\n        <Stack vAlign=\"center\" hAlign=\"center\" width={\"100%\"} gap={2}>\n          <Divider height={18} ghost />\n          <ActivityIndicator />\n          <Divider height={12} ghost />\n          <Typography align=\"center\" variant=\"h5\">{t(\"ONBOARDING_SCHOOLS_SEARCHING\")}</Typography>\n          <Typography align=\"center\" variant=\"body\" color=\"textSecondary\">{t(\"ONBOARDING_SCHOOLS_SEARCHING_HINT\")}</Typography>\n        </Stack>\n      </Dynamic>\n    }\n\n    <Divider height={18} ghost />\n  </Stack>\n));\n\nexport default function PronoteLoginMethod() {\n  const headerHeight = useHeaderHeight();\n  const insets = useSafeAreaInsets();\n  const navigation = useNavigation();\n  const { t } = useTranslation();\n\n  const [city, setCity] = useState<string>(\"\");\n  const [debouncedCity, setDebouncedCity] = useState<string>(\"\");\n  const [schools, setSchools] = useState<Array<School>>([]);\n  const [loading, setLoading] = useState<boolean>(false);\n\n  useEffect(() => {\n    const timeout = setTimeout(() => {\n      setDebouncedCity(city.trim());\n    }, 350);\n\n    return () => {\n      clearTimeout(timeout);\n    };\n  }, [city]);\n\n  useEffect(() => {\n    if(!debouncedCity || debouncedCity.length < 3) {\n      setSchools([]);\n      setLoading(false);\n    } else {\n      let canceled = false;\n\n      setLoading(true);\n      SearchSchools(debouncedCity, 50)\n        .then((schools) => {\n          if(canceled) {\n            return;\n          }\n          console.log(schools);\n          setSchools(schools);\n        })\n        .finally(() => {\n          if(canceled) {\n            return;\n          }\n          setLoading(false);\n        });\n\n      return () => {\n        canceled = true;\n      };\n    }\n  }, [debouncedCity]);\n\n  const selectSchool = (school: School) => {\n    router.push(`/(onboarding)/services/skolengo/webview?ref=${JSON.stringify(school)}`);\n  }\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1 }} behavior={Platform.OS === 'ios' ? 'padding' : 'height'} keyboardVerticalOffset={Platform.select({ android: 0, default: 20 })}>\n      <List\n        ListHeaderComponent={<PronoteSearchHeader city={city} setCity={setCity} loading={loading && schools.length === 0} showElse={schools.length === 0 && !loading} t={t} />}\n        contentContainerStyle={{\n          padding: 16,\n          flexGrow: 1,\n          gap: 10,\n          paddingTop: headerHeight + 20,\n          paddingBottom: insets.bottom + 20,\n        }}\n        style={{ flex: 1 }}\n        animated\n      >\n        {schools.map((school, i) => (\n          <List.Item animated={true} key={school.id} id={school.id} onPress={() => {selectSchool(school)}}>\n            <List.Leading>\n              <Icon><Papicons name=\"mappin\" /></Icon>\n            </List.Leading>\n            <Typography variant=\"title\">{school.name}</Typography>\n            <Typography variant=\"body\" color=\"textSecondary\">\n              {school.location.city} ({school.location.zipCode})\n            </Typography>\n          </List.Item>\n        ))}\n      </List>\n    </KeyboardAvoidingView>\n  )\n}\n"
  },
  {
    "path": "app/(onboarding)/services/skolengo/webview.tsx",
    "content": "import * as Linking from \"expo-linking\";\nimport { router, useLocalSearchParams, useNavigation } from \"expo-router\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { KeyboardAvoidingView } from \"react-native\";\nimport { AuthFlow, ChallengeMethod, School } from \"skolengojs\";\n\nimport { useAccountStore } from \"@/stores/account\";\nimport { Account, Services } from \"@/stores/account/types\";\nimport { log } from \"@/utils/logger/logger\";\nimport uuid from \"@/utils/uuid/uuid\";\n\nimport OnboardingWebView from \"../../components/OnboardingWebView\";\n\nexport default function WebViewScreen() {\n  const navigation = useNavigation();\n  const [loginURL, setLoginURL] = useState<string | undefined>(undefined);\n  const [flow, setFlow] = useState<AuthFlow>();\n  const { ref } = useLocalSearchParams();\n  const parsedRef = typeof ref === \"string\" ? JSON.parse(ref) : {};\n  const school = new School(parsedRef.id, parsedRef.name, parsedRef.emsCode, parsedRef.OIDCWellKnown, parsedRef.location, parsedRef.homepage);\n\n  useEffect(() => {\n    const handleDeepLink = (event: { url: string }) => {\n      const url = event.url;\n      const scheme = url.split(\":\")[0];\n      if (scheme === \"skoapp-prod\") {\n        log(\"[Skolengo] Activation link received:\", url);\n        handleRequest(url);\n      } else {\n        log(\"[Skolengo] Ignoring link:\", url);\n      }\n    };\n\n    Linking.getInitialURL().then((url) => {\n      if (url) {\n        handleDeepLink({ url });\n      }\n    });\n\n    Linking.addEventListener(\"url\", handleDeepLink);\n  }, []);\n\n  const flowRef = useRef<AuthFlow | null>(null);\n\n  const initLogin = useCallback(async () => {\n    const flow = await school.initializeLogin(ChallengeMethod.PLAIN);\n    flowRef.current = flow;\n    setFlow(flow);\n    setLoginURL(flow.loginURL);\n  }, []);\n\n  useEffect(() => {\n    initLogin();\n  }, [initLogin]);\n\n  const handleRequest = async (url: string) => {\n    if (url.startsWith(\"skoapp-prod://\")) {\n      const code = url.match(/code=([^&]*)/)\n      const state = url.match(/state=([^&]*)/)\n\n      if (!code || !state) { return false; }\n      if (!flowRef.current) {\n        return false;\n      }\n      const auth = await flowRef.current.finalizeLogin(code[1], state[1])\n      const store = useAccountStore.getState();\n      const id = uuid()\n\n      const account: Account = {\n        id,\n        firstName: auth?.firstName ?? \"\",\n        lastName: auth?.lastName ?? \"\",\n        schoolName: auth?.school.name,\n        className: auth?.className,\n        services: [\n          {\n            id: id,\n            auth: {\n              accessToken: auth.refreshToken,\n              refreshToken: auth.refreshToken,\n              additionals: {\n                refreshUrl: auth.refreshURL,\n                wellKnown: flowRef.current.endpoints.wellKnown,\n                tokenEndpoint: flowRef.current.endpoints.tokenEndpoint,\n                emsCode: flowRef.current.school.emsCode\n              }\n            },\n            serviceId: Services.SKOLENGO,\n            createdAt: (new Date()).toISOString(),\n            updatedAt: (new Date()).toISOString()\n          }\n        ],\n        createdAt: (new Date()).toISOString(),\n        updatedAt: (new Date()).toISOString()\n      }\n\n      store.addAccount(account)\n      store.setLastUsedAccount(id)\n\n      const parent = navigation.getParent();\n              if (parent) {\n                parent.goBack();\n                \n                const parentsParent = parent.getParent();\n                if (parentsParent) {\n                  parentsParent.goBack();\n                }\n              }\n      \n              router.back();\n              router.dismissAll();\n              return router.push(\"/\");\n    }\n    return true;\n  };\n\n  const { t } = useTranslation();\n\n  return (\n    <KeyboardAvoidingView style={{ flex: 1 }} behavior=\"padding\" keyboardVerticalOffset={20}>\n      <OnboardingWebView\n        source={loginURL ? { uri: loginURL } : { html: `<h1>${t(\"ONBOARDING_LOADING\")}</h1>` }}\n        onShouldStartLoadWithRequest={(request) => {\n          handleRequest(request.url)\n          return true;\n        }}\n      />\n    </KeyboardAvoidingView>\n  );\n}\n"
  },
  {
    "path": "app/(onboarding)/utils/constants.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-require-imports */\nimport { Papicons } from '@getpapillon/papicons';\nimport { useTheme } from '@react-navigation/native';\nimport { RelativePathString, UnknownInputParams } from 'expo-router';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { StyleProp, ViewStyle } from 'react-native';\n\nimport { Services } from '@/stores/account/types';\nimport { t } from 'i18next';\nexport interface SupportedService {\n  name: string;\n  route?: string;\n  title: string;\n  type: string[];\n  hasLimitedSupport?: boolean;\n  image?: NodeRequire;\n  onPress: () => void;\n  variant?: string;\n  color?: string;\n  icon?: React.ReactNode;\n  style?: StyleProp<ViewStyle>;\n}\n\nexport function GetSupportedServices(redirect: (path: { pathname: string, options?: UnknownInputParams }) => void): SupportedService[] {\n  const theme = useTheme();\n  const { colors } = theme;\n  const { t } = useTranslation()\n\n  return [\n    {\n      name: \"pronote\",\n      route: \"pronote\",\n      title: t(\"ONBOARDING_SERVICE_PRONOTE\"),\n      type: [\"school\", \"univ\"],\n      image: require(\"@/assets/images/service_pronote.png\"),\n      onPress: () => {\n        redirect({ pathname: './school/method', options: { service: Services.PRONOTE } });\n      },\n      variant: 'service' as const,\n      color: 'light' as const,\n    },\n    {\n      name: \"ed\",\n      route: \"ed\",\n      title: t(\"ONBOARDING_SERVICE_ED\"),\n      type: [\"school\"],\n      image: require(\"@/assets/images/service_ed.png\"),\n      onPress: () => {\n        redirect({ pathname: './ecoledirecte/credentials', options: { service: Services.ECOLEDIRECTE } });\n      },\n      variant: 'service' as const,\n      color: 'light' as const,\n    },\n    {\n      name: \"skolengo\",\n      route: \"skolengo\",\n      title: t(\"ONBOARDING_SERVICE_SKOLENGO\"),\n      type: [\"school\"],\n      image: require(\"@/assets/images/service_skolengo.png\"),\n      onPress: () => {\n        redirect({ pathname: './school/method', options: { service: Services.SKOLENGO } });\n      },\n      variant: 'service' as const,\n      color: 'light' as const,\n    },\n    {\n      name: \"lannion\",\n      route: \"lannion\",\n      title: t(\"ONBOARDING_SERVICE_LANNION\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/univ_lannion.png\"),\n      type: [\"univ\"],\n      onPress: () => {\n        redirect({ pathname: './lannion/credentials' });\n      },\n    },\n    {\n      name: \"univ-lorraine\",\n      title: t(\"ONBOARDING_SERVICE_UNIV_LORRAINE\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/univ_lorraine.png\"),\n      type: [\"univ\"],\n      onPress: () => {\n        redirect({ pathname: './services/multi/credentials', options: { color: \"#000000\", university: \"ULorraine\", url: \"https://mobile-back.univ-lorraine.fr\" } });\n      },\n    },\n    {\n      name: \"univ-nimes\",\n      title: t(\"ONBOARDING_SERVICE_UNIV_NIMES\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/univ_nimes.png\"),\n      type: [\"univ\"],\n      onPress: () => {\n        redirect({ pathname: './services/multi/credentials', options: { color: \"#FF341B\", university: \"UNîmes\", url: \"https://mobile-back.unimes.fr\" } });\n      },\n    },\n    {\n      name: \"univ-uphf\",\n      title: t(\"ONBOARDING_SERVICE_UNIV_UPHF\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/univ_uphf.png\"),\n      type: [\"univ\"],\n      onPress: () => {\n        redirect({ pathname: './services/multi/credentials', options: { color: \"#008DB0\", university: \"UPHF\", url: \"https://appmob.uphf.fr/backend\" } });\n      },\n    },\n  ]\n}\n\nexport interface SupportedUniversity {\n  name: string;\n  title: string;\n  hasLimitedSupport: boolean;\n  image?: NodeRequire;\n  type: string;\n  onPress: () => void;\n}\n\nexport function GetSupportedUniversities(redirect: (path: { pathname: string, options?: UnknownInputParams }) => void): SupportedUniversity[] {\n  const { t } = useTranslation();\n\n  return [\n    {\n      name: \"lannion\",\n      title: t(\"ONBOARDING_SERVICE_LANNION\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/univ_lannion.png\"),\n      type: \"main\",\n      onPress: () => {\n        redirect({ pathname: './lannion/credentials' });\n      },\n    },\n    {\n      name: \"univ-lorraine\",\n      title: t(\"ONBOARDING_SERVICE_UNIV_LORRAINE\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/univ_lorraine.png\"),\n      type: \"main\",\n      onPress: () => {\n        redirect({ pathname: './services/multi/credentials', options: { color: \"#000000\", university: \"ULorraine\", url: \"https://mobile-back.univ-lorraine.fr\" } });\n      },\n    },\n    {\n      name: \"univ-nimes\",\n      title: t(\"ONBOARDING_SERVICE_UNIV_NIMES\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/univ_nimes.png\"),\n      type: \"main\",\n      onPress: () => {\n        redirect({ pathname: './services/multi/credentials', options: { color: \"#FF341B\", university: \"UNîmes\", url: \"https://mobile-back.unimes.fr\" } });\n      },\n    },\n    {\n      name: \"univ-uphf\",\n      title: t(\"ONBOARDING_SERVICE_UNIV_UPHF\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/univ_uphf.png\"),\n      type: \"main\",\n      onPress: () => {\n        redirect({ pathname: './services/multi/credentials', options: { color: \"#008DB0\", university: \"UPHF\", url: \"https://appmob.uphf.fr/backend\" } });\n      },\n    },\n    /*{\n      name: \"limited-functions\",\n      title: t(\"Feature_Limited\"),\n      hasLimitedSupport: true,\n      image: require(\"@/assets/images/univ_lannion.png\"),\n      type: \"separator\",\n      onPress: () => { }\n    },\n    {\n      name: \"univ-rennes-1\",\n      title: \"Université de Rennes 1\",\n      hasLimitedSupport: true,\n      image: require(\"@/assets/images/univ_rennes1.png\"),\n      type: \"main\",\n      onPress: () => { }\n    },\n    {\n      name: \"univ-rennes-2\",\n      title: \"Université de Rennes 2\",\n      hasLimitedSupport: true,\n      image: require(\"@/assets/images/univ_rennes2.png\"),\n      type: \"main\",\n      onPress: () => { }\n    },\n    {\n      name: \"univ-limoges\",\n      title: \"Université de Limoges\",\n      type: \"main\",\n      hasLimitedSupport: true,\n      image: require(\"@/assets/images/univ_limoges.png\"),\n      onPress: () => { }\n    },\n    {\n      name: \"univ_paris_sorbonne\",\n      title: \"Université de Sorbonne Paris Nord\",\n      hasLimitedSupport: true,\n      image: require(\"@/assets/images/univ_paris_sorbonne.png\"),\n      type: \"main\",\n      onPress: () => { }\n    } */\n  ]\n}\n\nexport interface LoginMethod {\n  id: string,\n  availableFor: Array<Services>,\n  description: string,\n  icon: React.ReactNode,\n  onPress: () => void;\n}\n\nexport function GetLoginMethods(redirect: (path: { pathname: RelativePathString }) => void): LoginMethod[] {\n  const { t } = useTranslation();\n\n  return [\n    {\n      id: \"map\",\n      availableFor: [Services.PRONOTE, Services.SKOLENGO],\n      description: t(\"ONBOARDING_METHOD_POSITION\"),\n      icon: <Papicons name={\"MapPin\"} />,\n      onPress: async () => {\n        redirect({ pathname: './map' });\n      }\n    },\n    {\n      id: \"search\",\n      availableFor: [Services.PRONOTE, Services.SKOLENGO],\n      description: t(\"ONBOARDING_METHOD_SEARCH\"),\n      icon: <Papicons name={\"Search\"} />,\n      onPress: () => {\n        redirect({ pathname: './search' })\n      }\n    },\n    {\n      id: \"qrcode\",\n      availableFor: [Services.PRONOTE],\n      description: t(\"ONBOARDING_METHOD_QRCODE\"),\n      icon: <Papicons name={\"QrCode\"} />,\n      onPress: () => {\n        redirect({ pathname: \"/(onboarding)/pronote/qrcode\" });\n      }\n    },\n    {\n      id: \"url\",\n      availableFor: [Services.PRONOTE],\n      description: t(\"ONBOARDING_METHOD_LINK\"),\n      icon: <Papicons name={\"Link\"} />,\n      onPress: () => {\n        redirect({ pathname: '../pronote/url' });\n      }\n    }\n  ]\n}\n\nexport interface SupportedRestaurant {\n  name: string;\n  title: string;\n  hasLimitedSupport: boolean;\n  image: any;\n  type: string;\n  onPress: () => void;\n}\n\nexport function GetSupportedRestaurants(redirect: (path: { pathname: string }) => void): SupportedRestaurant[] {\n  return [\n    {\n      name: \"turboself\",\n      title: t(\"ONBOARDING_SERVICE_TURBOSELF\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/turboself.png\"),\n      type: \"main\",\n      onPress: () => {\n        redirect({ pathname: '/(onboarding)/restaurants/turboself' });\n      }\n    },/*\n    {\n      name: \"ard\",\n      title: t(\"ONBOARDING_SERVICE_ARD\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/ard.png\"),\n      type: \"main\",\n      onPress: () => {\n        redirect({ pathname: '/(onboarding)/restaurants/ard' });\n      }\n    },*/\n    {\n      name: \"izly\",\n      title: t(\"ONBOARDING_SERVICE_IZLY\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/izly.png\"),\n      type: \"main\",\n      onPress: () => {\n        redirect({ pathname: '/(onboarding)/restaurants/izly' });\n      }\n    },\n    {\n      name: \"alise\",\n      title: t(\"ONBOARDING_SERVICE_ALISE\"),\n      hasLimitedSupport: false,\n      image: require(\"@/assets/images/alise.jpg\"),\n      type: \"main\",\n      onPress: () => {\n        redirect({ pathname: '/(onboarding)/restaurants/alise' });\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "app/(onboarding)/utils/fetchSchools.ts",
    "content": "import { geolocation } from \"pawnote\";\nimport { School as SkolengoSkool,SearchSchools } from \"skolengojs\";\nimport { t } from \"i18next\";\n\nimport { Services } from \"@/stores/account/types\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport { GeographicQuerying, GeographicReverse } from \"@/utils/native/georeverse\";\nimport { calculateDistanceBetweenPositions, getCurrentPosition } from \"@/utils/native/position\";\n\nexport interface School {\n  name: string,\n  distance: number,\n  url: string,\n  ref?: SkolengoSkool\n}\n\nexport async function fetchSchools(service: Services, alert: ReturnType<typeof useAlert>, city?: string): Promise<School[]> {\n  let pos = null;\n  if (!city) {\n    pos = await getCurrentPosition();\n\n    if (pos === null) {\n      alert.showAlert({\n        title: t(\"Alert_No_Pos\"),\n        description: t(\"ONBOARDING_ALERT_NO_POSITION_DESCRIPTION\"),\n        icon: \"AlertTriangle\",\n        color: \"#D60046\",\n        withoutNavbar: true,\n      });\n    }\n  }\n\n  if (city && service !== Services.SKOLENGO) {\n    pos = await GeographicQuerying(city);\n  }\n\n  if (service === Services.PRONOTE) {\n    const schools = await geolocation({ latitude: pos?.latitude ?? 0, longitude: pos?.longitude ?? 0 });\n    return schools.map(item => ({\n      name: item.name,\n      distance: item.distance / 10,\n      url: item.url,\n    }));\n  }\n\n  if (service === Services.SKOLENGO) {\n    let cityName: string | undefined;\n\n    if (city) {\n      cityName = city;\n    }\n    else if (pos?.latitude && pos?.longitude) {\n      cityName = (await GeographicReverse(pos.latitude, pos.longitude)).city;\n    }\n    else {\n      return [];\n    }\n\n    const schools = await SearchSchools(cityName, 50);\n    const list: School[] = [];\n\n    for (const school of schools) {\n      let distance = 0;\n\n      if (pos?.latitude && pos?.longitude) {\n        if (school.location.addressLine?.trim() && school.location.city?.trim() && school.location.zipCode?.trim()) {\n          const position = await GeographicQuerying(\n            `${school.location.addressLine} ${school.location.city} ${school.location.zipCode}`\n          );\n          distance = calculateDistanceBetweenPositions(\n            pos.latitude,\n            pos.longitude,\n            position.longitude,\n            position.latitude\n          );\n        }\n      }\n\n      list.push({\n        name: school.name,\n        distance: distance / 1000,\n        url: \"\",\n        ref: school,\n      });\n    }\n\n    return list;\n  }\n\n\n  return [];\n}\n\ntype SchoolItem = {\n  title: string,\n  description: string,\n  initials: string,\n  distance: number,\n  onPress: () => void\n}\n"
  },
  {
    "path": "app/(onboarding)/welcome.tsx",
    "content": "import { useFocusEffect, useIsFocused, useTheme } from \"@react-navigation/native\";\nimport { useRouter } from \"expo-router\";\nimport * as WebBrowser from 'expo-web-browser';\nimport React from \"react\";\nimport { Image, StatusBar, View } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport Reanimated, { FadeIn, FadeOut } from \"react-native-reanimated\";\n\nimport Stack from \"@/ui/components/Stack\";\nimport Button from \"@/ui/new/Button\";\nimport Divider from \"@/ui/new/Divider\";\nimport PapillonLogo from \"@/ui/new/symbols/PapillonLogo\";\nimport Typography from \"@/ui/new/Typography\";\nimport { useVideoPlayer, VideoView } from \"expo-video\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport { useTranslation } from \"react-i18next\";\n\nexport default function Welcome() {\n  const insets = useSafeAreaInsets();\n  const { colors } = useTheme();\n  const router = useRouter();\n  const { t } = useTranslation();\n\n  const openHelpWebPage = () => {\n    WebBrowser.openBrowserAsync(\"https://docs.papillon.bzh/support\", {\n      presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET\n    });\n  }\n\n  const openLegalWebPage = () => {\n    WebBrowser.openBrowserAsync(\"https://docs.papillon.bzh/terms\", {\n      presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET\n    });\n  }\n\n  const openDevMenu = () => {\n    router.push(\"/devmode\");\n  }\n\n  const player = useVideoPlayer({\n      assetId: require('@/assets/video/welcome.mp4'),\n    }, player => {\n      player.loop = true;\n      player.muted = true;\n      player.volume = 0;\n      player.showNowPlayingNotification = false;\n      player.playbackRate = 0.5;\n      player.audioMixingMode = \"mixWithOthers\";\n      player.play();\n    });\n\n    const isFocused = useIsFocused();\n\n    useFocusEffect(\n      React.useCallback(() => {\n        if (isFocused) {\n          player.play();\n        }\n      }, [isFocused])\n    );\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        backgroundColor: \"black\"\n      }}\n    >\n      {isFocused &&\n      <StatusBar barStyle={\"light-content\"} animated translucent />\n      }\n      {isFocused &&\n      <Reanimated.View\n        entering={FadeIn.duration(600)}\n        exiting={FadeOut.duration(600)}\n\n        style={{\n          width: '100%',\n          height: '100%',\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n          zIndex: 0,\n        }}\n      >\n      <VideoView\n        player={player}\n        style={{\n          width: '100%',\n          height: '100%'\n        }}\n        contentFit=\"cover\"\n        nativeControls={false}\n      /></Reanimated.View>\n}\n\n      <LinearGradient\n        colors={[\"rgba(0, 0, 0, 1)\", \"rgba(0, 0, 0, 0.0)\", \"rgba(0, 0, 0, 0)\", \"rgba(0, 0, 0, 1)\"]}\n        locations={[0, 0.2, 0.3, 0.7]}\n        style={{\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n          zIndex: 1,\n          opacity: 0.8\n        }}\n      />\n\n      <View\n        style={{\n          flex: 1,\n          justifyContent: \"flex-end\",\n          alignItems: \"center\",\n          padding: 16,\n          gap: 10,\n          paddingBottom: insets.bottom + 16,\n          zIndex: 99,\n        }}\n      >\n        <PapillonLogo fill={\"#FFFFFF\"} />\n\n        <Typography color=\"#FFFFFF\" variant=\"title\" align=\"center\" weight=\"medium\" style={{ marginHorizontal: 10, opacity: 0.8 }}>\n          {t(\"ONBOARDING_WELCOME_DESCRIPTION\")}\n        </Typography>\n\n        <Divider height={2} ghost />\n\n\n        <Button\n          label={t(\"ONBOARDING_WELCOME_LOGIN_WITH\")}\n          gap={4}\n          trailing={\n            <Stack direction=\"horizontal\" gap={0}>\n              <Image\n                source={require(\"@/assets/images/service_pronote.png\")}\n                style={{ width: 32, height: 32, borderRadius: 32, borderWidth: 3, borderColor: colors.primary, zIndex: 3 }}\n              />\n              <Image\n                source={require(\"@/assets/images/service_ed.png\")}\n                style={{ width: 32, height: 32, borderRadius: 32, borderWidth: 3, borderColor: colors.primary, marginLeft: -16, zIndex: 2 }}\n              />\n              <Image\n                source={require(\"@/assets/images/service_skolengo.png\")}\n                style={{ width: 32, height: 32, borderRadius: 32, borderWidth: 3, borderColor: colors.primary, marginLeft: -16, zIndex: 1 }}\n              />\n            </Stack>\n          }\n          onPress={() => {\n            router.push(\"./ageSelection\")\n          }}\n          fullWidth\n        />\n        <Button\n          label={t(\"ONBOARDING_HELP_BTN\")}\n          onPress={() => { openHelpWebPage() }}\n          fullWidth\n          variant=\"secondary\"\n          color=\"#FFFFFF\"\n        />\n\n        <Divider height={2} ghost />\n\n        <Typography color=\"#FFFFFF88\" variant=\"caption\" align=\"center\" style={{ marginHorizontal: 20, opacity: 0.7 }} onPress={() => { openLegalWebPage() }} onLongPress={() => { openDevMenu() }}>\n          {t(\"ONBOARDING_WELCOME_LEGAL\")}\n        </Typography>\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "app/(settings)/_layout.tsx",
    "content": "import { Stack } from \"expo-router\";\nimport React from \"react\";\nimport { Platform, StatusBar } from \"react-native\";\n\nimport { runsIOS26 } from \"@/ui/utils/IsLiquidGlass\";\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport { t } from \"i18next\";\nimport AndroidHeaderBackground from \"@/components/AndroidHeaderBackground\";\n\nexport default function Layout() {\n\n  const newScreenOptions = React.useMemo(() => ({\n    ...screenOptions,\n    headerShown: true,\n    headerLargeTitle: false,\n    headerTransparent: runsIOS26,\n    headerShadowVisible: false,\n    headerBackground: AndroidHeaderBackground\n  }), []);\n\n  return (\n    <>\n      {Platform.OS === \"ios\" && <StatusBar barStyle=\"light-content\" animated />}\n      <Stack screenOptions={newScreenOptions}>\n        <Stack.Screen\n          name=\"settings\"\n          options={{\n            headerTitle: t(\"Tab_Settings\"),\n            headerBackground: AndroidHeaderBackground,\n            headerTransparent: true\n          }}\n        />\n\n        <Stack.Screen\n          name=\"services\"\n          options={{\n            headerTitle: t(\"Settings_Services_Title\"),\n            headerShown: true,\n          }}\n        />\n        <Stack.Screen\n          name=\"accounts\"\n          options={{\n            headerTitle: t(\"Settings_Accounts_Title\"),\n            headerShown: true,\n          }}\n        />\n        <Stack.Screen\n          name=\"personalization\"\n          options={{\n            headerTitle: t(\"Settings_Personalization_Title\"),\n            headerBackButtonDisplayMode: \"minimal\",\n            headerTransparent: true,\n            headerLargeTitle: false,\n            headerBackground: null\n          }}\n        />\n\n        <Stack.Screen\n          name=\"cards\"\n          options={{\n            headerShown: true,\n            headerTitle: t(\"Settings_Cards_Title\"),\n            headerLargeTitle: false,\n            headerBackButtonDisplayMode: \"minimal\",\n            gestureEnabled: true,\n          }}\n        />\n        <Stack.Screen\n          name=\"about\"\n          options={{\n            headerTitle: t(\"Settings_About_Title\"),\n            headerBackButtonDisplayMode: \"minimal\",\n            headerTransparent: Platform.OS === \"ios\",\n            headerLargeTitle: false,\n          }}\n        />\n        <Stack.Screen\n          name=\"contributors\"\n          options={{\n            headerTitle: \"Contributors\",\n            headerBackButtonDisplayMode: \"minimal\",\n            headerTransparent: false,\n            headerLargeTitle: false,\n          }}\n        />\n        <Stack.Screen\n          name=\"magic\"\n          options={{\n            headerTitle: t(\"Settings_MagicPlus_Title\"),\n            headerBackButtonDisplayMode: \"minimal\",\n            headerTransparent: false,\n            headerLargeTitle: false,\n          }}\n        />\n        <Stack.Screen\n          name=\"subject_personalization\"\n          options={{\n            headerTitle: t(\"Settings_SubjectPersonalization_Title\"),\n            headerBackButtonDisplayMode: \"minimal\",\n            headerTransparent: false,\n            headerLargeTitle: false,\n          }}\n        />\n        <Stack.Screen\n          name=\"tabs\"\n          options={{\n            headerTitle: t(\"Settings_Tabs_Title\"),\n            headerBackButtonDisplayMode: \"minimal\",\n            headerTransparent: false,\n            headerLargeTitle: false,\n          }}\n        />\n        <Stack.Screen\n          name=\"edit_subject\"\n          options={{\n            headerTitle: t(\"Settings_SubjectEdit_Title\"),\n            headerBackButtonDisplayMode: \"minimal\",\n            headerShown: false,\n            presentation: \"modal\",\n            contentStyle: {\n              borderRadius: Platform.OS === \"ios\" ? 30 : 0,\n            },\n          }}\n        />\n        <Stack.Screen\n          name=\"language\"\n          options={{\n            headerTitle: t(\"Settings_Language_Title\"),\n            headerBackButtonDisplayMode: \"minimal\",\n            headerTransparent: false,\n            headerLargeTitle: false,\n          }}\n        />\n        <Stack.Screen\n          name=\"transport\"\n          options={{\n            headerTitle: t(\"Settings_Transport_Title\"),\n          }}\n        />\n      </Stack>\n    </>\n  );\n}\n"
  },
  {
    "path": "app/(settings)/about.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { useRouter } from \"expo-router\";\nimport { Github, Languages, Users } from \"lucide-react-native\";\nimport React, { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Alert, Linking } from \"react-native\";\n\nimport SettingsHeader from \"@/components/SettingsHeader\";\nimport packageJson from \"@/package.json\";\nimport { useSettingsStore } from \"@/stores/settings\";\nimport Avatar from \"@/ui/components/Avatar\";\nimport Icon from \"@/ui/components/Icon\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport { getInitials } from \"@/utils/chats/initials\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nexport const Team = [\n  {\n    title: \"Vince Linise\",\n    description: \"Président\",\n    login: \"ecnivtwelve\",\n    leading: (\n      <Avatar\n        size={40}\n        shape=\"square\"\n        initials={getInitials(\"Vince Linise\")}\n        imageUrl=\"https://avatars.githubusercontent.com/u/32978709?v=4\"\n      />\n    ),\n    onPress: () => Linking.openURL(\"https://www.linkedin.com/in/vincelinise/\"),\n  },\n  {\n    title: \"Lucas Lavajo\",\n    description: \"Vice-Président\",\n    login: \"tryon-dev\",\n    leading: (\n      <Avatar\n        size={40}\n        shape=\"square\"\n        initials={getInitials(\"Lucas Lavajo\")}\n        imageUrl=\"https://avatars.githubusercontent.com/u/68423470?v=4\"\n      />\n    ),\n    onPress: () => Linking.openURL(\"https://www.linkedin.com/in/lucas-lavajo/\"),\n  },\n  {\n    title: \"Raphaël Schröder\",\n    description: \"Développeur back-end\",\n    login: \"raphckrman\",\n    leading: (\n      <Avatar\n        size={40}\n        shape=\"square\"\n        initials={getInitials(\"Raphaël Schröder\")}\n        imageUrl=\"https://avatars.githubusercontent.com/u/41128238?v=4\"\n      />\n    ),\n    onPress: () => Linking.openURL(\"https://www.linkedin.com/in/raphckrman/\"),\n  },\n  {\n    title: \"Tom Hélière\",\n    login: \"tom-things\",\n    description: \"Designer UI/UX\",\n    leading: (\n      <Avatar\n        size={40}\n        shape=\"square\"\n        initials={getInitials(\"Tom Hélière\")}\n        imageUrl=\"https://avatars.githubusercontent.com/u/135361669?v=4\"\n      />\n    ),\n    onPress: () => Linking.openURL(\"https://www.linkedin.com/in/tom-heliere/\"),\n  },\n  {\n    title: \"Rémy Godet\",\n    description: \"Développeur\",\n    login: \"godetremy\",\n    leading: (\n      <Avatar\n        size={40}\n        shape=\"square\"\n        initials={getInitials(\"Rémy Godet\")}\n        imageUrl=\"https://avatars.githubusercontent.com/u/77058107?v=4\"\n      />\n    ),\n    onPress: () => Linking.openURL(\"https://www.linkedin.com/in/godetremy/\"),\n  },\n  {\n    title: \"Mael Duret\",\n    description: \"Développeur\",\n    login: \"ryzenixx\",\n    leading: (\n      <Avatar\n        size={40}\n        shape=\"square\"\n        initials={getInitials(\"Mael Duret\")}\n        imageUrl=\"https://avatars.githubusercontent.com/u/96339570?v=4\"\n      />\n    ),\n    onPress: () => Linking.openURL(\"https://www.linkedin.com/in/mael-duret/\"),\n  },\n];\n\nexport default function SettingsAbout() {\n  const theme = useTheme();\n  const router = useRouter();\n\n  const { t } = useTranslation();\n  const settingsStore = useSettingsStore(state => state.personalization);\n  const mutateProperty = useSettingsStore(state => state.mutateProperty);\n\n  const CommunityLinks = [\n    {\n      title: t(\"Settings_Donator\"),\n      description: t(\"Settings_Donator_Description\"),\n      leading: <Papicons name=\"PiggyBank\" />,\n      onPress: () =>\n        Linking.openURL(\"https://ko-fi.com/thepapillonapp/leaderboard\"),\n    },\n    {\n      title: t(\"Settings_About_Discord\"),\n      description: t(\"Settings_About_Discord_Description\"),\n      leading: <Papicons name=\"TextBubble\" />,\n      onPress: () => Linking.openURL(\"https://go.papillon.bzh/discord\"),\n    },\n    {\n      title: t(\"Settings_About_Issue\"),\n      description: t(\"Settings_About_Issue_Description\"),\n      leading: <Papicons name=\"Info\" />,\n      onPress: () =>\n        Linking.openURL(\"https://github.com/PapillonApp/Papillon/issues\"),\n    },\n  ];\n\n  const DeveloperLinks = [\n    {\n      title: t(\"Settings_About_Crowdin\"),\n      description: t(\"Settings_About_Crowdin_Description\"),\n      leading: <Languages />,\n      onPress: () => Linking.openURL(\"https://crowdin.com/project/papillonapp\"),\n    },\n    {\n      title: t(\"Settings_About_Github\"),\n      description: t(\"Settings_About_Github_Description\"),\n      leading: <Github />,\n      onPress: () => Linking.openURL(\"https://github.com/PapillonApp/Papillon\"),\n    },\n    {\n      title: t(\"Settings_About_Contributors\"),\n      description: t(\"Settings_About_Contributors_Description\"),\n      leading: <Users />,\n      onPress: () => router.push(\"/(settings)/contributors\"),\n    },\n  ];\n\n  const [tapCount, setTapCount] = useState(0);\n\n  const handleVersionTap = () => {\n    setTapCount(prev => prev + 1);\n\n    if (tapCount + 1 >= 8) {\n      setTapCount(0);\n\n      if (settingsStore.showDevMode) {\n        Alert.alert(\"Dev Mode\", \"Dev mode désactivé!\");\n        mutateProperty(\"personalization\", { showDevMode: false });\n      } else {\n        Alert.alert(\"Dev Mode\", \"Dev mode activé!\");\n        mutateProperty(\"personalization\", { showDevMode: true });\n      }\n    }\n  };\n\n  const Infos = [\n    {\n      title: t(\"Settings_App_Version\"),\n      description: packageJson.version,\n      leading: <Papicons name=\"Butterfly\" />,\n      onPress: handleVersionTap,\n    },\n    {\n      title: t(\"Settings_About_Dependency_Version\"),\n      description: `Expo: ${packageJson.dependencies?.expo || \"N/A\"} | RN: ${packageJson.dependencies?.[\"react-native\"] || \"N/A\"}`,\n      leading: <Papicons name=\"Code\" />,\n    },\n  ];\n\n  const insets = useSafeAreaInsets();\n\n  return (\n    <List\n      style={{ flex: 1 }}\n      contentContainerStyle={{ padding: 20, paddingBottom: insets.bottom + 20 }}\n      contentInsetAdjustmentBehavior=\"always\"\n      showsVerticalScrollIndicator={false}\n    >\n      <List.View style={{ marginBottom: 10 }}>\n        <SettingsHeader\n          color={theme.dark ? \"#121e2a\" : \"#dfebf7\"}\n          title={t(\"Settings_About_Papillion_Behind\")}\n          description={t(\"Settings_About_Papillion_Behind_Description\")}\n          imageSource={require(\"@/assets/images/about_papillon.png\")}\n          disableMargin\n          height={270}\n        />\n      </List.View>\n\n      <List.Section>\n        {Team.map((item, index) => (\n          <List.Item key={index} onPress={item.onPress}>\n            <List.Leading>\n              <Icon>{item.leading}</Icon>\n            </List.Leading>\n\n            <Typography variant=\"title\">{item.title}</Typography>\n\n            <Typography variant=\"caption\" color=\"textSecondary\">\n              {item.description}\n            </Typography>\n\n            <List.Trailing>\n              <Icon>\n                <Papicons name=\"ChevronRight\" />\n              </Icon>\n            </List.Trailing>\n          </List.Item>\n        ))}\n      </List.Section>\n\n      <List.Section>\n        {CommunityLinks.map((item, index) => (\n          <List.Item key={index} onPress={item.onPress}>\n            <List.Leading>\n              <Icon>{item.leading}</Icon>\n            </List.Leading>\n\n            <Typography variant=\"title\">{item.title}</Typography>\n\n            <Typography variant=\"caption\" color=\"textSecondary\">\n              {item.description}\n            </Typography>\n\n            <List.Trailing>\n              <Icon>\n                <Papicons name=\"ChevronRight\" />\n              </Icon>\n            </List.Trailing>\n          </List.Item>\n        ))}\n      </List.Section>\n\n      <List.Section>\n        {DeveloperLinks.map((item, index) => (\n          <List.Item key={index} onPress={item.onPress}>\n            <List.Leading>\n              <Icon>{item.leading}</Icon>\n            </List.Leading>\n\n            <Typography variant=\"title\">{item.title}</Typography>\n\n            <Typography variant=\"caption\" color=\"textSecondary\">\n              {item.description}\n            </Typography>\n\n            <List.Trailing>\n              <Icon>\n                <Papicons name=\"ChevronRight\" />\n              </Icon>\n            </List.Trailing>\n          </List.Item>\n        ))}\n      </List.Section>\n\n      <List.Section>\n        {Infos.map((item, index) => (\n          <List.Item key={index} onPress={item.onPress}>\n            <List.Leading>\n              <Icon>{item.leading}</Icon>\n            </List.Leading>\n\n            <Typography variant=\"title\">{item.title}</Typography>\n\n            <Typography variant=\"caption\" color=\"textSecondary\">\n              {item.description}\n            </Typography>\n          </List.Item>\n        ))}\n      </List.Section>\n    </List>\n  );\n}\n"
  },
  {
    "path": "app/(settings)/accounts.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { MenuView, NativeActionEvent } from \"@react-native-menu/menu\";\nimport { router } from \"expo-router\";\nimport React from \"react\";\nimport { Alert, Image, ScrollView } from \"react-native\";\n\nimport { removeBalanceFromDatabase } from \"@/database/useBalance\";\nimport { getManager } from \"@/services/shared\";\nimport { useAccountStore } from \"@/stores/account\";\nimport Avatar from \"@/ui/components/Avatar\";\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport { getInitials } from \"@/utils/chats/initials\";\nimport { formatSchoolName } from \"@/utils/format/formatSchoolName\";\nimport { getServiceLogo, getServiceName } from \"@/utils/services/helper\";\nimport ActionMenu from \"@/ui/components/ActionMenu\";\n\nexport default function AccountsView() {\n  const accounts = useAccountStore(state => state.accounts);\n  const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);\n  const account = accounts.find(a => a.id === lastUsedAccount);\n  const store = useAccountStore.getState();\n\n  const services = account?.services;\n\n  const askDeleteAccount = (targetAccount: (typeof accounts)[number]) => {\n    Alert.alert(\n      \"Supprimer le compte\",\n      `${targetAccount.firstName} ${targetAccount.lastName}`,\n      [\n        {\n          text: \"Annuler\",\n          style: \"cancel\",\n        },\n        {\n          text: \"Supprimer\",\n          style: \"destructive\",\n          onPress: () => {\n            store.removeAccount(targetAccount);\n          },\n        },\n      ]\n    );\n  };\n\n  const askDeleteService = (serviceId: string, serviceName: string) => {\n    Alert.alert(serviceName, \"Supprimer ce service ?\", [\n      {\n        text: \"Annuler\",\n        style: \"cancel\",\n      },\n      {\n        text: \"Supprimer\",\n        style: \"destructive\",\n        onPress: () => {\n          store.removeServiceFromAccount(serviceId);\n          removeBalanceFromDatabase(serviceId);\n          const manager = getManager();\n          if (manager) {\n            manager.removeService(serviceId);\n          }\n        },\n      },\n    ]);\n  };\n\n  return (\n    <ScrollView\n      contentInsetAdjustmentBehavior=\"automatic\"\n      contentContainerStyle={{\n        padding: 16,\n        gap: 16,\n      }}\n    >\n      <Stack\n        direction=\"horizontal\"\n        gap={8}\n        hAlign=\"center\"\n        style={{\n          opacity: 0.5,\n        }}\n      >\n        <Icon size={20}>\n          <Papicons name=\"user\" />\n        </Icon>\n        <Typography variant=\"title\" color=\"textSecondary\">\n          Profils utilisateur\n        </Typography>\n      </Stack>\n\n      <List>\n        {accounts.map(account => (\n          <List.Item key={account.id}>\n            <List.Leading>\n              <Avatar\n                initials={getInitials(\n                  account.firstName + \" \" + account.lastName\n                )}\n                imageUrl={\n                  account.customisation?.profilePicture\n                    ? \"data:image/png;base64,\" +\n                      account.customisation?.profilePicture\n                    : undefined\n                }\n                size={38}\n              />\n            </List.Leading>\n            <Typography variant=\"title\">\n              {account.firstName} {account.lastName}\n            </Typography>\n            <Typography variant=\"body2\" color=\"textSecondary\">\n              {account.className ? account.className + \" \" : \"\"}\n              {formatSchoolName(account.schoolName ?? \"\")}\n            </Typography>\n            <List.Trailing>\n              <ActionMenu\n                actions={[\n                  {\n                    id: \"delete\",\n                    title: \"Supprimer\",\n                    attributes: { destructive: true },\n                  },\n                ]}\n                onPressAction={(event: NativeActionEvent) => {\n                  if (event.nativeEvent.event === \"delete\") {\n                    askDeleteAccount(account);\n                  }\n                }}\n              >\n                <Icon opacity={0.7}>\n                  <Papicons name=\"Menu\" />\n                </Icon>\n              </ActionMenu>\n            </List.Trailing>\n          </List.Item>\n        ))}\n        <List.Item\n          onPress={() =>\n            router.push({\n              pathname: \"/(onboarding)/ageSelection\",\n              params: { action: \"addService\" },\n            })\n          }\n        >\n          <List.Leading>\n            <Icon opacity={0.5} style={{ marginHorizontal: 7 }}>\n              <Papicons name=\"add\" />\n            </Icon>\n          </List.Leading>\n          <Typography variant=\"title\" color=\"textSecondary\">\n            Nouveau compte\n          </Typography>\n        </List.Item>\n      </List>\n\n      <Stack\n        direction=\"horizontal\"\n        gap={8}\n        hAlign=\"center\"\n        style={{\n          opacity: 0.5,\n        }}\n      >\n        <Icon size={20}>\n          <Papicons name=\"card\" />\n        </Icon>\n        <Typography variant=\"title\" color=\"textSecondary\">\n          Services et cartes\n        </Typography>\n      </Stack>\n\n      <List>\n        {services?.map(service => (\n          <List.Item key={service.id}>\n            <List.Leading>\n              <Image\n                source={getServiceLogo(service.serviceId)}\n                style={{\n                  width: 38,\n                  height: 38,\n                  borderRadius: 4,\n                }}\n              />\n            </List.Leading>\n            <Typography variant=\"title\">\n              {getServiceName(service.serviceId)}\n            </Typography>\n            <Typography variant=\"body2\" color=\"textSecondary\">\n              Connecté le{\" \"}\n              {new Date(service.createdAt).toLocaleDateString(undefined, {\n                day: \"2-digit\",\n                month: \"short\",\n                year: \"numeric\",\n              })}\n            </Typography>\n            <List.Trailing>\n              <ActionMenu\n                actions={[\n                  {\n                    id: \"delete\",\n                    title: \"Supprimer\",\n                    attributes: { destructive: true },\n                  },\n                ]}\n                onPressAction={(event: NativeActionEvent) => {\n                  if (event.nativeEvent.event === \"delete\") {\n                    askDeleteService(\n                      service.id,\n                      getServiceName(service.serviceId)\n                    );\n                  }\n                }}\n              >\n                <Icon opacity={0.7}>\n                  <Papicons name=\"Menu\" />\n                </Icon>\n              </ActionMenu>\n            </List.Trailing>\n          </List.Item>\n        ))}\n        <List.Item\n          onPress={() =>\n            router.navigate({\n              pathname: \"/(onboarding)/restaurants/method\",\n            })\n          }\n        >\n          <List.Leading>\n            <Icon opacity={0.5} style={{ marginHorizontal: 7 }}>\n              <Papicons name=\"add\" />\n            </Icon>\n          </List.Leading>\n          <Typography variant=\"title\" color=\"textSecondary\">\n            Ajouter un nouveau service\n          </Typography>\n        </List.Item>\n      </List>\n    </ScrollView>\n  );\n}\n"
  },
  {
    "path": "app/(settings)/cards.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-require-imports */\nimport { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { useRouter } from \"expo-router\";\nimport { Alert, Image, ScrollView, View } from \"react-native\";\n\nimport { useAccountStore } from \"@/stores/account\";\nimport { Services } from \"@/stores/account/types\";\nimport Button from \"@/ui/components/Button\";\nimport Icon from \"@/ui/components/Icon\";\nimport Item, { Leading, Trailing } from \"@/ui/components/Item\";\nimport List from \"@/ui/components/List\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport SettingsHeader from \"@/components/SettingsHeader\";\nimport { getServiceBackground, getServiceName, isSelfModuleEnabledED } from \"@/utils/services/helper\";\nimport { useTranslation } from \"react-i18next\";\nimport { removeBalanceFromDatabase } from \"@/database/useBalance\";\nimport { getManager } from \"@/services/shared\";\nimport i18n from \"@/utils/i18n\";\n\nexport default function CardView() {\n  const router = useRouter();\n  const accounts = useAccountStore((state) => state.accounts);\n  const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);\n  const account = accounts.find((a) => a.id === lastUsedAccount);\n  const selfCompatible = account?.services.filter(\n    service => {\n      if (service.serviceId === Services.ECOLEDIRECTE) {\n        return isSelfModuleEnabledED(service.additionals);\n      }\n      return [Services.TURBOSELF, Services.ARD, Services.IZLY].includes(service.serviceId);\n    },\n  );\n\n  const theme = useTheme();\n  const { colors } = theme;\n  const { t } = useTranslation();\n\n  return (\n    <ScrollView\n      contentContainerStyle={{\n        padding: 20, gap: 15, paddingTop: 82,\n      }}\n    >\n      <SettingsHeader\n        color={theme.dark ? \"#001533\" + \"80\" : \"#D9E6FA\"}\n        title={t(\"Settings_Cards_Banner_Title\")}\n        description={t(\"Settings_Cards_Banner_Description\")}\n        iconName=\"Card\"\n        imageSource={require(\"@/assets/images/cards.png\")}\n      />\n      {(selfCompatible ?? []).length > 0 ? (\n        <>\n          <Typography style={{ opacity: 0.5 }}>Mes cartes</Typography>\n          <View style={{\n            shadowColor: \"#000\",\n            shadowOffset: { width: 0, height: 0 },\n            shadowOpacity: 0.15,\n            shadowRadius: 3.3,\n            elevation: 4,\n          }}\n          >\n            <ScrollView scrollEnabled={false}>\n              <List>\n                {selfCompatible?.map(service => {\n                  return (\n                    <Item\n                      key={service.id}\n                      onPress={() => {\n                        if (service.serviceId === Services.ECOLEDIRECTE) {\n                          Alert.alert(\"Tu ne peux pas supprimer cette carte\", \"Cette carte est liée à ton service scolaire.\");\n                          return;\n                        }\n                        Alert.alert(getServiceName(service.serviceId), \"Que souhaitez-vous faire ?\", [\n                          {\n                            text: \"Supprimer\",\n                            style: \"destructive\",\n                            onPress: () => {\n                              useAccountStore.getState().removeServiceFromAccount(service.id);\n                              removeBalanceFromDatabase(service.id)\n                              const manager = getManager()\n                              if (manager) {\n                                manager.removeService(service.id)\n                              }\n                            },\n                          },\n                          {\n                            text: \"Annuler\",\n                            style: \"cancel\",\n                          },\n                        ]);\n                      }}\n                    >\n                      <Leading>\n                        <Image source={getServiceBackground(service.serviceId)}\n                          style={{\n                            width: 60,\n                            height: 40,\n                            borderRadius: 4,\n                          }}\n                        />\n                      </Leading>\n                      <Trailing>\n                        <Papicons name={\"ChevronRight\"}\n                          fill={colors.text}\n                          opacity={0.5}\n                        />\n                      </Trailing>\n                      <Typography>{getServiceName(service.serviceId)}</Typography>\n                      <Typography style={{ opacity: 0.5 }}>Ajoutée\n                        le {new Date(service.createdAt).toLocaleDateString(i18n.language, {\n                          day: \"2-digit\",\n                          month: \"2-digit\",\n                        })}</Typography>\n                    </Item>\n                  );\n                })}\n              </List>\n              <Button color=\"blue\"\n                title=\"Ajouter\"\n                icon={<Papicons name=\"Plus\" />}\n                onPress={() => {\n                  router.push({\n                    pathname: \"/(onboarding)/restaurants/method\",\n                    params: {\n                      action: \"addService\",\n                    },\n                  });\n                }}\n              />\n            </ScrollView>\n          </View>\n          <Typography variant=\"caption\"\n            style={{ opacity: 0.5 }}\n          >{t(\"Feature_Add_Card\")}</Typography>\n        </>\n      ) : (\n        <Stack\n          hAlign=\"center\"\n          vAlign=\"center\"\n          margin={16}\n          gap={16}\n        >\n          <View\n            style={{\n              alignItems: \"center\",\n            }}\n          >\n            <Icon papicon\n              opacity={0.5}\n              size={32}\n              style={{ marginBottom: 3 }}\n            >\n              <Papicons name={\"Card\"} />\n            </Icon>\n            <Typography variant=\"h4\"\n              color=\"text\"\n              align=\"center\"\n            >\n              {t(\"Settings_Cards_None_Title\")}\n            </Typography>\n            <Typography variant=\"body2\"\n              color=\"secondary\"\n              align=\"center\"\n            >\n              {t(\"Settings_Cards_None_Description\")}\n            </Typography>\n          </View>\n          <Button color=\"blue\"\n            title={t(\"Settings_Cards_Add_Button\")}\n            icon={<Papicons name={\"Plus\"} />}\n            onPress={() => {\n              router.push({\n                pathname: \"/(onboarding)/restaurants/method\",\n                params: {\n                  action: \"addService\",\n                },\n              });\n            }}\n          />\n        </Stack>\n      )\n      }\n    </ScrollView>\n  );\n}"
  },
  {
    "path": "app/(settings)/contributors.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { Linking } from \"react-native\";\n\nimport ActivityIndicator from \"@/ui/components/ActivityIndicator\";\nimport Avatar from \"@/ui/components/Avatar\";\nimport Icon from \"@/ui/components/Icon\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport { getInitials } from \"@/utils/chats/initials\";\nimport { Contributor, getContributors } from \"@/utils/github/contributors\";\n\nconst TEAM_LOGINS = [\n  \"ecnivtwelve\",\n  \"tryon-dev\",\n  \"raphckrman\",\n  \"tom-things\",\n  \"godetremy\",\n  \"ryzenixx\",\n];\n\nexport default function SettingsContributors() {\n  const [contributors, setContributors] = useState<Contributor[]>([]);\n  const [isLoading, setIsLoading] = useState(true);\n\n  useEffect(() => {\n    getContributors()\n      .then(allContributors => {\n        setContributors(\n          allContributors.filter(\n            contributor => !TEAM_LOGINS.includes(contributor.login)\n          )\n        );\n      })\n      .finally(() => {\n        setIsLoading(false);\n      });\n  }, []);\n\n  const contributorItems = useMemo(\n    () =>\n      contributors.map(item => (\n        <List.Item\n          key={item.login}\n          id={item.login}\n          onPress={() => Linking.openURL(item.html_url)}\n        >\n          <List.Leading>\n            <Avatar\n              size={40}\n              shape=\"square\"\n              initials={getInitials(item.login)}\n              imageUrl={item.avatar_url}\n            />\n          </List.Leading>\n          <Typography variant=\"title\">{item.login}</Typography>\n          <Typography variant=\"body2\" color=\"textSecondary\">\n            {item.contributions}{\" \"}\n            {item.contributions > 1 ? \"contributions\" : \"contribution\"}\n          </Typography>\n          <List.Trailing>\n            <Icon>\n              <Papicons name=\"ChevronRight\" />\n            </Icon>\n          </List.Trailing>\n        </List.Item>\n      )),\n    [contributors]\n  );\n\n  return (\n    <List\n      contentInsetAdjustmentBehavior=\"always\"\n      contentContainerStyle={{ padding: 16, gap: 12 }}\n      style={{ flex: 1 }}\n    >\n      {isLoading && (\n        <List.View\n          style={{\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            paddingVertical: 24,\n            gap: 10,\n          }}\n        >\n          <ActivityIndicator size={42} />\n          <Typography variant=\"caption\" color=\"textSecondary\" align=\"center\">\n            Chargement des contributeurs...\n          </Typography>\n        </List.View>\n      )}\n      {!isLoading && contributorItems}\n    </List>\n  );\n}\n"
  },
  {
    "path": "app/(settings)/edit_subject.tsx",
    "content": "import Stack from \"@/ui/components/Stack\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport Typography from \"@/ui/components/Typography\";\nimport { CompactGrade } from \"@/ui/components/CompactGrade\";\nimport {\n  Dimensions,\n  ScrollView,\n  View,\n  Platform,\n  Modal,\n} from \"react-native\";\nimport OnboardingInput from \"@/components/onboarding/OnboardingInput\";\nimport { Colors } from \"@/utils/subjects/colors\";\nimport { memo, ReactNode, useCallback, useMemo, useRef, useState } from \"react\";\nimport { router, useLocalSearchParams } from \"expo-router\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport TabHeaderTitle from \"@/ui/components/TabHeaderTitle\";\nimport ChipButton from \"@/ui/components/ChipButton\";\nimport TabHeader from \"@/ui/components/TabHeader\";\nimport { useTranslation } from \"react-i18next\";\nimport Button from \"@/ui/new/Button\";\nimport { UnicodeEmojis } from \"@/constants/UnicodeEmojis\";\nimport Animated, { useAnimatedStyle, useSharedValue, withSpring } from \"react-native-reanimated\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport { PapillonZoomIn, PapillonZoomOut } from \"@/ui/utils/Transition\";\nimport { ListTouchable } from \"@/ui/new/List\";\nimport { LegendList, LegendListRef } from \"@legendapp/list\";\nimport { FlashList } from \"@shopify/flash-list\";\n\nconst EmojiItem = memo(({ item, onPress, isSelected }: {item: string, onPress: (emoji: string) => void, isSelected: boolean}) => {\n  const theme = useTheme();\n  return (\n    <ListTouchable\n      onPress={() => onPress(item)}\n      style={{\n        flex: 1,\n        alignItems: \"center\",\n        justifyContent: \"center\",\n      }}\n    >\n    <View\n      style={[\n        {\n          height: 56,\n          width: 56,\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          borderRadius: 10,\n          marginVertical: 5,\n          marginHorizontal: \"auto\"\n        },\n        isSelected && {\n          backgroundColor: Platform.OS === \"ios\" ? theme.colors.primary + \"20\" : theme.colors.primary + \"30\",\n          borderWidth: Platform.OS === \"ios\" ? 2 : 0,\n          borderColor: theme.colors.primary,\n        }\n      ]}\n    >\n      <Typography\n        style={{\n          fontSize: 35,\n          lineHeight: 35 * 1.28,\n        }}\n      >\n        {item}\n      </Typography>\n    </View>\n    </ListTouchable>\n  );\n});\n\nfunction EmojiPicker({\n  onCancel,\n  onSelect,\n}: {\n  onCancel: () => void;\n  onSelect: (emoji: string) => void;\n}): ReactNode {\n  const theme = useTheme();\n  const { t } = useTranslation();\n  const insets = useSafeAreaInsets();\n\n  const flatListRef = useRef<LegendListRef | null>(null);\n  const scale = useSharedValue(1);\n\n  const emojis = useMemo(() => {\n    return Object.keys(UnicodeEmojis)\n      .map(key => {\n        const value = UnicodeEmojis[key];\n        const uniqueCodes = [...new Set(value.emojis)];\n\n        return uniqueCodes.length > 0\n          ? {\n              title: value.icon,\n              data: uniqueCodes,\n            }\n          : null;\n      })\n      .filter(v => v !== null);\n  }, []);\n\n  const flatEmojis = useMemo(() => {\n    return emojis.flatMap(section =>\n      section.data.map(item => String.fromCodePoint(item))\n    );\n  }, [emojis]);\n\n  const handleSelect = useCallback(item => {\n    setSelectedEmoji(item);\n  }, []);\n\n  const [headerHeight, setHeaderHeight] = useState(0);\n  const [selectedEmoji, setSelectedEmoji] = useState<string>(\"😀\");\n\n  const emojiContainerStyle = {\n    height: 180,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  };\n\n  const [selectedTab, setSelectedTab] = useState(emojis[0].title);\n\n  const selectTab = (tab) => {\n    setSelectedTab(tab);\n    const section = emojis.find(s => s.title === tab);\n    if (section) {\n      const index = emojis\n        .slice(0, emojis.indexOf(section))\n        .reduce((acc, curr) => acc + curr.data.length, 0);\n      flatListRef.current?.scrollToOffset({ offset: index * 56, animated: false });\n    }\n  }\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        paddingTop: headerHeight,\n        paddingBottom: insets.bottom,\n        backgroundColor: theme.colors.background,\n      }}\n    >\n      <TabHeader\n        modal={Platform.OS === \"ios\"}\n        onHeightChanged={setHeaderHeight}\n        title={\n          <TabHeaderTitle\n            chevron={false}\n            leading={t(\"Settings_Personalization_Emoji_Picker_Title\")}\n          />\n        }\n        trailing={<ChipButton single icon=\"cross\" onPress={onCancel} />}\n      />\n      <Animated.View\n        style={[emojiContainerStyle]}\n        key={selectedEmoji + \"_preview\"}\n        entering={PapillonZoomIn}\n        exiting={PapillonZoomOut}\n      >\n        <Typography\n          style={{\n            fontSize: 100,\n            lineHeight: 100 * 1.28,\n          }}\n        >\n          {selectedEmoji}\n        </Typography>\n      </Animated.View>\n      <View\n        style={{\n          height: 50,\n          maxHeight: 50,\n          minHeight: 50,\n          borderBottomWidth: 0.5,\n          borderColor: theme.colors.border,\n          paddingHorizontal: 10,\n          flexDirection: \"row\",\n          justifyContent: \"space-between\",\n          alignItems: \"center\",\n        }}\n      >\n        {emojis.map((value, index) => (\n          <ListTouchable\n            key={index}\n            onPress={() => selectTab(value.title)}\n            >\n          <View\n            style={[\n              {\n                padding: 5,\n                height: 50,\n                width: 40,\n                alignItems: \"center\",\n                justifyContent: \"center\",\n                borderBottomWidth: 3,\n                borderColor: \"transparent\",\n              },\n              selectedTab === value.title && {\n                borderBottomColor: theme.colors.primary,\n\n              },\n            ]}\n            key={index}\n            onPress={() => {\n              selectTab(value.title);\n            }}\n          >\n            <Papicons\n              name={value.title}\n              size={24}\n              color={selectedTab === value.title ? theme.colors.primary : theme.colors.text + \"7F\"}\n            />\n          </View>\n          </ListTouchable>\n        ))}\n      </View>\n      <FlashList\n        ref={flatListRef}\n        data={flatEmojis}\n        numColumns={6}\n        drawDistance={900}\n        recycleItems\n        estimatedItemSize={66}\n        keyExtractor={(item, index) => item + index}\n        showsVerticalScrollIndicator={false}\n        contentContainerStyle={{\n          padding: 5,\n          paddingBottom: 80,\n        }}\n        renderItem={({ item }) => (\n          <EmojiItem item={item} onPress={handleSelect} isSelected={item === selectedEmoji} />\n        )}\n      />\n      <View\n        style={{\n          padding: 16,\n          position: \"absolute\",\n          bottom: insets.bottom,\n          left: 0,\n          right: 0,\n        }}\n      >\n        <LinearGradient\n          colors={[theme.colors.background + \"00\", theme.colors.background]}\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n          }}\n        />\n        <Button\n          label={t(\"Settings_Personalization_Emoji_Picker_SetEmoji\")}\n          onPress={() => onSelect(selectedEmoji)}\n        />\n      </View>\n    </View>\n  );\n}\n\nexport default function EditSubject() {\n  const { colors } = useTheme();\n  const insets = useSafeAreaInsets();\n\n  const params = useLocalSearchParams();\n\n  const [selectedName, setSelectedName] = useState<string>(String(params.name));\n  const [selectedColor, setSelectedColor] = useState<string>(Colors.find(c => c === String(params.color)) || Colors[0]);\n  const [selectedEmoji, setSelectedEmoji] = useState<string>(String(params.emoji));\n  const [showEmojiPicker, setShowEmojiPicker] = useState(false);\n\n  const AvailableEmojis = [\n    \"📖\",\n    \"🧮\",\n    \"🌍\",\n    \"🎨\",\n    \"⚽\",\n    \"🎵\",\n    \"🧪\",\n    \"custom\",\n  ];\n\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        paddingTop: Platform.OS === \"android\" ? insets.top : 0,\n      }}\n    >\n      <Stack\n        padding={15}\n        style={{ justifyContent: \"space-between\", alignItems: \"center\" }}\n        direction={\"horizontal\"}\n      >\n        <AnimatedPressable\n          style={{\n            padding: 10,\n            backgroundColor: colors.text + \"10\",\n            borderRadius: 100,\n          }}\n          onPress={() => {\n            router.back();\n          }}\n        >\n          <Papicons name={\"Cross\"} size={25} color={colors.text + \"7F\"} />\n        </AnimatedPressable>\n        <Typography variant={\"title\"}>Modifier la matière</Typography>\n        <AnimatedPressable\n          style={{\n            padding: 10,\n            backgroundColor: colors.primary,\n            borderRadius: 100,\n          }}\n          onPress={() => {\n            const store = useAccountStore.getState();\n\n            store.setSubjectName(String(params.id), selectedName);\n            store.setSubjectEmoji(String(params.id), selectedEmoji);\n            store.setSubjectColor(String(params.id), selectedColor);\n\n            router.back();\n          }}\n        >\n          <Papicons name={\"Check\"} size={25} color={\"#FFF\"} />\n        </AnimatedPressable>\n      </Stack>\n      <Stack hAlign={\"center\"} pointerEvents={\"none\"}>\n        <CompactGrade\n          date={new Date()}\n          score={12.6}\n          outOf={20}\n          description={\"Exemple d’une note avec la matière\"}\n          emoji={selectedEmoji}\n          title={selectedName}\n          color={selectedColor}\n        />\n      </Stack>\n\n      <Stack gap={10}>\n        <Stack\n          gap={5}\n          direction={\"horizontal\"}\n          hAlign={\"center\"}\n          style={{ paddingHorizontal: 16, marginTop: 20 }}\n        >\n          <Papicons name={\"Font\"} color={colors.text + \"7F\"} size={18} />\n          <Typography color=\"secondary\">Nom de la matière</Typography>\n        </Stack>\n        <Stack style={{ paddingHorizontal: 16 }}>\n          <OnboardingInput\n            placeholder={\"Nom de la matière\"}\n            text={selectedName}\n            setText={setSelectedName}\n            icon={\"Font\"}\n            inputProps={{}}\n          />\n        </Stack>\n        <Stack\n          gap={5}\n          direction={\"horizontal\"}\n          hAlign={\"center\"}\n          style={{ paddingHorizontal: 16 }}\n        >\n          <Papicons name={\"Palette\"} color={colors.text + \"7F\"} size={18} />\n          <Typography color=\"secondary\">Couleur</Typography>\n        </Stack>\n        <ScrollView\n          horizontal\n          contentContainerStyle={{\n            gap: 10,\n            height: 50,\n            alignItems: \"center\",\n            paddingHorizontal: 16,\n          }}\n          showsHorizontalScrollIndicator={false}\n        >\n          {Colors.map(color => (\n            <AnimatedPressable\n              key={color}\n              style={{\n                width: 40,\n                height: 40,\n                borderRadius: 100,\n                backgroundColor: color,\n                borderWidth: 4,\n                borderColor: \"#FFF\",\n                shadowColor: \"#000\",\n                shadowOffset: {\n                  width: 0,\n                  height: 0,\n                },\n                shadowOpacity: 0.25,\n                justifyContent: \"center\",\n                alignItems: \"center\",\n              }}\n              onPress={() => setSelectedColor(color)}\n            >\n              {selectedColor === color && (\n                <Papicons name={\"Check\"} color={\"#FFF\"} />\n              )}\n            </AnimatedPressable>\n          ))}\n        </ScrollView>\n        <Stack\n          gap={5}\n          direction={\"horizontal\"}\n          hAlign={\"center\"}\n          style={{ paddingHorizontal: 16 }}\n        >\n          <Papicons name={\"Emoji\"} color={colors.text + \"7F\"} size={18} />\n          <Typography color=\"secondary\">Emoji</Typography>\n        </Stack>\n        <ScrollView\n          horizontal\n          style={{ width: Dimensions.get(\"window\").width }}\n          contentContainerStyle={{\n            gap: 10,\n            height: 60,\n            alignItems: \"center\",\n            paddingHorizontal: 16,\n          }}\n          showsHorizontalScrollIndicator={false}\n        >\n          {!AvailableEmojis.includes(selectedEmoji) && (\n            <AnimatedPressable\n              style={{\n                width: 60,\n                height: 60,\n                borderRadius: 100,\n                backgroundColor: selectedColor + \"20\",\n                borderWidth: 1,\n                borderColor: colors.border,\n                justifyContent: \"center\",\n                alignItems: \"center\",\n              }}\n            >\n              <Typography\n                style={{\n                  fontSize: 25,\n                  lineHeight: 32,\n                }}\n              >\n                {selectedEmoji}\n              </Typography>\n            </AnimatedPressable>\n          )}\n          {AvailableEmojis.map(emoji => (\n            <AnimatedPressable\n              key={emoji}\n              style={{\n                width: 60,\n                height: 60,\n                borderRadius: 100,\n                backgroundColor:\n                  selectedColor + (selectedEmoji === emoji ? \"20\" : \"00\"),\n                borderWidth: 1,\n                borderColor: colors.border,\n                justifyContent: \"center\",\n                alignItems: \"center\",\n              }}\n              onPress={() => {\n                if (emoji === \"custom\") {\n                  setShowEmojiPicker(true);\n                } else {\n                  setSelectedEmoji(emoji);\n                }\n              }}\n            >\n              {emoji === \"custom\" ? (\n                <Papicons name={\"Emoji\"} color={colors.text + \"7F\"} size={25} />\n              ) : (\n                <Typography\n                  style={{\n                    fontSize: 25,\n                    lineHeight: 32,\n                  }}\n                >\n                  {emoji}\n                </Typography>\n              )}\n            </AnimatedPressable>\n          ))}\n        </ScrollView>\n      </Stack>\n      <Modal\n        presentationStyle={\"formSheet\"}\n        animationType={\"slide\"}\n        visible={showEmojiPicker}\n        onRequestClose={() => setShowEmojiPicker(false)}\n      >\n        <EmojiPicker\n          onCancel={() => setShowEmojiPicker(false)}\n          onSelect={emoji => {\n            setSelectedEmoji(emoji);\n            setShowEmojiPicker(false);\n          }}\n        />\n      </Modal>\n    </View>\n  );\n};\n"
  },
  {
    "path": "app/(settings)/language.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Alert, Platform } from \"react-native\";\n\nimport { useSettingsStore } from \"@/stores/settings\";\nimport Icon from \"@/ui/components/Icon\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport { resources } from \"@/utils/i18n\";\n\nconst LanguagePersonalization = () => {\n  const { i18n } = useTranslation();\n  const { colors } = useTheme();\n\n  const settingStore = useSettingsStore(state => state.personalization);\n  const mutateProperty = useSettingsStore(state => state.mutateProperty);\n\n  const languages = Object.keys(resources).map(key => ({\n    id: key,\n    name: resources[key].label,\n    emoji: resources[key].emoji,\n  }));\n\n  const rtlLanguages = [\"ar\", \"he\", \"fa\", \"ur\"];\n\n  const setLanguage = (lang: string) => {\n    requestAnimationFrame(() => {\n      if (rtlLanguages.includes(lang)) {\n        Alert.alert(\n          \"Inverted layout is not supported yet\",\n          \"The selected language may not be displayed correctly.\"\n        );\n      }\n\n      setTimeout(() => {\n        i18n.changeLanguage(lang);\n        mutateProperty(\"personalization\", { ...settingStore, language: lang });\n      }, 90);\n    });\n  };\n\n  return (\n    <List\n      style={{ flex: 1 }}\n      contentContainerStyle={{ padding: 16 }}\n      contentInsetAdjustmentBehavior=\"always\"\n    >\n      {languages.map(lang => {\n        const isSelected = i18n.language === lang.id;\n\n        return (\n          <List.Item\n            key={lang.id}\n            onPress={() => {\n              setLanguage(lang.id);\n            }}\n          >\n            <List.Leading>\n              <Typography>{lang.emoji}</Typography>\n            </List.Leading>\n\n            <Typography\n              variant=\"title\"\n              weight={isSelected ? \"bold\" : \"medium\"}\n              style={{\n                paddingVertical: Platform.OS === \"android\" ? 4 : 2,\n              }}\n            >\n              {lang.name}\n            </Typography>\n\n            {isSelected && (\n              <List.Trailing>\n                <Icon size={22} papicon>\n                  <Papicons name={\"Check\"} color={colors.primary} />\n                </Icon>\n              </List.Trailing>\n            )}\n          </List.Item>\n        );\n      })}\n    </List>\n  );\n};\n\nexport default LanguagePersonalization;\n"
  },
  {
    "path": "app/(settings)/magic.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { t } from \"i18next\";\nimport React, { useEffect, useState } from \"react\";\nimport { Alert } from \"react-native\";\n\nimport SettingsHeader from \"@/components/SettingsHeader\";\nimport packageJson from \"@/package.json\";\nimport { useSettingsStore } from \"@/stores/settings\";\nimport Icon from \"@/ui/components/Icon\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport { MAGIC_URL } from \"@/utils/endpoints\";\nimport { log } from \"@/utils/logger/logger\";\nimport ModelManager from \"@/utils/magic/ModelManager\";\nimport { checkAndUpdateModel, getCurrentPtr } from \"@/utils/magic/updater\";\n\nfunction getMagicURL(): string {\n  return useSettingsStore.getState().personalization.magicModelURL || MAGIC_URL;\n}\n\nexport default function SettingsMagic() {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const settingsStore = useSettingsStore(state => state.personalization);\n  const mutateProperty = useSettingsStore(state => state.mutateProperty);\n\n  const [modelStatus, setModelStatus] = useState<any>(null);\n  const [currentPtr, setCurrentPtr] = useState<any>(null);\n  const [isUpdating, setIsUpdating] = useState(false);\n  const [lastUpdateCheck, setLastUpdateCheck] = useState<Date | null>(null);\n\n  useEffect(() => {\n    const updateStatus = async () => {\n      const status = ModelManager.getStatus();\n      setModelStatus(status);\n\n      try {\n        const ptr = await getCurrentPtr();\n        setCurrentPtr(ptr);\n      } catch (error) {\n        log(\"Erreur lors de la récupération du pointeur: \" + error);\n      }\n    };\n\n    updateStatus();\n  }, []);\n\n  const refreshStatus = async () => {\n    const status = ModelManager.getStatus();\n    setModelStatus(status);\n\n    try {\n      const ptr = await getCurrentPtr();\n      setCurrentPtr(ptr);\n    } catch (error) {\n      log(\"Erreur lors de la récupération du pointeur: \" + error);\n    }\n  };\n\n  const showDetailedStatus = () => {\n    if (!modelStatus) {\n      return;\n    }\n\n    log(\n      \"Statut détaillé du modèle:\" +\n        JSON.stringify({\n          hasModel: modelStatus.hasModel,\n          modelType: modelStatus.modelType,\n          hasInitialized: modelStatus.hasInitialized,\n          isInitializing: modelStatus.isInitializing,\n          maxLen: modelStatus.maxLen,\n          batchSize: modelStatus.batchSize,\n          labelsCount: modelStatus.labelsCount,\n          wordIndexSize: modelStatus.wordIndexSize,\n          oovIndex: modelStatus.oovIndex,\n          tokenizerInfo: modelStatus.tokenizerInfo,\n        })\n    );\n  };\n\n  const checkForUpdates = async () => {\n    if (isUpdating) {\n      return;\n    }\n\n    setIsUpdating(true);\n    setLastUpdateCheck(new Date());\n\n    try {\n      const result = await checkAndUpdateModel(\n        packageJson.version,\n        getMagicURL()\n      );\n\n      if (result.updated) {\n        await ModelManager.safeInit();\n        refreshStatus();\n      }\n    } catch (error) {\n      log(\"Erreur lors de la vérification:\" + error);\n    } finally {\n      setIsUpdating(false);\n    }\n  };\n\n  const resetModel = async () => {\n    try {\n      const result = await ModelManager.reset();\n      if (result.success) {\n        refreshStatus();\n      }\n    } catch (error) {\n      log(\"Erreur lors de la réinitialisation:\" + error);\n    }\n  };\n\n  return (\n    <List\n      style={{ flex: 1 }}\n      contentContainerStyle={{ padding: 20 }}\n      contentInsetAdjustmentBehavior=\"always\"\n    >\n      <List.View style={{ marginBottom: 20 }}>\n        <SettingsHeader\n          color={theme.dark ? \"#1a0b14ff\" : \"#FAD9EC\"}\n          title=\"Activer Magic+\"\n          description=\"Optimise automatiquement l'organisation de tes tâches pour améliorer ta productivité\"\n          // eslint-disable-next-line @typescript-eslint/no-require-imports\n          imageSource={require(\"@/assets/images/magic.png\")}\n          onSwitchChange={isSwitchOn => {\n            if (settingsStore.magicEnabled && !isSwitchOn) {\n              Alert.alert(\n                \"Désactivation de Magic+\",\n                \"Papillon Magic+ sera désactivé au prochain redémarrage\",\n                [{ text: \"OK\", style: \"default\" }]\n              );\n            }\n\n            mutateProperty(\"personalization\", {\n              magicEnabled: !settingsStore.magicEnabled,\n            });\n            setTimeout(refreshStatus, 100);\n          }}\n          switchValue={settingsStore.magicEnabled}\n          showSwitch={true}\n          switchColor={\"#DD007D\"}\n        />\n      </List.View>\n\n      {settingsStore.magicEnabled && (\n        <List.Section>\n          <List.Item onPress={showDetailedStatus}>\n            <List.Leading>\n              <Icon>\n                <Papicons name=\"sparkles\" size={20} color={colors.primary} />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">Statut du modèle</Typography>\n            <List.Trailing>\n              <Typography color=\"textSecondary\">\n                {modelStatus?.hasModel ? \"Chargé\" : \"Non chargé\"}\n              </Typography>\n            </List.Trailing>\n          </List.Item>\n\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name=\"butterfly\" size={20} color={colors.primary} />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">Modèle actuel</Typography>\n            <List.Trailing>\n              <Typography color=\"textPrimary\" weight=\"semibold\">\n                {currentPtr\n                  ? `${currentPtr.name} v${currentPtr.version}`\n                  : \"Aucun\"}\n              </Typography>\n            </List.Trailing>\n          </List.Item>\n        </List.Section>\n      )}\n\n      {settingsStore.magicEnabled && (\n        <List.Section>\n          <List.Item onPress={checkForUpdates}>\n            <List.Leading>\n              <Icon>\n                <Papicons\n                  name=\"search\"\n                  size={20}\n                  color={isUpdating ? \"#FF8C00\" : \"#007BFF\"}\n                />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"action\">Vérifier les mises à jour</Typography>\n            <List.Trailing>\n              <Icon>\n                <Papicons\n                  name=\"chevronRight\"\n                  size={20}\n                  color={colors.text + \"50\"}\n                />\n              </Icon>\n            </List.Trailing>\n          </List.Item>\n\n          <List.Item onPress={resetModel}>\n            <List.Leading>\n              <Icon>\n                <Papicons name=\"archive\" color=\"#FF4444\" />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"action\">Réinitialiser le modèle</Typography>\n            <List.Trailing>\n              <Icon>\n                <Papicons\n                  name=\"chevronRight\"\n                  size={20}\n                  color={colors.text + \"50\"}\n                />\n              </Icon>\n            </List.Trailing>\n          </List.Item>\n        </List.Section>\n      )}\n\n      <List.View style={{ marginTop: 20 }}>\n        <Typography variant=\"caption\" color=\"textSecondary\">\n          {t(\"Settings_MagicPlus_ExplanationLocal\")}\n        </Typography>\n      </List.View>\n    </List>\n  );\n}\n"
  },
  {
    "path": "app/(settings)/personalization.tsx",
    "content": "import { Alert, Platform, ScrollView, Switch } from \"react-native\";\nimport Stack from \"@/ui/components/Stack\";\nimport { EarthIcon } from \"lucide-react-native\";\nimport React, { useEffect } from \"react\";\nimport Typography from \"@/ui/new/Typography\";\nimport Icon from \"@/ui/components/Icon\";\nimport { Papicons, PapillonApp } from \"@getpapillon/papicons\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport { useTheme } from \"@react-navigation/native\";\nimport AppColorsSelector from \"@/components/AppColorsSelector\";\nimport { AppColors } from \"@/utils/colors\";\nimport LinearGradient from \"react-native-linear-gradient\";\nimport adjust from \"@/utils/adjustColor\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { DEFAULT_MATERIAL_YOU_ENABLED, useSettingsStore } from \"@/stores/settings\";\nimport { useTranslation } from \"react-i18next\";\nimport { router } from \"expo-router\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport { FadeIn, FadeOut } from \"react-native-reanimated\";\nimport List from \"@/ui/new/List\";\nimport NativeSwitch from \"@/ui/native/NativeSwitch\";\n\n\nconst PersonalizationSettings = () => {\n  const theme = useTheme();\n  const { t } = useTranslation()\n\n  const store = useAccountStore.getState();\n  const settingsStore = useSettingsStore(state => state.personalization);\n  const mutateProperty = useSettingsStore(state => state.mutateProperty);\n  const useMaterialYou = settingsStore.useMaterialYou ?? DEFAULT_MATERIAL_YOU_ENABLED;\n\n  const defaultColorData = AppColors.find(color => color.colorEnum === settingsStore.colorSelected) || AppColors[0];\n  const [selectedColor, setSelectedColor] = React.useState<string>(defaultColorData.mainColor);\n  const [selectedTheme, setSelectedTheme] = React.useState<\"light\" | \"dark\" | \"auto\">(\"auto\");\n\n  const height = useHeaderHeight()\n\n  useEffect(() => {\n    if (settingsStore.theme) {\n      setSelectedTheme(settingsStore.theme);\n    }\n  }, []);\n\n  useEffect(() => {\n    mutateProperty('personalization', { theme: selectedTheme });\n  }, [selectedTheme]);\n\n  return (\n    <>\n      <Dynamic animated entering={FadeIn} exiting={FadeOut} key={'color-grad-stgs:' + theme.colors.primary}>\n        <LinearGradient\n          colors={[theme.colors.primary, theme.colors.primary + \"00\"]}\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            height: 400,\n            opacity: useMaterialYou ? 0.4 : 1,\n          }}\n        />\n      </Dynamic>\n      <List\n        contentContainerStyle={{ padding: 16 }}\n        contentInsetAdjustmentBehavior=\"always\"\n        style={{ flex: 1, paddingTop: Platform.OS === \"android\" ? height : 0 }}\n      >\n        {!useMaterialYou &&\n          <List.Section>\n            <List.SectionTitle>\n              <List.Label>Choix de la couleur</List.Label>\n            </List.SectionTitle>\n            <List.View>\n              <AppColorsSelector\n                onChangeColor={(color: string) => {\n                  setSelectedColor(color);\n                  setTimeout(() => {\n                    const colorData = AppColors.find(appColor => appColor.mainColor === color);\n                    if (colorData) {\n                      mutateProperty('personalization', {\n                        colorSelected: colorData.colorEnum\n                      });\n                    }\n                  }, 50);\n                }}\n                accountId={store.lastUsedAccount}\n              />\n            </List.View>\n          </List.Section>\n        }\n\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>Options du thème</List.Label>\n          </List.SectionTitle>\n          {Platform.OS === \"android\" && Platform.Version >= 31 && (\n            <List.Item>\n              <List.Leading>\n                <Icon>\n                  <Papicons name={\"Palette\"} />\n                </Icon>\n              </List.Leading>\n              <Typography variant=\"caption\" color={\"primary\"}>{t(\"Global_Recommended\")}</Typography>\n              <Typography variant=\"title\">{t(\"Settings_Personalization_MaterialYou_Title\")}</Typography>\n              <Typography variant=\"body1\" color=\"textSecondary\">\n                {t(\"Settings_Personalization_MaterialYou_Description\")}\n              </Typography>\n              <List.Trailing>\n                <NativeSwitch\n                  value={useMaterialYou}\n                  onValueChange={(value) => {\n                    mutateProperty(\"personalization\", { useMaterialYou: value });\n                  }}\n                  disabled={typeof Platform.Version !== \"number\" || Platform.Version < 31}\n                />\n              </List.Trailing>\n            </List.Item>\n          )}\n          <List.Item>\n            <List.Leading>\n              <Icon>\n                <Papicons name={\"ColorTheme\"} />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">{t(\"Settings_Personalization_Theme\")}</Typography>\n            <List.Trailing>\n              <Stack bordered={true}\n                direction={\"horizontal\"}\n                height={40}\n                hAlign={\"center\"}\n                vAlign={\"center\"}\n              >\n                <AnimatedPressable onPress={() => setSelectedTheme(\"light\")}\n                  style={{ overflow: \"hidden\", height: \"100%\" }}\n                >\n                  <Stack style={{ overflow: \"hidden\", paddingHorizontal: 15, height: \"100%\" }}\n                    hAlign={\"center\"}\n                    vAlign={\"center\"}\n                    backgroundColor={selectedTheme === \"light\" ? theme.colors.primary : \"transparent\"}\n                    radius={20}\n                  >\n                    <Papicons name={\"Sun\"}\n                      opacity={selectedTheme === \"light\" ? 1 : 0.7}\n                      color={selectedTheme === \"light\" ? \"#FFF\" : theme.colors.text}\n                    />\n                  </Stack>\n                </AnimatedPressable>\n                <AnimatedPressable onPress={() => setSelectedTheme(\"dark\")}\n                  style={{ overflow: \"hidden\", height: \"100%\" }}\n                >\n                  <Stack style={{ overflow: \"hidden\", paddingHorizontal: 15, height: \"100%\" }}\n                    hAlign={\"center\"}\n                    vAlign={\"center\"}\n                    backgroundColor={selectedTheme === \"dark\" ? theme.colors.primary : \"transparent\"}\n                    radius={20}\n                  >\n                    <Papicons name={\"Moon\"}\n                      opacity={selectedTheme === \"dark\" ? 1 : 0.7}\n                      color={selectedTheme === \"dark\" ? \"#FFF\" : theme.colors.text}\n                    />\n                  </Stack>\n                </AnimatedPressable>\n                <AnimatedPressable onPress={() => setSelectedTheme(\"auto\")}\n                  style={{ overflow: \"hidden\", height: \"100%\" }}\n                >\n                  <Stack style={{ overflow: \"hidden\", paddingHorizontal: 15, height: \"100%\" }}\n                    hAlign={\"center\"}\n                    vAlign={\"center\"}\n                    backgroundColor={selectedTheme === \"auto\" ? theme.colors.primary : \"transparent\"}\n                    radius={20}\n                  >\n                    <Typography color={selectedTheme === \"auto\" ? \"#FFF\" : theme.colors.text + \"7F\"}>Auto</Typography>\n                  </Stack>\n                </AnimatedPressable>\n              </Stack>\n            </List.Trailing>\n          </List.Item>\n        </List.Section>\n\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>Options des matières</List.Label>\n          </List.SectionTitle>\n          <List.Item\n            onPress={() => {\n              router.push(\"/(settings)/subject_personalization\");\n            }}\n          >\n            <List.Leading>\n              <Icon>\n                <Papicons name={\"PenAlt\"} />\n              </Icon>\n            </List.Leading>\n            <Typography variant=\"title\">{t(\"Settings_Personalization_Subject_Title\")}</Typography>\n            <Typography variant=\"body1\" color=\"textSecondary\">\n              {t(\"Settings_Personalization_Subject_Description\")}\n            </Typography>\n            <List.Trailing>\n              <Icon>\n                <Papicons name=\"ChevronRight\" opacity={0.7} />\n              </Icon>\n            </List.Trailing>\n          </List.Item>\n        </List.Section>\n\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>Options de l'application</List.Label>\n          </List.SectionTitle>\n          <List.Item\n            onPress={() => {\n              router.push(\"/(settings)/tabs\");\n            }}\n          >\n            <List.Leading>\n              <Icon>\n                <Papicons name={\"PapillonApp\"} />\n              </Icon>\n            </List.Leading>\n            <Typography variant={\"title\"}>{t(\"Settings_Tabs_Title\")}</Typography>\n            <Typography variant={\"body1\"}\n              color={\"textSecondary\"}\n            >{t(\"Settings_Tabs_Description\")}</Typography>\n            <List.Trailing>\n              <Icon>\n                <Papicons name=\"ChevronRight\" opacity={0.7} />\n              </Icon>\n            </List.Trailing>\n          </List.Item>\n          <List.Item\n            onPress={() => {\n              router.push(\"/(settings)/language\");\n            }}\n          >\n            <List.Leading>\n              <Icon>\n                <Papicons name={\"MapPin\"} />\n              </Icon>\n            </List.Leading>\n            <Typography variant={\"title\"}>{t(\"Settings_Language_Title\")}</Typography>\n            <Typography variant={\"body1\"}\n              color={\"textSecondary\"}\n            >{t(\"Settings_Language_Description\")}</Typography>\n            <List.Trailing>\n              <Icon>\n                <Papicons name=\"ChevronRight\" opacity={0.7} />\n              </Icon>\n            </List.Trailing>\n          </List.Item>\n        </List.Section>\n      </List>\n    </>\n  )\n};\n\nexport default PersonalizationSettings;\n"
  },
  {
    "path": "app/(settings)/services.tsx",
    "content": "import { UserX2Icon } from \"lucide-react-native\";\nimport React from \"react\";\nimport { ScrollView } from \"react-native\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAccountStore } from \"@/stores/account\";\nimport Icon from \"@/ui/components/Icon\";\nimport Item from \"@/ui/components/Item\";\nimport List from \"@/ui/components/List\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\n\nexport default function SettingsServices() {\n  const accountStore = useAccountStore();\n  const { t } = useTranslation();\n\n  return (\n    <ScrollView\n      contentContainerStyle={{ padding: 16 }}\n      contentInsetAdjustmentBehavior=\"always\"\n      style={{ width: '100%', height: '100%' }}\n    >\n      {accountStore.lastUsedAccount && (\n        <List>\n          <Item>\n            <Typography variant=\"caption\" color=\"secondary\">\n              {t('Settings_Services_Title_LastAccountUsed')}\n            </Typography>\n            <Typography variant=\"title\">\n              {accountStore.lastUsedAccount}\n            </Typography>\n          </Item>\n        </List>\n      )}\n\n      {accountStore.accounts.length === 0 && (\n        <Stack\n          vAlign=\"center\"\n          hAlign=\"center\"\n          padding={16}\n          gap={0}\n        >\n          <Icon opacity={0.5} style={{ marginBottom: 8 }}>\n            <UserX2Icon size={36} />\n          </Icon>\n          <Typography variant=\"h4\" align=\"center\">\n            Aucun compte lié\n          </Typography>\n          <Typography variant=\"body1\" color=\"secondary\" align=\"center\">\n            Ajoute un compte en appuyant sur le bouton ci-dessus.\n          </Typography>\n        </Stack>\n      )}\n    </ScrollView>\n  );\n}\n"
  },
  {
    "path": "app/(settings)/settings.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport { useTheme } from \"@react-navigation/native\";\nimport { LinearGradient } from 'expo-linear-gradient';\nimport { useNavigation, useRouter } from \"expo-router\";\nimport * as WebBrowser from \"expo-web-browser\";\nimport { t } from \"i18next\";\nimport { BusIcon, HeartIcon, InfoIcon } from \"lucide-react-native\";\nimport React, { useCallback, useMemo } from \"react\";\nimport { Alert, Image, Platform, Pressable, View } from \"react-native\";\n\nimport { ClearDatabaseForAccount } from \"@/database/DatabaseProvider\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { useSettingsStore } from \"@/stores/settings\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport Avatar from \"@/ui/components/Avatar\";\nimport Icon from \"@/ui/components/Icon\";\nimport { NativeHeaderSide } from \"@/ui/components/NativeHeader\";\nimport Stack from \"@/ui/components/Stack\";\nimport TableFlatList from \"@/ui/components/TableFlatList\";\nimport TypographyLegacy from \"@/ui/components/Typography\";\nimport adjust from \"@/utils/adjustColor\";\nimport { getInitials } from \"@/utils/chats/initials\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport packagejson from \"../../package.json\"\nimport { formatSchoolName } from '@/utils/format/formatSchoolName';\nimport List, { ListTouchable } from '@/ui/new/List';\nimport Typography from '@/ui/new/Typography';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useHeaderHeight } from '@react-navigation/elements';\n\nexport default function SettingsIndex() {\n  const router = useRouter();\n  const navigation = useNavigation();\n\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const accountStore = useAccountStore();\n  const accounts = useAccountStore((state) => state.accounts);\n  const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);\n\n  const settingsStore = useSettingsStore(state => state.personalization);\n  const currentVersion = packagejson.version;\n  const releaseNotesUrl = `https://papillon.bzh/release-notes/${currentVersion}`;\n\n  const account = accounts.find((a) => a.id === lastUsedAccount);\n\n  const [firstName, lastName, level, establishment] = useMemo(() => {\n    if (!account) { return [null, null, null, null]; }\n\n    const firstName = account.firstName;\n    const lastName = account.lastName;\n    const level = account.className;\n    const establishment = account.schoolName;\n\n    return [firstName, lastName, level, establishment];\n  }, [account]);\n\n  const logout = useCallback(() => {\n    const accounts = useAccountStore.getState().accounts;\n    for (const account of accounts) {\n      useAccountStore.getState().removeAccount(account);\n    }\n    router.replace(\"/(onboarding)/welcome\");\n\n  }, [account, accountStore, router]);\n\n  const MoreSettingsList = [\n    {\n      title: t(\"Settings_Preferences\"),\n      content: [\n        /*{\n          title: t('Settings_Accessibility_Title'),\n          description: t('Settings_Accessibility_Description'),\n          papicon: <Papicons name={\"Accessibility\"} />,\n          icon: <AccessibilityIcon />,\n          color: \"#0038A8\",\n          onPress: () => Alert.alert(\"Ça arrive... ✨\", \"Cette fonctionnalité n'est pas encore disponible.\")\n        },*/\n        {\n          title: t(\"Settings_Transport_Title\"),\n          description: t(\"Settings_Transport_Description\"),\n          papicon: <Papicons name={\"Bus\"} />,\n          icon: <BusIcon />,\n          color: \"#000\",\n          onPress: () => router.navigate(\"/(settings)/transport\"),\n        },\n      ],\n    },\n    {\n      title: t(\"Settings_More\"),\n      content: [\n        /*{\n          title: t('Settings_Accessibility_Title'),\n          description: t('Settings_Accessibility_Description'),\n          papicon: <Papicons name={\"Accessibility\"} />,\n          icon: <AccessibilityIcon />,\n          color: \"#0038A8\",\n          onPress: () => Alert.alert(\"Ça arrive... ✨\", \"Cette fonctionnalité n'est pas encore disponible.\")\n        },*/\n        {\n          title: t(\"Settings_ReleaseNotes_Title\"),\n          description: t(\"Settings_ReleaseNotes_Description\"),\n          papicon: <Papicons name={\"PrivatePapillonApp\"} />,\n          icon: <InfoIcon />,\n          color: \"#1F7AFC\",\n          onPress: () =>\n            WebBrowser.openBrowserAsync(releaseNotesUrl, {\n              presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET,\n            }),\n        },\n        {\n          title: t(\"Settings_Donate_Title\"),\n          description: t(\"Settings_Donate_Description\"),\n          papicon: <Papicons name={\"Heart\"} />,\n          icon: <HeartIcon />,\n          color: \"#EFA400\",\n          onPress: () =>\n            WebBrowser.openBrowserAsync(\"https://go.papillon.bzh/donate\"),\n        },\n        {\n          title: t(\"Settings_About_Title\"),\n          description: `${t(\"Settings_About_Description\")} ${currentVersion}`,\n          icon: <InfoIcon />,\n          papicon: <Papicons name={\"Info\"} />,\n          color: \"#797979\",\n          onPress: () => router.navigate(\"/(settings)/about\"),\n        },\n      ],\n    },\n    {\n      title: t(\"Settings_About\"),\n      content: [\n        {\n          title: t(\"Settings_Telemetry_Title\"),\n          description: t(\"Settings_Telemetry_Description\"),\n          icon: <InfoIcon />,\n          papicon: <Papicons name={\"Check\"} />,\n          color: \"#797979\",\n          onPress: () => router.navigate(\"../consent\"),\n        },\n        {\n          title: t(\"Settings_Logout_Title\"),\n          description: t(\"Settings_Logout_Description\"),\n          papicon: <Papicons name={\"Logout\"} />,\n          color: \"#a80000\",\n          onPress: () => {\n            Alert.alert(\n              t(\"Settings_Logout_Title\"),\n              t(\"Settings_Logout_Description\"),\n              [\n                {\n                  text: t(\"CANCEL_BTN\"),\n                  style: \"cancel\",\n                },\n                {\n                  text: t(\"Settings_Logout_Title\"),\n                  style: \"destructive\",\n                  onPress: () => {\n                    logout();\n                  },\n                },\n              ],\n              { cancelable: true }\n            );\n          },\n        },\n      ],\n    },\n    ...(settingsStore.showDevMode\n      ? [\n        {\n          title: t(\"Settings_Dev\"),\n          content: [\n            ...(settingsStore.showDevMode\n              ? [\n                {\n                  title: \"Mode développeur\",\n                  description: \"Options avancées pour les développeurs.\",\n                  papicon: <Papicons name={\"Code\"} />,\n                  icon: <InfoIcon />,\n                  color: \"#FF6B35\",\n                  onPress: () => router.navigate(\"/devmode\"),\n                },\n              ]\n              : []),\n          ],\n        },\n      ]\n      : []),\n  ];\n\n  const BigButtons: Array<{\n    disabled?: boolean; icon: React.ReactNode, title: string, description: string, color: string, onPress?: () => void;\n  }> = [\n    {\n      icon: <Papicons name={\"Palette\"} />,\n      title: t('Settings_Personalization_Title_Card'),\n      description: t('Settings_Personalization_Subtitle_Card'),\n      color: \"#17C300\",\n      onPress: () => {\n        router.navigate(\"/(settings)/personalization\")\n      }\n    },\n    {\n      icon: <Papicons name={\"Calendar\"} />,\n      title: t('Settings_Personalization_Subject_Title_Card'),\n      description: t('Settings_Personalization_Subject_Description'),\n      color: \"#8500dd\",\n      onPress: () => {\n        router.navigate(\"/(settings)/subject_personalization\")\n      }\n    },\n    {\n      icon: <Papicons name={\"User\"} />,\n      title: t(\"Settings_Accounts_Title\"),\n      description: t('Settings_Accounts_Description'),\n      color: \"#0059DD\",\n      onPress: () => {\n        router.navigate(\"/(settings)/accounts\")\n      }\n    },\n    {\n      icon: <Papicons name={\"Sparkles\"} />,\n      title: \"Magic+\",\n      description: t('Settings_MagicPlus_Description_Card'),\n      color: \"#DD007D\",\n      onPress: () => {\n        router.navigate(\"/(settings)/magic\")\n      }\n    }\n  ]\n\n  const RenderBigButtons = useCallback(() => {\n    return (\n      <Stack direction=\"vertical\" gap={10}>\n        {Array.from({ length: Math.ceil(BigButtons.length / 2) }, (_, rowIndex) => (\n          <Stack key={rowIndex} direction=\"horizontal\" gap={10}>\n            {BigButtons.slice(rowIndex * 2, rowIndex * 2 + 2).map((button, _) => {\n              const newButtonColor = adjust(button.color, theme.dark ? 0.2 : -0.2);\n\n              return (\n                <View\n                  style={{ flex: 1, borderRadius: 22, elevation: 2, overflow: \"hidden\" }}\n                  key={button.title}\n                >\n                <ListTouchable\n                  onPress={button.onPress}\n                >\n                  <Stack\n                    flex\n                    card\n                    direction=\"vertical\"\n                    gap={8}\n                    padding={[14, 14]}\n                    radius={22}\n                    style={[\n                      Platform.OS === 'ios' ? { borderColor: adjust(button.color, theme.dark ? 0.3 : -0.3) + \"45\" } : { backgroundColor: adjust(button.color, theme.dark ? -0.8 : 0.8), borderWidth: 0 },\n                    ]}\n                  >\n                    {Platform.OS === 'ios' && (\n                      <LinearGradient\n                        colors={[adjust(button.color, theme.dark ? 0.3 : 0.8), button.color]}\n                        style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, borderRadius: 22, opacity: 0.16 }}\n                      />\n                    )}\n                    <Icon papicon size={32} fill={button.disabled ? \"#505050\" : newButtonColor}>\n                      {button.icon}\n                    </Icon>\n                    <Stack direction=\"vertical\" hAlign=\"start\" gap={0}>\n                      <TypographyLegacy inline variant=\"title\" weight=\"bold\" color={button.disabled ? \"#505050\" : newButtonColor}>{button.title}</TypographyLegacy>\n                      <TypographyLegacy inline variant=\"body2\" weight=\"medium\" color={button.disabled ? \"#505050\" : newButtonColor}>{button.description}</TypographyLegacy>\n                    </Stack>\n                  </Stack>\n                </ListTouchable>\n                </View>\n              )\n            })}\n          </Stack>\n        ))}\n      </Stack>\n    );\n  }, [theme.dark]);\n  \n  const insets = useSafeAreaInsets();\n\n  const headerHeight = useHeaderHeight();\n  const finalHeaderHeight = Platform.select({\n    android: headerHeight -16,\n    default: 0\n  });\n\n  return (\n    <>\n      <List\n        contentInsetAdjustmentBehavior=\"automatic\"\n        gap={12}\n        ListHeaderComponent={(\n          <View\n            style={{ marginVertical: 16, gap: 4 }}\n          >\n            <Stack\n              flex\n              direction=\"vertical\"\n              hAlign='center'\n              vAlign='center'\n              gap={6}\n              padding={[16, 0]}\n              style={{ paddingBottom: 24 }}\n            >\n              <Avatar\n                size={72}\n                initials={getInitials(`${account?.firstName} ${account?.lastName}`)}\n                imageUrl={account && account.customisation && account.customisation.profilePicture ? `data:image/png;base64,${account.customisation.profilePicture}` : undefined}\n                style={{ marginBottom: 8 }}\n              />\n              <TypographyLegacy variant=\"h3\" align=\"center\">\n                {firstName || lastName ? `${firstName || ''} ${lastName || ''}`.trim() : t('Settings_NoAccount')}\n              </TypographyLegacy>\n              {establishment &&\n                <TypographyLegacy variant=\"body1\" align=\"center\" color=\"secondary\">\n                  {level} {(level && establishment) && \" — \"} {formatSchoolName(establishment)}\n                </TypographyLegacy>\n              }\n            </Stack>\n            <RenderBigButtons\n            />\n          </View>\n        )}\n        contentContainerStyle={{ padding: 16, paddingBottom: insets.bottom + 16, paddingTop: finalHeaderHeight + 16 }}\n      >\n        {MoreSettingsList.map(section => (\n          <List.Section key={section.title}>\n            {Platform.OS === 'android' && (\n              <List.SectionTitle>\n                <List.Label>{section.title}</List.Label>\n              </List.SectionTitle>\n            )}\n            {section.content.map(item => (\n              <List.Item key={item.title} onPress={item.onPress}>\n                <List.Leading>\n                  <Icon papicon size={24} fill={theme.colors.text}>\n                    {item.papicon}\n                  </Icon>\n                </List.Leading>\n                <Typography variant=\"title\">{item.title}</Typography>\n                <Typography variant=\"body1\" color=\"textSecondary\">\n                  {item.description}\n                </Typography>\n              </List.Item>\n            ))}\n          </List.Section>\n        ))}\n      </List>\n    </>\n  );\n};\n"
  },
  {
    "path": "app/(settings)/subject_personalization.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { router } from \"expo-router\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Alert, View } from \"react-native\";\n\nimport { useAccountStore } from \"@/stores/account\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport Icon from \"@/ui/components/Icon\";\nimport {\n  NativeHeaderPressable,\n  NativeHeaderSide,\n} from \"@/ui/components/NativeHeader\";\nimport Stack from \"@/ui/components/Stack\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\n\nexport default function SubjectPersonalization() {\n  const { colors } = useTheme();\n\n  const accounts = useAccountStore(state => state.accounts);\n  const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);\n  const store = useAccountStore.getState();\n\n  const account = accounts.find(a => a.id === lastUsedAccount);\n  const subjects = Object.entries(account?.customisation?.subjects ?? {})\n    .map(([key, value]) => ({\n      id: key,\n      ...value,\n    }))\n    .filter(item => item.name && item.emoji && item.color);\n\n  const resetAllSubjects = () => {\n    Alert.alert(\n      t(\"Settings_Subjects_Reset_Title\"),\n      t(\"Settings_Subjects_Reset_Message\"),\n      [\n        {\n          text: t(\"CANCEL_BTN\"),\n          style: \"cancel\",\n        },\n        {\n          text: t(\"Settings_Subjects_Reset_Button\"),\n          style: \"destructive\",\n          onPress: () => {\n            store.setSubjects({});\n          },\n        },\n      ]\n    );\n  };\n\n  function renderItem(emoji: string, name: string, id: string, color: string) {\n    return (\n      <List.Item key={id}\n        onPress={() => {\n          router.push({\n            pathname: \"/(settings)/edit_subject\",\n            params: {\n              id,\n              emoji,\n              color,\n              name,\n            },\n          });\n        }}\n      >\n        <List.Leading>\n          <Stack\n            backgroundColor={color + \"20\"}\n            style={{\n              width: 40,\n              height: 40,\n              borderRadius: 40,\n              alignItems: \"center\",\n              justifyContent: \"center\",\n            }}\n          >\n            <Typography\n              style={{\n                fontSize: 25,\n                lineHeight: 32,\n              }}\n            >\n              {emoji}\n            </Typography>\n          </Stack>\n        </List.Leading>\n        <Typography variant={\"title\"}>{name}</Typography>\n        <List.Trailing>\n          <Icon>\n            <Papicons name=\"ChevronRight\" opacity={0.7} />\n          </Icon>\n        </List.Trailing>\n      </List.Item>\n    );\n  }\n\n  const { t } = useTranslation();\n\n  return (\n    <>\n      <NativeHeaderSide side=\"Right\">\n        <NativeHeaderPressable onPress={() => resetAllSubjects()}>\n          <Icon>\n            <Papicons name=\"Trash\" />\n          </Icon>\n        </NativeHeaderPressable>\n      </NativeHeaderSide>\n\n      <List\n        style={{ flex: 1 }}\n        contentContainerStyle={{ padding: 16 }}\n        contentInsetAdjustmentBehavior=\"always\"\n      >\n        {subjects.length > 0 ? (\n          subjects.map(item =>\n            renderItem(item.emoji, item.name, item.id, item.color)\n          )\n        ) : (\n          <List.View>\n            <Stack hAlign=\"center\" vAlign=\"center\" margin={16} gap={16}>\n              <View\n                style={{\n                  alignItems: \"center\",\n                }}\n              >\n                <Icon\n                  papicon\n                  opacity={0.5}\n                  size={32}\n                  style={{ marginBottom: 3 }}\n                >\n                  <Papicons name={\"Alert\"} />\n                </Icon>\n                <Typography variant=\"h4\" color=\"textPrimary\" align=\"center\">\n                  {t(\"Settings_Subjects_None_Title\")}\n                </Typography>\n                <Typography\n                  variant=\"body2\"\n                  color=\"textSecondary\"\n                  align=\"center\"\n                >\n                  {t(\"Settings_Subjects_None_Description\")}\n                </Typography>\n              </View>\n            </Stack>\n          </List.View>\n        )}\n      </List>\n    </>\n  );\n}\n"
  },
  {
    "path": "app/(settings)/tabs.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Switch } from \"react-native\";\n\nimport { useSettingsStore } from \"@/stores/settings\";\nimport Icon from \"@/ui/components/Icon\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport NativeSwitch from \"@/ui/native/NativeSwitch\";\n\nconst SettingsTabs = () => {\n  const { t } = useTranslation();\n\n  const settingsStore = useSettingsStore(state => state.personalization);\n  const mutateProperty = useSettingsStore(state => state.mutateProperty);\n\n  const disabledTabs = settingsStore?.disabledTabs || [];\n\n  const tabs = [\n    {\n      id: \"calendar\",\n      name: t(\"Tab_Calendar\"),\n      icon: \"calendar\",\n      enabled: !disabledTabs.includes(\"calendar\"),\n    },\n    {\n      id: \"tasks\",\n      name: t(\"Tab_Tasks\"),\n      icon: \"tasks\",\n      enabled: !disabledTabs.includes(\"tasks\"),\n    },\n    {\n      id: \"grades\",\n      name: t(\"Tab_Grades\"),\n      icon: \"grades\",\n      enabled: !disabledTabs.includes(\"grades\"),\n    },\n    {\n      id: \"news\",\n      name: t(\"Tab_News\"),\n      icon: \"newspaper\",\n      enabled: !disabledTabs.includes(\"news\"),\n    },\n  ];\n\n  const toggleTab = (tabId: string) => {\n    if (disabledTabs.includes(tabId)) {\n      mutateProperty(\"personalization\", {\n        ...settingsStore,\n        disabledTabs: disabledTabs.filter(id => id !== tabId),\n      });\n    } else {\n      mutateProperty(\"personalization\", {\n        ...settingsStore,\n        disabledTabs: [...disabledTabs, tabId],\n      });\n    }\n  };\n\n  return (\n    <List\n      contentInsetAdjustmentBehavior=\"always\"\n      contentContainerStyle={{ padding: 16 }}\n      style={{ flex: 1 }}\n    >\n      {tabs.map(tab => (\n        <List.Item key={tab.id}>\n          <List.Leading>\n            <Icon>\n              <Papicons name={tab.icon} />\n            </Icon>\n          </List.Leading>\n          <Typography variant=\"title\">{tab.name}</Typography>\n          <List.Trailing>\n            <NativeSwitch\n              value={tab.enabled}\n              onValueChange={() => toggleTab(tab.id)}\n            />\n          </List.Trailing>\n        </List.Item>\n      ))}\n    </List>\n  );\n};\n\nexport default SettingsTabs;\n"
  },
  {
    "path": "app/(settings)/transport.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport * as React from \"react\";\nimport { useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Image, Modal } from \"react-native\";\n\nimport SettingsHeader from \"@/components/SettingsHeader\";\nimport { AvailableTransportServices } from \"@/constants/AvailableTransportServices\";\nimport { useAccountStore } from \"@/stores/account\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport { AddressModal } from \"@/app/(modals)/address\";\nimport { TransportAddress } from \"@/stores/account/types\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { runsIOS26 } from \"@/ui/utils/IsLiquidGlass\";\n\nexport default function TransportView() {\n  const accountStore = useAccountStore();\n  const accounts = useAccountStore(state => state.accounts);\n  const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);\n  const { transport } = accounts.find(a => a.id === lastUsedAccount)!;\n\n  const theme = useTheme();\n  const { t } = useTranslation();\n\n  const [transportEnabled, setTransportEnabled] = React.useState(\n    transport?.enabled ?? false\n  );\n\n  const [showAddressSelect, setShowAddressSelect] = React.useState(false);\n  const [\n    addressSelectCanBeCurrentLocation,\n    setAddressSelectCanBeCurrentLocation,\n  ] = React.useState(false);\n\n  const openAddressSelect = (currentLocationEnabled: boolean) => {\n    setAddressSelectCanBeCurrentLocation(currentLocationEnabled);\n    setShowAddressSelect(true);\n  };\n\n  const formatAddress = (address: TransportAddress | undefined): string => {\n    if (address === undefined) {\n      return t(\"Settings_Transport_Address_Not_Set\");\n    }\n    if (address.firstTitle === \"current_location\") {\n      return t(\"Settings_Transport_Current_Position\");\n    }\n    return `${address.firstTitle}, ${address.secondTitle}`;\n  };\n\n  useEffect(\n    () => accountStore.setTransportEnabled(transportEnabled),\n    [transportEnabled]\n  );\n\n  const insets = useSafeAreaInsets();\n\n  return (\n    <List\n      style={{ flex: 1 }}\n      contentContainerStyle={{\n        padding: 20,\n        paddingTop: 16,\n      }}\n      contentInsetAdjustmentBehavior=\"always\"\n    >\n      <List.View style={{ marginBottom: 15 }}>\n        <SettingsHeader\n          color={theme.dark ? \"#231A0B\" : \"#FCF3E4\"}\n          title={t(\"Settings_Transport_Banner_Title\")}\n          description={t(\"Settings_Transport_Banner_Description\")}\n          iconName=\"Bus\"\n          imageSource={require(\"@/assets/images/transport.png\")}\n          showSwitch={true}\n          switchColor={\"#E8901C\"}\n          switchValue={transportEnabled}\n          onSwitchChange={setTransportEnabled}\n        />\n      </List.View>\n\n      <List.SectionTitle>\n        <List.Label>{t(\"Settings_Transport_Address_Title\")}</List.Label>\n      </List.SectionTitle>\n      <List.Section id=\"transport-addresses\">\n        <List.Item\n          onPress={() => {\n            if (transportEnabled) {\n              openAddressSelect(true);\n            }\n          }}\n          style={{ opacity: transportEnabled ? 1 : 0.5 }}\n        >\n          <List.Leading>\n            <Papicons name={\"Home\"} fill={theme.colors.text} opacity={0.7} />\n          </List.Leading>\n          <Typography numberOfLines={1}>\n            {t(\"Settings_Transport_Address_Home_Title\")}\n          </Typography>\n          <Typography color={\"textSecondary\"} numberOfLines={1}>\n            {formatAddress(transport?.homeAddress)}\n          </Typography>\n          <List.Trailing>\n            <Papicons\n              name={\"ChevronRight\"}\n              fill={theme.colors.text}\n              opacity={0.5}\n            />\n          </List.Trailing>\n        </List.Item>\n        <List.Item\n          onPress={() => {\n            if (transportEnabled) {\n              openAddressSelect(false);\n            }\n          }}\n          style={{ opacity: transportEnabled ? 1 : 0.5 }}\n        >\n          <List.Leading>\n            <Papicons name={\"Grades\"} fill={theme.colors.text} opacity={0.7} />\n          </List.Leading>\n          <Typography numberOfLines={1}>\n            {t(\"Settings_Transport_Address_School_Title\")}\n          </Typography>\n          <Typography color={\"textSecondary\"} numberOfLines={1}>\n            {formatAddress(transport?.schoolAddress)}\n          </Typography>\n          <List.Trailing>\n            <Papicons\n              name={\"ChevronRight\"}\n              fill={theme.colors.text}\n              opacity={0.5}\n            />\n          </List.Trailing>\n        </List.Item>\n      </List.Section>\n      <List.View style={{ marginVertical: 10 }}>\n        <Typography variant={\"caption\"} color={\"textSecondary\"}>\n          {t(\"Settings_Transport_Address_Description\")}\n        </Typography>\n      </List.View>\n\n      <List.SectionTitle>\n        <List.Label>\n          {t(\"Settings_Transport_Default_Application_Title\")}\n        </List.Label>\n      </List.SectionTitle>\n      <List.Section>\n        {AvailableTransportServices.map(service => (\n          <List.Item\n            onPress={() => {\n              if (transportEnabled) {\n                accountStore.setTransportService(service.id);\n              }\n            }}\n            key={service.id}\n            style={{ opacity: transportEnabled ? 1 : 0.5 }}\n          >\n            <List.Leading>\n              <Image\n                source={service.icon}\n                style={{\n                  width: 28,\n                  height: 28,\n                  borderRadius: 16,\n                }}\n              />\n            </List.Leading>\n            {(transport?.defaultApp ?? \"transit\") === service.id && (\n              <List.Trailing>\n                <Papicons name={\"Check\"} fill={\"#E8901C\"} />\n              </List.Trailing>\n            )}\n            <Typography numberOfLines={1} variant={\"title\"}>\n              {service.name}\n            </Typography>\n          </List.Item>\n        ))}\n      </List.Section>\n      <List.View>\n        <Modal\n          presentationStyle={\"pageSheet\"}\n          visible={showAddressSelect}\n          allowSwipeDismissal={true}\n          onRequestClose={() => setShowAddressSelect(false)}\n          animationType={\"slide\"}\n        >\n          <AddressModal\n            canUseCurrentLocation={addressSelectCanBeCurrentLocation}\n            onCancel={() => setShowAddressSelect(false)}\n            onConfirm={(item: TransportAddress) => {\n              if (addressSelectCanBeCurrentLocation) {\n                // Home\n                accountStore.setTransportHomeAddress(item);\n              } else {\n                // School\n                accountStore.setTransportSchoolAddress(item);\n              }\n              setShowAddressSelect(false);\n            }}\n          />\n        </Modal>\n      </List.View>\n    </List>\n  );\n}\n"
  },
  {
    "path": "app/(tabs)/_layout.tsx",
    "content": "import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';\nimport { useTheme } from '@react-navigation/native';\nimport { NativeTabs } from 'expo-router/unstable-native-tabs';\nimport { useTranslation } from 'react-i18next';\nimport { Platform } from 'react-native';\n\n// Static platform detection - computed once at module load\nconst IS_IOS_WITH_PADDING = runsIOS26;\nconst IS_ANDROID = Platform.OS === 'android';\n\nconst TAB_LABEL_STYLE = {\n  fontFamily: 'medium',\n  fontSize: Platform.OS === 'ios' ? 13 : 13,\n} as const;\n\nexport default function TabLayout() {\n  const theme = useTheme();\n  const { t } = useTranslation();\n\n  return (\n    <NativeTabs\n      tintColor={theme.colors.tint}\n      labelStyle={TAB_LABEL_STYLE}\n      labelVisibilityMode=\"labeled\"\n      rippleColor={theme.colors.tint + '22'}\n      backgroundColor={Platform.OS === 'android' ? theme.colors.background : undefined}\n      sidebarAdaptable\n    >\n      <NativeTabs.Trigger name=\"index\">\n        <NativeTabs.Trigger.Label>{t(\"Tab_Home\")}</NativeTabs.Trigger.Label>\n        <NativeTabs.Trigger.Icon src={IS_IOS_WITH_PADDING ? require('@/assets/icons/home_padding.png') : require('@/assets/icons/home.png')} renderingMode='template' />\n      </NativeTabs.Trigger>\n      <NativeTabs.Trigger name=\"calendar\">\n        <NativeTabs.Trigger.Label>{t(\"Tab_Calendar\")}</NativeTabs.Trigger.Label>\n        <NativeTabs.Trigger.Icon src={IS_IOS_WITH_PADDING ? require('@/assets/icons/calendar_padding.png') : require('@/assets/icons/calendar.png')} renderingMode='template' />\n      </NativeTabs.Trigger>\n      <NativeTabs.Trigger name=\"tasks\">\n        <NativeTabs.Trigger.Label>{t(\"Tab_Tasks\")}</NativeTabs.Trigger.Label>\n        <NativeTabs.Trigger.Icon src={IS_IOS_WITH_PADDING ? require('@/assets/icons/tasks_padding.png') : require('@/assets/icons/tasks.png')} renderingMode='template' />\n      </NativeTabs.Trigger>\n      <NativeTabs.Trigger name=\"grades\">\n        <NativeTabs.Trigger.Label>{t(\"Tab_Grades\")}</NativeTabs.Trigger.Label>\n        <NativeTabs.Trigger.Icon src={IS_IOS_WITH_PADDING ? require('@/assets/icons/pie_padding.png') : require('@/assets/icons/pie.png')} renderingMode='template' />\n      </NativeTabs.Trigger>\n      <NativeTabs.Trigger name=\"news\">\n        <NativeTabs.Trigger.Label>{t(\"Tab_News\")}</NativeTabs.Trigger.Label>\n        <NativeTabs.Trigger.Icon src={IS_IOS_WITH_PADDING ? require('@/assets/icons/newspaper_padding.png') : require('@/assets/icons/newspaper.png')} renderingMode='template' />\n      </NativeTabs.Trigger>\n    </NativeTabs>\n  );\n}\n"
  },
  {
    "path": "app/(tabs)/calendar/_layout.tsx",
    "content": "import { Stack } from \"expo-router\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport AndroidHeaderBackground from \"@/components/AndroidHeaderBackground\";\n\nexport default function Layout() {\n  const { t } = useTranslation();\n\n  return (\n    <Stack screenOptions={screenOptions}>\n      <Stack.Screen\n        name=\"index\"\n        options={{\n          headerShown: false,\n          headerTitle: t(\"Tab_Calendar\"),\n        }}\n      />\n      <Stack.Screen\n        name=\"event/[id]\"\n        options={{\n          headerShown: true,\n          headerTitle: \"\",\n        }}\n      />\n      <Stack.Screen\n        name=\"icals\"\n        options={{\n          presentation: \"modal\",\n          headerLargeTitle: false,\n          headerTitle: t(\"Tab_Calendar_Icals\"),\n          headerBackground: AndroidHeaderBackground\n        }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(tabs)/calendar/components/CalendarDay.tsx",
    "content": "import { useNavigation } from \"expo-router\";\nimport { t } from \"i18next\";\nimport React, { useMemo, useRef } from \"react\";\nimport { Dimensions,FlatList, Platform, RefreshControl, StyleSheet, View } from 'react-native';\n\nimport { Transit } from \"@/components/Transit\";\nimport { Course as SharedCourse, CourseStatus } from \"@/services/shared/timetable\";\nimport { TransportStorage } from \"@/stores/account/types\";\nimport Course from \"@/ui/components/Course\";\nimport { Colors, getSubjectColor } from \"@/utils/subjects/colors\";\nimport { getSubjectEmoji } from \"@/utils/subjects/emoji\";\nimport { getSubjectName } from '@/utils/subjects/name';\n\nimport { EmptyCalendar } from './EmptyCalendar';\n\ninterface CalendarDayProps {\n  dayDate: Date;\n  courses: SharedCourse[];\n  isRefreshing: boolean;\n  onRefresh: () => void;\n  colors: { primary: string, background: string };\n  headerHeight: number;\n  insets: any;\n  tabBarHeight: number;\n  transportInfo?: TransportStorage;\n}\n\nexport const CalendarDay = React.memo(({ dayDate, courses, isRefreshing, onRefresh, colors, headerHeight, insets, tabBarHeight, transportInfo }: CalendarDayProps) => {\n  const navigation = useNavigation<any>();\n\n  // Cache to preserve event object identity by id\n  const eventCache = useRef<{ [id: string]: any }>({});\n\n  // Shallow compare function\n  function shallowEqual(objA: any, objB: any) {\n    if (objA === objB) { return true; }\n    if (!objA || !objB) { return false; }\n    const keysA = Object.keys(objA);\n    const keysB = Object.keys(objB);\n    if (keysA.length !== keysB.length) { return false; }\n    for (const key of keysA) {\n      if (objA[key] !== objB[key]) { return false; }\n    }\n    return true;\n  }\n\n  const dayEvents = useMemo(() => {\n    const cache = eventCache.current;\n    const next: { [id: string]: any } = {};\n    const result = (courses ?? []).map(ev => {\n      if (cache[ev.id] && shallowEqual(ev, cache[ev.id])) {\n        next[ev.id] = cache[ev.id];\n        return cache[ev.id];\n      }\n      next[ev.id] = ev;\n      return ev;\n    });\n    eventCache.current = next;\n    return result;\n  }, [courses]);\n\n  const threshold = 30;\n\n  const enrichedEvents = useMemo(() => {\n    if (!dayEvents || dayEvents.length === 0) {return dayEvents;}\n    const result: any[] = [];\n\n    // Add transport departure\n    if (transportInfo?.enabled ?? false) {\n      result.push({\n        type: \"transit\",\n        isDeparture: true,\n        targetTime: dayEvents[0].from.getTime() / 1000,\n      });\n    }\n\n    // Add separator between events\n    for (let i = 0; i < dayEvents.length; i++) {\n      result.push(dayEvents[i]);\n      if (i < dayEvents.length - 1) {\n        const current = dayEvents[i];\n        const next = dayEvents[i + 1];\n        if (current.to && next.from) {\n          const diffMinutes =\n            (next.from.getTime() - current.to.getTime()) / (1000 * 60);\n          if (diffMinutes > threshold) {\n            result.push({\n              id: `separator-${current.id}-${next.id}`,\n              type: \"separator\" as any,\n              from: new Date(current.to),\n              to: new Date(next.from),\n            });\n          }\n        }\n      }\n    }\n\n    // Add transport arrival\n    if (transportInfo?.enabled ?? false) {\n      result.push({\n        type: \"transit\",\n        isDeparture: false,\n        targetTime: result[result.length - 1].to.getTime() / 1000,\n      });\n    }\n\n    return result;\n  }, [dayEvents]);\n\n  const isEmpty = enrichedEvents.length === 0;\n\n  return (\n    <View style={{ width: Dimensions.get(\"window\").width, flex: 1 }}>\n      <FlatList\n        data={enrichedEvents}\n        style={styles.container}\n        showsVerticalScrollIndicator={false}\n        contentContainerStyle={{\n          paddingHorizontal: 12,\n          paddingVertical: 12,\n          gap: 4,\n          paddingTop: headerHeight - 8,\n          paddingBottom: tabBarHeight + 6,\n          ...(isEmpty ? { alignItems: \"center\" } : {}),\n        }}\n        refreshControl={\n          <RefreshControl\n            refreshing={isRefreshing}\n            onRefresh={onRefresh}\n            colors={[colors.primary]}\n            progressBackgroundColor={colors.background}\n            progressViewOffset={Platform.OS === 'android' ? headerHeight : 0}\n          />\n        }\n        keyExtractor={item => item.id}\n        ListEmptyComponent={<EmptyCalendar />}\n        renderItem={({ item }: { item: SharedCourse }) => {\n          if ((item as any).type === \"transit\") {\n            return (\n              <Transit\n                isDeparture={item.isDeparture}\n                homeAddress={transportInfo?.homeAddress}\n                schoolAddress={transportInfo?.schoolAddress}\n                targetTime={item.targetTime}\n                service={transportInfo?.defaultApp ?? 'transit'}\n              />\n            );\n          }\n\n          if ((item as any).type === \"separator\") {\n            return (\n              <Course\n                id={item.id}\n                name=\"Pause\"\n                variant=\"separator\"\n                start={Math.floor(item.from.getTime() / 1000)}\n                end={Math.floor(item.to.getTime() / 1000)}\n                showTimes={false}\n                onPress={() => {\n                  navigation.navigate(\"(modals)/course\", {\n                    course: item,\n                    subjectInfo: {\n                      id: item.subject,\n                      name: getSubjectName(item.subject),\n                      color: getSubjectColor(item.subject) || Colors[0],\n                      emoji: getSubjectEmoji(item.subject),\n                    },\n                  });\n                }}\n              />\n            );\n          }\n\n          return (\n            <Course\n              id={item.id}\n              name={getSubjectName(item.subject)}\n              teacher={item.teacher}\n              room={item.room}\n              color={getSubjectColor(item.subject) || Colors[0]}\n              status={{\n                label: item.customStatus\n                  ? item.customStatus\n                  : getStatusText(item.status),\n                canceled: item.status === CourseStatus.CANCELED,\n              }}\n              variant=\"primary\"\n              start={Math.floor(item.from.getTime() / 1000)}\n              end={Math.floor(item.to.getTime() / 1000)}\n              readonly={!!item.createdByAccount}\n              onPress={() => {\n                navigation.navigate(\"(modals)/course\", {\n                  course: item,\n                  subjectInfo: {\n                    id: item.subject,\n                    name: getSubjectName(item.subject),\n                    color: getSubjectColor(item.subject) || Colors[0],\n                    emoji: getSubjectEmoji(item.subject),\n                  },\n                });\n              }}\n            />\n          );\n        }}\n      />\n    </View>\n  );\n}, (prevProps, nextProps) => {\n  return (\n    prevProps.dayDate.getTime() === nextProps.dayDate.getTime() &&\n    prevProps.isRefreshing === nextProps.isRefreshing &&\n    prevProps.onRefresh === nextProps.onRefresh &&\n    prevProps.headerHeight === nextProps.headerHeight &&\n    JSON.stringify(prevProps.courses) === JSON.stringify(nextProps.courses)\n  );\n});\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n});\n\nexport function getStatusText(status?: CourseStatus): string {\n  switch (status) {\n  case CourseStatus.ONLINE:\n    return t(\"Online_Course\")\n  case CourseStatus.EDITED:\n    return t(\"Edited_Course\")\n  case CourseStatus.CANCELED:\n    return t(\"Canceled_Course\")\n  case CourseStatus.EVALUATED:\n    return t(\"Evaluated_Course\")\n  default:\n    return \"\"\n  }\n}\n"
  },
  {
    "path": "app/(tabs)/calendar/components/CalendarHeader.tsx",
    "content": "import React from 'react';\nimport { Platform } from 'react-native';\nimport { useTheme } from '@react-navigation/native';\nimport { useRouter } from 'expo-router';\nimport { t } from 'i18next';\nimport TabHeader from '@/ui/components/TabHeader';\nimport TabHeaderTitle from '@/ui/components/TabHeaderTitle';\nimport ChipButton from '@/ui/components/ChipButton';\nimport Calendar from \"@/ui/components/Calendar\";\nimport i18n from '@/utils/i18n';\n\ninterface CalendarHeaderProps {\n  date: Date;\n  onDateChange: (date: Date) => void;\n  onHeaderHeightChange: (height: number) => void;\n  calendarRef: any;\n  isLoading?: boolean;\n}\n\nexport const CalendarHeader = React.memo(({ date, onDateChange, onHeaderHeightChange, calendarRef, isLoading }: CalendarHeaderProps) => {\n  const { colors } = useTheme();\n  const router = useRouter();\n\n  const toggleDatePicker = () => {\n    calendarRef.current?.toggle();\n  };\n\n  // know if date is today, yesterday, or tomorrow\n  const isToday = date.toDateString() === new Date().toDateString();\n  const isYesterday = date.toDateString() === new Date(new Date().setDate(new Date().getDate() - 1)).toDateString();\n  const isTomorrow = date.toDateString() === new Date(new Date().setDate(new Date().getDate() + 1)).toDateString();\n\n  const subtitle = isToday ? t(\"Today\") : isYesterday ? t(\"Yesterday\") : isTomorrow ? t(\"Tomorrow\") : \"\";\n\n  return (\n    <>\n      <Calendar\n        ref={calendarRef}\n        date={date}\n        onDateChange={onDateChange}\n        color={\"#D6502B\"}\n      />\n\n      <TabHeader\n        onHeightChanged={onHeaderHeightChange}\n        title={\n          <TabHeaderTitle\n            leading={date.toLocaleDateString(i18n.language, { weekday: \"long\" })}\n            number={date.toLocaleDateString(i18n.language, { day: \"numeric\" })}\n            trailing={date.toLocaleDateString(i18n.language, { month: \"long\" })}\n            subtitle={subtitle}\n            color='#D6502B'\n            height={56}\n            onPress={() => toggleDatePicker()}\n            loading={isLoading}\n          />\n        }\n        trailing={\n          <ChipButton\n            icon=\"calendar\"\n            chevron\n            actions={[\n              {\n                id: 'manage_icals',\n                title: t(\"Tab_Calendar_Icals\"),\n                papicon: \"calendar\",\n                subtitle: t(\"Tab_Calendar_Icals_Description\"),\n                imageColor: colors.text,\n                image: Platform.select({\n                  ios: 'calendar',\n                  android: 'ic_menu_add',\n                }),\n              }\n            ]}\n            onPressAction={({ nativeEvent }) => {\n              if (nativeEvent.event === 'manage_icals') {\n                router.push({\n                  pathname: \"./calendar/icals\",\n                  params: {}\n                });\n              }\n            }}\n          />\n        }\n      />\n    </>\n  );\n});\n"
  },
  {
    "path": "app/(tabs)/calendar/components/EmptyCalendar.tsx",
    "content": "import React, { memo } from 'react';\nimport { t } from \"i18next\";\nimport { Papicons } from '@getpapillon/papicons';\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Stack from \"@/ui/components/Stack\";\nimport Icon from \"@/ui/components/Icon\";\nimport Typography from \"@/ui/components/Typography\";\n\nexport const EmptyCalendar = memo(() => (\n  <Dynamic key={'empty-list:warn'}>\n    <Stack\n      hAlign=\"center\"\n      vAlign=\"center\"\n      margin={16}\n    >\n      <Icon papicon opacity={0.5} size={32} style={{ marginBottom: 3 }}>\n        <Papicons name={\"Calendar\"} />\n      </Icon>\n      <Typography variant=\"h4\" color=\"text\" align=\"center\">\n        {t('Tab_Calendar_Empty')}\n      </Typography>\n      <Typography variant=\"body2\" color=\"secondary\" align=\"center\">\n        {t('Tab_Calendar_Empty_Description')}\n      </Typography>\n    </Stack>\n  </Dynamic>\n));\n"
  },
  {
    "path": "app/(tabs)/calendar/event/[id].tsx",
    "content": "import { MenuView } from '@react-native-menu/menu';\nimport { useTheme } from \"@react-navigation/native\";\nimport { useLocalSearchParams, useNavigation, useRouter } from \"expo-router\";\nimport { t } from 'i18next';\nimport { MoreVertical } from \"lucide-react-native\";\nimport { useEffect, useLayoutEffect, useState } from 'react';\nimport React, { Alert, Platform, ScrollView, StyleSheet } from \"react-native\";\n\nimport UnderConstructionNotice from \"@/components/UnderConstructionNotice\";\nimport { useDatabase } from '@/database/DatabaseProvider';\nimport { useEventById } from '@/database/useEventsById';\nimport { NativeHeaderPressable, NativeHeaderSide } from '@/ui/components/NativeHeader';\nimport ActionMenu from '@/ui/components/ActionMenu';\n\nexport default function TabOneScreen() {\n  const { id, title } = useLocalSearchParams();\n  const database = useDatabase();\n  const router = useRouter();\n  const navigation = useNavigation();\n  const [isLoading, setIsLoading] = useState(true);\n\n  const { colors } = useTheme();\n\n  // Ensure id is a string or number, not an array\n  const eventId = Array.isArray(id) ? id[0] : id;\n  const event = useEventById(eventId);\n\n  useEffect(() => {\n    if (event && event.id) {\n      setIsLoading(false);\n    }\n  }, [event]);\n\n  useLayoutEffect(() => {\n    navigation.setOptions({\n      headerTitle: event ? event.title : title ?? t(\"Event_EventDetails\"),\n    });\n  }, [event, navigation]);\n\n  return (\n    <>\n      <NativeHeaderSide side='Right'>\n        <ActionMenu\n          actions={[\n            {\n              id: 'delete',\n              title: t(\"Event_DeleteEvent\"),\n              attributes: {\n                destructive: true,\n              },\n              imageColor: \"#ff0000\",\n              image: Platform.select({\n                ios: 'trash',\n                android: 'ic_menu_delete',\n              }),\n            }\n          ]}\n          onPressAction={({ nativeEvent }) => {\n            if (nativeEvent.event === 'delete') {\n              Alert.alert(\n                t(\"Event_DeleteEvent\"),\n                t(\"Event_Confirm_DeleteEvent\"),\n                [\n                  {\n                    text: t(\"Context_Cancel\"),\n                    style: \"cancel\"\n                  },\n                  {\n                    text: t(\"Event_DeleteEvent\"),\n                    style: \"destructive\",\n                    onPress: async () => {\n                      try {\n                        await database.write(async () => {\n                          const eventToDelete = await database.get('events').find(eventId);\n                          await eventToDelete.destroyPermanently();\n                        });\n                        router.back();\n                      } catch (error) {\n                        console.error(\"Error deleting event:\", error);\n                        Alert.alert(\n                          \"Erreur\",\n                          \"Une erreur est survenue lors de la suppression de l’événement.\",\n                          [{ text: \"OK\" }]\n                        );\n                      }\n                    }\n                  }\n                ]\n              );\n            }\n          }}\n        >\n          <NativeHeaderPressable>\n            <MoreVertical color={colors.text} />\n          </NativeHeaderPressable>\n        </ActionMenu>\n      </NativeHeaderSide>\n\n      <ScrollView\n        contentInsetAdjustmentBehavior=\"automatic\"\n        contentContainerStyle={styles.containerContent}\n        style={styles.container}\n      >\n        <UnderConstructionNotice />\n      </ScrollView>\n    </>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    padding: 16\n  },\n  containerContent: {\n    justifyContent: \"center\",\n    alignItems: \"center\",\n  }\n});\n"
  },
  {
    "path": "app/(tabs)/calendar/hooks/useCalendarState.ts",
    "content": "import { useState, useRef, useEffect, useCallback } from 'react';\nimport { Dimensions, FlatList } from 'react-native';\nimport { getWeekNumberFromDate } from \"@/database/useHomework\";\nimport { warn } from \"@/utils/logger/logger\";\n\nconst INITIAL_INDEX = 10000;\n\nexport function useCalendarState() {\n  const [date, setDate] = useState(new Date());\n  const [weekNumber, setWeekNumber] = useState(getWeekNumberFromDate(date));\n  const [currentIndex, setCurrentIndex] = useState(INITIAL_INDEX);\n  const flatListRef = useRef<FlatList<any>>(null);\n  const referenceDate = useRef(new Date());\n  const windowWidth = Dimensions.get(\"window\").width;\n\n  useEffect(() => {\n    referenceDate.current.setHours(0, 0, 0, 0);\n  }, []);\n\n  const getDateFromIndex = useCallback((index: number) => {\n    const d = new Date(referenceDate.current);\n    d.setDate(referenceDate.current.getDate() + (index - INITIAL_INDEX));\n    return d;\n  }, []);\n\n  const getIndexFromDate = useCallback((d: Date) => {\n    const base = new Date(referenceDate.current);\n    base.setHours(0, 0, 0, 0);\n    const target = new Date(d);\n    target.setHours(0, 0, 0, 0);\n    const diff = Math.round((target.getTime() - base.getTime()) / (1000 * 60 * 60 * 24));\n    return INITIAL_INDEX + diff;\n  }, []);\n\n  const handleDateChange = useCallback((newDate: Date) => {\n    setDate(newDate);\n    const newWeekNumber = getWeekNumberFromDate(newDate);\n    if (newWeekNumber !== weekNumber) {\n      setWeekNumber(newWeekNumber);\n    }\n  }, [weekNumber]);\n\n  // Sync FlatList with date\n  useEffect(() => {\n    const newIndex = getIndexFromDate(date);\n    let newWeekNumber = getWeekNumberFromDate(date);\n\n    if (date.getDay() === 0) {\n      newWeekNumber += 1;\n    }\n\n    if (newIndex !== currentIndex) {\n      setCurrentIndex(newIndex);\n      if (flatListRef.current) {\n        try {\n          flatListRef.current.scrollToIndex({\n            index: newIndex,\n            animated: false,\n          });\n        } catch (e) {\n          warn(String(e))\n        }\n      }\n    }\n\n    if (newWeekNumber !== weekNumber) {\n      setWeekNumber(newWeekNumber);\n    }\n  }, [date, getIndexFromDate, currentIndex, weekNumber]);\n\n  const onMomentumScrollEnd = useCallback((e: any) => {\n    const newIndex = Math.round(e.nativeEvent.contentOffset.x / windowWidth);\n    if (newIndex !== currentIndex) {\n      setCurrentIndex(newIndex);\n      const newDate = getDateFromIndex(newIndex);\n      setDate((prev) => prev.getTime() !== newDate.getTime() ? newDate : prev);\n    }\n  }, [windowWidth, currentIndex, getDateFromIndex]);\n\n  const lastEmittedIndex = useRef(currentIndex);\n\n  const onScroll = useCallback((e: any) => {\n    const offsetX = e.nativeEvent.contentOffset.x;\n    const newIndex = Math.round(offsetX / windowWidth);\n    if (newIndex !== lastEmittedIndex.current) {\n      lastEmittedIndex.current = newIndex;\n      setCurrentIndex(newIndex);\n      const newDate = getDateFromIndex(newIndex);\n      setDate((prev) => prev.getTime() !== newDate.getTime() ? newDate : prev);\n      const newWeekNumber = getWeekNumberFromDate(newDate);\n      if (newWeekNumber !== weekNumber) {\n        setWeekNumber(newWeekNumber);\n      }\n    }\n  }, [windowWidth, getDateFromIndex, weekNumber]);\n\n  return {\n    date,\n    setDate,\n    weekNumber,\n    setWeekNumber,\n    currentIndex,\n    flatListRef,\n    getDateFromIndex,\n    getIndexFromDate,\n    handleDateChange,\n    onMomentumScrollEnd,\n    onScroll,\n    INITIAL_INDEX,\n    windowWidth\n  };\n}\n"
  },
  {
    "path": "app/(tabs)/calendar/hooks/useTimetableData.ts",
    "content": "import { useCallback, useEffect, useMemo,useRef, useState } from 'react';\n\nimport { useTimetable } from '@/database/useTimetable';\nimport { getManager, subscribeManagerUpdate } from \"@/services/shared\";\nimport { useAccountStore } from '@/stores/account';\nimport { log, warn } from \"@/utils/logger/logger\";\n\nexport function useTimetableData(weekNumber: number, currentDate: Date = new Date()) {\n  const safeDate = currentDate;\n  const [isLoading, setIsLoading] = useState(false);\n  const [refresh, setRefresh] = useState(0);\n  const [manualRefreshing, setManualRefreshing] = useState(false);\n  const [fetchedWeeks, setFetchedWeeks] = useState<string[]>([]);\n  const fetchTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  let manager: ReturnType<typeof getManager> | null;\n\n  try {\n    manager = getManager();\n  } catch (error) {\n    warn('Manager not initialized, iCal events will still work');\n    manager = null;\n  }\n\n  const store = useAccountStore.getState();\n  const account = store.accounts.find(account => store.lastUsedAccount);\n  const services: string[] = account?.services?.map((service: { id: string }) => service.id) ?? [];\n  \n  const rawTimetable = useTimetable(refresh, [weekNumber - 1, weekNumber, weekNumber + 1], safeDate);\n  \n  const timetable = useMemo(() => {\n    return rawTimetable.map(day => ({\n      ...day,\n      courses: day.courses.filter(course =>\n        services.includes(course.createdByAccount) || course.createdByAccount.startsWith('ical_')\n      )\n    })).filter(day => day.courses.length > 0);\n  }, [rawTimetable, services]);\n\n  const fetchWeeklyTimetable = useCallback(async (targetWeekNumber: number, forceRefresh = false) => {\n    setIsLoading(true);\n    if (fetchTimeoutRef.current) {\n      clearTimeout(fetchTimeoutRef.current);\n      fetchTimeoutRef.current = null;\n    }\n\n    fetchTimeoutRef.current = setTimeout(async () => {\n      if (forceRefresh) {\n        setManualRefreshing(true);\n      }\n      try {\n        if (!manager) {\n          warn('Manager is null, skipping timetable fetch');\n          return;\n        }\n\n        const candidates = [targetWeekNumber - 1, targetWeekNumber, targetWeekNumber + 1].map(week => {\n          const targetDate = new Date(safeDate);\n          targetDate.setDate(targetDate.getDate() + (week - targetWeekNumber) * 7);\n          const year = targetDate.getFullYear();\n          const key = `${year}-${week}`;\n          return { week, targetDate, key };\n        });\n\n        const toFetch = candidates.filter(c => !fetchedWeeks.includes(c.key));\n\n        if (toFetch.length > 0) {\n          await Promise.all(\n            toFetch.map((c) => {\n              return manager.getWeeklyTimetable(c.week, c.targetDate)\n            })\n          );\n\n          setRefresh(prev => prev + 1);\n          setFetchedWeeks((prevFetchedWeeks) => [\n            ...prevFetchedWeeks,\n            ...toFetch.map(c => c.key),\n          ]);\n        }\n      } catch (error) {\n        log('Error fetching weekly timetable: ' + error);\n      } finally {\n        setIsLoading(false);\n        setManualRefreshing(false);\n        fetchTimeoutRef.current = null;\n      }\n    }, 100);\n  }, [fetchedWeeks, manager, safeDate]);\n\n  useEffect(() => {\n    fetchWeeklyTimetable(weekNumber);\n  }, [weekNumber, fetchWeeklyTimetable]);\n\n  useEffect(() => {\n    const unsubscribe = subscribeManagerUpdate((updatedManager) => {\n      if (updatedManager) {\n        fetchWeeklyTimetable(weekNumber);\n      }\n    });\n    return () => unsubscribe();\n  }, [weekNumber, fetchWeeklyTimetable]);\n\n  useEffect(() => {\n    return () => {\n      if (fetchTimeoutRef.current) {\n        clearTimeout(fetchTimeoutRef.current);\n      }\n    };\n  }, []);\n\n  const handleRefresh = useCallback(() => {\n    setRefresh(prev => prev + 1);\n    fetchWeeklyTimetable(weekNumber, true);\n  }, [weekNumber]);\n\n  return {\n    timetable,\n    refresh,\n    manualRefreshing,\n    handleRefresh,\n    isLoading\n  };\n}\n"
  },
  {
    "path": "app/(tabs)/calendar/icals.tsx",
    "content": "import { t } from \"i18next\";\nimport { Calendar, Link2Icon, TypeIcon, Brain } from \"lucide-react-native\";\nimport React, { useState } from \"react\";\nimport { Alert, ScrollView, StyleSheet, TextInput, Switch } from \"react-native\";\n\nimport { useAddIcal, useIcals, useRemoveIcal, useUpdateIcalParsing } from \"@/database/useIcals\";\nimport { isValidUrl, normalizeUrl } from \"@/services/local/ical-utils\";\nimport { fetchAndParseICal } from \"@/services/local/ical\";\nimport { enhanceADEUrl } from \"@/services/local/parsers/ade-parser\";\nimport Button from \"@/ui/components/Button\";\nimport Icon from \"@/ui/components/Icon\";\nimport Item, { Trailing } from \"@/ui/components/Item\";\nimport List from \"@/ui/components/List\";\nimport Typography from \"@/ui/components/Typography\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport NativeSwitch from \"@/ui/native/NativeSwitch\";\n\nexport default function TabOneScreen() {\n  const [icalUrl, setIcalUrl] = useState(\"\");\n  const [icalTitle, setIcalTitle] = useState(\"\");\n  const [intelligentParsing, setIntelligentParsing] = useState(false);\n  const [refresh, setRefresh] = useState(0);\n  const icals = useIcals(refresh);\n  const addIcal = useAddIcal();\n  const removeIcal = useRemoveIcal();\n  const updateIcalParsing = useUpdateIcalParsing();\n\n  const handleAdd = async () => {\n    if (!icalUrl.trim() || !icalTitle.trim()) {\n      Alert.alert(t(\"Tab_Calendar_Icals_Add_Title\"), t(\"Tab_Calendar_Icals_Add_Description\"));\n      return;\n    }\n\n    const normalizedUrl = normalizeUrl(icalUrl);\n\n    try {\n      const parsedData = await fetchAndParseICal(normalizedUrl);\n      const shouldEnableParsing = (parsedData.isADE || parsedData.isHyperplanning) ? true : intelligentParsing;\n\n      const finalUrl = parsedData.isADE ? enhanceADEUrl(normalizedUrl) : normalizedUrl;\n\n      await addIcal(icalTitle, finalUrl, shouldEnableParsing, parsedData.provider);\n      setIcalUrl(\"\");\n      setIcalTitle(\"\");\n      setIntelligentParsing(false);\n      setRefresh(r => r + 1);\n    } catch (error) {\n      Alert.alert(\"Erreur\", \"Impossible de traiter l'URL iCal. Vérifiez qu'elle est valide.\");\n    }\n  };\n\n  const handleRemove = async (id: string) => {\n    await removeIcal(id);\n    setRefresh(r => r + 1);\n  };\n\n\n  const theme = useTheme();\n  const { colors } = theme;\n\n  return (\n    <ScrollView\n      contentInsetAdjustmentBehavior=\"automatic\"\n      contentContainerStyle={styles.containerContent}\n      style={styles.container}\n      keyboardShouldPersistTaps=\"handled\"\n    >\n      <List>\n        {icalUrl.length > 0 &&\n          <Item>\n            <Icon>\n              <TypeIcon opacity={icalTitle.length > 0 ? 1 : 0.5} />\n            </Icon>\n            <TextInput\n              placeholder={t(\"Form_Title\")}\n              placeholderTextColor={colors.text + '80'}\n              value={icalTitle}\n              onChangeText={setIcalTitle}\n              style={{ flex: 1, paddingVertical: 8, fontSize: 16, fontFamily: \"medium\", color: colors.text }}\n            />\n          </Item>\n        }\n        <Item>\n          <Icon>\n            <Link2Icon opacity={icalUrl.length > 0 ? 1 : 0.5} />\n          </Icon>\n          <TextInput\n            placeholder={t(\"Tab_Calendar_Icals_Add_URL\")}\n            placeholderTextColor={colors.text + '80'}\n            value={icalUrl}\n            onChangeText={setIcalUrl}\n            style={{ flex: 1, paddingVertical: 8, fontSize: 16, fontFamily: \"medium\", color: colors.text }}\n          />\n          {icalUrl.length > 0 && (\n            <Trailing>\n              <AnimatedPressable onPress={handleAdd} disabled={!isValidUrl(icalUrl)}>\n                <Papicons name={'Add'} size={24} color={'#D6502B'} />\n              </AnimatedPressable>\n            </Trailing>\n          )}\n        </Item>\n      </List>\n\n      {icals.length > 0 && (\n        <List>\n          {icals.flatMap((ical, index) => {\n            const isADE = (ical as any).provider?.toUpperCase().includes('ADE');\n            const isHyperplanning = (ical as any).provider?.toUpperCase().includes('HYPERPLANNING');\n            const supportsIntelligentParsing = isADE || isHyperplanning;\n            const items = [\n              <Item\n                key={`${ical.id}-main`}\n                onPress={() => {\n                  Alert.alert(\n                    t('Tab_Calendar_Icals_Manage_Title', { title: ical.title }),\n                    t('Tab_Calendar_Icals_Manage_Description'),\n                    [\n                      {\n                        text: t('Context_Cancel'),\n                        style: 'cancel',\n                      },\n                      {\n                        text: t('Context_Delete'),\n                        style: 'destructive',\n                        onPress: () => handleRemove(ical.id)\n                      }\n                    ]\n                  );\n                }}\n              >\n                <Icon>\n                  <Calendar />\n                </Icon>\n                <Typography variant=\"title\">{ical.title}</Typography>\n                <Typography variant=\"caption\" color=\"secondary\">{ical.url}</Typography>\n              </Item>\n            ];\n\n            // only ADE and Hyperplanning calendars support intelligent parsing\n            if (supportsIntelligentParsing) {\n              items.push(\n                <Item key={`${ical.id}-parsing`}>\n                  <Icon>\n                    <Brain opacity={(ical as any).intelligentParsing ? 1 : 0.5} />\n                  </Icon>\n                  <Typography variant=\"title\">Parsing intelligent (Beta)</Typography>\n                  <Trailing>\n                    <NativeSwitch\n                      value={(ical as any).intelligentParsing || false}\n                      onValueChange={async (value) => {\n                        await updateIcalParsing(ical.id, value);\n                        setRefresh(r => r + 1);\n                      }}\n                    />\n                  </Trailing>\n                </Item>\n              );\n            }\n\n            return items;\n          })}\n        </List>\n      )}\n\n      {icals.length === 0 && (\n        <Typography variant=\"body1\" style={{ marginTop: 32 }} color=\"secondary\">\n          {t(\"Tab_Calendar_Icals_Empty\")}\n        </Typography>\n      )}\n    </ScrollView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    padding: 16\n  },\n  containerContent: {\n    justifyContent: \"center\",\n    alignItems: \"center\",\n  }\n});\n"
  },
  {
    "path": "app/(tabs)/calendar/index.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport { t } from \"i18next\";\nimport React, { useCallback, useRef, useState } from \"react\";\nimport { FlatList, Platform, StyleSheet,View } from \"react-native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport { CourseStatus } from \"@/services/shared/timetable\";\nimport { useAccountStore } from \"@/stores/account\";\n\nimport { CalendarDay } from \"./components/CalendarDay\";\nimport { CalendarHeader } from \"./components/CalendarHeader\";\nimport { useCalendarState } from \"./hooks/useCalendarState\";\nimport { useTimetableData } from \"./hooks/useTimetableData\";\n\nexport default function TabOneScreen() {\n  const { colors } = useTheme();\n  const calendarRef = useRef<any>(null);\n  const [headerHeight, setHeaderHeight] = useState(0);\n  const insets = useSafeAreaInsets();\n  const tabBarHeight = insets.bottom;\n\n  const accounts = useAccountStore(state => state.accounts);\n  const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);\n  const account = accounts.find(a => a.id === lastUsedAccount)!;\n\n  const {\n    date,\n    weekNumber,\n    currentIndex,\n    flatListRef,\n    getDateFromIndex,\n    handleDateChange,\n    onMomentumScrollEnd,\n    onScroll,\n    INITIAL_INDEX,\n    windowWidth\n  } = useCalendarState();\n\n  const {\n    timetable,\n    manualRefreshing,\n    handleRefresh,\n    isLoading\n  } = useTimetableData(weekNumber, date);\n\n  const renderDay = useCallback(({ index }: { index: number }) => {\n    const dayDate = getDateFromIndex(index);\n    const normalizedDate = new Date(dayDate);\n    normalizedDate.setHours(0, 0, 0, 0);\n    const dayCourses = timetable.find(d => {\n      const dDate = new Date(d.date);\n      dDate.setHours(0, 0, 0, 0);\n      return dDate.getTime() === normalizedDate.getTime();\n    })?.courses || [];\n\n    return (\n      <CalendarDay\n        dayDate={dayDate}\n        courses={dayCourses}\n        isRefreshing={manualRefreshing}\n        onRefresh={handleRefresh}\n        colors={colors}\n        headerHeight={headerHeight}\n        insets={insets}\n        tabBarHeight={tabBarHeight}\n        transportInfo={account.transport ?? undefined}\n      />\n    );\n  }, [getDateFromIndex, timetable, manualRefreshing, handleRefresh, colors, headerHeight]);\n\n  return (\n    <>\n      <CalendarHeader\n        date={date}\n        onDateChange={handleDateChange}\n        onHeaderHeightChange={setHeaderHeight}\n        calendarRef={calendarRef}\n        isLoading={isLoading}\n      />\n\n      <View style={[styles.container, { backgroundColor: colors.background }]}>\n        <FlatList\n          ref={flatListRef}\n          data={Array.from({ length: 20001 })}\n          horizontal\n          pagingEnabled={false}\n          showsHorizontalScrollIndicator={false}\n          initialScrollIndex={INITIAL_INDEX}\n          getItemLayout={(_, index) => ({ length: windowWidth, offset: windowWidth * index, index })}\n          renderItem={renderDay}\n          keyExtractor={(_, index) => \"renderDay:\" + String(index)}\n          onScroll={onScroll}\n          decelerationRate={Platform.OS === 'ios' ? 0.98 : undefined}\n          disableIntervalMomentum={true}\n          scrollEventThrottle={16}\n          onMomentumScrollEnd={onMomentumScrollEnd}\n          snapToInterval={windowWidth}\n          bounces={false}\n          windowSize={4}\n          maxToRenderPerBatch={3}\n          initialNumToRender={3}\n          showsVerticalScrollIndicator={false}\n          removeClippedSubviews\n          extraData={{ manualRefreshing, headerHeight, colors, timetable }}\n        />\n      </View>\n    </>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n});\n\nexport function getStatusText(status?: CourseStatus): string {\n  switch (status) {\n  case CourseStatus.ONLINE:\n    return t(\"Online_Course\")\n  case CourseStatus.EDITED:\n    return t(\"Edited_Course\")\n  case CourseStatus.CANCELED:\n    return t(\"Canceled_Course\")\n  case CourseStatus.EVALUATED:\n    return t(\"Evaluated_Course\")\n  default:\n    return \"\"\n  }\n}"
  },
  {
    "path": "app/(tabs)/grades/_layout.tsx",
    "content": "import { Stack } from \"expo-router\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport { runsIOS26 } from \"@/ui/utils/IsLiquidGlass\";\nimport AndroidHeaderBackground from \"@/components/AndroidHeaderBackground\";\n\nexport default function Layout() {\n  const { t } = useTranslation();\n\n  return (\n    <Stack screenOptions={screenOptions}>\n      <Stack.Screen\n        name=\"index\"\n        options={{\n          headerShown: false,\n          headerTitle: t(\"Tab_Grades\"),\n        }}\n      />\n      <Stack.Screen\n        name=\"modals/SubjectInfo\"\n        options={{\n          headerShown: true,\n          headerLargeTitle: false,\n          headerTitle: t(\"Grades_SubjectInfo\"),\n          presentation: \"modal\",\n          headerBackground: AndroidHeaderBackground\n        }}\n      />\n      <Stack.Screen\n        name=\"modals/AboutAverages\"\n        options={{\n          headerShown: true,\n          headerLargeTitle: false,\n          headerTitle: t(\"Grades_Avg_KnowMore\"),\n          presentation: \"modal\",\n        }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(tabs)/grades/atoms/Averages.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { MenuView } from \"@react-native-menu/menu\";\nimport { useTheme } from \"@react-navigation/native\";\nimport * as Haptics from \"expo-haptics\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport { useRouter } from \"expo-router\";\nimport * as WebBrowser from \"expo-web-browser\";\nimport { t } from \"i18next\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Platform, TouchableOpacity, View } from \"react-native\";\nimport { LineGraph } from \"react-native-graph\";\nimport { LayoutAnimationConfig } from \"react-native-reanimated\";\nimport Reanimated from \"react-native-reanimated\";\n\nimport { Grade } from \"@/services/shared/grade\";\nimport AnimatedNumber from \"@/ui/components/AnimatedNumber\";\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/new/Typography\";\nimport { PapillonAppearIn, PapillonAppearOut } from \"@/ui/utils/Transition\";\nimport adjust from \"@/utils/adjustColor\";\nimport PapillonSubjectAvg from \"@/utils/grades/algorithms/subject\";\nimport PapillonGradesAveragesOverTime from \"@/utils/grades/algorithms/time\";\nimport PapillonWeightedAvg from \"@/utils/grades/algorithms/weighted\";\n\nimport { calculateAmplifiedGraphPoints, GraphPoint } from \"../utils/graph\";\nimport ActionMenu from \"@/ui/components/ActionMenu\";\n\n\nconst algorithms = [\n  {\n    key: \"subjects\",\n    label: t('Grades_Avg_Subject_Title'),\n    description: t('Grades_Avg_Subject_Description'),\n    algorithm: PapillonSubjectAvg,\n    canInjectRealAverage: true,\n    sfsymbol: \"square.stack.3d.up.fill\"\n  },\n  {\n    key: \"weighted\",\n    label: t('Grades_Avg_All_Pond'),\n    description: t('Grades_Avg_All_Pond_Description'),\n    algorithm: PapillonWeightedAvg,\n    sfsymbol: \"plus.forwardslash.minus\"\n  }\n]\n\nconst Averages = ({ grades, realAverage, color, scale = 20, inline = false }: { grades: Grade[], realAverage?: number, color?: string, scale?: number, inline?: boolean }) => {\n  try {\n    const theme = useTheme();\n    const accent = color || theme.colors.primary;\n    const adjustedColor = adjust(accent, theme.dark ? 0.2 : -0.2);\n\n    const [algorithm, setAlgorithm] = useState(algorithms[0]);\n\n    const router = useRouter();\n\n    const currentAverageHistory = useMemo(() => {\n      if (!grades || grades.length === 0) { return []; }\n      try {\n        const history = PapillonGradesAveragesOverTime(algorithm.algorithm, grades, \"studentScore\");\n        if (algorithm.canInjectRealAverage && realAverage) {\n          history.push({\n            average: realAverage,\n            date: new Date(),\n          });\n        }\n        return history;\n      } catch (e) {\n        console.error(\"Error calculating average history:\", e);\n        return [];\n      }\n    }, [grades, algorithm, realAverage]);\n\n    const initialAverage = useMemo(() => {\n      if (currentAverageHistory.length === 0) {\n        return {\n          average: 0,\n          date: new Date(),\n        };\n      }\n\n      if (algorithm.canInjectRealAverage && realAverage) {\n        return {\n          average: realAverage,\n          date: new Date(),\n        };\n      }\n\n      if (!currentAverageHistory || currentAverageHistory.length === 0) { return null; }\n      return currentAverageHistory[currentAverageHistory.length - 1];\n    }, [currentAverageHistory, algorithm, realAverage]);\n\n    const [shownAverage, setShownAverage] = useState(initialAverage ? initialAverage.average : 0);\n    const [shownDate, setShownDate] = useState(initialAverage ? initialAverage.date : new Date());\n\n    // Update state when initialAverage changes (e.g. when algorithm changes)\n    React.useEffect(() => {\n      if (initialAverage) {\n        setShownAverage(initialAverage.average);\n        setShownDate(initialAverage.date);\n      } else {\n        setShownAverage(0);\n        setShownDate(new Date());\n      }\n    }, [initialAverage]);\n\n    const [active, setActive] = useState(false);\n\n    const handleGestureUpdate = useCallback((p: { value: number, date: Date, originalValue?: number, originalDate?: Date }) => {\n      setActive(true);\n      setShownAverage(p.originalValue ?? p.value);\n      setShownDate(p.originalDate ?? p.date);\n    }, []);\n\n    const handleGestureEnd = useCallback(() => {\n      setActive(false);\n      setShownAverage(initialAverage ? initialAverage.average : 0);\n      setShownDate(initialAverage ? initialAverage.date : new Date());\n    }, [initialAverage]);\n\n    useEffect(() => {\n      Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n    }, [active]);\n\n    const graphAxis = useMemo<GraphPoint[]>(() => {\n      return calculateAmplifiedGraphPoints(currentAverageHistory, scale);\n    }, [currentAverageHistory, scale]);\n\n    const isRealAverage = useMemo(() => {\n      return shownAverage === realAverage;\n    }, [shownAverage, realAverage]);\n\n    const backgroundColor = useMemo(() => {\n      return adjust(accent, theme.dark ? -0.89 : 0.8);\n    }, [accent, theme.dark]);\n\n    if (!grades || grades.length === 0) {\n      // You might want to return null or a placeholder here if there are absolutely no grades\n      // But if realAverage exists, we might still want to show something?\n      // For now, if there's no history and no real average, we can return null or render empty state.\n      if (!realAverage) { return null; }\n    }\n\n    graphAxis.forEach(item => {\n      item.value = Math.round(item.value * 100) / 100\n    })\n\n    return (\n      <Reanimated.View\n        style={{\n          width: \"100%\"\n        }}\n        entering={!inline ? PapillonAppearIn : undefined}\n        exiting={!inline ? PapillonAppearOut : undefined}\n      >\n        <LayoutAnimationConfig skipEntering={true} skipExiting={true}>\n          <Stack\n            card={!inline}\n            hAlign=\"center\"\n            vAlign=\"center\"\n            direction={inline ? \"horizontal\" : \"vertical\"}\n            gap={0}\n            style={[\n              Platform.OS === 'android' ? {\n                borderWidth: 0,\n                backgroundColor: theme.colors.card,\n                elevation: 0\n              } : {},\n              inline ? {\n                overflow: \"hidden\",\n                backgroundColor: \"transparent\",\n                marginTop: -8,\n              } : {\n                height: 180,\n              }\n            ]}\n          >\n            {Platform.OS === 'ios' && (\n              <LinearGradient\n                colors={[backgroundColor + \"90\", backgroundColor + \"00\"]}\n                start={inline ? [0, 1] : [0, 0]}\n                end={inline ? [0, 0] : [0, 1]}\n                style={{\n                  position: \"absolute\",\n                  top: 0,\n                  left: 0,\n                  right: 0,\n                  bottom: 0,\n                  borderRadius: 20,\n                }}\n              />\n            )}\n\n            <View\n              style={{\n                width: \"100%\",\n                flex: 1,\n                marginLeft: inline ? -2 : 0,\n                height: 100,\n                overflow: \"hidden\"\n              }}\n            >\n              <View\n                style={{\n                  width: \"105%\",\n                  height: 115,\n                  marginLeft: -30,\n                  marginTop: -15,\n                }}\n              >\n\n                {graphAxis.length > 0 ? (\n                  <LineGraph\n                    points={graphAxis}\n                    animated={true}\n                    color={adjustedColor}\n                    enablePanGesture={true}\n                    onPointSelected={handleGestureUpdate}\n                    onGestureEnd={handleGestureEnd}\n                    verticalPadding={30}\n                    horizontalPadding={30}\n                    lineThickness={inline ? 4.5 : 5}\n                    panGestureDelay={0}\n                    enableIndicator={true}\n                    enableFadeInMask={true}\n                    indicatorPulsating={true}\n                    style={{\n                      width: \"100%\",\n                      height: \"100%\",\n                    }}\n                  />\n                ) : null}\n              </View>\n            </View>\n\n            <Stack inline flex hAlign={inline ? \"start\" : \"center\"} vAlign=\"center\" gap={0} style={{ marginTop: inline ? 0 : -10, marginLeft: inline ? -24 : 0, marginRight: inline ? 20 : 0 }}>\n              <Stack animated direction=\"horizontal\" hAlign=\"end\" vAlign=\"end\" gap={2}>\n                <AnimatedNumber variant={inline ? \"h2\" : \"h1\"} color={adjustedColor}>\n                  {shownAverage ? shownAverage.toFixed(2) : \"0.00\"}\n                </AnimatedNumber>\n                <Dynamic animated>\n                  <Typography variant=\"title\" style={{ color: adjustedColor, marginBottom: inline ? 1 : 3, opacity: 0.7 }}>\n                    /{scale}\n                  </Typography>\n                </Dynamic>\n              </Stack>\n\n              <ActionMenu\n                actions={[\n                  {\n                    title: t('Grades_Avg_Methods'),\n                    subactions: algorithms.map((algo) => ({\n                      id: \"setAlg:\" + algo.key,\n                      title: algo.label,\n                      subtitle: algo.description,\n                      state: algorithm.key === algo.key ? \"on\" : \"off\",\n                      image: Platform.select({\n                        ios: algo.sfsymbol\n                      }),\n                      imageColor: theme.colors.text\n                    })),\n                    displayInline: true\n                  },\n                  {\n                    id: 'open:more',\n                    papicon: \"info\",\n                    title: t('Grades_Avg_KnowMore'),\n                    subtitle: t('Grades_Avg_KnowMore_Description'),\n                    image: Platform.select({\n                      ios: \"info.circle\"\n                    }),\n                    imageColor: theme.colors.text\n                  }\n                ]}\n                onPressAction={({ nativeEvent }) => {\n                  const actionId = nativeEvent.event;\n\n                  if (actionId.startsWith(\"open:\")) {\n                    if (actionId === \"open:more\") {\n                      WebBrowser.openBrowserAsync(\"https://docs.papillon.bzh/support/kb/averages\", {\n                        presentationStyle: \"pageSheet\"\n                      });\n                    }\n                  }\n\n                  if (actionId.startsWith(\"setAlg:\")) {\n                    setAlgorithm(algorithms.find((algo) => algo.key === actionId.slice(7))!);\n                  }\n                }}\n              >\n                <TouchableOpacity style={{ width: \"100%\", overflow: \"hidden\" }}>\n                  <Stack hAlign=\"center\" vAlign={inline ? \"start\" : \"center\"} direction=\"horizontal\" style={{ marginTop: -2 }}>\n                    <Typography variant={inline ? \"body1\" : \"title\"} weight=\"bold\" align=\"center\">\n                      {algorithm.label}\n                    </Typography>\n                    <Icon size={20} opacity={0.5}>\n                      <Papicons name=\"chevronDown\" />\n                    </Icon>\n                  </Stack>\n                </TouchableOpacity>\n              </ActionMenu>\n\n              <Dynamic animated key={\"dateSource:\" + (isRealAverage ? \"real\" : \"estimated\")}>\n                <Typography variant={inline ? \"body2\" : \"body1\"} color=\"textSecondary\" style={{ marginTop: inline ? 0 : 1, flex: 1 }} numberOfLines={1} ellipsizeMode=\"tail\" align={inline ? \"left\" : \"center\"}>\n                  {isRealAverage ? \"par l'établissement\" :\n                    \"estimée au \" + (shownDate instanceof Date && !isNaN(shownDate.getTime()) ? shownDate.toLocaleDateString(undefined, {\n                      day: \"numeric\",\n                      month: \"short\",\n                      year: \"numeric\"\n                    }) : \"Unknown Date\")}\n                </Typography>\n              </Dynamic>\n              {!inline && <View style={{ height: 14 }} />}\n            </Stack>\n\n          </Stack>\n        </LayoutAnimationConfig>\n      </Reanimated.View>\n    );\n  }\n  catch (e) {\n    console.error(e);\n    return null;\n  }\n};\n\nexport default Averages;\n"
  },
  {
    "path": "app/(tabs)/grades/atoms/FeaturesMap.tsx",
    "content": "import React from 'react';\nimport { View } from 'react-native';\n\nimport ScodocUES from '../features/ScodocUES';\n\nconst featureComponent = {\n  \"scodoc-ues\": ScodocUES,\n}\n\n\nconst FeaturesMap: React.FC<{ features: Record<string, any> }> = ({ features }) => {\n  if (!features) { return null; }\n\n  return (\n    <View style={{ marginBottom: 16 }}>\n      {Object.entries(features).map(([key, value]) => {\n        const Component = featureComponent[key as keyof typeof featureComponent];\n        if (!Component) { return null; }\n        return <Component key={key} data={value} />;\n      })}\n    </View>\n  );\n};\n\nexport default FeaturesMap;"
  },
  {
    "path": "app/(tabs)/grades/atoms/Subject.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport { useTheme } from '@react-navigation/native';\nimport { useNavigation } from 'expo-router';\nimport { t } from 'i18next';\nimport React, { useCallback, useMemo } from 'react';\nimport { Text, TouchableOpacity } from 'react-native';\n\nimport { Grade } from '@/database/models/Grades';\nimport Subject from '@/database/models/Subject';\nimport Item, { Trailing } from '@/ui/components/Item';\nimport LegacyList from '@/ui/components/List';\nimport Stack from '@/ui/components/Stack';\nimport LegacyTypography from '@/ui/components/Typography';\nimport adjust from '@/utils/adjustColor';\nimport { getSubjectColor } from '@/utils/subjects/colors';\nimport { getSubjectEmoji } from '@/utils/subjects/emoji';\nimport { getSubjectName } from '@/utils/subjects/name';\nimport List from '@/ui/new/List';\nimport Typography from '@/ui/new/Typography';\n\nconst GradeItem = React.memo(({ grade, subjectName, subjectColor, onPress, getAvgInfluence, getAvgClassInfluence }: { grade: Grade, subjectName: string, subjectColor: string, onPress: (grade: Grade) => void, getAvgInfluence: (grade: Grade) => number, getAvgClassInfluence: (grade: Grade) => number }) => {\n  const dateString = useMemo(() => {\n    // @ts-expect-error date type\n    return grade.givenAt.toLocaleDateString(undefined, { weekday: 'short', day: '2-digit', month: 'long', year: 'numeric' });\n  }, [grade.givenAt]);\n\n  const handlePress = useCallback(() => {\n    requestAnimationFrame(() => onPress(grade));\n  }, [grade, onPress]);\n\n  const theme = useTheme();\n\n  const hasMaxScore = grade.studentScore?.value === grade.maxScore?.value && !grade.studentScore.disabled;\n  const trailingBackground = hasMaxScore ? adjust(subjectColor, theme.dark ? -0.2 : 0) : subjectColor + \"15\";\n  const trailingForeground = hasMaxScore ? \"#FFFFFF\" : subjectColor;\n\n  return (\n    <List.Item onPress={handlePress}>\n      <Typography variant='title'>\n        {grade.description ? grade.description : t('Grade_NoDescription', { subject: subjectName })}\n      </Typography>\n      <Typography variant='body1' color='textSecondary'>\n        {dateString}\n      </Typography>\n\n      <List.Trailing>\n        <Stack pointerEvents='none' noShadow direction='horizontal' gap={2} card hAlign='end' vAlign='end' padding={[9, 3]} radius={32} backgroundColor={trailingBackground} >\n          {grade.studentScore.disabled ? (\n            <>\n              <LegacyTypography color={trailingForeground} variant='navigation'>\n                {grade.studentScore.status}\n              </LegacyTypography>\n            </>\n          ) : (\n            <>\n              <LegacyTypography color={trailingForeground} variant='navigation'>\n                {grade.studentScore.value.toFixed(2)}\n              </LegacyTypography>\n            </>\n          )}\n          <LegacyTypography color={trailingForeground + \"99\"} variant='body2'>\n            /{grade.outOf.value}\n          </LegacyTypography>\n\n          {hasMaxScore && (\n            <Papicons style={{ marginBottom: 3.5, marginLeft: 2 }} name=\"crown\" color={trailingForeground} size={18} />\n          )}\n        </Stack>\n      </List.Trailing>\n    </List.Item>\n  );\n});\n\nexport const SubjectItem: React.FC<{ subject: Subject, grades: Grade[], getAvgInfluence: (grade: Grade) => number, getAvgClassInfluence: (grade: Grade) => number }> = React.memo(({ subject, grades, getAvgInfluence, getAvgClassInfluence }) => {\n  const theme = useTheme();\n  const navigation = useNavigation()\n\n  // Memoize derived values\n  const subjectAdjustedColor = useMemo(\n    () => adjust(getSubjectColor(subject.name), theme.dark ? 0.2 : -0.4),\n    [subject.name, theme.dark]\n  );\n\n  const subjectName = useMemo(() => getSubjectName(subject.name), [subject.name]);\n  const subjectEmoji = useMemo(() => getSubjectEmoji(subject.name), [subject.name]);\n\n  const handlePressSubject = useCallback(() => {\n    // @ts-expect-error navigation types\n    navigation.navigate('modals/SubjectInfo', {\n      subject: subject\n    });\n  }, [navigation, subject]);\n\n  const handlePressGrade = useCallback(\n    (grade: Grade) => {\n      // @ts-expect-error navigation types\n      navigation.navigate('(modals)/grade', {\n        grade: grade,\n        subjectInfo: {\n          name: subjectName,\n          color: subjectAdjustedColor,\n          emoji: subjectEmoji,\n          originalName: subject.name\n        },\n        avgInfluence: getAvgInfluence(grade),\n        avgClass: getAvgClassInfluence(grade),\n      });\n    },\n    [navigation, subjectName, subjectAdjustedColor, subjectEmoji, subject.name, grades]\n  );\n\n  return (\n    <List.Section>\n      <List.View>\n        <TouchableOpacity style={{ width: '100%', paddingVertical: 8 }} activeOpacity={0.5} onPress={handlePressSubject}>\n          <Stack direction='horizontal' hAlign='center' gap={10} padding={[4, 0]}>\n            <Stack width={28} height={28} card hAlign='center' vAlign='center' radius={32} backgroundColor={subjectAdjustedColor + \"22\"}>\n              <Text style={{ fontSize: 15 }}>\n                {subjectEmoji}\n              </Text>\n            </Stack>\n\n            <Stack flex inline>\n              <Typography numberOfLines={1} variant='title' weight='bold' color={subjectAdjustedColor}>\n                {subjectName}\n              </Typography>\n            </Stack>\n\n            <Stack inline direction='horizontal' gap={1} hAlign='end' vAlign='end'>\n              {subject.studentAverage.disabled ? (\n                <LegacyTypography variant='h5' inline style={{ marginTop: 0 }}>\n                  {subject.studentAverage.status}\n                </LegacyTypography>\n              ) : (\n                <LegacyTypography\n                  variant='h5'\n                  inline\n                  style={{ marginTop: 0, fontSize: 19 }}\n                  color={\n                    subject.studentAverage.value === subject.maximum.value\n                      ? subjectAdjustedColor\n                      : undefined\n                  }\n                >\n                  {subject.studentAverage.value.toFixed(2)}\n                </LegacyTypography>\n              )}\n              <LegacyTypography inline variant='body2' color={theme.colors.text + \"99\"} style={{ marginBottom: 4 }}>\n                /{subject.outOf.value}\n              </LegacyTypography>\n              {subject.studentAverage.value === subject.maximum.value && !subject.studentAverage.disabled && (\n                <Papicons style={{ alignSelf: 'center', marginLeft: 4 }} name=\"crown\" color={subjectAdjustedColor} size={20} />\n              )}\n            </Stack>\n          </Stack>\n        </TouchableOpacity>\n      </List.View>\n\n      {subject.grades.map((grade) => (\n        <GradeItem\n          key={grade.id}\n          grade={grade}\n          subjectName={subjectName}\n          subjectColor={subjectAdjustedColor}\n          onPress={handlePressGrade}\n          getAvgInfluence={getAvgInfluence}\n          getAvgClassInfluence={getAvgClassInfluence}\n        />\n      ))}\n    </List.Section>\n  );\n});\n\nGradeItem.displayName = \"GradeItem\"\nSubjectItem.displayName = \"SubjectItem\""
  },
  {
    "path": "app/(tabs)/grades/features/ScodocUES.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport React from 'react';\n\nimport Icon from '@/ui/components/Icon';\nimport Item, { Leading, Trailing } from '@/ui/components/Item';\nimport List from '@/ui/components/List';\nimport Stack from '@/ui/components/Stack';\nimport Typography from '@/ui/components/Typography';\nimport adjust from '@/utils/adjustColor';\nimport { Modal, ScrollView, View } from 'react-native';\nimport { LinearGradient } from 'expo-linear-gradient';\nimport { useTheme } from '@react-navigation/native';\nimport AnimatedPressable from '@/ui/components/AnimatedPressable';\nimport { Dynamic } from '@/ui/components/Dynamic';\nimport { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';\n\nexport interface AveragedElement {\n  id: number;\n  coef: number;\n  moyenne: string;\n}\n\nexport interface UEMoyenne {\n  value: string;\n  min: string;\n  max: string;\n  moy: string;\n  rang: string;\n  total: number;\n  groupes: Record<string, any>; // Currently empty in your data\n}\n\nexport interface ECTSInfo {\n  acquis: number;\n  total: number;\n}\n\nexport interface UE {\n  id: number;\n  titre: string;\n  numero: number;\n  type: number;\n  color: string;\n  competence: string | null;\n  moyenne: UEMoyenne;\n  bonus: string;\n  malus: string;\n  capitalise: boolean | null;\n  ressources: Record<string, AveragedElement>;\n  saes: Record<string, AveragedElement>;\n  ECTS: ECTSInfo;\n}\n\nexport type UEMap = Record<string, UE>;\n\nconst ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {\n  try {\n    const { colors } = useTheme();\n    const [openedUE, setOpenedUE] = React.useState<string | null>(null);\n    const [displayUEs, setDisplayUEs] = React.useState(false);\n\n    return (\n      <>\n        <Stack gap={8}>\n\n          <AnimatedPressable onPress={() => setDisplayUEs(!displayUEs)} style={{ width: '100%' }}>\n            <Stack direction='horizontal' gap={8} vAlign='start' hAlign='center' style={{ opacity: 0.6 }} padding={[10, 2]} backgroundColor={!displayUEs ? colors.text + '22' : 'transparent'} radius={12}>\n              <Icon size={20}>\n                <Papicons name='pie' />\n              </Icon>\n              <Typography variant='h6' color='text' style={{ flex: 1 }}>\n                Unités d'enseignement\n              </Typography>\n              <Icon>\n                <Papicons name={displayUEs ? 'chevronup' : 'chevrondown'} />\n              </Icon>\n            </Stack>\n          </AnimatedPressable>\n\n          {displayUEs && (\n            <Dynamic\n              animated\n              entering={PapillonAppearIn}\n              exiting={PapillonAppearOut}\n            >\n              <List>\n                {Object.entries(data).map(([key, value]) => (\n                  <Item key={key} onPress={() => setOpenedUE(key)}>\n                    <Leading>\n                      <Stack backgroundColor={value.color + \"22\"} padding={[8, 4]} borderRadius={8}>\n                        <Typography variant='title' color='text' color={adjust(value.color, -0.2)}>\n                          {key}\n                        </Typography>\n                      </Stack>\n                    </Leading>\n                    <Typography nowrap variant='body1' color='text'>{value.titre}</Typography>\n                    <Trailing>\n                      <Stack direction='horizontal' gap={8} hAlign='center'>\n                        <Stack direction='horizontal' vAlign='end' hAlign='end' gap={0}>\n                          <Typography variant='navigation' color='text'>\n                            {value.moyenne.value}\n                          </Typography>\n                          <Typography variant='body2' color=\"secondary\">\n                            /20\n                          </Typography>\n                        </Stack>\n\n                        <Stack direction='horizontal' vAlign='end' hAlign='end' gap={0} padding={[8, 2]} bordered radius={8}>\n                          <Typography variant='navigation' color='text'>\n                            {value.moyenne.rang}\n                          </Typography>\n                          <Typography variant='body2' color=\"secondary\">\n                            /{value.moyenne.total}\n                          </Typography>\n                        </Stack>\n                      </Stack>\n                    </Trailing>\n                  </Item>\n                ))}\n              </List>\n            </Dynamic>\n          )}\n        </Stack>\n\n        <Modal\n          presentationStyle='formSheet'\n          visible={!!openedUE}\n          onDismiss={() => setOpenedUE(null)}\n          onRequestClose={() => setOpenedUE(null)}\n          animationType='slide'\n        >\n          <View\n            style={{\n              backgroundColor: colors.background,\n              flex: 1,\n            }}\n          >\n            {openedUE && (\n              <>\n                <LinearGradient\n                  colors={[data[openedUE].color, data[openedUE].color + \"00\"]}\n                  style={{\n                    position: \"absolute\",\n                    top: 0,\n                    left: 0,\n                    right: 0,\n                    height: 200,\n                    zIndex: 1,\n                    opacity: 0.2,\n                  }}\n                />\n\n                <ScrollView style={{ zIndex: 2 }}>\n                  <Stack padding={24} width='100%' gap={24}>\n                    <Stack vAlign='start' hAlign='start' gap={8}>\n                      <Stack direction='horizontal' width='100%' vAlign='center' hAlign='center'>\n                        <Stack backgroundColor={data[openedUE].color + \"22\"} padding={[8, 4]} borderRadius={8}>\n                          <Typography variant='title' color='text' color={adjust(data[openedUE].color, -0.2)}>\n                            {openedUE}\n                          </Typography>\n                        </Stack>\n\n                        <Typography variant='body2' color='secondary' align='right' style={{ flex: 1 }}>\n                          ECTS : {data[openedUE].ECTS.acquis} / {data[openedUE].ECTS.total}\n                        </Typography>\n                      </Stack>\n\n                      <Typography variant='navigation' color='text'>\n                        {data[openedUE].titre}\n                      </Typography>\n\n                      <Stack direction='horizontal' vAlign='end' hAlign='end' gap={2}>\n                        <Typography variant='h1' weight='semibold' inline color='text'>\n                          {data[openedUE].moyenne.value}\n                        </Typography>\n                        <Typography variant='title' color=\"secondary\">\n                          /20\n                        </Typography>\n                      </Stack>\n                    </Stack>\n\n                    <List>\n                      <Item>\n                        <Icon>\n                          <Papicons name='user' />\n                        </Icon>\n                        <Typography variant='title'>\n                          Rang\n                        </Typography>\n                        <Typography variant='body2' color='secondary'>\n                          Emplacement dans la classe\n                        </Typography>\n                        <Trailing>\n                          <Stack direction='horizontal' vAlign='end' hAlign='end' gap={0} padding={[8, 2]} bordered radius={8}>\n                            <Typography variant='navigation' color='text'>\n                              {data[openedUE].moyenne.rang}\n                            </Typography>\n                            <Typography variant='body2' color=\"secondary\">\n                              /{data[openedUE].moyenne.total}\n                            </Typography>\n                          </Stack>\n                        </Trailing>\n                      </Item>\n                      <Item>\n                        <Icon>\n                          <Papicons name='GraduationHat' />\n                        </Icon>\n                        <Typography>\n                          Moyenne de classe\n                        </Typography>\n                        <Trailing>\n                          <Stack direction='horizontal' vAlign='end' hAlign='end' gap={0} padding={[8, 2]} bordered radius={8}>\n                            <Typography variant='navigation' color='text'>\n                              {data[openedUE].moyenne.moy}\n                            </Typography>\n                            <Typography variant='body2' color=\"secondary\">\n                              /20\n                            </Typography>\n                          </Stack>\n                        </Trailing>\n                      </Item>\n                      <Item>\n                        <Icon>\n                          <Papicons name='ArrowRightUp' />\n                        </Icon>\n                        <Typography>\n                          Moyenne basse\n                        </Typography>\n                        <Trailing>\n                          <Stack direction='horizontal' vAlign='end' hAlign='end' gap={0} padding={[8, 2]} bordered radius={8}>\n                            <Typography variant='navigation' color='text'>\n                              {data[openedUE].moyenne.min}\n                            </Typography>\n                            <Typography variant='body2' color=\"secondary\">\n                              /20\n                            </Typography>\n                          </Stack>\n                        </Trailing>\n                      </Item>\n                      <Item>\n                        <Icon>\n                          <Papicons name='minus' />\n                        </Icon>\n                        <Typography>\n                          Moyenne haute\n                        </Typography>\n                        <Trailing>\n                          <Stack direction='horizontal' vAlign='end' hAlign='end' gap={0} padding={[8, 2]} bordered radius={8}>\n                            <Typography variant='navigation' color='text'>\n                              {data[openedUE].moyenne.max}\n                            </Typography>\n                            <Typography variant='body2' color=\"secondary\">\n                              /20\n                            </Typography>\n                          </Stack>\n                        </Trailing>\n                      </Item>\n                    </List>\n\n                    <List>\n                      {Object.entries(data[openedUE].saes).map(([key, value]) => (\n                        <Item key={key}>\n                          <Typography variant='title'>\n                            {key}\n                          </Typography>\n                          <Trailing>\n                            <Stack direction='horizontal' gap={8} hAlign='center'>\n                              <Stack direction='horizontal' vAlign='end' hAlign='end' gap={0}>\n                                <Typography variant='navigation' color='text'>\n                                  {value.moyenne}\n                                </Typography>\n                                <Typography variant='body2' color=\"secondary\">\n                                  /20\n                                </Typography>\n                              </Stack>\n\n                              <Stack direction='horizontal' vAlign='end' hAlign='end' gap={0} padding={[8, 2]} bordered radius={8}>\n                                <Typography variant='navigation' color='text'>\n                                  x{value.coef}\n                                </Typography>\n                              </Stack>\n                            </Stack>\n                          </Trailing>\n                        </Item>\n                      ))}\n                    </List>\n\n                    <List>\n                      {Object.entries(data[openedUE].ressources).map(([key, value]) => (\n                        <Item key={key}>\n                          <Typography variant='title'>\n                            {key}\n                          </Typography>\n                          <Trailing>\n                            <Stack direction='horizontal' gap={8} hAlign='center'>\n                              <Stack direction='horizontal' vAlign='end' hAlign='end' gap={0}>\n                                <Typography variant='navigation' color='text'>\n                                  {value.moyenne}\n                                </Typography>\n                                <Typography variant='body2' color=\"secondary\">\n                                  /20\n                                </Typography>\n                              </Stack>\n\n                              <Stack direction='horizontal' vAlign='end' hAlign='end' gap={0} padding={[8, 2]} bordered radius={8}>\n                                <Typography variant='navigation' color='text'>\n                                  x{value.coef}\n                                </Typography>\n                              </Stack>\n                            </Stack>\n                          </Trailing>\n                        </Item>\n                      ))}\n                    </List>\n                  </Stack>\n                </ScrollView>\n              </>\n            )}\n          </View>\n        </Modal>\n      </>\n    );\n  }\n  catch (error) {\n    return null;\n  }\n};\n\nexport default ScodocUES;"
  },
  {
    "path": "app/(tabs)/grades/hooks/useGradeInfluence.ts",
    "content": "import { useMemo, useCallback } from 'react';\nimport { Grade, Subject } from \"@/services/shared/grade\";\n\nimport { getSubjectAverageByProperty as getSubjectAverageByPropertyHelper } from \"@/utils/grades/algorithms/helpers\";\nimport { getSubjectAverage } from \"@/utils/grades/algorithms/subject\";\n\nexport const useGradeInfluence = (subjects: Subject[], getSubjectById: (id: string) => Subject | undefined) => {\n  // Pre-calculate subject averages to avoid re-computing them for every grade\n  const subjectAverages = useMemo(() => {\n    const avgs: Record<string, number> = {};\n    subjects.forEach(subject => {\n      avgs[subject.id] = getSubjectAverage(subject.grades);\n    });\n    return avgs;\n  }, [subjects]);\n\n  const subjectClassAverages = useMemo(() => {\n    const avgs: Record<string, number> = {};\n    subjects.forEach(subject => {\n      avgs[subject.id] = getSubjectAverageByPropertyHelper(subject.grades, \"averageScore\");\n    });\n    return avgs;\n  }, [subjects]);\n\n  const globalAverage = useMemo(() => {\n    let total = 0;\n    let count = 0;\n    Object.values(subjectAverages).forEach(avg => {\n      if (avg !== -1) {\n        total += avg;\n        count++;\n      }\n    });\n    return count > 0 ? total / count : 0;\n  }, [subjectAverages]);\n\n  const globalClassAverage = useMemo(() => {\n    let total = 0;\n    let count = 0;\n    Object.values(subjectClassAverages).forEach(avg => {\n      if (avg !== -1) {\n        total += avg;\n        count++;\n      }\n    });\n    return count > 0 ? total / count : 0;\n  }, [subjectClassAverages]);\n\n  const getAvgInfluence = useCallback((grade: Grade) => {\n    const subjectId = grade.subjectId;\n    const currentSubjectAvg = subjectAverages[subjectId];\n\n    if (currentSubjectAvg === undefined || currentSubjectAvg === -1) return 0;\n\n    // Calculate what the subject average would be without this grade\n    // We need to find the subject and filter the grade out\n    const subject = getSubjectById(subjectId);\n    if (!subject) return 0;\n\n    const newSubjectAvg = getSubjectAverage(subject.grades.filter(g => g.id !== grade.id));\n\n    // If the subject average doesn't change (or becomes invalid), the influence is 0 (or based on removing the subject)\n    // But wait, if the subject average becomes -1 (invalid), it means the subject no longer counts towards the global average.\n    \n    let newGlobalAverage = 0;\n    \n    if (newSubjectAvg === -1) {\n      // Subject is removed from global average\n      let total = 0;\n      let count = 0;\n      Object.entries(subjectAverages).forEach(([id, avg]) => {\n        if (id !== subjectId && avg !== -1) {\n          total += avg;\n          count++;\n        }\n      });\n      newGlobalAverage = count > 0 ? total / count : 0;\n    } else {\n      // Subject average changes\n      let total = 0;\n      let count = 0;\n      Object.entries(subjectAverages).forEach(([id, avg]) => {\n        if (id !== subjectId && avg !== -1) {\n          total += avg;\n          count++;\n        }\n      });\n      // Add the new subject average\n      total += newSubjectAvg;\n      count++;\n      newGlobalAverage = count > 0 ? total / count : 0;\n    }\n\n    return Number((globalAverage - newGlobalAverage).toFixed(2));\n  }, [subjectAverages, globalAverage, getSubjectById]);\n\n  const getAvgClassInfluence = useCallback((grade: Grade) => {\n    const subjectId = grade.subjectId;\n    const currentSubjectAvg = subjectClassAverages[subjectId];\n\n    if (currentSubjectAvg === undefined || currentSubjectAvg === -1) return 0;\n\n    const subject = getSubjectById(subjectId);\n    if (!subject) return 0;\n\n    const newSubjectAvg = getSubjectAverageByPropertyHelper(subject.grades.filter(g => g.id !== grade.id), \"averageScore\");\n\n    let newGlobalAverage = 0;\n\n    if (newSubjectAvg === -1) {\n      let total = 0;\n      let count = 0;\n      Object.entries(subjectClassAverages).forEach(([id, avg]) => {\n        if (id !== subjectId && avg !== -1) {\n          total += avg;\n          count++;\n        }\n      });\n      newGlobalAverage = count > 0 ? total / count : 0;\n    } else {\n      let total = 0;\n      let count = 0;\n      Object.entries(subjectClassAverages).forEach(([id, avg]) => {\n        if (id !== subjectId && avg !== -1) {\n          total += avg;\n          count++;\n        }\n      });\n      total += newSubjectAvg;\n      count++;\n      newGlobalAverage = count > 0 ? total / count : 0;\n    }\n\n    return Number((globalClassAverage - newGlobalAverage).toFixed(2));\n  }, [subjectClassAverages, globalClassAverage, getSubjectById]);\n\n  return {\n    getAvgInfluence,\n    getAvgClassInfluence\n  };\n};\n"
  },
  {
    "path": "app/(tabs)/grades/index.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport { LegendList } from '@legendapp/list';\nimport { MenuView } from '@react-native-menu/menu';\nimport { useTheme } from '@react-navigation/native';\nimport { useNavigation } from 'expo-router';\nimport { t } from 'i18next';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Dimensions, Platform, RefreshControl, View } from 'react-native';\nimport Reanimated, { LinearTransition, useAnimatedStyle } from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { getManager, subscribeManagerUpdate } from '@/services/shared';\nimport { GradeScore, Period, Subject } from \"@/services/shared/grade\";\nimport { useSettingsStore } from \"@/stores/settings\";\nimport ChipButton from '@/ui/components/ChipButton';\nimport { CompactGrade } from '@/ui/components/CompactGrade';\nimport { Dynamic } from '@/ui/components/Dynamic';\nimport { ErrorBoundary } from '@/ui/components/ErrorBoundary';\nimport Icon from '@/ui/components/Icon';\nimport Item, { Trailing } from '@/ui/components/Item';\nimport LegacyList from '@/ui/components/List';\nimport Search from '@/ui/components/Search';\nimport Stack from '@/ui/components/Stack';\nimport TabHeader from '@/ui/components/TabHeader';\nimport TabHeaderTitle from '@/ui/components/TabHeaderTitle';\nimport LegacyTypography from '@/ui/components/Typography';\nimport { useKeyboardHeight } from '@/ui/hooks/useKeyboardHeight';\nimport { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';\nimport { getCurrentPeriod } from '@/utils/grades/helper/period';\nimport i18n from '@/utils/i18n';\nimport { getPeriodName, getPeriodNumber, isPeriodWithNumber } from \"@/utils/services/periods\";\nimport { getSubjectColor } from \"@/utils/subjects/colors\";\nimport { getSubjectEmoji } from \"@/utils/subjects/emoji\";\nimport { getSubjectName } from \"@/utils/subjects/name\";\n\nimport Averages from './atoms/Averages';\nimport FeaturesMap from './atoms/FeaturesMap';\nimport { SubjectItem } from './atoms/Subject';\nimport { useGradeInfluence } from './hooks/useGradeInfluence';\nimport List from '@/ui/new/List';\nimport Typography from '@/ui/new/Typography';\nimport ActionMenu from '@/ui/components/ActionMenu';\n\nconst MemoizedSubjectItem = React.memo(SubjectItem);\n\nconst GradesView: React.FC = () => {\n  // Layout du header\n  const [headerHeight, setHeaderHeight] = useState(0);\n\n  // Thème\n  const { colors } = useTheme();\n  const insets = useSafeAreaInsets();\n  const bottomTabBarHeight = 0;\n  const navigation = useNavigation();\n\n  // Chargement\n  const [periodsLoading, setPeriodsLoading] = useState(true);\n  const [gradesLoading, setGradesLoading] = useState(true);\n  const loading = periodsLoading || gradesLoading;\n\n  const [isRefreshing, setIsRefreshing] = useState(false);\n\n  // Sortings\n  const settings = useSettingsStore(state => state.personalization);\n  const mutateSettings = useSettingsStore(state => state.mutateProperty);\n\n  const [sortMethod, setSortMethod] = useState<string>(settings.gradesSortMethod || \"date\");\n\n  useEffect(() => {\n    if (settings.gradesSortMethod) {\n      setSortMethod(settings.gradesSortMethod);\n    }\n  }, [settings.gradesSortMethod]);\n\n  const updateSortMethod = (method: string) => {\n    setSortMethod(method);\n    mutateSettings('personalization', { gradesSortMethod: method });\n  };\n  const sortings = [\n    {\n      label: t(\"Grades_Sorting_Alphabetical\"),\n      value: \"alphabetical\",\n      papicon: \"letter\",\n      icon: {\n        ios: \"character\",\n        android: \"ic_alphabetical\",\n        papicon: \"font\",\n      }\n    },\n    {\n      label: t(\"Grades_Sorting_Date\"),\n      value: \"date\",\n      papicon: \"calendar\",\n      icon: {\n        ios: \"calendar\",\n        android: \"ic_date\",\n        papicon: \"calendar\",\n      }\n    },\n    {\n      label: t(\"Grades_Sorting_Averages\"),\n      value: \"averages\",\n      papicon: \"grades\",\n      icon: {\n        ios: \"chart.xyaxis.line\",\n        android: \"ic_averages\",\n        papicon: \"grades\",\n      }\n    },\n  ];\n\n  // Gestion du scroll\n  const [shouldCollapseHeader, setShouldCollapseHeader] = useState(false);\n\n  // Manager\n  const manager = getManager();\n\n  // Obtention des périodes\n  const [periods, setPeriods] = useState<Period[]>([]);\n  const [currentPeriod, setCurrentPeriod] = useState<Period>();\n\n  const fetchPeriods = async (managerToUse = manager) => {\n    if (currentPeriod || !managerToUse) { return; }\n    setPeriodsLoading(true);\n\n    const result = await managerToUse.getGradesPeriods();\n    let currentPeriodFound = getCurrentPeriod(result);\n\n    if (settings.gradesPeriodId) {\n      const savedPeriod = result.find(p => p.id === settings.gradesPeriodId);\n      if (savedPeriod) {\n        currentPeriodFound = savedPeriod;\n      }\n    }\n\n    // sort by time, then put Semestre and Trimestre on top\n    const sortedResult = [...result].sort((a, b) => {\n      const isAKey = a.name.startsWith(\"Semestre\") || a.name.startsWith(\"Trimestre\");\n      const isBKey = b.name.startsWith(\"Semestre\") || b.name.startsWith(\"Trimestre\");\n\n      if (isAKey && !isBKey) { return -1; }\n      if (!isAKey && isBKey) { return 1; }\n\n      return a.start.getTime() - b.start.getTime();\n    });\n\n    setPeriods(sortedResult);\n    setCurrentPeriod(currentPeriodFound);\n    setPeriodsLoading(false);\n  };\n\n  useEffect(() => {\n    const unsubscribe = subscribeManagerUpdate((updatedManager) => {\n      fetchPeriods(updatedManager);\n    });\n\n    return () => unsubscribe();\n  }, []);\n\n  // Obtention des notes\n  const [subjects, setSubjects] = useState<Subject[]>([]);\n  const [features, setFeatures] = useState<GradeFeatures | null>(null);\n  const [serviceAverage, setServiceAverage] = useState<number | null>(null);\n  const [serviceRank, setServiceRank] = useState<GradeScore | null>(null);\n\n  const fetchGradesForPeriod = async (period: Period | undefined, managerToUse = manager) => {\n    setGradesLoading(true);\n    if (period && managerToUse) {\n      const grades = await managerToUse.getGradesForPeriod(period, period.createdByAccount);\n\n      if (grades?.features) {\n        setFeatures(grades.features);\n      }\n      if (!grades || !grades.subjects) {\n        setGradesLoading(false);\n        return;\n      }\n      setSubjects(grades.subjects);\n      if (grades.studentOverall && typeof grades.studentOverall.value === 'number') {\n        setServiceAverage(grades.studentOverall.value)\n      } else {\n        setServiceAverage(null);\n      }\n\n      if (grades.rank && typeof grades.rank.value === 'number' && !grades.rank.disabled) {\n        setServiceRank(grades.rank)\n      } else {\n        setServiceRank(null);\n      }\n\n      requestAnimationFrame(() => {\n        setTimeout(() => {\n          setGradesLoading(false);\n          setIsRefreshing(false);\n        }, 200);\n      });\n    } else {\n      setGradesLoading(false);\n    }\n  };\n\n  // Fetch grades when current period changes\n  useEffect(() => {\n    fetchGradesForPeriod(currentPeriod);\n  }, [currentPeriod]);\n\n  const grades = useMemo(() => {\n    return subjects.flatMap((subject) => subject.grades || []);\n  }, [subjects]);\n\n  const getSubjectById = useCallback((id: string) => {\n    return subjects.find((subject) => subject.id === id);\n  }, [subjects]);\n\n  // Sort\n  // Sort grades in subjects by date descending then sort subjects by latest grade descending\n  const sortedSubjects = useMemo(() => {\n    const subjectsCopy = [...subjects];\n    subjectsCopy.forEach((subject) => {\n      subject.grades.sort((a, b) => b.givenAt.getTime() - a.givenAt.getTime());\n    });\n\n    switch (sortMethod) {\n      case \"alphabetical\":\n        subjectsCopy.sort((a, b) => {\n          const nameA = getSubjectName(a.name).toLowerCase();\n          const nameB = getSubjectName(b.name).toLowerCase();\n          return nameA.localeCompare(nameB);\n        });\n        break;\n\n      case \"averages\":\n        subjectsCopy.sort((a, b) => {\n          const aAvg = a.studentAverage.value;\n          const bAvg = b.studentAverage.value;\n          return bAvg - aAvg;\n        });\n        break;\n\n      default:\n        subjectsCopy.sort((a, b) => {\n          const aLatestGrade = a.grades?.[0];\n          const bLatestGrade = b.grades?.[0];\n\n          if (!aLatestGrade && !bLatestGrade) { return 0; }\n          if (!aLatestGrade) { return 1; }\n          if (!bLatestGrade) { return -1; }\n\n          return bLatestGrade.givenAt.getTime() - aLatestGrade.givenAt.getTime();\n        });\n        break;\n    }\n\n    return subjectsCopy;\n  }, [subjects, sortMethod]);\n\n  const sortedGrades = useMemo(() => {\n    const gradesCopy = [...grades];\n    gradesCopy.sort((a, b) => b.givenAt.getTime() - a.givenAt.getTime());\n    return gradesCopy;\n  }, [grades]);\n\n  // Search\n  const [searchText, setSearchText] = useState<string>(\"\");\n  const filteredSubjects = useMemo(() => {\n    if (searchText.trim() === \"\") {\n      return sortedSubjects;\n    }\n\n    const lowerSearchText = searchText.toLowerCase();\n\n    return sortedSubjects.filter((subject) => {\n      const subjectName = getSubjectName(subject.name).toLowerCase();\n      if (subjectName.includes(lowerSearchText)) {\n        return true;\n      }\n\n      // Also search in grades descriptions\n      const matchingGrades = subject.grades?.filter((grade) => {\n        return grade.description?.toLowerCase().includes(lowerSearchText);\n      });\n\n      return (matchingGrades?.length || 0) > 0;\n    });\n  }, [searchText, sortedSubjects]);\n\n  // Refresh\n  const handleRefresh = useCallback(async () => {\n    setIsRefreshing(true);\n\n    if (periods.length === 0) {\n      fetchPeriods();\n    }\n\n    fetchGradesForPeriod(currentPeriod);\n  }, [currentPeriod, periods]);\n\n  const renderItem = useCallback(({ item }: { item: any }) => {\n    const subject = item as Subject;\n    return (\n      <ErrorBoundary>\n        {/* @ts-expect-error navigation types */}\n        <MemoizedSubjectItem subject={subject} grades={grades} getAvgInfluence={getAvgInfluence} getAvgClassInfluence={getAvgClassInfluence} />\n      </ErrorBoundary>\n    )\n  }, [grades]);\n\n  const keyboardHeight = useKeyboardHeight();\n\n  const footerStyle = useAnimatedStyle(() => ({\n    height: keyboardHeight.value - bottomTabBarHeight,\n  }));\n\n  // influences\n  const { getAvgInfluence, getAvgClassInfluence } = useGradeInfluence(subjects, getSubjectById);\n\n  // header\n  const ListHeader = useMemo(() => ((sortedGrades.length > 0 && searchText.length === 0) ? (\n    <View style={{ marginBottom: 16 }}>\n      <ErrorBoundary>\n        <Averages\n          grades={grades}\n          color={colors.primary}\n          realAverage={serviceAverage || undefined}\n        />\n      </ErrorBoundary>\n\n      {serviceRank && (\n        <LegacyList style={{ marginTop: 8 }}>\n          <Item>\n            <Icon opacity={0.5}>\n              <Papicons name='crown' />\n            </Icon>\n\n            <LegacyTypography variant='title'>\n              {t('Grades_Tab_Rank')}\n            </LegacyTypography>\n            <LegacyTypography variant='body1' color='secondary'>\n              {t('Grades_Tab_Rank_Description')}\n            </LegacyTypography>\n\n            <Trailing>\n              <Stack\n                direction='horizontal'\n                gap={4}\n                vAlign='end'\n                hAlign='end'\n              >\n                <LegacyTypography variant='h3' inline color='text'>\n                  {serviceRank.value}\n                </LegacyTypography>\n                <LegacyTypography variant='body1' inline color='secondary'>\n                  /{serviceRank.outOf}\n                </LegacyTypography>\n              </Stack>\n            </Trailing>\n          </Item>\n        </LegacyList>\n      )}\n\n      <View style={{ height: 16 }} />\n\n      <Dynamic\n        animated\n        entering={PapillonAppearIn}\n        exiting={PapillonAppearOut}\n      >\n        <Stack gap={8}>\n          <Stack direction='horizontal' gap={8} vAlign='start' hAlign='center' style={{ opacity: 0.4 }} padding={[0, 0]}>\n            <Icon size={20}>\n              <Papicons name='star' />\n            </Icon>\n            <LegacyTypography variant='h6' color='text'>\n              {t('Grades_Tab_Latest')}\n            </LegacyTypography>\n          </Stack>\n\n          <LegendList\n            horizontal\n            data={sortedGrades.slice(0, 10)}\n            style={{ overflow: 'visible', height: 140 + 24, width: Dimensions.get('window').width - 20 }}\n            contentContainerStyle={{ gap: 12 }}\n            estimatedItemSize={210 + 12}\n            showsHorizontalScrollIndicator={false}\n            recycleItems={true}\n            keyExtractor={(item) => item.id}\n            renderItem={({ item: grade }) =>\n              <ErrorBoundary fallback={<View style={{ width: 140, height: 140 }} />}>\n                <CompactGrade\n                  key={grade.id + \"_compactGrade_header\"}\n                  emoji={getSubjectEmoji(getSubjectById(grade.subjectId)?.name || \"\")}\n                  title={getSubjectName(getSubjectById(grade.subjectId)?.name || \"\")}\n                  description={grade.description}\n                  score={grade.studentScore?.value || 0}\n                  outOf={grade.outOf?.value || 20}\n                  disabled={grade.studentScore?.disabled}\n                  status={grade.studentScore?.status}\n                  color={getSubjectColor(getSubjectById(grade.subjectId)?.name || \"\")}\n                  date={grade.givenAt}\n                  hasMaxScore={grade?.studentScore?.value === grade?.maxScore?.value && !grade?.studentScore?.disabled}\n                  onPress={() => {\n                    // @ts-expect-error navigation types\n                    navigation.navigate('(modals)/grade', {\n                      grade: grade,\n                      subjectInfo: {\n                        name: getSubjectName(getSubjectById(grade.subjectId)?.name || \"\"),\n                        color: getSubjectColor(getSubjectById(grade.subjectId)?.name || \"\"),\n                        emoji: getSubjectEmoji(getSubjectById(grade.subjectId)?.name || \"\"),\n                        originalName: getSubjectById(grade.subjectId)?.name || \"\"\n                      },\n                      avgInfluence: getAvgInfluence(grade),\n                      avgClass: getAvgClassInfluence(grade),\n                    })\n                  }}\n                />\n              </ErrorBoundary>\n            }\n          />\n        </Stack>\n      </Dynamic>\n\n      <ErrorBoundary>\n        <FeaturesMap features={features} />\n      </ErrorBoundary>\n\n      <Dynamic animated>\n        <Stack direction='horizontal' gap={8} vAlign='start' hAlign='center' style={{ opacity: 0.4 }} padding={[0, 0]}>\n          <Icon size={20}>\n            <Papicons name='grades' />\n          </Icon>\n          <LegacyTypography variant='h6' color='text'>\n            {t('Grades_Tab_Subjects')}\n          </LegacyTypography>\n        </Stack>\n      </Dynamic>\n    </View>\n  ) : null), [sortedGrades, searchText]);\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        /* @ts-expect-error colors\n        backgroundColor: colors.overground */\n      }}\n    >\n      {/* Header */}\n      <TabHeader\n        onHeightChanged={setHeaderHeight}\n        /* Nom de la période */\n        title={\n          <ActionMenu\n            onPressAction={({ nativeEvent }) => {\n              const actionId = nativeEvent.event;\n\n              if (actionId.startsWith(\"period:\")) {\n                const selectedPeriodId = actionId.replace(\"period:\", \"\");\n                const newPeriod = periods.find(period => period.id === selectedPeriodId);\n                setCurrentPeriod(newPeriod);\n                if (newPeriod?.id) {\n                  mutateSettings('personalization', { gradesPeriodId: newPeriod.id });\n                }\n              }\n            }}\n            actions={\n              periods.map((period) => ({\n                id: \"period:\" + period.id,\n                title: (getPeriodName(period.name || \"\") + \" \" + (isPeriodWithNumber(period.name || \"\") ? getPeriodNumber(period.name || \"0\") : \"\")).trim(),\n                subtitle: `${period.start.toLocaleDateString(i18n.language, {\n                  month: \"short\",\n                  year: \"numeric\",\n                })\n                  } - ${period.end.toLocaleDateString(i18n.language, {\n                    month: \"short\",\n                    year: \"numeric\",\n                  })\n                  } `,\n                state: currentPeriod?.id === period.id ? \"on\" : \"off\",\n                image: Platform.select({\n                  ios: (getPeriodNumber(period.name || \"0\")) + \".calendar\"\n                }),\n                imageColor: colors.text,\n              }))\n            }\n          >\n            <TabHeaderTitle\n              color={colors.primary}\n              leading={periods.length > 0 ? getPeriodName(currentPeriod?.name || '') : t(\"Tab_Grades\")}\n              number={isPeriodWithNumber(currentPeriod?.name || '') ? getPeriodNumber(currentPeriod?.name || '') : undefined}\n              loading={loading}\n              chevron={periods.length > 1}\n            />\n          </ActionMenu>\n        }\n        /* Filtres */\n        trailing={\n          <ChipButton\n            onPressAction={({ nativeEvent }) => {\n              const actionId = nativeEvent.event;\n              if (actionId.startsWith(\"sort:\")) {\n                const selectedSorting = actionId.replace(\"sort:\", \"\");\n                updateSortMethod(selectedSorting);\n              }\n            }}\n            actions={\n              sortings.map((s) => ({\n                id: \"sort:\" + s.value,\n                title: s.label,\n                state: sortMethod === s.value ? \"on\" : \"off\",\n                papicon: s.icon.papicon,\n                image: Platform.select({\n                  ios: s.icon.ios,\n                  android: s.icon.android,\n                }),\n                imageColor: colors.text,\n              }))\n            }\n            icon={sortings.find(s => s.value === sortMethod)?.icon.papicon || 'filter'} chevron\n          >\n            {sortings.find(s => s.value === sortMethod)?.label || t(\"Grades_Sort\")}\n          </ChipButton>\n        }\n        /* Recherche */\n        bottom={<Search placeholder={t('Grades_Search_Placeholder')} color='#2B7ED6' onTextChange={(text) => setSearchText(text)} />}\n        shouldCollapseHeader={shouldCollapseHeader}\n      />\n\n\n      <List\n      animated\n        contentContainerStyle={{ paddingHorizontal: 16, paddingTop: (headerHeight - (Platform.OS === \"ios\" ? insets.top : 0)) + 12, paddingBottom: Platform.OS === \"android\" ? 16 : bottomTabBarHeight + 16 }}\n\n        scrollEventThrottle={16}\n        scrollIndicatorInsets={{ top: headerHeight - insets.top }}\n\n        keyExtractor={(item: any) => item.id}\n        itemLayoutAnimation={LinearTransition.springify()}\n\n        refreshControl={\n          <RefreshControl\n            refreshing={isRefreshing}\n            onRefresh={handleRefresh}\n            progressViewOffset={headerHeight}\n          />\n        }\n\n        ListHeaderComponent={ListHeader}\n\n        ListFooterComponent={<Reanimated.View style={footerStyle} />}\n\n        ListEmptyComponent={loading ? undefined :\n          <Dynamic animated key={'empty-list:warn'} entering={PapillonAppearIn} exiting={PapillonAppearOut}>\n            <Stack\n              hAlign=\"center\"\n              vAlign=\"center\"\n              flex\n              style={{ width: \"100%\" }}\n            >\n              <Icon papicon opacity={0.5} size={32} style={{ marginBottom: 3 }}>\n                <Papicons name={\"Grades\"} />\n              </Icon>\n              <LegacyTypography variant=\"h4\" color=\"text\" align=\"center\">\n                {t('Grades_Empty_Title')}\n              </LegacyTypography>\n              <LegacyTypography variant=\"body2\" color=\"secondary\" align=\"center\">\n                {t('Grades_Empty_Description')}\n              </LegacyTypography>\n            </Stack>\n          </Dynamic>\n        }\n      >\n        {filteredSubjects.map((subject) => (\n          <SubjectItem\n            key={subject.id}\n            subject={subject}\n            grades={grades}\n            getAvgInfluence={getAvgInfluence}\n            getAvgClassInfluence={getAvgClassInfluence}\n          />\n        ))}\n      </List>\n    </View>\n  )\n};\n\nexport default GradesView;"
  },
  {
    "path": "app/(tabs)/grades/modals/AboutAverages.tsx",
    "content": "import Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport { useTheme } from \"@react-navigation/native\";\nimport React from \"react\";\nimport { ScrollView, Text, View, Image } from \"react-native\";\n\nexport default function AboutAverages() {\n  const theme = useTheme();\n\n  return (\n    <ScrollView\n      style={{ flex: 1 }}\n    >\n      <Image\n        source={require(\"@/assets/images/kb/averages.png\")}\n        style={{ width: \"100%\", height: 180 }}\n        tintColor={theme.colors.primary}\n      />\n\n      <Stack padding={20} gap={8}>\n        <Typography variant=\"h3\">\n          À propos des moyennes générales\n        </Typography>\n\n        <Typography variant=\"body1\" color=\"secondary\">\n          Bien que cela semble trivial, calculer une moyenne générale est un processus complexe, encore plus lorsque nous ne savons rien de ton établissement ainsi que de son processus de calcul.\n        </Typography>\n\n        <Typography variant=\"h4\" style={{ marginTop: 20 }}>\n          Comment Papillon calcule-t-il les moyennes générales ?\n        </Typography>\n\n        <Typography variant=\"body1\" color=\"secondary\">\n          Pour cela, il existe deux méthodes princpales : la moyenne des matières ainsi que la moyenne pondérée des notes.\n        </Typography>\n\n        <Typography variant=\"body1\" color=\"secondary\">\n          Papillon regroupe automatiquement vos notes en fonction de leur matière présumée et en calcule la moyenne en tenant compte des coefficients et autres paramètres. Ensuite, il peut ou non calculer la moyennes des matières entre-elles.\n        </Typography>\n\n        <Typography variant=\"h4\" style={{ marginTop: 20 }}>\n          Pourquoi peut-il se tromper ?\n        </Typography>\n\n        <Typography variant=\"body1\" color=\"secondary\">\n          Il ne s'agit que d'estimations, car nous manquons souvent du contexte nécessaire pour calculer une moyenne exacte. D'autant plus que certains services obfusquent parfois le fonctionnement de leur calcul.\n        </Typography>\n\n        <Typography variant=\"h4\" style={{ marginTop: 20 }}>\n          Comment savoir si c'est ma VRAIE moyenne ?\n        </Typography>\n\n        <Typography variant=\"body1\" color=\"secondary\">\n          Lorsque Papillon affiche qu'une moyenne est fournie par l'établissement, c'est qu'il n'y a aucune différence entre votre moyenne réelle et celle affichée. Cependant, si la mention \"estimée\" ou une date apparaît, il peut exister une différence de l'ordre de quelques demi-points.\n        </Typography>\n      </Stack>\n    </ScrollView>\n  );\n}\n"
  },
  {
    "path": "app/(tabs)/grades/modals/SubjectInfo.tsx",
    "content": "import ModalOverhead, { ModalOverHeadScore } from \"@/components/ModalOverhead\";\nimport Subject from \"@/database/models/Subject\";\nimport Stack from \"@/ui/components/Stack\";\nimport TableFlatList from \"@/ui/components/TableFlatList\";\nimport TypographyLegacy from \"@/ui/components/Typography\";\nimport { getSubjectColor } from \"@/utils/subjects/colors\";\nimport { getSubjectEmoji } from \"@/utils/subjects/emoji\";\nimport { getSubjectName } from \"@/utils/subjects/name\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport { useRoute, useTheme } from \"@react-navigation/native\";\nimport React from \"react\";\nimport { Platform, View } from \"react-native\";\nimport LinearGradient from \"react-native-linear-gradient\";\nimport { colorCheck } from '@/utils/colorCheck';\nimport adjust from \"@/utils/adjustColor\";\nimport i18n from \"@/utils/i18n\";\nimport List from \"@/ui/new/List\";\nimport Typography from \"@/ui/new/Typography\";\nimport Icon from \"@/ui/components/Icon\";\n\nconst SubjectInfo = () => {\n  const { params } = useRoute();\n  const theme = useTheme();\n  const colors = theme.colors;\n\n  const subject: Subject = params?.subject;\n  const subjectColor = getSubjectColor(subject?.name);\n  const subjectName = getSubjectName(subject?.name);\n  const subjectEmoji = getSubjectEmoji(subject?.name);\n\n  const outOf = subject.outOf.value;\n\n  const averagesData = [\n    {\n      title: i18n.t(\"SubjectInfo_ClassAverage_Label\"),\n      subtitle: i18n.t(\"SubjectInfo_ClassAverage_Description\"),\n      disabled: subject.classAverage.disabled,\n      value: subject.classAverage.value.toFixed(2),\n      status: subject.classAverage.status,\n      icon: \"GraduationHat\",\n    },\n    {\n      title: i18n.t(\"SubjectInfo_MaxAverage_Label\"),\n      subtitle: i18n.t(\"SubjectInfo_MaxAverage_Description\"),\n      disabled: subject.maximum.disabled,\n      value: subject.maximum.value.toFixed(2),\n      status: subject.maximum.status,\n      icon: \"ArrowRightUp\",\n    },\n    {\n      title: i18n.t(\"SubjectInfo_MinAverage_Label\"),\n      subtitle: i18n.t(\"SubjectInfo_MinAverage_Description\"),\n      disabled: subject.minimum.disabled,\n      value: subject.minimum.value.toFixed(2),\n      status: subject.minimum.status,\n      icon: \"Minus\",\n    }\n  ]\n\n  return (\n    <>\n      {Platform.OS !== 'android' && (\n        <LinearGradient\n          colors={[subjectColor, colors.background]}\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            height: 300,\n            width: \"100%\",\n            zIndex: -9,\n            opacity: 0.4\n          }}\n        />\n      )}\n\n      <List\n        contentInsetAdjustmentBehavior=\"automatic\"\n        engine='FlashList'\n\n        ListHeaderComponent={\n          <View style={{ marginBottom: 24, alignItems: 'center' }}>\n            <ModalOverhead\n              subject={subjectName}\n              color={Platform.OS === 'ios' ? subjectColor : colors.primary}\n              emoji={subjectEmoji}\n              overtitle={i18n.t(\"Grades_SubjectInfo_NbGrades\", { number: subject.grades.length })}\n              overhead={\n                <ModalOverHeadScore\n                  color={Platform.OS === 'ios' ? subjectColor : colors.primary}\n                  score={subject.studentAverage.disabled ? String(subject.studentAverage.status) : String(subject.studentAverage.value.toFixed(2))}\n                  outOf={outOf}\n                />\n              }\n              style={{\n                marginBottom: (!subject.studentAverage.disabled && subject.studentAverage.value === subject.maximum.value) ? 12 : 0\n              }}\n            />\n\n            {(!subject.studentAverage.disabled && subject.studentAverage.value === subject.maximum.value) && (\n              <Stack\n                direction=\"horizontal\"\n                gap={8}\n                backgroundColor={adjust(subjectColor, theme.dark ? 0.3 : -0.3)}\n                padding={[12, 6]}\n                radius={32}\n                hAlign=\"center\"\n                vAlign=\"center\"\n              >\n                <Papicons size={20} name=\"crown\" color={colorCheck(\"#FFFFFF\", [adjust(subjectColor, theme.dark ? 0.3 : -0.3)]) ? \"#FFFFFF\" : \"#000000\"} />\n                <TypographyLegacy color={colorCheck(\"#FFFFFF\", [adjust(subjectColor, theme.dark ? 0.3 : -0.3)]) ? \"#FFFFFF\" : \"#000000\"} variant='body2'>\n                  {i18n.t(\"SubjectInfo_MaxAverage_Description\")}\n                </TypographyLegacy>\n              </Stack>\n            )}\n          </View>\n        }\n\n        contentContainerStyle={{\n          padding: 16,\n        }}\n      >\n        <List.Section>\n          <List.SectionTitle>\n            <List.Label>\n              {i18n.t(\"SubjectInfo_Stats_Header\")}\n            </List.Label>\n          </List.SectionTitle>\n\n          {averagesData.map((average, index) => (\n            <List.Item>\n              <List.Leading>\n                <Icon>\n                  <Papicons name={average.icon} />\n                </Icon>\n              </List.Leading>\n\n              <Typography variant=\"title\">\n                {average.title}\n              </Typography>\n              <Typography variant=\"body1\" color=\"textSecondary\">\n                {average.subtitle}\n              </Typography>\n\n              <List.Trailing>\n                <Stack gap={2} direction=\"horizontal\" vAlign=\"center\" hAlign=\"end\">\n                  <TypographyLegacy variant=\"header\" weight=\"semibold\" inline>\n                    {average.disabled ? average.status : average.value}\n                  </TypographyLegacy>\n                  <TypographyLegacy variant=\"body2\" inline color=\"secondary\">\n                    /{outOf}\n                  </TypographyLegacy>\n                </Stack>\n              </List.Trailing>\n            </List.Item>\n          ))}\n        </List.Section>\n      </List>\n    </>\n  );\n};\n\nexport default SubjectInfo;\n"
  },
  {
    "path": "app/(tabs)/grades/utils/graph.ts",
    "content": "\nexport interface GraphPoint {\n  value: number;\n  date: Date;\n  originalValue?: number;\n  originalDate?: Date;\n}\n\nexport interface AverageHistoryItem {\n  average: number;\n  date: Date | string;\n}\n\nexport const calculateAmplifiedGraphPoints = (\n  currentAverageHistory: AverageHistoryItem[],\n  scale: number\n): GraphPoint[] => {\n  if (!currentAverageHistory) { return []; }\n\n  const points = currentAverageHistory\n    .filter(item => !isNaN(item.average) && item.average !== null && item.average !== undefined)\n    .map(item => ({\n      value: item.average,\n      date: new Date(item.date),\n      originalValue: item.average,\n      originalDate: new Date(item.date)\n    }));\n\n  if (points.length === 0) return [];\n\n  const values = points.map(p => p.value);\n  const dataMin = Math.min(...values);\n  const dataMax = Math.max(...values);\n  const dataRange = dataMax - dataMin;\n\n  const recentCount = Math.max(5, Math.floor(points.length * 0.5));\n  const recentPoints = points.slice(-recentCount);\n  const recentValues = recentPoints.map(p => p.value);\n  const recentMin = Math.min(...recentValues);\n  const recentMax = Math.max(...recentValues);\n  const recentRange = recentMax - recentMin;\n  const recentMean = recentValues.reduce((a, b) => a + b, 0) / recentValues.length;\n\n  const recentScaleUsage = (recentRange / scale) * 100;\n  const globalScaleUsage = (dataRange / scale) * 100;\n\n  const OUTLIER_THRESHOLD = 3;\n  const compressedPoints = points.map(p => {\n    const distanceFromRecent = Math.abs(p.value - recentMean);\n\n    if (distanceFromRecent > OUTLIER_THRESHOLD) {\n      const direction = p.value < recentMean ? -1 : 1;\n      const excessDistance = distanceFromRecent - OUTLIER_THRESHOLD;\n      const compressionFactor = 0.3;\n      const compressedDistance = OUTLIER_THRESHOLD + (excessDistance * compressionFactor);\n\n      return {\n        ...p,\n        value: recentMean + (direction * compressedDistance)\n      };\n    }\n    return p;\n  });\n\n  const peakAmplifiedPoints = compressedPoints.map((p, i) => {\n    const windowSize = 2;\n    const start = Math.max(0, i - windowSize);\n    const end = Math.min(compressedPoints.length - 1, i + windowSize);\n\n    const neighbors = compressedPoints\n      .slice(start, end + 1)\n      .filter((_, idx) => start + idx !== i);\n\n    if (neighbors.length === 0) return p;\n\n    const neighborAvg = neighbors.reduce((sum, n) => sum + n.value, 0) / neighbors.length;\n    const localDeviation = p.value - neighborAvg;\n\n    const MIN_DEVIATION = 0.2;\n    if (Math.abs(localDeviation) > MIN_DEVIATION) {\n      const peakAmplification = 3.5;\n      return {\n        ...p,\n        value: neighborAvg + (localDeviation * peakAmplification)\n      };\n    }\n    return p;\n  });\n\n  const shouldAmplify = (globalScaleUsage < 30 || recentScaleUsage < 20) && dataRange > 0;\n  let finalPoints = peakAmplifiedPoints;\n\n  if (shouldAmplify) {\n    const currentValues = peakAmplifiedPoints.map(p => p.value);\n    const currentMin = Math.min(...currentValues);\n    const currentMax = Math.max(...currentValues);\n\n    const targetSpread = scale * 0.4;\n    const currentSpread = currentMax - currentMin;\n\n    if (currentSpread < targetSpread && currentSpread > 0) {\n      const amplificationFactor = Math.min(4, targetSpread / currentSpread);\n\n      finalPoints = peakAmplifiedPoints.map(p => ({\n        ...p,\n        value: recentMean + (p.value - recentMean) * amplificationFactor\n      }));\n    }\n  }\n\n  const firstDate = points[0].date.getTime();\n  const DAY_MS = 86400000;\n  const COMPRESSED_SPACING = DAY_MS * 0.50;\n\n  return finalPoints.map((p, index) => ({\n    ...p,\n    value: Math.round(p.value * 100) / 100,\n    date: new Date(firstDate + (index * COMPRESSED_SPACING))\n  }));\n};\n"
  },
  {
    "path": "app/(tabs)/index/_layout.tsx",
    "content": "import { Stack } from \"expo-router\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\n\nexport default function Layout() {\n  const { t } = useTranslation();\n\n  return (\n    <Stack screenOptions={screenOptions}>\n      <Stack.Screen\n        name=\"index\"\n        options={{\n          headerShown: false,\n          headerTitle: t(\"Tab_Home\"),\n          headerLargeTitle: false,\n          headerTransparent: true,\n        }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(tabs)/index/atoms/HomeHeader.tsx",
    "content": "import { LiquidGlassContainer } from '@sbaiahmed1/react-native-blur';\nimport { router } from 'expo-router';\nimport * as WebBrowser from \"expo-web-browser\";\nimport React, { useEffect, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Platform, Pressable, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport packageJson from '@/package.json';\nimport Icon from '@/ui/components/Icon';\nimport Stack from '@/ui/components/Stack';\nimport Typography from '@/ui/components/Typography';\nimport { useSettingsStore } from '@/stores/settings';\nimport { getCurrentPeriod } from '@/utils/grades/helper/period';\nimport { Papicons } from '@getpapillon/papicons';\n\nimport HomeHeaderButton, { HomeHeaderButtonItem } from '../components/HomeHeaderButton';\nimport { useHomeHeaderData } from '../hooks/useHomeHeaderData';\nimport WrappedBanner from './WrappedBanner';\nimport { useTheme } from '@react-navigation/native';\nimport AnimatedPressable from '@/ui/components/AnimatedPressable';\nimport { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';\nimport { ListTouchable } from '@/ui/new/List';\n\nconst HomeHeader = () => {\n  const { t } = useTranslation();\n  const insets = useSafeAreaInsets();\n  const theme = useTheme();\n  const { colors } = theme;\n  const { availableCanteenCards, attendancesPeriods, attendances, absencesCount, chats } = useHomeHeaderData();\n  const settingsStore = useSettingsStore(state => state.personalization);\n  const mutateProperty = useSettingsStore(state => state.mutateProperty);\n  const currentVersion = packageJson.version;\n  const releaseNotesUrl = `https://papillon.bzh/release-notes/${currentVersion}`;\n\n  useEffect(() => {\n    const installedVersion = settingsStore.installedVersion;\n    if (!installedVersion) {\n      mutateProperty(\"personalization\", {\n        installedVersion: currentVersion,\n        releaseNotesSeenForVersion: currentVersion,\n      });\n      return;\n    }\n    if (installedVersion !== currentVersion) {\n      mutateProperty(\"personalization\", { installedVersion: currentVersion });\n    }\n  }, [currentVersion, mutateProperty, settingsStore.installedVersion]);\n\n  const showReleaseNotesBanner = settingsStore.releaseNotesSeenForVersion !== currentVersion;\n\n  const HomeHeaderButtons: HomeHeaderButtonItem[] = useMemo(() => [\n    {\n      title: t(\"Home_Cards_Button_Title\"),\n      icon: \"card\",\n      color: \"#EE9F00\",\n      description: availableCanteenCards.length > 0 ?\n        (availableCanteenCards.length > 1 ? t(\"Home_Cards_Button_Description_Number\", { number: availableCanteenCards.length }) :\n          t(\"Home_Cards_Button_Description_Singular\")) : t(\"Home_Cards_Button_Description_None\"),\n      onPress: () => {\n        router.push(\"/(features)/(cards)/cards\");\n      }\n    },\n    {\n      title: t(\"Home_Menu_Button_Title\"),\n      icon: \"cutlery\",\n      color: \"#7ED62B\",\n      description: t(\"Home_Menu_Button_Description\"),\n      onPress: () => {\n        router.push(\"/(features)/soon\");\n      }\n    },\n    {\n      title: t(\"Home_Attendance_Title\"),\n      icon: \"chair\",\n      color: \"#D62B94\",\n      description: absencesCount > 0 ?\n        (absencesCount > 1 ? t(\"Home_Attendance_Button_Description_Number\", { number: absencesCount }) : t(\"Home_Attendance_Button_Description_Singular\"))\n        : t(\"Home_Attendance_Button_Description_None\"),\n      onPress: () => {\n        router.push({\n          pathname: \"/(features)/attendance\",\n          params: {\n            periods: JSON.stringify(attendancesPeriods),\n            currentPeriod: JSON.stringify(getCurrentPeriod(attendancesPeriods)),\n            attendances: JSON.stringify(attendances),\n          },\n        });\n      }\n    },\n    {\n      title: t(\"Home_Chats_Button_Title\"),\n      icon: \"textbubble\",\n      color: \"#2B7ED6\",\n      description: chats.length > 0 ?\n        (chats.length > 1 ? t(\"Home_Chats_Button_Description_Number\", { number: chats.length }) : t(\"Home_Chats_Button_Description_Singular\"))\n        : t(\"Home_Chats_Button_Description_None\"),\n      onPress: () => {\n        router.push(\"/(features)/soon\");\n      }\n    }\n  ], [availableCanteenCards, absencesCount, chats, attendancesPeriods, attendances, t]);\n\n  return (\n    <View style={{ paddingHorizontal: 0, width: \"100%\", flex: 1 }}>\n      <View style={{ height: insets.top + 56 }} />\n      <LiquidGlassContainer>\n        <Stack inline flex width={\"100%\"}>\n          <View style={{ width: '100%', gap: 6 }}>\n            {Array.from({ length: Math.ceil(HomeHeaderButtons.length / 2) }).map((_, i) => (\n\n              <View key={i} style={{ flexDirection: 'row', gap: 6, width: '100%' }}>\n                {HomeHeaderButtons.slice(i * 2, i * 2 + 2).map((item) => (\n                  <HomeHeaderButton key={item.title} item={item} />\n                ))}\n                {HomeHeaderButtons.slice(i * 2, i * 2 + 2).length === 1 && <View style={{ flex: 1 }} />}\n              </View>\n            ))}\n          </View>\n        </Stack>\n      </LiquidGlassContainer>\n\n      {showReleaseNotesBanner && (\n\n        <Stack card style={{ marginTop: 12, elevation: 2, backgroundColor: (!theme.dark && Platform.OS === 'android') ? '#FFF' : theme.colors.item, overflow: Platform.OS === 'android' ? 'hidden' : 'visible' }} padding={0}>\n          <ListTouchable\n            onPress={() =>\n              WebBrowser.openBrowserAsync(releaseNotesUrl, {\n                presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET,\n              })\n            }>\n            <Stack padding={[12, 10]} gap={8} direction='horizontal'>\n              <Papicons name=\"sparkles\" size={24} color={colors.tint} />\n\n              <Stack inline flex style={{ marginRight: 32 }}>\n                <Typography variant='title'>\n                  {t(\"Home_Release_Notes_Banner\", { version: currentVersion })}\n                </Typography>\n                <Typography variant='body1' color=\"secondary\">\n                  {t(\"Home_Release_Notes_Banner_Description\")}\n                </Typography>\n              </Stack>\n\n              <ListTouchable\n                hitSlop={10}\n                onPress={(event) => {\n                  event.stopPropagation();\n                  mutateProperty(\"personalization\", { releaseNotesSeenForVersion: currentVersion });\n                }}\n              >\n                <View \n                style={{ width: 24, height: 24, borderRadius: 12, alignItems: \"center\", justifyContent: \"center\", backgroundColor: colors.text + '11', position: \"absolute\", top: 10, right: 12 }}>\n                <Icon size={16}>\n                <Papicons name=\"Cross\" />\n                </Icon>\n                </View>\n              </ListTouchable>\n            </Stack>\n          </ListTouchable>\n        </Stack>\n      )}\n\n      {__DEV__ && 1 === 2 && (\n        <WrappedBanner />\n      )}\n    </View>\n  );\n};\n\nexport default HomeHeader;\n"
  },
  {
    "path": "app/(tabs)/index/atoms/HomeTopBar.tsx",
    "content": "import { ProgressiveBlurView } from '@sbaiahmed1/react-native-blur';\nimport { useRouter } from 'expo-router';\nimport React from 'react';\nimport { Platform, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport Stack from '@/ui/components/Stack';\n\nimport HomeTopBarButton from '../components/HomeTopBarButton';\nimport UserProfile from './UserProfile';\n\nconst HomeTopBar = ({ height = 56 }: { height?: number }) => {\n  const insets = useSafeAreaInsets();\n  const router = useRouter();\n\n  return (\n    <>\n      {Platform.OS === 'ios' && (\n        <View\n          style={{\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            right: 0,\n            height: height + insets.top,\n            zIndex: 10,\n            overflow: \"hidden\"\n          }}\n        >\n          <ProgressiveBlurView\n            blurAmount={10}\n            blurType=\"systemMaterial\"\n            direction=\"blurredTopClearBottom\"\n            startOffset={0}\n            reducedTransparencyFallbackColor=\"#00000000\"\n            style={{ width: \"100%\", height: \"101%\" }}\n          />\n        </View>\n      )}\n\n      <View\n        style={{\n          height: height,\n          position: 'absolute',\n          top: insets.top,\n          left: 0,\n          right: 0,\n          paddingHorizontal: 16,\n          zIndex: 11,\n          alignItems: 'center',\n          flexDirection: 'row',\n          gap: 16,\n        }}\n      >\n        <UserProfile />\n\n        <Stack direction=\"horizontal\" hAlign=\"center\" vAlign=\"end\" gap={7} inline>\n          <HomeTopBarButton icon=\"palette\" onPress={() => router.push(\"/(modals)/wallpaper\")} />\n          <HomeTopBarButton icon=\"gears\" onPress={() => router.push(\"/(settings)/settings\")} />\n        </Stack>\n      </View>\n    </>\n  );\n};\n\nexport default HomeTopBar;"
  },
  {
    "path": "app/(tabs)/index/atoms/UserProfile.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport { MenuView } from '@react-native-menu/menu';\nimport { useTheme } from '@react-navigation/native';\nimport { LiquidGlassView } from '@sbaiahmed1/react-native-blur';\nimport { useRouter } from 'expo-router';\nimport React from 'react';\nimport { Dimensions, Platform, StyleSheet } from 'react-native';\nimport { Pressable } from 'react-native';\n\nimport { initializeAccountManager } from '@/services/shared';\nimport { useAccountStore } from '@/stores/account';\nimport Avatar from '@/ui/components/Avatar';\nimport Stack from '@/ui/components/Stack';\nimport Typography from '@/ui/components/Typography';\nimport { runsIOS26 } from '@/ui/utils/IsLiquidGlass';\n\nimport { useUserProfileData } from '../hooks/useUserProfileData';\nimport { t } from 'i18next';\nimport { formatSchoolName } from '@/utils/format/formatSchoolName';\nimport ActionMenu from '@/ui/components/ActionMenu';\n\nconst UserProfile = ({ subtitle, onPress }: { subtitle?: string, onPress?: () => void }) => {\n  const router = useRouter();\n  const { firstName, lastName, initials, profilePicture, level, establishment } = useUserProfileData() ?? {};\n  const accounts = useAccountStore((state) => state.accounts);\n  const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);\n  const theme = useTheme();\n\n  const AccountsMenuItems = (accounts && accounts.length > 0) && accounts.map((account) => ({\n    id: account.id,\n    title: account.firstName + ' ' + account.lastName,\n    subtitle: formatSchoolName(account.schoolName ?? \"\"),\n    state: account.id === lastUsedAccount ? 'on' : 'off',\n  })) || [];\n\n  return (\n    <Stack inline flex>\n      <Stack\n        direction=\"horizontal\"\n        hAlign=\"center\"\n        gap={10}\n      >\n        <Pressable onPress={() => router.push('/(modals)/profile')}>\n          <UserProfileItemContainer\n            glassType=\"clear\"\n            isInteractive={true}\n            glassTintColor=\"transparent\"\n            glassOpacity={0}\n            style={{\n              borderRadius: 300,\n              zIndex: 999999,\n            }}\n          >\n            <Avatar\n              size={40}\n              initials={initials}\n              imageUrl={profilePicture}\n            />\n          </UserProfileItemContainer>\n        </Pressable>\n\n        <UserProfileItemContainer>\n          <ActionMenu\n            onPressAction={async ({ nativeEvent }) => {\n              if (nativeEvent.event === \"edit\") {\n                router.push('/(modals)/profile');\n                return;\n              }\n\n              if (nativeEvent.event === \"add\") {\n                router.push(\"/(onboarding)/ageSelection?action=addService\");\n                return;\n              }\n\n              const store = useAccountStore.getState();\n              store.setLastUsedAccount(nativeEvent.event);\n              await initializeAccountManager();\n            }}\n            actions={[\n              ...Platform.OS === \"ios\" ? [{\n                id: 'workspaces',\n                title: '',\n                displayInline: true,\n                subactions: AccountsMenuItems,\n              }] : AccountsMenuItems,\n              {\n                id: 'edit',\n                title: t('Home_Edit_Profile'),\n                image: 'person.crop.circle',\n                papicon: 'user',\n                imageColor: theme.colors.text,\n              },\n              {\n                id: 'add',\n                title: t('Home_Add_Profile'),\n                image: 'plus',\n                papicon: 'add',\n                imageColor: theme.colors.text,\n              },\n            ]}\n          >\n            <Stack direction=\"vertical\" vAlign=\"center\" gap={0} style={{ height: 42, paddingHorizontal: 12 }}>\n              <Stack direction=\"horizontal\" hAlign=\"center\" gap={6}>\n                <Typography nowrap color='white' variant='navigation' weight='bold' style={{ maxWidth: Dimensions.get('window').width - 230 }}>\n                  {firstName && lastName ? `${firstName} ${lastName}` : \"Mon compte\"}\n                </Typography>\n                <Papicons name=\"chevrondown\" size={20} color=\"white\" opacity={0.5} style={{ marginRight: 0 }} />\n              </Stack>\n              {subtitle &&\n                <Typography nowrap color='white' variant='body1' style={{ opacity: 0.7 }}>\n                  {subtitle}\n                </Typography>\n              }\n            </Stack>\n          </ActionMenu>\n        </UserProfileItemContainer>\n      </Stack>\n    </Stack>\n  );\n};\n\nconst UserProfileItemContainer = ({ children }: { children: React.ReactNode }) => {\n  if (runsIOS26) {\n    return (\n      <LiquidGlassView\n        glassType=\"clear\"\n        isInteractive={true}\n        glassTintColor=\"transparent\"\n        glassOpacity={0}\n        style={{\n          borderRadius: 300,\n          zIndex: 999999,\n        }}\n      >\n        {children}\n      </LiquidGlassView>\n    );\n  }\n\n\n  return (\n    <Stack style={{ marginRight: -8 }}>\n      {children}\n    </Stack>\n  )\n\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 0,\n    },\n    shadowOpacity: 0.3,\n    shadowRadius: 2,\n  }\n});\n\nexport default UserProfile;"
  },
  {
    "path": "app/(tabs)/index/atoms/Wallpaper.tsx",
    "content": "import MaskedView from '@react-native-masked-view/masked-view';\nimport { File, Paths } from 'expo-file-system';\nimport React, { useEffect, useState } from 'react';\nimport { Image, StyleSheet } from 'react-native';\nimport LinearGradient from 'react-native-linear-gradient';\n\nimport { useSettingsStore } from '@/stores/settings';\n\nconst Wallpaper = ({ height = 400, dim = true }) => {\n  try {\n    const settingsStore = useSettingsStore(state => state.personalization);\n    const currentWallpaper = settingsStore.wallpaper;\n\n    const [image, setImage] = useState<string | null>(null);\n\n    useEffect(() => {\n      if (currentWallpaper?.path?.name) {\n        const file = new File(Paths.document, currentWallpaper.path.directory || '', currentWallpaper.path.name);\n        if (file.exists) {\n          setImage(file.uri);\n        } else {\n          setImage(null);\n        }\n      }\n      else {\n        setImage(null);\n      }\n    }, [currentWallpaper]);\n\n    return (\n      <MaskedView\n        style={[styles.container, { height }]}\n        maskElement={\n          <LinearGradient\n            colors={['rgba(0, 0, 0, 1)', 'rgba(0, 0, 0, 0)']}\n            locations={[0.5, 1]}\n            style={{ width: '100%', height }}\n          />\n        }\n      >\n        <Image\n          source={image ? { uri: image } : require('@/assets/images/wallpapers/clouds.jpg')}\n          style={[styles.image, { height }]}\n        />\n\n        {dim &&\n          <LinearGradient\n            colors={['rgba(0, 0, 0, 0.7)', 'rgba(0, 0, 0, 0)']}\n            locations={[0, 1]}\n            style={[styles.dimGradient, { height: height / 2 }]}\n          />\n        }\n      </MaskedView>\n    );\n  } catch (error) {\n    console.log(error);\n    return null;\n  }\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    width: '100%',\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    zIndex: -9\n  },\n  image: {\n    width: '100%',\n    position: 'absolute',\n    top: 0,\n    left: 0\n  },\n  dimGradient: {\n    width: '100%',\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    zIndex: 1\n  }\n});\n\nexport default Wallpaper;"
  },
  {
    "path": "app/(tabs)/index/atoms/WrappedBanner.tsx",
    "content": "import { useFocusEffect } from \"@react-navigation/native\";\nimport { useEvent } from \"expo\";\nimport { useNavigation } from 'expo-router';\nimport { useVideoPlayer, VideoSource, VideoView } from 'expo-video';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Image, View } from 'react-native';\n\nimport AnimatedPressable from '@/ui/components/AnimatedPressable';\n\n// Import assets\nconst videoAssetId = require('@/assets/video/wrapped.mp4');\nconst overlayImage = require('@/assets/images/monYearbook.png');\nconst placeholderImage = require('@/assets/images/wrapped-static.png');\n\nconst videoSource: VideoSource = {\n  assetId: videoAssetId\n};\n\n// Dimensions for the banner view (adjust as needed)\nconst BANNER_HEIGHT = 130; // Use a fixed height for better layout stability\n\nconst WrappedBanner = () => {\n  const navigation = useNavigation();\n  // Using a ref to hold the player ensures it doesn't get re-created on every render\n  const playerRef = useRef(useVideoPlayer(videoSource, player => {\n    player.loop = true;\n    player.muted = true;\n    player.showNowPlayingNotification = false;\n    player.audioMixingMode = \"mixWithOthers\";\n  }));\n  const player = playerRef.current;\n\n  // State to track if the component is in focus\n  const [isFocused, setIsFocused] = useState(false);\n  // State to track if the video is currently loading/buffering\n  const [isLoading, setIsLoading] = useState(true);\n\n  // Set the initial player state to loading\n  useEvent(player, 'loadStart', () => setIsLoading(true));\n  useEvent(player, 'loadedMetadata', () => setIsLoading(false));\n\n  // --- Video Playback Control on Focus/Blur ---\n  useFocusEffect(\n    useCallback(() => {\n      // Screen is focused (visible)\n      setIsFocused(true);\n      // Play the video when the screen becomes focused\n      player.play();\n\n      return () => {\n        // Screen is blurred (no longer visible)\n        setIsFocused(false);\n        // Pause the video to save resources\n        try {\n          player.pause();\n        } catch (e) {\n          // Ignore error if native player object is not found\n        }\n        // For *extreme* optimization on Android/iOS, you might consider:\n        // player.replace(null); // This unloads the video resource completely\n        // If you unload, you need to call player.replace(videoSource) on focus\n      };\n    }, [player])\n  );\n\n  // Fallback to ensure play state\n  const { isPlaying } = useEvent(player, 'playingChange', { isPlaying: player.playing });\n  useEffect(() => {\n    if (isFocused && !isPlaying) {\n      // Only attempt to play if the component is focused\n      player.play();\n    }\n  }, [isFocused, isPlaying, player]);\n  // --- End Video Control ---\n\n  // Conditional Video Rendering: Only render VideoView if focused\n  const shouldRenderVideo = isFocused && !isLoading;\n\n  return (\n    <AnimatedPressable\n      onPress={() => navigation.navigate('(modals)/wrapped')}\n      style={{ marginTop: 12 }}\n    >\n      <View\n        style={{\n          height: BANNER_HEIGHT,\n          alignItems: 'center',\n          justifyContent: 'center',\n          borderRadius: 20,\n          shadowColor: '#000000',\n          shadowOffset: { width: 0, height: 1 },\n          shadowOpacity: 0.2,\n          shadowRadius: 4,\n          elevation: 2,\n          backgroundColor: '#000',\n        }}\n      >\n        {shouldRenderVideo && (\n          <VideoView\n            player={player}\n            style={{\n              width: '100%',\n              height: '100%',\n              borderRadius: 20,\n              position: 'absolute',\n              top: 0,\n              left: 0,\n              right: 0,\n              bottom: 0,\n              zIndex: 0,\n            }}\n            contentFit=\"cover\"\n            nativeControls={false}\n          />\n        )}\n\n        <Image\n          source={overlayImage}\n          style={{\n            height: 120,\n            width: 180,\n            zIndex: 2,\n          }}\n          resizeMode=\"contain\"\n        />\n\n        <Image\n          source={placeholderImage}\n          style={{\n            height: \"100%\",\n            width: \"100%\",\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            borderRadius: 20,\n            zIndex: -1,\n          }}\n          resizeMode=\"cover\"\n        />\n\n        <View style={{\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n          borderRadius: 20,\n          borderColor: '#00000030',\n          borderWidth: 1,\n          zIndex: 2,\n          pointerEvents: 'none',\n        }} />\n      </View>\n    </AnimatedPressable>\n  );\n};\n\nexport default WrappedBanner;"
  },
  {
    "path": "app/(tabs)/index/components/HomeHeaderButton.ios.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport { useTheme } from '@react-navigation/native';\nimport { LiquidGlassView } from '@sbaiahmed1/react-native-blur';\nimport React from 'react';\nimport { Pressable, StyleSheet, View } from 'react-native';\n\nimport Typography from '@/ui/components/Typography';\n\nexport interface HomeHeaderButtonItem {\n  title: string;\n  icon: string;\n  color: string;\n  description: string;\n  onPress?: () => void;\n}\n\ninterface HomeHeaderButtonProps {\n  item: HomeHeaderButtonItem;\n}\n\nconst HomeHeaderButton: React.FC<HomeHeaderButtonProps> = ({ item }) => {\n  const { colors } = useTheme();\n\n  return (\n    <LiquidGlassView\n      glassOpacity={0.9}\n      glassTintColor={colors.card}\n      glassType='regular'\n      isInteractive={true}\n      style={{\n        flex: 1,\n        borderRadius: 22\n      }}\n    >\n      <Pressable\n        style={styles.headerBtn}\n        onPress={item.onPress}\n      >\n        <View\n          style={{\n            backgroundColor: item.color + 30,\n            borderRadius: 50,\n            padding: 7\n          }}\n        >\n          <Papicons name={item.icon} color={item.color} size={25} />\n        </View>\n        <View style={{\n          flex: 1,\n          overflow: 'hidden'\n        }}>\n          <Typography nowrap variant=\"h6\" color={colors.text + 95} style={{ lineHeight: 0 }}>{item.title}</Typography>\n          <Typography nowrap variant=\"title\" color={colors.text + 60} style={{ lineHeight: 0 }}>{item.description}</Typography>\n        </View>\n      </Pressable>\n    </LiquidGlassView >\n  );\n};\n\nconst styles = StyleSheet.create({\n  headerBtn: {\n    flex: 1,\n    width: \"100%\",\n    flexDirection: \"row\",\n    borderCurve: \"circular\",\n    borderRadius: 20,\n    padding: 10,\n    gap: 8\n  }\n});\n\nexport default HomeHeaderButton;\n"
  },
  {
    "path": "app/(tabs)/index/components/HomeHeaderButton.tsx",
    "content": "import React from 'react';\nimport { Pressable, StyleSheet, View } from 'react-native';\nimport { LiquidGlassView } from '@sbaiahmed1/react-native-blur';\nimport { Papicons } from '@getpapillon/papicons';\nimport Typography from '@/ui/new/Typography';\nimport { useTheme } from '@react-navigation/native';\nimport AnimatedPressable from '@/ui/components/AnimatedPressable';\nimport Stack from '@/ui/components/Stack';\nimport { TouchableNativeFeedback } from 'react-native';\n\nexport interface HomeHeaderButtonItem {\n  title: string;\n  icon: string;\n  color: string;\n  description: string;\n  onPress?: () => void;\n}\n\ninterface HomeHeaderButtonProps {\n  item: HomeHeaderButtonItem;\n}\n\nconst HomeHeaderButton: React.FC<HomeHeaderButtonProps> = ({ item }) => {\n  const { colors } = useTheme();\n\n  return (\n    <View\n      style={{\n        flex: 1,\n      }}\n    >\n    <TouchableNativeFeedback\n      useForeground\n      style={styles.headerBtn}\n      onPress={item.onPress}\n    >\n      <View\n        style={{\n          flex: 1,\n          flexDirection: 'row',\n          alignItems: 'center',\n          gap: 12,\n          paddingHorizontal: 10,\n          paddingVertical: 13,\n          borderRadius: 22,\n          backgroundColor: colors.item,\n          elevation: 4,\n          overflow: 'hidden',\n        }}\n      >\n        <View\n          style={{\n            borderRadius: 50,\n            padding: 0,\n            paddingLeft: 4,\n          }}\n        >\n          <Papicons name={item.icon} color={item.color} size={32} />\n        </View>\n        <View style={{\n          flex: 1,\n          overflow: 'hidden'\n        }}>\n          <Typography nowrap inline variant=\"title\">{item.title}</Typography>\n          <Typography nowrap inline variant=\"body1\" color='textSecondary'>{item.description}</Typography>\n        </View>\n      </View>\n    </TouchableNativeFeedback>\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  headerBtn: {\n    flex: 1,\n    width: \"100%\",\n    flexDirection: \"row\",\n  }\n});\n\nexport default HomeHeaderButton;\n"
  },
  {
    "path": "app/(tabs)/index/components/HomeTopBarButton.ios.tsx",
    "content": "import React from 'react';\nimport { Pressable, View } from 'react-native';\nimport { LiquidGlassView } from '@sbaiahmed1/react-native-blur';\nimport Icon from '@/ui/components/Icon';\nimport { Papicons } from '@getpapillon/papicons';\n\ninterface HomeTopBarButtonProps {\n  icon: string;\n  onPress?: () => void;\n}\n\nconst HomeTopBarButton: React.FC<HomeTopBarButtonProps> = ({ icon, onPress }) => {\n  return (\n    <LiquidGlassView\n      glassType=\"clear\"\n      isInteractive={true}\n      glassOpacity={0}\n      style={{\n        width: 42,\n        height: 42,\n        borderRadius: 30,\n      }}\n    >\n      <Pressable\n        onPressIn={onPress}\n        style={{\n          width: '100%',\n          height: '100%',\n          alignItems: 'center',\n          justifyContent: 'center',\n        }}\n      >\n        <Icon size={26} fill='white'>\n          <Papicons name={icon} />\n        </Icon>\n      </Pressable>\n    </LiquidGlassView>\n  );\n};\n\nexport default HomeTopBarButton;\n"
  },
  {
    "path": "app/(tabs)/index/components/HomeTopBarButton.tsx",
    "content": "import React from 'react';\nimport { Pressable, TouchableNativeFeedback, View } from 'react-native';\nimport { LiquidGlassView } from '@sbaiahmed1/react-native-blur';\nimport Icon from '@/ui/components/Icon';\nimport { Papicons } from '@getpapillon/papicons';\nimport AnimatedPressable from '@/ui/components/AnimatedPressable';\nimport Stack from '@/ui/components/Stack';\n\ninterface HomeTopBarButtonProps {\n  icon: string;\n  onPress?: () => void;\n}\n\nconst HomeTopBarButton: React.FC<HomeTopBarButtonProps> = ({ icon, onPress }) => {\n  return (\n    <TouchableNativeFeedback\n      useForeground\n      onPress={onPress}\n    >\n      <View\n        style={{\n          width: 42,\n          height: 42,\n          borderRadius: 30,\n          alignItems: 'center',\n          justifyContent: 'center',\n          backgroundColor: '#FFFFFF28',\n          overflow: 'hidden',\n        }}\n      >\n        <Icon size={26} fill='white'>\n          <Papicons name={icon} />\n        </Icon>\n      </View>\n    </TouchableNativeFeedback>\n  );\n};\n\nexport default HomeTopBarButton;\n"
  },
  {
    "path": "app/(tabs)/index/components/HomeWidget.tsx",
    "content": "import React from 'react';\nimport Stack from '@/ui/components/Stack';\nimport Icon from '@/ui/components/Icon';\nimport { t } from 'i18next';\nimport Typography from '@/ui/components/Typography';\nimport AnimatedPressable from '@/ui/components/AnimatedPressable';\nimport { Papicons } from '@getpapillon/papicons';\nimport { useRouter } from 'expo-router';\nimport { useTheme } from '@react-navigation/native';\nimport { Platform } from 'react-native';\nimport { ErrorBoundary } from '@/ui/components/ErrorBoundary';\nimport { ListTouchable } from '@/ui/new/List';\n\nexport interface HomeWidgetItem {\n  icon: React.ReactNode;\n  title: string;\n  redirect?: string;\n  onPress?: () => void;\n  buttonLabel?: string;\n  render?: () => React.ReactNode;\n  dev?: boolean;\n  hidden?: boolean;\n}\n\ninterface HomeWidgetProps {\n  item: HomeWidgetItem;\n}\n\nconst HomeWidgetContent: React.FC<HomeWidgetProps> = ({ item }) => {\n  const router = useRouter();\n  const theme = useTheme();\n\n  if (!item || (item.dev && !__DEV__)) {\n    return null;\n  }\n\n  return (\n    <Stack\n      card\n      radius={25}\n      gap={0}\n      style={{ elevation: 2, display: item.hidden ? 'none' : 'flex' }}\n      backgroundColor={Platform.OS === 'ios' ? theme.colors.card : theme.dark ? theme.colors.card : '#fff'}\n    >\n      <Stack direction=\"horizontal\" vAlign=\"center\" hAlign=\"center\" padding={[10, 10]} gap={10} style={{ marginTop: -1 }}>\n        <Icon papicon opacity={0.6} style={{ marginLeft: 4 }}>\n          {item.icon}\n        </Icon>\n        <Typography nowrap style={{ flex: 1, opacity: 0.6 }} variant=\"title\" color=\"text\">\n          {item.title}\n        </Typography>\n        {(item.redirect || item.onPress) && (\n          <Stack bordered={Platform.OS === 'ios'} backgroundColor={Platform.OS === 'ios' ? theme.colors.card : theme.colors.text + \"11\"} radius={20} style={{overflow: Platform.OS === 'android' ? 'hidden' : 'visible'}}>\n            <ListTouchable \n              onPress={() => item.onPress ? item.onPress() : router.navigate(item.redirect as any)}\n            >\n              <Stack direction=\"horizontal\" hAlign=\"center\" padding={[12, 6]} gap={6}>\n                <Typography variant=\"body2\" color=\"secondary\" inline>\n                  {t('Home_Display_More',)}\n                </Typography>\n                <Icon size={20} papicon opacity={0.5}>\n                  <Papicons name={\"ArrowRightUp\"} />\n                </Icon>\n              </Stack>\n            </ListTouchable>\n          </Stack>\n        )}\n      </Stack>\n      {item.render && item.render()}\n    </Stack>\n  );\n};\n\nconst HomeWidget: React.FC<HomeWidgetProps> = React.memo((props) => (\n  <ErrorBoundary fallback={null}>\n    <HomeWidgetContent {...props} />\n  </ErrorBoundary>\n));\n\nexport default HomeWidget;\n"
  },
  {
    "path": "app/(tabs)/index/hooks/useHomeData.ts",
    "content": "import { router } from 'expo-router';\nimport { instance } from 'pawnote';\nimport { useCallback, useEffect } from 'react';\n\nimport { getWeekNumberFromDate } from '@/database/useHomework';\nimport { AuthenticationError } from '@/services/errors/AuthenticationError';\nimport { getManager, initializeAccountManager } from \"@/services/shared\";\nimport { Grade, Period } from '@/services/shared/grade';\nimport { Services } from '@/stores/account/types';\nimport { useSettingsStore } from '@/stores/settings';\nimport { useAlert } from '@/ui/components/AlertProvider';\nimport { getCurrentPeriod } from '@/utils/grades/helper/period';\nimport { log, warn } from '@/utils/logger/logger';\nimport { useAccountStore } from '@/stores/account';\n\nconst HOME_SYNC_TTL_MS = 5 * 60 * 1000;\nconst homeSyncState = new Map<\n  string,\n  { lastSyncedAt: number; inFlight: Promise<void> | null }\n>();\n\nexport const useHomeData = () => {\n  const alert = useAlert();\n  const settingsstore = useSettingsStore(state => state.personalization);\n  const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);\n\n  const fetchEDT = useCallback(async () => {\n    const manager = getManager();\n    const date = new Date();\n    const weekNumber = getWeekNumberFromDate(date);\n    await manager.getWeeklyTimetable(weekNumber, date);\n  }, []);\n\n  const fetchGrades = useCallback(async () => {\n    const manager = getManager();\n    if (!manager) {\n      warn('Manager is null, skipping grades fetch');\n      return;\n    }\n    const gradePeriods = await manager.getGradesPeriods();\n    const validPeriods: Period[] = [];\n    const date = new Date().getTime();\n    for (const period of gradePeriods) {\n      if (period.start.getTime() > date && period.end.getTime() > date) {\n        validPeriods.push(period);\n      }\n    }\n\n    const grades: Grade[] = [];\n    const currentPeriod = getCurrentPeriod(validPeriods);\n\n    if (currentPeriod) {\n      const periodGrades = await manager.getGradesForPeriod(currentPeriod, currentPeriod.createdByAccount);\n      periodGrades.subjects.forEach(subject => {\n        subject.grades.forEach(grade => {\n          grades.push(grade);\n        });\n      });\n    }\n  }, []);\n\n  const initialize = useCallback(async () => {\n    if (!lastUsedAccount) {\n      return;\n    }\n\n    const state =\n      homeSyncState.get(lastUsedAccount) ?? {\n        lastSyncedAt: 0,\n        inFlight: null,\n      };\n    homeSyncState.set(lastUsedAccount, state);\n\n    if (state.inFlight) {\n      await state.inFlight;\n      return;\n    }\n\n    if (Date.now() - state.lastSyncedAt < HOME_SYNC_TTL_MS) {\n      return;\n    }\n\n    state.inFlight = (async () => {\n    try {\n      await initializeAccountManager(lastUsedAccount);\n      log(\"Refreshed Manager received\");\n\n      await Promise.all([fetchEDT(), fetchGrades()]);\n      state.lastSyncedAt = Date.now();\n\n      if (settingsstore.showAlertAtLogin) {\n        alert.showAlert({\n          title: \"Synchronisation réussie\",\n          description: \"Toutes vos données ont été mises à jour avec succès.\",\n          icon: \"CheckCircle\",\n          color: \"#00C851\",\n          withoutNavbar: true,\n          delay: 1000\n        });\n      }\n\n    } catch (error) {\n      if (String(error).includes(\"Unable to find\")) { return; }\n      if (error instanceof AuthenticationError) {\n        const instanceURL = error?.service?.auth?.additionals?.[\"instanceURL\"] ?? \"\";\n        const serviceId = error?.service?.id ?? undefined;\n\n        alert.showAlert({\n          title: \"Vous avez été déconnecté\",\n          message: instanceURL ? `En savoir plus et se reconnecter` : \"En savoir plus\",\n          description: \"Il semblerait que ta session a expiré. Tu pourras renouveler ta session dans les paramètres en liant à nouveau ton compte.\",\n          icon: \"UserCross\",\n          color: \"#D60046\",\n          customButton: instanceURL ? {\n            label: \"Me reconnecter\",\n            showCancelButton: error.service.serviceId === Services.PRONOTE,\n            onPress: async () => {\n              const authUrl = instanceURL;\n              const instanceInfo = await instance(authUrl as string);\n\n              if (instanceInfo && instanceInfo.name) {\n                return setTimeout(() => {\n                  router.navigate(\"/(onboarding)/ageSelection\");\n                  setTimeout(() => {\n                  router.navigate({ pathname: \"/(onboarding)/services/pronote/browser\", params: { url: authUrl, school: instanceInfo.name } })\n                }, 400)\n                }, 100)\n              }\n\n              setTimeout(() => {\n                router.navigate({ pathname: \"/(onboarding)/services/pronote/browser\", params: { url: authUrl, school: \"N/A\" } })\n              }, 200)\n            }\n          } : undefined,\n          technical: error.message\n        })\n      }\n    }\n    })();\n\n    try {\n      await state.inFlight;\n    } finally {\n      state.inFlight = null;\n    }\n  }, [alert, fetchEDT, fetchGrades, settingsstore.showAlertAtLogin, lastUsedAccount]);\n\n  useEffect(() => {\n    initialize();\n  }, [initialize]);\n};\n"
  },
  {
    "path": "app/(tabs)/index/hooks/useHomeHeaderData.ts",
    "content": "import { useState, useEffect, useMemo, useRef } from 'react';\nimport { getChatsFromCache } from '@/database/useChat';\nimport { AccountManager, getManager, subscribeManagerUpdate } from '@/services/shared';\nimport { Attendance } from '@/services/shared/attendance';\nimport { Chat } from '@/services/shared/chat';\nimport { Period } from '@/services/shared/grade';\nimport { getCurrentPeriod } from '@/utils/grades/helper/period';\nimport { useAccountStore } from '@/stores/account';\nimport { Services } from '@/stores/account/types';\n\nexport const useHomeHeaderData = () => {\n  const accounts = useAccountStore((state) => state.accounts);\n  const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);\n  const account = accounts.find((a) => a.id === lastUsedAccount);\n\n  const availableCanteenCards = useMemo(\n    () =>\n      account?.services.filter(service =>\n        [\n          Services.TURBOSELF,\n          Services.ALISE,\n          Services.ARD,\n          Services.ECOLEDIRECTE,\n          Services.IZLY,\n        ].includes(service.serviceId)\n      ) ?? [],\n    [account]\n  );\n\n  const attendancesPeriodsRef = useRef<Period[]>([]);\n  const [attendances, setAttendances] = useState<Attendance[]>([]);\n  const [chats, setChats] = useState<Chat[]>([]);\n\n  const absencesCount = useMemo(() => {\n    if (!attendances) return 0;\n    let count = 0;\n    attendances.forEach(att => {\n      if(att && \"absences\" in att) {\n        if (att.absences) count += att.absences.length;\n      }\n    });\n    return count;\n  }, [attendances]);\n\n  useEffect(() => {\n    const init = async () => {\n      const cachedChats = await getChatsFromCache();\n      setChats(cachedChats);\n    };\n\n    init();\n\n    const updateAttendance = async (manager: AccountManager) => {\n      const periods = await manager.getAttendancePeriods();\n      const currentPeriod = getCurrentPeriod(periods);\n      const fetchedAttendances = await manager.getAttendanceForPeriod(currentPeriod.name);\n\n      attendancesPeriodsRef.current = periods;\n      setAttendances(fetchedAttendances);\n    };\n\n    const updateDiscussions = async (manager: AccountManager) => {\n      const fetchedChats = await manager.getChats();\n      setChats(fetchedChats);\n    };\n\n    const unsubscribe = subscribeManagerUpdate((_) => {\n      const manager = getManager();\n      updateAttendance(manager);\n      updateDiscussions(manager);\n    });\n\n    return () => unsubscribe();\n  }, []);\n\n  return {\n    availableCanteenCards,\n    attendancesPeriods: attendancesPeriodsRef.current,\n    attendances,\n    absencesCount,\n    chats\n  };\n};\n"
  },
  {
    "path": "app/(tabs)/index/hooks/useTimetableWidgetData.ts",
    "content": "import { useState, useEffect, useMemo } from \"react\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { getWeekNumberFromDate } from \"@/database/useHomework\";\nimport { useTimetable } from \"@/database/useTimetable\";\nimport { Course as SharedCourse } from \"@/services/shared/timetable\";\n\nexport const useTimetableWidgetData = () => {\n  const now = new Date();\n  const weekNumber = getWeekNumberFromDate(now);\n\n  const accounts = useAccountStore((state) => state.accounts);\n  const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);\n  const account = accounts.find((a) => a.id === lastUsedAccount);\n\n  const services = useMemo(() =>\n    account?.services?.map((service: { id: string }) => service.id) ?? [],\n    [account?.services]\n  );\n\n  const [courses, setCourses] = useState<SharedCourse[]>([]);\n\n  const timetableData = useTimetable(undefined, weekNumber);\n  const weeklyTimetable = useMemo(() =>\n    timetableData.map(day => ({\n      ...day,\n      courses: day.courses.filter(course =>\n        services.includes(course.createdByAccount) || course.createdByAccount.startsWith('ical_')\n      )\n    })).filter(day => day.courses.length > 0),\n    [timetableData, services]\n  );\n\n  useEffect(() => {\n    const fetchData = async () => {\n      const today = new Date();\n      today.setHours(0, 0, 0, 0);\n\n      let dayCourse = weeklyTimetable.find(day => day.date.getTime() === today.getTime())?.courses ?? [];\n\n      if (dayCourse.length === 0) {\n        const futureDays = weeklyTimetable\n          .filter(day => day.date.getTime() > today.getTime())\n          .sort((a, b) => a.date.getTime() - b.date.getTime());\n\n        if (futureDays.length > 0) {\n          dayCourse = futureDays[0].courses;\n        }\n      }\n\n      dayCourse = dayCourse.filter(course => course.to.getTime() > Date.now());\n      setCourses(dayCourse);\n    };\n    fetchData();\n  }, [weeklyTimetable]);\n\n  return { courses };\n};\n"
  },
  {
    "path": "app/(tabs)/index/hooks/useUserProfileData.ts",
    "content": "import { useMemo } from 'react';\n\nimport { useAccountStore } from '@/stores/account';\nimport { getInitials } from '@/utils/chats/initials';\n\nexport const useUserProfileData = () => {\n  const accounts = useAccountStore((state) => state.accounts);\n  const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);\n  const account = accounts.find((a) => a.id === lastUsedAccount);\n\n  const [firstName, lastName, level, establishment] = useMemo(() => {\n    if (!lastUsedAccount) { return [null, null, null, null]; }\n\n    const firstName = account?.firstName;\n    const lastName = account?.lastName;\n    const level = account?.className;\n    const establishment = account?.schoolName;\n\n    return [firstName, lastName, level, establishment];\n  }, [lastUsedAccount, account]);\n\n  const initials = useMemo(() => getInitials(`${account?.firstName} ${account?.lastName}`), [account]);\n  \n  const profilePicture = useMemo(() => {\n    if (account && account.customisation && account.customisation.profilePicture && !account.customisation.profilePicture.startsWith(\"PCFET0NUWVBFIGh0bWw+\")) {\n      return `data:image/png;base64,${account.customisation.profilePicture}`;\n    }\n    return undefined;\n  }, [account]);\n\n  if(!account) {return null;}\n\n  return {\n    firstName,\n    lastName,\n    level,\n    establishment,\n    initials,\n    profilePicture\n  };\n};\n"
  },
  {
    "path": "app/(tabs)/index/index.old.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useHeaderHeight } from \"@react-navigation/elements\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { useNavigation, useRouter } from \"expo-router\";\nimport { t } from \"i18next\";\nimport { instance } from \"pawnote\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport React, { Alert, Dimensions, FlatList, Platform, View } from \"react-native\";\nimport LinearGradient from \"react-native-linear-gradient\";\nimport Reanimated, { FadeInUp, FadeOutUp, LinearTransition } from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport { removeAllDuplicates } from \"@/database/DatabaseProvider\";\nimport { getHomeworksFromCache, getWeekNumberFromDate, updateHomeworkIsDone } from \"@/database/useHomework\";\nimport { useTimetable } from \"@/database/useTimetable\";\nimport { AuthenticationError } from \"@/services/errors/AuthenticationError\";\nimport { getManager, initializeAccountManager, subscribeManagerUpdate } from \"@/services/shared\";\nimport { Grade, Period } from \"@/services/shared/grade\";\nimport { Homework } from \"@/services/shared/homework\";\nimport { Course as SharedCourse, CourseStatus } from \"@/services/shared/timetable\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { useSettingsStore } from \"@/stores/settings\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport { CompactGrade } from \"@/ui/components/CompactGrade\";\nimport CompactTask from \"@/ui/components/CompactTask\";\nimport Course from \"@/ui/components/Course\";\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Icon from \"@/ui/components/Icon\";\nimport { NativeHeaderHighlight, NativeHeaderPressable, NativeHeaderSide, NativeHeaderTitle } from \"@/ui/components/NativeHeader\";\nimport { AvailablePatterns, Pattern } from \"@/ui/components/Pattern/Pattern\";\nimport Stack from \"@/ui/components/Stack\";\nimport TabFlatList from \"@/ui/components/TabFlatList\";\nimport Typography from \"@/ui/components/Typography\";\nimport { Animation } from \"@/ui/utils/Animation\";\nimport { runsIOS26 } from \"@/ui/utils/IsLiquidGlass\";\nimport { PapillonAppearIn, PapillonAppearOut } from \"@/ui/utils/Transition\";\nimport adjust from \"@/utils/adjustColor\";\nimport { generateId } from \"@/utils/generateId\";\nimport { getCurrentPeriod } from \"@/utils/grades/helper/period\";\nimport i18n from \"@/utils/i18n\";\nimport { checkConsent } from \"@/utils/logger/consent\";\nimport { log, warn } from \"@/utils/logger/logger\";\nimport { getSubjectColor } from \"@/utils/subjects/colors\";\nimport { getSubjectEmoji } from \"@/utils/subjects/emoji\";\nimport { getSubjectName } from \"@/utils/subjects/name\";\n\nimport { getStatusText } from \"../calendar\";\nimport GradesWidget from \"./widgets/Grades\";\n\nconst IndexScreen = () => {\n  const now = new Date();\n  const weekNumber = getWeekNumberFromDate(now)\n  const [currentPage, setCurrentPage] = useState(0);\n  const accounts = useAccountStore((state) => state.accounts);\n  const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);\n  const account = accounts.find((a) => a.id === lastUsedAccount);\n\n  const services = useMemo(() =>\n    account?.services?.map((service: { id: string }) => service.id) ?? [],\n    [account?.services]\n  );\n\n  const [courses, setCourses] = useState<SharedCourse[]>([]);\n\n  const timetableData = useTimetable(undefined, weekNumber);\n  const weeklyTimetable = useMemo(() =>\n    timetableData.map(day => ({\n      ...day,\n      courses: day.courses.filter(course =>\n        services.includes(course.createdByAccount) || course.createdByAccount.startsWith('ical_')\n      )\n    })).filter(day => day.courses.length > 0),\n    [timetableData, services]\n  );\n  const [grades, setGrades] = useState<Grade[]>([]);\n\n  const insets = useSafeAreaInsets();\n  const router = useRouter();\n  const navigation = useNavigation();\n  const alert = useAlert();\n\n  const settingsStore = useSettingsStore(state => state.personalization)\n\n  const Initialize = async () => {\n    try {\n      await initializeAccountManager()\n      log(\"Refreshed Manager received\")\n    } catch (error) {\n      if (String(error).includes(\"Unable to find\")) { return; }\n      if (error instanceof AuthenticationError) {\n        const instanceURL = error?.service?.auth?.additionals?.[\"instanceURL\"] ?? \"\";\n        const serviceId = error?.service?.id ?? undefined;\n\n        alert.showAlert({\n          title: \"Connexion impossible\",\n          description: \"Il semblerait que ta session a expiré. Tu pourras renouveler ta session dans les paramètres en liant à nouveau ton compte.\",\n          icon: \"AlertTriangle\",\n          color: \"#D60046\",\n          customButton: instanceURL ? {\n            label: \"Me reconnecter\",\n            showCancelButton: true,\n            onPress: async () => {\n              const authUrl = instanceURL;\n              const instanceInfo = await instance(authUrl as string);\n\n              if (instanceInfo && instanceInfo.casToken && instanceInfo.casURL) {\n                return setTimeout(() => {\n                  router.push({ pathname: \"/(onboarding)/pronote/webview\", params: { url: authUrl, serviceId } })\n                }, 200)\n              }\n\n              setTimeout(() => {\n                router.push({ pathname: \"/(onboarding)/pronote/credentials\", params: { url: authUrl, serviceId } })\n              }, 200)\n            }\n          } : undefined,\n          technical: error.message\n        })\n      }\n    }\n    await Promise.all([fetchEDT(), fetchGrades()]);\n\n    if (settingsStore.showAlertAtLogin) {\n      alert.showAlert({\n        title: \"Synchronisation réussie\",\n        description: \"Toutes vos données ont été mises à jour avec succès.\",\n        icon: \"CheckCircle\",\n        color: \"#00C851\",\n        withoutNavbar: true,\n        delay: 1000\n      });\n    }\n\n\n  };\n\n  useMemo(() => {\n    Initialize();\n  }, []);\n\n\n  const fetchEDT = useCallback(async () => {\n    const manager = getManager();\n    const date = new Date();\n    const weekNumber = getWeekNumberFromDate(date)\n    await manager.getWeeklyTimetable(weekNumber)\n  }, []);\n\n  const [refreshTrigger, setRefreshTrigger] = useState(0);\n  const [freshHomeworks, setFreshHomeworks] = useState<Record<string, Homework>>({});\n  const [homeworks, setHomeworks] = useState<Homework[]>([]);\n\n  const fetchHomeworks = useCallback(async () => {\n    const manager = getManager();\n    const current = await manager.getHomeworks(weekNumber);\n    const next = await manager.getHomeworks(weekNumber + 1);\n    const result = [...current, ...next]\n    const newHomeworks: Record<string, Homework> = {};\n    for (const hw of result) {\n      const id = generateId(\n        hw.subject + hw.content + hw.createdByAccount + hw.dueDate.toDateString()\n      );\n      newHomeworks[id] = hw;\n    }\n    setFreshHomeworks(newHomeworks);\n    setRefreshTrigger(prev => prev + 1);\n  }, [weekNumber]);\n\n  async function setHomeworkAsDone(homework: Homework) {\n    const manager = getManager();\n    const id = generateId(\n      homework.subject + homework.content + homework.createdByAccount + homework.dueDate.toDateString()\n    );\n    await manager.setHomeworkCompletion(homework, !homework.isDone);\n    updateHomeworkIsDone(id, !homework.isDone)\n    setRefreshTrigger(prev => prev + 1);\n    setFreshHomeworks(prev => ({\n      ...prev,\n      [id]: {\n        ...prev[id],\n        isDone: !homework.isDone,\n      }\n    }));\n  }\n\n  const fetchGrades = useCallback(async () => {\n    const manager = getManager();\n    if (!manager) {\n      warn('Manager is null, skipping grades fetch');\n      return;\n    }\n    const gradePeriods = await manager.getGradesPeriods()\n    const validPeriods: Period[] = []\n    const date = new Date().getTime()\n    for (const period of gradePeriods) {\n      if (period.start.getTime() > date && period.end.getTime() > date) {\n        validPeriods.push(period);\n      }\n    }\n\n    const grades: Grade[] = []\n    const currentPeriod = getCurrentPeriod(validPeriods)\n\n    const periodGrades = await manager.getGradesForPeriod(currentPeriod, currentPeriod.createdByAccount)\n    periodGrades.subjects.forEach(subject => {\n      subject.grades.forEach(grade => {\n        grades.push(grade);\n      });\n    });\n\n    setGrades(grades.sort((a, b) => b.givenAt.getTime() - a.givenAt.getTime()).splice(0, 10))\n  }, [])\n\n  useEffect(() => {\n    const fetchHomeworksFromCache = async () => {\n      const currentWeekHomeworks = await getHomeworksFromCache(weekNumber);\n      const nextWeekHomeworks = await getHomeworksFromCache(weekNumber + 1);\n      const fullHomeworks = [...currentWeekHomeworks, ...nextWeekHomeworks];\n\n      // get the closest due date from now\n      const sortedHomeworks = fullHomeworks.sort((a, b) => new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime());\n      // Filter done homeworks\n      const filteredHomeworks = sortedHomeworks.filter(hw => !hw.isDone).length > 0 ? sortedHomeworks.filter(hw => !hw.isDone) : sortedHomeworks;\n      // Take the first 3 homeworks\n      const splicedHomeworks = filteredHomeworks.splice(0, 3);\n      setHomeworks(splicedHomeworks);\n    };\n    fetchHomeworksFromCache();\n  }, [refreshTrigger])\n\n  useEffect(() => {\n    const fetchData = async () => {\n      const today = new Date();\n      today.setHours(0, 0, 0, 0);\n\n      let dayCourse = weeklyTimetable.find(day => day.date.getTime() === today.getTime())?.courses ?? [];\n\n      if (dayCourse.length === 0) {\n        const futureDays = weeklyTimetable\n          .filter(day => day.date.getTime() > today.getTime())\n          .sort((a, b) => a.date.getTime() - b.date.getTime());\n        if (futureDays.length > 0) {\n          dayCourse = futureDays[0].courses;\n        }\n      }\n\n      dayCourse = dayCourse.filter(course => course.to.getTime() > Date.now());\n      setCourses(dayCourse);\n    };\n    fetchData();\n  }, [weeklyTimetable]);\n\n\n  useEffect(() => {\n    const unsubscribe = subscribeManagerUpdate((_) => {\n      fetchEDT()\n      fetchGrades()\n      fetchHomeworks()\n    });\n\n    return () => unsubscribe();\n  }, []);\n\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const [firstName] = useMemo(() => {\n    if (!lastUsedAccount) { return [null, null, null, null]; }\n\n    const firstName = account?.firstName;\n    const lastName = account?.lastName;\n    const level = account?.className;\n    const establishment = account?.schoolName;\n\n    return [firstName, lastName, level, establishment];\n  }, [account, accounts]);\n\n  const date = useMemo(() => new Date(), []);\n\n  const accent = colors.primary;\n  const foreground = adjust(accent, theme.dark ? 0.4 : -0.4);\n  const foregroundSecondary = adjust(accent, theme.dark ? 0.6 : -0.7) + \"88\";\n\n  const headerHeight = useHeaderHeight();\n\n  const [fullyScrolled, setFullyScrolled] = useState(false);\n\n\n  const handleFullyScrolled = useCallback((isFullyScrolled: boolean) => {\n    setFullyScrolled(isFullyScrolled);\n  }, []);\n\n  useEffect(() => {\n    removeAllDuplicates()\n    if (accounts.length > 0) {\n      checkConsent().then(consent => {\n        if (!consent.given) {\n          router.push(\"../consent\");\n        }\n      });\n    }\n  }, []);\n\n  const MagicTaskWrapper = useCallback(({ item }: { item: Homework }) => {\n    const description = item.content.replace(/<[^>]*>/g, \"\");\n    const dueDate = new Date(item.dueDate);\n    const inFresh = freshHomeworks[item.id]\n\n    return (\n      <CompactTask\n        fromCache={false}\n        setHomeworkAsDone={() => setHomeworkAsDone(inFresh)}\n        ref={item}\n        subject={getSubjectName(item.subject)}\n        color={getSubjectColor(item.subject)}\n        description={description}\n        emoji={getSubjectEmoji(item.subject)}\n        dueDate={dueDate}\n        done={item.isDone}\n      />\n\n    );\n  }, [freshHomeworks]);\n\n  const getScheduleMessage = () => {\n    const today = new Date();\n    today.setUTCHours(0, 0, 0, 0);\n\n    const todayAllCourses = weeklyTimetable.find(day => day.date.getTime() === today.getTime())?.courses ?? [];\n    if (todayAllCourses.length === 0) {\n      return todayAllCourses.length > 0 ? t(\"Home_Planned_Finished\") : t(\"Home_Planned_None\");\n    } else if (todayAllCourses.length === 1) {\n      return t(\"Home_Planned_One\");\n    }\n    return t(\"Home_Planned_Number\", { number: todayAllCourses.length });\n\n  };\n\n  const headerItems = [\n    (\n      <Stack\n        direction=\"vertical\"\n        hAlign=\"center\"\n        vAlign=\"center\"\n        gap={2}\n        padding={20}\n      >\n        <Typography variant=\"h1\" style={{ marginTop: -12, marginBottom: 2, fontSize: 44, lineHeight: 56 }}>\n          👋\n        </Typography>\n        <Dynamic animated key={\"welcome:\" + firstName}>\n          <Typography variant=\"h3\" color={foreground}>\n            {firstName ? t(\"Home_Welcome_Name\", { name: firstName }) : t(\"Home_Welcome\")}\n          </Typography>\n        </Dynamic>\n        <Typography variant=\"body1\" color={foregroundSecondary}>\n          {getScheduleMessage()}\n        </Typography>\n      </Stack>\n    ),\n    <GradesWidget header accent={foreground} />,\n  ];\n\n  if (accounts.length === 0) {\n    router.replace(\"/(onboarding)/welcome\");\n    return null;\n  }\n\n  return (\n    <>\n      <LinearGradient\n        colors={[accent + \"77\", accent + \"00\"]}\n        locations={[0, 0.5]}\n        style={{ position: \"absolute\", top: 0, left: 0, right: 0, height: \"100%\" }}\n      />\n\n      <Pattern\n        pattern={AvailablePatterns.CROSS}\n        width={\"100%\"}\n        height={250 + insets.top}\n        color={foreground}\n      />\n\n      {!runsIOS26 && fullyScrolled && (\n        <Reanimated.View\n          entering={Animation(FadeInUp, \"list\")}\n          exiting={Animation(FadeOutUp, \"default\")}\n          style={[\n            {\n              position: \"absolute\",\n              top: 0,\n              left: 0,\n              right: 0,\n              height: headerHeight + 1,\n              backgroundColor: colors.card,\n              zIndex: 1000000,\n            },\n            Platform.OS === 'android' && {\n              elevation: 4,\n            },\n            Platform.OS === 'ios' && {\n              borderBottomWidth: 0.5,\n              borderBottomColor: colors.border,\n            }\n          ]}\n        />\n      )}\n\n      <TabFlatList\n        translucent={true}\n        removeClippedSubviews={true}\n        backgroundColor=\"transparent\"\n        onFullyScrolled={handleFullyScrolled}\n        height={200}\n        engine=\"FlatList\"\n        header={\n          <>\n            <FlatList\n              style={{\n                backgroundColor: \"transparent\",\n                borderCurve: \"continuous\",\n                paddingBottom: 12,\n                marginTop: -10,\n              }}\n              horizontal\n              data={headerItems}\n              snapToInterval={Dimensions.get(\"window\").width}\n              decelerationRate={\"fast\"}\n              showsHorizontalScrollIndicator={false}\n              onScroll={e => {\n                const page = Math.round(\n                  e.nativeEvent.contentOffset.x / Dimensions.get(\"window\").width\n                );\n                setCurrentPage(page);\n              }}\n              scrollEventThrottle={16}\n              keyExtractor={(_, index) => \"headerItem:\" + index}\n              initialNumToRender={1}\n              maxToRenderPerBatch={1}\n              removeClippedSubviews={true}\n              renderItem={({ item }) => (\n                <View\n                  style={{\n                    width: Dimensions.get(\"window\").width,\n                    flex: 1,\n                    overflow: \"hidden\",\n                    alignItems: \"center\",\n                    justifyContent: \"center\",\n                    marginTop: 10,\n                  }}\n                >\n                  {item}\n                </View>\n              )}\n            />\n\n            {/* Pagination */}\n            {headerItems.length > 1 &&\n              <View\n                style={{\n                  flexDirection: \"row\",\n                  justifyContent: \"center\",\n                  alignItems: \"center\",\n                  position: \"absolute\",\n                  bottom: 10,\n                  gap: 6,\n                }}\n              >\n                {headerItems.map((item, i) => (\n                  <Reanimated.View\n                    key={\"pagination:\" + i}\n                    layout={Animation(LinearTransition)}\n                    style={{\n                      width: currentPage === i ? 16 : 6,\n                      height: currentPage === i ? 8 : 6,\n                      backgroundColor: currentPage === i ? foreground : foregroundSecondary,\n                      borderRadius: 200,\n                      opacity: currentPage === i ? 1 : 0.5\n                    }}\n                  />\n                ))}\n              </View>\n            }\n          </>\n        }\n        gap={12}\n        data={[\n          courses.filter(item => item.to.getTime() > Date.now()).length > 0 && {\n            icon: <Papicons name={\"Calendar\"} />,\n            title: t(\"Home_Widget_NextCourses\"),\n            redirect: \"(tabs)/calendar\",\n            render: () => (\n              <Stack padding={12} gap={4} style={{ paddingBottom: 6 }}>\n                {courses.filter(item => item.to.getTime() > Date.now()).slice(0, 2).map(item => (\n                  <Course\n                    key={item.id}\n                    id={item.id}\n                    name={getSubjectName(item.subject)}\n                    teacher={item.teacher}\n                    room={item.room}\n                    color={getSubjectColor(item.subject)}\n                    status={{ label: item.customStatus ? item.customStatus : getStatusText(item.status), canceled: (item.status === CourseStatus.CANCELED) }}\n                    variant=\"primary\"\n                    start={Math.floor(item.from.getTime() / 1000)}\n                    end={Math.floor(item.to.getTime() / 1000)}\n                    readonly={!!item.createdByAccount}\n                    compact={true}\n                    onPress={() => {\n                      (navigation as any).navigate('(modals)/course', {\n                        course: item,\n                        subjectInfo: {\n                          id: item.id,\n                          name: item.subject,\n                          color: getSubjectColor(item.subject),\n                          emoji: getSubjectEmoji(item.subject),\n                        }\n                      });\n                    }}\n                  />\n                ))}\n              </Stack>\n            )\n          },\n          homeworks.length > 0 && {\n            icon: <Papicons name={\"Tasks\"} />,\n            title: t(\"Tab_Tasks\"),\n            redirect: \"/(tabs)/tasks\",\n            buttonLabel: homeworks.length > 3 ? `${(homeworks.length) - 3}+ autres tâches` : t(\"Home_See_All_Tasks\"),\n            render: () => (\n              <FlatList\n                showsVerticalScrollIndicator={false}\n                scrollEnabled={false}\n                style={{\n                  borderBottomLeftRadius: 26,\n                  borderBottomRightRadius: 26,\n                  overflow: \"hidden\",\n                  width: \"100%\",\n                  padding: 10,\n                  paddingHorizontal: 10,\n                  gap: 10\n                }}\n                contentContainerStyle={{\n                  gap: 12\n                }}\n                data={homeworks.slice(0, 3)}\n                keyExtractor={(item, index) => item.id + index}\n                renderItem={({ item }) => (\n                  <MagicTaskWrapper item={item} />\n                )}\n              />\n            )\n          },\n          grades.length > 0 && {\n            icon: <Papicons name={\"Grades\"} />,\n            title: t(\"Home_Widget_NewGrades\"),\n            redirect: \"(tabs)/grades\",\n            render: () => (\n              <FlatList\n                horizontal\n                showsHorizontalScrollIndicator={false}\n                style={{\n                  borderBottomLeftRadius: 26,\n                  borderBottomRightRadius: 26,\n                  overflow: \"hidden\",\n                  width: \"100%\"\n                }}\n                contentContainerStyle={{\n                  paddingTop: 8,\n                  paddingBottom: 14,\n                  paddingHorizontal: 14,\n                  gap: 12\n                }}\n                data={grades}\n                keyExtractor={(item, index) => item.id + index}\n                renderItem={({ item }) => (\n                  <CompactGrade\n                    title={item.subjectName}\n                    score={item.studentScore?.value ?? 0}\n                    description={item.description}\n                    outOf={item.outOf.value}\n                    emoji={getSubjectEmoji(item.subjectName)}\n                    disabled={item.studentScore?.disabled}\n                    status={item.studentScore?.status}\n                    color={adjust(getSubjectColor(item.subjectName), -0.1)}\n                    date={item.givenAt}\n                    variant=\"home\"\n                    onPress={() => {\n                      (navigation as any).navigate('(modals)/grade', {\n                        grade: item,\n                        subjectInfo: {\n                          id: item.subjectId,\n                          name: item.subjectName,\n                          emoji: getSubjectEmoji(item.subjectName),\n                          color: getSubjectColor(item.subjectName)\n                        },\n                        allGrades: grades\n                      });\n                    }}\n                  />\n                )}\n              />\n            )\n          },\n          // {\n          //   icon: <Papicons name={\"Butterfly\"} />,\n          //   title: \"Onboarding\",\n          //   redirect: \"/(onboarding)/welcome\",\n          //   buttonLabel: \"Aller\",\n          //   dev: true\n          // },\n          // {\n          //   icon: <Papicons name={\"Butterfly\"} />,\n          //   title: \"Devmode\",\n          //   redirect: \"/devmode\",\n          //   buttonLabel: \"Aller\",\n          //   dev: true\n          // },\n          // {\n          //   icon: <Papicons name={\"Butterfly\"} />,\n          //   title: \"Demo components\",\n          //   redirect: \"/demo\",\n          //   buttonLabel: \"Aller\",\n          //   dev: true\n          // },\n        ].filter(item => item !== false && (item.dev ? __DEV__ : true))}\n        keyExtractor={(item) => item.title}\n        renderItem={({ item }) => {\n          if (!item || (item.dev && !__DEV__)) {\n            return null;\n          }\n\n          return (\n            <Reanimated.View\n              entering={PapillonAppearIn}\n              exiting={PapillonAppearOut}\n              layout={Animation(LinearTransition, \"list\")}\n            >\n              <Stack card radius={26}>\n                <Stack direction=\"horizontal\" vAlign=\"center\" hAlign=\"center\" padding={12} gap={10} style={{ paddingBottom: item.render ? 0 : undefined, marginTop: -1, height: item.render ? 44 : 56 }}>\n                  <Icon papicon opacity={0.6} style={{ marginLeft: 4 }}>\n                    {item.icon}\n                  </Icon>\n                  <Typography nowrap style={{ flex: 1, opacity: 0.6 }} variant=\"title\" color=\"text\">\n                    {item.title}\n                  </Typography>\n                  {(item.redirect || item.onPress) && (\n                    <AnimatedPressable\n                      onPress={() => item.onPress ? item.onPress() : router.navigate(item.redirect)}\n                    >\n                      <Stack bordered direction=\"horizontal\" hAlign=\"center\" padding={[12, 6]} gap={6}>\n                        <Typography variant=\"body2\" color=\"secondary\" inline style={{ marginTop: 2 }}>\n                          {item.buttonLabel ?? \"Afficher plus\"}\n                        </Typography>\n                        <Icon size={20} papicon opacity={0.5}>\n                          <Papicons name={\"ArrowRightUp\"} />\n                        </Icon>\n                      </Stack>\n                    </AnimatedPressable>\n                  )}\n                </Stack>\n                {item.render && (\n                  <item.render />\n                )}\n              </Stack>\n            </Reanimated.View>\n          )\n        }}\n        paddingTop={0}\n      />\n\n      <NativeHeaderSide side=\"Left\">\n        <NativeHeaderPressable\n          onPressIn={() => {\n            Alert.alert(\"Ça arrive... ✨\", \"Cette fonctionnalité n'est pas encore disponible.\")\n          }}\n        >\n          <Icon size={28}>\n            <Papicons name={\"Menu\"} color={foreground} />\n          </Icon>\n        </NativeHeaderPressable>\n      </NativeHeaderSide>\n\n      <NativeHeaderTitle style={{ flexDirection: \"row\", alignItems: \"center\", gap: 4 }} ignoreTouch={true}>\n        <Typography variant=\"navigation\" color={foreground}>\n          {date.toLocaleDateString(i18n.language, { weekday: \"long\" })}\n        </Typography>\n        <NativeHeaderHighlight color={foreground} style={{ marginBottom: 0 }}>\n          {date.toLocaleDateString(i18n.language, { day: \"numeric\" })}\n        </NativeHeaderHighlight>\n        <Typography variant=\"navigation\" color={foreground}>\n          {date.toLocaleDateString(i18n.language, { month: \"long\" })}\n        </Typography>\n      </NativeHeaderTitle>\n\n      <NativeHeaderSide side=\"Right\">\n        <NativeHeaderPressable\n          onPressIn={() => router.navigate(\"/(modals)/notifications\")}\n        >\n          <Icon size={28}>\n            <Papicons name={\"Bell\"} color={foreground} />\n          </Icon>\n        </NativeHeaderPressable>\n      </NativeHeaderSide>\n    </>\n  );\n}\n\nexport default IndexScreen;"
  },
  {
    "path": "app/(tabs)/index/index.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport { useIsFocused } from '@react-navigation/native';\nimport { useRouter } from 'expo-router';\nimport { t } from 'i18next';\nimport React from 'react';\nimport { FlatList, Platform, StatusBar, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { useAccountStore } from '@/stores/account';\nimport { checkConsent } from '@/utils/logger/consent';\n\nimport HomeHeader from './atoms/HomeHeader';\nimport HomeTopBar from './atoms/HomeTopBar';\nimport Wallpaper from './atoms/Wallpaper';\nimport HomeWidget, { HomeWidgetItem } from './components/HomeWidget';\nimport { useHomeData } from './hooks/useHomeData';\nimport HomeTimeTableWidget from './widgets/timetable';\nimport GradesWidget from './widgets/Grades';\nimport { useAlert } from '@/ui/components/AlertProvider';\nimport Button from '@/ui/new/Button';\nimport MaskedView from '@react-native-masked-view/masked-view';\nimport LinearGradient from 'react-native-linear-gradient';\nimport Typography from '@/ui/new/Typography';\n\nconst HomeScreen = () => {\n  const insets = useSafeAreaInsets();\n  const bottomTabBarHeight = insets.bottom + 16;\n  const focused = useIsFocused();\n\n  // Account\n  const store = useAccountStore();\n  const accounts = useAccountStore((state) => state.accounts);\n  const account = accounts.find(a => a.id === store.lastUsedAccount)!;\n  const router = useRouter();\n\n  React.useEffect(() => {\n    console.log(accounts)\n    if (accounts.length === 0) {\n      router.replace(\"/(onboarding)/welcome\");\n    }\n    if (accounts.length > 0) {\n      checkConsent().then(consent => {\n        if (!consent.given) {\n          router.push(\"../consent\");\n        }\n      });\n      if (account.transport === undefined) {\n        store.initializeTransport(account.schoolName);\n      }\n    }\n  }, [accounts.length]);\n\n  useHomeData();\n\n  const [gradesWidgetHidden, setGradesWidgetHidden] = React.useState(true);\n\n  const renderTimeTable = React.useCallback(() => <HomeTimeTableWidget />, []);\n  const renderGrades = React.useCallback(\n    () => <GradesWidget onEmptyStateChange={setGradesWidgetHidden} />,\n    []\n  );\n\n  const data: HomeWidgetItem[] = React.useMemo(() => [\n    {\n      icon: <Papicons name={\"Calendar\"} />,\n      title: t(\"Home_Widget_NextCourses\"),\n      redirect: \"(tabs)/calendar\",\n      render: renderTimeTable\n    },\n    {\n      icon: <Papicons name={\"Grades\"} />,\n      title: t(\"Home_Widget_Grades_Average\"),\n      redirect: \"(tabs)/grades\",\n      hidden: gradesWidgetHidden,\n      render: renderGrades\n    }\n  ], [renderTimeTable, renderGrades, gradesWidgetHidden]);\n\n  const alert = useAlert();\n\n  return (\n    <>\n      <Wallpaper />\n      <HomeTopBar />\n      {focused && <StatusBar translucent animated barStyle={'light-content'} />}\n      <HomeViewContainer>\n        <FlatList\n          renderItem={({ item }) => <HomeWidget item={item} />}\n          keyExtractor={(item) => item.title}\n          ListHeaderComponent={<HomeHeader />}\n          style={{ flex: 1 }}\n          contentContainerStyle={{\n            paddingBottom: Platform.OS === 'ios' ? bottomTabBarHeight : 16,\n            paddingHorizontal: 16,\n            flexGrow: 1,\n            gap: 12,\n            marginTop: 6\n          }}\n          data={data}\n        />\n      </HomeViewContainer>\n    </>\n  );\n};\n\nconst HomeViewContainer = ({ children }) => {\n  const insets = useSafeAreaInsets();\n\n  return (\n    <MaskedView\n      maskElement={\n        <View style={{ flex: 1, backgroundColor: 'transparent' }}>\n          <LinearGradient\n            colors={['#ff000022', 'red']}\n            locations={[0.5, 1]}\n            style={{ height: insets.top + 68 }}\n          />\n          <View style={{ flex: 1, backgroundColor: 'red' }} />\n        </View>\n      }\n      style={{ flex: 1 }}\n    >\n      {children}\n    </MaskedView>\n  )\n}\n\nexport default HomeScreen;\n"
  },
  {
    "path": "app/(tabs)/index/widgets/Grades.tsx",
    "content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { View } from \"react-native\";\n\nimport { getManager, subscribeManagerUpdate } from \"@/services/shared\";\nimport { Period, Subject as SharedSubject } from \"@/services/shared/grade\";\nimport { getCurrentPeriod } from \"@/utils/grades/helper/period\";\nimport { error } from \"@/utils/logger/logger\";\nimport Averages from \"../../grades/atoms/Averages\";\n\nconst PERIODS_TTL_MS = 5 * 60 * 1000;\nconst GRADES_TTL_MS = 5 * 60 * 1000;\n\nconst periodsCache = new Map<\n  string,\n  {\n    fetchedAt: number;\n    value?: Period;\n    inFlight?: Promise<Period | undefined>;\n  }\n>();\n\nconst gradesCache = new Map<\n  string,\n  {\n    fetchedAt: number;\n    subjects: SharedSubject[];\n    serviceAverage?: number;\n    inFlight?: Promise<{\n      subjects: SharedSubject[];\n      serviceAverage?: number;\n    }>;\n  }\n>();\n\ntype GradesWidgetProps = {\n  accent?: string;\n  header?: boolean;\n  algorithm?: \"subject\" | \"weighted\" | \"median\";\n  period?: Period;\n  onEmptyStateChange?: (isEmpty: boolean) => void;\n};\n\nconst GradesWidget = ({ period, onEmptyStateChange }: GradesWidgetProps) => {\n  try {\n    const manager = getManager();\n\n    const [subjects, setSubjects] = useState<SharedSubject[]>([]);\n    const [currentPeriod, setCurrentPeriod] = useState<Period | undefined>(period);\n    const [serviceAverage, setServiceAverage] = useState<number | undefined>(undefined);\n\n    const grades = useMemo(\n      () =>\n        subjects\n          .flatMap((subject) => subject.grades)\n          .filter(\n            (grade) =>\n              grade.studentScore?.value !== undefined &&\n              grade.givenAt &&\n              !isNaN(grade.studentScore.value) &&\n              !grade.studentScore.disabled,\n          ),\n      [subjects],\n    );\n\n    useEffect(() => {\n      onEmptyStateChange?.(grades.length === 0);\n    }, [grades.length, onEmptyStateChange]);\n\n    const fetchPeriods = useCallback(\n      async (managerToUse = manager) => {\n        if (period) {\n          setCurrentPeriod(period);\n          return;\n        }\n        if (!managerToUse) {\n          return;\n        }\n\n        const accountId = managerToUse.getAccount().id;\n        const cache = periodsCache.get(accountId);\n\n        if (cache && Date.now() - cache.fetchedAt < PERIODS_TTL_MS) {\n          if (cache.value) {\n            setCurrentPeriod(cache.value);\n          }\n          return;\n        }\n\n        if (cache?.inFlight) {\n          const cachedPeriod = await cache.inFlight;\n          if (cachedPeriod) {\n            setCurrentPeriod(cachedPeriod);\n          }\n          return;\n        }\n\n        const inFlight = (async () => {\n          const result = await managerToUse.getGradesPeriods();\n          return getCurrentPeriod(result);\n        })();\n\n        periodsCache.set(accountId, {\n          fetchedAt: cache?.fetchedAt ?? 0,\n          value: cache?.value,\n          inFlight,\n        });\n\n        try {\n          const nextPeriod = await inFlight;\n          periodsCache.set(accountId, {\n            fetchedAt: Date.now(),\n            value: nextPeriod,\n          });\n          if (nextPeriod) {\n            setCurrentPeriod(nextPeriod);\n          }\n        } catch (err) {\n          periodsCache.delete(accountId);\n          error(`Failed to fetch periods: ${err}`);\n        }\n      },\n      [period, manager],\n    );\n\n    useEffect(() => {\n      const unsubscribe = subscribeManagerUpdate((updatedManager) => {\n        fetchPeriods(updatedManager);\n      });\n      return () => unsubscribe();\n    }, [fetchPeriods]);\n\n    const fetchGradesForPeriod = useCallback(\n      async (periodToFetch: Period | undefined, managerToUse = manager) => {\n        if (!periodToFetch || !managerToUse) {\n          return;\n        }\n\n        const periodKey = `${periodToFetch.createdByAccount}:${periodToFetch.name}`;\n        const cache = gradesCache.get(periodKey);\n\n        if (cache && Date.now() - cache.fetchedAt < GRADES_TTL_MS) {\n          setSubjects(cache.subjects);\n          setServiceAverage(cache.serviceAverage);\n          return;\n        }\n\n        if (cache?.inFlight) {\n          const cachedGrades = await cache.inFlight;\n          setSubjects(cachedGrades.subjects);\n          setServiceAverage(cachedGrades.serviceAverage);\n          return;\n        }\n\n        const inFlight = (async () => {\n          const result = await managerToUse.getGradesForPeriod(\n            periodToFetch,\n            periodToFetch.createdByAccount,\n          );\n          return {\n            subjects: result.subjects,\n            serviceAverage: result.studentOverall.value || undefined,\n          };\n        })();\n\n        gradesCache.set(periodKey, {\n          fetchedAt: cache?.fetchedAt ?? 0,\n          subjects: cache?.subjects ?? [],\n          serviceAverage: cache?.serviceAverage,\n          inFlight,\n        });\n\n        try {\n          const nextGrades = await inFlight;\n          gradesCache.set(periodKey, {\n            fetchedAt: Date.now(),\n            subjects: nextGrades.subjects,\n            serviceAverage: nextGrades.serviceAverage,\n          });\n          setSubjects(nextGrades.subjects);\n          setServiceAverage(nextGrades.serviceAverage);\n        } catch (err) {\n          gradesCache.delete(periodKey);\n          error(`Failed to fetch grades: ${err}`);\n        }\n      },\n      [manager],\n    );\n\n    useEffect(() => {\n      fetchGradesForPeriod(currentPeriod);\n    }, [currentPeriod, fetchGradesForPeriod]);\n\n    useEffect(() => {\n      if (period) {\n        setCurrentPeriod(period);\n      }\n    }, [period]);\n\n    if (grades.length === 0) {\n      return null;\n    }\n\n    return (\n      <View style={{ width: \"100%\" }}>\n        <Averages grades={grades} realAverage={serviceAverage} inline />\n      </View>\n    );\n  } catch (err) {\n    error(`Error in GradesWidget: ${err}`);\n    return null;\n  }\n};\n\nexport default GradesWidget;\n"
  },
  {
    "path": "app/(tabs)/index/widgets/timetable.tsx",
    "content": "import { useNavigation } from \"expo-router\";\nimport { t } from \"i18next\";\nimport React from 'react';\nimport { FlatList } from \"react-native\";\n\nimport { CourseStatus } from \"@/services/shared/timetable\";\nimport Course from \"@/ui/components/Course\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport { getSubjectColor } from \"@/utils/subjects/colors\";\nimport { getSubjectEmoji } from \"@/utils/subjects/emoji\";\nimport { getSubjectName } from \"@/utils/subjects/name\";\nimport { useTimetableWidgetData } from \"../hooks/useTimetableWidgetData\";\nimport { getStatusText } from '../../calendar/components/CalendarDay';\n\nconst HomeTimeTableWidget = React.memo(() => {\n  const navigation = useNavigation();\n  const { courses } = useTimetableWidgetData();\n\n  if (courses.length === 0) {\n    return (\n      <Stack\n        inline flex\n        hAlign=\"center\"\n        vAlign=\"center\"\n        padding={[22, 16]}\n        gap={2}\n        style={{ paddingTop: 12, marginBottom: 3 }}\n      >\n        <Typography align=\"center\" variant=\"title\" color=\"text\">\n          {t(\"Home_Widget_NoCourses\")}\n        </Typography>\n        <Typography align=\"center\" variant=\"body1\" color=\"secondary\">\n          {t(\"Home_Widget_NoCourses_Description\")}\n        </Typography>\n      </Stack>\n    );\n  }\n\n  return (\n    <FlatList\n      scrollEnabled={false}\n      data={courses.slice(0, 3)}\n      style={{ width: '100%', paddingHorizontal: 10 }}\n      renderItem={({ item }) => (\n        <Course\n          key={item.id}\n          id={item.id}\n          name={getSubjectName(item.subject)}\n          teacher={item.teacher}\n          room={item.room}\n          color={getSubjectColor(item.subject)}\n          status={{ label: item.customStatus ? item.customStatus : getStatusText(item.status), canceled: (item.status === CourseStatus.CANCELED) }}\n          variant=\"primary\"\n          start={Math.floor(item.from.getTime() / 1000)}\n          end={Math.floor(item.to.getTime() / 1000)}\n          readonly={!!item.createdByAccount}\n          compact={true}\n          onPress={() => {\n            (navigation as any).navigate('(modals)/course', {\n              course: item,\n              subjectInfo: {\n                id: item.id,\n                name: item.subject,\n                color: getSubjectColor(item.subject),\n                emoji: getSubjectEmoji(item.subject),\n              }\n            });\n          }}\n        />\n      )}\n    />\n  );\n});\n\nexport default HomeTimeTableWidget;\n\n"
  },
  {
    "path": "app/(tabs)/news/_layout.tsx",
    "content": "import { Stack } from \"expo-router\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\n\nexport default function Layout() {\n  const { t } = useTranslation();\n\n  return (\n    <Stack screenOptions={screenOptions}>\n      <Stack.Screen\n        name=\"index\"\n        options={{\n          headerShown: false,\n          headerTitle: t(\"Tab_News\"),\n        }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(tabs)/news/index.tsx",
    "content": "import { useNews } from '@/database/useNews'\nimport { getManager, subscribeManagerUpdate } from '@/services/shared'\nimport Avatar from '@/ui/components/Avatar'\nimport { Dynamic } from '@/ui/components/Dynamic'\nimport Icon from '@/ui/components/Icon'\nimport Search from '@/ui/components/Search'\nimport Stack from '@/ui/components/Stack'\nimport TabHeader from '@/ui/components/TabHeader'\nimport TabHeaderTitle from '@/ui/components/TabHeaderTitle'\nimport { useKeyboardHeight } from '@/ui/hooks/useKeyboardHeight'\nimport List from '@/ui/new/List'\nimport Typography from '@/ui/new/Typography'\nimport { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition'\nimport { getProfileColorByName } from '@/utils/chats/colors'\nimport { getInitials } from '@/utils/chats/initials'\nimport { warn } from '@/utils/logger/logger'\nimport { Papicons } from '@getpapillon/papicons'\nimport { useTheme } from '@react-navigation/native'\nimport { router, useRouter } from 'expo-router'\nimport { t } from 'i18next'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Platform, View } from 'react-native'\nimport { RefreshControl } from 'react-native-gesture-handler'\nimport Reanimated, { LayoutAnimationConfig, useAnimatedStyle } from 'react-native-reanimated'\nimport { useSafeAreaInsets } from 'react-native-safe-area-context'\n\nconst NewsView = () => {\n  const theme = useTheme()\n  const colors = theme.colors\n  const insets = useSafeAreaInsets()\n\n  const [headerHeight, setHeaderHeight] = useState(0)\n  const bottomTabBarHeight = insets.bottom + 16;\n\n  const [isLoading, setIsLoading] = useState(false)\n  const [isManuallyLoading, setIsManuallyLoading] = useState(false)\n\n  const keyboardHeight = useKeyboardHeight()\n\n  const footerStyle = useAnimatedStyle(() => ({\n    height: keyboardHeight.value - bottomTabBarHeight,\n  }))\n\n  const news = useNews()\n\n  const sortedNews = useMemo(() => {\n    return news.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())\n  }, [news])\n\n  const fetchNews = useCallback(() => {\n    try {\n      setIsLoading(true)\n      const manager = getManager()\n      if (!manager) {\n        warn('Manager is null, skipping news fetch')\n        return\n      }\n      manager.getNews()\n    } catch (error) {\n      console.error('Error fetching news:', error)\n    } finally {\n      setIsLoading(false)\n      setIsManuallyLoading(false)\n    }\n  }, [])\n\n  useEffect(() => {\n    const unsubscribe = subscribeManagerUpdate(() => {\n      fetchNews()\n    })\n\n    return () => unsubscribe()\n  }, [])\n\n  const [searchText, setSearchText] = useState('')\n\n  const filteredNews = useMemo(() => {\n    return sortedNews.filter((item) => item.title.toLowerCase().includes(searchText.toLowerCase()))\n  }, [sortedNews, searchText])\n\n  return (\n    <>\n      <TabHeader\n        onHeightChanged={setHeaderHeight}\n        title={\n          <TabHeaderTitle\n            color={colors.primary}\n            leading={t('Tab_News')}\n            chevron={false}\n            loading={isLoading}\n          />\n        }\n        bottom={<Search placeholder={t('News_Search_Placeholder')} color='#2B7ED6' onTextChange={(text) => setSearchText(text)} />}\n      />\n\n      <LayoutAnimationConfig skipEntering>\n        <List\n          animated\n          contentContainerStyle={{\n            paddingBottom: Platform.OS === \"android\" ? 16 : bottomTabBarHeight + 16,\n            paddingHorizontal: 16,\n            gap: 9,\n          }}\n          refreshControl={\n            <RefreshControl\n              refreshing={isManuallyLoading}\n              onRefresh={() => {\n                setIsManuallyLoading(true)\n                fetchNews()\n              }}\n              progressViewOffset={headerHeight}\n            />\n          }\n          ListFooterComponent={<Reanimated.View style={footerStyle} />}\n          scrollIndicatorInsets={{ top: headerHeight - insets.top }}\n          ListHeaderComponent={<View style={{ height: headerHeight - (Platform.OS === \"ios\" ? insets.top : 0) }} />}\n          ListEmptyComponent={\n            <Dynamic animated key='empty-list:warn' entering={PapillonAppearIn} exiting={PapillonAppearOut}>\n              <Stack\n                hAlign='center'\n                vAlign='center'\n                flex\n                style={{ width: '100%', marginTop: 16 }}\n              >\n                <Icon opacity={0.5} size={32} style={{ marginBottom: 3 }}>\n                  <Papicons name={searchText ? 'Search' : 'Newspaper'} />\n                </Icon>\n                <Typography variant='h4' color='textPrimary' align='center'>\n                  {searchText ? t('News_Search_NoResults') : t('News_Empty_Title')}\n                </Typography>\n                <Typography variant='body2' color='textSecondary' align='center'>\n                  {searchText ? t('News_Search_NoResults_Description') : t('News_Empty_Description')}\n                </Typography>\n              </Stack>\n            </Dynamic>\n          }\n        >\n          {filteredNews.map((item) => {\n            const profileColor = getProfileColorByName(item.author)\n            const profileInitials = getInitials(item.author)\n\n            return (\n              <List.Item\n                key={item.id}\n                id={item.id}\n                onPress={() =>\n                  router.push({\n                    pathname: '/(modals)/news',\n                    params: { news: JSON.stringify(item) },\n                  })\n                }\n              >\n                <List.Leading>\n                  <Avatar\n                    size={40}\n                    color={profileColor}\n                    initials={profileInitials}\n                  />\n                </List.Leading>\n\n                <Typography variant='title' numberOfLines={2}>\n                  {item.title}\n                </Typography>\n                <Typography variant='body1' color='textSecondary' numberOfLines={3}>\n                  {item.content ? truncateString(cleanContent(item.content), 100) : ''}\n                </Typography>\n\n                <Stack\n                  direction='horizontal'\n                  gap={4}\n                  style={{ marginTop: 4 }}\n                  hAlign='center'\n                >\n                  <Typography nowrap weight='medium' style={{ flex: 1 }} variant='caption' color='textSecondary'>\n                    {item.author}\n                  </Typography>\n\n                  <Typography nowrap weight='medium' variant='caption' color='textSecondary'>\n                    {item.createdAt.toLocaleDateString(undefined, {\n                      year: 'numeric',\n                      month: 'short',\n                      day: 'numeric',\n                    })}\n                  </Typography>\n                </Stack>\n\n                {item.attachments.length > 0 && (\n                  <List.Trailing>\n                    <Icon size={18} opacity={0.4}>\n                      <Papicons name='link' />\n                    </Icon>\n                  </List.Trailing>\n                )}\n              </List.Item>\n            )\n          })}\n        </List>\n      </LayoutAnimationConfig>\n    </>\n  )\n}\n\nfunction cleanContent(html: string): string {\n  html = html.replace(/&nbsp;/g, ' ').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '\"').replace(/&apos;/g, \"'\")\n  html = html.replace(/\\n/g, ' ')\n  return html.replace(/<[^>]*>/g, '').replace(/\\s+/g, ' ').trim()\n}\n\nfunction truncateString(str: string, maxLength: number): string {\n  if (str.length <= maxLength) {\n    return str\n  }\n  return str.slice(0, maxLength) + '...'\n}\n\nexport default NewsView\n"
  },
  {
    "path": "app/(tabs)/tasks/_layout.tsx",
    "content": "import { Stack } from \"expo-router\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\n\nexport default function Layout() {\n  const { t } = useTranslation();\n\n  return (\n    <Stack screenOptions={screenOptions}>\n      <Stack.Screen\n        name=\"index\"\n        options={{\n          headerShown: false,\n          headerTitle: t(\"Tab_Tasks\"),\n          headerTransparent: true,\n        }}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "app/(tabs)/tasks/atoms/DateHeader.tsx",
    "content": "import React, { memo } from 'react';\nimport { Pressable, TouchableOpacity } from 'react-native';\nimport Reanimated, {\n  Easing,\n  useAnimatedStyle,\n  withTiming,\n} from 'react-native-reanimated';\nimport { useTheme } from '@react-navigation/native';\nimport { Papicons } from '@getpapillon/papicons';\n\nimport { Dynamic } from '@/ui/components/Dynamic';\nimport Stack from '@/ui/components/Stack';\nimport Typography from '@/ui/components/Typography';\nimport { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';\n\ninterface DateHeaderProps {\n  title: string;\n  isCollapsed: boolean;\n  onToggle: () => void;\n}\n\nconst DateHeader = memo(\n  ({ title, isCollapsed, onToggle }: DateHeaderProps) => {\n    const { colors } = useTheme();\n\n    const papillonEasing = Easing.bezier(0.3, 0.3, 0, 1);\n\n    const animatedStyle = useAnimatedStyle(() => {\n      return {\n        transform: [{ rotate: withTiming(isCollapsed ? '-180deg' : '0deg', { duration: 350, easing: papillonEasing }) }],\n        marginLeft: 'auto'\n      };\n    });\n\n    return (\n      <Dynamic animated key={`header:${title}`} entering={PapillonAppearIn} exiting={PapillonAppearOut}>\n        <TouchableOpacity onPress={onToggle} activeOpacity={0.6}>\n          <Stack\n            direction='horizontal'\n            gap={8}\n            vAlign='center'\n            hAlign='center'\n            padding={[6, 10]}\n            style={{ width: '100%', opacity: isCollapsed ? 0.6 : 1 }}\n          >\n            <Typography variant='h6' color='text' style={{ textTransform: 'capitalize', opacity: 0.6 }}>\n              {title}\n            </Typography>\n\n            <Reanimated.View style={animatedStyle}>\n              <Papicons name=\"ChevronDown\" size={20} color={colors.text} style={{ opacity: 0.6 }} />\n            </Reanimated.View>\n          </Stack>\n        </TouchableOpacity>\n      </Dynamic>\n    );\n  }\n);\nDateHeader.displayName = \"DateHeader\";\n\nexport default DateHeader;\n"
  },
  {
    "path": "app/(tabs)/tasks/atoms/EmptyState.tsx",
    "content": "import { Dynamic } from \"@/ui/components/Dynamic\";\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport { PapillonAppearIn, PapillonAppearOut } from \"@/ui/utils/Transition\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport { t } from \"i18next\";\nimport React, { memo } from \"react\";\n\ninterface EmptyStateProps {\n  isSearching: boolean;\n}\n\nconst EmptyState = memo(({ isSearching }: EmptyStateProps) => (\n  <Dynamic\n    animated\n    key=\"empty-list:warn\"\n    entering={PapillonAppearIn}\n    exiting={PapillonAppearOut}\n  >\n    <Stack hAlign=\"center\" vAlign=\"center\" flex style={{ width: \"100%\" }}>\n      <Icon papicon opacity={0.5} size={32} style={{ marginBottom: 3 }}>\n        <Papicons name={isSearching ? \"Search\" : \"tasks\"} />\n      </Icon>\n      <Typography variant=\"h4\" color=\"text\" align=\"center\">\n        {isSearching ? t(\"Tasks_Search_NoResults\") : t(\"Tasks_NoTasks_Title\")}\n      </Typography>\n      <Typography variant=\"body2\" color=\"secondary\" align=\"center\">\n        {isSearching\n          ? \"Essaie avec un autre mot clé.\"\n          : t(\"Tasks_NoTasks_Description\")}\n      </Typography>\n    </Stack>\n  </Dynamic>\n));\nEmptyState.displayName = \"EmptyState\";\n\nexport default EmptyState;\n"
  },
  {
    "path": "app/(tabs)/tasks/atoms/TasksSummary.tsx",
    "content": "import React from 'react';\nimport Reanimated, { LinearTransition } from 'react-native-reanimated';\nimport { useTheme } from '@react-navigation/native';\n\nimport { CircularProgress } from '@/ui/components/CircularProgress';\nimport Stack from '@/ui/components/Stack';\nimport Typography from '@/ui/components/Typography';\nimport { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';\nimport { Homework } from \"@/services/shared/homework\";\nimport adjust from '@/utils/adjustColor';\n\ninterface TasksSummaryProps {\n  sections: { data: Homework[] }[];\n}\n\nconst TasksSummary: React.FC<TasksSummaryProps> = ({ sections }) => {\n  const theme = useTheme();\n  const colors = theme.colors;\n\n  if (sections.length === 0) {\n    return null;\n  }\n\n  return (\n    <Reanimated.View\n      entering={PapillonAppearIn}\n      exiting={PapillonAppearOut}\n      layout={LinearTransition}\n    >\n      <Stack padding={16} gap={16} backgroundColor={adjust(theme.colors.tint, theme.dark ? 0.2 : 0) + \"22\"} card radius={20} hAlign=\"center\" direction='horizontal' style={{ marginBottom: 16 }} noShadow>\n        <CircularProgress\n          backgroundColor={colors.text + \"22\"}\n          percentageComplete={\n            sections.reduce((acc, section) => acc + section.data.filter(hw => hw.isDone).length, 0) /\n            Math.max(1, sections.reduce((acc, section) => acc + section.data.length, 0)) * 100\n          }\n          radius={15}\n          strokeWidth={5}\n          fill={theme.colors.tint}\n        />\n        <Typography variant=\"title\" color={theme.colors.tint}>\n          {(() => {\n\n            const total = sections.reduce((acc, section) => acc + section.data.length, 0);\n            const undone = sections.reduce((acc, section) => acc + section.data.filter(hw => !hw.isDone).length, 0);\n\n            if (undone === 0) {\n              return \"Toutes les tâches sont terminées !\";\n            }\n\n            return `${undone} tâche${undone !== 1 ? 's' : ''} restante${undone !== 1 ? 's' : ''} cette semaine`;\n          })()}\n        </Typography>\n      </Stack>\n    </Reanimated.View>\n  );\n};\n\nexport default TasksSummary;\n"
  },
  {
    "path": "app/(tabs)/tasks/components/TaskItem.tsx",
    "content": "import React, { memo, useMemo } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Reanimated from 'react-native-reanimated';\n\nimport { Homework } from \"@/services/shared/homework\";\nimport Task from \"@/ui/components/Task\";\nimport { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';\nimport { getSubjectName } from \"@/utils/subjects/name\";\nimport { getSubjectEmoji } from \"@/utils/subjects/emoji\";\nimport { getSubjectColor } from \"@/utils/subjects/colors\";\nimport { useMagicPrediction } from '../hooks/useMagicPrediction';\nimport { useNavigation } from 'expo-router';\n\ninterface TaskItemProps {\n  item: Homework;\n  index: number;\n  fromCache?: boolean;\n  setAsDone: (item: Homework, done: boolean) => void;\n}\n\nconst TaskItem = memo(\n  ({\n    item,\n    fromCache = false,\n    setAsDone\n  }: TaskItemProps) => {\n    const navigation = useNavigation();\n    const cleanContent = useMemo(() => item.content.replace(/<[^>]*>/g, \"\"), [item.content]);\n    const magic = useMagicPrediction(cleanContent);\n\n    return (\n      <Reanimated.View\n        style={{ marginBottom: 10 }}\n        entering={PapillonAppearIn}\n        exiting={PapillonAppearOut}\n      >\n        <Task\n          subject={getSubjectName(item.subject)}\n          emoji={getSubjectEmoji(item.subject)}\n          title={\"\"}\n          color={getSubjectColor(item.subject)}\n          description={item.content}\n          date={new Date(item.dueDate)}\n          completed={item.isDone}\n          hasAttachments={item.attachments.length > 0}\n          magic={magic}\n          onToggle={() => setAsDone(item, !item.isDone)}\n          onPress={() =>\n            // @ts-ignore Modal types\n            navigation.navigate(\"(modals)/task\", {\n              task: item\n            })\n          }\n        />\n      </Reanimated.View>\n    );\n  }\n);\n\nTaskItem.displayName = \"TaskItem\";\nexport default TaskItem;\n"
  },
  {
    "path": "app/(tabs)/tasks/components/TasksHeader.tsx",
    "content": "import { useTheme } from '@react-navigation/native';\nimport { t } from 'i18next';\nimport React, { useMemo } from 'react';\nimport { Platform } from 'react-native';\n\nimport { getDateRangeOfWeek, getWeekNumberFromDate } from '@/database/useHomework';\nimport ChipButton from '@/ui/components/ChipButton';\nimport Search from '@/ui/components/Search';\nimport TabHeader from '@/ui/components/TabHeader';\nimport TabHeaderTitle from '@/ui/components/TabHeaderTitle';\n\nexport type SortMethod = 'date' | 'subject' | 'done';\n\ninterface TasksHeaderProps {\n  defaultWeek: number;\n  selectedWeek: number;\n  onToggleWeekPicker: () => void;\n  setHeaderHeight: (height: number) => void;\n  setShowUndoneOnly: React.Dispatch<React.SetStateAction<boolean>>;\n  setSortMethod: React.Dispatch<React.SetStateAction<SortMethod>>;\n  setSearchTerm: React.Dispatch<React.SetStateAction<string>>;\n  sortMethod: SortMethod;\n  shouldCollapseHeader: boolean;\n}\n\nconst TasksHeader: React.FC<TasksHeaderProps> = ({\n  defaultWeek,\n  selectedWeek,\n  onToggleWeekPicker,\n  setHeaderHeight,\n  setShowUndoneOnly,\n  setSortMethod,\n  setSearchTerm,\n  sortMethod,\n  shouldCollapseHeader,\n}) => {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const sortingOptions = useMemo(\n    () => [\n      { label: t('Tasks_Sorting_Methods_DueDate'), value: \"date\", icon: \"calendar\", papicon: \"calendar\" },\n      { label: t('Tasks_Sorting_Methods_Subject'), value: \"subject\", icon: \"font\", papicon: \"font\" },\n      { label: t('Tasks_Sorting_Methods_Done'), value: \"done\", icon: \"check\", papicon: \"check\" },\n    ],\n    []\n  );\n\n  const activeSortLabel = sortingOptions.find(s => s.value === sortMethod)?.label;\n  const menuTitle = (activeSortLabel || t(\"Tasks_Sort_Default\"));\n\n  return (\n    <TabHeader\n      onHeightChanged={setHeaderHeight}\n      title={\n        <TabHeaderTitle\n          leading={t('Tasks_Week')}\n          subtitle={selectedWeek === defaultWeek ? t('Tasks_ThisWeek') : undefined}\n          number={getWeekNumberFromDate(getDateRangeOfWeek(selectedWeek, new Date().getFullYear()).start).toString()}\n          color='#C54CB3'\n          onPress={onToggleWeekPicker}\n          height={56}\n        />\n      }\n      trailing={\n        <ChipButton\n          onPressAction={({ nativeEvent }) => {\n            const actionId = nativeEvent.event;\n            if (actionId === 'only-undone') {\n              setShowUndoneOnly(prev => !prev);\n            } else if (actionId.startsWith(\"sort:\")) {\n              setSortMethod(actionId.replace(\"sort:\", \"\") as SortMethod);\n            }\n          }}\n          actions={[\n            {\n              title: t('Task_Sorting_Title'),\n              papicon: \"filter\",\n              subactions: sortingOptions.map((method) => ({\n                title: method.label,\n                id: \"sort:\" + method.value,\n                papicon: method.papicon,\n                state: (sortMethod === method.value ? 'on' : 'off'),\n                image: Platform.select({\n                  ios:\n                    method.value === 'date'\n                      ? \"calendar\"\n                      : method.value === 'subject'\n                        ? \"character\"\n                        : \"checkmark.circle\"\n                }),\n                imageColor: colors.text,\n              })),\n              displayInline: true\n            }\n          ]}\n          icon=\"filter\"\n          chevron\n        >\n          {menuTitle}\n        </ChipButton>\n      }\n      bottom={\n        <Search\n          placeholder={t('Tasks_Search_Placeholder')}\n          color='#C54CB3'\n          onTextChange={setSearchTerm}\n          style={{\n            marginTop: 6\n          }}\n        />\n      }\n      shouldCollapseHeader={shouldCollapseHeader}\n    />\n  );\n};\n\nexport default TasksHeader;\n"
  },
  {
    "path": "app/(tabs)/tasks/components/TasksList.tsx",
    "content": "import React, { useCallback } from 'react';\nimport { Platform, RefreshControl, SectionList, StyleSheet } from 'react-native';\nimport Reanimated, {\n  createAnimatedComponent,\n  LinearTransition,\n} from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { Homework } from \"@/services/shared/homework\";\nimport { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';\nimport { generateId } from \"@/utils/generateId\";\n\nimport DateHeader from '../atoms/DateHeader';\nimport EmptyState from '../atoms/EmptyState';\nimport TasksSummary from '../atoms/TasksSummary';\nimport TaskItem from './TaskItem';\n\nconst AnimatedSectionList = createAnimatedComponent(SectionList<Homework, HomeworkSection>);\n\nexport interface HomeworkSection {\n  id: string;\n  title: string;\n  date?: Date;\n  data: Homework[];\n}\n\ninterface TasksListProps {\n  sections: HomeworkSection[];\n  headerHeight: number;\n  searchTerm: string;\n  isRefreshing: boolean;\n  onRefresh: () => void;\n  collapsedGroups: string[];\n  toggleGroup: (headerId: string) => void;\n  sortMethod: string;\n  homework: Record<string, Homework>;\n  setAsDone: (item: Homework, done: boolean) => void;\n}\n\nconst TasksList: React.FC<TasksListProps> = ({\n  sections,\n  headerHeight,\n  searchTerm,\n  isRefreshing,\n  onRefresh,\n  collapsedGroups,\n  toggleGroup,\n  sortMethod,\n  homework,\n  setAsDone,\n}) => {\n  const insets = useSafeAreaInsets();\n\n  const renderItem = useCallback(\n    ({ item, index, section }: { item: Homework, index: number, section: HomeworkSection }) => {\n      if (sortMethod === 'date' && collapsedGroups.includes(section.id)) {\n        return null;\n      }\n      // Generate the same ID used to store homeworks in the homework object\n      const generatedId = generateId(\n        item.subject + item.content + item.createdByAccount + new Date(item.dueDate).toDateString()\n      );\n      const inFresh = homework[generatedId];\n      const source = inFresh ?? item;\n      const fromCache = !inFresh;\n\n      return (\n        <Reanimated.View\n          layout={LinearTransition}\n          entering={PapillonAppearIn}\n          exiting={PapillonAppearOut}\n        >\n          <TaskItem\n            item={source}\n            index={index}\n            fromCache={fromCache}\n            setAsDone={(item, done) => {\n              setAsDone(item, done);\n            }}\n          />\n        </Reanimated.View>\n      );\n    },\n    [homework, setAsDone, collapsedGroups, sortMethod]\n  );\n\n  const renderSectionHeader = useCallback(\n    ({ section }: { section: HomeworkSection }) => {\n      if (!section.title || sortMethod !== 'date') {\n        return null;\n      }\n\n      const isCollapsed = collapsedGroups.includes(section.id);\n\n      return (\n        <Reanimated.View layout={LinearTransition}>\n          <DateHeader\n            title={section.title}\n            isCollapsed={isCollapsed}\n            onToggle={() => toggleGroup(section.id)}\n          />\n        </Reanimated.View>\n      );\n    },\n    [collapsedGroups, sortMethod, toggleGroup]\n  );\n\n  const keyExtractor = useCallback((item: Homework) => {\n    return \"hw:\" + item.subject + item.content + item.createdByAccount + new Date(item.dueDate).toDateString();\n  }, []);\n\n  const bottomTabBarHeight = insets.bottom;\n\n  return (\n    <AnimatedSectionList\n      sections={sections}\n      style={styles.list}\n      contentContainerStyle={{\n        paddingHorizontal: 16,\n        paddingBottom: Platform.OS === \"android\" ? 16 : bottomTabBarHeight + 16,\n        paddingTop: headerHeight + (Platform.OS === 'android' ? 10 : 0),\n      }}\n      keyExtractor={keyExtractor}\n      renderItem={renderItem}\n      scrollIndicatorInsets={{\n        top: headerHeight - insets.top\n      }}\n      renderSectionHeader={renderSectionHeader}\n      ListEmptyComponent={<EmptyState isSearching={searchTerm.length > 0} />}\n      stickySectionHeadersEnabled={false}\n      ListHeaderComponent={\n        searchTerm.trim().length === 0 ? (\n          <TasksSummary sections={sections} />\n        ) : null\n      }\n      refreshControl={\n        <RefreshControl\n          refreshing={isRefreshing}\n          onRefresh={onRefresh}\n          progressViewOffset={headerHeight}\n        />\n      }\n    />\n  );\n};\n\nconst styles = StyleSheet.create({\n  list: {\n    flex: 1,\n    height: '100%',\n  },\n});\n\nexport default TasksList;\n"
  },
  {
    "path": "app/(tabs)/tasks/components/WeekPicker.tsx",
    "content": "import { useTheme } from '@react-navigation/native';\nimport { BlurView } from 'expo-blur';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { FlatList, Pressable, Text, View } from 'react-native';\nimport Reanimated from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { getDateRangeOfWeek, getWeekNumberFromDate } from '@/database/useHomework';\nimport { runsIOS26 } from '@/ui/utils/IsLiquidGlass';\nimport { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';\n\ninterface WeekPickerProps {\n  selectedWeek: number;\n  onSelectWeek: (week: number) => void;\n  onClose: () => void;\n}\n\nconst WeekPicker: React.FC<WeekPickerProps> = ({ selectedWeek, onSelectWeek, onClose }) => {\n  const { colors } = useTheme();\n  const insets = useSafeAreaInsets();\n  const WeekPickerRef = useRef<FlatList>(null);\n\n  const layoutPicker = useCallback(() => {\n    if (WeekPickerRef.current) {\n      const offset = selectedWeek * 60;\n      WeekPickerRef.current.scrollToOffset({\n        offset,\n        animated: false,\n      });\n    }\n  }, [selectedWeek]);\n\n  const [weekLimit, setWeekLimit] = useState(60);\n\n  const loadMoreWeeks = useCallback(() => {\n    setWeekLimit((prev) => prev + 26);\n  }, []);\n\n  const handleWeekScroll = useCallback((event: { nativeEvent: { contentOffset: { x: number } } }) => {\n    const contentOffsetX = event.nativeEvent.contentOffset.x;\n    const itemWidth = 60;\n    const index = Math.round(contentOffsetX / itemWidth);\n    if (index < 0 || index >= weekLimit) { return; }\n    requestAnimationFrame(() => {\n      onSelectWeek(index);\n    });\n  }, [onSelectWeek]);\n\n  return (\n    <Reanimated.View\n      style={{\n        position: \"absolute\",\n        top: insets.top + 50,\n        left: 16,\n        alignSelf: \"flex-start\",\n        borderRadius: 16,\n        zIndex: 1000000,\n        transformOrigin: \"center top\",\n      }}\n      entering={PapillonAppearIn}\n      exiting={PapillonAppearOut}\n    >\n      <BlurView\n        style={{\n          height: 60,\n          width: 300,\n          borderRadius: 16,\n          overflow: \"hidden\",\n          boxShadow: \"0px 10px 30px rgba(0, 0, 0, 0.15)\",\n        }}\n      >\n        <View\n          style={{\n            position: \"absolute\",\n            alignSelf: \"center\",\n            top: 5,\n            height: 50,\n            width: 50,\n            borderRadius: 16,\n            borderCurve: \"continuous\",\n            borderWidth: 2,\n            borderColor: \"#C54CB3\",\n          }}\n        />\n\n        <FlatList\n          onLayout={() => {\n            layoutPicker();\n          }}\n          data={Array.from({ length: weekLimit }, (_, i) => i)}\n          onEndReached={loadMoreWeeks}\n          onEndReachedThreshold={2}\n          windowSize={5}\n          initialScrollIndex={selectedWeek}\n          getItemLayout={(data, index) => (\n            { length: 60, offset: 60 * index, index }\n          )}\n          keyExtractor={(item) => \"picker:\" + item.toString()}\n          horizontal\n          removeClippedSubviews={true}\n          showsHorizontalScrollIndicator={false}\n          style={{\n            flexGrow: 0,\n            height: 100,\n            width: 300,\n          }}\n          contentContainerStyle={{\n            alignItems: \"center\",\n            gap: 0,\n            paddingLeft: 300 / 2 - 30,\n            paddingRight: 300 / 2 - 30,\n          }}\n          snapToInterval={60}\n          decelerationRate=\"fast\"\n          ref={WeekPickerRef}\n          initialNumToRender={10}\n          onScroll={handleWeekScroll}\n          renderItem={({ item }) => (\n            <Pressable\n              onPress={() => {\n                onSelectWeek(item);\n                onClose();\n              }}\n              style={[\n                {\n                  width: 40,\n                  height: 40,\n                  margin: 10,\n                  borderRadius: 12,\n                  borderCurve: \"continuous\",\n                  backgroundColor: runsIOS26 ? colors.text + \"10\" : colors.background,\n                  borderColor: colors.text + \"22\",\n                  borderWidth: 1,\n                  alignItems: \"center\",\n                  justifyContent: \"center\",\n                },\n                item === selectedWeek && {\n                  backgroundColor: \"#C54CB3\",\n                  boxShadow: \"0px 1px 6px rgba(0, 0, 0, 0.15)\",\n                }\n              ]}\n            >\n              <Text\n                style={{\n                  color: item === selectedWeek ? \"#FFF\" : colors.text,\n                  fontSize: 16,\n                  fontFamily: item === selectedWeek ? \"bold\" : \"medium\",\n                }}\n              >\n                {getWeekNumberFromDate(getDateRangeOfWeek(item, new Date().getFullYear()).start)}\n              </Text>\n            </Pressable>\n          )}\n        />\n      </BlurView>\n    </Reanimated.View>\n  );\n};\n\nexport default WeekPicker;\n"
  },
  {
    "path": "app/(tabs)/tasks/hooks/useHomeworkData.ts",
    "content": "import { useState, useCallback, useEffect, useMemo } from 'react';\nimport { useAccountStore } from \"@/stores/account\";\nimport { getManager, subscribeManagerUpdate } from \"@/services/shared\";\nimport { Homework } from \"@/services/shared/homework\";\nimport { useHomeworkForWeek, updateHomeworkIsDone } from \"@/database/useHomework\";\nimport { generateId } from \"@/utils/generateId\";\nimport { error } from '@/utils/logger/logger';\nimport { notificationAsync, NotificationFeedbackType } from \"expo-haptics\";\n\nexport const useHomeworkData = (selectedWeek: number, alert: any) => {\n  const [isRefreshing, setIsRefreshing] = useState(false);\n  const [refreshTrigger, setRefreshTrigger] = useState(0);\n  const [homework, setHomework] = useState<Record<string, Homework>>({});\n\n  const store = useAccountStore.getState();\n  const account = store.accounts.find(acc => acc.id === store.lastUsedAccount);\n  type Service = { id: string };\n  const services = useMemo(() => account?.services?.map((s: Service) => s.id) ?? [], [account]);\n  const manager = getManager();\n\n  const homeworksFromCache = useHomeworkForWeek(selectedWeek, refreshTrigger)\n    .filter(h => services.includes(h.createdByAccount));\n\n  const fetchHomeworks = useCallback(\n    async (managerToUse = manager) => {\n      if (!managerToUse) { return; }\n      try {\n        const result: Homework[] = await managerToUse.getHomeworks(selectedWeek);\n        result.sort((a, b) => new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime());\n        const newHomeworks: Record<string, Homework> = {};\n        for (const hw of result) {\n          const id = generateId(\n            hw.subject + hw.content + hw.createdByAccount + hw.dueDate.toDateString()\n          );\n          newHomeworks[id] = { ...hw, id: hw.id ?? id };\n        }\n        setHomework(newHomeworks);\n        setRefreshTrigger(p => p + 1);\n      } catch (e) {\n        error(\"Fetch error\", String(e));\n      }\n    },\n    [selectedWeek, manager]\n  );\n\n  useEffect(() => {\n    fetchHomeworks();\n    const unsubscribe = subscribeManagerUpdate((updatedManager) => {\n      fetchHomeworks(updatedManager);\n    });\n    return () => unsubscribe();\n  }, [selectedWeek, fetchHomeworks]);\n\n  const handleRefresh = useCallback(async () => {\n    setIsRefreshing(true);\n    await fetchHomeworks();\n    setIsRefreshing(false);\n  }, [fetchHomeworks]);\n\n  const setAsDone = useCallback(\n    async (item: Homework, done: boolean) => {\n      const id = generateId(\n        item.subject +\n        item.content +\n        item.createdByAccount +\n        new Date(item.dueDate).toDateString()\n      );\n\n      try {\n        const manager = getManager();\n        await manager.setHomeworkCompletion(item, done)\n\n        updateHomeworkIsDone(id, done);\n        \n        setRefreshTrigger(prev => prev + 1);\n        setHomework(prev => ({\n          ...prev,\n          [id]: {\n            ...(prev[id] ?? item),\n            isDone: done,\n          }\n        }));\n        if (done) {\n          notificationAsync(NotificationFeedbackType.Success);\n        }\n      }\n      catch (err) {\n        alert.showAlert({\n            title: \"Une erreur est survenue\",\n            message: \"Ce devoir n'a pas été mis à jour\",\n            description:\n              \"Nous n'avons pas réussi à mettre à jour l'état du devoir, si ce devoir est important, merci de vous rendre sur l'application officielle de ton établissement afin de définir son état.\",\n            color: \"#D60046\",\n            icon: \"AlertTriangle\",\n            technical: String(err)\n          });\n\n        updateHomeworkIsDone(id, !done);\n        setRefreshTrigger(prev => prev + 1);\n        setHomework(prev => ({\n          ...prev,\n          [id]: {\n            ...(prev[id] ?? item),\n            isDone: !done,\n          }\n        }));\n      }\n    },\n    []\n  );\n\n  return {\n    homework,\n    homeworksFromCache,\n    isRefreshing,\n    handleRefresh,\n    setAsDone,\n  };\n};"
  },
  {
    "path": "app/(tabs)/tasks/hooks/useMagicPrediction.ts",
    "content": "import { useState, useEffect } from 'react';\nimport { useSettingsStore } from \"@/stores/settings\";\nimport { predictHomework } from \"@/utils/magic/prediction\";\nimport { error } from '@/utils/logger/logger';\n\nexport const useMagicPrediction = (content: string) => {\n  const [magic, setMagic] = useState<string | undefined>(undefined);\n  const magicEnabled = useSettingsStore(state => state.personalization.magicEnabled);\n\n  useEffect(() => {\n    let isCancelled = false;\n    if (content && magicEnabled) {\n      predictHomework(content, magicEnabled)\n        .then(p => !isCancelled && setMagic(p))\n        .catch(e => !isCancelled && error(e));\n    } else {\n      setMagic(undefined);\n    }\n    return () => {\n      isCancelled = true;\n    };\n  }, [content, magicEnabled]);\n\n  return magic;\n};\n"
  },
  {
    "path": "app/(tabs)/tasks/hooks/useTaskFilters.ts",
    "content": "import { useState, useMemo, useCallback } from 'react';\nimport { t } from 'i18next';\nimport { Homework } from \"@/services/shared/homework\";\nimport { getSubjectName } from \"@/utils/subjects/name\";\n\nexport type SortMethod = 'date' | 'subject' | 'done';\n\nconst normalize = (value: string) =>\n  value\n    .toLowerCase()\n    .normalize(\"NFD\")\n    .replace(/[\\u0300-\\u036f]/g, \"\");\n\nconst formatDateHeader = (date: Date): string => {\n  return date.toLocaleDateString(undefined, { weekday: 'long', day: 'numeric', month: 'long' });\n};\n\nexport interface HomeworkSection {\n  id: string;\n  title: string;\n  date?: Date;\n  data: Homework[];\n}\n\nexport const useTaskFilters = (\n  homeworksFromCache: Homework[],\n  homework: Record<string, Homework>\n) => {\n  const [searchTerm, setSearchTerm] = useState(\"\");\n  const [showUndoneOnly, setShowUndoneOnly] = useState(false);\n  const [sortMethod, setSortMethod] = useState<SortMethod>(\"date\");\n  const [collapsedGroups, setCollapsedGroups] = useState<string[]>([]);\n\n  const toggleGroup = useCallback((headerId: string) => {\n    setCollapsedGroups(prev => {\n      if (prev.includes(headerId)) {\n        return prev.filter(id => id !== headerId);\n      }\n      return [...prev, headerId];\n    });\n  }, []);\n\n  const sections = useMemo<HomeworkSection[]>(() => {\n    const mergedData = homeworksFromCache.map(cached => {\n      const fresh = cached.id && homework[cached.id];\n      return fresh || cached;\n    });\n\n    const uniqueIds = new Set<string>();\n    let data = mergedData.filter(hw => {\n      if (hw.id) {\n        if (!uniqueIds.has(hw.id)) {\n          uniqueIds.add(hw.id);\n          return true;\n        }\n        return false;\n      }\n      return true;\n    });\n\n    if (showUndoneOnly) {\n      data = data.filter(h => !h.isDone);\n    }\n\n    if (searchTerm.trim().length > 0) {\n      const term = normalize(searchTerm);\n      data = data.filter(h => {\n        const cleanContent = h.content.replace(/<[^>]*>/g, \"\");\n        const normalizedContent = normalize(cleanContent);\n        const normalizedSubject = normalize(h.subject);\n        const normalizedSubjectName = normalize(getSubjectName(h.subject));\n        return (\n          normalizedContent.includes(term) ||\n          normalizedSubject.includes(term) ||\n          normalizedSubjectName.includes(term)\n        );\n      });\n    }\n\n    if (sortMethod === 'date') {\n      data.sort((a, b) => new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime());\n    } else if (sortMethod === 'subject') {\n      data.sort((a, b) => a.subject.localeCompare(b.subject));\n    } else if (sortMethod === 'done') {\n      data.sort((a, b) => Number(a.isDone) - Number(b.isDone));\n    }\n\n    const isSearching = searchTerm.trim().length > 0;\n\n    if (sortMethod === 'date' && !isSearching) {\n      const sectionMap = new Map<string, HomeworkSection>();\n\n      data.forEach((hw) => {\n        const hwDate = new Date(hw.dueDate);\n        const dateKey = hwDate.toDateString();\n        const headerId = `header-${dateKey}`;\n\n        if (!sectionMap.has(dateKey)) {\n          sectionMap.set(dateKey, {\n            id: headerId,\n            title: formatDateHeader(hwDate),\n            date: hwDate,\n            data: []\n          });\n        }\n\n        sectionMap.get(dateKey)!.data.push(hw);\n      });\n\n      return Array.from(sectionMap.values());\n    }\n\n    return [\n      {\n        id: 'all',\n        title: '',\n        data\n      }\n    ];\n  }, [homeworksFromCache, homework, showUndoneOnly, searchTerm, sortMethod]);\n\n  return {\n    searchTerm,\n    setSearchTerm,\n    showUndoneOnly,\n    setShowUndoneOnly,\n    sortMethod,\n    setSortMethod,\n    collapsedGroups,\n    toggleGroup,\n    sections,\n  };\n};"
  },
  {
    "path": "app/(tabs)/tasks/hooks/useWeekSelection.ts",
    "content": "import { useState, useCallback } from 'react';\nimport { getWeekNumberFromDate } from \"@/database/useHomework\";\n\nexport const useWeekSelection = () => {\n  const currentDate = new Date();\n  const defaultWeek = getWeekNumberFromDate(currentDate);\n  const [selectedWeek, setSelectedWeek] = useState<number>(defaultWeek);\n  const [showWeekPicker, setShowWeekPicker] = useState(false);\n\n  const toggleWeekPicker = useCallback(() => {\n    setShowWeekPicker((prev) => !prev);\n  }, []);\n\n  const onSelectWeek = useCallback((week: number) => {\n    setSelectedWeek(week);\n  }, []);\n\n  return {\n    defaultWeek,\n    selectedWeek,\n    setSelectedWeek,\n    showWeekPicker,\n    setShowWeekPicker,\n    toggleWeekPicker,\n    onSelectWeek,\n  };\n};\n"
  },
  {
    "path": "app/(tabs)/tasks/index.tsx",
    "content": "import React, { useState } from 'react';\nimport { Platform, StyleSheet, View } from 'react-native';\n\nimport TasksHeader from './components/TasksHeader';\nimport TasksList from './components/TasksList';\nimport WeekPicker from './components/WeekPicker';\nimport { useHomeworkData } from './hooks/useHomeworkData';\nimport { useTaskFilters } from './hooks/useTaskFilters';\nimport { useWeekSelection } from './hooks/useWeekSelection';\n\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport { useTheme } from '@react-navigation/native';\n\nconst TasksView: React.FC = () => {\n  const alert = useAlert();\n  const [headerHeight, setHeaderHeight] = useState(0);\n  const [shouldCollapseHeader, setShouldCollapseHeader] = useState(false);\n\n  const {\n    defaultWeek,\n    selectedWeek,\n    showWeekPicker,\n    toggleWeekPicker,\n    onSelectWeek,\n    setShowWeekPicker,\n  } = useWeekSelection();\n\n  const {\n    homework,\n    homeworksFromCache,\n    isRefreshing,\n    handleRefresh,\n    setAsDone,\n  } = useHomeworkData(selectedWeek, alert);\n\n  const {\n    searchTerm,\n    setSearchTerm,\n    showUndoneOnly,\n    setShowUndoneOnly,\n    sortMethod,\n    setSortMethod,\n    collapsedGroups,\n    toggleGroup,\n    sections,\n  } = useTaskFilters(homeworksFromCache, homework);\n\n  const theme = useTheme();\n\n  return (\n    <>\n      {showWeekPicker && (\n        <WeekPicker\n          selectedWeek={selectedWeek}\n          onSelectWeek={onSelectWeek}\n          onClose={() => setShowWeekPicker(false)}\n        />\n      )}\n      <View style={[styles.container]}>\n        <TasksHeader\n          defaultWeek={defaultWeek}\n          selectedWeek={selectedWeek}\n          onToggleWeekPicker={toggleWeekPicker}\n          setHeaderHeight={setHeaderHeight}\n          setShowUndoneOnly={setShowUndoneOnly}\n          setSortMethod={setSortMethod}\n          setSearchTerm={setSearchTerm}\n          sortMethod={sortMethod}\n          shouldCollapseHeader={shouldCollapseHeader}\n        />\n\n        <TasksList\n          sections={sections}\n          headerHeight={headerHeight}\n          searchTerm={searchTerm}\n          isRefreshing={isRefreshing}\n          onRefresh={handleRefresh}\n          collapsedGroups={collapsedGroups}\n          toggleGroup={toggleGroup}\n          sortMethod={sortMethod}\n          homework={homework}\n          setAsDone={setAsDone}\n        />\n      </View>\n    </>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n});\n\nexport default TasksView;"
  },
  {
    "path": "app/_layout.tsx",
    "content": "\nimport 'react-native-reanimated';\nimport \"@/utils/i18n\";\n\nimport { Buffer } from 'buffer';\nimport React from 'react';\n\nimport { AppProviders } from '@/components/AppProviders';\nimport FakeSplash from '@/components/FakeSplash';\nimport { RootNavigator } from '@/components/RootNavigator';\nimport { useAppInitialization } from '@/hooks/useAppInitialization';\n\n// Polyfill Buffer\nglobal.Buffer = Buffer;\n\nexport default function RootLayout() {\n  const { isAppReady, fontsLoaded } = useAppInitialization();\n\n  if (!fontsLoaded) {\n    return null;\n  }\n\n  return (\n    <AppProviders>\n      <FakeSplash isAppReady={isAppReady} instant={true} />\n      <RootNavigator />\n    </AppProviders>\n  );\n}"
  },
  {
    "path": "app/alert.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport { useLocalSearchParams, useRouter } from \"expo-router\";\nimport * as LucideIcons from \"lucide-react-native\";\nimport { type ComponentType, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport React, { Platform, Pressable, Text, View } from \"react-native\";\nimport Reanimated, { Easing, LinearTransition } from \"react-native-reanimated\";\n\nimport { Alert, useAlert } from \"@/ui/components/AlertProvider\";\nimport Button from \"@/ui/components/Button\";\nimport Typography from \"@/ui/components/Typography\";\nimport { runsIOS26 } from \"@/ui/utils/IsLiquidGlass\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport Icon from \"@/ui/components/Icon\";\n\nexport default function AlertModal() {\n  const { t } = useTranslation();\n  const { colors } = useTheme();\n  const searchParams = useLocalSearchParams();\n  const params = JSON.parse(searchParams.data as string) as unknown as Alert;\n  const callbackId = searchParams.callbackId as string | undefined;\n  const router = useRouter();\n  const { getCallback, cleanupCallback } = useAlert();\n  const IconComponent = useMemo(() => {\n    if (!params.icon) {\n      return null;\n    }\n    return <Papicons name={params.icon} />;\n  }, [params.icon]);\n\n  const [showTechnicalDetails, setShowTechnicalDetails] = useState(false);\n\n  useEffect(() => {\n    return () => {\n      if (callbackId) {\n        cleanupCallback(callbackId);\n      }\n    };\n  }, [callbackId, cleanupCallback]);\n\n  return (\n    <View\n      style={{\n        padding: 18,\n        paddingTop: 20,\n        gap: 22,\n        marginBottom: runsIOS26 ? -32 : 0,\n        alignSelf: \"center\",\n      }}\n    >\n      <View\n        style={{\n          width: \"100%\",\n          minWidth: \"100%\",\n          height: 160,\n          backgroundColor: params.color ? params.color + \"22\" : \"#ccc\",\n          borderRadius: 24,\n          borderCurve: \"continuous\",\n          justifyContent: \"center\",\n          alignItems: \"center\",\n        }}\n      >\n        {/* icon */}\n        {IconComponent ? (\n          <Icon size={96} fill={params.color ?? colors.primary}>\n            {IconComponent}\n          </Icon>\n        ) : null}\n      </View>\n\n      <View\n        style={{\n          paddingHorizontal: 6,\n          gap: 8,\n          width: \"100%\",\n        }}\n      >\n        <Typography variant=\"h3\">{params.title}</Typography>\n        <Typography variant=\"body1\" color=\"secondary\">{params.description ?? params.message}</Typography>\n      </View>\n\n      {params.technical && (\n        <Reanimated.View\n          style={[\n            {\n              paddingHorizontal: 6,\n              gap: 0,\n              width: \"100%\",\n              borderRadius: 16,\n              borderCurve: \"continuous\",\n              marginTop: -8,\n              overflow: \"hidden\",\n              zIndex: 1000,\n            },\n            showTechnicalDetails && {\n              backgroundColor: \"#222\",\n              paddingHorizontal: 16,\n              paddingVertical: 12,\n              gap: 8,\n            }\n          ]}\n          layout={Platform.OS === \"ios\" ? LinearTransition.duration(200).easing(Easing.inOut(Easing.quad)) : undefined}\n        >\n          <Pressable\n            style={{\n              flexDirection: \"row\",\n              gap: 6,\n              width: \"100%\",\n              justifyContent: \"space-between\",\n              alignItems: \"center\",\n              marginVertical: -2,\n            }}\n            onPress={() => {\n              setShowTechnicalDetails(!showTechnicalDetails);\n            }}\n          >\n            <Typography variant=\"h6\" color={showTechnicalDetails ? \"#FFF\" : colors.primary}>{t('Alert_TechnicalDetails')}</Typography>\n\n            {showTechnicalDetails\n              ? <LucideIcons.ChevronUp color={showTechnicalDetails ? \"#FFF\" : colors.primary} size={24} strokeWidth={2.5} />\n              : <LucideIcons.ChevronDown color={showTechnicalDetails ? \"#FFF\" : colors.primary} size={24} strokeWidth={2.5} />}\n          </Pressable>\n\n          {showTechnicalDetails && (\n            <Reanimated.ScrollView\n              style={{\n                maxHeight: 120,\n                width: \"100%\",\n              }}\n            >\n              <Text\n                style={{\n                  color: \"#FFF\",\n                  fontSize: 14,\n                  lineHeight: 20,\n                  fontFamily: Platform.OS === 'ios' ? \"Courier\" : \"monospace\",\n                  textAlign: \"left\",\n                }}\n                selectable\n              >\n                {params.technical ? params.technical.trim() : \"Aucune information technique disponible.\"}\n              </Text>\n            </Reanimated.ScrollView>\n          )}\n        </Reanimated.View>\n      )}\n\n      <Reanimated.View\n        style={{\n          paddingHorizontal: 6,\n          gap: 8,\n          marginBottom: 4,\n          minWidth: \"100%\",\n          alignSelf: \"stretch\",\n          flex: 1\n        }}\n        layout={LinearTransition.duration(200).easing(Easing.inOut(Easing.quad))}\n      >\n        <Button\n          title={params.customButton ? params.customButton.label : \"OK\"}\n          onPress={() => {\n            const callback = callbackId ? getCallback(callbackId) : null;\n\n            router.back();\n\n            if (callback) {\n              callback();\n            }\n          }}\n        />\n      </Reanimated.View>\n    </View>\n  )\n};"
  },
  {
    "path": "app/changelog.tsx",
    "content": "import Typography from \"@/ui/components/Typography\";\nimport React from \"react\";\nimport { View, ScrollView, Image } from \"react-native\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\n\nexport default function ChangelogScreen() {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  return (\n    <ScrollView\n      style={{ flex: 1 }}\n      contentContainerStyle={{\n        padding: 20,\n        gap: 12,\n        justifyContent: \"center\",\n      }}\n      showsVerticalScrollIndicator={false}\n      contentInsetAdjustmentBehavior=\"automatic\"\n    >\n      <Image\n        source={require(\"../assets/images/icon.png\")}\n        style={{ width: 72, height: 72, alignSelf: \"center\", borderRadius: 20, marginBottom: 8 }}\n      />\n      <Typography variant=\"h3\" align=\"center\">\n        Bienvenue sur Papillon v8\n      </Typography>\n      <Typography variant=\"body1\" color=\"secondary\" align=\"center\">\n        Cette mise à jour a été repensée de fond en comble pour améliorer votre expérience. Mais cela prend du temps, nous faisons de notre mieux pour faire de cette version la meilleure possible.\n      </Typography>\n\n      <View style={{ height: 16 }} />\n\n      <Papicons name=\"clock\" size={32} color={colors.text} style={{ alignSelf: \"center\" }} />\n      <Typography variant=\"h4\" align=\"center\">\n        Pourquoi tout changer ?\n      </Typography>\n      <Typography variant=\"body1\" color=\"secondary\" align=\"center\">\n        Vous évoluez, nous aussi ! Papillon n'a jamais cessé de grandir depuis des années, et nous nous devons d'utiliser une application modernisée afin d'offrir la meilleure expérience et de garantir le futur de l'application.\n      </Typography>\n      <Typography variant=\"body1\" color=\"primary\" align=\"center\">\n        Ce processus prend énormément de temps, et en tant qu'étudiants et lycéens, on doit aussi aller en cours, donc on fait ce qu'on peut avec ce qu'on à !\n      </Typography>\n      <Typography variant=\"caption\" color=\"secondary\" align=\"center\">\n        (Si vous aimez ce qu'on fait, n'hésitez pas à nous soutenir depuis les paramètres !)\n      </Typography>\n\n      <View style={{ height: 16 }} />\n\n      <Papicons name=\"ghost\" size={32} color={colors.text} style={{ alignSelf: \"center\" }} />\n      <Typography variant=\"h4\" align=\"center\">\n        Il manque (telle ou telle) fonctionnalité ?\n      </Typography>\n      <Typography variant=\"body1\" color=\"secondary\" align=\"center\">\n        Pour vous permettre d'utiliser Papillon dès la rentrée, l'application est sortie plus lègere en fonctionnalités que prévu. Nous travaillons d'arrache-pied pour réintégrer les fonctionnalités manquantes au plus vite.\n      </Typography>\n\n      <View style={{ height: 16 }} />\n\n      <Papicons name=\"unlock\" size={32} color={colors.text} style={{ alignSelf: \"center\" }} />\n      <Typography variant=\"h4\" align=\"center\">\n        J'ai un bug avec (quelque chose) !\n      </Typography>\n      <Typography variant=\"body1\" color=\"secondary\" align=\"center\">\n        Il est possible que certaines choses ne fonctionnent pas. Si la télémétrie est activée, vos bugs nous seront automatiquement parvenus, sinon, n'hésitez pas à nous contacter (Paramètres {\">\"} À propos)\n      </Typography>\n\n      <View style={{ height: 16 }} />\n\n      <Papicons name=\"heart\" size={32} color={colors.text} style={{ alignSelf: \"center\" }} />\n      <Typography variant=\"h4\" align=\"center\">\n        Merci d'être là depuis le début !\n      </Typography>\n      <Typography variant=\"body1\" color=\"secondary\" align=\"center\">\n        Nous apprécions votre soutien et vos retours. N'hésitez pas à nous faire part de vos suggestions ou de vos problèmes sur les réseaux sociaux ou par email.\n      </Typography>\n    </ScrollView>\n  );\n};"
  },
  {
    "path": "app/consent.tsx",
    "content": "import React, { useEffect, useMemo, useState } from \"react\";\nimport { Image, Linking, ScrollView, StyleSheet, View } from \"react-native\";\n\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport i18n from \"@/utils/i18n\";\nconst t = i18n.t.bind(i18n);\nimport { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport { useRouter } from \"expo-router\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport Button from \"@/ui/components/Button\";\nimport Icon from \"@/ui/components/Icon\";\nimport { checkConsent, setConsent } from \"@/utils/logger/consent\";\n\nexport default function ConsentScreen() {\n  const insets = useSafeAreaInsets();\n\n  const router = useRouter();\n\n  const [currentConsent, setCurrentConsent] = useState<string | null>(null);\n\n  const theme = useTheme();\n  const { colors } = theme;\n\n  useEffect(() => {\n    checkConsent().then((consent) => {\n      if (consent.given) {\n        if (consent.advanced) {\n          setCurrentConsent(\"advanced\");\n        } else if (consent.optional) {\n          setCurrentConsent(\"optional\");\n        } else if (consent.required) {\n          setCurrentConsent(\"required\");\n        } else {\n          setCurrentConsent(null);\n        }\n      }\n    });\n  }, []);\n\n  console.log(\"currentConsent\", currentConsent)\n\n  const consents = [\n    {\n      key: \"advanced\",\n      title: t(\"Consent_Advanced_Title\"),\n      description: t(\"Consent_Advanced_Description\"),\n      icon: \"emoji\",\n      color: \"#C50083\"\n    },\n    {\n      key: \"optional\",\n      title: t(\"Consent_Required_Title\"),\n      description: t(\"Consent_Required_Description\"),\n      icon: \"ghost\",\n      color: \"#0080C5\"\n    },\n    {\n      key: \"none\",\n      title: t(\"Consent_None_Title\"),\n      description: t(\"Consent_None_Description\"),\n      icon: \"cross\",\n      color: \"#5A5A5A\"\n    }\n  ];\n\n  const accent = useMemo(() => {\n    return consents.find(c => c.key === currentConsent)?.color || theme.colors.primary;\n  }, [currentConsent, theme]);\n\n  const saveConsentState = async (consent: string) => {\n    await setConsent(consent as \"none\" | \"required\" | \"optional\" | \"advanced\");\n    router.back();\n  };\n\n  return (\n    <View\n      style={{ flex: 1 }}\n    >\n      <LinearGradient\n        colors={[accent, colors.background]}\n        style={{\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          right: 0,\n          height: 400,\n          zIndex: -1,\n          opacity: 0.2,\n        }}\n      />\n\n      <ScrollView\n        style={{ flex: 1 }}\n        contentContainerStyle={{\n          padding: 16,\n          paddingTop: insets.top + 40,\n          gap: 16,\n        }}\n        showsVerticalScrollIndicator={false}\n      >\n        <Stack gap={16} style={{ marginBottom: 8 }}>\n          <Image\n            source={require(\"../assets/images/papillon_heart.png\")}\n            style={{ width: 98, height: 72, alignSelf: \"center\" }}\n          />\n          <Typography variant=\"h2\" color=\"text\" align=\"center\" style={{ width: \"100%\" }}>\n            {t(\"Consent_Title\")}\n          </Typography>\n          <Typography variant=\"body1\" color=\"secondary\" align=\"center\">\n            {t(\"Consent_Intro1\")}\n          </Typography>\n        </Stack>\n\n        <View\n          style={{\n            gap: 12,\n          }}\n        >\n          {consents.map((consent) => (\n            <AnimatedPressable\n              style={{\n                width: \"100%\",\n              }}\n              onPress={() => { setCurrentConsent(consent.key) }}\n              key={consent.key}\n            >\n              <View\n                style={{\n                  paddingHorizontal: 16,\n                  paddingVertical: 13,\n                  flexDirection: \"row\",\n                  alignItems: \"center\",\n                  gap: 16,\n                  borderColor: currentConsent === consent.key ? consent.color : colors.border,\n                  borderWidth: 1,\n                  borderRadius: 25,\n                  borderCurve: 'continuous',\n                  backgroundColor: currentConsent === consent.key ? consent.color + \"20\" : colors.background,\n                }}\n              >\n                <Papicons name={consent.icon} size={32} color={currentConsent !== consent.key ? colors.text + \"50\" : consent.color} />\n                <View\n                  style={{\n                    gap: 1,\n                    flex: 1,\n                    width: \"100%\",\n                  }}\n                >\n                  <Typography variant=\"title\" color=\"text\">\n                    {consent.title}\n                  </Typography>\n                  <Typography variant=\"caption\" color=\"secondary\">\n                    {consent.description}\n                  </Typography>\n                </View>\n              </View>\n            </AnimatedPressable>\n          ))}\n        </View>\n\n        <Stack style={{ paddingLeft: 10, marginTop: 10 }} gap={15}>\n          <Stack direction=\"horizontal\" gap={10} vAlign=\"center\" hAlign=\"center\">\n            <Icon>\n              <Papicons name=\"check\" color={colors.text + \"80\"} />\n            </Icon>\n            <Typography variant=\"body1\" style={{ flex: 1 }} color=\"secondary\">\n              {t(\"Consent_Arg1\")}\n            </Typography>\n          </Stack>\n          <Stack direction=\"horizontal\" gap={10} vAlign=\"center\" hAlign=\"center\">\n            <Icon>\n              <Papicons name=\"link\" size={24} color={colors.text + \"80\"} />\n            </Icon>\n            <Typography variant=\"body1\" style={{ flex: 1 }} color=\"secondary\">\n              {t(\"Consent_Arg2\")}\n            </Typography>\n          </Stack>\n          <Stack direction=\"horizontal\" gap={10} vAlign=\"center\" hAlign=\"center\">\n            <Icon>\n              <Papicons name=\"lock\" size={24} color={colors.text + \"80\"} />\n            </Icon>\n            <Typography variant=\"body1\" style={{ flex: 1 }} color=\"secondary\">\n              {t(\"Consent_Arg3\")}\n            </Typography>\n          </Stack>\n          <Typography onPress={() => Linking.openURL(\"https://docs.papillon.bzh/privacy-policy\")} variant=\"caption\" color={accent} align=\"center\" style={{ textDecorationLine: \"underline\", marginTop: 10 }}>\n            {t(\"Consent_PrivacyPolicy\")}\n          </Typography>\n        </Stack>\n\n      </ScrollView>\n      <View\n        style={{\n          padding: 16,\n          paddingBottom: insets.bottom + 12,\n          borderTopWidth: StyleSheet.hairlineWidth,\n          borderColor: \"#888888\",\n          gap: 12,\n        }}\n      >\n        <Button\n          disabled={currentConsent === null}\n          onPress={() => { if (currentConsent) { saveConsentState(currentConsent) } }}\n          inline\n          style={{\n            backgroundColor: currentConsent === null ? colors.text + \"50\" : accent,\n          }}\n          icon={\n            <Papicons name={currentConsent === \"none\" ? \"cross\" : \"check\"} color=\"#FFFFFF\" />\n          }\n          title={currentConsent === \"none\" ? t(\"Consent_Refuse\") : t(\"Consent_Accept\")}\n        />\n\n        <Typography variant=\"caption\" color=\"secondary\" align=\"center\">\n          {t(\"Consent_ChangeMind\")}\n        </Typography>\n      </View>\n    </View>\n  );\n};"
  },
  {
    "path": "app/demo.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport { Hamburger } from \"lucide-react-native\";\nimport React, { ScrollView, StyleSheet, View } from \"react-native\";\n\nimport { Papicons } from \"@getpapillon/papicons\";\nimport Course from \"@/ui/components/Course\";\nimport Item, { Leading, Trailing } from \"@/ui/components/Item\";\nimport List from \"@/ui/components/List\";\nimport Typography from \"@/ui/components/Typography\";\nimport { log } from \"@/utils/logger/logger\";\nimport Icon from \"@/ui/components/Icon\";\nimport SkeletonView from \"@/ui/components/SkeletonView\";\nimport Avatar from \"@/ui/components/Avatar\";\nimport Stack from \"@/ui/components/Stack\";\nimport Grade from \"@/ui/components/Grade\";\nimport Subject from \"@/ui/components/Subject\";\nimport { CompactGrade } from \"@/ui/components/CompactGrade\";\nimport Task from \"@/ui/components/Task\";\n\n\nexport default function TabOneScreen() {\n  const { colors } = useTheme();\n  return (\n    <ScrollView\n      contentInsetAdjustmentBehavior=\"automatic\"\n      contentContainerStyle={styles.containerContent}\n      style={styles.container}\n    >\n      <SectionTitle title={\"Typography\"}\n        colors={colors}\n      />\n      <View style={styles.typographyContainer}>\n        <Typography variant=\"h1\">\n          Lorem ipsum\n        </Typography>\n        <Typography variant=\"h2\">\n          Lorem ipsum\n        </Typography>\n        <Typography variant=\"h3\">\n          Lorem ipsum\n        </Typography>\n        <Typography variant=\"h4\">\n          Lorem ipsum\n        </Typography>\n        <Typography variant=\"h5\">\n          Lorem ipsum\n        </Typography>\n        <Typography variant=\"h6\">\n          Lorem ipsum\n        </Typography>\n        <Typography variant=\"body1\">\n          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet venenatis ipsum. Sed non luctus\n          purus. Fusce vel mollis turpis, non eleifend leo. Praesent id libero tristique, condimentum elit at,\n          condimentum nibh. Curabitur vehicula mauris in turpis mattis, eget posuere erat sagittis.\n        </Typography>\n        <Typography variant=\"body2\">\n          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet venenatis ipsum. Sed non luctus\n          purus. Fusce vel mollis turpis, non eleifend leo. Praesent id libero tristique, condimentum elit at,\n          condimentum nibh. Curabitur vehicula mauris in turpis mattis, eget posuere erat sagittis.\n        </Typography>\n        <Typography variant=\"caption\"\n          color=\"secondary\"\n        >\n          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet venenatis ipsum. Sed non luctus\n          purus. Fusce vel mollis turpis, non eleifend leo. Praesent id libero tristique, condimentum elit at,\n          condimentum nibh.\n        </Typography>\n      </View>\n      <SectionTitle title={\"Timetable\"}\n        colors={colors}\n      />\n      <View style={{ width: \"100%\", display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n        <Course\n          id=\"id1\"\n          name=\"Traitement des données\"\n          teacher=\"Baptive V.\"\n          room=\"Bât. 12 amphi 4\"\n          color=\"#0095D6\"\n          status={{ label: \"Travail dirigé\", canceled: false }}\n          variant=\"primary\"\n          start={1750126049}\n          end={1750129649}\n          onPress={() => log(\"Bât. 12 amphi 4\")}\n        />\n        <Course\n          id=\"id1\"\n          name=\"Pause méridienne\"\n          variant=\"separator\"\n          leading={Hamburger}\n          start={1750126049}\n          end={1750133249}\n          onPress={() => log(\"Bât. 12 amphi 4\")}\n\n        />\n        <Course\n          id=\"id\"\n          name=\"Anglais\"\n          teacher=\"Vince Linise\"\n          room=\"Bât. 9 salle 6\"\n          color=\"#6BAE00\"\n          status={{ label: \"Professeur absent\", canceled: true }}\n          variant=\"primary\"\n          start={1750126049}\n          end={1750129649}\n          onPress={() => log(\"Bât. 12 amphi 4\", \"Bât. 9 salle 6\")}\n        />\n        <Course\n          id=\"id2\"\n          name=\"Développement web\"\n          teacher=\"Alexandre P.\"\n          room=\"Bât. 10 salle 16\"\n          color=\"#6BAE00\"\n          status={{ label: \"Cours magistral\", canceled: false }}\n          variant=\"primary\"\n          start={1750126049}\n          end={1750130549}\n          onPress={() => log(\"Bât. 12 amphi 4\")}\n        />\n        <Course\n          id=\"id2\"\n          name=\"Développement web\"\n          teacher=\"Alexandre P.\"\n          room=\"Bât. 10 salle 16\"\n          color=\"#C50066\"\n          status={{ label: \"Cours magistral\", canceled: false }}\n          variant=\"primary\"\n          start={1750126049}\n          end={1750130549}\n          onPress={() => log(\"Bât. 12 amphi 4\")}\n          showTimes={false}\n          magicInfo={{\n            label: \"Dans 20 minutes\",\n            icon: ({ color }) => <Icon papicon\n              size={24}\n              fill={color}\n            >\n              <Papicons name={\"Clock\"} />\n            </Icon>,\n          }}\n        />\n      </View>\n      <SectionTitle title={\"List & Item\"}\n        colors={colors}\n      />\n      <List>\n        <Item>\n          <Typography variant=\"body1\">\n            This is a list item with primary text.\n          </Typography>\n        </Item>\n      </List>\n      <List>\n        <Item>\n          <Typography variant=\"title\">\n            Title\n          </Typography>\n          <Typography variant=\"caption\">\n            Description\n          </Typography>\n        </Item>\n        <Item>\n          <Leading>\n            <Hamburger size={24}\n              color={colors.primary}\n            />\n          </Leading>\n          <Typography variant=\"body1\"\n            color=\"primary\"\n          >\n            Item with Leading\n          </Typography>\n        </Item>\n        <Item>\n          <Trailing>\n            <Hamburger size={24}\n              color={colors.primary}\n            />\n          </Trailing>\n          <Typography variant=\"body1\"\n            color=\"primary\"\n          >\n            Item with Trailing\n          </Typography>\n        </Item>\n      </List>\n      <SectionTitle title={\"Skeleton\"}\n        colors={colors}\n      />\n      <SkeletonView style={{ width: 100, height: 20, borderRadius: 4 }} />\n      <Typography variant=\"h1\"\n        skeleton\n      >This is a skeleton text</Typography>\n      <Typography skeleton\n        skeletonLines={2}\n      >This is a description with multiple lines</Typography>\n      <Course\n        id=\"id1\"\n        name=\"Traitement des données\"\n        teacher=\"Baptive V.\"\n        room=\"Bât. 12 amphi 4\"\n        color=\"#0095D6\"\n        status={{ label: \"Travail dirigé\", canceled: false }}\n        variant=\"primary\"\n        start={1750126049}\n        end={1750129649}\n        magicInfo={{\n          label: \"Dans 20 minutes\",\n          icon: ({ color }) => <Icon papicon\n            size={24}\n            fill={color}\n          >\n            <Papicons name={\"Clock\"} />\n          </Icon>,\n        }}\n        skeleton\n      />\n      <Course\n        id=\"id1\"\n        name=\"Traitement des données\"\n        teacher=\"Baptive V.\"\n        room=\"Bât. 12 amphi 4\"\n        color=\"#0095D6\"\n        status={{ label: \"Travail dirigé\", canceled: false }}\n        variant=\"separator\"\n        start={1750126049}\n        end={1750129649}\n        skeleton\n      />\n      <Stack direction={\"horizontal\"}\n        hAlign={\"center\"}\n        gap={10}\n      >\n        <Icon skeleton>\n          <Papicons name={\"Placeholder\"} />\n        </Icon>\n        <Icon skeleton\n          size={64}\n        >\n          <Papicons name={\"Placeholder\"} />\n        </Icon>\n      </Stack>\n      <Subject\n        emoji={\"📐\"}\n        name={\"Mathématiques\"}\n        color={\"#0095D6\"}\n        outOf={20}\n        average={12.5}\n        skeleton\n      />\n      <Grade title={\"Hello\"}\n        date={Date.now()}\n        score={15}\n        outOf={20}\n        skeleton\n        isLast={true}\n        isFirst={true}\n      />\n      <CompactGrade\n        color={\"#0095D6\"}\n        emoji={\"📐\"}\n        title={\"Mathématiques\"}\n        description={\"Contrôle continu\"}\n        score={14}\n        outOf={20}\n        date={new Date()}\n        skeleton\n      />\n      <SectionTitle title={\"Avatar\"}\n        colors={colors}\n      />\n      <Stack direction={\"horizontal\"}\n        gap={10}\n        hAlign=\"center\"\n      >\n        <Avatar size={80} />\n        <Avatar size={64}\n          initials={\"VL\"}\n          color={\"#009EC5\"}\n        />\n        <Avatar size={40}\n          initials={\"RG\"}\n          color={\"#DD0030\"}\n          shape={\"square\"}\n        />\n        <Avatar size={40}\n          imageUrl={\"https://avatars.githubusercontent.com/u/114444115\"}\n        />\n        <Avatar size={80}\n          shape={\"square\"}\n          imageUrl={\"https://avatars.githubusercontent.com/u/114444115\"}\n        />\n      </Stack>\n      <Stack direction={\"horizontal\"}\n        gap={10}\n        hAlign=\"center\"\n      >\n        <Avatar size={64}\n          imageUrl={\"https://avatars.githubusercontent.com/u/-1\"}\n        />\n        <Avatar size={64}\n          skeleton\n        />\n      </Stack>\n    </ScrollView>\n  );\n}\n\ninterface SectionTitleProps {\n  title: string;\n  colors: { primary: string };\n}\n\nconst SectionTitle = ({ title, colors }: SectionTitleProps) => (\n  <View\n    style={{\n      width: \"100%\",\n      display: \"flex\",\n      flexDirection: \"column\",\n      gap: 5,\n    }}\n  >\n    <Typography variant=\"h4\"\n      color=\"primary\"\n    >\n      {title}\n    </Typography>\n    <View\n      style={{\n        width: \"100%\",\n        height: 2,\n        borderRadius: 100,\n        backgroundColor: colors.primary,\n      }}\n    />\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    padding: 16,\n\n  },\n  containerContent: {\n    gap: 16,\n    paddingBottom: 30,\n  },\n  typographyContainer: {\n    width: \"100%\",\n    display: \"flex\",\n    flexDirection: \"column\",\n    gap: 10,\n  },\n});\n"
  },
  {
    "path": "app/devmode.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { router } from \"expo-router\";\nimport { Plus } from \"lucide-react-native\";\nimport React, { useEffect, useState } from \"react\";\nimport { Alert, ScrollView, StyleSheet, Switch } from \"react-native\";\n\nimport DevModeNotice from \"@/components/DevModeNotice\";\nimport LogIcon from \"@/components/Log/LogIcon\";\nimport { database } from \"@/database\";\nimport { useAccountStore } from '@/stores/account';\nimport { useLogStore } from '@/stores/logs';\nimport { useMagicStore } from \"@/stores/magic\";\nimport { useSettingsStore } from \"@/stores/settings\";\nimport { useAlert } from \"@/ui/components/AlertProvider\";\nimport Icon from \"@/ui/components/Icon\";\nimport Item, { Leading, Trailing } from '@/ui/components/Item';\nimport List from '@/ui/components/List';\nimport SectionHeader from \"@/ui/components/SectionHeader\";\nimport Typography from \"@/ui/components/Typography\";\nimport { MAGIC_URL } from \"@/utils/endpoints\";\nimport { log } from \"@/utils/logger/logger\";\nimport ModelManager from \"@/utils/magic/ModelManager\";\nimport { scheduleNotificationAtDate } from \"@/utils/notification/reminder/helper\";\nimport { initializeTransport } from \"@/utils/transport\";\nimport NativeSwitch from \"@/ui/native/NativeSwitch\";\n\nexport default function Devmode() {\n  const accountStore = useAccountStore();\n  const logsStore = useLogStore();\n  const settingStore = useSettingsStore(state => state.personalization)\n  const mutateProperty = useSettingsStore(state => state.mutateProperty)\n  const magicStore = useMagicStore()\n\n  const magicStoreHomework = useMagicStore(state => state.processHomeworks)\n\n  const { colors } = useTheme();\n  const alert = useAlert();\n\n  const [showAccountStore, setShowAccountStore] = useState(false);\n  const [showLogsStore, setShowLogsStore] = useState(false);\n\n  const [visibleLogsCount, setVisibleLogsCount] = useState(20);\n\n  const loadMoreLogs = () => {\n    setVisibleLogsCount((prev) => prev + 20);\n  };\n\n  useEffect(() => {\n    if (!showLogsStore) {\n      setVisibleLogsCount(20);\n    }\n\n\n  }, [showLogsStore]);\n\n  return (\n    <ScrollView\n      contentInsetAdjustmentBehavior=\"automatic\"\n      contentContainerStyle={styles.containerContent}\n      style={styles.container}\n    >\n      <DevModeNotice />\n\n      <List>\n        <Item>\n          <Trailing>\n            <NativeSwitch\n              style={{ marginRight: 10 }}\n              value={showLogsStore}\n              onValueChange={() => {\n                requestAnimationFrame(() => {\n                  setShowLogsStore(!showLogsStore);\n                });\n              }}\n            />\n          </Trailing>\n          <Typography variant=\"title\">Logs Store</Typography>\n        </Item>\n\n        {showLogsStore &&\n          logsStore.logs\n            .slice()\n            .reverse()\n            .slice(0, visibleLogsCount)\n            .map((logEntry, index) => (\n              <Item key={index}>\n                <Leading>\n                  <LogIcon type={logEntry.type} />\n                </Leading>\n                <Typography variant=\"body2\">{logEntry.message}</Typography>\n                <Typography variant=\"caption\">\n                  {new Date(logEntry.date).toLocaleString()} -{\" \"}\n                  {logEntry.from ?? \"UNKNOW\"}\n                </Typography>\n              </Item>\n            ))}\n\n        {showLogsStore && visibleLogsCount < logsStore.logs.length && (\n          <Item onPress={loadMoreLogs}>\n            <Leading>\n              <Plus color={colors.text} size={24} />\n            </Leading>\n            <Typography variant=\"title\">Charger plus</Typography>\n          </Item>\n        )}\n        <Item\n          onPress={() => {\n            const accounts = useAccountStore.getState().accounts;\n            for (const account of accounts) {\n              useAccountStore.getState().removeAccount(account);\n            }\n            Alert.alert(\"Success\");\n          }}\n        >\n          <Typography variant=\"title\">Reset Account Store</Typography>\n        </Item>\n      </List>\n\n      <SectionHeader\n        title=\"Magic+\"\n        leading={\n          <Icon>\n            <Papicons name=\"Sparkles\" size={18} />\n          </Icon>\n        }\n      />\n\n      <List>\n        <Item>\n          <Typography>\n            {settingStore.magicEnabled\n              ? \"Papillon Magic+ est Activé\"\n              : \"Papillon Magic+ est Désactivé\"}\n          </Typography>\n        </Item>\n        <Item onPress={() => ModelManager.refresh()}>\n          <Typography variant=\"title\">Rafraîchir le modèle</Typography>\n        </Item>\n        <Item\n          onPress={async () => {\n            try {\n              const result = await ModelManager.reset();\n              if (result.success) {\n                Alert.alert(\n                  \"Succès\",\n                  \"Le modèle a été réinitialisé avec succès. Il sera retéléchargé au prochain démarrage.\"\n                );\n              } else {\n                Alert.alert(\"Erreur\", `Échec du reset: ${result.error}`);\n              }\n            } catch (error) {\n              Alert.alert(\"Erreur\", `Erreur lors du reset: ${String(error)}`);\n            }\n          }}\n        >\n          <Typography variant=\"title\">Reset complet du modèle</Typography>\n        </Item>\n        <Item\n          onPress={() => {\n            const status = ModelManager.getStatus();\n            Alert.alert(\n              \"Statut du modèle\",\n              `Modèle chargé: ${status.hasModel ? \"Oui\" : \"Non\"}\\n` +\n                `Max Length: ${status.maxLen}\\n` +\n                `Nombre de labels: ${status.labelsCount}\\n` +\n                `Taille du vocabulaire: ${status.wordIndexSize}\\n` +\n                `Index OOV: ${status.oovIndex}`\n            );\n          }}\n        >\n          <Typography variant=\"title\">Afficher le statut du modèle</Typography>\n        </Item>\n        <Item\n          onPress={async () => {\n            try {\n              const result = await ModelManager.predict(\n                \"ds analyse de doc\",\n                true\n              );\n              if (\"error\" in result) {\n                Alert.alert(\"Erreur de prédiction\", result.error);\n              } else {\n                Alert.alert(\n                  \"Test de prédiction réussi\",\n                  `Prédiction: ${result.predicted}\\nScores: ${result.scores\n                    .slice(0, 3)\n                    .map(s => s.toFixed(3))\n                    .join(\", \")}...`\n                );\n              }\n            } catch (error) {\n              Alert.alert(\"Erreur\", `Erreur lors du test: ${String(error)}`);\n            }\n          }}\n        >\n          <Typography variant=\"title\">Tester une prédiction</Typography>\n        </Item>\n        <Item\n          onPress={() => {\n            try {\n              magicStore.clear();\n              Alert.alert(\n                \"Cache vidé\",\n                \"Le cache des prédictions Magic a été vidé avec succès !\"\n              );\n            } catch (error) {\n              Alert.alert(\n                \"Erreur\",\n                `Erreur lors du vidage du cache: ${String(error)}`\n              );\n            }\n          }}\n        >\n          <Typography variant=\"title\">Vider le cache Magic</Typography>\n          <Trailing>\n            <Typography variant=\"caption\">\n              {magicStoreHomework.length} devoirs\n            </Typography>\n          </Trailing>\n        </Item>\n        <Item\n          onPress={() => {\n            const currentURL = settingStore.magicModelURL || MAGIC_URL;\n\n            Alert.prompt(\n              \"URL Custom Magic Model\",\n              `URL actuelle: ${currentURL}\\n\\nEntrez une nouvelle URL:`,\n              [\n                {\n                  text: \"Annuler\",\n                  style: \"cancel\",\n                },\n                {\n                  text: \"Valider\",\n                  onPress: (newURL?: string) => {\n                    if (newURL && newURL.trim()) {\n                      mutateProperty(\"personalization\", {\n                        magicModelURL: newURL.trim(),\n                      });\n                      Alert.alert(\"Succès\", \"URL du modèle Magic mise à jour!\");\n                    }\n                  },\n                },\n              ],\n              \"plain-text\",\n              currentURL\n            );\n          }}\n        >\n          <Typography variant=\"title\">\n            Changer l&apos;URL Custom Magic\n          </Typography>\n        </Item>\n        <Item\n          onPress={() => {\n            Alert.alert(\n              \"Reset URL Magic Model\",\n              \"Voulez-vous remettre l'URL du modèle Magic par défaut?\",\n              [\n                {\n                  text: \"Annuler\",\n                  style: \"cancel\",\n                },\n                {\n                  text: \"Reset\",\n                  style: \"destructive\",\n                  onPress: () => {\n                    mutateProperty(\"personalization\", {\n                      magicModelURL: MAGIC_URL,\n                    });\n                    Alert.alert(\n                      \"Succès\",\n                      \"URL du modèle Magic remise par défaut!\"\n                    );\n                  },\n                },\n              ]\n            );\n          }}\n        >\n          <Typography variant=\"title\">Reset URL Magic Model</Typography>\n        </Item>\n        <Item onPress={() => magicStore.clear()}>\n          <Typography variant=\"title\">Clear Magic Store</Typography>\n        </Item>\n        <Item onPress={() => log(JSON.stringify(magicStoreHomework))}>\n          <Typography variant=\"title\">ConsoleLog Magic Store</Typography>\n        </Item>\n      </List>\n\n      <SectionHeader\n        title=\"Alert\"\n        leading={\n          <Icon>\n            <Papicons name=\"Star\" size={18} />\n          </Icon>\n        }\n      />\n\n      <List>\n        <Item\n          onPress={() =>\n            alert.showAlert({\n              title: \"Connexion impossible\",\n              description:\n                \"Il semblerait que ta session a expiré. Tu pourras renouveler ta session dans les paramètres en liant à nouveau ton compte.\",\n              icon: \"AlertTriangle\",\n              color: \"#D60046\",\n              customButton: {\n                label: \"Me reconnecter\",\n                showCancelButton: true,\n                onPress: () => {\n                  const lastUsedAccount =\n                    useAccountStore.getState().lastUsedAccount;\n                  const badService = useAccountStore\n                    .getState()\n                    .accounts.find(account => account.id === lastUsedAccount)\n                    ?.services[0];\n\n                  // Unavailable in ED/SKolengo\n                  const authUrl =\n                    badService?.auth?.additionals?.[\"instanceURL\"] ?? \"\";\n                  setTimeout(() => {\n                    router.push({\n                      pathname: \"/(onboarding)/pronote/webview\",\n                      params: { url: authUrl, serviceId: badService?.id },\n                    });\n                  }, 200);\n                },\n              },\n              technical: String(\n                \" Error: TokenExpiredError at AuthService.validateToken (file:///app/services/auth.js:45:15) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async file:///app/routes/api/user.js:10:28\"\n              ),\n            })\n          }\n        >\n          <Typography variant=\"title\">Error Alert</Typography>\n        </Item>\n        <Item\n          onPress={() => {\n            const lastUsedAccount = useAccountStore.getState().lastUsedAccount;\n            const badService = useAccountStore\n              .getState()\n              .accounts.find(account => account.id === lastUsedAccount)\n              ?.services[0];\n            useAccountStore.getState().updateServiceAuthData(badService!.id, {\n              ...badService?.auth,\n              refreshToken: \"\",\n            });\n          }}\n        >\n          <Typography variant=\"title\">Clear Auth Data</Typography>\n        </Item>\n        <Item>\n          <Typography variant=\"title\">Activer Alert au Login</Typography>\n          <Trailing>\n            <NativeSwitch\n              value={settingStore.showAlertAtLogin}\n              onValueChange={value =>\n                mutateProperty(\"personalization\", { showAlertAtLogin: value })\n              }\n            />\n          </Trailing>\n        </Item>\n      </List>\n\n      <SectionHeader\n        title=\"Session\"\n        leading={\n          <Icon>\n            <Papicons name=\"Star\" size={18} />\n          </Icon>\n        }\n      />\n\n      <List>\n        <Item\n          onPress={async () => {\n            await database.write(async () => {\n              await database.unsafeResetDatabase();\n            });\n          }}\n        >\n          <Typography variant=\"title\">\n            Réinitialiser la base de données\n          </Typography>\n        </Item>\n      </List>\n\n      <SectionHeader\n        title=\"Transport\"\n        leading={\n          <Icon>\n            <Papicons name=\"Bus\" size={18} />\n          </Icon>\n        }\n      />\n      <List>\n        <Item\n          onPress={() => {\n            initializeTransport(undefined).then(transport => {\n              console.log(transport);\n            });\n          }}\n        >\n          <Typography variant=\"title\">Initialiser sans addresse</Typography>\n        </Item>\n        <Item\n          onPress={() => {\n            initializeTransport(\"106 Rue de la Pompe, 75016 Paris\").then(\n              transport => {\n                console.log(transport);\n              }\n            );\n          }}\n        >\n          <Typography variant=\"title\">Initialiser avec addresse</Typography>\n        </Item>\n      </List>\n\n      <SectionHeader\n        title=\"Notifications\"\n        leading={\n          <Icon>\n            <Papicons name=\"Clock\" size={18} />\n          </Icon>\n        }\n      />\n\n      <List>\n        <Item\n          onPress={() => {\n            requestPermissionsAsync();\n          }}\n        >\n          <Typography variant=\"title\">Demander la permission</Typography>\n        </Item>\n        <Item\n          onPress={async () => {\n            const date = new Date(Date.now() + 5000);\n\n            const id = await scheduleNotificationAtDate(\n              \"Papillon\",\n              \"Une notification programmée via Papillon arrive à l'instant!\",\n              date\n            );\n\n            Alert.alert(\"Une notification arrive dans 5 sec\", `ID : ${id}`);\n          }}\n        >\n          <Typography variant=\"title\">Programmer une notification</Typography>\n        </Item>\n      </List>\n    </ScrollView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    padding: 16,\n  },\n  containerContent: {},\n});\n"
  },
  {
    "path": "app.config.ts",
    "content": "import PackageJSON from \"./package.json\" with { type: 'json' };\n\nconst androidPreVersion = PackageJSON.version.replaceAll(\".\", \"\")\nconst androidVersionCode = androidPreVersion.length == 3 ? parseInt(androidPreVersion + \"00\") : androidPreVersion.length == 4 ? parseInt(androidPreVersion + \"0\") : parseInt(androidPreVersion)\n\nexport default {\n  expo: {\n    name: \"Papillon\",\n    slug: \"papillon\",\n    version: PackageJSON.version,\n    orientation: \"portrait\",\n    icon: \"./assets/images/icon.png\",\n    scheme: [\"papillon\", \"izly\", \"skoapp-prod\"],\n    platforms: [\"ios\", \"android\"],\n    userInterfaceStyle: \"automatic\",\n    newArchEnabled: true,\n    splash: {\n      image: \"./assets/images/splash.png\",\n      resizeMode: \"cover\",\n      backgroundColor: \"#003A21\",\n    },\n    ios: {\n      appStoreUrl:\n        \"https://apps.apple.com/us/app/papillon-lappli-scolaire/id6477761165\",\n      bundleIdentifier: \"xyz.getpapillon.ios\",\n      associatedDomains: [\"applinks:getpapillon.xyz\"],\n      icon: \"./assets/app.icon\",\n      minimumOSVersion: \"17.6\",\n      infoPlist: {\n        CFBundleURLTypes: [\n          {\n            CFBundleURLSchemes: [\"papillon\", \"izly\", \"skoapp-prod\"],\n          },\n        ],\n        CFBundleLocalizations: [\n          \"fr\",\n          \"en\",\n          \"br\",\n          \"pt\",\n          \"de\",\n          \"es\",\n          \"tr\",\n          \"ja\",\n          \"ru\",\n          \"ko\",\n          \"af\",\n          \"ar\",\n          \"el\",\n          \"hi\",\n          \"nl\",\n          \"pl\",\n          \"ro\",\n          \"sq\",\n          \"uk\",\n          \"vi\",\n          \"bg\",\n          \"bn\",\n          \"cs\",\n          \"da\",\n          \"fi\",\n          \"he\",\n          \"hu\",\n          \"id\",\n          \"no\",\n          \"sk\",\n          \"sv\",\n          \"sw\",\n          \"th\",\n          \"it\",\n          \"fa\",\n          \"ur\",\n          \"ms\",\n          \"hr\",\n          \"et\",\n        ],\n        CADisableMinimumFrameDurationOnPhone: true,\n        LSApplicationQueriesSchemes: [\"transit\", \"maps\"],\n      },\n      supportsTablet: true,\n      config: {\n        usesNonExemptEncryption: false,\n      },\n    },\n    android: {\n      versionCode: androidVersionCode,\n      package: \"xyz.getpapillon.app\",\n      adaptiveIcon: {\n        foregroundImage: \"./assets/images/adaptive-icon.png\",\n        backgroundColor: \"#ffffff\",\n        monochromeImage: \"./assets/images/monochrome-icon.png\",\n      },\n      edgeToEdgeEnabled: true,\n      splash: {\n        image: \"./assets/images/splash_android.png\",\n        resizeMode: \"cover\",\n        backgroundColor: \"#003A21\",\n      },\n      supportsTablet: true,\n      predictiveBackGestureEnabled: true\n    },\n    web: {\n      bundler: \"metro\",\n      output: \"static\",\n      favicon: \"./assets/images/favicon.png\",\n    },\n    plugins: [\n      \"expo-router\",\n      \"expo-font\",\n      \"expo-video\",\n      \"expo-audio\",\n      \"expo-localization\",\n      \"expo-asset\",\n      \"@react-native-community/datetimepicker\",\n      [\n        \"expo-image-picker\",\n        {\n          photosPermission:\n            \"Papillon utilise ta galerie pour te permettre de personnaliser ta photo de profil\",\n        },\n      ],\n      \"expo-web-browser\",\n      [\n        \"react-native-fast-tflite\",\n        {\n          enableCoreMLDelegate: true,\n          enableAndroidGpuLibraries: true,\n        },\n      ],\n      \"react-native-bottom-tabs\",\n      \"expo-secure-store\",\n      [\n        \"expo-location\",\n        {\n          locationWhenInUsePermission:\n            \"Papillon utilise ton emplacement pour trouver les établissements autour de toi.\",\n          cameraPermission:\n            \"Papillon utilise ta caméra pour scanner des QR-codes pour te connecter, pour capturer des documents, ou pour des fonctionnalités amusantes telles que les réactions.\",\n        },\n      ],\n      [\n        \"react-native-edge-to-edge\",\n        {\n          android: {\n            parentTheme: \"Material3\",\n            enforceNavigationBarContrast: false,\n          },\n        },\n      ],\n      [\n        \"expo-build-properties\",\n        {\n          android: {\n            enable16KbPageSizes: true,\n          },\n          ios: {\n            extraPods: [\n              { name: \"SDWebImage\", modular_headers: true },\n              { name: \"SDWebImageSVGCoder\", modular_headers: true },\n            ],\n          },\n        },\n      ],\n    ],\n    experiments: {\n      typedRoutes: true,\n    },\n  },\n};\n"
  },
  {
    "path": "assets/app.icon/icon.json",
    "content": "{\n  \"fill\" : {\n    \"linear-gradient\" : [\n      \"display-p3:0.20392,0.69804,0.57647,1.00000\",\n      \"display-p3:0.19216,0.50588,0.43137,1.00000\"\n    ]\n  },\n  \"groups\" : [\n    {\n      \"layers\" : [\n        {\n          \"hidden\" : false,\n          \"image-name\" : \"glass 2.png\",\n          \"name\" : \"glass 2\",\n          \"opacity\" : 0,\n          \"position\" : {\n            \"scale\" : 0.83,\n            \"translation-in-points\" : [\n              62,\n              50\n            ]\n          }\n        },\n        {\n          \"fill-specializations\" : [\n            {\n              \"appearance\" : \"dark\",\n              \"value\" : {\n                \"solid\" : \"display-p3:0.20801,0.68652,0.56885,1.00000\"\n              }\n            }\n          ],\n          \"glass\" : false,\n          \"hidden\" : false,\n          \"image-name\" : \"overlay.png\",\n          \"name\" : \"overlay\",\n          \"opacity\" : 1,\n          \"position\" : {\n            \"scale\" : 0.83,\n            \"translation-in-points\" : [\n              62,\n              50\n            ]\n          }\n        },\n        {\n          \"fill-specializations\" : [\n            {\n              \"appearance\" : \"dark\",\n              \"value\" : {\n                \"solid\" : \"display-p3:0.20801,0.68652,0.56885,1.00000\"\n              }\n            }\n          ],\n          \"glass\" : false,\n          \"hidden\" : false,\n          \"image-name\" : \"base.png\",\n          \"name\" : \"base\",\n          \"position\" : {\n            \"scale\" : 0.83,\n            \"translation-in-points\" : [\n              62,\n              50\n            ]\n          }\n        }\n      ],\n      \"position\" : {\n        \"scale\" : 0.99,\n        \"translation-in-points\" : [\n          -10,\n          -11\n        ]\n      },\n      \"shadow\" : {\n        \"kind\" : \"neutral\",\n        \"opacity\" : 0.5\n      },\n      \"translucency\" : {\n        \"enabled\" : true,\n        \"value\" : 0.5\n      }\n    }\n  ],\n  \"supported-platforms\" : {\n    \"circles\" : [\n      \"watchOS\"\n    ],\n    \"squares\" : \"shared\"\n  }\n}"
  },
  {
    "path": "assets/lotties/alise.json",
    "content": "{\"assets\":[{\"h\":129,\"id\":\"0\",\"p\":\"data:image/jpeg;base64,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\",\"u\":\"\",\"w\":129,\"e\":1},{\"id\":\"8\",\"layers\":[{\"ind\":7,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[58,61]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[116,122]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.01,-0.19],[5.35,-0.2],[0.46,0],[0.22,0.01],[-1.3,6.14],[-0.14,0.55],[0,0],[0,21.13],[-8.57,4.36],[-2.45,-1.48],[0,-6.03]],\"o\":[[0,0.45],[-0.2,5.31],[-0.2,0.01],[-0.57,0],[-6.32,-0.28],[0.05,-0.21],[0,0],[0,0],[0,-12.03],[4.86,-2.48],[2.45,1.49],[0,0]],\"v\":[[87,80.84],[86.99,81.72],[77.15,91.49],[76.27,91.5],[75.19,91.49],[65.62,79.23],[65.88,78.19],[71.65,55.92],[56.29,28.76],[74.81,4.72],[84.55,2.49],[87,13.02]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.6,0.6,0.6,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[6.13,0],[-0.72,6.05],[0,0],[0.75,0.07],[0.72,7.24],[0,1.77],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[0.07,-0.75],[7.29,-0.71],[1.79,0]],\"o\":[[0,0],[0.72,6.05],[-6.13,0],[0,0],[-1.79,0],[-7.29,-0.71],[-0.07,-0.75],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.77],[-0.72,7.24],[-0.75,0.07],[0,0]],\"v\":[[28.79,43.06],[33.2,80.14],[23.03,91.5],[12.86,80.14],[17.27,43.06],[13.85,42.98],[0.07,29.3],[0,25.9],[0,5.72],[5.76,0],[11.52,5.72],[11.52,24.05],[14.39,26.91],[17.27,24.05],[17.27,5.72],[23.03,0],[28.79,5.72],[28.79,24.05],[31.66,26.91],[34.54,24.05],[34.54,5.72],[40.3,0],[46.06,5.72],[46.06,25.9],[45.98,29.3],[32.21,42.98],[28.79,43.06]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.6,0.6,0.6,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"14\",\"layers\":[{\"ind\":13,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[73,76]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[146,152]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.45,1.49],[4.86,-2.48],[0,0],[0,-11.65],[-0.03,-0.01],[0,0],[0,0],[0.02,-0.11],[-6.32,-0.28],[-0.57,0],[-0.2,0.01],[-0.32,5.2],[0,0],[0,0.45]],\"o\":[[0,-6.03],[-2.45,-1.48],[0,0],[-8.37,4.43],[0,21.11],[0,0],[0,0],[-0.04,0.17],[-1.3,6.14],[0.22,0.01],[0.46,0],[5.27,-0.2],[0,0],[0.01,-0.19],[0,0]],\"v\":[[98.25,24.27],[95.8,13.74],[86.06,15.97],[85.25,16.39],[67.54,40.01],[82.9,67.17],[77.13,89.44],[76.96,90.09],[76.87,90.48],[86.44,102.74],[87.52,102.75],[88.4,102.74],[98.23,93.21],[98.24,92.97],[98.25,92.09]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.02,-0.46],[11.06,-0.41],[0.36,0],[0.53,0.02],[-2.74,12.91],[0,0],[-0.08,0.32],[0,0],[1.05,1.13],[1.92,4.41],[2.91,-1.23],[0,0],[12.67,0],[-1.51,12.7],[0,0],[0.97,9.82],[0,1.14],[0,0],[-9.21,0],[0,0],[-2.42,-1.45],[-3.15,0],[0,0],[-2.41,-1.45],[-3.14,0],[0,0],[-1.04,-8.17],[-3.7,1.89],[-2.8,0.79],[-4.37,-2.48],[0,0],[0,0],[-0.63,-3.48],[0,-2.58]],\"o\":[[0,0.35],[-0.43,11.15],[-0.45,0.02],[-0.45,0],[-13.05,-0.57],[0,0],[0.09,-0.4],[0,0],[-1.02,-0.87],[-2.62,-2.84],[-2.27,2.13],[0,0],[1.51,12.7],[-12.67,0],[0,0],[-8.7,-3.66],[-0.11,-1.07],[0,0],[0,-9.33],[0,0],[2.99,0.08],[2.53,-1.52],[0,0],[2.98,0.08],[2.53,-1.52],[0,0],[8.31,0.21],[4.35,-4],[2.02,-1.03],[3.54,-1.01],[0,0],[0,0],[4.5,2.93],[0.52,2.91],[0,0]],\"v\":[[109.3,92.09],[109.29,93.39],[88.82,113.79],[87.52,113.8],[85.95,113.79],[66.05,88.19],[66.14,87.79],[66.43,86.67],[70.22,72.02],[67.11,69.02],[60.07,58.2],[52.24,63.29],[55.42,90.09],[34.28,113.8],[13.14,90.09],[16.32,63.29],[0.32,41.64],[0.2,38.29],[0.2,16.97],[17.01,0.2],[17.44,0.2],[25.64,2.58],[34.28,0.2],[34.71,0.2],[42.91,2.58],[51.55,0.2],[51.98,0.2],[68.23,14.84],[81.05,6.11],[88.81,2.74],[101.12,4.05],[101.54,4.29],[101.98,4.57],[108.82,15.34],[109.3,24.27]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[-0.05,-0.56],[-7.29,-0.71],[-1.79,0],[0,0],[-5.99,-0.16],[0,0],[0.54,5.93],[0,0],[0,0],[-0.75,0.07],[-0.72,7.24],[0,1.77],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.08,1.46],[0,0],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.07,1.46],[0,0],[0,0],[3.18,0],[0,-3.16]],\"o\":[[0,0],[0,1.03],[0.72,7.24],[0.75,0.07],[0,0],[-0.71,5.95],[0,0],[6.03,0],[0,0],[0,0],[1.79,0],[7.29,-0.71],[0.07,-0.75],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.07,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.08,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0]],\"v\":[[11.25,37.15],[11.25,38.33],[11.32,40.55],[25.1,54.23],[28.52,54.31],[24.11,91.39],[33.99,102.75],[34.28,102.75],[44.47,91.68],[44.45,91.39],[40.04,54.31],[43.46,54.23],[57.23,40.55],[57.31,37.15],[57.31,16.97],[51.55,11.25],[45.79,16.97],[45.79,35.3],[45.79,35.45],[42.91,38.16],[42.77,38.16],[40.04,35.45],[40.04,35.3],[40.04,16.97],[34.28,11.25],[28.52,16.97],[28.52,35.3],[28.52,35.45],[25.64,38.16],[25.5,38.16],[22.77,35.45],[22.77,35.3],[22.77,16.97],[17.01,11.25],[11.25,16.97]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"17\",\"layers\":[{\"ind\":10,\"ty\":0,\"parent\":6,\"ks\":{},\"w\":116,\"h\":122,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"8\"},{\"ind\":6,\"ty\":3,\"parent\":5,\"ks\":{\"s\":{\"a\":0,\"k\":[41.93,41.59]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{\"p\":{\"a\":0,\"k\":[6.181,6.13]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":16,\"ty\":0,\"parent\":12,\"ks\":{},\"w\":146,\"h\":152,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"14\"},{\"ind\":12,\"ty\":3,\"parent\":11,\"ks\":{\"s\":{\"a\":0,\"k\":[41.93,41.59]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":11,\"ty\":3,\"parent\":4,\"ks\":{\"p\":{\"a\":0,\"k\":[-0.109,-0.108]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":4,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[1,1]}},\"ip\":0,\"op\":55,\"st\":0}]},{\"id\":\"24\",\"layers\":[{\"ind\":23,\"ty\":2,\"parent\":22,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"0\"},{\"ind\":22,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[61.24,61.24]}},\"ip\":0,\"op\":55,\"st\":0}]},{\"id\":\"32\",\"layers\":[{\"ind\":31,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"37\",\"layers\":[{\"ind\":36,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"43\",\"layers\":[{\"ind\":42,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"48\",\"layers\":[{\"ind\":47,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"53\",\"layers\":[{\"ind\":52,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":19,\"ty\":0,\"parent\":3,\"ks\":{\"a\":{\"a\":0,\"k\":[31.5,32.5]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":12,\"s\":[0],\"h\":1},{\"t\":54,\"s\":[0],\"h\":1}]},\"p\":{\"a\":0,\"k\":[30.5,31.5]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":12,\"s\":[50,50],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[50,50],\"h\":1}]}},\"w\":147,\"h\":153,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"17\"},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{\"p\":{\"a\":0,\"k\":[28.768,29]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":27,\"ty\":4,\"td\":1,\"parent\":21,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[39.5,39.5]},\"r\":{\"a\":0,\"k\":150},\"s\":{\"a\":0,\"k\":[79,79]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":26,\"ty\":0,\"tt\":1,\"parent\":21,\"ks\":{},\"w\":79,\"h\":79,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"24\"},{\"ind\":21,\"ty\":3,\"parent\":20,\"ks\":{\"a\":{\"a\":0,\"k\":[39.5,39.5]},\"p\":{\"a\":0,\"k\":[39.5,39.5]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[-45],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0.5,\"y\":0}},{\"t\":54,\"s\":[0],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0,0],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":54,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":20,\"ty\":3,\"parent\":2,\"ks\":{\"p\":{\"a\":0,\"k\":[69,20]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":34,\"ty\":0,\"parent\":30,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"32\"},{\"ind\":30,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.974,4.541],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[4.974,1.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[4.974,1.541],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":39,\"ty\":0,\"parent\":35,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"37\"},{\"ind\":35,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":29,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":45,\"ty\":0,\"parent\":41,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"43\"},{\"ind\":41,\"ty\":3,\"parent\":40,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.474,4.541],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[4.474,1.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[4.474,1.541],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":50,\"ty\":0,\"parent\":46,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"48\"},{\"ind\":46,\"ty\":3,\"parent\":40,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":40,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":55,\"ty\":0,\"parent\":51,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"53\"},{\"ind\":51,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":28,\"ty\":3,\"parent\":2,\"ks\":{\"a\":{\"a\":0,\"k\":[67.649,55.9]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[108.343,99.459],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[108.343,139.459],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[108.343,139.459],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[60,60],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[60,60],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":2,\"ty\":3,\"parent\":1,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":1,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":54,\"v\":\"5.7.4\",\"w\":206}\n"
  },
  {
    "path": "assets/lotties/ard.json",
    "content": "{\"assets\":[{\"h\":129,\"id\":\"0\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":129,\"e\":1},{\"id\":\"8\",\"layers\":[{\"ind\":7,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[58,61]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[116,122]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.01,-0.19],[5.35,-0.2],[0.46,0],[0.22,0.01],[-1.3,6.14],[-0.14,0.55],[0,0],[0,21.13],[-8.57,4.36],[-2.45,-1.48],[0,-6.03]],\"o\":[[0,0.45],[-0.2,5.31],[-0.2,0.01],[-0.57,0],[-6.32,-0.28],[0.05,-0.21],[0,0],[0,0],[0,-12.03],[4.86,-2.48],[2.45,1.49],[0,0]],\"v\":[[87,80.84],[86.99,81.72],[77.15,91.49],[76.27,91.5],[75.19,91.49],[65.62,79.23],[65.88,78.19],[71.65,55.92],[56.29,28.76],[74.81,4.72],[84.55,2.49],[87,13.02]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.6,0.6,0.6,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[6.13,0],[-0.72,6.05],[0,0],[0.75,0.07],[0.72,7.24],[0,1.77],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[0.07,-0.75],[7.29,-0.71],[1.79,0]],\"o\":[[0,0],[0.72,6.05],[-6.13,0],[0,0],[-1.79,0],[-7.29,-0.71],[-0.07,-0.75],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.77],[-0.72,7.24],[-0.75,0.07],[0,0]],\"v\":[[28.79,43.06],[33.2,80.14],[23.03,91.5],[12.86,80.14],[17.27,43.06],[13.85,42.98],[0.07,29.3],[0,25.9],[0,5.72],[5.76,0],[11.52,5.72],[11.52,24.05],[14.39,26.91],[17.27,24.05],[17.27,5.72],[23.03,0],[28.79,5.72],[28.79,24.05],[31.66,26.91],[34.54,24.05],[34.54,5.72],[40.3,0],[46.06,5.72],[46.06,25.9],[45.98,29.3],[32.21,42.98],[28.79,43.06]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.6,0.6,0.6,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"14\",\"layers\":[{\"ind\":13,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[73,76]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[146,152]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.45,1.49],[4.86,-2.48],[0,0],[0,-11.65],[-0.03,-0.01],[0,0],[0,0],[0.02,-0.11],[-6.32,-0.28],[-0.57,0],[-0.2,0.01],[-0.32,5.2],[0,0],[0,0.45]],\"o\":[[0,-6.03],[-2.45,-1.48],[0,0],[-8.37,4.43],[0,21.11],[0,0],[0,0],[-0.04,0.17],[-1.3,6.14],[0.22,0.01],[0.46,0],[5.27,-0.2],[0,0],[0.01,-0.19],[0,0]],\"v\":[[98.25,24.27],[95.8,13.74],[86.06,15.97],[85.25,16.39],[67.54,40.01],[82.9,67.17],[77.13,89.44],[76.96,90.09],[76.87,90.48],[86.44,102.74],[87.52,102.75],[88.4,102.74],[98.23,93.21],[98.24,92.97],[98.25,92.09]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.02,-0.46],[11.06,-0.41],[0.36,0],[0.53,0.02],[-2.74,12.91],[0,0],[-0.08,0.32],[0,0],[1.05,1.13],[1.92,4.41],[2.91,-1.23],[0,0],[12.67,0],[-1.51,12.7],[0,0],[0.97,9.82],[0,1.14],[0,0],[-9.21,0],[0,0],[-2.42,-1.45],[-3.15,0],[0,0],[-2.41,-1.45],[-3.14,0],[0,0],[-1.04,-8.17],[-3.7,1.89],[-2.8,0.79],[-4.37,-2.48],[0,0],[0,0],[-0.63,-3.48],[0,-2.58]],\"o\":[[0,0.35],[-0.43,11.15],[-0.45,0.02],[-0.45,0],[-13.05,-0.57],[0,0],[0.09,-0.4],[0,0],[-1.02,-0.87],[-2.62,-2.84],[-2.27,2.13],[0,0],[1.51,12.7],[-12.67,0],[0,0],[-8.7,-3.66],[-0.11,-1.07],[0,0],[0,-9.33],[0,0],[2.99,0.08],[2.53,-1.52],[0,0],[2.98,0.08],[2.53,-1.52],[0,0],[8.31,0.21],[4.35,-4],[2.02,-1.03],[3.54,-1.01],[0,0],[0,0],[4.5,2.93],[0.52,2.91],[0,0]],\"v\":[[109.3,92.09],[109.29,93.39],[88.82,113.79],[87.52,113.8],[85.95,113.79],[66.05,88.19],[66.14,87.79],[66.43,86.67],[70.22,72.02],[67.11,69.02],[60.07,58.2],[52.24,63.29],[55.42,90.09],[34.28,113.8],[13.14,90.09],[16.32,63.29],[0.32,41.64],[0.2,38.29],[0.2,16.97],[17.01,0.2],[17.44,0.2],[25.64,2.58],[34.28,0.2],[34.71,0.2],[42.91,2.58],[51.55,0.2],[51.98,0.2],[68.23,14.84],[81.05,6.11],[88.81,2.74],[101.12,4.05],[101.54,4.29],[101.98,4.57],[108.82,15.34],[109.3,24.27]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[-0.05,-0.56],[-7.29,-0.71],[-1.79,0],[0,0],[-5.99,-0.16],[0,0],[0.54,5.93],[0,0],[0,0],[-0.75,0.07],[-0.72,7.24],[0,1.77],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.08,1.46],[0,0],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.07,1.46],[0,0],[0,0],[3.18,0],[0,-3.16]],\"o\":[[0,0],[0,1.03],[0.72,7.24],[0.75,0.07],[0,0],[-0.71,5.95],[0,0],[6.03,0],[0,0],[0,0],[1.79,0],[7.29,-0.71],[0.07,-0.75],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.07,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.08,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0]],\"v\":[[11.25,37.15],[11.25,38.33],[11.32,40.55],[25.1,54.23],[28.52,54.31],[24.11,91.39],[33.99,102.75],[34.28,102.75],[44.47,91.68],[44.45,91.39],[40.04,54.31],[43.46,54.23],[57.23,40.55],[57.31,37.15],[57.31,16.97],[51.55,11.25],[45.79,16.97],[45.79,35.3],[45.79,35.45],[42.91,38.16],[42.77,38.16],[40.04,35.45],[40.04,35.3],[40.04,16.97],[34.28,11.25],[28.52,16.97],[28.52,35.3],[28.52,35.45],[25.64,38.16],[25.5,38.16],[22.77,35.45],[22.77,35.3],[22.77,16.97],[17.01,11.25],[11.25,16.97]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"17\",\"layers\":[{\"ind\":10,\"ty\":0,\"parent\":6,\"ks\":{},\"w\":116,\"h\":122,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"8\"},{\"ind\":6,\"ty\":3,\"parent\":5,\"ks\":{\"s\":{\"a\":0,\"k\":[41.93,41.59]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{\"p\":{\"a\":0,\"k\":[6.181,6.13]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":16,\"ty\":0,\"parent\":12,\"ks\":{},\"w\":146,\"h\":152,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"14\"},{\"ind\":12,\"ty\":3,\"parent\":11,\"ks\":{\"s\":{\"a\":0,\"k\":[41.93,41.59]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":11,\"ty\":3,\"parent\":4,\"ks\":{\"p\":{\"a\":0,\"k\":[-0.109,-0.108]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":4,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[1,1]}},\"ip\":0,\"op\":55,\"st\":0}]},{\"id\":\"24\",\"layers\":[{\"ind\":23,\"ty\":2,\"parent\":22,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"0\"},{\"ind\":22,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[61.24,61.24]}},\"ip\":0,\"op\":55,\"st\":0}]},{\"id\":\"32\",\"layers\":[{\"ind\":31,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"37\",\"layers\":[{\"ind\":36,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"43\",\"layers\":[{\"ind\":42,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"48\",\"layers\":[{\"ind\":47,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"53\",\"layers\":[{\"ind\":52,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":19,\"ty\":0,\"parent\":3,\"ks\":{\"a\":{\"a\":0,\"k\":[31.5,32.5]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":12,\"s\":[0],\"h\":1},{\"t\":54,\"s\":[0],\"h\":1}]},\"p\":{\"a\":0,\"k\":[30.5,31.5]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":12,\"s\":[50,50],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[50,50],\"h\":1}]}},\"w\":147,\"h\":153,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"17\"},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{\"p\":{\"a\":0,\"k\":[28.768,29]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":27,\"ty\":4,\"td\":1,\"parent\":21,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[39.5,39.5]},\"r\":{\"a\":0,\"k\":150},\"s\":{\"a\":0,\"k\":[79,79]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":26,\"ty\":0,\"tt\":1,\"parent\":21,\"ks\":{},\"w\":79,\"h\":79,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"24\"},{\"ind\":21,\"ty\":3,\"parent\":20,\"ks\":{\"a\":{\"a\":0,\"k\":[39.5,39.5]},\"p\":{\"a\":0,\"k\":[39.5,39.5]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[-45],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0.5,\"y\":0}},{\"t\":54,\"s\":[0],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0,0],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":54,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":20,\"ty\":3,\"parent\":2,\"ks\":{\"p\":{\"a\":0,\"k\":[69,20]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":34,\"ty\":0,\"parent\":30,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"32\"},{\"ind\":30,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.974,4.541],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[4.974,1.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[4.974,1.541],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":39,\"ty\":0,\"parent\":35,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"37\"},{\"ind\":35,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":29,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":45,\"ty\":0,\"parent\":41,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"43\"},{\"ind\":41,\"ty\":3,\"parent\":40,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.474,4.541],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[4.474,1.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[4.474,1.541],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":50,\"ty\":0,\"parent\":46,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"48\"},{\"ind\":46,\"ty\":3,\"parent\":40,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":40,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":55,\"ty\":0,\"parent\":51,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"53\"},{\"ind\":51,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":28,\"ty\":3,\"parent\":2,\"ks\":{\"a\":{\"a\":0,\"k\":[67.649,55.9]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[108.343,99.459],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[108.343,139.459],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[108.343,139.459],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[60,60],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[60,60],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":2,\"ty\":3,\"parent\":1,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":1,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":54,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "assets/lotties/connexion.json",
    "content": "{\"assets\":[{\"h\":96,\"id\":\"0\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":129,\"e\":1},{\"h\":112,\"id\":\"1\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":99,\"e\":1},{\"h\":84,\"id\":\"2\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":84,\"e\":1},{\"h\":84,\"id\":\"3\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":84,\"e\":1},{\"h\":42,\"id\":\"4\",\"p\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASBSURBVHgB7ZltaFtVGMf/N/emWV66pGFpm25NWaZ1VqpTYVK6oRNfcA4Gqx9FkX1R8NPQ+U1BQeqHIRPdB0WmQ9icuMmc+kFlrdMNlMIQ67razdY2Xds1TdvkJrkvOdfn3jn7luSeLknZoH+4JPfek5PfeZ7n/M/JjVD72WsGbnkJnzhwm2gVtNxaBS23lgXqcSiol9IwIGClJfE2DBHgqcbj2OCcwankHXhnsh1DWmDFkLkj+oTvMqJVU6gScnhm7SX8Fv0Yr4d+BlshVC5QRseLgZ5FVwW8HPyVovwFvAJDpcUFGhVn0eyK573X5vkHr4a6UOnljQu0UZoGiqT4pZoLeIpKo5LiAt0opG3bvF37k1W/lRLfZGIMzIZhvTOB7Z5hVEpcoAO5tVBl+2jt8A4Wve8QDLK5DFncNA1s1soArydz+eiA4YeWZnD5RAhFhnaXa9KaVPO/2jzfsuYqXgj8ga3uYYKUCVCFYQhIMh8uKH78kNqME8k7Mal7UBLoGKvGsL4OkXgcvlDhj/gdumVl4n/nZtTerO3GLl//InwBAp36xRQe9phHDPuC59Ex0oFeJZS3b67Um42OaK1gmgF5UjdLNq/SxlyHEUrv6cgxgvwL4EhvDa18YRpYMQYufa7dh1EWRE41kJ7QrdfFmtDdFlKdlMKJyHE00CuvZpgbZ+UmlAyaNlzYl91JqXVQRK9HNjuzcIKdTLZYNXmg7gx5Lz+kqcNTD0AxpNJBTfXk1uOQ2ma9F50CRNdcSs01f0gNkvFfweNWuvk1qPpwaOrBom24JlONqNJG5CK2eYaw2XUNPlGCw7Gw7noyYVxSa/BB+DssR1m9CvtHd2LGkG4e1EzjkxShg/XfIyjK8+4snRxHrt2DRz1/o8U18f81s44FSaBB5embyieTEvHWVDu6lQ2wU1HQ3dX9+Kjha9jN2pGEB6ezd+PD4MkF1zOJHK1oBhzO67CmB5uDZxowTul+RXka5/Qm8KggaL0zSR7YZQupyAzvJtpQTSb+kGtsYeduB9RUzrK1G46Wokl5VLsX76ntyNJ7XhUEfd7fi7DNzFVSDL3TQXyqbcEuaQBuScX8gbl8DpyXw/hTDSPOPDijR3HFCBIg9w8Le9DWNWMFP2RQeExrmki7sTfdQSuRgVYxtqSdmerIOgV7B9shM/7o5VNBezoab8FV2QemGxaYWfw5SqEJmBzX8G2yGbvl5zBK+wBTPmStNou1iVaozroulKqCEf0m04xzsSa0SDHscV6EX8ggzZy4zEL4Ud+EvlwtdMz3UdGqxXzaU92H/eOPIFNCVIsWS4KK/Rctah126mMN0PWe/F9C27kd3hhlwb6fQirbA4ivaKIkVFfBqNZLsyhFZQM1reZ9hSwnlX+DrRoiSlFZH+kc0+7H4VnaXCSXwp5NN6IUlRU0S1F7I/sYDsTbIKfmuu5XA7TxCKAULd95bWQm+KCyDV+OtuJZ7+/Y6JXRmdha8vOUsoPe0Aj5a2dqO62ZKItWn4+WW6ug5dZtAyqZfzbhFhf9POv+F7NtpNQ3hR5HAAAAAElFTkSuQmCC\",\"u\":\"\",\"w\":42,\"e\":1},{\"id\":\"10\",\"layers\":[{\"ind\":9,\"ty\":2,\"parent\":8,\"ks\":{\"s\":{\"a\":0,\"k\":[33.33,33.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"0\"},{\"ind\":8,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"20\",\"layers\":[{\"ind\":17,\"ty\":4,\"parent\":16,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"el\",\"p\":{\"a\":0,\"k\":[4.375,4.375]},\"s\":{\"a\":0,\"k\":[8.75,8.75]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":16,\"ty\":3,\"parent\":15,\"ks\":{\"p\":{\"a\":0,\"k\":[8.422,7.292]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":19,\"ty\":2,\"parent\":18,\"ks\":{\"s\":{\"a\":0,\"k\":[33.33,33.04]}},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"1\"},{\"ind\":18,\"ty\":3,\"parent\":15,\"ks\":{\"a\":{\"a\":0,\"k\":[16.5,18.5]},\"p\":{\"a\":0,\"k\":[12.538,14.893]},\"r\":{\"a\":0,\"k\":12.68}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":15,\"ty\":3,\"parent\":14,\"ks\":{\"a\":{\"a\":0,\"k\":[13.037,14.939]},\"p\":{\"a\":0,\"k\":[15.997,17.436]},\"r\":{\"a\":0,\"k\":-12.68}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":14,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[9,9]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"28\",\"layers\":[{\"ind\":27,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[16.5,15]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[33,30]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0.21,1.3]],\"o\":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[1.3,-0.21],[0,0]],\"v\":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[12.96,10.61]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[4.24,-0.68],[-0.69,-4.24],[-4.25,0.68],[-1.09,1.04],[0,0],[-0.47,0.65],[0.65,0.47],[0,0],[0.26,1.6]],\"o\":[[-0.69,-4.24],[-4.24,0.69],[0.68,4.25],[1.6,-0.26],[0,0],[0.65,0.47],[0.47,-0.66],[0,0],[0.64,-1.37],[0,0]],\"v\":[[18.29,9.75],[9.36,3.31],[2.92,12.23],[11.85,18.68],[15.95,16.65],[19.79,19.43],[21.83,19.1],[21.5,17.06],[17.66,14.29],[18.29,9.75]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0,0],[0.43,2.65],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0,0],[0.21,1.3]],\"o\":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[0,0],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0.43,2.65],[0,0],[1.3,-0.21],[0,0]],\"v\":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[11.38,15.8],[5.8,11.77],[9.83,6.19],[15.41,10.22],[11.38,15.8],[10.98,13.35],[12.96,10.61]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.27,-1.15],[0,0],[1.27,-1.76],[1.76,1.27],[0,0],[1.22,-0.25],[0,0],[1.02,5.45],[0,0],[-5.59,0.9],[0,0],[-0.89,-5.5]],\"o\":[[0.15,1.23],[0,0],[1.76,1.27],[-1.27,1.76],[0,0],[-1.01,0.62],[0,0],[-5.51,0.89],[0,0],[-0.9,-5.59],[0,0],[5.5,-0.75],[0,0]],\"v\":[[20.79,9.75],[20.59,13.35],[22.95,15.05],[23.84,20.54],[18.34,21.43],[15.98,19.73],[12.63,21.05],[12.24,21.12],[0.52,12.89],[0.48,12.63],[8.97,0.87],[9.23,0.83],[20.73,9.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"33\",\"layers\":[{\"ind\":32,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[13.5,11.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[27,23]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.69,-4.24],[0.64,-1.37],[0,0],[0.47,-0.65],[0.65,0.47],[0,0],[1.6,-0.26],[0.68,4.24],[-4.24,0.69]],\"o\":[[4.24,-0.68],[0.26,1.6],[0,0],[0.65,0.47],[-0.47,0.66],[0,0],[-1.09,1.04],[-4.25,0.69],[-0.69,-4.24],[0,0]],\"v\":[[7.11,0.31],[16.04,6.75],[15.41,11.29],[19.25,14.06],[19.58,16.09],[17.54,16.43],[13.7,13.65],[9.6,15.68],[0.67,9.23],[7.11,0.31]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.43,-2.65],[-2.65,0.43],[0.43,2.66],[2.65,-0.43]],\"o\":[[-2.65,0.43],[0.43,2.65],[2.65,-0.43],[-0.43,-2.65],[0,0]],\"v\":[[7.58,3.19],[3.55,8.77],[9.13,12.8],[13.16,7.21],[7.58,3.19]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.49,0.79,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"36\",\"layers\":[{\"ind\":30,\"ty\":0,\"parent\":26,\"ks\":{},\"w\":33,\"h\":30,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"28\"},{\"ind\":26,\"ty\":3,\"parent\":25,\"ks\":{\"a\":{\"a\":0,\"k\":[16.5,15]},\"p\":{\"a\":0,\"k\":[15.953,14.392]},\"r\":{\"a\":0,\"k\":9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":35,\"ty\":0,\"parent\":31,\"ks\":{},\"w\":27,\"h\":23,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"33\"},{\"ind\":31,\"ty\":3,\"parent\":25,\"ks\":{\"a\":{\"a\":0,\"k\":[13.5,11.5]},\"p\":{\"a\":0,\"k\":[15.873,14.886]},\"r\":{\"a\":0,\"k\":9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":25,\"ty\":3,\"parent\":24,\"ks\":{\"a\":{\"a\":0,\"k\":[15.3,15.3]},\"p\":{\"a\":0,\"k\":[17.544,17.544]},\"r\":{\"a\":0,\"k\":-9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":24,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[3,4]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"46\",\"layers\":[{\"ind\":45,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.29],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.28,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.49],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.45,0.77],[7.53,1.46],[8.59,3.2],[8.25,5.36],[7.56,7.45],[5.82,8.51],[3.66,8.17],[1.57,7.48],[0.51,5.74],[0.85,3.57],[1.54,1.49],[3.28,0.43],[5.45,0.77]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.13,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.14],[-0.39,-0.1],[-0.17,0.03],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.13],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.22,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.22],[-0.14,-0.1],[0,0]],\"v\":[[4.88,3.25],[4.12,3.14],[3.56,3.48],[3.32,4.2],[3.21,4.95],[3.55,5.51],[4.27,5.75],[5.02,5.86],[5.58,5.52],[5.82,4.8],[5.93,4.05],[5.59,3.49],[4.88,3.25]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"51\",\"layers\":[{\"ind\":50,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.32,0.96],[7.4,1.65],[8.46,3.39],[8.12,5.56],[7.43,7.64],[5.69,8.7],[3.52,8.36],[1.44,7.67],[0.38,5.93],[0.72,3.77],[1.41,1.68],[3.15,0.62],[5.32,0.96]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.1,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.14],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],\"v\":[[4.74,3.44],[3.99,3.33],[3.43,3.67],[3.19,4.39],[3.07,5.14],[3.41,5.7],[4.14,5.94],[4.89,6.06],[5.45,5.71],[5.69,5],[5.8,4.25],[5.46,3.68],[4.74,3.44]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"56\",\"layers\":[{\"ind\":55,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.57,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.29,0.79],[7.37,1.48],[8.43,3.23],[8.09,5.39],[7.4,7.48],[5.66,8.54],[3.49,8.2],[1.41,7.51],[0.35,5.77],[0.69,3.6],[1.38,1.52],[3.12,0.46],[5.29,0.79]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.02,0.17],[0.18,0.14],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.23,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],\"v\":[[4.71,3.28],[3.96,3.16],[3.4,3.51],[3.16,4.23],[3.04,4.98],[3.39,5.54],[4.11,5.78],[4.86,5.89],[5.41,5.55],[5.66,4.83],[5.77,4.08],[5.43,3.52],[4.71,3.28]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"61\",\"layers\":[{\"ind\":60,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[2.5,2.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[5,5]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.24,0.23],[3.29,1.96],[1.57,3.01],[0.52,1.28],[2.24,0.23]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"66\",\"layers\":[{\"ind\":65,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[2.5,2.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[5,5]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.11,0.61],[3.16,2.34],[1.44,3.39],[0.39,1.66],[2.11,0.61]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"71\",\"layers\":[{\"ind\":70,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[5.5,3]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[11,6]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[0.15,-0.62],[0.77,0.19],[0,0],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0,0],[0.77,0.19],[-0.19,0.77],[0,0],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.48,0.48],[7.11,1.6],[8.16,3.33],[6.44,4.38],[1.81,3.26],[0.76,1.53],[2.48,0.48]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"74\",\"layers\":[{\"ind\":48,\"ty\":0,\"parent\":44,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"46\"},{\"ind\":44,\"ty\":3,\"parent\":43,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[17.594,5.138]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":53,\"ty\":0,\"parent\":49,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"51\"},{\"ind\":49,\"ty\":3,\"parent\":43,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[5.134,17.416]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":58,\"ty\":0,\"parent\":54,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"56\"},{\"ind\":54,\"ty\":3,\"parent\":43,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[5.225,5.047]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":63,\"ty\":0,\"parent\":59,\"ks\":{},\"w\":5,\"h\":5,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"61\"},{\"ind\":59,\"ty\":3,\"parent\":43,\"ks\":{\"a\":{\"a\":0,\"k\":[2.5,2.5]},\"p\":{\"a\":0,\"k\":[20.992,21.292]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":68,\"ty\":0,\"parent\":64,\"ks\":{},\"w\":5,\"h\":5,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"66\"},{\"ind\":64,\"ty\":3,\"parent\":43,\"ks\":{\"a\":{\"a\":0,\"k\":[2.5,2.5]},\"p\":{\"a\":0,\"k\":[14.69,20.761]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":73,\"ty\":0,\"parent\":69,\"ks\":{},\"w\":11,\"h\":6,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"71\"},{\"ind\":69,\"ty\":3,\"parent\":43,\"ks\":{\"a\":{\"a\":0,\"k\":[5.5,3]},\"p\":{\"a\":0,\"k\":[17.282,14.474]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":43,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[2.572,2.572]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"79\",\"layers\":[{\"ind\":76,\"ty\":0,\"parent\":42,\"ks\":{\"a\":{\"a\":0,\"k\":[2.286,2.286]},\"p\":{\"a\":0,\"k\":[2.286,2.286]}},\"w\":27.4286,\"h\":27.4286,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"74\"},{\"ind\":42,\"ty\":3,\"parent\":41,\"ks\":{\"p\":{\"a\":0,\"k\":[2.286,2.286]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":78,\"ty\":4,\"parent\":77,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[16,16]},\"r\":{\"a\":0,\"k\":6.857},\"s\":{\"a\":0,\"k\":[32,32]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":77,\"ty\":3,\"parent\":41,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":41,\"ty\":3,\"parent\":40,\"ks\":{\"a\":{\"a\":0,\"k\":[16,16]},\"p\":{\"a\":0,\"k\":[19.317,19.317]},\"r\":{\"a\":0,\"k\":13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":40,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[1,0]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"87\",\"layers\":[{\"ind\":86,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[11.5,12]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[23,24]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.06,-1.04],[1.39,0],[0,0],[0,1.6],[-0.02,0.8],[0.21,0.69],[0.63,-2.06],[-0.01,-0.61],[0,-0.89],[1.6,0],[0,0],[0.07,1.39],[-0.3,0.91],[0.32,1.05],[-0.98,0.66],[0,0],[-0.98,-0.65],[0,0],[0.35,-1.14],[-0.57,-1.71]],\"o\":[[0.31,0.91],[-0.07,1.39],[0,0],[-1.6,0],[0,-0.89],[0.01,-0.61],[-0.63,-2.06],[-0.21,0.69],[0.02,0.8],[0,1.6],[0,0],[-1.39,0],[-0.06,-1.04],[0.57,-1.71],[-0.35,-1.14],[0,0],[0.98,-0.65],[0,0],[0.98,0.66],[-0.32,1.05],[0,0]],\"v\":[[16.63,12.18],[16.91,15.32],[14.23,17.7],[13.98,17.7],[11.07,14.81],[11.09,12.18],[10.75,10.2],[6.8,10.2],[6.46,12.18],[6.48,14.81],[3.57,17.7],[3.32,17.7],[0.64,15.32],[0.92,12.18],[1.03,7.98],[1.87,4.75],[7.15,1.23],[10.4,1.23],[15.68,4.75],[16.52,7.98],[16.63,12.18]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"90\",\"layers\":[{\"ind\":89,\"ty\":0,\"parent\":85,\"ks\":{},\"w\":23,\"h\":24,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"87\"},{\"ind\":85,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[4.3,4.1]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"99\",\"layers\":[{\"ind\":98,\"ty\":2,\"parent\":97,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"2\"},{\"ind\":97,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[51.19,51.19]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"106\",\"layers\":[{\"ind\":105,\"ty\":2,\"parent\":104,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"3\"},{\"ind\":104,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[50,50]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"113\",\"layers\":[{\"ind\":112,\"ty\":2,\"parent\":111,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"4\"},{\"ind\":111,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[99.06,99.06]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"121\",\"layers\":[{\"ind\":120,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"126\",\"layers\":[{\"ind\":125,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"132\",\"layers\":[{\"ind\":131,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"137\",\"layers\":[{\"ind\":136,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"142\",\"layers\":[{\"ind\":141,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":12,\"ty\":0,\"parent\":7,\"ks\":{\"a\":{\"a\":0,\"k\":[21.5,16]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":61.08,\"s\":[0],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":93.6,\"s\":[100],\"h\":1},{\"t\":119.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":0,\"k\":[21.5,16]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[50,50],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":61.08,\"s\":[50,50],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":93.6,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[100,100],\"h\":1}]}},\"w\":43,\"h\":32,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"10\"},{\"ind\":7,\"ty\":3,\"parent\":6,\"ks\":{\"p\":{\"a\":0,\"k\":[138,40]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":22,\"ty\":0,\"parent\":13,\"ks\":{\"a\":{\"a\":0,\"k\":[24.997,26.436]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":45.6,\"s\":[0],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":78.12,\"s\":[100],\"h\":1},{\"t\":119.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":0,\"k\":[15.997,17.436]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[50,50],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":45.6,\"s\":[50,50],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":78.12,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[100,100],\"h\":1}]}},\"w\":50,\"h\":53,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"20\"},{\"ind\":13,\"ty\":3,\"parent\":6,\"ks\":{\"p\":{\"a\":0,\"k\":[87,28]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":38,\"ty\":0,\"parent\":23,\"ks\":{\"a\":{\"a\":0,\"k\":[20.544,21.544]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":20.4,\"s\":[0],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":45.6,\"s\":[100],\"h\":1},{\"t\":119.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":0,\"k\":[17.544,17.544]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[50,50],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":20.4,\"s\":[50,50],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":45.6,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[100,100],\"h\":1}]}},\"w\":43,\"h\":41,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"36\"},{\"ind\":23,\"ty\":3,\"parent\":6,\"ks\":{\"p\":{\"a\":0,\"k\":[7,49]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":81,\"ty\":0,\"parent\":39,\"ks\":{\"a\":{\"a\":0,\"k\":[20.317,19.317]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":29.76,\"s\":[0],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":62.28,\"s\":[100],\"h\":1},{\"t\":119.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":0,\"k\":[19.317,19.317]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[50,50],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":29.76,\"s\":[50,50],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":62.28,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[100,100],\"h\":1}]}},\"w\":40,\"h\":39,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"79\"},{\"ind\":39,\"ty\":3,\"parent\":6,\"ks\":{\"p\":{\"a\":0,\"k\":[41,10]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":92,\"ty\":0,\"parent\":84,\"ks\":{\"a\":{\"a\":0,\"k\":[5.2,3.9]},\"p\":{\"a\":0,\"k\":[5.2,3.9]}},\"w\":31.2,\"h\":31.2,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"90\"},{\"ind\":84,\"ty\":3,\"parent\":83,\"ks\":{\"p\":{\"a\":0,\"k\":[5.2,3.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":94,\"ty\":4,\"parent\":93,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[20.802,20.802]},\"r\":{\"a\":0,\"k\":27.3},\"s\":{\"a\":0,\"k\":[41.604,41.604]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":93,\"ty\":3,\"parent\":83,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":83,\"ty\":3,\"parent\":82,\"ks\":{\"a\":{\"a\":0,\"k\":[20.802,20.802]},\"p\":{\"a\":0,\"k\":[20.802,20.802]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":12.72,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":12.72,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":82,\"ty\":3,\"parent\":6,\"ks\":{\"p\":{\"a\":0,\"k\":[20,134]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":101,\"ty\":0,\"parent\":96,\"ks\":{},\"w\":43,\"h\":43,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"99\"},{\"ind\":96,\"ty\":3,\"parent\":95,\"ks\":{\"a\":{\"a\":0,\"k\":[21.5,21.5]},\"p\":{\"a\":0,\"k\":[21.5,21.5]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":3.66,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":16.38,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":3.66,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":16.38,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":95,\"ty\":3,\"parent\":6,\"ks\":{\"p\":{\"a\":0,\"k\":[157,133]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":108,\"ty\":0,\"parent\":103,\"ks\":{},\"w\":42,\"h\":42,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"106\"},{\"ind\":103,\"ty\":3,\"parent\":102,\"ks\":{\"a\":{\"a\":0,\"k\":[21,21]},\"p\":{\"a\":0,\"k\":[21,21]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":10.02,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.74,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":10.02,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.74,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":102,\"ty\":3,\"parent\":6,\"ks\":{\"p\":{\"a\":0,\"k\":[130,0]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":116,\"ty\":4,\"td\":1,\"parent\":110,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[20.802,20.802]},\"r\":{\"a\":0,\"k\":27.3},\"s\":{\"a\":0,\"k\":[41.604,41.604]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":115,\"ty\":0,\"tt\":1,\"parent\":110,\"ks\":{},\"w\":41.604,\"h\":41.604,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"113\"},{\"ind\":110,\"ty\":3,\"parent\":109,\"ks\":{\"a\":{\"a\":0,\"k\":[20.802,20.802]},\"p\":{\"a\":0,\"k\":[20.802,20.802]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":17.28,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":30,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":17.28,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":30,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":109,\"ty\":3,\"parent\":6,\"ks\":{\"p\":{\"a\":0,\"k\":[12,9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":123,\"ty\":0,\"parent\":119,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"121\"},{\"ind\":119,\"ty\":3,\"parent\":118,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.974,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":17.4,\"s\":[4.974,4.541],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.501],\"y\":[0,0]}},{\"t\":45.84,\"s\":[4.974,0.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[4.974,0.541],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":128,\"ty\":0,\"parent\":124,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"126\"},{\"ind\":124,\"ty\":3,\"parent\":118,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":118,\"ty\":3,\"parent\":117,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":134,\"ty\":0,\"parent\":130,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"132\"},{\"ind\":130,\"ty\":3,\"parent\":129,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.474,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":17.4,\"s\":[4.474,4.541],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.501],\"y\":[0,0]}},{\"t\":45.84,\"s\":[4.474,0.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[4.474,0.541],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":139,\"ty\":0,\"parent\":135,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"137\"},{\"ind\":135,\"ty\":3,\"parent\":129,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":129,\"ty\":3,\"parent\":117,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":144,\"ty\":0,\"parent\":140,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"142\"},{\"ind\":140,\"ty\":3,\"parent\":117,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":117,\"ty\":3,\"parent\":6,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[32.926,43.559],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[32.926,63.559],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[32.926,63.559],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":6,\"ty\":3,\"parent\":5,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":5,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":119.4,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "assets/lotties/izly.json",
    "content": "{\"assets\":[{\"h\":129,\"id\":\"0\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":129,\"e\":1},{\"id\":\"8\",\"layers\":[{\"ind\":7,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[58,61]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[116,122]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.01,-0.19],[5.35,-0.2],[0.46,0],[0.22,0.01],[-1.3,6.14],[-0.14,0.55],[0,0],[0,21.13],[-8.57,4.36],[-2.45,-1.48],[0,-6.03]],\"o\":[[0,0.45],[-0.2,5.31],[-0.2,0.01],[-0.57,0],[-6.32,-0.28],[0.05,-0.21],[0,0],[0,0],[0,-12.03],[4.86,-2.48],[2.45,1.49],[0,0]],\"v\":[[87,80.84],[86.99,81.72],[77.15,91.49],[76.27,91.5],[75.19,91.49],[65.62,79.23],[65.88,78.19],[71.65,55.92],[56.29,28.76],[74.81,4.72],[84.55,2.49],[87,13.02]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.6,0.6,0.6,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[6.13,0],[-0.72,6.05],[0,0],[0.75,0.07],[0.72,7.24],[0,1.77],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[0.07,-0.75],[7.29,-0.71],[1.79,0]],\"o\":[[0,0],[0.72,6.05],[-6.13,0],[0,0],[-1.79,0],[-7.29,-0.71],[-0.07,-0.75],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.77],[-0.72,7.24],[-0.75,0.07],[0,0]],\"v\":[[28.79,43.06],[33.2,80.14],[23.03,91.5],[12.86,80.14],[17.27,43.06],[13.85,42.98],[0.07,29.3],[0,25.9],[0,5.72],[5.76,0],[11.52,5.72],[11.52,24.05],[14.39,26.91],[17.27,24.05],[17.27,5.72],[23.03,0],[28.79,5.72],[28.79,24.05],[31.66,26.91],[34.54,24.05],[34.54,5.72],[40.3,0],[46.06,5.72],[46.06,25.9],[45.98,29.3],[32.21,42.98],[28.79,43.06]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.6,0.6,0.6,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"14\",\"layers\":[{\"ind\":13,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[73,76]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[146,152]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.45,1.49],[4.86,-2.48],[0,0],[0,-11.65],[-0.03,-0.01],[0,0],[0,0],[0.02,-0.11],[-6.32,-0.28],[-0.57,0],[-0.2,0.01],[-0.32,5.2],[0,0],[0,0.45]],\"o\":[[0,-6.03],[-2.45,-1.48],[0,0],[-8.37,4.43],[0,21.11],[0,0],[0,0],[-0.04,0.17],[-1.3,6.14],[0.22,0.01],[0.46,0],[5.27,-0.2],[0,0],[0.01,-0.19],[0,0]],\"v\":[[98.25,24.27],[95.8,13.74],[86.06,15.97],[85.25,16.39],[67.54,40.01],[82.9,67.17],[77.13,89.44],[76.96,90.09],[76.87,90.48],[86.44,102.74],[87.52,102.75],[88.4,102.74],[98.23,93.21],[98.24,92.97],[98.25,92.09]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.02,-0.46],[11.06,-0.41],[0.36,0],[0.53,0.02],[-2.74,12.91],[0,0],[-0.08,0.32],[0,0],[1.05,1.13],[1.92,4.41],[2.91,-1.23],[0,0],[12.67,0],[-1.51,12.7],[0,0],[0.97,9.82],[0,1.14],[0,0],[-9.21,0],[0,0],[-2.42,-1.45],[-3.15,0],[0,0],[-2.41,-1.45],[-3.14,0],[0,0],[-1.04,-8.17],[-3.7,1.89],[-2.8,0.79],[-4.37,-2.48],[0,0],[0,0],[-0.63,-3.48],[0,-2.58]],\"o\":[[0,0.35],[-0.43,11.15],[-0.45,0.02],[-0.45,0],[-13.05,-0.57],[0,0],[0.09,-0.4],[0,0],[-1.02,-0.87],[-2.62,-2.84],[-2.27,2.13],[0,0],[1.51,12.7],[-12.67,0],[0,0],[-8.7,-3.66],[-0.11,-1.07],[0,0],[0,-9.33],[0,0],[2.99,0.08],[2.53,-1.52],[0,0],[2.98,0.08],[2.53,-1.52],[0,0],[8.31,0.21],[4.35,-4],[2.02,-1.03],[3.54,-1.01],[0,0],[0,0],[4.5,2.93],[0.52,2.91],[0,0]],\"v\":[[109.3,92.09],[109.29,93.39],[88.82,113.79],[87.52,113.8],[85.95,113.79],[66.05,88.19],[66.14,87.79],[66.43,86.67],[70.22,72.02],[67.11,69.02],[60.07,58.2],[52.24,63.29],[55.42,90.09],[34.28,113.8],[13.14,90.09],[16.32,63.29],[0.32,41.64],[0.2,38.29],[0.2,16.97],[17.01,0.2],[17.44,0.2],[25.64,2.58],[34.28,0.2],[34.71,0.2],[42.91,2.58],[51.55,0.2],[51.98,0.2],[68.23,14.84],[81.05,6.11],[88.81,2.74],[101.12,4.05],[101.54,4.29],[101.98,4.57],[108.82,15.34],[109.3,24.27]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[-0.05,-0.56],[-7.29,-0.71],[-1.79,0],[0,0],[-5.99,-0.16],[0,0],[0.54,5.93],[0,0],[0,0],[-0.75,0.07],[-0.72,7.24],[0,1.77],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.08,1.46],[0,0],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.07,1.46],[0,0],[0,0],[3.18,0],[0,-3.16]],\"o\":[[0,0],[0,1.03],[0.72,7.24],[0.75,0.07],[0,0],[-0.71,5.95],[0,0],[6.03,0],[0,0],[0,0],[1.79,0],[7.29,-0.71],[0.07,-0.75],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.07,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.08,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0]],\"v\":[[11.25,37.15],[11.25,38.33],[11.32,40.55],[25.1,54.23],[28.52,54.31],[24.11,91.39],[33.99,102.75],[34.28,102.75],[44.47,91.68],[44.45,91.39],[40.04,54.31],[43.46,54.23],[57.23,40.55],[57.31,37.15],[57.31,16.97],[51.55,11.25],[45.79,16.97],[45.79,35.3],[45.79,35.45],[42.91,38.16],[42.77,38.16],[40.04,35.45],[40.04,35.3],[40.04,16.97],[34.28,11.25],[28.52,16.97],[28.52,35.3],[28.52,35.45],[25.64,38.16],[25.5,38.16],[22.77,35.45],[22.77,35.3],[22.77,16.97],[17.01,11.25],[11.25,16.97]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"17\",\"layers\":[{\"ind\":10,\"ty\":0,\"parent\":6,\"ks\":{},\"w\":116,\"h\":122,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"8\"},{\"ind\":6,\"ty\":3,\"parent\":5,\"ks\":{\"s\":{\"a\":0,\"k\":[41.93,41.59]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{\"p\":{\"a\":0,\"k\":[6.181,6.13]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":16,\"ty\":0,\"parent\":12,\"ks\":{},\"w\":146,\"h\":152,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"14\"},{\"ind\":12,\"ty\":3,\"parent\":11,\"ks\":{\"s\":{\"a\":0,\"k\":[41.93,41.59]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":11,\"ty\":3,\"parent\":4,\"ks\":{\"p\":{\"a\":0,\"k\":[-0.109,-0.108]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":4,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[1,1]}},\"ip\":0,\"op\":55,\"st\":0}]},{\"id\":\"24\",\"layers\":[{\"ind\":23,\"ty\":2,\"parent\":22,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"0\"},{\"ind\":22,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[61.24,61.24]}},\"ip\":0,\"op\":55,\"st\":0}]},{\"id\":\"32\",\"layers\":[{\"ind\":31,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"37\",\"layers\":[{\"ind\":36,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"43\",\"layers\":[{\"ind\":42,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"48\",\"layers\":[{\"ind\":47,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"53\",\"layers\":[{\"ind\":52,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":19,\"ty\":0,\"parent\":3,\"ks\":{\"a\":{\"a\":0,\"k\":[31.5,32.5]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":12,\"s\":[0],\"h\":1},{\"t\":54,\"s\":[0],\"h\":1}]},\"p\":{\"a\":0,\"k\":[30.5,31.5]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":12,\"s\":[50,50],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[50,50],\"h\":1}]}},\"w\":147,\"h\":153,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"17\"},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{\"p\":{\"a\":0,\"k\":[28.768,29]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":27,\"ty\":4,\"td\":1,\"parent\":21,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[39.5,39.5]},\"r\":{\"a\":0,\"k\":150},\"s\":{\"a\":0,\"k\":[79,79]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":26,\"ty\":0,\"tt\":1,\"parent\":21,\"ks\":{},\"w\":79,\"h\":79,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"24\"},{\"ind\":21,\"ty\":3,\"parent\":20,\"ks\":{\"a\":{\"a\":0,\"k\":[39.5,39.5]},\"p\":{\"a\":0,\"k\":[39.5,39.5]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[-45],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0.5,\"y\":0}},{\"t\":54,\"s\":[0],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0,0],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":54,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":20,\"ty\":3,\"parent\":2,\"ks\":{\"p\":{\"a\":0,\"k\":[69,20]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":34,\"ty\":0,\"parent\":30,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"32\"},{\"ind\":30,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.974,4.541],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[4.974,1.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[4.974,1.541],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":39,\"ty\":0,\"parent\":35,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"37\"},{\"ind\":35,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":29,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":45,\"ty\":0,\"parent\":41,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"43\"},{\"ind\":41,\"ty\":3,\"parent\":40,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.474,4.541],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[4.474,1.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[4.474,1.541],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":50,\"ty\":0,\"parent\":46,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"48\"},{\"ind\":46,\"ty\":3,\"parent\":40,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":40,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":55,\"ty\":0,\"parent\":51,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"53\"},{\"ind\":51,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":28,\"ty\":3,\"parent\":2,\"ks\":{\"a\":{\"a\":0,\"k\":[67.649,55.9]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[108.343,99.459],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[108.343,139.459],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[108.343,139.459],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[60,60],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[60,60],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":2,\"ty\":3,\"parent\":1,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":1,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":54,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "assets/lotties/link.json",
    "content": "{\"assets\":[{\"h\":346,\"id\":\"0\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":465,\"e\":1},{\"h\":112,\"id\":\"1\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":99,\"e\":1},{\"id\":\"19\",\"layers\":[{\"ind\":18,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[16.5,15]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[33,30]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0.21,1.3]],\"o\":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[1.3,-0.21],[0,0]],\"v\":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[12.96,10.61]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[4.24,-0.68],[-0.69,-4.24],[-4.25,0.68],[-1.09,1.04],[0,0],[-0.47,0.65],[0.65,0.47],[0,0],[0.26,1.6]],\"o\":[[-0.69,-4.24],[-4.24,0.69],[0.68,4.25],[1.6,-0.26],[0,0],[0.65,0.47],[0.47,-0.66],[0,0],[0.64,-1.37],[0,0]],\"v\":[[18.29,9.75],[9.36,3.31],[2.92,12.23],[11.85,18.68],[15.95,16.65],[19.79,19.43],[21.83,19.1],[21.5,17.06],[17.66,14.29],[18.29,9.75]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0,0],[0.43,2.65],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0,0],[0.21,1.3]],\"o\":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[0,0],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0.43,2.65],[0,0],[1.3,-0.21],[0,0]],\"v\":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[11.38,15.8],[5.8,11.77],[9.83,6.19],[15.41,10.22],[11.38,15.8],[10.98,13.35],[12.96,10.61]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.27,-1.15],[0,0],[1.27,-1.76],[1.76,1.27],[0,0],[1.22,-0.25],[0,0],[1.02,5.45],[0,0],[-5.59,0.9],[0,0],[-0.89,-5.5]],\"o\":[[0.15,1.23],[0,0],[1.76,1.27],[-1.27,1.76],[0,0],[-1.01,0.62],[0,0],[-5.51,0.89],[0,0],[-0.9,-5.59],[0,0],[5.5,-0.75],[0,0]],\"v\":[[20.79,9.75],[20.59,13.35],[22.95,15.05],[23.84,20.54],[18.34,21.43],[15.98,19.73],[12.63,21.05],[12.24,21.12],[0.52,12.89],[0.48,12.63],[8.97,0.87],[9.23,0.83],[20.73,9.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"24\",\"layers\":[{\"ind\":23,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[13.5,11.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[27,23]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.69,-4.24],[0.64,-1.37],[0,0],[0.47,-0.65],[0.65,0.47],[0,0],[1.6,-0.26],[0.68,4.24],[-4.24,0.69]],\"o\":[[4.24,-0.68],[0.26,1.6],[0,0],[0.65,0.47],[-0.47,0.66],[0,0],[-1.09,1.04],[-4.25,0.69],[-0.69,-4.24],[0,0]],\"v\":[[7.11,0.31],[16.04,6.75],[15.41,11.29],[19.25,14.06],[19.58,16.09],[17.54,16.43],[13.7,13.65],[9.6,15.68],[0.67,9.23],[7.11,0.31]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.43,-2.65],[-2.65,0.43],[0.43,2.66],[2.65,-0.43]],\"o\":[[-2.65,0.43],[0.43,2.65],[2.65,-0.43],[-0.43,-2.65],[0,0]],\"v\":[[7.58,3.19],[3.55,8.77],[9.13,12.8],[13.16,7.21],[7.58,3.19]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.49,0.79,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"34\",\"layers\":[{\"ind\":33,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.29],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.28,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.49],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.45,0.77],[7.53,1.46],[8.59,3.2],[8.25,5.36],[7.56,7.45],[5.82,8.51],[3.66,8.17],[1.57,7.48],[0.51,5.74],[0.85,3.57],[1.54,1.49],[3.28,0.43],[5.45,0.77]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.13,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.14],[-0.39,-0.1],[-0.17,0.03],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.13],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.22,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.22],[-0.14,-0.1],[0,0]],\"v\":[[4.88,3.25],[4.12,3.14],[3.56,3.48],[3.32,4.2],[3.21,4.95],[3.55,5.51],[4.27,5.75],[5.02,5.86],[5.58,5.52],[5.82,4.8],[5.93,4.05],[5.59,3.49],[4.88,3.25]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"39\",\"layers\":[{\"ind\":38,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.32,0.96],[7.4,1.65],[8.46,3.39],[8.12,5.56],[7.43,7.64],[5.69,8.7],[3.52,8.36],[1.44,7.67],[0.38,5.93],[0.72,3.77],[1.41,1.68],[3.15,0.62],[5.32,0.96]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.1,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.14],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],\"v\":[[4.74,3.44],[3.99,3.33],[3.43,3.67],[3.19,4.39],[3.07,5.14],[3.41,5.7],[4.14,5.94],[4.89,6.06],[5.45,5.71],[5.69,5],[5.8,4.25],[5.46,3.68],[4.74,3.44]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"44\",\"layers\":[{\"ind\":43,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.57,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.29,0.79],[7.37,1.48],[8.43,3.23],[8.09,5.39],[7.4,7.48],[5.66,8.54],[3.49,8.2],[1.41,7.51],[0.35,5.77],[0.69,3.6],[1.38,1.52],[3.12,0.46],[5.29,0.79]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.02,0.17],[0.18,0.14],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.23,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],\"v\":[[4.71,3.28],[3.96,3.16],[3.4,3.51],[3.16,4.23],[3.04,4.98],[3.39,5.54],[4.11,5.78],[4.86,5.89],[5.41,5.55],[5.66,4.83],[5.77,4.08],[5.43,3.52],[4.71,3.28]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"49\",\"layers\":[{\"ind\":48,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[2.5,2.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[5,5]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.24,0.23],[3.29,1.96],[1.57,3.01],[0.52,1.28],[2.24,0.23]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"54\",\"layers\":[{\"ind\":53,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[2.5,2.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[5,5]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.11,0.61],[3.16,2.34],[1.44,3.39],[0.39,1.66],[2.11,0.61]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"59\",\"layers\":[{\"ind\":58,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[5.5,3]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[11,6]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[0.15,-0.62],[0.77,0.19],[0,0],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0,0],[0.77,0.19],[-0.19,0.77],[0,0],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.48,0.48],[7.11,1.6],[8.16,3.33],[6.44,4.38],[1.81,3.26],[0.76,1.53],[2.48,0.48]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"62\",\"layers\":[{\"ind\":36,\"ty\":0,\"parent\":32,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"34\"},{\"ind\":32,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[17.594,5.138]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":41,\"ty\":0,\"parent\":37,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"39\"},{\"ind\":37,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[5.134,17.416]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":46,\"ty\":0,\"parent\":42,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"44\"},{\"ind\":42,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[5.225,5.047]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":51,\"ty\":0,\"parent\":47,\"ks\":{},\"w\":5,\"h\":5,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"49\"},{\"ind\":47,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[2.5,2.5]},\"p\":{\"a\":0,\"k\":[20.992,21.292]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":56,\"ty\":0,\"parent\":52,\"ks\":{},\"w\":5,\"h\":5,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"54\"},{\"ind\":52,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[2.5,2.5]},\"p\":{\"a\":0,\"k\":[14.69,20.761]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":61,\"ty\":0,\"parent\":57,\"ks\":{},\"w\":11,\"h\":6,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"59\"},{\"ind\":57,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[5.5,3]},\"p\":{\"a\":0,\"k\":[17.282,14.474]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":31,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[2.572,2.572]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"72\",\"layers\":[{\"ind\":71,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"77\",\"layers\":[{\"ind\":76,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"83\",\"layers\":[{\"ind\":82,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"88\",\"layers\":[{\"ind\":87,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"93\",\"layers\":[{\"ind\":92,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":6,\"ty\":2,\"parent\":5,\"ks\":{\"s\":{\"a\":0,\"k\":[9.25,9.25]}},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"0\"},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":4,\"ty\":3,\"parent\":3,\"ks\":{\"a\":{\"a\":0,\"k\":[21.5,16]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[159.5,56],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":10.44,\"s\":[159.5,56],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":62.94,\"s\":[106.5,92],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[106.5,92],\"h\":1}]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":10.44,\"s\":[0],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0.5,\"y\":0}},{\"t\":62.94,\"s\":[11],\"h\":1},{\"t\":119.4,\"s\":[11],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":10.44,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":62.94,\"s\":[360,360],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[360,360],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":11,\"ty\":4,\"parent\":10,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"el\",\"p\":{\"a\":0,\"k\":[4.375,4.375]},\"s\":{\"a\":0,\"k\":[8.75,8.75]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":10,\"ty\":3,\"parent\":9,\"ks\":{\"p\":{\"a\":0,\"k\":[8.422,7.292]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":13,\"ty\":2,\"parent\":12,\"ks\":{\"s\":{\"a\":0,\"k\":[33.33,33.04]}},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"1\"},{\"ind\":12,\"ty\":3,\"parent\":9,\"ks\":{\"a\":{\"a\":0,\"k\":[16.5,18.5]},\"p\":{\"a\":0,\"k\":[12.538,14.893]},\"r\":{\"a\":0,\"k\":12.68}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":9,\"ty\":3,\"parent\":8,\"ks\":{\"a\":{\"a\":0,\"k\":[13.037,14.939]},\"p\":{\"a\":0,\"k\":[15.997,17.436]},\"r\":{\"a\":0,\"k\":-12.68}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":8,\"ty\":3,\"parent\":7,\"ks\":{\"a\":{\"a\":0,\"k\":[15.997,17.436]},\"p\":{\"a\":0,\"k\":[15.997,17.436]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":7,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[87,28]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":21,\"ty\":0,\"parent\":17,\"ks\":{},\"w\":33,\"h\":30,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"19\"},{\"ind\":17,\"ty\":3,\"parent\":16,\"ks\":{\"a\":{\"a\":0,\"k\":[16.5,15]},\"p\":{\"a\":0,\"k\":[15.953,14.392]},\"r\":{\"a\":0,\"k\":9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":26,\"ty\":0,\"parent\":22,\"ks\":{},\"w\":27,\"h\":23,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"24\"},{\"ind\":22,\"ty\":3,\"parent\":16,\"ks\":{\"a\":{\"a\":0,\"k\":[13.5,11.5]},\"p\":{\"a\":0,\"k\":[15.873,14.886]},\"r\":{\"a\":0,\"k\":9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":16,\"ty\":3,\"parent\":15,\"ks\":{\"a\":{\"a\":0,\"k\":[15.3,15.3]},\"p\":{\"a\":0,\"k\":[17.544,17.544]},\"r\":{\"a\":0,\"k\":-9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":15,\"ty\":3,\"parent\":14,\"ks\":{\"a\":{\"a\":0,\"k\":[17.544,17.544]},\"p\":{\"a\":0,\"k\":[17.544,17.544]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":14,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[7,49]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":64,\"ty\":0,\"parent\":30,\"ks\":{\"a\":{\"a\":0,\"k\":[2.286,2.286]},\"p\":{\"a\":0,\"k\":[2.286,2.286]}},\"w\":27.4286,\"h\":27.4286,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"62\"},{\"ind\":30,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":0,\"k\":[2.286,2.286]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":66,\"ty\":4,\"parent\":65,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[16,16]},\"r\":{\"a\":0,\"k\":6.857},\"s\":{\"a\":0,\"k\":[32,32]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":65,\"ty\":3,\"parent\":29,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":29,\"ty\":3,\"parent\":28,\"ks\":{\"a\":{\"a\":0,\"k\":[16,16]},\"p\":{\"a\":0,\"k\":[19.317,19.317]},\"r\":{\"a\":0,\"k\":13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":28,\"ty\":3,\"parent\":27,\"ks\":{\"a\":{\"a\":0,\"k\":[19.317,19.317]},\"p\":{\"a\":0,\"k\":[19.317,19.317]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":27,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[41,10]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":74,\"ty\":0,\"parent\":70,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"72\"},{\"ind\":70,\"ty\":3,\"parent\":69,\"ks\":{\"p\":{\"a\":0,\"k\":[4.974,0.54]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":79,\"ty\":0,\"parent\":75,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"77\"},{\"ind\":75,\"ty\":3,\"parent\":69,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":69,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":85,\"ty\":0,\"parent\":81,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"83\"},{\"ind\":81,\"ty\":3,\"parent\":80,\"ks\":{\"p\":{\"a\":0,\"k\":[4.474,0.54]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":90,\"ty\":0,\"parent\":86,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"88\"},{\"ind\":86,\"ty\":3,\"parent\":80,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":80,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":95,\"ty\":0,\"parent\":91,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"93\"},{\"ind\":91,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":68,\"ty\":3,\"parent\":67,\"ks\":{\"a\":{\"a\":0,\"k\":[67.649,55.9]},\"p\":{\"a\":0,\"k\":[67.649,55.9]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":25.2,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":25.2,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":67,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[32.926,63.56]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":2,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":119.4,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "assets/lotties/location.json",
    "content": "{\"assets\":[{\"h\":96,\"id\":\"0\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":129,\"e\":1},{\"h\":400,\"id\":\"1\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":357,\"e\":1},{\"id\":\"19\",\"layers\":[{\"ind\":18,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[16.5,15]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[33,30]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0.21,1.3]],\"o\":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[1.3,-0.21],[0,0]],\"v\":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[12.96,10.61]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[4.24,-0.68],[-0.69,-4.24],[-4.25,0.68],[-1.09,1.04],[0,0],[-0.47,0.65],[0.65,0.47],[0,0],[0.26,1.6]],\"o\":[[-0.69,-4.24],[-4.24,0.69],[0.68,4.25],[1.6,-0.26],[0,0],[0.65,0.47],[0.47,-0.66],[0,0],[0.64,-1.37],[0,0]],\"v\":[[18.29,9.75],[9.36,3.31],[2.92,12.23],[11.85,18.68],[15.95,16.65],[19.79,19.43],[21.83,19.1],[21.5,17.06],[17.66,14.29],[18.29,9.75]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0,0],[0.43,2.65],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0,0],[0.21,1.3]],\"o\":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[0,0],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0.43,2.65],[0,0],[1.3,-0.21],[0,0]],\"v\":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[11.38,15.8],[5.8,11.77],[9.83,6.19],[15.41,10.22],[11.38,15.8],[10.98,13.35],[12.96,10.61]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.27,-1.15],[0,0],[1.27,-1.76],[1.76,1.27],[0,0],[1.22,-0.25],[0,0],[1.02,5.45],[0,0],[-5.59,0.9],[0,0],[-0.89,-5.5]],\"o\":[[0.15,1.23],[0,0],[1.76,1.27],[-1.27,1.76],[0,0],[-1.01,0.62],[0,0],[-5.51,0.89],[0,0],[-0.9,-5.59],[0,0],[5.5,-0.75],[0,0]],\"v\":[[20.79,9.75],[20.59,13.35],[22.95,15.05],[23.84,20.54],[18.34,21.43],[15.98,19.73],[12.63,21.05],[12.24,21.12],[0.52,12.89],[0.48,12.63],[8.97,0.87],[9.23,0.83],[20.73,9.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"24\",\"layers\":[{\"ind\":23,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[13.5,11.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[27,23]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.69,-4.24],[0.64,-1.37],[0,0],[0.47,-0.65],[0.65,0.47],[0,0],[1.6,-0.26],[0.68,4.24],[-4.24,0.69]],\"o\":[[4.24,-0.68],[0.26,1.6],[0,0],[0.65,0.47],[-0.47,0.66],[0,0],[-1.09,1.04],[-4.25,0.69],[-0.69,-4.24],[0,0]],\"v\":[[7.11,0.31],[16.04,6.75],[15.41,11.29],[19.25,14.06],[19.58,16.09],[17.54,16.43],[13.7,13.65],[9.6,15.68],[0.67,9.23],[7.11,0.31]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.43,-2.65],[-2.65,0.43],[0.43,2.66],[2.65,-0.43]],\"o\":[[-2.65,0.43],[0.43,2.65],[2.65,-0.43],[-0.43,-2.65],[0,0]],\"v\":[[7.58,3.19],[3.55,8.77],[9.13,12.8],[13.16,7.21],[7.58,3.19]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.49,0.79,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"34\",\"layers\":[{\"ind\":33,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.29],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.28,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.49],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.45,0.77],[7.53,1.46],[8.59,3.2],[8.25,5.36],[7.56,7.45],[5.82,8.51],[3.66,8.17],[1.57,7.48],[0.51,5.74],[0.85,3.57],[1.54,1.49],[3.28,0.43],[5.45,0.77]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.13,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.14],[-0.39,-0.1],[-0.17,0.03],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.13],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.22,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.22],[-0.14,-0.1],[0,0]],\"v\":[[4.88,3.25],[4.12,3.14],[3.56,3.48],[3.32,4.2],[3.21,4.95],[3.55,5.51],[4.27,5.75],[5.02,5.86],[5.58,5.52],[5.82,4.8],[5.93,4.05],[5.59,3.49],[4.88,3.25]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"39\",\"layers\":[{\"ind\":38,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.32,0.96],[7.4,1.65],[8.46,3.39],[8.12,5.56],[7.43,7.64],[5.69,8.7],[3.52,8.36],[1.44,7.67],[0.38,5.93],[0.72,3.77],[1.41,1.68],[3.15,0.62],[5.32,0.96]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.1,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.14],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],\"v\":[[4.74,3.44],[3.99,3.33],[3.43,3.67],[3.19,4.39],[3.07,5.14],[3.41,5.7],[4.14,5.94],[4.89,6.06],[5.45,5.71],[5.69,5],[5.8,4.25],[5.46,3.68],[4.74,3.44]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"44\",\"layers\":[{\"ind\":43,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.57,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.29,0.79],[7.37,1.48],[8.43,3.23],[8.09,5.39],[7.4,7.48],[5.66,8.54],[3.49,8.2],[1.41,7.51],[0.35,5.77],[0.69,3.6],[1.38,1.52],[3.12,0.46],[5.29,0.79]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.02,0.17],[0.18,0.14],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.23,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],\"v\":[[4.71,3.28],[3.96,3.16],[3.4,3.51],[3.16,4.23],[3.04,4.98],[3.39,5.54],[4.11,5.78],[4.86,5.89],[5.41,5.55],[5.66,4.83],[5.77,4.08],[5.43,3.52],[4.71,3.28]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"49\",\"layers\":[{\"ind\":48,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[2.5,2.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[5,5]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.24,0.23],[3.29,1.96],[1.57,3.01],[0.52,1.28],[2.24,0.23]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"54\",\"layers\":[{\"ind\":53,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[2.5,2.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[5,5]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.11,0.61],[3.16,2.34],[1.44,3.39],[0.39,1.66],[2.11,0.61]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"59\",\"layers\":[{\"ind\":58,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[5.5,3]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[11,6]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[0.15,-0.62],[0.77,0.19],[0,0],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0,0],[0.77,0.19],[-0.19,0.77],[0,0],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.48,0.48],[7.11,1.6],[8.16,3.33],[6.44,4.38],[1.81,3.26],[0.76,1.53],[2.48,0.48]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"62\",\"layers\":[{\"ind\":36,\"ty\":0,\"parent\":32,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"34\"},{\"ind\":32,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[17.594,5.138]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":41,\"ty\":0,\"parent\":37,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"39\"},{\"ind\":37,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[5.134,17.416]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":46,\"ty\":0,\"parent\":42,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"44\"},{\"ind\":42,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[5.225,5.047]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":51,\"ty\":0,\"parent\":47,\"ks\":{},\"w\":5,\"h\":5,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"49\"},{\"ind\":47,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[2.5,2.5]},\"p\":{\"a\":0,\"k\":[20.992,21.292]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":56,\"ty\":0,\"parent\":52,\"ks\":{},\"w\":5,\"h\":5,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"54\"},{\"ind\":52,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[2.5,2.5]},\"p\":{\"a\":0,\"k\":[14.69,20.761]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":61,\"ty\":0,\"parent\":57,\"ks\":{},\"w\":11,\"h\":6,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"59\"},{\"ind\":57,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[5.5,3]},\"p\":{\"a\":0,\"k\":[17.282,14.474]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":31,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[2.572,2.572]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"72\",\"layers\":[{\"ind\":71,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"77\",\"layers\":[{\"ind\":76,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"83\",\"layers\":[{\"ind\":82,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"88\",\"layers\":[{\"ind\":87,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"93\",\"layers\":[{\"ind\":92,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":7,\"ty\":2,\"parent\":6,\"ks\":{\"s\":{\"a\":0,\"k\":[33.33,33.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"0\"},{\"ind\":6,\"ty\":3,\"parent\":5,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{\"a\":{\"a\":0,\"k\":[21.5,16]},\"p\":{\"a\":0,\"k\":[21.5,16]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":4,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[138,40]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":11,\"ty\":4,\"parent\":10,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"el\",\"p\":{\"a\":0,\"k\":[4.375,4.375]},\"s\":{\"a\":0,\"k\":[8.75,8.75]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":10,\"ty\":3,\"parent\":9,\"ks\":{\"p\":{\"a\":0,\"k\":[8.422,7.292]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":13,\"ty\":2,\"parent\":12,\"ks\":{\"s\":{\"a\":0,\"k\":[9.24,9.25]}},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"1\"},{\"ind\":12,\"ty\":3,\"parent\":9,\"ks\":{\"a\":{\"a\":0,\"k\":[16.5,18.5]},\"p\":{\"a\":0,\"k\":[12.538,14.893]},\"r\":{\"a\":0,\"k\":12.68}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":9,\"ty\":3,\"parent\":8,\"ks\":{\"a\":{\"a\":0,\"k\":[13.037,14.939]},\"p\":{\"a\":0,\"k\":[15.997,17.436]},\"r\":{\"a\":0,\"k\":-12.68}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":8,\"ty\":3,\"parent\":3,\"ks\":{\"a\":{\"a\":0,\"k\":[15.997,17.436]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[102.997,45.436],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":6,\"s\":[102.997,45.436],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":58.5,\"s\":[102.997,92.436],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[102.997,92.436],\"h\":1}]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":6,\"s\":[0],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0.5,\"y\":0}},{\"t\":58.5,\"s\":[11],\"h\":1},{\"t\":119.4,\"s\":[11],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":6,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":58.5,\"s\":[360,360],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[360,360],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":21,\"ty\":0,\"parent\":17,\"ks\":{},\"w\":33,\"h\":30,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"19\"},{\"ind\":17,\"ty\":3,\"parent\":16,\"ks\":{\"a\":{\"a\":0,\"k\":[16.5,15]},\"p\":{\"a\":0,\"k\":[15.953,14.392]},\"r\":{\"a\":0,\"k\":9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":26,\"ty\":0,\"parent\":22,\"ks\":{},\"w\":27,\"h\":23,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"24\"},{\"ind\":22,\"ty\":3,\"parent\":16,\"ks\":{\"a\":{\"a\":0,\"k\":[13.5,11.5]},\"p\":{\"a\":0,\"k\":[15.873,14.886]},\"r\":{\"a\":0,\"k\":9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":16,\"ty\":3,\"parent\":15,\"ks\":{\"a\":{\"a\":0,\"k\":[15.3,15.3]},\"p\":{\"a\":0,\"k\":[17.544,17.544]},\"r\":{\"a\":0,\"k\":-9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":15,\"ty\":3,\"parent\":14,\"ks\":{\"a\":{\"a\":0,\"k\":[17.544,17.544]},\"p\":{\"a\":0,\"k\":[17.544,17.544]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":14,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[7,49]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":64,\"ty\":0,\"parent\":30,\"ks\":{\"a\":{\"a\":0,\"k\":[2.286,2.286]},\"p\":{\"a\":0,\"k\":[2.286,2.286]}},\"w\":27.4286,\"h\":27.4286,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"62\"},{\"ind\":30,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":0,\"k\":[2.286,2.286]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":66,\"ty\":4,\"parent\":65,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[16,16]},\"r\":{\"a\":0,\"k\":6.857},\"s\":{\"a\":0,\"k\":[32,32]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":65,\"ty\":3,\"parent\":29,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":29,\"ty\":3,\"parent\":28,\"ks\":{\"a\":{\"a\":0,\"k\":[16,16]},\"p\":{\"a\":0,\"k\":[19.317,19.317]},\"r\":{\"a\":0,\"k\":13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":28,\"ty\":3,\"parent\":27,\"ks\":{\"a\":{\"a\":0,\"k\":[19.317,19.317]},\"p\":{\"a\":0,\"k\":[19.317,19.317]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":27,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[41,10]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":74,\"ty\":0,\"parent\":70,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"72\"},{\"ind\":70,\"ty\":3,\"parent\":69,\"ks\":{\"p\":{\"a\":0,\"k\":[4.974,0.54]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":79,\"ty\":0,\"parent\":75,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"77\"},{\"ind\":75,\"ty\":3,\"parent\":69,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":69,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":85,\"ty\":0,\"parent\":81,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"83\"},{\"ind\":81,\"ty\":3,\"parent\":80,\"ks\":{\"p\":{\"a\":0,\"k\":[4.474,0.54]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":90,\"ty\":0,\"parent\":86,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"88\"},{\"ind\":86,\"ty\":3,\"parent\":80,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":80,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":95,\"ty\":0,\"parent\":91,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"93\"},{\"ind\":91,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":68,\"ty\":3,\"parent\":67,\"ks\":{\"a\":{\"a\":0,\"k\":[67.649,55.9]},\"p\":{\"a\":0,\"k\":[67.649,55.9]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":25.2,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":25.2,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":67,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[32.926,63.56]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":2,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":119.4,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "assets/lotties/onboarding.json",
    "content": "{\n  \"v\": \"5.7.5\",\n  \"fr\": 100,\n  \"ip\": 0,\n  \"op\": 400,\n  \"w\": 315,\n  \"h\": 283,\n  \"nm\": \"Comp 1\",\n  \"ddd\": 0,\n  \"metadata\": {},\n  \"assets\": [\n    {\n      \"id\": \"0\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"1\",\n          \"w\": 190,\n          \"h\": 186,\n          \"ind\": 1,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"1\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 2,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      190,\n                      186\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      95,\n                      93\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 3,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"gr\",\n                  \"nm\": \"Shape Layer\",\n                  \"it\": [\n                    {\n                      \"ty\": \"gr\",\n                      \"nm\": \"Path\",\n                      \"it\": [\n                        {\n                          \"ty\": \"sh\",\n                          \"d\": 1,\n                          \"ks\": {\n                            \"a\": 0,\n                            \"k\": {\n                              \"c\": true,\n                              \"v\": [\n                                [\n                                  136.98,\n                                  105.22\n                                ],\n                                [\n                                  130.82,\n                                  176.98\n                                ],\n                                [\n                                  170.08,\n                                  122.43\n                                ],\n                                [\n                                  175.07,\n                                  55.41\n                                ],\n                                [\n                                  136.98,\n                                  105.22\n                                ],\n                                [\n                                  136.98,\n                                  105.22\n                                ],\n                                [\n                                  136.98,\n                                  105.22\n                                ]\n                              ],\n                              \"i\": [\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  -9.46,\n                                  -3.44\n                                ],\n                                [\n                                  -12.22,\n                                  33.57\n                                ],\n                                [\n                                  9.46,\n                                  3.44\n                                ],\n                                [\n                                  12.22,\n                                  -33.57\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ],\n                              \"o\": [\n                                [\n                                  -12.22,\n                                  33.57\n                                ],\n                                [\n                                  9.46,\n                                  3.44\n                                ],\n                                [\n                                  12.22,\n                                  -33.57\n                                ],\n                                [\n                                  -9.46,\n                                  -3.44\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ]\n                            }\n                          }\n                        },\n                        {\n                          \"ty\": \"tr\",\n                          \"p\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                              100,\n                              100\n                            ],\n                            \"ix\": 2\n                          },\n                          \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"o\": {\n                            \"a\": 0,\n                            \"k\": 100,\n                            \"ix\": 2\n                          },\n                          \"sk\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"sa\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          }\n                        }\n                      ]\n                    },\n                    {\n                      \"ty\": \"gr\",\n                      \"nm\": \"Path\",\n                      \"it\": [\n                        {\n                          \"ty\": \"sh\",\n                          \"d\": 1,\n                          \"ks\": {\n                            \"a\": 0,\n                            \"k\": {\n                              \"c\": true,\n                              \"v\": [\n                                [\n                                  136.98,\n                                  105.22\n                                ],\n                                [\n                                  113.44,\n                                  43.53\n                                ],\n                                [\n                                  50.66,\n                                  11.77\n                                ],\n                                [\n                                  68.47,\n                                  82.76\n                                ],\n                                [\n                                  136.98,\n                                  105.22\n                                ],\n                                [\n                                  136.98,\n                                  105.22\n                                ],\n                                [\n                                  136.98,\n                                  105.22\n                                ]\n                              ],\n                              \"i\": [\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  22.96,\n                                  27.37\n                                ],\n                                [\n                                  11.71,\n                                  -9.83\n                                ],\n                                [\n                                  -22.96,\n                                  -27.37\n                                ],\n                                [\n                                  -11.71,\n                                  9.83\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ],\n                              \"o\": [\n                                [\n                                  3.58,\n                                  -5.22\n                                ],\n                                [\n                                  -22.96,\n                                  -27.36\n                                ],\n                                [\n                                  -11.71,\n                                  9.82\n                                ],\n                                [\n                                  22.96,\n                                  27.37\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ]\n                            }\n                          }\n                        },\n                        {\n                          \"ty\": \"tr\",\n                          \"p\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                              100,\n                              100\n                            ],\n                            \"ix\": 2\n                          },\n                          \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"o\": {\n                            \"a\": 0,\n                            \"k\": 100,\n                            \"ix\": 2\n                          },\n                          \"sk\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"sa\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          }\n                        }\n                      ]\n                    },\n                    {\n                      \"ty\": \"gr\",\n                      \"nm\": \"Path\",\n                      \"it\": [\n                        {\n                          \"ty\": \"sh\",\n                          \"d\": 1,\n                          \"ks\": {\n                            \"a\": 0,\n                            \"k\": {\n                              \"c\": true,\n                              \"v\": [\n                                [\n                                  136.98,\n                                  105.22\n                                ],\n                                [\n                                  78.08,\n                                  66.73\n                                ],\n                                [\n                                  9.57,\n                                  82.76\n                                ],\n                                [\n                                  68.47,\n                                  121.25\n                                ],\n                                [\n                                  136.98,\n                                  105.22\n                                ],\n                                [\n                                  136.98,\n                                  105.22\n                                ],\n                                [\n                                  136.98,\n                                  105.22\n                                ]\n                              ],\n                              \"i\": [\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  35.18,\n                                  6.2\n                                ],\n                                [\n                                  2.66,\n                                  -15.05\n                                ],\n                                [\n                                  -35.18,\n                                  -6.2\n                                ],\n                                [\n                                  -1.64,\n                                  9.3\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ],\n                              \"o\": [\n                                [\n                                  2.66,\n                                  -15.05\n                                ],\n                                [\n                                  -35.18,\n                                  -6.2\n                                ],\n                                [\n                                  -2.65,\n                                  15.05\n                                ],\n                                [\n                                  35.18,\n                                  6.2\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ]\n                            }\n                          }\n                        },\n                        {\n                          \"ty\": \"tr\",\n                          \"p\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                              100,\n                              100\n                            ],\n                            \"ix\": 2\n                          },\n                          \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"o\": {\n                            \"a\": 0,\n                            \"k\": 100,\n                            \"ix\": 2\n                          },\n                          \"sk\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"sa\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          }\n                        }\n                      ]\n                    },\n                    {\n                      \"ty\": \"st\",\n                      \"c\": {\n                        \"a\": 0,\n                        \"k\": [\n                          1,\n                          1,\n                          1\n                        ],\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"w\": {\n                        \"a\": 0,\n                        \"k\": 17,\n                        \"ix\": 2\n                      },\n                      \"lc\": 1,\n                      \"lj\": 1,\n                      \"ml\": 4\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      95.15560913085938,\n                      92.9780044555664\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      95.15799045562744,\n                      92.98032808303833\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      99.99749660491943,\n                      99.99749660491943\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"2\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"3\",\n          \"w\": 30,\n          \"h\": 30,\n          \"ind\": 4,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.724000930786133,\n                19.31599998474121\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                15,\n                15\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"3\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 5,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      30,\n                      30\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      15,\n                      15\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 6,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"gr\",\n                  \"nm\": \"Path\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              7.32,\n                              0.39\n                            ],\n                            [\n                              14.15,\n                              5.22\n                            ],\n                            [\n                              4.91,\n                              14.87\n                            ],\n                            [\n                              1.29,\n                              14.87\n                            ],\n                            [\n                              0.08,\n                              13.66\n                            ],\n                            [\n                              0.08,\n                              7.63\n                            ],\n                            [\n                              7.32,\n                              0.39\n                            ],\n                            [\n                              7.32,\n                              0.39\n                            ],\n                            [\n                              7.32,\n                              0.39\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              -0.99,\n                              -2.82\n                            ],\n                            [\n                              0,\n                              -5.2\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0.67\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              -4,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              3.16,\n                              0\n                            ],\n                            [\n                              -5.14,\n                              0.21\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              -0.67,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              -4\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"fl\",\n                      \"c\": {\n                        \"a\": 0,\n                        \"k\": [\n                          1,\n                          1,\n                          1\n                        ],\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"r\": 1,\n                      \"bm\": 0\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"nm\": \"Path\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              14.57,\n                              7.63\n                            ],\n                            [\n                              21.81,\n                              14.87\n                            ],\n                            [\n                              21.81,\n                              20.91\n                            ],\n                            [\n                              20.6,\n                              22.12\n                            ],\n                            [\n                              14.57,\n                              22.12\n                            ],\n                            [\n                              7.33,\n                              15.25\n                            ],\n                            [\n                              7.32,\n                              14.87\n                            ],\n                            [\n                              7.33,\n                              14.56\n                            ],\n                            [\n                              7.33,\n                              14.5\n                            ],\n                            [\n                              7.36,\n                              14.15\n                            ],\n                            [\n                              7.36,\n                              14.13\n                            ],\n                            [\n                              7.38,\n                              14\n                            ],\n                            [\n                              7.4,\n                              13.79\n                            ],\n                            [\n                              7.43,\n                              13.63\n                            ],\n                            [\n                              7.46,\n                              13.43\n                            ],\n                            [\n                              7.52,\n                              13.2\n                            ],\n                            [\n                              7.54,\n                              13.09\n                            ],\n                            [\n                              7.61,\n                              12.86\n                            ],\n                            [\n                              7.64,\n                              12.75\n                            ],\n                            [\n                              7.65,\n                              12.72\n                            ],\n                            [\n                              7.73,\n                              12.45\n                            ],\n                            [\n                              7.75,\n                              12.41\n                            ],\n                            [\n                              7.8,\n                              12.27\n                            ],\n                            [\n                              7.88,\n                              12.09\n                            ],\n                            [\n                              7.94,\n                              11.95\n                            ],\n                            [\n                              8.02,\n                              11.77\n                            ],\n                            [\n                              8.09,\n                              11.63\n                            ],\n                            [\n                              8.17,\n                              11.47\n                            ],\n                            [\n                              8.27,\n                              11.28\n                            ],\n                            [\n                              8.33,\n                              11.18\n                            ],\n                            [\n                              8.43,\n                              11.02\n                            ],\n                            [\n                              8.52,\n                              10.88\n                            ],\n                            [\n                              8.63,\n                              10.73\n                            ],\n                            [\n                              8.71,\n                              10.61\n                            ],\n                            [\n                              8.83,\n                              10.45\n                            ],\n                            [\n                              8.93,\n                              10.32\n                            ],\n                            [\n                              9.03,\n                              10.2\n                            ],\n                            [\n                              9.16,\n                              10.05\n                            ],\n                            [\n                              9.27,\n                              9.94\n                            ],\n                            [\n                              9.37,\n                              9.82\n                            ],\n                            [\n                              9.52,\n                              9.68\n                            ],\n                            [\n                              9.62,\n                              9.58\n                            ],\n                            [\n                              9.75,\n                              9.46\n                            ],\n                            [\n                              9.89,\n                              9.34\n                            ],\n                            [\n                              10.02,\n                              9.23\n                            ],\n                            [\n                              10.13,\n                              9.14\n                            ],\n                            [\n                              10.29,\n                              9.02\n                            ],\n                            [\n                              10.43,\n                              8.93\n                            ],\n                            [\n                              10.57,\n                              8.83\n                            ],\n                            [\n                              10.7,\n                              8.75\n                            ],\n                            [\n                              10.87,\n                              8.64\n                            ],\n                            [\n                              10.98,\n                              8.58\n                            ],\n                            [\n                              11.16,\n                              8.48\n                            ],\n                            [\n                              11.3,\n                              8.41\n                            ],\n                            [\n                              11.47,\n                              8.32\n                            ],\n                            [\n                              11.61,\n                              8.26\n                            ],\n                            [\n                              11.78,\n                              8.18\n                            ],\n                            [\n                              11.96,\n                              8.11\n                            ],\n                            [\n                              12.11,\n                              8.06\n                            ],\n                            [\n                              12.25,\n                              8.01\n                            ],\n                            [\n                              12.45,\n                              7.94\n                            ],\n                            [\n                              12.58,\n                              7.91\n                            ],\n                            [\n                              12.78,\n                              7.85\n                            ],\n                            [\n                              12.95,\n                              7.81\n                            ],\n                            [\n                              13.13,\n                              7.77\n                            ],\n                            [\n                              13.34,\n                              7.73\n                            ],\n                            [\n                              13.47,\n                              7.71\n                            ],\n                            [\n                              13.98,\n                              7.65\n                            ],\n                            [\n                              14.57,\n                              7.63\n                            ],\n                            [\n                              14.57,\n                              7.63\n                            ],\n                            [\n                              14.57,\n                              7.63\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              -4\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0.67,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0.19,\n                              3.82\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0.1\n                            ],\n                            [\n                              0,\n                              0.02\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0.01\n                            ],\n                            [\n                              0,\n                              0.04\n                            ],\n                            [\n                              -0.01,\n                              0.07\n                            ],\n                            [\n                              -0.01,\n                              0.05\n                            ],\n                            [\n                              -0.01,\n                              0.07\n                            ],\n                            [\n                              -0.02,\n                              0.08\n                            ],\n                            [\n                              -0.01,\n                              0.04\n                            ],\n                            [\n                              -0.02,\n                              0.08\n                            ],\n                            [\n                              -0.01,\n                              0.04\n                            ],\n                            [\n                              0,\n                              0.01\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0.01\n                            ],\n                            [\n                              -0.02,\n                              0.05\n                            ],\n                            [\n                              -0.02,\n                              0.06\n                            ],\n                            [\n                              -0.02,\n                              0.05\n                            ],\n                            [\n                              -0.03,\n                              0.06\n                            ],\n                            [\n                              -0.02,\n                              0.05\n                            ],\n                            [\n                              -0.03,\n                              0.05\n                            ],\n                            [\n                              -0.04,\n                              0.06\n                            ],\n                            [\n                              -0.02,\n                              0.03\n                            ],\n                            [\n                              -0.04,\n                              0.05\n                            ],\n                            [\n                              -0.03,\n                              0.05\n                            ],\n                            [\n                              -0.04,\n                              0.05\n                            ],\n                            [\n                              -0.03,\n                              0.04\n                            ],\n                            [\n                              -0.04,\n                              0.05\n                            ],\n                            [\n                              -0.03,\n                              0.04\n                            ],\n                            [\n                              -0.04,\n                              0.04\n                            ],\n                            [\n                              -0.04,\n                              0.05\n                            ],\n                            [\n                              -0.04,\n                              0.04\n                            ],\n                            [\n                              -0.04,\n                              0.04\n                            ],\n                            [\n                              -0.05,\n                              0.05\n                            ],\n                            [\n                              -0.03,\n                              0.03\n                            ],\n                            [\n                              -0.04,\n                              0.04\n                            ],\n                            [\n                              -0.05,\n                              0.04\n                            ],\n                            [\n                              -0.05,\n                              0.04\n                            ],\n                            [\n                              -0.04,\n                              0.03\n                            ],\n                            [\n                              -0.05,\n                              0.04\n                            ],\n                            [\n                              -0.04,\n                              0.03\n                            ],\n                            [\n                              -0.05,\n                              0.03\n                            ],\n                            [\n                              -0.05,\n                              0.03\n                            ],\n                            [\n                              -0.06,\n                              0.04\n                            ],\n                            [\n                              -0.04,\n                              0.02\n                            ],\n                            [\n                              -0.06,\n                              0.03\n                            ],\n                            [\n                              -0.04,\n                              0.02\n                            ],\n                            [\n                              -0.06,\n                              0.03\n                            ],\n                            [\n                              -0.05,\n                              0.02\n                            ],\n                            [\n                              -0.06,\n                              0.02\n                            ],\n                            [\n                              -0.06,\n                              0.02\n                            ],\n                            [\n                              -0.05,\n                              0.02\n                            ],\n                            [\n                              -0.05,\n                              0.02\n                            ],\n                            [\n                              -0.07,\n                              0.02\n                            ],\n                            [\n                              -0.05,\n                              0.01\n                            ],\n                            [\n                              -0.07,\n                              0.02\n                            ],\n                            [\n                              -0.05,\n                              0.01\n                            ],\n                            [\n                              -0.06,\n                              0.01\n                            ],\n                            [\n                              -0.07,\n                              0.01\n                            ],\n                            [\n                              -0.04,\n                              0.01\n                            ],\n                            [\n                              -0.18,\n                              0.02\n                            ],\n                            [\n                              -0.2,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              4,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0.66\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              -3.87,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              -0.1\n                            ],\n                            [\n                              0,\n                              -0.02\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              -0.05\n                            ],\n                            [\n                              0.01,\n                              -0.07\n                            ],\n                            [\n                              0.01,\n                              -0.05\n                            ],\n                            [\n                              0.01,\n                              -0.07\n                            ],\n                            [\n                              0.02,\n                              -0.07\n                            ],\n                            [\n                              0.01,\n                              -0.04\n                            ],\n                            [\n                              0.02,\n                              -0.07\n                            ],\n                            [\n                              0.01,\n                              -0.04\n                            ],\n                            [\n                              0,\n                              -0.01\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              -0.01\n                            ],\n                            [\n                              0.02,\n                              -0.05\n                            ],\n                            [\n                              0.02,\n                              -0.06\n                            ],\n                            [\n                              0.02,\n                              -0.05\n                            ],\n                            [\n                              0.03,\n                              -0.06\n                            ],\n                            [\n                              0.02,\n                              -0.05\n                            ],\n                            [\n                              0.03,\n                              -0.05\n                            ],\n                            [\n                              0.04,\n                              -0.06\n                            ],\n                            [\n                              0.02,\n                              -0.03\n                            ],\n                            [\n                              0.03,\n                              -0.06\n                            ],\n                            [\n                              0.03,\n                              -0.05\n                            ],\n                            [\n                              0.04,\n                              -0.05\n                            ],\n                            [\n                              0.03,\n                              -0.04\n                            ],\n                            [\n                              0.04,\n                              -0.05\n                            ],\n                            [\n                              0.03,\n                              -0.04\n                            ],\n                            [\n                              0.04,\n                              -0.04\n                            ],\n                            [\n                              0.04,\n                              -0.05\n                            ],\n                            [\n                              0.04,\n                              -0.04\n                            ],\n                            [\n                              0.04,\n                              -0.04\n                            ],\n                            [\n                              0.05,\n                              -0.05\n                            ],\n                            [\n                              0.04,\n                              -0.04\n                            ],\n                            [\n                              0.05,\n                              -0.04\n                            ],\n                            [\n                              0.05,\n                              -0.04\n                            ],\n                            [\n                              0.04,\n                              -0.04\n                            ],\n                            [\n                              0.04,\n                              -0.03\n                            ],\n                            [\n                              0.05,\n                              -0.04\n                            ],\n                            [\n                              0.04,\n                              -0.03\n                            ],\n                            [\n                              0.05,\n                              -0.04\n                            ],\n                            [\n                              0.04,\n                              -0.03\n                            ],\n                            [\n                              0.06,\n                              -0.04\n                            ],\n                            [\n                              0.04,\n                              -0.02\n                            ],\n                            [\n                              0.06,\n                              -0.04\n                            ],\n                            [\n                              0.04,\n                              -0.02\n                            ],\n                            [\n                              0.06,\n                              -0.03\n                            ],\n                            [\n                              0.05,\n                              -0.02\n                            ],\n                            [\n                              0.05,\n                              -0.02\n                            ],\n                            [\n                              0.06,\n                              -0.02\n                            ],\n                            [\n                              0.05,\n                              -0.02\n                            ],\n                            [\n                              0.05,\n                              -0.02\n                            ],\n                            [\n                              0.07,\n                              -0.02\n                            ],\n                            [\n                              0.04,\n                              -0.01\n                            ],\n                            [\n                              0.07,\n                              -0.02\n                            ],\n                            [\n                              0.05,\n                              -0.02\n                            ],\n                            [\n                              0.06,\n                              -0.01\n                            ],\n                            [\n                              0.07,\n                              -0.02\n                            ],\n                            [\n                              0.04,\n                              -0.01\n                            ],\n                            [\n                              0.17,\n                              -0.03\n                            ],\n                            [\n                              0.19,\n                              -0.02\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"fl\",\n                      \"c\": {\n                        \"a\": 0,\n                        \"k\": [\n                          1,\n                          1,\n                          1\n                        ],\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"r\": 1,\n                      \"bm\": 0\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      14.592967987060547,\n                      15.006291389465332\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      10.944999732077122,\n                      11.255000412464142\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"4\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"5\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 7,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                43.876060485839844,\n                44.9700927734375\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                20.5,\n                20.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999997424318,\n                99.99999997424318\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -123.08999825645346,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"6\",\n          \"w\": 67,\n          \"h\": 63,\n          \"ind\": 8,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                45.247005462646484,\n                46.04199981689453\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                33.5,\n                31.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999997424318,\n                99.99999997424318\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -123.08999825645346,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"5\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"7\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 9,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked) (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"8\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"9\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 10,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.5,\n                19.5\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                19.5,\n                19.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 11,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer - box\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"rc\",\n              \"d\": 1,\n              \"s\": {\n                \"a\": 0,\n                \"k\": [\n                  41,\n                  41\n                ],\n                \"ix\": 2\n              },\n              \"p\": {\n                \"a\": 0,\n                \"k\": [\n                  20.5,\n                  20.5\n                ],\n                \"ix\": 2\n              },\n              \"r\": {\n                \"a\": 0,\n                \"k\": 0,\n                \"ix\": 2\n              }\n            },\n            {\n              \"ty\": \"fl\",\n              \"c\": {\n                \"a\": 0,\n                \"k\": [\n                  0,\n                  0,\n                  0\n                ],\n                \"ix\": 2\n              },\n              \"o\": {\n                \"a\": 0,\n                \"k\": 0,\n                \"ix\": 2\n              },\n              \"r\": 1,\n              \"bm\": 0\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"7\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 12,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"td\": 1,\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"gr\",\n                  \"nm\": \"Rectangle\",\n                  \"it\": [\n                    {\n                      \"ty\": \"rc\",\n                      \"d\": 1,\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          39.679,\n                          39.679\n                        ],\n                        \"ix\": 2\n                      },\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 21,\n                        \"ix\": 2\n                      }\n                    },\n                    {\n                      \"ty\": \"fl\",\n                      \"c\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"r\": 1,\n                      \"bm\": 0\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          19.839000701904297,\n                          19.839000701904297\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"8\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 9,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked) (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                20.5,\n                20.5\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                20.5,\n                20.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0,\n          \"tt\": 1\n        }\n      ]\n    },\n    {\n      \"id\": \"9\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"10\",\n          \"w\": 40,\n          \"h\": 40,\n          \"ind\": 13,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                1,\n                1\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 14,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer - box\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer - box\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      41,\n                      41\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      20.5,\n                      20.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"10\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"11\",\n          \"ind\": 15,\n          \"ty\": 2,\n          \"nm\": \"Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                20.567794799804688,\n                19.839492797851562\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                20,\n                20.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                96.78048622317431,\n                96.78048622317431\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"11\",\n      \"u\": \"\",\n      \"p\": \"data:image/png;base64,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\",\n      \"w\": 40,\n      \"h\": 41,\n      \"e\": 1\n    },\n    {\n      \"id\": \"6\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 16,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      67,\n                      63\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      33.5,\n                      31.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 17,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          46.34,\n                          36.46\n                        ],\n                        [\n                          14.01,\n                          43.29\n                        ],\n                        [\n                          3.53,\n                          21.21\n                        ],\n                        [\n                          3.15,\n                          18.27\n                        ],\n                        [\n                          0.61,\n                          12.2\n                        ],\n                        [\n                          5.35,\n                          4.92\n                        ],\n                        [\n                          11.43,\n                          4.8\n                        ],\n                        [\n                          14.44,\n                          3.86\n                        ],\n                        [\n                          39.52,\n                          4.14\n                        ],\n                        [\n                          46.34,\n                          36.46\n                        ],\n                        [\n                          46.34,\n                          36.46\n                        ],\n                        [\n                          46.34,\n                          36.46\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          10.81,\n                          7.04\n                        ],\n                        [\n                          -0.91,\n                          8.46\n                        ],\n                        [\n                          0.39,\n                          0.93\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -3.71,\n                          0.07\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.91,\n                          0.56\n                        ],\n                        [\n                          -7.84,\n                          -5.11\n                        ],\n                        [\n                          7.05,\n                          -10.81\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          -7.04,\n                          10.81\n                        ],\n                        [\n                          -7.62,\n                          -4.96\n                        ],\n                        [\n                          0.11,\n                          -1\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.44,\n                          -3.42\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.07,\n                          -0.02\n                        ],\n                        [\n                          7.46,\n                          -4.63\n                        ],\n                        [\n                          10.81,\n                          7.04\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      33.55088806152344,\n                      31.615095138549805\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      25.163795278840016,\n                      23.711913418028576\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"12\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"13\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 18,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                39.552490234375,\n                40.27444839477539\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                20.5,\n                20.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100.00000024333974,\n                100.00000024333974\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -16.80000035671566,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"14\",\n          \"w\": 64,\n          \"h\": 71,\n          \"ind\": 19,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                41.172000885009766,\n                44.03200149536133\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                32,\n                35.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100.00000024333974,\n                100.00000024333974\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -16.80000035671566,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"13\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"15\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 20,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked) (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"16\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"17\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 21,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.5,\n                19.5\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                19.5,\n                19.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 22,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer - box\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"rc\",\n              \"d\": 1,\n              \"s\": {\n                \"a\": 0,\n                \"k\": [\n                  41,\n                  41\n                ],\n                \"ix\": 2\n              },\n              \"p\": {\n                \"a\": 0,\n                \"k\": [\n                  20.5,\n                  20.5\n                ],\n                \"ix\": 2\n              },\n              \"r\": {\n                \"a\": 0,\n                \"k\": 0,\n                \"ix\": 2\n              }\n            },\n            {\n              \"ty\": \"fl\",\n              \"c\": {\n                \"a\": 0,\n                \"k\": [\n                  0,\n                  0,\n                  0\n                ],\n                \"ix\": 2\n              },\n              \"o\": {\n                \"a\": 0,\n                \"k\": 0,\n                \"ix\": 2\n              },\n              \"r\": 1,\n              \"bm\": 0\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"15\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 23,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"td\": 1,\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"gr\",\n                  \"nm\": \"Rectangle\",\n                  \"it\": [\n                    {\n                      \"ty\": \"rc\",\n                      \"d\": 1,\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          39.679,\n                          39.679\n                        ],\n                        \"ix\": 2\n                      },\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 21,\n                        \"ix\": 2\n                      }\n                    },\n                    {\n                      \"ty\": \"fl\",\n                      \"c\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"r\": 1,\n                      \"bm\": 0\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          19.839000701904297,\n                          19.839000701904297\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"16\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 20,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked) (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                20.5,\n                20.5\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                20.5,\n                20.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0,\n          \"tt\": 1\n        }\n      ]\n    },\n    {\n      \"id\": \"17\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"18\",\n          \"w\": 40,\n          \"h\": 40,\n          \"ind\": 24,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                1,\n                1\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 25,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer - box\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer - box\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      41,\n                      41\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      20.5,\n                      20.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"18\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"19\",\n          \"ind\": 26,\n          \"ty\": 2,\n          \"nm\": \"Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.7803955078125,\n                19.69636344909668\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                20.5,\n                20\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.19999837875366,\n                99.19999837875366\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"19\",\n      \"u\": \"\",\n      \"p\": \"data:image/png;base64,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\",\n      \"w\": 41,\n      \"h\": 40,\n      \"e\": 1\n    },\n    {\n      \"id\": \"14\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 27,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      64,\n                      71\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      32,\n                      35.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 28,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          30.86,\n                          1.25\n                        ],\n                        [\n                          46.47,\n                          30.37\n                        ],\n                        [\n                          28.22,\n                          46.62\n                        ],\n                        [\n                          25.5,\n                          47.81\n                        ],\n                        [\n                          20.39,\n                          51.95\n                        ],\n                        [\n                          12.08,\n                          49.44\n                        ],\n                        [\n                          10.26,\n                          43.64\n                        ],\n                        [\n                          8.51,\n                          41.02\n                        ],\n                        [\n                          1.74,\n                          16.86\n                        ],\n                        [\n                          30.86,\n                          1.25\n                        ],\n                        [\n                          30.86,\n                          1.25\n                        ],\n                        [\n                          30.86,\n                          1.25\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          3.73,\n                          -12.35\n                        ],\n                        [\n                          8.38,\n                          -1.5\n                        ],\n                        [\n                          0.78,\n                          -0.63\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.11,\n                          3.54\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.8,\n                          0.71\n                        ],\n                        [\n                          -2.71,\n                          8.96\n                        ],\n                        [\n                          -12.35,\n                          -3.73\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          12.35,\n                          3.73\n                        ],\n                        [\n                          -2.63,\n                          8.71\n                        ],\n                        [\n                          -0.99,\n                          0.18\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -2.88,\n                          2.34\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.32,\n                          -1.02\n                        ],\n                        [\n                          -6.53,\n                          -5.87\n                        ],\n                        [\n                          3.73,\n                          -12.35\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      32.139102935791016,\n                      35.581295013427734\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      24.104931494821898,\n                      26.686640179642037\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"20\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"21\",\n          \"w\": 33,\n          \"h\": 35,\n          \"ind\": 29,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.979000091552734,\n                19.523000717163086\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                16.5,\n                17.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100.00000266711488,\n                100.00000266711491\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -9.969999687139088,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"21\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 30,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      33,\n                      35\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      16.5,\n                      17.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 31,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          11.89,\n                          1.69\n                        ],\n                        [\n                          15.28,\n                          2.29\n                        ],\n                        [\n                          15.88,\n                          7.18\n                        ],\n                        [\n                          17.84,\n                          9.26\n                        ],\n                        [\n                          22.59,\n                          10.09\n                        ],\n                        [\n                          23.1,\n                          13.5\n                        ],\n                        [\n                          18.54,\n                          15.9\n                        ],\n                        [\n                          17.25,\n                          18.37\n                        ],\n                        [\n                          17.89,\n                          23.55\n                        ],\n                        [\n                          14.78,\n                          25.02\n                        ],\n                        [\n                          11.63,\n                          21.55\n                        ],\n                        [\n                          8.76,\n                          21.05\n                        ],\n                        [\n                          4.61,\n                          23.23\n                        ],\n                        [\n                          2.19,\n                          20.79\n                        ],\n                        [\n                          4.55,\n                          16.13\n                        ],\n                        [\n                          4.19,\n                          13.38\n                        ],\n                        [\n                          0.72,\n                          9.57\n                        ],\n                        [\n                          2.36,\n                          6.54\n                        ],\n                        [\n                          7.11,\n                          7.37\n                        ],\n                        [\n                          9.66,\n                          6.08\n                        ],\n                        [\n                          11.89,\n                          1.69\n                        ],\n                        [\n                          11.89,\n                          1.69\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.22,\n                          -1.78\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.04,\n                          -0.18\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.53,\n                          -0.81\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.12,\n                          -1.01\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.18,\n                          1.3\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.96,\n                          -0.5\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.8,\n                          1.58\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.68,\n                          0.75\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.7,\n                          -0.3\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.48,\n                          0.95\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          0.81,\n                          -1.59\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.13,\n                          1.06\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.7,\n                          0.3\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.89,\n                          0.47\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.21,\n                          1.76\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.73,\n                          -0.8\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.56,\n                          0.82\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.46,\n                          -0.91\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.16,\n                          -1.28\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.04,\n                          0.18\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      16.211286544799805,\n                      17.538068771362305\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.158768430038934,\n                      13.153880722914502\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"22\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"23\",\n          \"w\": 31,\n          \"h\": 16,\n          \"ind\": 32,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.47800064086914,\n                15.807000160217285\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                15.5,\n                8\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999809893677,\n                99.99999809893679\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -8.22000011631331,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"24\",\n          \"w\": 33,\n          \"h\": 11,\n          \"ind\": 33,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.858999252319336,\n                32.42300033569336\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                16.5,\n                5.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999809893677,\n                99.99999809893679\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -8.22000011631331,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"23\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 34,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      31,\n                      16\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      15.5,\n                      8\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 35,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": false,\n                      \"v\": [\n                        [\n                          3.69,\n                          9.84\n                        ],\n                        [\n                          11.36,\n                          4.44\n                        ],\n                        [\n                          17.2,\n                          11.79\n                        ],\n                        [\n                          27.37,\n                          3.51\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"st\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"w\": {\n                    \"a\": 0,\n                    \"k\": 6.44,\n                    \"ix\": 2\n                  },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"ml\": 4\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      15.529610633850098,\n                      7.649808883666992\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      15.53,\n                      7.6499999999999995\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      99.99749660491943,\n                      99.99749660491943\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"24\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 36,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      33,\n                      11\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      16.5,\n                      5.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 37,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          20.61,\n                          7.58\n                        ],\n                        [\n                          2.69,\n                          4.99\n                        ],\n                        [\n                          0.14,\n                          1.57\n                        ],\n                        [\n                          2.19,\n                          0.04\n                        ],\n                        [\n                          22.5,\n                          2.97\n                        ],\n                        [\n                          24.03,\n                          5.03\n                        ],\n                        [\n                          20.61,\n                          7.58\n                        ],\n                        [\n                          20.61,\n                          7.58\n                        ],\n                        [\n                          20.61,\n                          7.58\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.24,\n                          1.65\n                        ],\n                        [\n                          -0.99,\n                          -0.14\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.14,\n                          -0.99\n                        ],\n                        [\n                          1.65,\n                          0.24\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.65,\n                          -0.24\n                        ],\n                        [\n                          0.14,\n                          -0.99\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.99,\n                          0.14\n                        ],\n                        [\n                          -0.24,\n                          1.65\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      16.103836059570312,\n                      5.088968276977539\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.078178079479231,\n                      3.816821920520771\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"25\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"26\",\n          \"w\": 35,\n          \"h\": 32,\n          \"ind\": 38,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.854999542236328,\n                16.54400062561035\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                17.5,\n                16\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999797104884,\n                99.99999797104884\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 10.250000042866644,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"26\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 39,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      35,\n                      32\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      17.5,\n                      16\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 40,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"gr\",\n                  \"nm\": \"Shape Layer\",\n                  \"it\": [\n                    {\n                      \"ty\": \"gr\",\n                      \"nm\": \"Path\",\n                      \"it\": [\n                        {\n                          \"ty\": \"sh\",\n                          \"d\": 1,\n                          \"ks\": {\n                            \"a\": 0,\n                            \"k\": {\n                              \"c\": true,\n                              \"v\": [\n                                [\n                                  11.4,\n                                  0.62\n                                ],\n                                [\n                                  25.43,\n                                  10.35\n                                ],\n                                [\n                                  25.69,\n                                  11.79\n                                ],\n                                [\n                                  24.71,\n                                  19.12\n                                ],\n                                [\n                                  20.72,\n                                  19.61\n                                ],\n                                [\n                                  13.87,\n                                  18.39\n                                ],\n                                [\n                                  7.88,\n                                  21.93\n                                ],\n                                [\n                                  3.96,\n                                  22.87\n                                ],\n                                [\n                                  0.49,\n                                  16.35\n                                ],\n                                [\n                                  0.23,\n                                  14.91\n                                ],\n                                [\n                                  9.96,\n                                  0.88\n                                ],\n                                [\n                                  11.4,\n                                  0.62\n                                ]\n                              ],\n                              \"i\": [\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  -1.18,\n                                  -6.56\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  1.05,\n                                  -2.2\n                                ],\n                                [\n                                  1.35,\n                                  0.84\n                                ],\n                                [\n                                  2.53,\n                                  -0.46\n                                ],\n                                [\n                                  1.34,\n                                  -1.75\n                                ],\n                                [\n                                  1.15,\n                                  1.11\n                                ],\n                                [\n                                  0.46,\n                                  2.59\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  -6.56,\n                                  1.18\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ],\n                              \"o\": [\n                                [\n                                  6.56,\n                                  -1.19\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0.47,\n                                  2.59\n                                ],\n                                [\n                                  -0.68,\n                                  1.44\n                                ],\n                                [\n                                  -1.87,\n                                  -1.17\n                                ],\n                                [\n                                  -2.53,\n                                  0.46\n                                ],\n                                [\n                                  -0.97,\n                                  1.27\n                                ],\n                                [\n                                  -1.75,\n                                  -1.7\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  -1.19,\n                                  -6.56\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ]\n                            }\n                          }\n                        },\n                        {\n                          \"ty\": \"tr\",\n                          \"p\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                              100,\n                              100\n                            ],\n                            \"ix\": 2\n                          },\n                          \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"o\": {\n                            \"a\": 0,\n                            \"k\": 100,\n                            \"ix\": 2\n                          },\n                          \"sk\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"sa\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          }\n                        }\n                      ]\n                    },\n                    {\n                      \"ty\": \"gr\",\n                      \"nm\": \"Path\",\n                      \"it\": [\n                        {\n                          \"ty\": \"sh\",\n                          \"d\": 1,\n                          \"ks\": {\n                            \"a\": 0,\n                            \"k\": {\n                              \"c\": true,\n                              \"v\": [\n                                [\n                                  11.59,\n                                  5.79\n                                ],\n                                [\n                                  7.46,\n                                  11.74\n                                ],\n                                [\n                                  13.41,\n                                  15.87\n                                ],\n                                [\n                                  17.54,\n                                  9.92\n                                ],\n                                [\n                                  11.59,\n                                  5.79\n                                ],\n                                [\n                                  11.59,\n                                  5.79\n                                ]\n                              ],\n                              \"i\": [\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  -0.5,\n                                  -2.78\n                                ],\n                                [\n                                  -2.78,\n                                  0.5\n                                ],\n                                [\n                                  0.5,\n                                  2.78\n                                ],\n                                [\n                                  2.78,\n                                  -0.5\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ],\n                              \"o\": [\n                                [\n                                  -2.79,\n                                  0.5\n                                ],\n                                [\n                                  0.5,\n                                  2.79\n                                ],\n                                [\n                                  2.79,\n                                  -0.5\n                                ],\n                                [\n                                  -0.5,\n                                  -2.79\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ]\n                            }\n                          }\n                        },\n                        {\n                          \"ty\": \"tr\",\n                          \"p\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                              100,\n                              100\n                            ],\n                            \"ix\": 2\n                          },\n                          \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"o\": {\n                            \"a\": 0,\n                            \"k\": 100,\n                            \"ix\": 2\n                          },\n                          \"sk\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"sa\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          }\n                        }\n                      ]\n                    },\n                    {\n                      \"ty\": \"fl\",\n                      \"c\": {\n                        \"a\": 0,\n                        \"k\": [\n                          1,\n                          1,\n                          1\n                        ],\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"r\": 1,\n                      \"bm\": 0\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      17.27910041809082,\n                      15.883710861206055\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.959649469703436,\n                      11.913080900907516\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"27\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"28\",\n          \"w\": 25,\n          \"h\": 25,\n          \"ind\": 41,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                15.815999984741211,\n                23.533000946044922\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                12.5,\n                12.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"29\",\n          \"w\": 24,\n          \"h\": 24,\n          \"ind\": 42,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                25.31599998474121,\n                14.032999992370605\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                12,\n                12\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"28\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 43,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      25,\n                      25\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.5,\n                      12.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 44,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          13.52,\n                          5.16\n                        ],\n                        [\n                          18.11,\n                          11.18\n                        ],\n                        [\n                          16.8,\n                          13.99\n                        ],\n                        [\n                          3.75,\n                          17.94\n                        ],\n                        [\n                          0.74,\n                          14.93\n                        ],\n                        [\n                          4.7,\n                          1.88\n                        ],\n                        [\n                          7.5,\n                          0.57\n                        ],\n                        [\n                          13.52,\n                          5.16\n                        ],\n                        [\n                          13.52,\n                          5.16\n                        ],\n                        [\n                          13.52,\n                          5.16\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.79,\n                          -1.48\n                        ],\n                        [\n                          1.24,\n                          -0.37\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.56,\n                          1.85\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.15,\n                          -0.61\n                        ],\n                        [\n                          -2.4,\n                          -2.4\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          2.41,\n                          2.4\n                        ],\n                        [\n                          0.61,\n                          1.15\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.85,\n                          0.56\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.38,\n                          -1.24\n                        ],\n                        [\n                          1.48,\n                          0.79\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.64606761932373,\n                      12.259976387023926\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      9.484787772000299,\n                      9.1952122279997\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"29\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 45,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      24,\n                      24\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12,\n                      12\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 46,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": false,\n                      \"v\": [\n                        [\n                          19.98,\n                          19.87\n                        ],\n                        [\n                          13.15,\n                          10.77\n                        ],\n                        [\n                          4.04,\n                          3.93\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          5.15,\n                          5.16\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -5.16,\n                          -5.16\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"st\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"w\": {\n                    \"a\": 0,\n                    \"k\": 6.44,\n                    \"ix\": 2\n                  },\n                  \"lc\": 2,\n                  \"lj\": 2,\n                  \"ml\": 4\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.009698867797852,\n                      11.899701118469238\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.010000000000002,\n                      11.9\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      99.99749660491943,\n                      99.99749660491943\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"30\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"31\",\n          \"w\": 34,\n          \"h\": 35,\n          \"ind\": 47,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                18.77899932861328,\n                20.256999969482422\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                17,\n                17.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100.0000004551171,\n                100.00000045511712\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -6.83999986588411,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"31\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 48,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      34,\n                      35\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      17,\n                      17.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 49,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          3.5,\n                          7.09\n                        ],\n                        [\n                          1.24,\n                          11.12\n                        ],\n                        [\n                          0.1,\n                          20.63\n                        ],\n                        [\n                          2.21,\n                          23.31\n                        ],\n                        [\n                          4.86,\n                          23.63\n                        ],\n                        [\n                          7.49,\n                          21.78\n                        ],\n                        [\n                          8.67,\n                          16.77\n                        ],\n                        [\n                          13.09,\n                          13.67\n                        ],\n                        [\n                          16.66,\n                          17.72\n                        ],\n                        [\n                          16.61,\n                          22.88\n                        ],\n                        [\n                          18.73,\n                          25.29\n                        ],\n                        [\n                          21.39,\n                          25.61\n                        ],\n                        [\n                          24.07,\n                          23.5\n                        ],\n                        [\n                          25.21,\n                          14\n                        ],\n                        [\n                          23.96,\n                          9.55\n                        ],\n                        [\n                          17.94,\n                          1.89\n                        ],\n                        [\n                          11.16,\n                          1.07\n                        ],\n                        [\n                          3.5,\n                          7.09\n                        ],\n                        [\n                          3.5,\n                          7.09\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.19,\n                          -1.59\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.32,\n                          -0.16\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.28,\n                          1.2\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -2.05,\n                          -0.25\n                        ],\n                        [\n                          0.02,\n                          -2.06\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.22,\n                          -0.15\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.16,\n                          1.32\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.99,\n                          1.26\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          2.09,\n                          -1.64\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          -1.26,\n                          0.99\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.16,\n                          1.32\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.22,\n                          0.15\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.47,\n                          -2.01\n                        ],\n                        [\n                          2.05,\n                          0.25\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.01,\n                          1.23\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.32,\n                          0.16\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.19,\n                          -1.59\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.64,\n                          -2.1\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      16.889612197875977,\n                      17.11311149597168\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.667526376186217,\n                      12.835154150998617\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"32\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"33\",\n          \"w\": 25,\n          \"h\": 20,\n          \"ind\": 50,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                20.232999801635742,\n                12.520999908447266\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                12.5,\n                10\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999885890291,\n                99.99999885890293\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 13.500000003802489,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 51,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      6.439,\n                      28.974\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 32.193,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      19.31599998474121,\n                      25.7549991607666\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": -90,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 52,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      6.439,\n                      12.877\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 32.193,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      30.58300018310547,\n                      28.9739990234375\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 53,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      6.439,\n                      12.877\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 32.193,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      8.04800033569336,\n                      28.9739990234375\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"34\",\n          \"w\": 4,\n          \"h\": 4,\n          \"ind\": 54,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                -207.46200561523438,\n                -369.1709899902344\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999885890291,\n                99.99999885890293\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 13.500000003802489,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"33\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 55,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      25,\n                      20\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.5,\n                      10\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 56,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          2.37,\n                          14.42\n                        ],\n                        [\n                          1.38,\n                          13.95\n                        ],\n                        [\n                          1.07,\n                          13.27\n                        ],\n                        [\n                          7.08,\n                          0.88\n                        ],\n                        [\n                          18.06,\n                          9.2\n                        ],\n                        [\n                          18.09,\n                          9.93\n                        ],\n                        [\n                          17.42,\n                          10.81\n                        ],\n                        [\n                          2.37,\n                          14.42\n                        ],\n                        [\n                          2.37,\n                          14.42\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.17,\n                          0.38\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -5.46,\n                          1.31\n                        ],\n                        [\n                          -0.21,\n                          -5.62\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.4,\n                          -0.1\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          -0.4,\n                          0.1\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -2.36,\n                          -5.1\n                        ],\n                        [\n                          5.46,\n                          -1.31\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.02,\n                          0.41\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.222896575927734,\n                      10.051118850708008\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      9.167401070695366,\n                      7.5385274742464\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"34\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"35\",\n          \"ind\": 57,\n          \"ty\": 2,\n          \"nm\": \"Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"35\",\n      \"u\": \"\",\n      \"p\": \"31.png\",\n      \"w\": 1,\n      \"h\": 1,\n      \"e\": 1\n    },\n    {\n      \"id\": \"36\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"37\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 58,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                46.45384979248047,\n                45.477577209472656\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                20.5,\n                20.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999953474834,\n                99.99999953474834\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 132.19999831142374,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"38\",\n          \"w\": 64,\n          \"h\": 63,\n          \"ind\": 59,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                45.70700454711914,\n                45.51499938964844\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                32,\n                31.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999953474834,\n                99.99999953474834\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 132.19999831142374,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"37\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"39\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 60,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked) (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"40\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"41\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 61,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.5,\n                19.5\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                19.5,\n                19.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 62,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer - box\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"rc\",\n              \"d\": 1,\n              \"s\": {\n                \"a\": 0,\n                \"k\": [\n                  41,\n                  41\n                ],\n                \"ix\": 2\n              },\n              \"p\": {\n                \"a\": 0,\n                \"k\": [\n                  20.5,\n                  20.5\n                ],\n                \"ix\": 2\n              },\n              \"r\": {\n                \"a\": 0,\n                \"k\": 0,\n                \"ix\": 2\n              }\n            },\n            {\n              \"ty\": \"fl\",\n              \"c\": {\n                \"a\": 0,\n                \"k\": [\n                  0,\n                  0,\n                  0\n                ],\n                \"ix\": 2\n              },\n              \"o\": {\n                \"a\": 0,\n                \"k\": 0,\n                \"ix\": 2\n              },\n              \"r\": 1,\n              \"bm\": 0\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"39\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 63,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"td\": 1,\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"gr\",\n                  \"nm\": \"Rectangle\",\n                  \"it\": [\n                    {\n                      \"ty\": \"rc\",\n                      \"d\": 1,\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          39.679,\n                          39.679\n                        ],\n                        \"ix\": 2\n                      },\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 21,\n                        \"ix\": 2\n                      }\n                    },\n                    {\n                      \"ty\": \"fl\",\n                      \"c\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"r\": 1,\n                      \"bm\": 0\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          19.839000701904297,\n                          19.839000701904297\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"40\",\n          \"w\": 41,\n          \"h\": 41,\n          \"ind\": 60,\n          \"ty\": 0,\n          \"nm\": \"Clipped group (Masked) (Masked)\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                20.5,\n                20.5\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                20.5,\n                20.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0,\n          \"tt\": 1\n        }\n      ]\n    },\n    {\n      \"id\": \"41\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"42\",\n          \"w\": 40,\n          \"h\": 40,\n          \"ind\": 64,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                1,\n                1\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 65,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer - box\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer - box\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      41,\n                      41\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      20.5,\n                      20.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"42\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"43\",\n          \"ind\": 66,\n          \"ty\": 2,\n          \"nm\": \"Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.839502334594727,\n                19.839492797851562\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                360.5,\n                360.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                5.503467316435709,\n                5.503467316435709\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"43\",\n      \"u\": \"\",\n      \"p\": \"data:image/png;base64,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\",\n      \"w\": 721,\n      \"h\": 721,\n      \"e\": 1\n    },\n    {\n      \"id\": \"38\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 67,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      64,\n                      63\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      32,\n                      31.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 68,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          6.27,\n                          39.26\n                        ],\n                        [\n                          7.88,\n                          6.26\n                        ],\n                        [\n                          31.89,\n                          1.73\n                        ],\n                        [\n                          34.84,\n                          2.11\n                        ],\n                        [\n                          41.35,\n                          1.19\n                        ],\n                        [\n                          47.19,\n                          7.63\n                        ],\n                        [\n                          45.75,\n                          13.53\n                        ],\n                        [\n                          45.91,\n                          16.68\n                        ],\n                        [\n                          39.27,\n                          40.87\n                        ],\n                        [\n                          6.27,\n                          39.26\n                        ],\n                        [\n                          6.27,\n                          39.26\n                        ],\n                        [\n                          6.27,\n                          39.26\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -9.55,\n                          8.66\n                        ],\n                        [\n                          -7.95,\n                          -3.02\n                        ],\n                        [\n                          -0.99,\n                          0.14\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.88,\n                          -3.61\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.32,\n                          -1.02\n                        ],\n                        [\n                          6.94,\n                          -6.29\n                        ],\n                        [\n                          8.67,\n                          9.56\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          -8.66,\n                          -9.56\n                        ],\n                        [\n                          6.74,\n                          -6.11\n                        ],\n                        [\n                          0.94,\n                          0.36\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          3.67,\n                          -0.52\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.25,\n                          1.04\n                        ],\n                        [\n                          2.58,\n                          8.39\n                        ],\n                        [\n                          -9.55,\n                          8.66\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      31.706619262695312,\n                      31.418901443481445\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      23.780556709097354,\n                      23.56476619883002\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"44\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"45\",\n          \"w\": 19,\n          \"h\": 28,\n          \"ind\": 69,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                28.698999404907227,\n                19.81100082397461\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                9.5,\n                14\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999789196237,\n                99.99999789196237\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -14.480000876980029,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"46\",\n          \"w\": 19,\n          \"h\": 27,\n          \"ind\": 70,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                9.895000457763672,\n                18.986000061035156\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                9.5,\n                13.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999789196237,\n                99.99999789196237\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -14.480000876980029,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"refId\": \"47\",\n          \"w\": 4,\n          \"h\": 4,\n          \"ind\": 71,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                -321.0369873046875,\n                -136.73300170898438\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999789196237,\n                99.99999789196237\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -14.480000876980029,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"45\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 72,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      19,\n                      28\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      9.5,\n                      14\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 73,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          13.72,\n                          5.11\n                        ],\n                        [\n                          9.61,\n                          0.63\n                        ],\n                        [\n                          5.71,\n                          1.28\n                        ],\n                        [\n                          2.8,\n                          3.95\n                        ],\n                        [\n                          0.35,\n                          13.42\n                        ],\n                        [\n                          1.61,\n                          17.16\n                        ],\n                        [\n                          4.71,\n                          19.63\n                        ],\n                        [\n                          10.47,\n                          17.69\n                        ],\n                        [\n                          13.72,\n                          5.11\n                        ],\n                        [\n                          13.72,\n                          5.11\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          2.59,\n                          -0.43\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.36,\n                          -1.39\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.12,\n                          -0.89\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.66,\n                          2.54\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          0.66,\n                          -2.54\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1.41,\n                          0.23\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.36,\n                          1.39\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          2.05,\n                          1.63\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      9.382323265075684,\n                      13.996461868286133\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      7.036918801205624,\n                      10.497609319368696\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"46\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 74,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      19,\n                      27\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      9.5,\n                      13.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 75,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          3.84,\n                          2.82\n                        ],\n                        [\n                          9.6,\n                          0.89\n                        ],\n                        [\n                          12.7,\n                          3.35\n                        ],\n                        [\n                          13.96,\n                          7.09\n                        ],\n                        [\n                          11.51,\n                          16.56\n                        ],\n                        [\n                          8.6,\n                          19.23\n                        ],\n                        [\n                          4.7,\n                          19.88\n                        ],\n                        [\n                          0.59,\n                          15.41\n                        ],\n                        [\n                          3.84,\n                          2.82\n                        ],\n                        [\n                          3.84,\n                          2.82\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -2.05,\n                          -1.63\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.36,\n                          -1.39\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.41,\n                          -0.23\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.66,\n                          2.54\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          0.66,\n                          -2.54\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.12,\n                          0.89\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.36,\n                          1.39\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -2.59,\n                          0.43\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      9.697198867797852,\n                      13.354605674743652\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      7.273081198794376,\n                      10.016204557466061\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"47\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"35\",\n          \"ind\": 76,\n          \"ty\": 2,\n          \"nm\": \"Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"48\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"49\",\n          \"w\": 32,\n          \"h\": 33,\n          \"ind\": 77,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.2549991607666,\n                19.704999923706055\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                16,\n                16.5\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.9999982762619,\n                99.99999827626189\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": -7.150000132583977,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"49\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 78,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      32,\n                      33\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      16,\n                      16.5\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 79,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"gr\",\n                  \"nm\": \"Shape Layer\",\n                  \"it\": [\n                    {\n                      \"ty\": \"gr\",\n                      \"nm\": \"Path\",\n                      \"it\": [\n                        {\n                          \"ty\": \"sh\",\n                          \"d\": 1,\n                          \"ks\": {\n                            \"a\": 0,\n                            \"k\": {\n                              \"c\": true,\n                              \"v\": [\n                                [\n                                  10.36,\n                                  11.27\n                                ],\n                                [\n                                  12.46,\n                                  13.96\n                                ],\n                                [\n                                  20.92,\n                                  15.02\n                                ],\n                                [\n                                  22.63,\n                                  17.96\n                                ],\n                                [\n                                  10.58,\n                                  24.07\n                                ],\n                                [\n                                  0.1,\n                                  10.59\n                                ],\n                                [\n                                  9,\n                                  0.42\n                                ],\n                                [\n                                  11.42,\n                                  2.8\n                                ],\n                                [\n                                  10.36,\n                                  11.27\n                                ],\n                                [\n                                  10.36,\n                                  11.27\n                                ]\n                              ],\n                              \"i\": [\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  -1.32,\n                                  -0.17\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0.72,\n                                  -1.29\n                                ],\n                                [\n                                  5.04,\n                                  0.63\n                                ],\n                                [\n                                  -0.83,\n                                  6.61\n                                ],\n                                [\n                                  -4.62,\n                                  1.22\n                                ],\n                                [\n                                  0.18,\n                                  -1.46\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ],\n                              \"o\": [\n                                [\n                                  -0.16,\n                                  1.32\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  1.46,\n                                  0.18\n                                ],\n                                [\n                                  -2.32,\n                                  4.18\n                                ],\n                                [\n                                  -6.61,\n                                  -0.83\n                                ],\n                                [\n                                  0.63,\n                                  -5.04\n                                ],\n                                [\n                                  1.43,\n                                  -0.38\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ]\n                            }\n                          }\n                        },\n                        {\n                          \"ty\": \"tr\",\n                          \"p\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                              100,\n                              100\n                            ],\n                            \"ix\": 2\n                          },\n                          \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"o\": {\n                            \"a\": 0,\n                            \"k\": 100,\n                            \"ix\": 2\n                          },\n                          \"sk\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"sa\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          }\n                        }\n                      ]\n                    },\n                    {\n                      \"ty\": \"gr\",\n                      \"nm\": \"Path\",\n                      \"it\": [\n                        {\n                          \"ty\": \"sh\",\n                          \"d\": 1,\n                          \"ks\": {\n                            \"a\": 0,\n                            \"k\": {\n                              \"c\": true,\n                              \"v\": [\n                                [\n                                  15.02,\n                                  3.26\n                                ],\n                                [\n                                  17.95,\n                                  1.54\n                                ],\n                                [\n                                  23.76,\n                                  9.01\n                                ],\n                                [\n                                  21.37,\n                                  11.43\n                                ],\n                                [\n                                  16.5,\n                                  10.82\n                                ],\n                                [\n                                  14.4,\n                                  8.13\n                                ],\n                                [\n                                  15.02,\n                                  3.26\n                                ],\n                                [\n                                  15.02,\n                                  3.26\n                                ]\n                              ],\n                              \"i\": [\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  -1.29,\n                                  -0.72\n                                ],\n                                [\n                                  -0.84,\n                                  -3.17\n                                ],\n                                [\n                                  1.46,\n                                  0.18\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  -0.16,\n                                  1.32\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ],\n                              \"o\": [\n                                [\n                                  0.18,\n                                  -1.47\n                                ],\n                                [\n                                  2.86,\n                                  1.59\n                                ],\n                                [\n                                  0.38,\n                                  1.43\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  -1.32,\n                                  -0.16\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ],\n                                [\n                                  0,\n                                  0\n                                ]\n                              ]\n                            }\n                          }\n                        },\n                        {\n                          \"ty\": \"tr\",\n                          \"p\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"a\": {\n                            \"a\": 0,\n                            \"k\": [\n                              0,\n                              0\n                            ],\n                            \"ix\": 2\n                          },\n                          \"s\": {\n                            \"a\": 0,\n                            \"k\": [\n                              100,\n                              100\n                            ],\n                            \"ix\": 2\n                          },\n                          \"r\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"o\": {\n                            \"a\": 0,\n                            \"k\": 100,\n                            \"ix\": 2\n                          },\n                          \"sk\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          },\n                          \"sa\": {\n                            \"a\": 0,\n                            \"k\": 0,\n                            \"ix\": 2\n                          }\n                        }\n                      ]\n                    },\n                    {\n                      \"ty\": \"fl\",\n                      \"c\": {\n                        \"a\": 0,\n                        \"k\": [\n                          1,\n                          1,\n                          1\n                        ],\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"r\": 1,\n                      \"bm\": 0\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      15.887228965759277,\n                      16.344947814941406\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      11.915719670942053,\n                      12.259016573429108\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"50\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"refId\": \"51\",\n          \"w\": 34,\n          \"h\": 34,\n          \"ind\": 80,\n          \"ty\": 0,\n          \"nm\": \"Clipped group\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                19.218000411987305,\n                19.386999130249023\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                17,\n                17\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                99.99999872617904,\n                99.99999872617906\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 8.0700003209305,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    },\n    {\n      \"id\": \"51\",\n      \"layers\": [\n        {\n          \"ddd\": 0,\n          \"ind\": 81,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      34,\n                      34\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      17,\n                      17\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      100,\n                      100\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        },\n        {\n          \"ddd\": 0,\n          \"ind\": 82,\n          \"ty\": 4,\n          \"nm\": \"Shape Layer\",\n          \"sr\": 1,\n          \"ks\": {\n            \"p\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"a\": {\n              \"a\": 0,\n              \"k\": [\n                0,\n                0\n              ],\n              \"ix\": 2\n            },\n            \"s\": {\n              \"a\": 0,\n              \"k\": [\n                100,\n                100\n              ],\n              \"ix\": 2\n            },\n            \"r\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"o\": {\n              \"a\": 0,\n              \"k\": 100,\n              \"ix\": 2\n            },\n            \"sk\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            },\n            \"sa\": {\n              \"a\": 0,\n              \"k\": 0,\n              \"ix\": 2\n            }\n          },\n          \"ao\": 0,\n          \"shapes\": [\n            {\n              \"ty\": \"gr\",\n              \"nm\": \"Shape Layer\",\n              \"it\": [\n                {\n                  \"ty\": \"sh\",\n                  \"d\": 1,\n                  \"ks\": {\n                    \"a\": 0,\n                    \"k\": {\n                      \"c\": true,\n                      \"v\": [\n                        [\n                          11.12,\n                          0.73\n                        ],\n                        [\n                          21.3,\n                          4.09\n                        ],\n                        [\n                          13.3,\n                          14.88\n                        ],\n                        [\n                          9.1,\n                          11.65\n                        ],\n                        [\n                          8.95,\n                          11.54\n                        ],\n                        [\n                          6.56,\n                          11.98\n                        ],\n                        [\n                          6.75,\n                          14.4\n                        ],\n                        [\n                          6.89,\n                          14.52\n                        ],\n                        [\n                          11.58,\n                          18.13\n                        ],\n                        [\n                          15.84,\n                          17.54\n                        ],\n                        [\n                          23.54,\n                          7.14\n                        ],\n                        [\n                          24.77,\n                          10.99\n                        ],\n                        [\n                          14.51,\n                          24.64\n                        ],\n                        [\n                          0.86,\n                          14.38\n                        ],\n                        [\n                          11.12,\n                          0.73\n                        ],\n                        [\n                          11.12,\n                          0.73\n                        ],\n                        [\n                          11.12,\n                          0.73\n                        ]\n                      ],\n                      \"i\": [\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -2.59,\n                          -2.55\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.57,\n                          -0.74\n                        ],\n                        [\n                          -0.67,\n                          -0.63\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -1,\n                          1.36\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.2,\n                          -1.38\n                        ],\n                        [\n                          6.6,\n                          -0.94\n                        ],\n                        [\n                          0.93,\n                          6.6\n                        ],\n                        [\n                          -6.6,\n                          0.93\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ],\n                      \"o\": [\n                        [\n                          3.88,\n                          -0.55\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          -0.78,\n                          -0.48\n                        ],\n                        [\n                          -0.57,\n                          0.74\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          1.34,\n                          1.03\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0.61,\n                          1.17\n                        ],\n                        [\n                          0.93,\n                          6.6\n                        ],\n                        [\n                          -6.6,\n                          0.93\n                        ],\n                        [\n                          -0.94,\n                          -6.6\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ],\n                        [\n                          0,\n                          0\n                        ]\n                      ]\n                    }\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      17.084789276123047,\n                      16.912029266357422\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      12.813912717562332,\n                      12.684338333442417\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      133.3299994468689,\n                      133.3299994468689\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            }\n          ],\n          \"ip\": 0,\n          \"op\": 401,\n          \"st\": 0,\n          \"bm\": 0\n        }\n      ]\n    }\n  ],\n  \"layers\": [\n    {\n      \"ddd\": 0,\n      \"ind\": 12345679,\n      \"ty\": 4,\n      \"nm\": \"Group Layer 8\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            0,\n            0\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"shapes\": [\n        {\n          \"ty\": \"gr\",\n          \"it\": [\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              220.741,\n                              37.184\n                            ],\n                            [\n                              225.501,\n                              35.896\n                            ],\n                            [\n                              228.749,\n                              32.36800000000001\n                            ],\n                            [\n                              229.981,\n                              27.216000000000008\n                            ],\n                            [\n                              228.749,\n                              22.12\n                            ],\n                            [\n                              225.501,\n                              18.592\n                            ],\n                            [\n                              220.741,\n                              17.304\n                            ],\n                            [\n                              215.981,\n                              18.592\n                            ],\n                            [\n                              212.677,\n                              22.12\n                            ],\n                            [\n                              211.501,\n                              27.216000000000008\n                            ],\n                            [\n                              212.677,\n                              32.36800000000001\n                            ],\n                            [\n                              215.981,\n                              35.896\n                            ],\n                            [\n                              220.741,\n                              37.184\n                            ],\n                            [\n                              220.741,\n                              37.184\n                            ],\n                            [\n                              220.741,\n                              37.184\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              -1.380999999999972,\n                              0.8586999999999989\n                            ],\n                            [\n                              -0.7839999999999918,\n                              1.493299999999991\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              0.8220000000000027,\n                              1.493299999999991\n                            ],\n                            [\n                              1.382000000000062,\n                              0.8586999999999989\n                            ],\n                            [\n                              1.79200000000003,\n                              0\n                            ],\n                            [\n                              1.418999999999983,\n                              -0.8586999999999989\n                            ],\n                            [\n                              0.8220000000000027,\n                              -1.493300000000005\n                            ],\n                            [\n                              0,\n                              -1.904000000000011\n                            ],\n                            [\n                              -0.7839999999999918,\n                              -1.5307000000000102\n                            ],\n                            [\n                              -1.380999999999972,\n                              -0.8586999999999989\n                            ],\n                            [\n                              -1.754000000000019,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              1.79200000000003,\n                              0\n                            ],\n                            [\n                              1.382000000000062,\n                              -0.8586999999999989\n                            ],\n                            [\n                              0.8220000000000027,\n                              -1.5307000000000102\n                            ],\n                            [\n                              0,\n                              -1.904000000000011\n                            ],\n                            [\n                              -0.7839999999999918,\n                              -1.493300000000005\n                            ],\n                            [\n                              -1.380999999999972,\n                              -0.8586999999999989\n                            ],\n                            [\n                              -1.754000000000019,\n                              0\n                            ],\n                            [\n                              -1.380999999999972,\n                              0.8586999999999989\n                            ],\n                            [\n                              -0.7839999999999918,\n                              1.493299999999991\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              0.8220000000000027,\n                              1.493299999999991\n                            ],\n                            [\n                              1.418999999999983,\n                              0.8586999999999989\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              221.357,\n                              43.06400000000001\n                            ],\n                            [\n                              214.917,\n                              41.608\n                            ],\n                            [\n                              210.49300000000005,\n                              37.408\n                            ],\n                            [\n                              211.221,\n                              36.232\n                            ],\n                            [\n                              211.221,\n                              42.392\n                            ],\n                            [\n                              205.173,\n                              42.392\n                            ],\n                            [\n                              205.173,\n                              0\n                            ],\n                            [\n                              211.501,\n                              0\n                            ],\n                            [\n                              211.501,\n                              18.36800000000001\n                            ],\n                            [\n                              210.49300000000005,\n                              16.912000000000006\n                            ],\n                            [\n                              214.973,\n                              12.88\n                            ],\n                            [\n                              221.357,\n                              11.424000000000007\n                            ],\n                            [\n                              229.085,\n                              13.49600000000001\n                            ],\n                            [\n                              234.51700000000005,\n                              19.152\n                            ],\n                            [\n                              236.533,\n                              27.216000000000008\n                            ],\n                            [\n                              234.51700000000005,\n                              35.28\n                            ],\n                            [\n                              229.141,\n                              40.992\n                            ],\n                            [\n                              221.357,\n                              43.06400000000001\n                            ],\n                            [\n                              221.357,\n                              43.06400000000001\n                            ],\n                            [\n                              221.357,\n                              43.06400000000001\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              1.942000000000007,\n                              0.9706999999999937\n                            ],\n                            [\n                              1.045999999999935,\n                              1.829300000000003\n                            ],\n                            [\n                              -0.2426666666666506,\n                              0.3919999999999959\n                            ],\n                            [\n                              0,\n                              -2.053333333333327\n                            ],\n                            [\n                              2.015999999999963,\n                              0\n                            ],\n                            [\n                              0,\n                              14.13066666666667\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              -6.122666666666674\n                            ],\n                            [\n                              0.3360000000000127,\n                              0.4853333333333296\n                            ],\n                            [\n                              -1.865999999999985,\n                              0.9707000000000079\n                            ],\n                            [\n                              -2.38900000000001,\n                              0\n                            ],\n                            [\n                              -2.277000000000044,\n                              -1.3813000000000102\n                            ],\n                            [\n                              -1.30600000000004,\n                              -2.389300000000006\n                            ],\n                            [\n                              0,\n                              -2.986699999999999\n                            ],\n                            [\n                              1.343999999999937,\n                              -2.389300000000006\n                            ],\n                            [\n                              2.27800000000002,\n                              -1.4187000000000012\n                            ],\n                            [\n                              2.912000000000035,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -2.351999999999975,\n                              0\n                            ],\n                            [\n                              -1.903999999999996,\n                              -0.9707000000000079\n                            ],\n                            [\n                              0.2426666666666506,\n                              -0.3919999999999959\n                            ],\n                            [\n                              0,\n                              2.053333333333327\n                            ],\n                            [\n                              -2.015999999999963,\n                              0\n                            ],\n                            [\n                              0,\n                              -14.13066666666667\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              6.122666666666667\n                            ],\n                            [\n                              -0.3360000000000127,\n                              -0.4853333333333296\n                            ],\n                            [\n                              1.120000000000005,\n                              -1.717300000000009\n                            ],\n                            [\n                              1.867000000000075,\n                              -0.9706999999999937\n                            ],\n                            [\n                              2.875,\n                              0\n                            ],\n                            [\n                              2.314999999999941,\n                              1.381299999999996\n                            ],\n                            [\n                              1.343999999999937,\n                              2.389300000000006\n                            ],\n                            [\n                              0,\n                              2.986699999999999\n                            ],\n                            [\n                              -1.30600000000004,\n                              2.389300000000006\n                            ],\n                            [\n                              -2.27699999999993,\n                              1.381299999999996\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              181.87,\n                              43.06400000000001\n                            ],\n                            [\n                              176.438,\n                              42\n                            ],\n                            [\n                              172.854,\n                              38.976\n                            ],\n                            [\n                              171.566,\n                              34.384\n                            ],\n                            [\n                              172.63,\n                              29.960000000000008\n                            ],\n                            [\n                              176.046,\n                              26.656000000000006\n                            ],\n                            [\n                              181.814,\n                              24.752\n                            ],\n                            [\n                              192.342,\n                              23.016000000000005\n                            ],\n                            [\n                              192.342,\n                              28\n                            ],\n                            [\n                              183.046,\n                              29.624\n                            ],\n                            [\n                              179.35,\n                              31.248\n                            ],\n                            [\n                              178.174,\n                              34.16\n                            ],\n                            [\n                              179.462,\n                              37.016000000000005\n                            ],\n                            [\n                              182.878,\n                              38.08\n                            ],\n                            [\n                              187.35799999999995,\n                              36.96000000000001\n                            ],\n                            [\n                              190.38199999999995,\n                              33.992\n                            ],\n                            [\n                              191.446,\n                              29.792\n                            ],\n                            [\n                              191.446,\n                              22.008\n                            ],\n                            [\n                              189.766,\n                              18.36800000000001\n                            ],\n                            [\n                              185.398,\n                              16.912000000000006\n                            ],\n                            [\n                              180.974,\n                              18.256\n                            ],\n                            [\n                              178.23,\n                              21.616\n                            ],\n                            [\n                              172.966,\n                              18.98400000000001\n                            ],\n                            [\n                              175.71,\n                              15.064000000000007\n                            ],\n                            [\n                              180.134,\n                              12.376\n                            ],\n                            [\n                              185.566,\n                              11.424000000000007\n                            ],\n                            [\n                              191.894,\n                              12.768\n                            ],\n                            [\n                              196.206,\n                              16.52\n                            ],\n                            [\n                              197.774,\n                              22.008\n                            ],\n                            [\n                              197.774,\n                              42.392\n                            ],\n                            [\n                              191.726,\n                              42.392\n                            ],\n                            [\n                              191.726,\n                              36.904\n                            ],\n                            [\n                              193.014,\n                              37.072\n                            ],\n                            [\n                              190.27,\n                              40.264\n                            ],\n                            [\n                              186.518,\n                              42.336\n                            ],\n                            [\n                              181.87,\n                              43.06400000000001\n                            ],\n                            [\n                              181.87,\n                              43.06400000000001\n                            ],\n                            [\n                              181.87,\n                              43.06400000000001\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              1.567999999999984,\n                              0.7092999999999989\n                            ],\n                            [\n                              0.8589999999999236,\n                              1.2693000000000012\n                            ],\n                            [\n                              0,\n                              1.7547\n                            ],\n                            [\n                              -0.7089999999999463,\n                              1.306699999999992\n                            ],\n                            [\n                              -1.530000000000086,\n                              0.8960000000000008\n                            ],\n                            [\n                              -2.313999999999965,\n                              0.3733000000000004\n                            ],\n                            [\n                              -3.509333333333302,\n                              0.5786666666666633\n                            ],\n                            [\n                              0,\n                              -1.661333333333332\n                            ],\n                            [\n                              3.098666666666645,\n                              -0.541333333333327\n                            ],\n                            [\n                              0.7839999999999918,\n                              -0.784000000000006\n                            ],\n                            [\n                              0,\n                              -1.194699999999997\n                            ],\n                            [\n                              -0.8579999999999472,\n                              -0.7467000000000041\n                            ],\n                            [\n                              -1.381000000000085,\n                              0\n                            ],\n                            [\n                              -1.268999999999892,\n                              0.7466999999999899\n                            ],\n                            [\n                              -0.7089999999999463,\n                              1.2319999999999993\n                            ],\n                            [\n                              0,\n                              1.530699999999996\n                            ],\n                            [\n                              0,\n                              2.594666666666669\n                            ],\n                            [\n                              1.120000000000005,\n                              0.9332999999999885\n                            ],\n                            [\n                              1.829999999999927,\n                              0\n                            ],\n                            [\n                              1.269999999999982,\n                              -0.8960000000000008\n                            ],\n                            [\n                              0.5979999999999563,\n                              -1.381299999999996\n                            ],\n                            [\n                              1.754666666666708,\n                              0.8773333333333255\n                            ],\n                            [\n                              -1.269000000000005,\n                              1.11999999999999\n                            ],\n                            [\n                              -1.680000000000064,\n                              0.6346999999999952\n                            ],\n                            [\n                              -1.903999999999996,\n                              0\n                            ],\n                            [\n                              -1.828999999999951,\n                              -0.8960000000000008\n                            ],\n                            [\n                              -1.008000000000038,\n                              -1.6053\n                            ],\n                            [\n                              0,\n                              -2.090699999999998\n                            ],\n                            [\n                              0,\n                              -6.794666666666672\n                            ],\n                            [\n                              2.015999999999963,\n                              0\n                            ],\n                            [\n                              0,\n                              1.829333333333338\n                            ],\n                            [\n                              -0.4293333333333749,\n                              -0.05599999999999739\n                            ],\n                            [\n                              1.120000000000005,\n                              -0.8959999999999866\n                            ],\n                            [\n                              1.418999999999983,\n                              -0.4852999999999952\n                            ],\n                            [\n                              1.717999999999961,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -2.052999999999997,\n                              0\n                            ],\n                            [\n                              -1.529999999999973,\n                              -0.7467000000000041\n                            ],\n                            [\n                              -0.8580000000000609,\n                              -1.306699999999992\n                            ],\n                            [\n                              0,\n                              -1.642700000000005\n                            ],\n                            [\n                              0.7469999999999573,\n                              -1.306700000000006\n                            ],\n                            [\n                              1.530999999999949,\n                              -0.8960000000000008\n                            ],\n                            [\n                              3.509333333333302,\n                              -0.5786666666666633\n                            ],\n                            [\n                              0,\n                              1.661333333333332\n                            ],\n                            [\n                              -3.098666666666645,\n                              0.541333333333327\n                            ],\n                            [\n                              -1.680000000000064,\n                              0.2987000000000108\n                            ],\n                            [\n                              -0.7839999999999918,\n                              0.7467000000000041\n                            ],\n                            [\n                              0,\n                              1.157300000000006\n                            ],\n                            [\n                              0.8959999999999582,\n                              0.7092999999999989\n                            ],\n                            [\n                              1.717999999999961,\n                              0\n                            ],\n                            [\n                              1.307000000000016,\n                              -0.7467000000000041\n                            ],\n                            [\n                              0.7100000000000364,\n                              -1.2693000000000012\n                            ],\n                            [\n                              0,\n                              -2.594666666666669\n                            ],\n                            [\n                              0,\n                              -1.493299999999991\n                            ],\n                            [\n                              -1.081999999999994,\n                              -0.9707000000000079\n                            ],\n                            [\n                              -1.680000000000064,\n                              0\n                            ],\n                            [\n                              -1.232000000000085,\n                              0.8586999999999989\n                            ],\n                            [\n                              -1.754666666666708,\n                              -0.8773333333333255\n                            ],\n                            [\n                              0.5599999999999454,\n                              -1.493300000000005\n                            ],\n                            [\n                              1.269999999999982,\n                              -1.157300000000006\n                            ],\n                            [\n                              1.717999999999961,\n                              -0.6347000000000094\n                            ],\n                            [\n                              2.389999999999986,\n                              0\n                            ],\n                            [\n                              1.866999999999962,\n                              0.8960000000000008\n                            ],\n                            [\n                              1.045999999999935,\n                              1.568000000000012\n                            ],\n                            [\n                              0,\n                              6.794666666666672\n                            ],\n                            [\n                              -2.015999999999963,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.829333333333338\n                            ],\n                            [\n                              0.4293333333333749,\n                              0.05599999999999739\n                            ],\n                            [\n                              -0.70900000000006,\n                              1.2319999999999993\n                            ],\n                            [\n                              -1.081999999999994,\n                              0.8960000000000008\n                            ],\n                            [\n                              -1.380999999999972,\n                              0.4853000000000094\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              159.072,\n                              42.392\n                            ],\n                            [\n                              159.072,\n                              0\n                            ],\n                            [\n                              165.4,\n                              0\n                            ],\n                            [\n                              165.4,\n                              42.392\n                            ],\n                            [\n                              159.072,\n                              42.392\n                            ],\n                            [\n                              159.072,\n                              42.392\n                            ],\n                            [\n                              159.072,\n                              42.392\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              14.13066666666667\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              -14.13066666666667\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              0,\n                              -14.13066666666667\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              14.13066666666667\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              138.952,\n                              43.06400000000001\n                            ],\n                            [\n                              130.888,\n                              40.992\n                            ],\n                            [\n                              125.456,\n                              35.28\n                            ],\n                            [\n                              123.496,\n                              27.16\n                            ],\n                            [\n                              125.456,\n                              19.040000000000006\n                            ],\n                            [\n                              130.832,\n                              13.49600000000001\n                            ],\n                            [\n                              138.448,\n                              11.424000000000007\n                            ],\n                            [\n                              144.552,\n                              12.600000000000009\n                            ],\n                            [\n                              149.088,\n                              15.848\n                            ],\n                            [\n                              151.888,\n                              20.49600000000001\n                            ],\n                            [\n                              152.896,\n                              26.096\n                            ],\n                            [\n                              152.84,\n                              27.608\n                            ],\n                            [\n                              152.616,\n                              29.064000000000007\n                            ],\n                            [\n                              128.48,\n                              29.064000000000007\n                            ],\n                            [\n                              128.48,\n                              24.024\n                            ],\n                            [\n                              149.032,\n                              24.024\n                            ],\n                            [\n                              146.008,\n                              26.320000000000007\n                            ],\n                            [\n                              145.616,\n                              21.448000000000008\n                            ],\n                            [\n                              142.816,\n                              18.032\n                            ],\n                            [\n                              138.448,\n                              16.744\n                            ],\n                            [\n                              133.968,\n                              18.032\n                            ],\n                            [\n                              130.944,\n                              21.616\n                            ],\n                            [\n                              130.104,\n                              27.216000000000008\n                            ],\n                            [\n                              130.944,\n                              32.592\n                            ],\n                            [\n                              134.192,\n                              36.176\n                            ],\n                            [\n                              139.008,\n                              37.464\n                            ],\n                            [\n                              143.65599999999995,\n                              36.232\n                            ],\n                            [\n                              146.736,\n                              33.040000000000006\n                            ],\n                            [\n                              151.888,\n                              35.56\n                            ],\n                            [\n                              149.088,\n                              39.42400000000001\n                            ],\n                            [\n                              144.60799999999995,\n                              42.11200000000001\n                            ],\n                            [\n                              138.952,\n                              43.06400000000001\n                            ],\n                            [\n                              138.952,\n                              43.06400000000001\n                            ],\n                            [\n                              138.952,\n                              43.06400000000001\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              2.351999999999975,\n                              1.381299999999996\n                            ],\n                            [\n                              1.307000000000016,\n                              2.389300000000006\n                            ],\n                            [\n                              0,\n                              2.986699999999999\n                            ],\n                            [\n                              -1.307000000000016,\n                              2.35199999999999\n                            ],\n                            [\n                              -2.240000000000009,\n                              1.343999999999994\n                            ],\n                            [\n                              -2.836999999999989,\n                              0\n                            ],\n                            [\n                              -1.79200000000003,\n                              -0.784000000000006\n                            ],\n                            [\n                              -1.231999999999971,\n                              -1.381299999999996\n                            ],\n                            [\n                              -0.6349999999999909,\n                              -1.754700000000014\n                            ],\n                            [\n                              0,\n                              -1.978700000000003\n                            ],\n                            [\n                              0.03699999999992087,\n                              -0.5227000000000004\n                            ],\n                            [\n                              0.1119999999999663,\n                              -0.4480000000000075\n                            ],\n                            [\n                              8.04533333333336,\n                              0\n                            ],\n                            [\n                              0,\n                              1.680000000000007\n                            ],\n                            [\n                              -6.850666666666712,\n                              0\n                            ],\n                            [\n                              1.008000000000038,\n                              -0.7653333333333308\n                            ],\n                            [\n                              0.6349999999999909,\n                              1.4187000000000012\n                            ],\n                            [\n                              1.269000000000005,\n                              0.8213000000000079\n                            ],\n                            [\n                              1.680000000000064,\n                              0\n                            ],\n                            [\n                              1.307000000000016,\n                              -0.8586999999999989\n                            ],\n                            [\n                              0.70900000000006,\n                              -1.567999999999998\n                            ],\n                            [\n                              -0.1490000000000009,\n                              -2.202700000000007\n                            ],\n                            [\n                              -0.7469999999999573,\n                              -1.530699999999996\n                            ],\n                            [\n                              -1.380999999999972,\n                              -0.8586999999999989\n                            ],\n                            [\n                              -1.79200000000003,\n                              0\n                            ],\n                            [\n                              -1.268999999999892,\n                              0.8213000000000079\n                            ],\n                            [\n                              -0.7469999999999573,\n                              1.306699999999992\n                            ],\n                            [\n                              -1.717333333333386,\n                              -0.8400000000000034\n                            ],\n                            [\n                              1.269000000000005,\n                              -1.157300000000006\n                            ],\n                            [\n                              1.755000000000109,\n                              -0.6720000000000113\n                            ],\n                            [\n                              2.052999999999997,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -3.024000000000001,\n                              0\n                            ],\n                            [\n                              -2.315000000000055,\n                              -1.4187000000000012\n                            ],\n                            [\n                              -1.307000000000016,\n                              -2.426699999999997\n                            ],\n                            [\n                              0,\n                              -3.061299999999989\n                            ],\n                            [\n                              1.343999999999937,\n                              -2.352000000000004\n                            ],\n                            [\n                              2.240000000000009,\n                              -1.3813000000000102\n                            ],\n                            [\n                              2.277000000000044,\n                              0\n                            ],\n                            [\n                              1.79200000000003,\n                              0.7839999999999918\n                            ],\n                            [\n                              1.232000000000085,\n                              1.344000000000008\n                            ],\n                            [\n                              0.6720000000000255,\n                              1.7547\n                            ],\n                            [\n                              0,\n                              0.4852999999999952\n                            ],\n                            [\n                              -0.03700000000003456,\n                              0.5227000000000004\n                            ],\n                            [\n                              -8.04533333333336,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.680000000000007\n                            ],\n                            [\n                              6.850666666666712,\n                              0\n                            ],\n                            [\n                              -1.008000000000038,\n                              0.7653333333333308\n                            ],\n                            [\n                              0.3729999999999336,\n                              -1.829300000000003\n                            ],\n                            [\n                              -0.59699999999998,\n                              -1.456000000000003\n                            ],\n                            [\n                              -1.232000000000085,\n                              -0.8586999999999989\n                            ],\n                            [\n                              -1.67999999999995,\n                              0\n                            ],\n                            [\n                              -1.306999999999903,\n                              0.8213000000000079\n                            ],\n                            [\n                              -0.7089999999999463,\n                              1.530699999999996\n                            ],\n                            [\n                              -0.1870000000000118,\n                              2.053299999999993\n                            ],\n                            [\n                              0.7839999999999918,\n                              1.53070000000001\n                            ],\n                            [\n                              1.418999999999983,\n                              0.8586999999999989\n                            ],\n                            [\n                              1.828999999999951,\n                              0\n                            ],\n                            [\n                              1.307000000000016,\n                              -0.8212999999999937\n                            ],\n                            [\n                              1.717333333333386,\n                              0.8400000000000034\n                            ],\n                            [\n                              -0.59699999999998,\n                              1.4187000000000012\n                            ],\n                            [\n                              -1.231999999999971,\n                              1.11999999999999\n                            ],\n                            [\n                              -1.716999999999985,\n                              0.6346999999999952\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              111.001,\n                              7.951999999999998\n                            ],\n                            [\n                              111.001,\n                              0.6720000000000041\n                            ],\n                            [\n                              117.329,\n                              0.6720000000000041\n                            ],\n                            [\n                              117.329,\n                              7.951999999999998\n                            ],\n                            [\n                              111.001,\n                              7.951999999999998\n                            ],\n                            [\n                              111.001,\n                              7.951999999999998\n                            ],\n                            [\n                              111.001,\n                              7.951999999999998\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              2.426666666666662\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              -2.426666666666662\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              0,\n                              -2.426666666666662\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              2.426666666666662\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              111.001,\n                              42.392\n                            ],\n                            [\n                              111.001,\n                              12.096\n                            ],\n                            [\n                              117.329,\n                              12.096\n                            ],\n                            [\n                              117.329,\n                              42.392\n                            ],\n                            [\n                              111.001,\n                              42.392\n                            ],\n                            [\n                              111.001,\n                              42.392\n                            ],\n                            [\n                              111.001,\n                              42.392\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              10.09866666666667\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              -10.09866666666667\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              0,\n                              -10.09866666666666\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              10.09866666666666\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              101.41,\n                              42.72800000000001\n                            ],\n                            [\n                              94.01800000000003,\n                              40.040000000000006\n                            ],\n                            [\n                              91.38599999999997,\n                              32.48\n                            ],\n                            [\n                              91.38599999999997,\n                              17.808000000000007\n                            ],\n                            [\n                              86.06600000000003,\n                              17.808000000000007\n                            ],\n                            [\n                              86.06600000000003,\n                              12.096\n                            ],\n                            [\n                              86.90599999999995,\n                              12.096\n                            ],\n                            [\n                              90.21000000000004,\n                              10.864\n                            ],\n                            [\n                              91.38599999999997,\n                              7.504000000000005\n                            ],\n                            [\n                              91.38599999999997,\n                              5.152000000000001\n                            ],\n                            [\n                              97.71400000000006,\n                              5.152000000000001\n                            ],\n                            [\n                              97.71400000000006,\n                              12.096\n                            ],\n                            [\n                              104.602,\n                              12.096\n                            ],\n                            [\n                              104.602,\n                              17.808000000000007\n                            ],\n                            [\n                              97.71400000000006,\n                              17.808000000000007\n                            ],\n                            [\n                              97.71400000000006,\n                              32.2\n                            ],\n                            [\n                              98.21799999999996,\n                              34.888000000000005\n                            ],\n                            [\n                              99.84199999999998,\n                              36.568\n                            ],\n                            [\n                              102.754,\n                              37.128\n                            ],\n                            [\n                              103.76200000000006,\n                              37.072\n                            ],\n                            [\n                              104.826,\n                              36.96000000000001\n                            ],\n                            [\n                              104.826,\n                              42.392\n                            ],\n                            [\n                              103.09,\n                              42.616\n                            ],\n                            [\n                              101.41,\n                              42.72800000000001\n                            ],\n                            [\n                              101.41,\n                              42.72800000000001\n                            ],\n                            [\n                              101.41,\n                              42.72800000000001\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              1.754999999999995,\n                              1.792000000000002\n                            ],\n                            [\n                              0,\n                              3.248000000000005\n                            ],\n                            [\n                              0,\n                              4.890666666666661\n                            ],\n                            [\n                              1.773333333333312,\n                              0\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              -0.2799999999999727,\n                              0\n                            ],\n                            [\n                              -0.7839999999999918,\n                              0.8212999999999937\n                            ],\n                            [\n                              0,\n                              1.4187000000000012\n                            ],\n                            [\n                              0,\n                              0.7839999999999989\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              -2.314666666666668\n                            ],\n                            [\n                              -2.295999999999935,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.903999999999996\n                            ],\n                            [\n                              2.295999999999935,\n                              0\n                            ],\n                            [\n                              0,\n                              -4.797333333333327\n                            ],\n                            [\n                              -0.3360000000000127,\n                              -0.7467000000000041\n                            ],\n                            [\n                              -0.7469999999999573,\n                              -0.4106999999999914\n                            ],\n                            [\n                              -1.19500000000005,\n                              0\n                            ],\n                            [\n                              -0.3730000000000473,\n                              0.03730000000000189\n                            ],\n                            [\n                              -0.3360000000000127,\n                              0.03729999999998768\n                            ],\n                            [\n                              0,\n                              -1.810666666666663\n                            ],\n                            [\n                              0.6349999999999909,\n                              -0.07469999999999288\n                            ],\n                            [\n                              0.4850000000000136,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -3.173000000000002,\n                              0\n                            ],\n                            [\n                              -1.754999999999995,\n                              -1.792000000000002\n                            ],\n                            [\n                              0,\n                              -4.890666666666661\n                            ],\n                            [\n                              -1.773333333333312,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.903999999999996\n                            ],\n                            [\n                              0.2799999999999727,\n                              0\n                            ],\n                            [\n                              1.419000000000096,\n                              0\n                            ],\n                            [\n                              0.7839999999999918,\n                              -0.8213000000000079\n                            ],\n                            [\n                              0,\n                              -0.7839999999999989\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              2.314666666666668\n                            ],\n                            [\n                              2.295999999999935,\n                              0\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              -2.295999999999935,\n                              0\n                            ],\n                            [\n                              0,\n                              4.797333333333327\n                            ],\n                            [\n                              0,\n                              1.045299999999997\n                            ],\n                            [\n                              0.3360000000000127,\n                              0.7092999999999989\n                            ],\n                            [\n                              0.7470000000000709,\n                              0.3733000000000004\n                            ],\n                            [\n                              0.2989999999999782,\n                              0\n                            ],\n                            [\n                              0.3729999999999336,\n                              -0.03730000000000189\n                            ],\n                            [\n                              0,\n                              1.810666666666663\n                            ],\n                            [\n                              -0.5230000000000246,\n                              0.0747000000000071\n                            ],\n                            [\n                              -0.6349999999999909,\n                              0.0747000000000071\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              78.71499999999997,\n                              42.72800000000001\n                            ],\n                            [\n                              71.32299999999998,\n                              40.040000000000006\n                            ],\n                            [\n                              68.69100000000003,\n                              32.48\n                            ],\n                            [\n                              68.69100000000003,\n                              17.808000000000007\n                            ],\n                            [\n                              63.37099999999998,\n                              17.808000000000007\n                            ],\n                            [\n                              63.37099999999998,\n                              12.096\n                            ],\n                            [\n                              64.21100000000001,\n                              12.096\n                            ],\n                            [\n                              67.51499999999999,\n                              10.864\n                            ],\n                            [\n                              68.69100000000003,\n                              7.504000000000005\n                            ],\n                            [\n                              68.69100000000003,\n                              5.152000000000001\n                            ],\n                            [\n                              75.019,\n                              5.152000000000001\n                            ],\n                            [\n                              75.019,\n                              12.096\n                            ],\n                            [\n                              81.90700000000004,\n                              12.096\n                            ],\n                            [\n                              81.90700000000004,\n                              17.808000000000007\n                            ],\n                            [\n                              75.019,\n                              17.808000000000007\n                            ],\n                            [\n                              75.019,\n                              32.2\n                            ],\n                            [\n                              75.52300000000002,\n                              34.888000000000005\n                            ],\n                            [\n                              77.14699999999999,\n                              36.568\n                            ],\n                            [\n                              80.05900000000003,\n                              37.128\n                            ],\n                            [\n                              81.06700000000001,\n                              37.072\n                            ],\n                            [\n                              82.13099999999997,\n                              36.96000000000001\n                            ],\n                            [\n                              82.13099999999997,\n                              42.392\n                            ],\n                            [\n                              80.39499999999998,\n                              42.616\n                            ],\n                            [\n                              78.71499999999997,\n                              42.72800000000001\n                            ],\n                            [\n                              78.71499999999997,\n                              42.72800000000001\n                            ],\n                            [\n                              78.71499999999997,\n                              42.72800000000001\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              1.754000000000019,\n                              1.792000000000002\n                            ],\n                            [\n                              0,\n                              3.248000000000005\n                            ],\n                            [\n                              0,\n                              4.890666666666661\n                            ],\n                            [\n                              1.773333333333369,\n                              0\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              -0.2800000000000296,\n                              0\n                            ],\n                            [\n                              -0.7839999999999918,\n                              0.8212999999999937\n                            ],\n                            [\n                              0,\n                              1.4187000000000012\n                            ],\n                            [\n                              0,\n                              0.7839999999999989\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              -2.314666666666668\n                            ],\n                            [\n                              -2.295999999999992,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.903999999999996\n                            ],\n                            [\n                              2.295999999999992,\n                              0\n                            ],\n                            [\n                              0,\n                              -4.797333333333327\n                            ],\n                            [\n                              -0.3360000000000127,\n                              -0.7467000000000041\n                            ],\n                            [\n                              -0.7470000000000141,\n                              -0.4106999999999914\n                            ],\n                            [\n                              -1.19500000000005,\n                              0\n                            ],\n                            [\n                              -0.3740000000000236,\n                              0.03730000000000189\n                            ],\n                            [\n                              -0.3360000000000127,\n                              0.03729999999998768\n                            ],\n                            [\n                              0,\n                              -1.810666666666663\n                            ],\n                            [\n                              0.6340000000000146,\n                              -0.07469999999999288\n                            ],\n                            [\n                              0.4850000000000136,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -3.173999999999978,\n                              0\n                            ],\n                            [\n                              -1.754999999999995,\n                              -1.792000000000002\n                            ],\n                            [\n                              0,\n                              -4.890666666666661\n                            ],\n                            [\n                              -1.773333333333369,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.903999999999996\n                            ],\n                            [\n                              0.2800000000000296,\n                              0\n                            ],\n                            [\n                              1.418000000000006,\n                              0\n                            ],\n                            [\n                              0.7839999999999918,\n                              -0.8213000000000079\n                            ],\n                            [\n                              0,\n                              -0.7839999999999989\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              2.314666666666668\n                            ],\n                            [\n                              2.295999999999992,\n                              0\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              -2.295999999999992,\n                              0\n                            ],\n                            [\n                              0,\n                              4.797333333333327\n                            ],\n                            [\n                              0,\n                              1.045299999999997\n                            ],\n                            [\n                              0.3359999999999559,\n                              0.7092999999999989\n                            ],\n                            [\n                              0.7460000000000377,\n                              0.3733000000000004\n                            ],\n                            [\n                              0.297999999999945,\n                              0\n                            ],\n                            [\n                              0.3730000000000473,\n                              -0.03730000000000189\n                            ],\n                            [\n                              0,\n                              1.810666666666663\n                            ],\n                            [\n                              -0.5230000000000246,\n                              0.0747000000000071\n                            ],\n                            [\n                              -0.6349999999999909,\n                              0.0747000000000071\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              44.18799999999999,\n                              37.184\n                            ],\n                            [\n                              48.94799999999998,\n                              35.896\n                            ],\n                            [\n                              52.19600000000003,\n                              32.36800000000001\n                            ],\n                            [\n                              53.428,\n                              27.216000000000008\n                            ],\n                            [\n                              52.19600000000003,\n                              22.12\n                            ],\n                            [\n                              48.94799999999998,\n                              18.592\n                            ],\n                            [\n                              44.18799999999999,\n                              17.304\n                            ],\n                            [\n                              39.428,\n                              18.592\n                            ],\n                            [\n                              36.12400000000002,\n                              22.12\n                            ],\n                            [\n                              34.94799999999998,\n                              27.216000000000008\n                            ],\n                            [\n                              36.12400000000002,\n                              32.36800000000001\n                            ],\n                            [\n                              39.428,\n                              35.896\n                            ],\n                            [\n                              44.18799999999999,\n                              37.184\n                            ],\n                            [\n                              44.18799999999999,\n                              37.184\n                            ],\n                            [\n                              44.18799999999999,\n                              37.184\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              -1.381999999999948,\n                              0.8586999999999989\n                            ],\n                            [\n                              -0.7840000000000487,\n                              1.493299999999991\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              0.8209999999999695,\n                              1.493299999999991\n                            ],\n                            [\n                              1.381000000000029,\n                              0.8586999999999989\n                            ],\n                            [\n                              1.79200000000003,\n                              0\n                            ],\n                            [\n                              1.418000000000006,\n                              -0.8586999999999989\n                            ],\n                            [\n                              0.8209999999999695,\n                              -1.493300000000005\n                            ],\n                            [\n                              0,\n                              -1.904000000000011\n                            ],\n                            [\n                              -0.7840000000000487,\n                              -1.5307000000000102\n                            ],\n                            [\n                              -1.382000000000005,\n                              -0.8586999999999989\n                            ],\n                            [\n                              -1.754999999999995,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              1.79200000000003,\n                              0\n                            ],\n                            [\n                              1.381000000000029,\n                              -0.8586999999999989\n                            ],\n                            [\n                              0.8209999999999695,\n                              -1.5307000000000102\n                            ],\n                            [\n                              0,\n                              -1.904000000000011\n                            ],\n                            [\n                              -0.7840000000000487,\n                              -1.493300000000005\n                            ],\n                            [\n                              -1.381999999999948,\n                              -0.8586999999999989\n                            ],\n                            [\n                              -1.754999999999995,\n                              0\n                            ],\n                            [\n                              -1.382000000000005,\n                              0.8586999999999989\n                            ],\n                            [\n                              -0.7840000000000487,\n                              1.493299999999991\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              0.8209999999999695,\n                              1.493299999999991\n                            ],\n                            [\n                              1.418000000000006,\n                              0.8586999999999989\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              44.18799999999999,\n                              43.06400000000001\n                            ],\n                            [\n                              36.18000000000001,\n                              40.992\n                            ],\n                            [\n                              30.46800000000002,\n                              35.336\n                            ],\n                            [\n                              28.33999999999997,\n                              27.216000000000008\n                            ],\n                            [\n                              30.46800000000002,\n                              19.096\n                            ],\n                            [\n                              36.18000000000001,\n                              13.49600000000001\n                            ],\n                            [\n                              44.18799999999999,\n                              11.424000000000007\n                            ],\n                            [\n                              52.19600000000003,\n                              13.49600000000001\n                            ],\n                            [\n                              57.85199999999998,\n                              19.096\n                            ],\n                            [\n                              59.98000000000002,\n                              27.216000000000008\n                            ],\n                            [\n                              57.85199999999998,\n                              35.392\n                            ],\n                            [\n                              52.139999999999986,\n                              41.048\n                            ],\n                            [\n                              44.18799999999999,\n                              43.06400000000001\n                            ],\n                            [\n                              44.18799999999999,\n                              43.06400000000001\n                            ],\n                            [\n                              44.18799999999999,\n                              43.06400000000001\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              2.425999999999988,\n                              1.381299999999996\n                            ],\n                            [\n                              1.418000000000006,\n                              2.389300000000006\n                            ],\n                            [\n                              0,\n                              3.024000000000001\n                            ],\n                            [\n                              -1.41900000000004,\n                              2.352000000000004\n                            ],\n                            [\n                              -2.389999999999986,\n                              1.343999999999994\n                            ],\n                            [\n                              -2.949999999999989,\n                              0\n                            ],\n                            [\n                              -2.352000000000032,\n                              -1.3813000000000102\n                            ],\n                            [\n                              -1.381999999999948,\n                              -2.389300000000006\n                            ],\n                            [\n                              0,\n                              -3.061300000000003\n                            ],\n                            [\n                              1.418000000000006,\n                              -2.389299999999992\n                            ],\n                            [\n                              2.38900000000001,\n                              -1.381299999999996\n                            ],\n                            [\n                              2.912000000000035,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -2.911999999999978,\n                              0\n                            ],\n                            [\n                              -2.389999999999986,\n                              -1.381299999999996\n                            ],\n                            [\n                              -1.41900000000004,\n                              -2.389299999999992\n                            ],\n                            [\n                              0,\n                              -3.061300000000003\n                            ],\n                            [\n                              1.418000000000006,\n                              -2.389300000000006\n                            ],\n                            [\n                              2.38900000000001,\n                              -1.3813000000000102\n                            ],\n                            [\n                              2.98599999999999,\n                              0\n                            ],\n                            [\n                              2.388999999999953,\n                              1.343999999999994\n                            ],\n                            [\n                              1.418000000000006,\n                              2.352000000000004\n                            ],\n                            [\n                              0,\n                              3.061299999999989\n                            ],\n                            [\n                              -1.418999999999983,\n                              2.389300000000006\n                            ],\n                            [\n                              -2.389999999999986,\n                              1.343999999999994\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              0,\n                              42.392\n                            ],\n                            [\n                              0,\n                              0.6720000000000041\n                            ],\n                            [\n                              6.608000000000004,\n                              0.6720000000000041\n                            ],\n                            [\n                              6.608000000000004,\n                              36.512\n                            ],\n                            [\n                              24.639999999999986,\n                              36.512\n                            ],\n                            [\n                              24.639999999999986,\n                              42.392\n                            ],\n                            [\n                              0,\n                              42.392\n                            ],\n                            [\n                              0,\n                              42.392\n                            ],\n                            [\n                              0,\n                              42.392\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              13.90666666666666\n                            ],\n                            [\n                              -2.202666666666687,\n                              0\n                            ],\n                            [\n                              0,\n                              -11.94666666666666\n                            ],\n                            [\n                              -6.01066666666668,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.959999999999994\n                            ],\n                            [\n                              8.21333333333331,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              0,\n                              -13.90666666666667\n                            ],\n                            [\n                              2.202666666666687,\n                              0\n                            ],\n                            [\n                              0,\n                              11.94666666666667\n                            ],\n                            [\n                              6.01066666666668,\n                              0\n                            ],\n                            [\n                              0,\n                              1.959999999999994\n                            ],\n                            [\n                              -8.21333333333331,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      98.08047485351562,\n                      -21.67217254638672\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      99.99999403953552,\n                      99.99999403953552\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            },\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              246.681,\n                              42.392\n                            ],\n                            [\n                              246.681,\n                              0\n                            ],\n                            [\n                              253.009,\n                              0\n                            ],\n                            [\n                              253.009,\n                              18.032\n                            ],\n                            [\n                              252.001,\n                              17.248\n                            ],\n                            [\n                              255.585,\n                              12.936000000000007\n                            ],\n                            [\n                              261.297,\n                              11.424000000000007\n                            ],\n                            [\n                              267.23299999999995,\n                              12.88\n                            ],\n                            [\n                              271.265,\n                              16.912000000000006\n                            ],\n                            [\n                              272.721,\n                              22.792\n                            ],\n                            [\n                              272.721,\n                              42.392\n                            ],\n                            [\n                              266.449,\n                              42.392\n                            ],\n                            [\n                              266.449,\n                              24.528000000000006\n                            ],\n                            [\n                              265.553,\n                              20.664\n                            ],\n                            [\n                              263.201,\n                              18.2\n                            ],\n                            [\n                              259.729,\n                              17.304\n                            ],\n                            [\n                              256.25699999999995,\n                              18.2\n                            ],\n                            [\n                              253.849,\n                              20.664\n                            ],\n                            [\n                              253.009,\n                              24.528000000000006\n                            ],\n                            [\n                              253.009,\n                              42.392\n                            ],\n                            [\n                              246.681,\n                              42.392\n                            ],\n                            [\n                              246.681,\n                              42.392\n                            ],\n                            [\n                              246.681,\n                              42.392\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              14.13066666666667\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              -6.010666666666665\n                            ],\n                            [\n                              0.3360000000000127,\n                              0.2613333333333259\n                            ],\n                            [\n                              -1.643000000000029,\n                              0.9706999999999937\n                            ],\n                            [\n                              -2.166000000000054,\n                              0\n                            ],\n                            [\n                              -1.717999999999961,\n                              -0.9706999999999937\n                            ],\n                            [\n                              -0.9710000000000036,\n                              -1.717300000000009\n                            ],\n                            [\n                              0,\n                              -2.202699999999993\n                            ],\n                            [\n                              0,\n                              -6.533333333333331\n                            ],\n                            [\n                              2.090666666666721,\n                              0\n                            ],\n                            [\n                              0,\n                              5.954666666666668\n                            ],\n                            [\n                              0.59699999999998,\n                              1.045299999999997\n                            ],\n                            [\n                              1.007999999999925,\n                              0.5600000000000023\n                            ],\n                            [\n                              1.305999999999926,\n                              0\n                            ],\n                            [\n                              1.045000000000073,\n                              -0.5973000000000042\n                            ],\n                            [\n                              0.59699999999998,\n                              -1.082700000000003\n                            ],\n                            [\n                              0,\n                              -1.493300000000005\n                            ],\n                            [\n                              0,\n                              -5.954666666666668\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              0,\n                              -14.13066666666667\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              6.010666666666665\n                            ],\n                            [\n                              -0.3360000000000127,\n                              -0.2613333333333259\n                            ],\n                            [\n                              0.7459999999999809,\n                              -1.903999999999996\n                            ],\n                            [\n                              1.641999999999967,\n                              -1.0080000000000098\n                            ],\n                            [\n                              2.240000000000009,\n                              0\n                            ],\n                            [\n                              1.717000000000098,\n                              0.9707000000000079\n                            ],\n                            [\n                              0.9700000000000273,\n                              1.717299999999994\n                            ],\n                            [\n                              0,\n                              6.533333333333331\n                            ],\n                            [\n                              -2.090666666666721,\n                              0\n                            ],\n                            [\n                              0,\n                              -5.954666666666668\n                            ],\n                            [\n                              0,\n                              -1.5307000000000102\n                            ],\n                            [\n                              -0.5599999999999454,\n                              -1.082700000000003\n                            ],\n                            [\n                              -1.008000000000038,\n                              -0.5973000000000042\n                            ],\n                            [\n                              -1.270000000000095,\n                              0\n                            ],\n                            [\n                              -1.007999999999953,\n                              0.5600000000000023\n                            ],\n                            [\n                              -0.5600000000000023,\n                              1.082700000000003\n                            ],\n                            [\n                              0,\n                              5.954666666666668\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          -354.5325317382812,\n                          -77.50520324707031\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              237.089,\n                              42.72800000000001\n                            ],\n                            [\n                              229.697,\n                              40.040000000000006\n                            ],\n                            [\n                              227.065,\n                              32.48\n                            ],\n                            [\n                              227.065,\n                              17.808000000000007\n                            ],\n                            [\n                              221.745,\n                              17.808000000000007\n                            ],\n                            [\n                              221.745,\n                              12.096\n                            ],\n                            [\n                              222.585,\n                              12.096\n                            ],\n                            [\n                              225.889,\n                              10.864\n                            ],\n                            [\n                              227.065,\n                              7.504000000000005\n                            ],\n                            [\n                              227.065,\n                              5.152000000000001\n                            ],\n                            [\n                              233.393,\n                              5.152000000000001\n                            ],\n                            [\n                              233.393,\n                              12.096\n                            ],\n                            [\n                              240.281,\n                              12.096\n                            ],\n                            [\n                              240.281,\n                              17.808000000000007\n                            ],\n                            [\n                              233.393,\n                              17.808000000000007\n                            ],\n                            [\n                              233.393,\n                              32.2\n                            ],\n                            [\n                              233.897,\n                              34.888000000000005\n                            ],\n                            [\n                              235.521,\n                              36.568\n                            ],\n                            [\n                              238.433,\n                              37.128\n                            ],\n                            [\n                              239.441,\n                              37.072\n                            ],\n                            [\n                              240.505,\n                              36.96000000000001\n                            ],\n                            [\n                              240.505,\n                              42.392\n                            ],\n                            [\n                              238.769,\n                              42.616\n                            ],\n                            [\n                              237.089,\n                              42.72800000000001\n                            ],\n                            [\n                              237.089,\n                              42.72800000000001\n                            ],\n                            [\n                              237.089,\n                              42.72800000000001\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              1.755000000000052,\n                              1.792000000000002\n                            ],\n                            [\n                              0,\n                              3.248000000000005\n                            ],\n                            [\n                              0,\n                              4.890666666666661\n                            ],\n                            [\n                              1.773333333333369,\n                              0\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              -0.2800000000000296,\n                              0\n                            ],\n                            [\n                              -0.7839999999999918,\n                              0.8212999999999937\n                            ],\n                            [\n                              0,\n                              1.4187000000000012\n                            ],\n                            [\n                              0,\n                              0.7839999999999989\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              -2.314666666666668\n                            ],\n                            [\n                              -2.295999999999992,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.903999999999996\n                            ],\n                            [\n                              2.295999999999992,\n                              0\n                            ],\n                            [\n                              0,\n                              -4.797333333333327\n                            ],\n                            [\n                              -0.3360000000000127,\n                              -0.7467000000000041\n                            ],\n                            [\n                              -0.7459999999999809,\n                              -0.4106999999999914\n                            ],\n                            [\n                              -1.194000000000017,\n                              0\n                            ],\n                            [\n                              -0.3729999999999905,\n                              0.03730000000000189\n                            ],\n                            [\n                              -0.3360000000000127,\n                              0.03729999999998768\n                            ],\n                            [\n                              0,\n                              -1.810666666666663\n                            ],\n                            [\n                              0.6350000000000477,\n                              -0.07469999999999288\n                            ],\n                            [\n                              0.48599999999999,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -3.173000000000002,\n                              0\n                            ],\n                            [\n                              -1.753999999999962,\n                              -1.792000000000002\n                            ],\n                            [\n                              0,\n                              -4.890666666666661\n                            ],\n                            [\n                              -1.773333333333369,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.903999999999996\n                            ],\n                            [\n                              0.2800000000000296,\n                              0\n                            ],\n                            [\n                              1.418999999999983,\n                              0\n                            ],\n                            [\n                              0.7839999999999918,\n                              -0.8213000000000079\n                            ],\n                            [\n                              0,\n                              -0.7839999999999989\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              2.314666666666668\n                            ],\n                            [\n                              2.295999999999992,\n                              0\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              -2.295999999999992,\n                              0\n                            ],\n                            [\n                              0,\n                              4.797333333333327\n                            ],\n                            [\n                              0,\n                              1.045299999999997\n                            ],\n                            [\n                              0.3359999999999559,\n                              0.7092999999999989\n                            ],\n                            [\n                              0.7470000000000141,\n                              0.3733000000000004\n                            ],\n                            [\n                              0.2989999999999782,\n                              0\n                            ],\n                            [\n                              0.3740000000000236,\n                              -0.03730000000000189\n                            ],\n                            [\n                              0,\n                              1.810666666666663\n                            ],\n                            [\n                              -0.5220000000000482,\n                              0.0747000000000071\n                            ],\n                            [\n                              -0.6339999999999577,\n                              0.0747000000000071\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          -354.5325317382812,\n                          -77.50520324707031\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              210.259,\n                              7.951999999999998\n                            ],\n                            [\n                              210.259,\n                              0.6720000000000041\n                            ],\n                            [\n                              216.587,\n                              0.6720000000000041\n                            ],\n                            [\n                              216.587,\n                              7.951999999999998\n                            ],\n                            [\n                              210.259,\n                              7.951999999999998\n                            ],\n                            [\n                              210.259,\n                              7.951999999999998\n                            ],\n                            [\n                              210.259,\n                              7.951999999999998\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              2.426666666666662\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              -2.426666666666662\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              0,\n                              -2.426666666666662\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              2.426666666666662\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          -354.5325317382812,\n                          -77.50520324707031\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              210.259,\n                              42.392\n                            ],\n                            [\n                              210.259,\n                              12.096\n                            ],\n                            [\n                              216.587,\n                              12.096\n                            ],\n                            [\n                              216.587,\n                              42.392\n                            ],\n                            [\n                              210.259,\n                              42.392\n                            ],\n                            [\n                              210.259,\n                              42.392\n                            ],\n                            [\n                              210.259,\n                              42.392\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              10.09866666666667\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              -10.09866666666667\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              0,\n                              -10.09866666666666\n                            ],\n                            [\n                              2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              10.09866666666666\n                            ],\n                            [\n                              -2.109333333333325,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          -354.5325317382812,\n                          -77.50520324707031\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              169.688,\n                              42.392\n                            ],\n                            [\n                              159.272,\n                              12.096\n                            ],\n                            [\n                              165.992,\n                              12.096\n                            ],\n                            [\n                              173.944,\n                              36.232\n                            ],\n                            [\n                              171.592,\n                              36.232\n                            ],\n                            [\n                              179.712,\n                              12.096\n                            ],\n                            [\n                              185.48,\n                              12.096\n                            ],\n                            [\n                              193.544,\n                              36.232\n                            ],\n                            [\n                              191.192,\n                              36.232\n                            ],\n                            [\n                              199.2,\n                              12.096\n                            ],\n                            [\n                              205.92,\n                              12.096\n                            ],\n                            [\n                              195.448,\n                              42.392\n                            ],\n                            [\n                              189.736,\n                              42.392\n                            ],\n                            [\n                              181.56,\n                              17.696\n                            ],\n                            [\n                              183.632,\n                              17.696\n                            ],\n                            [\n                              175.456,\n                              42.392\n                            ],\n                            [\n                              169.688,\n                              42.392\n                            ],\n                            [\n                              169.688,\n                              42.392\n                            ],\n                            [\n                              169.688,\n                              42.392\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              3.47199999999998,\n                              10.09866666666667\n                            ],\n                            [\n                              -2.240000000000009,\n                              0\n                            ],\n                            [\n                              -2.650666666666666,\n                              -8.045333333333332\n                            ],\n                            [\n                              0.7839999999999918,\n                              0\n                            ],\n                            [\n                              -2.706666666666649,\n                              8.045333333333332\n                            ],\n                            [\n                              -1.922666666666657,\n                              0\n                            ],\n                            [\n                              -2.687999999999988,\n                              -8.045333333333332\n                            ],\n                            [\n                              0.7839999999999918,\n                              0\n                            ],\n                            [\n                              -2.669333333333327,\n                              8.045333333333332\n                            ],\n                            [\n                              -2.240000000000009,\n                              0\n                            ],\n                            [\n                              3.490666666666641,\n                              -10.09866666666667\n                            ],\n                            [\n                              1.903999999999996,\n                              0\n                            ],\n                            [\n                              2.725333333333367,\n                              8.232\n                            ],\n                            [\n                              -0.6906666666666865,\n                              0\n                            ],\n                            [\n                              2.72533333333331,\n                              -8.232\n                            ],\n                            [\n                              1.922666666666657,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -3.47199999999998,\n                              -10.09866666666666\n                            ],\n                            [\n                              2.240000000000009,\n                              0\n                            ],\n                            [\n                              2.650666666666666,\n                              8.045333333333332\n                            ],\n                            [\n                              -0.7839999999999918,\n                              0\n                            ],\n                            [\n                              2.706666666666649,\n                              -8.045333333333332\n                            ],\n                            [\n                              1.922666666666657,\n                              0\n                            ],\n                            [\n                              2.687999999999988,\n                              8.045333333333332\n                            ],\n                            [\n                              -0.7839999999999918,\n                              0\n                            ],\n                            [\n                              2.669333333333327,\n                              -8.045333333333332\n                            ],\n                            [\n                              2.240000000000009,\n                              0\n                            ],\n                            [\n                              -3.490666666666641,\n                              10.09866666666666\n                            ],\n                            [\n                              -1.903999999999996,\n                              0\n                            ],\n                            [\n                              -2.725333333333367,\n                              -8.232\n                            ],\n                            [\n                              0.6906666666666865,\n                              0\n                            ],\n                            [\n                              -2.72533333333331,\n                              8.232\n                            ],\n                            [\n                              -1.922666666666657,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          -354.5325317382812,\n                          -77.50520324707031\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      155.86146545410156,\n                      56.001014709472656\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      99.99999403953552,\n                      99.99999403953552\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            },\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              132.444,\n                              43.06400000000001\n                            ],\n                            [\n                              124.38,\n                              40.992\n                            ],\n                            [\n                              118.948,\n                              35.28\n                            ],\n                            [\n                              116.988,\n                              27.16\n                            ],\n                            [\n                              118.948,\n                              19.040000000000006\n                            ],\n                            [\n                              124.324,\n                              13.49600000000001\n                            ],\n                            [\n                              131.94,\n                              11.424000000000007\n                            ],\n                            [\n                              138.044,\n                              12.600000000000009\n                            ],\n                            [\n                              142.58,\n                              15.848\n                            ],\n                            [\n                              145.38,\n                              20.49600000000001\n                            ],\n                            [\n                              146.388,\n                              26.096\n                            ],\n                            [\n                              146.332,\n                              27.608\n                            ],\n                            [\n                              146.108,\n                              29.064000000000007\n                            ],\n                            [\n                              121.972,\n                              29.064000000000007\n                            ],\n                            [\n                              121.972,\n                              24.024\n                            ],\n                            [\n                              142.524,\n                              24.024\n                            ],\n                            [\n                              139.5,\n                              26.320000000000007\n                            ],\n                            [\n                              139.108,\n                              21.448000000000008\n                            ],\n                            [\n                              136.308,\n                              18.032\n                            ],\n                            [\n                              131.94,\n                              16.744\n                            ],\n                            [\n                              127.46,\n                              18.032\n                            ],\n                            [\n                              124.436,\n                              21.616\n                            ],\n                            [\n                              123.596,\n                              27.216000000000008\n                            ],\n                            [\n                              124.436,\n                              32.592\n                            ],\n                            [\n                              127.684,\n                              36.176\n                            ],\n                            [\n                              132.5,\n                              37.464\n                            ],\n                            [\n                              137.148,\n                              36.232\n                            ],\n                            [\n                              140.228,\n                              33.040000000000006\n                            ],\n                            [\n                              145.38,\n                              35.56\n                            ],\n                            [\n                              142.58,\n                              39.42400000000001\n                            ],\n                            [\n                              138.1,\n                              42.11200000000001\n                            ],\n                            [\n                              132.444,\n                              43.06400000000001\n                            ],\n                            [\n                              132.444,\n                              43.06400000000001\n                            ],\n                            [\n                              132.444,\n                              43.06400000000001\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              2.351999999999975,\n                              1.381299999999996\n                            ],\n                            [\n                              1.305999999999983,\n                              2.389300000000006\n                            ],\n                            [\n                              0,\n                              2.986699999999999\n                            ],\n                            [\n                              -1.307000000000016,\n                              2.35199999999999\n                            ],\n                            [\n                              -2.240000000000009,\n                              1.343999999999994\n                            ],\n                            [\n                              -2.838000000000022,\n                              0\n                            ],\n                            [\n                              -1.79200000000003,\n                              -0.784000000000006\n                            ],\n                            [\n                              -1.232000000000028,\n                              -1.381299999999996\n                            ],\n                            [\n                              -0.6350000000000477,\n                              -1.754700000000014\n                            ],\n                            [\n                              0,\n                              -1.978700000000003\n                            ],\n                            [\n                              0.03699999999997772,\n                              -0.5227000000000004\n                            ],\n                            [\n                              0.1120000000000232,\n                              -0.4480000000000075\n                            ],\n                            [\n                              8.045333333333303,\n                              0\n                            ],\n                            [\n                              0,\n                              1.680000000000007\n                            ],\n                            [\n                              -6.850666666666655,\n                              0\n                            ],\n                            [\n                              1.007999999999981,\n                              -0.7653333333333308\n                            ],\n                            [\n                              0.6340000000000146,\n                              1.4187000000000012\n                            ],\n                            [\n                              1.269000000000005,\n                              0.8213000000000079\n                            ],\n                            [\n                              1.67999999999995,\n                              0\n                            ],\n                            [\n                              1.305999999999983,\n                              -0.8586999999999989\n                            ],\n                            [\n                              0.7090000000000032,\n                              -1.567999999999998\n                            ],\n                            [\n                              -0.1499999999999773,\n                              -2.202700000000007\n                            ],\n                            [\n                              -0.7470000000000141,\n                              -1.530699999999996\n                            ],\n                            [\n                              -1.382000000000005,\n                              -0.8586999999999989\n                            ],\n                            [\n                              -1.791999999999973,\n                              0\n                            ],\n                            [\n                              -1.269999999999982,\n                              0.8213000000000079\n                            ],\n                            [\n                              -0.7469999999999573,\n                              1.306699999999992\n                            ],\n                            [\n                              -1.717333333333329,\n                              -0.8400000000000034\n                            ],\n                            [\n                              1.269000000000005,\n                              -1.157300000000006\n                            ],\n                            [\n                              1.754000000000019,\n                              -0.6720000000000113\n                            ],\n                            [\n                              2.052999999999997,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -3.024000000000001,\n                              0\n                            ],\n                            [\n                              -2.314999999999998,\n                              -1.4187000000000012\n                            ],\n                            [\n                              -1.307000000000016,\n                              -2.426699999999997\n                            ],\n                            [\n                              0,\n                              -3.061299999999989\n                            ],\n                            [\n                              1.343999999999994,\n                              -2.352000000000004\n                            ],\n                            [\n                              2.240000000000009,\n                              -1.3813000000000102\n                            ],\n                            [\n                              2.276999999999987,\n                              0\n                            ],\n                            [\n                              1.791999999999973,\n                              0.7839999999999918\n                            ],\n                            [\n                              1.231999999999971,\n                              1.344000000000008\n                            ],\n                            [\n                              0.6719999999999686,\n                              1.7547\n                            ],\n                            [\n                              0,\n                              0.4852999999999952\n                            ],\n                            [\n                              -0.03800000000001091,\n                              0.5227000000000004\n                            ],\n                            [\n                              -8.045333333333303,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.680000000000007\n                            ],\n                            [\n                              6.850666666666655,\n                              0\n                            ],\n                            [\n                              -1.007999999999981,\n                              0.7653333333333308\n                            ],\n                            [\n                              0.3730000000000473,\n                              -1.829300000000003\n                            ],\n                            [\n                              -0.5979999999999563,\n                              -1.456000000000003\n                            ],\n                            [\n                              -1.232000000000028,\n                              -0.8586999999999989\n                            ],\n                            [\n                              -1.680000000000007,\n                              0\n                            ],\n                            [\n                              -1.307000000000016,\n                              0.8213000000000079\n                            ],\n                            [\n                              -0.7100000000000364,\n                              1.530699999999996\n                            ],\n                            [\n                              -0.186999999999955,\n                              2.053299999999993\n                            ],\n                            [\n                              0.7839999999999918,\n                              1.53070000000001\n                            ],\n                            [\n                              1.418000000000006,\n                              0.8586999999999989\n                            ],\n                            [\n                              1.829000000000008,\n                              0\n                            ],\n                            [\n                              1.305999999999983,\n                              -0.8212999999999937\n                            ],\n                            [\n                              1.717333333333329,\n                              0.8400000000000034\n                            ],\n                            [\n                              -0.5980000000000132,\n                              1.4187000000000012\n                            ],\n                            [\n                              -1.232000000000028,\n                              1.11999999999999\n                            ],\n                            [\n                              -1.718000000000018,\n                              0.6346999999999952\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          -211.7300415039062,\n                          -77.67320251464844\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              95.32,\n                              37.184\n                            ],\n                            [\n                              100.024,\n                              35.896\n                            ],\n                            [\n                              103.328,\n                              32.36800000000001\n                            ],\n                            [\n                              104.56,\n                              27.216000000000008\n                            ],\n                            [\n                              103.328,\n                              22.12\n                            ],\n                            [\n                              100.024,\n                              18.592\n                            ],\n                            [\n                              95.32,\n                              17.304\n                            ],\n                            [\n                              90.56,\n                              18.592\n                            ],\n                            [\n                              87.256,\n                              22.12\n                            ],\n                            [\n                              86.08000000000001,\n                              27.216000000000008\n                            ],\n                            [\n                              87.256,\n                              32.36800000000001\n                            ],\n                            [\n                              90.50399999999999,\n                              35.896\n                            ],\n                            [\n                              95.32,\n                              37.184\n                            ],\n                            [\n                              95.32,\n                              37.184\n                            ],\n                            [\n                              95.32,\n                              37.184\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              -1.381,\n                              0.8586999999999989\n                            ],\n                            [\n                              -0.7839999999999918,\n                              1.493299999999991\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              0.820999999999998,\n                              1.493299999999991\n                            ],\n                            [\n                              1.419000000000011,\n                              0.8586999999999989\n                            ],\n                            [\n                              1.754999999999995,\n                              0\n                            ],\n                            [\n                              1.418999999999983,\n                              -0.8586999999999989\n                            ],\n                            [\n                              0.7839999999999918,\n                              -1.493300000000005\n                            ],\n                            [\n                              0,\n                              -1.904000000000011\n                            ],\n                            [\n                              -0.7839999999999918,\n                              -1.5307000000000102\n                            ],\n                            [\n                              -1.381,\n                              -0.8586999999999989\n                            ],\n                            [\n                              -1.792000000000002,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              1.754999999999995,\n                              0\n                            ],\n                            [\n                              1.419000000000011,\n                              -0.8586999999999989\n                            ],\n                            [\n                              0.820999999999998,\n                              -1.5307000000000102\n                            ],\n                            [\n                              0,\n                              -1.904000000000011\n                            ],\n                            [\n                              -0.7839999999999918,\n                              -1.493300000000005\n                            ],\n                            [\n                              -1.381,\n                              -0.8586999999999989\n                            ],\n                            [\n                              -1.754999999999995,\n                              0\n                            ],\n                            [\n                              -1.419000000000011,\n                              0.8586999999999989\n                            ],\n                            [\n                              -0.7839999999999918,\n                              1.493299999999991\n                            ],\n                            [\n                              0,\n                              1.903999999999996\n                            ],\n                            [\n                              0.7839999999999918,\n                              1.493299999999991\n                            ],\n                            [\n                              1.419000000000011,\n                              0.8586999999999989\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          -211.7300415039062,\n                          -77.67320251464844\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              94.70400000000001,\n                              43.06400000000001\n                            ],\n                            [\n                              86.864,\n                              40.992\n                            ],\n                            [\n                              81.43199999999999,\n                              35.28\n                            ],\n                            [\n                              79.47200000000001,\n                              27.216000000000008\n                            ],\n                            [\n                              81.488,\n                              19.152\n                            ],\n                            [\n                              86.91999999999999,\n                              13.49600000000001\n                            ],\n                            [\n                              94.648,\n                              11.424000000000007\n                            ],\n                            [\n                              101.088,\n                              12.88\n                            ],\n                            [\n                              105.512,\n                              16.912000000000006\n                            ],\n                            [\n                              104.56,\n                              18.36800000000001\n                            ],\n                            [\n                              104.56,\n                              0\n                            ],\n                            [\n                              110.832,\n                              0\n                            ],\n                            [\n                              110.832,\n                              42.392\n                            ],\n                            [\n                              104.84,\n                              42.392\n                            ],\n                            [\n                              104.84,\n                              36.232\n                            ],\n                            [\n                              105.568,\n                              37.408\n                            ],\n                            [\n                              101.088,\n                              41.608\n                            ],\n                            [\n                              94.70400000000001,\n                              43.06400000000001\n                            ],\n                            [\n                              94.70400000000001,\n                              43.06400000000001\n                            ],\n                            [\n                              94.70400000000001,\n                              43.06400000000001\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              2.314999999999998,\n                              1.381299999999996\n                            ],\n                            [\n                              1.344000000000023,\n                              2.389300000000006\n                            ],\n                            [\n                              0,\n                              2.986699999999999\n                            ],\n                            [\n                              -1.343999999999994,\n                              2.389300000000006\n                            ],\n                            [\n                              -2.276999999999987,\n                              1.381299999999996\n                            ],\n                            [\n                              -2.875,\n                              0\n                            ],\n                            [\n                              -1.8669999999999902,\n                              -0.9706999999999937\n                            ],\n                            [\n                              -1.082999999999998,\n                              -1.717300000000009\n                            ],\n                            [\n                              0.3173333333333233,\n                              -0.4853333333333296\n                            ],\n                            [\n                              0,\n                              6.122666666666674\n                            ],\n                            [\n                              -2.090666666666664,\n                              0\n                            ],\n                            [\n                              0,\n                              -14.13066666666667\n                            ],\n                            [\n                              1.99733333333333,\n                              0\n                            ],\n                            [\n                              0,\n                              2.053333333333327\n                            ],\n                            [\n                              -0.242666666666679,\n                              -0.3919999999999959\n                            ],\n                            [\n                              1.941000000000003,\n                              -0.9707000000000079\n                            ],\n                            [\n                              2.314999999999998,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -2.912000000000006,\n                              0\n                            ],\n                            [\n                              -2.277000000000015,\n                              -1.4187000000000012\n                            ],\n                            [\n                              -1.306999999999988,\n                              -2.389300000000006\n                            ],\n                            [\n                              0,\n                              -2.986699999999999\n                            ],\n                            [\n                              1.343999999999994,\n                              -2.389300000000006\n                            ],\n                            [\n                              2.277000000000015,\n                              -1.3813000000000102\n                            ],\n                            [\n                              2.426999999999992,\n                              0\n                            ],\n                            [\n                              1.867000000000019,\n                              0.9707000000000079\n                            ],\n                            [\n                              -0.3173333333333233,\n                              0.4853333333333296\n                            ],\n                            [\n                              0,\n                              -6.122666666666674\n                            ],\n                            [\n                              2.090666666666664,\n                              0\n                            ],\n                            [\n                              0,\n                              14.13066666666667\n                            ],\n                            [\n                              -1.99733333333333,\n                              0\n                            ],\n                            [\n                              0,\n                              -2.053333333333327\n                            ],\n                            [\n                              0.242666666666679,\n                              0.3919999999999959\n                            ],\n                            [\n                              -1.045000000000016,\n                              1.829300000000003\n                            ],\n                            [\n                              -1.941000000000003,\n                              0.9706999999999937\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          -211.7300415039062,\n                          -77.67320251464844\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              57.40100000000001,\n                              43.06400000000001\n                            ],\n                            [\n                              51.968999999999994,\n                              42\n                            ],\n                            [\n                              48.38499999999999,\n                              38.976\n                            ],\n                            [\n                              47.09700000000001,\n                              34.384\n                            ],\n                            [\n                              48.161,\n                              29.960000000000008\n                            ],\n                            [\n                              51.577,\n                              26.656000000000006\n                            ],\n                            [\n                              57.345,\n                              24.752\n                            ],\n                            [\n                              67.87299999999999,\n                              23.016000000000005\n                            ],\n                            [\n                              67.87299999999999,\n                              28\n                            ],\n                            [\n                              58.577,\n                              29.624\n                            ],\n                            [\n                              54.881,\n                              31.248\n                            ],\n                            [\n                              53.70500000000001,\n                              34.16\n                            ],\n                            [\n                              54.992999999999995,\n                              37.016000000000005\n                            ],\n                            [\n                              58.40899999999999,\n                              38.08\n                            ],\n                            [\n                              62.88900000000001,\n                              36.96000000000001\n                            ],\n                            [\n                              65.91300000000001,\n                              33.992\n                            ],\n                            [\n                              66.977,\n                              29.792\n                            ],\n                            [\n                              66.977,\n                              22.008\n                            ],\n                            [\n                              65.297,\n                              18.36800000000001\n                            ],\n                            [\n                              60.929,\n                              16.912000000000006\n                            ],\n                            [\n                              56.505,\n                              18.256\n                            ],\n                            [\n                              53.761,\n                              21.616\n                            ],\n                            [\n                              48.496999999999986,\n                              18.98400000000001\n                            ],\n                            [\n                              51.240999999999985,\n                              15.064000000000007\n                            ],\n                            [\n                              55.66499999999999,\n                              12.376\n                            ],\n                            [\n                              61.09700000000001,\n                              11.424000000000007\n                            ],\n                            [\n                              67.42500000000001,\n                              12.768\n                            ],\n                            [\n                              71.737,\n                              16.52\n                            ],\n                            [\n                              73.305,\n                              22.008\n                            ],\n                            [\n                              73.305,\n                              42.392\n                            ],\n                            [\n                              67.257,\n                              42.392\n                            ],\n                            [\n                              67.257,\n                              36.904\n                            ],\n                            [\n                              68.54499999999999,\n                              37.072\n                            ],\n                            [\n                              65.80099999999999,\n                              40.264\n                            ],\n                            [\n                              62.04900000000001,\n                              42.336\n                            ],\n                            [\n                              57.40100000000001,\n                              43.06400000000001\n                            ],\n                            [\n                              57.40100000000001,\n                              43.06400000000001\n                            ],\n                            [\n                              57.40100000000001,\n                              43.06400000000001\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              1.568000000000012,\n                              0.7092999999999989\n                            ],\n                            [\n                              0.8590000000000089,\n                              1.2693000000000012\n                            ],\n                            [\n                              0,\n                              1.7547\n                            ],\n                            [\n                              -0.7090000000000032,\n                              1.306699999999992\n                            ],\n                            [\n                              -1.531000000000006,\n                              0.8960000000000008\n                            ],\n                            [\n                              -2.314999999999998,\n                              0.3733000000000004\n                            ],\n                            [\n                              -3.509333333333331,\n                              0.5786666666666633\n                            ],\n                            [\n                              0,\n                              -1.661333333333332\n                            ],\n                            [\n                              3.098666666666674,\n                              -0.541333333333327\n                            ],\n                            [\n                              0.7839999999999918,\n                              -0.784000000000006\n                            ],\n                            [\n                              0,\n                              -1.194699999999997\n                            ],\n                            [\n                              -0.8590000000000089,\n                              -0.7467000000000041\n                            ],\n                            [\n                              -1.381,\n                              0\n                            ],\n                            [\n                              -1.269000000000005,\n                              0.7466999999999899\n                            ],\n                            [\n                              -0.7090000000000032,\n                              1.2319999999999993\n                            ],\n                            [\n                              0,\n                              1.530699999999996\n                            ],\n                            [\n                              0,\n                              2.594666666666669\n                            ],\n                            [\n                              1.120000000000005,\n                              0.9332999999999885\n                            ],\n                            [\n                              1.829000000000008,\n                              0\n                            ],\n                            [\n                              1.269000000000005,\n                              -0.8960000000000008\n                            ],\n                            [\n                              0.5970000000000084,\n                              -1.381299999999996\n                            ],\n                            [\n                              1.754666666666679,\n                              0.8773333333333255\n                            ],\n                            [\n                              -1.268999999999977,\n                              1.11999999999999\n                            ],\n                            [\n                              -1.680000000000007,\n                              0.6346999999999952\n                            ],\n                            [\n                              -1.903999999999996,\n                              0\n                            ],\n                            [\n                              -1.829000000000008,\n                              -0.8960000000000008\n                            ],\n                            [\n                              -1.0080000000000098,\n                              -1.6053\n                            ],\n                            [\n                              0,\n                              -2.090699999999998\n                            ],\n                            [\n                              0,\n                              -6.794666666666672\n                            ],\n                            [\n                              2.015999999999991,\n                              0\n                            ],\n                            [\n                              0,\n                              1.829333333333338\n                            ],\n                            [\n                              -0.429333333333318,\n                              -0.05599999999999739\n                            ],\n                            [\n                              1.120000000000005,\n                              -0.8959999999999866\n                            ],\n                            [\n                              1.418999999999983,\n                              -0.4852999999999952\n                            ],\n                            [\n                              1.716999999999985,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              -2.053000000000026,\n                              0\n                            ],\n                            [\n                              -1.531000000000006,\n                              -0.7467000000000041\n                            ],\n                            [\n                              -0.8589999999999804,\n                              -1.306699999999992\n                            ],\n                            [\n                              0,\n                              -1.642700000000005\n                            ],\n                            [\n                              0.7469999999999857,\n                              -1.306700000000006\n                            ],\n                            [\n                              1.531000000000006,\n                              -0.8960000000000008\n                            ],\n                            [\n                              3.509333333333331,\n                              -0.5786666666666633\n                            ],\n                            [\n                              0,\n                              1.661333333333332\n                            ],\n                            [\n                              -3.098666666666674,\n                              0.541333333333327\n                            ],\n                            [\n                              -1.680000000000007,\n                              0.2987000000000108\n                            ],\n                            [\n                              -0.7839999999999918,\n                              0.7467000000000041\n                            ],\n                            [\n                              0,\n                              1.157300000000006\n                            ],\n                            [\n                              0.896000000000015,\n                              0.7092999999999989\n                            ],\n                            [\n                              1.717000000000013,\n                              0\n                            ],\n                            [\n                              1.306999999999988,\n                              -0.7467000000000041\n                            ],\n                            [\n                              0.7089999999999748,\n                              -1.2693000000000012\n                            ],\n                            [\n                              0,\n                              -2.594666666666669\n                            ],\n                            [\n                              0,\n                              -1.493299999999991\n                            ],\n                            [\n                              -1.082999999999998,\n                              -0.9707000000000079\n                            ],\n                            [\n                              -1.680000000000007,\n                              0\n                            ],\n                            [\n                              -1.2319999999999993,\n                              0.8586999999999989\n                            ],\n                            [\n                              -1.754666666666679,\n                              -0.8773333333333255\n                            ],\n                            [\n                              0.5600000000000023,\n                              -1.493300000000005\n                            ],\n                            [\n                              1.269000000000005,\n                              -1.157300000000006\n                            ],\n                            [\n                              1.717000000000013,\n                              -0.6347000000000094\n                            ],\n                            [\n                              2.388999999999982,\n                              0\n                            ],\n                            [\n                              1.86699999999999,\n                              0.8960000000000008\n                            ],\n                            [\n                              1.045000000000016,\n                              1.568000000000012\n                            ],\n                            [\n                              0,\n                              6.794666666666672\n                            ],\n                            [\n                              -2.015999999999991,\n                              0\n                            ],\n                            [\n                              0,\n                              -1.829333333333338\n                            ],\n                            [\n                              0.429333333333318,\n                              0.05599999999999739\n                            ],\n                            [\n                              -0.7089999999999748,\n                              1.2319999999999993\n                            ],\n                            [\n                              -1.082999999999998,\n                              0.8960000000000008\n                            ],\n                            [\n                              -1.381,\n                              0.4853000000000094\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          -211.7300415039062,\n                          -77.67320251464844\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"gr\",\n                  \"it\": [\n                    {\n                      \"ty\": \"sh\",\n                      \"d\": 1,\n                      \"ks\": {\n                        \"a\": 0,\n                        \"k\": {\n                          \"c\": true,\n                          \"v\": [\n                            [\n                              0,\n                              42.392\n                            ],\n                            [\n                              0,\n                              0.6720000000000041\n                            ],\n                            [\n                              6.159999999999997,\n                              0.6720000000000041\n                            ],\n                            [\n                              21.84,\n                              22.400000000000006\n                            ],\n                            [\n                              18.75999999999999,\n                              22.400000000000006\n                            ],\n                            [\n                              34.16,\n                              0.6720000000000041\n                            ],\n                            [\n                              40.31999999999999,\n                              0.6720000000000041\n                            ],\n                            [\n                              40.31999999999999,\n                              42.392\n                            ],\n                            [\n                              33.768,\n                              42.392\n                            ],\n                            [\n                              33.768,\n                              8.456000000000003\n                            ],\n                            [\n                              36.232,\n                              9.128\n                            ],\n                            [\n                              20.49600000000001,\n                              30.632000000000005\n                            ],\n                            [\n                              19.824000000000012,\n                              30.632000000000005\n                            ],\n                            [\n                              4.424000000000007,\n                              9.128\n                            ],\n                            [\n                              6.608000000000004,\n                              8.456000000000003\n                            ],\n                            [\n                              6.608000000000004,\n                              42.392\n                            ],\n                            [\n                              0,\n                              42.392\n                            ],\n                            [\n                              0,\n                              42.392\n                            ],\n                            [\n                              0,\n                              42.392\n                            ]\n                          ],\n                          \"i\": [\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              13.90666666666666\n                            ],\n                            [\n                              -2.053333333333342,\n                              0\n                            ],\n                            [\n                              -5.226666666666659,\n                              -7.242666666666665\n                            ],\n                            [\n                              1.026666666666671,\n                              0\n                            ],\n                            [\n                              -5.133333333333326,\n                              7.242666666666672\n                            ],\n                            [\n                              -2.053333333333342,\n                              0\n                            ],\n                            [\n                              0,\n                              -13.90666666666667\n                            ],\n                            [\n                              2.183999999999997,\n                              0\n                            ],\n                            [\n                              0,\n                              11.312\n                            ],\n                            [\n                              -0.8213333333333424,\n                              -0.2240000000000038\n                            ],\n                            [\n                              5.245333333333321,\n                              -7.168000000000006\n                            ],\n                            [\n                              0.2239999999999895,\n                              0\n                            ],\n                            [\n                              5.133333333333326,\n                              7.168000000000006\n                            ],\n                            [\n                              -0.7280000000000086,\n                              0.2240000000000038\n                            ],\n                            [\n                              0,\n                              -11.312\n                            ],\n                            [\n                              2.202666666666659,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ],\n                          \"o\": [\n                            [\n                              0,\n                              -13.90666666666667\n                            ],\n                            [\n                              2.053333333333342,\n                              0\n                            ],\n                            [\n                              5.226666666666659,\n                              7.242666666666672\n                            ],\n                            [\n                              -1.026666666666671,\n                              0\n                            ],\n                            [\n                              5.133333333333326,\n                              -7.242666666666665\n                            ],\n                            [\n                              2.053333333333342,\n                              0\n                            ],\n                            [\n                              0,\n                              13.90666666666666\n                            ],\n                            [\n                              -2.183999999999997,\n                              0\n                            ],\n                            [\n                              0,\n                              -11.312\n                            ],\n                            [\n                              0.8213333333333424,\n                              0.2240000000000038\n                            ],\n                            [\n                              -5.245333333333321,\n                              7.168000000000006\n                            ],\n                            [\n                              -0.2239999999999895,\n                              0\n                            ],\n                            [\n                              -5.133333333333326,\n                              -7.168000000000006\n                            ],\n                            [\n                              0.7280000000000086,\n                              -0.2240000000000038\n                            ],\n                            [\n                              0,\n                              11.312\n                            ],\n                            [\n                              -2.202666666666659,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ],\n                            [\n                              0,\n                              0\n                            ]\n                          ]\n                        }\n                      }\n                    },\n                    {\n                      \"ty\": \"tm\",\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"e\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"m\": 1\n                    },\n                    {\n                      \"ty\": \"tr\",\n                      \"p\": {\n                        \"a\": 0,\n                        \"k\": [\n                          -211.7300415039062,\n                          -77.67320251464844\n                        ],\n                        \"ix\": 2\n                      },\n                      \"a\": {\n                        \"a\": 0,\n                        \"k\": [\n                          0,\n                          0\n                        ],\n                        \"ix\": 2\n                      },\n                      \"s\": {\n                        \"a\": 0,\n                        \"k\": [\n                          100,\n                          100\n                        ],\n                        \"ix\": 2\n                      },\n                      \"r\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"o\": {\n                        \"a\": 0,\n                        \"k\": 100,\n                        \"ix\": 2\n                      },\n                      \"sk\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      },\n                      \"sa\": {\n                        \"a\": 0,\n                        \"k\": 0,\n                        \"ix\": 2\n                      }\n                    }\n                  ]\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      1,\n                      1,\n                      1\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      2.91259765625,\n                      56.001014709472656\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      99.99999403953552,\n                      99.99999403953552\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            },\n            {\n              \"ty\": \"gr\",\n              \"it\": [\n                {\n                  \"ty\": \"rc\",\n                  \"d\": 1,\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      702.6863719370097,\n                      144\n                    ],\n                    \"ix\": 2\n                  },\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 72,\n                    \"ix\": 2\n                  }\n                },\n                {\n                  \"ty\": \"fl\",\n                  \"c\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"r\": 1,\n                  \"bm\": 0\n                },\n                {\n                  \"ty\": \"tm\",\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"e\": {\n                    \"a\": 0,\n                    \"k\": 100,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"m\": 1\n                },\n                {\n                  \"ty\": \"tr\",\n                  \"p\": {\n                    \"a\": 0,\n                    \"k\": [\n                      56.54167175292969,\n                      -0.000022762338630855083\n                    ],\n                    \"ix\": 2\n                  },\n                  \"a\": {\n                    \"a\": 0,\n                    \"k\": [\n                      0,\n                      0\n                    ],\n                    \"ix\": 2\n                  },\n                  \"s\": {\n                    \"a\": 0,\n                    \"k\": [\n                      99.99999403953552,\n                      99.99999403953552\n                    ],\n                    \"ix\": 2\n                  },\n                  \"r\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"o\": {\n                    \"a\": 0,\n                    \"k\": 80,\n                    \"ix\": 2\n                  },\n                  \"sk\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  },\n                  \"sa\": {\n                    \"a\": 0,\n                    \"k\": 0,\n                    \"ix\": 2\n                  }\n                }\n              ]\n            },\n            {\n              \"ty\": \"tr\",\n              \"p\": {\n                \"a\": 0,\n                \"k\": [\n                  122.0000003294881,\n                  25.00000012138912\n                ],\n                \"ix\": 2\n              },\n              \"a\": {\n                \"a\": 0,\n                \"k\": [\n                  56.54167175292969,\n                  -0.00002288818359375\n                ],\n                \"ix\": 2\n              },\n              \"s\": {\n                \"a\": 0,\n                \"k\": [\n                  34.403572049765366,\n                  34.403572049765366\n                ],\n                \"ix\": 2\n              },\n              \"r\": {\n                \"a\": 0,\n                \"k\": 0,\n                \"ix\": 2\n              },\n              \"o\": {\n                \"a\": 0,\n                \"k\": 100,\n                \"ix\": 2\n              },\n              \"sk\": {\n                \"a\": 0,\n                \"k\": 0,\n                \"ix\": 2\n              },\n              \"sa\": {\n                \"a\": 0,\n                \"k\": 0,\n                \"ix\": 2\n              }\n            }\n          ]\n        }\n      ],\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 83,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            145.48500061035156,\n            146.33499145507812\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            95,\n            93\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            100,\n            100\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"0\",\n      \"w\": 190,\n      \"h\": 186,\n      \"ind\": 84,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            95,\n            93\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            95,\n            93\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                50,\n                50\n              ],\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  0\n                ]\n              }\n            },\n            {\n              \"t\": 55,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                0\n              ],\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  0\n                ]\n              }\n            },\n            {\n              \"t\": 55,\n              \"s\": [\n                100\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 83\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 85,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            58.316001892089844,\n            79.31600189208984\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.31599998474121,\n            19.31599998474121\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            100.00000116575909,\n            100.00000116575907\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 10.790000113374926,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"2\",\n      \"w\": 39,\n      \"h\": 39,\n      \"ind\": 86,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                1,\n                1\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 79,\n              \"s\": [\n                1,\n                1\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 117,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                -45\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 79,\n              \"s\": [\n                -45\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 117,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                0\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 85\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 87,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            268.1695861816406,\n            229.5001678466797\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            31.575000286102295,\n            34.45449924468994\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            99.99999997424318,\n            99.99999997424318\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 123.08999825645346,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"4\",\n      \"w\": 90,\n      \"h\": 92,\n      \"ind\": 88,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            31.15,\n            35.909\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            44.15,\n            48.909\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                50,\n                50\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 161,\n              \"s\": [\n                50,\n                50\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 211,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 161,\n              \"s\": [\n                0\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 211,\n              \"s\": [\n                100\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 87\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 89,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            194.92755126953125,\n            52.66899490356445\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            31.825000286102295,\n            35.45449924468994\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            100.00000024333974,\n            100.00000024333974\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 16.80000035671566,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"12\",\n      \"w\": 83,\n      \"h\": 88,\n      \"ind\": 90,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            31.15,\n            35.909\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            40.15,\n            44.909\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                50,\n                50\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 117,\n              \"s\": [\n                50,\n                50\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 167,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 117,\n              \"s\": [\n                0\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 167,\n              \"s\": [\n                100\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 89\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 91,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            29.315000534057617,\n            142.31500244140625\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.315000534057617,\n            19.315000534057617\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            100.00000266711488,\n            100.00000266711491\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 9.969999687139088,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"20\",\n      \"w\": 39,\n      \"h\": 39,\n      \"ind\": 92,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            19.315,\n            19.315\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.315,\n            19.315\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                1,\n                1\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 64,\n              \"s\": [\n                1,\n                1\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 102,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                -45\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 64,\n              \"s\": [\n                -45\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 102,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                0\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 91\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 93,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            73.31600189208984,\n            29.31599998474121\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.31599998474121,\n            19.31599998474121\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            99.99999809893677,\n            99.99999809893679\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 8.22000011631331,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"22\",\n      \"w\": 39,\n      \"h\": 39,\n      \"ind\": 94,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                1,\n                1\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 91,\n              \"s\": [\n                1,\n                1\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 129,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                -45\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 91,\n              \"s\": [\n                -45\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 129,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                0\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 93\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 95,\n      \"ty\": 3,\n      \"nm\": \"Group 1\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            127.947998046875,\n            220.1580047607422\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.31599998474121,\n            19.31599998474121\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            99.99999797104884,\n            99.99999797104884\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": -10.250000042866644,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"25\",\n      \"w\": 38.6317,\n      \"h\": 38.6317,\n      \"ind\": 96,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                1,\n                1\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 48,\n              \"s\": [\n                1,\n                1\n              ],\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              }\n            },\n            {\n              \"t\": 86,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"h\": 1\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                -45\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 48,\n              \"s\": [\n                -45\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 86,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            }\n          ],\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 95\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 97,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            155.48500061035156,\n            263.6180114746094\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.31599998474121,\n            19.31599998474121\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            100,\n            100\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"27\",\n      \"w\": 39,\n      \"h\": 39,\n      \"ind\": 98,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                1,\n                1\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 38,\n              \"s\": [\n                1,\n                1\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 76,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                -45\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 38,\n              \"s\": [\n                -45\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 76,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                0\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 97\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 99,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            213.13099670410156,\n            259.9649963378906\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.31599998474121,\n            19.31599998474121\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            100.0000004551171,\n            100.00000045511712\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 6.83999986588411,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"30\",\n      \"w\": 39,\n      \"h\": 39,\n      \"ind\": 100,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                1,\n                1\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 26,\n              \"s\": [\n                1,\n                1\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 64,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                -45\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 26,\n              \"s\": [\n                -45\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 64,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                0\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 99\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 101,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            265.67999267578125,\n            168.156005859375\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.31599998474121,\n            19.31599998474121\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            99.99999885890291,\n            99.99999885890293\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": -13.500000003802489,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"32\",\n      \"w\": 39,\n      \"h\": 39,\n      \"ind\": 102,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                1,\n                1\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 17,\n              \"s\": [\n                1,\n                1\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 55,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                -45\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 17,\n              \"s\": [\n                -45\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 55,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                0\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 101\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 103,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            50.02820587158203,\n            217.27655029296875\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            30.825000286102295,\n            33.70449924468994\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            99.99999953474834,\n            99.99999953474834\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": -132.19999831142374,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"36\",\n      \"w\": 91,\n      \"h\": 91,\n      \"ind\": 104,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            31.15,\n            35.909\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            46.15,\n            49.909\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                50,\n                50\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 136,\n              \"s\": [\n                50,\n                50\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 186,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 136,\n              \"s\": [\n                0\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 186,\n              \"s\": [\n                100\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 103\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 105,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            245.0240020751953,\n            79.51000213623047\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.31599998474121,\n            19.31599998474121\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            99.99999789196237,\n            99.99999789196237\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 14.480000876980029,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"44\",\n      \"w\": 39,\n      \"h\": 39,\n      \"ind\": 106,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                1,\n                1\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 38,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                -45\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 38,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                0\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 105\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 107,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            266.593994140625,\n            120.45700073242188\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.31599998474121,\n            19.31599998474121\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            99.9999982762619,\n            99.99999827626189\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": 7.150000132583977,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"48\",\n      \"w\": 39,\n      \"h\": 39,\n      \"ind\": 108,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                1,\n                1\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 8,\n              \"s\": [\n                1,\n                1\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 45,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                -45\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 8,\n              \"s\": [\n                -45\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 45,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                0\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 107\n    },\n    {\n      \"ddd\": 0,\n      \"ind\": 109,\n      \"ty\": 3,\n      \"nm\": \"Group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            130.57200622558594,\n            28.25\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.31599998474121,\n            19.31599998474121\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 0,\n          \"k\": [\n            99.99999872617904,\n            99.99999872617906\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 0,\n          \"k\": -8.0700003209305,\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0\n    },\n    {\n      \"ddd\": 0,\n      \"refId\": \"50\",\n      \"w\": 39,\n      \"h\": 39,\n      \"ind\": 110,\n      \"ty\": 0,\n      \"nm\": \"Clipped group\",\n      \"sr\": 1,\n      \"ks\": {\n        \"p\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"a\": {\n          \"a\": 0,\n          \"k\": [\n            19.316,\n            19.316\n          ],\n          \"ix\": 2\n        },\n        \"s\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                1,\n                1\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 104,\n              \"s\": [\n                1,\n                1\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 142,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                100,\n                100\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"r\": {\n          \"a\": 1,\n          \"k\": [\n            {\n              \"t\": 0,\n              \"s\": [\n                -45\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 104,\n              \"s\": [\n                -45\n              ],\n              \"o\": {\n                \"x\": [\n                  0.5\n                ],\n                \"y\": [\n                  0\n                ]\n              },\n              \"i\": {\n                \"x\": [\n                  0\n                ],\n                \"y\": [\n                  1\n                ]\n              }\n            },\n            {\n              \"t\": 142,\n              \"s\": [\n                0\n              ],\n              \"h\": 1\n            },\n            {\n              \"t\": 400,\n              \"s\": [\n                0\n              ],\n              \"i\": {\n                \"x\": [\n                  0.75\n                ],\n                \"y\": [\n                  0.75\n                ]\n              },\n              \"o\": {\n                \"x\": [\n                  0.25\n                ],\n                \"y\": [\n                  0.25\n                ]\n              }\n            }\n          ],\n          \"ix\": 2\n        },\n        \"o\": {\n          \"a\": 0,\n          \"k\": 100,\n          \"ix\": 2\n        },\n        \"sk\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        },\n        \"sa\": {\n          \"a\": 0,\n          \"k\": 0,\n          \"ix\": 2\n        }\n      },\n      \"ao\": 0,\n      \"ip\": 0,\n      \"op\": 401,\n      \"st\": 0,\n      \"bm\": 0,\n      \"parent\": 109\n    }\n  ],\n  \"markers\": []\n}"
  },
  {
    "path": "assets/lotties/qr-code.json",
    "content": "{\"assets\":[{\"h\":96,\"id\":\"0\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":129,\"e\":1},{\"h\":112,\"id\":\"1\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":99,\"e\":1},{\"id\":\"20\",\"layers\":[{\"ind\":19,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[16.5,15]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[33,30]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0.21,1.3]],\"o\":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[1.3,-0.21],[0,0]],\"v\":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[12.96,10.61]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[4.24,-0.68],[-0.69,-4.24],[-4.25,0.68],[-1.09,1.04],[0,0],[-0.47,0.65],[0.65,0.47],[0,0],[0.26,1.6]],\"o\":[[-0.69,-4.24],[-4.24,0.69],[0.68,4.25],[1.6,-0.26],[0,0],[0.65,0.47],[0.47,-0.66],[0,0],[0.64,-1.37],[0,0]],\"v\":[[18.29,9.75],[9.36,3.31],[2.92,12.23],[11.85,18.68],[15.95,16.65],[19.79,19.43],[21.83,19.1],[21.5,17.06],[17.66,14.29],[18.29,9.75]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0,0],[0.43,2.65],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0,0],[0.21,1.3]],\"o\":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[0,0],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0.43,2.65],[0,0],[1.3,-0.21],[0,0]],\"v\":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[11.38,15.8],[5.8,11.77],[9.83,6.19],[15.41,10.22],[11.38,15.8],[10.98,13.35],[12.96,10.61]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.27,-1.15],[0,0],[1.27,-1.76],[1.76,1.27],[0,0],[1.22,-0.25],[0,0],[1.02,5.45],[0,0],[-5.59,0.9],[0,0],[-0.89,-5.5]],\"o\":[[0.15,1.23],[0,0],[1.76,1.27],[-1.27,1.76],[0,0],[-1.01,0.62],[0,0],[-5.51,0.89],[0,0],[-0.9,-5.59],[0,0],[5.5,-0.75],[0,0]],\"v\":[[20.79,9.75],[20.59,13.35],[22.95,15.05],[23.84,20.54],[18.34,21.43],[15.98,19.73],[12.63,21.05],[12.24,21.12],[0.52,12.89],[0.48,12.63],[8.97,0.87],[9.23,0.83],[20.73,9.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"25\",\"layers\":[{\"ind\":24,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[13.5,11.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[27,23]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.69,-4.24],[0.64,-1.37],[0,0],[0.47,-0.65],[0.65,0.47],[0,0],[1.6,-0.26],[0.68,4.24],[-4.24,0.69]],\"o\":[[4.24,-0.68],[0.26,1.6],[0,0],[0.65,0.47],[-0.47,0.66],[0,0],[-1.09,1.04],[-4.25,0.69],[-0.69,-4.24],[0,0]],\"v\":[[7.11,0.31],[16.04,6.75],[15.41,11.29],[19.25,14.06],[19.58,16.09],[17.54,16.43],[13.7,13.65],[9.6,15.68],[0.67,9.23],[7.11,0.31]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.43,-2.65],[-2.65,0.43],[0.43,2.66],[2.65,-0.43]],\"o\":[[-2.65,0.43],[0.43,2.65],[2.65,-0.43],[-0.43,-2.65],[0,0]],\"v\":[[7.58,3.19],[3.55,8.77],[9.13,12.8],[13.16,7.21],[7.58,3.19]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.49,0.79,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"34\",\"layers\":[{\"ind\":33,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.29],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.28,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.49],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.45,0.77],[7.53,1.46],[8.59,3.2],[8.25,5.36],[7.56,7.45],[5.82,8.51],[3.66,8.17],[1.57,7.48],[0.51,5.74],[0.85,3.57],[1.54,1.49],[3.28,0.43],[5.45,0.77]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.13,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.14],[-0.39,-0.1],[-0.17,0.03],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.13],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.22,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.22],[-0.14,-0.1],[0,0]],\"v\":[[4.88,3.25],[4.12,3.14],[3.56,3.48],[3.32,4.2],[3.21,4.95],[3.55,5.51],[4.27,5.75],[5.02,5.86],[5.58,5.52],[5.82,4.8],[5.93,4.05],[5.59,3.49],[4.88,3.25]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"39\",\"layers\":[{\"ind\":38,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.32,0.96],[7.4,1.65],[8.46,3.39],[8.12,5.56],[7.43,7.64],[5.69,8.7],[3.52,8.36],[1.44,7.67],[0.38,5.93],[0.72,3.77],[1.41,1.68],[3.15,0.62],[5.32,0.96]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.1,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.14],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],\"v\":[[4.74,3.44],[3.99,3.33],[3.43,3.67],[3.19,4.39],[3.07,5.14],[3.41,5.7],[4.14,5.94],[4.89,6.06],[5.45,5.71],[5.69,5],[5.8,4.25],[5.46,3.68],[4.74,3.44]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"44\",\"layers\":[{\"ind\":43,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.57,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.29,0.79],[7.37,1.48],[8.43,3.23],[8.09,5.39],[7.4,7.48],[5.66,8.54],[3.49,8.2],[1.41,7.51],[0.35,5.77],[0.69,3.6],[1.38,1.52],[3.12,0.46],[5.29,0.79]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.02,0.17],[0.18,0.14],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.23,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],\"v\":[[4.71,3.28],[3.96,3.16],[3.4,3.51],[3.16,4.23],[3.04,4.98],[3.39,5.54],[4.11,5.78],[4.86,5.89],[5.41,5.55],[5.66,4.83],[5.77,4.08],[5.43,3.52],[4.71,3.28]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"49\",\"layers\":[{\"ind\":48,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[2.5,2.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[5,5]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.24,0.23],[3.29,1.96],[1.57,3.01],[0.52,1.28],[2.24,0.23]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"54\",\"layers\":[{\"ind\":53,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[2.5,2.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[5,5]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.11,0.61],[3.16,2.34],[1.44,3.39],[0.39,1.66],[2.11,0.61]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"59\",\"layers\":[{\"ind\":58,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[5.5,3]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[11,6]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[0.15,-0.62],[0.77,0.19],[0,0],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0,0],[0.77,0.19],[-0.19,0.77],[0,0],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.48,0.48],[7.11,1.6],[8.16,3.33],[6.44,4.38],[1.81,3.26],[0.76,1.53],[2.48,0.48]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"62\",\"layers\":[{\"ind\":36,\"ty\":0,\"parent\":32,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"34\"},{\"ind\":32,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[17.594,5.138]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":41,\"ty\":0,\"parent\":37,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"39\"},{\"ind\":37,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[5.134,17.416]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":46,\"ty\":0,\"parent\":42,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"44\"},{\"ind\":42,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[5.225,5.047]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":51,\"ty\":0,\"parent\":47,\"ks\":{},\"w\":5,\"h\":5,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"49\"},{\"ind\":47,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[2.5,2.5]},\"p\":{\"a\":0,\"k\":[20.992,21.292]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":56,\"ty\":0,\"parent\":52,\"ks\":{},\"w\":5,\"h\":5,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"54\"},{\"ind\":52,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[2.5,2.5]},\"p\":{\"a\":0,\"k\":[14.69,20.761]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":61,\"ty\":0,\"parent\":57,\"ks\":{},\"w\":11,\"h\":6,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"59\"},{\"ind\":57,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[5.5,3]},\"p\":{\"a\":0,\"k\":[17.282,14.474]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":31,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[2.572,2.572]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"72\",\"layers\":[{\"ind\":71,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"77\",\"layers\":[{\"ind\":76,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"83\",\"layers\":[{\"ind\":82,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"88\",\"layers\":[{\"ind\":87,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"93\",\"layers\":[{\"ind\":92,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":7,\"ty\":2,\"parent\":6,\"ks\":{\"s\":{\"a\":0,\"k\":[33.33,33.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"0\"},{\"ind\":6,\"ty\":3,\"parent\":5,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{\"a\":{\"a\":0,\"k\":[21.5,16]},\"p\":{\"a\":0,\"k\":[21.5,16]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":4,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[138,40]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":12,\"ty\":4,\"parent\":11,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"el\",\"p\":{\"a\":0,\"k\":[4.375,4.375]},\"s\":{\"a\":0,\"k\":[8.75,8.75]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":11,\"ty\":3,\"parent\":10,\"ks\":{\"p\":{\"a\":0,\"k\":[8.422,7.292]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":14,\"ty\":2,\"parent\":13,\"ks\":{\"s\":{\"a\":0,\"k\":[33.33,33.04]}},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"1\"},{\"ind\":13,\"ty\":3,\"parent\":10,\"ks\":{\"a\":{\"a\":0,\"k\":[16.5,18.5]},\"p\":{\"a\":0,\"k\":[12.538,14.893]},\"r\":{\"a\":0,\"k\":12.68}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":10,\"ty\":3,\"parent\":9,\"ks\":{\"a\":{\"a\":0,\"k\":[13.037,14.939]},\"p\":{\"a\":0,\"k\":[15.997,17.436]},\"r\":{\"a\":0,\"k\":-12.68}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":9,\"ty\":3,\"parent\":8,\"ks\":{\"a\":{\"a\":0,\"k\":[15.997,17.436]},\"p\":{\"a\":0,\"k\":[15.997,17.436]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":8,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[87,28]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":22,\"ty\":0,\"parent\":18,\"ks\":{},\"w\":33,\"h\":30,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"20\"},{\"ind\":18,\"ty\":3,\"parent\":17,\"ks\":{\"a\":{\"a\":0,\"k\":[16.5,15]},\"p\":{\"a\":0,\"k\":[15.953,14.392]},\"r\":{\"a\":0,\"k\":9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":27,\"ty\":0,\"parent\":23,\"ks\":{},\"w\":27,\"h\":23,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"25\"},{\"ind\":23,\"ty\":3,\"parent\":17,\"ks\":{\"a\":{\"a\":0,\"k\":[13.5,11.5]},\"p\":{\"a\":0,\"k\":[15.873,14.886]},\"r\":{\"a\":0,\"k\":9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":17,\"ty\":3,\"parent\":16,\"ks\":{\"a\":{\"a\":0,\"k\":[15.3,15.3]},\"p\":{\"a\":0,\"k\":[17.544,17.544]},\"r\":{\"a\":0,\"k\":-9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":16,\"ty\":3,\"parent\":15,\"ks\":{\"a\":{\"a\":0,\"k\":[17.544,17.544]},\"p\":{\"a\":0,\"k\":[17.544,17.544]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":15,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[7,49]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":64,\"ty\":0,\"parent\":30,\"ks\":{\"a\":{\"a\":0,\"k\":[2.286,2.286]},\"p\":{\"a\":0,\"k\":[2.286,2.286]}},\"w\":27.4286,\"h\":27.4286,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"62\"},{\"ind\":30,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":0,\"k\":[2.286,2.286]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":66,\"ty\":4,\"parent\":65,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[16,16]},\"r\":{\"a\":0,\"k\":6.857},\"s\":{\"a\":0,\"k\":[32,32]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":65,\"ty\":3,\"parent\":29,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":29,\"ty\":3,\"parent\":28,\"ks\":{\"a\":{\"a\":0,\"k\":[16,16]},\"p\":{\"a\":0,\"k\":[19.317,19.317]},\"r\":{\"a\":0,\"k\":13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":28,\"ty\":3,\"parent\":3,\"ks\":{\"a\":{\"a\":0,\"k\":[19.317,19.317]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[60.317,29.317],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":8.7,\"s\":[60.317,29.317],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":61.2,\"s\":[102.317,92.317],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[102.317,92.317],\"h\":1}]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":8.7,\"s\":[0],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0.5,\"y\":0}},{\"t\":61.2,\"s\":[-14],\"h\":1},{\"t\":119.4,\"s\":[-14],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":8.7,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":61.2,\"s\":[400,400],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[400,400],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":74,\"ty\":0,\"parent\":70,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"72\"},{\"ind\":70,\"ty\":3,\"parent\":69,\"ks\":{\"p\":{\"a\":0,\"k\":[4.974,0.54]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":79,\"ty\":0,\"parent\":75,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"77\"},{\"ind\":75,\"ty\":3,\"parent\":69,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":69,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":85,\"ty\":0,\"parent\":81,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"83\"},{\"ind\":81,\"ty\":3,\"parent\":80,\"ks\":{\"p\":{\"a\":0,\"k\":[4.474,0.54]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":90,\"ty\":0,\"parent\":86,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"88\"},{\"ind\":86,\"ty\":3,\"parent\":80,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":80,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":95,\"ty\":0,\"parent\":91,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"93\"},{\"ind\":91,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":68,\"ty\":3,\"parent\":67,\"ks\":{\"a\":{\"a\":0,\"k\":[67.649,55.9]},\"p\":{\"a\":0,\"k\":[67.649,55.9]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":25.2,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":25.2,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":67,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[32.926,63.56]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":2,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":119.4,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "assets/lotties/school-services.json",
    "content": "{\"assets\":[{\"h\":84,\"id\":\"0\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":84,\"e\":1},{\"h\":84,\"id\":\"1\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":84,\"e\":1},{\"h\":42,\"id\":\"2\",\"p\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAqCAYAAADFw8lbAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASBSURBVHgB7ZltaFtVGMf/N/emWV66pGFpm25NWaZ1VqpTYVK6oRNfcA4Gqx9FkX1R8NPQ+U1BQeqHIRPdB0WmQ9icuMmc+kFlrdMNlMIQ67razdY2Xds1TdvkJrkvOdfn3jn7luSeLknZoH+4JPfek5PfeZ7n/M/JjVD72WsGbnkJnzhwm2gVtNxaBS23lgXqcSiol9IwIGClJfE2DBHgqcbj2OCcwankHXhnsh1DWmDFkLkj+oTvMqJVU6gScnhm7SX8Fv0Yr4d+BlshVC5QRseLgZ5FVwW8HPyVovwFvAJDpcUFGhVn0eyK573X5vkHr4a6UOnljQu0UZoGiqT4pZoLeIpKo5LiAt0opG3bvF37k1W/lRLfZGIMzIZhvTOB7Z5hVEpcoAO5tVBl+2jt8A4Wve8QDLK5DFncNA1s1soArydz+eiA4YeWZnD5RAhFhnaXa9KaVPO/2jzfsuYqXgj8ga3uYYKUCVCFYQhIMh8uKH78kNqME8k7Mal7UBLoGKvGsL4OkXgcvlDhj/gdumVl4n/nZtTerO3GLl//InwBAp36xRQe9phHDPuC59Ex0oFeJZS3b67Um42OaK1gmgF5UjdLNq/SxlyHEUrv6cgxgvwL4EhvDa18YRpYMQYufa7dh1EWRE41kJ7QrdfFmtDdFlKdlMKJyHE00CuvZpgbZ+UmlAyaNlzYl91JqXVQRK9HNjuzcIKdTLZYNXmg7gx5Lz+kqcNTD0AxpNJBTfXk1uOQ2ma9F50CRNdcSs01f0gNkvFfweNWuvk1qPpwaOrBom24JlONqNJG5CK2eYaw2XUNPlGCw7Gw7noyYVxSa/BB+DssR1m9CvtHd2LGkG4e1EzjkxShg/XfIyjK8+4snRxHrt2DRz1/o8U18f81s44FSaBB5embyieTEvHWVDu6lQ2wU1HQ3dX9+Kjha9jN2pGEB6ezd+PD4MkF1zOJHK1oBhzO67CmB5uDZxowTul+RXka5/Qm8KggaL0zSR7YZQupyAzvJtpQTSb+kGtsYeduB9RUzrK1G46Wokl5VLsX76ntyNJ7XhUEfd7fi7DNzFVSDL3TQXyqbcEuaQBuScX8gbl8DpyXw/hTDSPOPDijR3HFCBIg9w8Le9DWNWMFP2RQeExrmki7sTfdQSuRgVYxtqSdmerIOgV7B9shM/7o5VNBezoab8FV2QemGxaYWfw5SqEJmBzX8G2yGbvl5zBK+wBTPmStNou1iVaozroulKqCEf0m04xzsSa0SDHscV6EX8ggzZy4zEL4Ud+EvlwtdMz3UdGqxXzaU92H/eOPIFNCVIsWS4KK/Rctah126mMN0PWe/F9C27kd3hhlwb6fQirbA4ivaKIkVFfBqNZLsyhFZQM1reZ9hSwnlX+DrRoiSlFZH+kc0+7H4VnaXCSXwp5NN6IUlRU0S1F7I/sYDsTbIKfmuu5XA7TxCKAULd95bWQm+KCyDV+OtuJZ7+/Y6JXRmdha8vOUsoPe0Aj5a2dqO62ZKItWn4+WW6ug5dZtAyqZfzbhFhf9POv+F7NtpNQ3hR5HAAAAAElFTkSuQmCC\",\"u\":\"\",\"w\":42,\"e\":1},{\"id\":\"8\",\"layers\":[{\"ind\":7,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[11.5,12]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[23,24]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.06,-1.04],[1.39,0],[0,0],[0,1.6],[-0.02,0.8],[0.21,0.69],[0.63,-2.06],[-0.01,-0.61],[0,-0.89],[1.6,0],[0,0],[0.07,1.39],[-0.3,0.91],[0.32,1.05],[-0.98,0.66],[0,0],[-0.98,-0.65],[0,0],[0.35,-1.14],[-0.57,-1.71]],\"o\":[[0.31,0.91],[-0.07,1.39],[0,0],[-1.6,0],[0,-0.89],[0.01,-0.61],[-0.63,-2.06],[-0.21,0.69],[0.02,0.8],[0,1.6],[0,0],[-1.39,0],[-0.06,-1.04],[0.57,-1.71],[-0.35,-1.14],[0,0],[0.98,-0.65],[0,0],[0.98,0.66],[-0.32,1.05],[0,0]],\"v\":[[16.63,12.18],[16.91,15.32],[14.23,17.7],[13.98,17.7],[11.07,14.81],[11.09,12.18],[10.75,10.2],[6.8,10.2],[6.46,12.18],[6.48,14.81],[3.57,17.7],[3.32,17.7],[0.64,15.32],[0.92,12.18],[1.03,7.98],[1.87,4.75],[7.15,1.23],[10.4,1.23],[15.68,4.75],[16.52,7.98],[16.63,12.18]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"11\",\"layers\":[{\"ind\":10,\"ty\":0,\"parent\":6,\"ks\":{},\"w\":23,\"h\":24,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"8\"},{\"ind\":6,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[4.3,4.1]}},\"ip\":0,\"op\":240.4,\"st\":0}]},{\"id\":\"16\",\"layers\":[{\"ind\":13,\"ty\":0,\"parent\":5,\"ks\":{\"a\":{\"a\":0,\"k\":[5.2,3.9]},\"p\":{\"a\":0,\"k\":[5.2,3.9]}},\"w\":31.2,\"h\":31.2,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"11\"},{\"ind\":5,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[5.2,3.9]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":15,\"ty\":4,\"parent\":14,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[20.802,20.802]},\"r\":{\"a\":0,\"k\":27.3},\"s\":{\"a\":0,\"k\":[41.604,41.604]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":14,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0}]},{\"id\":\"21\",\"layers\":[{\"ind\":20,\"ty\":2,\"parent\":19,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"0\"},{\"ind\":19,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[51.19,51.19]}},\"ip\":0,\"op\":240.4,\"st\":0}]},{\"id\":\"24\",\"layers\":[{\"ind\":23,\"ty\":0,\"ks\":{},\"w\":43,\"h\":43,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"21\"}]},{\"id\":\"29\",\"layers\":[{\"ind\":28,\"ty\":2,\"parent\":27,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"1\"},{\"ind\":27,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[50,50]}},\"ip\":0,\"op\":240.4,\"st\":0}]},{\"id\":\"32\",\"layers\":[{\"ind\":31,\"ty\":0,\"ks\":{},\"w\":42,\"h\":42,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"29\"}]},{\"id\":\"37\",\"layers\":[{\"ind\":36,\"ty\":2,\"parent\":35,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"2\"},{\"ind\":35,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[99.06,99.06]}},\"ip\":0,\"op\":240.4,\"st\":0}]},{\"id\":\"41\",\"layers\":[{\"ind\":40,\"ty\":4,\"td\":1,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[20.802,20.802]},\"r\":{\"a\":0,\"k\":27.3},\"s\":{\"a\":0,\"k\":[41.604,41.604]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":39,\"ty\":0,\"tt\":1,\"ks\":{},\"w\":41.604,\"h\":41.604,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"37\"}]},{\"id\":\"49\",\"layers\":[{\"ind\":48,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"54\",\"layers\":[{\"ind\":53,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"60\",\"layers\":[{\"ind\":59,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"65\",\"layers\":[{\"ind\":64,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"70\",\"layers\":[{\"ind\":69,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"73\",\"layers\":[{\"ind\":51,\"ty\":0,\"parent\":47,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"49\"},{\"ind\":47,\"ty\":3,\"parent\":46,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.974,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":43.86,\"s\":[4.974,4.541],\"i\":{\"x\":[0,1],\"y\":[1,1]},\"o\":{\"x\":[0.5,0],\"y\":[0,0]}},{\"t\":72.3,\"s\":[1.974,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":87.96,\"s\":[1.974,4.541],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":116.4,\"s\":[6.974,6.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":143.76,\"s\":[6.974,6.541],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":172.2,\"s\":[4.974,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[4.974,4.541],\"h\":1}]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":56,\"ty\":0,\"parent\":52,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"54\"},{\"ind\":52,\"ty\":3,\"parent\":46,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":46,\"ty\":3,\"parent\":45,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":62,\"ty\":0,\"parent\":58,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"60\"},{\"ind\":58,\"ty\":3,\"parent\":57,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.474,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":43.86,\"s\":[4.474,4.541],\"i\":{\"x\":[0,1],\"y\":[1,1]},\"o\":{\"x\":[0.5,0],\"y\":[0,0]}},{\"t\":72.3,\"s\":[1.474,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":87.96,\"s\":[1.474,4.541],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":116.4,\"s\":[6.474,6.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":143.76,\"s\":[6.474,6.541],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":172.2,\"s\":[4.474,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[4.474,4.541],\"h\":1}]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":67,\"ty\":0,\"parent\":63,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"65\"},{\"ind\":63,\"ty\":3,\"parent\":57,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":57,\"ty\":3,\"parent\":45,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":72,\"ty\":0,\"parent\":68,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"70\"},{\"ind\":68,\"ty\":3,\"parent\":45,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":45,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[8,8]}},\"ip\":0,\"op\":240.4,\"st\":0}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":18,\"ty\":0,\"parent\":4,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":45.18,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":63.06,\"s\":[100],\"h\":1},{\"t\":239.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[54,122],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":45.18,\"s\":[54,122],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":63.06,\"s\":[20,134],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[20,134],\"h\":1}]}},\"w\":42,\"h\":42,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"16\"},{\"ind\":26,\"ty\":0,\"parent\":4,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":33.3,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":51.18,\"s\":[100],\"h\":1},{\"t\":239.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[136,117],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":33.3,\"s\":[136,117],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":51.18,\"s\":[157,133],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[157,133],\"h\":1}]}},\"w\":43,\"h\":43,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"24\"},{\"ind\":34,\"ty\":0,\"parent\":4,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":21.48,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":39.36,\"s\":[100],\"h\":1},{\"t\":239.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[103,20],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":21.48,\"s\":[103,20],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":39.36,\"s\":[130,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[130,0],\"h\":1}]}},\"w\":42,\"h\":42,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"32\"},{\"ind\":43,\"ty\":0,\"parent\":4,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":9.6,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":27.48,\"s\":[100],\"h\":1},{\"t\":239.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[26,30],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":9.6,\"s\":[26,30],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":27.48,\"s\":[12,9],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[12,9],\"h\":1}]}},\"w\":42,\"h\":42,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"41\"},{\"ind\":75,\"ty\":0,\"parent\":44,\"ks\":{\"a\":{\"a\":0,\"k\":[75.649,63.9]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":31.8,\"s\":[100],\"h\":1},{\"t\":239.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":0,\"k\":[67.649,55.9]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[50,50],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":31.8,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[100,100],\"h\":1}]}},\"w\":150,\"h\":135,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"73\"},{\"ind\":44,\"ty\":3,\"parent\":4,\"ks\":{\"a\":{\"a\":0,\"k\":[67.649,55.9]},\"p\":{\"a\":0,\"k\":[100.575,99.459]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":34.8,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":82.8,\"s\":[105,105],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":156,\"s\":[105,105],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":204,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":4,\"ty\":3,\"parent\":3,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":3,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":239.4,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "assets/lotties/search.json",
    "content": "{\"assets\":[{\"h\":96,\"id\":\"0\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":129,\"e\":1},{\"h\":112,\"id\":\"1\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":99,\"e\":1},{\"id\":\"19\",\"layers\":[{\"ind\":18,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[16.5,15]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[33,30]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0.21,1.3]],\"o\":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[1.3,-0.21],[0,0]],\"v\":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[12.96,10.61]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[4.24,-0.68],[-0.69,-4.24],[-4.25,0.68],[-1.09,1.04],[0,0],[-0.47,0.65],[0.65,0.47],[0,0],[0.26,1.6]],\"o\":[[-0.69,-4.24],[-4.24,0.69],[0.68,4.25],[1.6,-0.26],[0,0],[0.65,0.47],[0.47,-0.66],[0,0],[0.64,-1.37],[0,0]],\"v\":[[18.29,9.75],[9.36,3.31],[2.92,12.23],[11.85,18.68],[15.95,16.65],[19.79,19.43],[21.83,19.1],[21.5,17.06],[17.66,14.29],[18.29,9.75]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[1.3,-0.21],[-0.21,-1.3],[-1.3,0.21],[0,0],[0.43,2.65],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0,0],[0.21,1.3]],\"o\":[[-0.21,-1.3],[-1.3,0.21],[0.21,1.3],[0,0],[-2.65,0.43],[-0.43,-2.65],[2.65,-0.43],[0.43,2.65],[0,0],[1.3,-0.21],[0,0]],\"v\":[[12.96,10.61],[10.22,8.63],[8.25,11.38],[10.98,13.35],[11.38,15.8],[5.8,11.77],[9.83,6.19],[15.41,10.22],[11.38,15.8],[10.98,13.35],[12.96,10.61]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.27,-1.15],[0,0],[1.27,-1.76],[1.76,1.27],[0,0],[1.22,-0.25],[0,0],[1.02,5.45],[0,0],[-5.59,0.9],[0,0],[-0.89,-5.5]],\"o\":[[0.15,1.23],[0,0],[1.76,1.27],[-1.27,1.76],[0,0],[-1.01,0.62],[0,0],[-5.51,0.89],[0,0],[-0.9,-5.59],[0,0],[5.5,-0.75],[0,0]],\"v\":[[20.79,9.75],[20.59,13.35],[22.95,15.05],[23.84,20.54],[18.34,21.43],[15.98,19.73],[12.63,21.05],[12.24,21.12],[0.52,12.89],[0.48,12.63],[8.97,0.87],[9.23,0.83],[20.73,9.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"24\",\"layers\":[{\"ind\":23,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[13.5,11.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[27,23]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.69,-4.24],[0.64,-1.37],[0,0],[0.47,-0.65],[0.65,0.47],[0,0],[1.6,-0.26],[0.68,4.24],[-4.24,0.69]],\"o\":[[4.24,-0.68],[0.26,1.6],[0,0],[0.65,0.47],[-0.47,0.66],[0,0],[-1.09,1.04],[-4.25,0.69],[-0.69,-4.24],[0,0]],\"v\":[[7.11,0.31],[16.04,6.75],[15.41,11.29],[19.25,14.06],[19.58,16.09],[17.54,16.43],[13.7,13.65],[9.6,15.68],[0.67,9.23],[7.11,0.31]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.43,-2.65],[-2.65,0.43],[0.43,2.66],[2.65,-0.43]],\"o\":[[-2.65,0.43],[0.43,2.65],[2.65,-0.43],[-0.43,-2.65],[0,0]],\"v\":[[7.58,3.19],[3.55,8.77],[9.13,12.8],[13.16,7.21],[7.58,3.19]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.49,0.79,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"34\",\"layers\":[{\"ind\":33,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.29],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.28,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.49],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.45,0.77],[7.53,1.46],[8.59,3.2],[8.25,5.36],[7.56,7.45],[5.82,8.51],[3.66,8.17],[1.57,7.48],[0.51,5.74],[0.85,3.57],[1.54,1.49],[3.28,0.43],[5.45,0.77]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.13,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.14],[-0.39,-0.1],[-0.17,0.03],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.13],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.22,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.22],[-0.14,-0.1],[0,0]],\"v\":[[4.88,3.25],[4.12,3.14],[3.56,3.48],[3.32,4.2],[3.21,4.95],[3.55,5.51],[4.27,5.75],[5.02,5.86],[5.58,5.52],[5.82,4.8],[5.93,4.05],[5.59,3.49],[4.88,3.25]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"39\",\"layers\":[{\"ind\":38,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.58,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.32,0.96],[7.4,1.65],[8.46,3.39],[8.12,5.56],[7.43,7.64],[5.69,8.7],[3.52,8.36],[1.44,7.67],[0.38,5.93],[0.72,3.77],[1.41,1.68],[3.15,0.62],[5.32,0.96]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.1,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.03,0.17],[0.18,0.14],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.22,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],\"v\":[[4.74,3.44],[3.99,3.33],[3.43,3.67],[3.19,4.39],[3.07,5.14],[3.41,5.7],[4.14,5.94],[4.89,6.06],[5.45,5.71],[5.69,5],[5.8,4.25],[5.46,3.68],[4.74,3.44]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"44\",\"layers\":[{\"ind\":43,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6,6]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[12,12]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-0.4,-0.28],[-0.1,-0.7],[0.27,-1.12],[0.29,-0.4],[0.7,-0.1],[1.12,0.27],[0.4,0.29],[0.1,0.7],[-0.27,1.12],[-0.29,0.4],[-0.7,0.1],[-1.12,-0.27]],\"o\":[[1.12,0.27],[0.58,0.41],[0.07,0.48],[-0.27,1.12],[-0.41,0.58],[-0.49,0.07],[-1.12,-0.27],[-0.57,-0.41],[-0.07,-0.49],[0.27,-1.12],[0.41,-0.58],[0.48,-0.07],[0,0]],\"v\":[[5.29,0.79],[7.37,1.48],[8.43,3.23],[8.09,5.39],[7.4,7.48],[5.66,8.54],[3.49,8.2],[1.41,7.51],[0.35,5.77],[0.69,3.6],[1.38,1.52],[3.12,0.46],[5.29,0.79]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.17,-0.03],[0.14,-0.18],[0.09,-0.39],[-0.03,-0.17],[-0.18,-0.13],[-0.39,-0.09],[-0.17,0.02],[-0.13,0.18],[-0.09,0.39],[0.02,0.17],[0.18,0.14],[0.39,0.09]],\"o\":[[-0.39,-0.09],[-0.23,0.04],[-0.1,0.14],[-0.09,0.39],[0.04,0.23],[0.14,0.1],[0.39,0.09],[0.23,-0.04],[0.1,-0.14],[0.09,-0.39],[-0.04,-0.23],[-0.14,-0.1],[0,0]],\"v\":[[4.71,3.28],[3.96,3.16],[3.4,3.51],[3.16,4.23],[3.04,4.98],[3.39,5.54],[4.11,5.78],[4.86,5.89],[5.41,5.55],[5.66,4.83],[5.77,4.08],[5.43,3.52],[4.71,3.28]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"49\",\"layers\":[{\"ind\":48,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[2.5,2.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[5,5]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.24,0.23],[3.29,1.96],[1.57,3.01],[0.52,1.28],[2.24,0.23]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"54\",\"layers\":[{\"ind\":53,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[2.5,2.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[5,5]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.15,-0.62],[0.77,0.19],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0.77,0.19],[-0.19,0.77],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.11,0.61],[3.16,2.34],[1.44,3.39],[0.39,1.66],[2.11,0.61]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"59\",\"layers\":[{\"ind\":58,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[5.5,3]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[11,6]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[0.15,-0.62],[0.77,0.19],[0,0],[-0.15,0.63],[-0.77,-0.19]],\"o\":[[0,0],[0.77,0.19],[-0.19,0.77],[0,0],[-0.77,-0.19],[0.19,-0.77],[0,0]],\"v\":[[2.48,0.48],[7.11,1.6],[8.16,3.33],[6.44,4.38],[1.81,3.26],[0.76,1.53],[2.48,0.48]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"62\",\"layers\":[{\"ind\":36,\"ty\":0,\"parent\":32,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"34\"},{\"ind\":32,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[17.594,5.138]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":41,\"ty\":0,\"parent\":37,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"39\"},{\"ind\":37,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[5.134,17.416]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":46,\"ty\":0,\"parent\":42,\"ks\":{},\"w\":12,\"h\":12,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"44\"},{\"ind\":42,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[6,6]},\"p\":{\"a\":0,\"k\":[5.225,5.047]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":51,\"ty\":0,\"parent\":47,\"ks\":{},\"w\":5,\"h\":5,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"49\"},{\"ind\":47,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[2.5,2.5]},\"p\":{\"a\":0,\"k\":[20.992,21.292]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":56,\"ty\":0,\"parent\":52,\"ks\":{},\"w\":5,\"h\":5,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"54\"},{\"ind\":52,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[2.5,2.5]},\"p\":{\"a\":0,\"k\":[14.69,20.761]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":61,\"ty\":0,\"parent\":57,\"ks\":{},\"w\":11,\"h\":6,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"59\"},{\"ind\":57,\"ty\":3,\"parent\":31,\"ks\":{\"a\":{\"a\":0,\"k\":[5.5,3]},\"p\":{\"a\":0,\"k\":[17.282,14.474]},\"r\":{\"a\":0,\"k\":-13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":31,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[2.572,2.572]}},\"ip\":0,\"op\":120.4,\"st\":0}]},{\"id\":\"72\",\"layers\":[{\"ind\":71,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"77\",\"layers\":[{\"ind\":76,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"83\",\"layers\":[{\"ind\":82,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"88\",\"layers\":[{\"ind\":87,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"93\",\"layers\":[{\"ind\":92,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":7,\"ty\":2,\"parent\":6,\"ks\":{\"s\":{\"a\":0,\"k\":[33.33,33.33]}},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"0\"},{\"ind\":6,\"ty\":3,\"parent\":5,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{\"a\":{\"a\":0,\"k\":[21.5,16]},\"p\":{\"a\":0,\"k\":[21.5,16]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":4,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[138,40]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":12,\"ty\":4,\"parent\":11,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"el\",\"p\":{\"a\":0,\"k\":[4.375,4.375]},\"s\":{\"a\":0,\"k\":[8.75,8.75]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":11,\"ty\":3,\"parent\":10,\"ks\":{\"p\":{\"a\":0,\"k\":[8.422,7.292]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":14,\"ty\":2,\"parent\":13,\"ks\":{\"s\":{\"a\":0,\"k\":[33.33,33.04]}},\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"1\"},{\"ind\":13,\"ty\":3,\"parent\":10,\"ks\":{\"a\":{\"a\":0,\"k\":[16.5,18.5]},\"p\":{\"a\":0,\"k\":[12.538,14.893]},\"r\":{\"a\":0,\"k\":12.68}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":10,\"ty\":3,\"parent\":9,\"ks\":{\"a\":{\"a\":0,\"k\":[13.037,14.939]},\"p\":{\"a\":0,\"k\":[15.997,17.436]},\"r\":{\"a\":0,\"k\":-12.68}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":9,\"ty\":3,\"parent\":8,\"ks\":{\"a\":{\"a\":0,\"k\":[15.997,17.436]},\"p\":{\"a\":0,\"k\":[15.997,17.436]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":8,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[87,28]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":21,\"ty\":0,\"parent\":17,\"ks\":{},\"w\":33,\"h\":30,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"19\"},{\"ind\":17,\"ty\":3,\"parent\":16,\"ks\":{\"a\":{\"a\":0,\"k\":[16.5,15]},\"p\":{\"a\":0,\"k\":[15.953,14.392]},\"r\":{\"a\":0,\"k\":9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":26,\"ty\":0,\"parent\":22,\"ks\":{},\"w\":27,\"h\":23,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"24\"},{\"ind\":22,\"ty\":3,\"parent\":16,\"ks\":{\"a\":{\"a\":0,\"k\":[13.5,11.5]},\"p\":{\"a\":0,\"k\":[15.873,14.886]},\"r\":{\"a\":0,\"k\":9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":16,\"ty\":3,\"parent\":15,\"ks\":{\"a\":{\"a\":0,\"k\":[15.3,15.3]},\"p\":{\"a\":0,\"k\":[17.544,17.544]},\"r\":{\"a\":0,\"k\":-9.18}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":15,\"ty\":3,\"parent\":3,\"ks\":{\"a\":{\"a\":0,\"k\":[17.544,17.544]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[24.544,66.544],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":12,\"s\":[24.544,66.544],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":64.5,\"s\":[100.544,92.544],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[100.544,92.544],\"h\":1}]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":12,\"s\":[0],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0.5,\"y\":0}},{\"t\":64.5,\"s\":[11],\"h\":1},{\"t\":119.4,\"s\":[11],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":12,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":64.5,\"s\":[400,400],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[400,400],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":64,\"ty\":0,\"parent\":30,\"ks\":{\"a\":{\"a\":0,\"k\":[2.286,2.286]},\"p\":{\"a\":0,\"k\":[2.286,2.286]}},\"w\":27.4286,\"h\":27.4286,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"62\"},{\"ind\":30,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":0,\"k\":[2.286,2.286]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":66,\"ty\":4,\"parent\":65,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[16,16]},\"r\":{\"a\":0,\"k\":6.857},\"s\":{\"a\":0,\"k\":[32,32]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":65,\"ty\":3,\"parent\":29,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":29,\"ty\":3,\"parent\":28,\"ks\":{\"a\":{\"a\":0,\"k\":[16,16]},\"p\":{\"a\":0,\"k\":[19.317,19.317]},\"r\":{\"a\":0,\"k\":13.62}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":28,\"ty\":3,\"parent\":27,\"ks\":{\"a\":{\"a\":0,\"k\":[19.317,19.317]},\"p\":{\"a\":0,\"k\":[19.317,19.317]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":22.44,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":22.44,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":27,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[41,10]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":74,\"ty\":0,\"parent\":70,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"72\"},{\"ind\":70,\"ty\":3,\"parent\":69,\"ks\":{\"p\":{\"a\":0,\"k\":[4.974,0.54]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":79,\"ty\":0,\"parent\":75,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"77\"},{\"ind\":75,\"ty\":3,\"parent\":69,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":69,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":85,\"ty\":0,\"parent\":81,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"83\"},{\"ind\":81,\"ty\":3,\"parent\":80,\"ks\":{\"p\":{\"a\":0,\"k\":[4.474,0.54]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":90,\"ty\":0,\"parent\":86,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"88\"},{\"ind\":86,\"ty\":3,\"parent\":80,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":80,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":95,\"ty\":0,\"parent\":91,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":120.4,\"st\":0,\"refId\":\"93\"},{\"ind\":91,\"ty\":3,\"parent\":68,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":68,\"ty\":3,\"parent\":67,\"ks\":{\"a\":{\"a\":0,\"k\":[67.649,55.9]},\"p\":{\"a\":0,\"k\":[67.649,55.9]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":25.2,\"s\":[45],\"h\":1},{\"t\":119.4,\"s\":[45],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":25.2,\"s\":[0,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":119.4,\"s\":[0,0],\"h\":1}]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":67,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[32.926,63.56]}},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0},{\"ind\":2,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":120.4,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":119.4,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "assets/lotties/self.json",
    "content": "{\"assets\":[{\"id\":\"7\",\"layers\":[{\"ind\":6,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[58,61]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[116,122]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.01,-0.19],[5.35,-0.2],[0.46,0],[0.22,0.01],[-1.3,6.14],[-0.14,0.55],[0,0],[0,21.13],[-8.57,4.36],[-2.45,-1.48],[0,-6.03]],\"o\":[[0,0.45],[-0.2,5.31],[-0.2,0.01],[-0.57,0],[-6.32,-0.28],[0.05,-0.21],[0,0],[0,0],[0,-12.03],[4.86,-2.48],[2.45,1.49],[0,0]],\"v\":[[87,80.84],[86.99,81.72],[77.15,91.49],[76.27,91.5],[75.19,91.49],[65.62,79.23],[65.88,78.19],[71.65,55.92],[56.29,28.76],[74.81,4.72],[84.55,2.49],[87,13.02]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.6,0.6,0.6,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[6.13,0],[-0.72,6.05],[0,0],[0.75,0.07],[0.72,7.24],[0,1.77],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[0.07,-0.75],[7.29,-0.71],[1.79,0]],\"o\":[[0,0],[0.72,6.05],[-6.13,0],[0,0],[-1.79,0],[-7.29,-0.71],[-0.07,-0.75],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.77],[-0.72,7.24],[-0.75,0.07],[0,0]],\"v\":[[28.79,43.06],[33.2,80.14],[23.03,91.5],[12.86,80.14],[17.27,43.06],[13.85,42.98],[0.07,29.3],[0,25.9],[0,5.72],[5.76,0],[11.52,5.72],[11.52,24.05],[14.39,26.91],[17.27,24.05],[17.27,5.72],[23.03,0],[28.79,5.72],[28.79,24.05],[31.66,26.91],[34.54,24.05],[34.54,5.72],[40.3,0],[46.06,5.72],[46.06,25.9],[45.98,29.3],[32.21,42.98],[28.79,43.06]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.6,0.6,0.6,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"13\",\"layers\":[{\"ind\":12,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[73,76]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[146,152]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.45,1.49],[4.86,-2.48],[0,0],[0,-11.65],[-0.03,-0.01],[0,0],[0,0],[0.02,-0.11],[-6.32,-0.28],[-0.57,0],[-0.2,0.01],[-0.32,5.2],[0,0],[0,0.45]],\"o\":[[0,-6.03],[-2.45,-1.48],[0,0],[-8.37,4.43],[0,21.11],[0,0],[0,0],[-0.04,0.17],[-1.3,6.14],[0.22,0.01],[0.46,0],[5.27,-0.2],[0,0],[0.01,-0.19],[0,0]],\"v\":[[98.25,24.27],[95.8,13.74],[86.06,15.97],[85.25,16.39],[67.54,40.01],[82.9,67.17],[77.13,89.44],[76.96,90.09],[76.87,90.48],[86.44,102.74],[87.52,102.75],[88.4,102.74],[98.23,93.21],[98.24,92.97],[98.25,92.09]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.02,-0.46],[11.06,-0.41],[0.36,0],[0.53,0.02],[-2.74,12.91],[0,0],[-0.08,0.32],[0,0],[1.05,1.13],[1.92,4.41],[2.91,-1.23],[0,0],[12.67,0],[-1.51,12.7],[0,0],[0.97,9.82],[0,1.14],[0,0],[-9.21,0],[0,0],[-2.42,-1.45],[-3.15,0],[0,0],[-2.41,-1.45],[-3.14,0],[0,0],[-1.04,-8.17],[-3.7,1.89],[-2.8,0.79],[-4.37,-2.48],[0,0],[0,0],[-0.63,-3.48],[0,-2.58]],\"o\":[[0,0.35],[-0.43,11.15],[-0.45,0.02],[-0.45,0],[-13.05,-0.57],[0,0],[0.09,-0.4],[0,0],[-1.02,-0.87],[-2.62,-2.84],[-2.27,2.13],[0,0],[1.51,12.7],[-12.67,0],[0,0],[-8.7,-3.66],[-0.11,-1.07],[0,0],[0,-9.33],[0,0],[2.99,0.08],[2.53,-1.52],[0,0],[2.98,0.08],[2.53,-1.52],[0,0],[8.31,0.21],[4.35,-4],[2.02,-1.03],[3.54,-1.01],[0,0],[0,0],[4.5,2.93],[0.52,2.91],[0,0]],\"v\":[[109.3,92.09],[109.29,93.39],[88.82,113.79],[87.52,113.8],[85.95,113.79],[66.05,88.19],[66.14,87.79],[66.43,86.67],[70.22,72.02],[67.11,69.02],[60.07,58.2],[52.24,63.29],[55.42,90.09],[34.28,113.8],[13.14,90.09],[16.32,63.29],[0.32,41.64],[0.2,38.29],[0.2,16.97],[17.01,0.2],[17.44,0.2],[25.64,2.58],[34.28,0.2],[34.71,0.2],[42.91,2.58],[51.55,0.2],[51.98,0.2],[68.23,14.84],[81.05,6.11],[88.81,2.74],[101.12,4.05],[101.54,4.29],[101.98,4.57],[108.82,15.34],[109.3,24.27]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[-0.05,-0.56],[-7.29,-0.71],[-1.79,0],[0,0],[-5.99,-0.16],[0,0],[0.54,5.93],[0,0],[0,0],[-0.75,0.07],[-0.72,7.24],[0,1.77],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.08,1.46],[0,0],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.07,1.46],[0,0],[0,0],[3.18,0],[0,-3.16]],\"o\":[[0,0],[0,1.03],[0.72,7.24],[0.75,0.07],[0,0],[-0.71,5.95],[0,0],[6.03,0],[0,0],[0,0],[1.79,0],[7.29,-0.71],[0.07,-0.75],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.07,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.08,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0]],\"v\":[[11.25,37.15],[11.25,38.33],[11.32,40.55],[25.1,54.23],[28.52,54.31],[24.11,91.39],[33.99,102.75],[34.28,102.75],[44.47,91.68],[44.45,91.39],[40.04,54.31],[43.46,54.23],[57.23,40.55],[57.31,37.15],[57.31,16.97],[51.55,11.25],[45.79,16.97],[45.79,35.3],[45.79,35.45],[42.91,38.16],[42.77,38.16],[40.04,35.45],[40.04,35.3],[40.04,16.97],[34.28,11.25],[28.52,16.97],[28.52,35.3],[28.52,35.45],[25.64,38.16],[25.5,38.16],[22.77,35.45],[22.77,35.3],[22.77,16.97],[17.01,11.25],[11.25,16.97]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"21\",\"layers\":[{\"ind\":20,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"26\",\"layers\":[{\"ind\":25,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"32\",\"layers\":[{\"ind\":31,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"37\",\"layers\":[{\"ind\":36,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"42\",\"layers\":[{\"ind\":41,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":61,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"45\",\"layers\":[{\"ind\":23,\"ty\":0,\"parent\":19,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":61,\"st\":0,\"refId\":\"21\"},{\"ind\":19,\"ty\":3,\"parent\":18,\"ks\":{\"p\":{\"a\":0,\"k\":[4.974,4.541]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":28,\"ty\":0,\"parent\":24,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":61,\"st\":0,\"refId\":\"26\"},{\"ind\":24,\"ty\":3,\"parent\":18,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":18,\"ty\":3,\"parent\":17,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":34,\"ty\":0,\"parent\":30,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":61,\"st\":0,\"refId\":\"32\"},{\"ind\":30,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":0,\"k\":[4.474,4.541]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":39,\"ty\":0,\"parent\":35,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":61,\"st\":0,\"refId\":\"37\"},{\"ind\":35,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":29,\"ty\":3,\"parent\":17,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":44,\"ty\":0,\"parent\":40,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":61,\"st\":0,\"refId\":\"42\"},{\"ind\":40,\"ty\":3,\"parent\":17,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":17,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[8,8]}},\"ip\":0,\"op\":61,\"st\":0}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":9,\"ty\":0,\"parent\":5,\"ks\":{},\"w\":116,\"h\":122,\"ip\":0,\"op\":61,\"st\":0,\"refId\":\"7\"},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[41.93,41.59]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":4,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[6.181,6.13]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":15,\"ty\":0,\"parent\":11,\"ks\":{},\"w\":146,\"h\":152,\"ip\":0,\"op\":61,\"st\":0,\"refId\":\"13\"},{\"ind\":11,\"ty\":3,\"parent\":10,\"ks\":{\"s\":{\"a\":0,\"k\":[41.93,41.59]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":10,\"ty\":3,\"parent\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[-0.109,-0.108]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{\"a\":{\"a\":0,\"k\":[30.5,31.5]},\"p\":{\"a\":0,\"k\":[30.5,31.5]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[-45],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0.5,\"y\":0}},{\"t\":60,\"s\":[0],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0,0],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":60,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":2,\"ty\":3,\"parent\":1,\"ks\":{\"p\":{\"a\":0,\"k\":[28.768,29]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":47,\"ty\":0,\"parent\":16,\"ks\":{\"a\":{\"a\":0,\"k\":[75.649,63.9]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":31.8,\"s\":[100],\"h\":1},{\"t\":60,\"s\":[100],\"h\":1}]},\"p\":{\"a\":0,\"k\":[67.649,55.9]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[50,50],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":31.8,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":60,\"s\":[100,100],\"h\":1}]}},\"w\":150,\"h\":135,\"ip\":0,\"op\":61,\"st\":0,\"refId\":\"45\"},{\"ind\":16,\"ty\":3,\"parent\":1,\"ks\":{\"p\":{\"a\":0,\"k\":[40.694,43.559]}},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":1,\"ty\":3,\"parent\":0,\"ks\":{},\"ip\":0,\"op\":61,\"st\":0},{\"ind\":0,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":61,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":60,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "assets/lotties/turboself.json",
    "content": "{\"assets\":[{\"h\":237,\"id\":\"0\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":237,\"e\":1},{\"id\":\"8\",\"layers\":[{\"ind\":7,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[58,61]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[116,122]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.01,-0.19],[5.35,-0.2],[0.46,0],[0.22,0.01],[-1.3,6.14],[-0.14,0.55],[0,0],[0,21.13],[-8.57,4.36],[-2.45,-1.48],[0,-6.03]],\"o\":[[0,0.45],[-0.2,5.31],[-0.2,0.01],[-0.57,0],[-6.32,-0.28],[0.05,-0.21],[0,0],[0,0],[0,-12.03],[4.86,-2.48],[2.45,1.49],[0,0]],\"v\":[[87,80.84],[86.99,81.72],[77.15,91.49],[76.27,91.5],[75.19,91.49],[65.62,79.23],[65.88,78.19],[71.65,55.92],[56.29,28.76],[74.81,4.72],[84.55,2.49],[87,13.02]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.6,0.6,0.6,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[6.13,0],[-0.72,6.05],[0,0],[0.75,0.07],[0.72,7.24],[0,1.77],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[-1.59,0],[0,1.58],[0,0],[-3.18,0],[0,-3.16],[0,0],[0.07,-0.75],[7.29,-0.71],[1.79,0]],\"o\":[[0,0],[0.72,6.05],[-6.13,0],[0,0],[-1.79,0],[-7.29,-0.71],[-0.07,-0.75],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.58],[1.59,0],[0,0],[0,-3.16],[3.18,0],[0,0],[0,1.77],[-0.72,7.24],[-0.75,0.07],[0,0]],\"v\":[[28.79,43.06],[33.2,80.14],[23.03,91.5],[12.86,80.14],[17.27,43.06],[13.85,42.98],[0.07,29.3],[0,25.9],[0,5.72],[5.76,0],[11.52,5.72],[11.52,24.05],[14.39,26.91],[17.27,24.05],[17.27,5.72],[23.03,0],[28.79,5.72],[28.79,24.05],[31.66,26.91],[34.54,24.05],[34.54,5.72],[40.3,0],[46.06,5.72],[46.06,25.9],[45.98,29.3],[32.21,42.98],[28.79,43.06]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.6,0.6,0.6,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"14\",\"layers\":[{\"ind\":13,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[73,76]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[146,152]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.45,1.49],[4.86,-2.48],[0,0],[0,-11.65],[-0.03,-0.01],[0,0],[0,0],[0.02,-0.11],[-6.32,-0.28],[-0.57,0],[-0.2,0.01],[-0.32,5.2],[0,0],[0,0.45]],\"o\":[[0,-6.03],[-2.45,-1.48],[0,0],[-8.37,4.43],[0,21.11],[0,0],[0,0],[-0.04,0.17],[-1.3,6.14],[0.22,0.01],[0.46,0],[5.27,-0.2],[0,0],[0.01,-0.19],[0,0]],\"v\":[[98.25,24.27],[95.8,13.74],[86.06,15.97],[85.25,16.39],[67.54,40.01],[82.9,67.17],[77.13,89.44],[76.96,90.09],[76.87,90.48],[86.44,102.74],[87.52,102.75],[88.4,102.74],[98.23,93.21],[98.24,92.97],[98.25,92.09]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0.02,-0.46],[11.06,-0.41],[0.36,0],[0.53,0.02],[-2.74,12.91],[0,0],[-0.08,0.32],[0,0],[1.05,1.13],[1.92,4.41],[2.91,-1.23],[0,0],[12.67,0],[-1.51,12.7],[0,0],[0.97,9.82],[0,1.14],[0,0],[-9.21,0],[0,0],[-2.42,-1.45],[-3.15,0],[0,0],[-2.41,-1.45],[-3.14,0],[0,0],[-1.04,-8.17],[-3.7,1.89],[-2.8,0.79],[-4.37,-2.48],[0,0],[0,0],[-0.63,-3.48],[0,-2.58]],\"o\":[[0,0.35],[-0.43,11.15],[-0.45,0.02],[-0.45,0],[-13.05,-0.57],[0,0],[0.09,-0.4],[0,0],[-1.02,-0.87],[-2.62,-2.84],[-2.27,2.13],[0,0],[1.51,12.7],[-12.67,0],[0,0],[-8.7,-3.66],[-0.11,-1.07],[0,0],[0,-9.33],[0,0],[2.99,0.08],[2.53,-1.52],[0,0],[2.98,0.08],[2.53,-1.52],[0,0],[8.31,0.21],[4.35,-4],[2.02,-1.03],[3.54,-1.01],[0,0],[0,0],[4.5,2.93],[0.52,2.91],[0,0]],\"v\":[[109.3,92.09],[109.29,93.39],[88.82,113.79],[87.52,113.8],[85.95,113.79],[66.05,88.19],[66.14,87.79],[66.43,86.67],[70.22,72.02],[67.11,69.02],[60.07,58.2],[52.24,63.29],[55.42,90.09],[34.28,113.8],[13.14,90.09],[16.32,63.29],[0.32,41.64],[0.2,38.29],[0.2,16.97],[17.01,0.2],[17.44,0.2],[25.64,2.58],[34.28,0.2],[34.71,0.2],[42.91,2.58],[51.55,0.2],[51.98,0.2],[68.23,14.84],[81.05,6.11],[88.81,2.74],[101.12,4.05],[101.54,4.29],[101.98,4.57],[108.82,15.34],[109.3,24.27]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,0],[-0.05,-0.56],[-7.29,-0.71],[-1.79,0],[0,0],[-5.99,-0.16],[0,0],[0.54,5.93],[0,0],[0,0],[-0.75,0.07],[-0.72,7.24],[0,1.77],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.08,1.46],[0,0],[0,0],[3.18,0],[0,-3.16],[0,0],[0,0],[1.54,0],[0,0],[0.07,1.46],[0,0],[0,0],[3.18,0],[0,-3.16]],\"o\":[[0,0],[0,1.03],[0.72,7.24],[0.75,0.07],[0,0],[-0.71,5.95],[0,0],[6.03,0],[0,0],[0,0],[1.79,0],[7.29,-0.71],[0.07,-0.75],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.07,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0],[0,0],[-0.08,1.51],[0,0],[-1.47,-0.07],[0,0],[0,0],[0,-3.16],[-3.18,0],[0,0]],\"v\":[[11.25,37.15],[11.25,38.33],[11.32,40.55],[25.1,54.23],[28.52,54.31],[24.11,91.39],[33.99,102.75],[34.28,102.75],[44.47,91.68],[44.45,91.39],[40.04,54.31],[43.46,54.23],[57.23,40.55],[57.31,37.15],[57.31,16.97],[51.55,11.25],[45.79,16.97],[45.79,35.3],[45.79,35.45],[42.91,38.16],[42.77,38.16],[40.04,35.45],[40.04,35.3],[40.04,16.97],[34.28,11.25],[28.52,16.97],[28.52,35.3],[28.52,35.45],[25.64,38.16],[25.5,38.16],[22.77,35.45],[22.77,35.3],[22.77,16.97],[17.01,11.25],[11.25,16.97]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"17\",\"layers\":[{\"ind\":10,\"ty\":0,\"parent\":6,\"ks\":{},\"w\":116,\"h\":122,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"8\"},{\"ind\":6,\"ty\":3,\"parent\":5,\"ks\":{\"s\":{\"a\":0,\"k\":[41.93,41.59]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{\"p\":{\"a\":0,\"k\":[6.181,6.13]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":16,\"ty\":0,\"parent\":12,\"ks\":{},\"w\":146,\"h\":152,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"14\"},{\"ind\":12,\"ty\":3,\"parent\":11,\"ks\":{\"s\":{\"a\":0,\"k\":[41.93,41.59]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":11,\"ty\":3,\"parent\":4,\"ks\":{\"p\":{\"a\":0,\"k\":[-0.109,-0.108]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":4,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[1,1]}},\"ip\":0,\"op\":55,\"st\":0}]},{\"id\":\"24\",\"layers\":[{\"ind\":23,\"ty\":2,\"parent\":22,\"ks\":{\"s\":{\"a\":0,\"k\":[216.03,216.03]}},\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"0\"},{\"ind\":22,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[15.43,15.43]}},\"ip\":0,\"op\":55,\"st\":0}]},{\"id\":\"32\",\"layers\":[{\"ind\":31,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"37\",\"layers\":[{\"ind\":36,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"43\",\"layers\":[{\"ind\":42,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"48\",\"layers\":[{\"ind\":47,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"53\",\"layers\":[{\"ind\":52,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":19,\"ty\":0,\"parent\":3,\"ks\":{\"a\":{\"a\":0,\"k\":[31.5,32.5]},\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":1,\"y\":0}},{\"t\":12,\"s\":[0],\"h\":1},{\"t\":54,\"s\":[0],\"h\":1}]},\"p\":{\"a\":0,\"k\":[30.5,31.5]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[1,1],\"y\":[0,0]}},{\"t\":12,\"s\":[50,50],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[50,50],\"h\":1}]}},\"w\":147,\"h\":153,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"17\"},{\"ind\":3,\"ty\":3,\"parent\":2,\"ks\":{\"p\":{\"a\":0,\"k\":[28.768,29]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":27,\"ty\":4,\"td\":1,\"parent\":21,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[39.5,39.5]},\"r\":{\"a\":0,\"k\":150},\"s\":{\"a\":0,\"k\":[79,79]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":26,\"ty\":0,\"tt\":1,\"parent\":21,\"ks\":{},\"w\":79,\"h\":79,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"24\"},{\"ind\":21,\"ty\":3,\"parent\":20,\"ks\":{\"a\":{\"a\":0,\"k\":[39.5,39.5]},\"p\":{\"a\":0,\"k\":[39.5,39.5]},\"r\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[-45],\"i\":{\"x\":0,\"y\":1},\"o\":{\"x\":0.5,\"y\":0}},{\"t\":54,\"s\":[0],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0,0],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":54,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":20,\"ty\":3,\"parent\":2,\"ks\":{\"p\":{\"a\":0,\"k\":[69,20]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":34,\"ty\":0,\"parent\":30,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"32\"},{\"ind\":30,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.974,4.541],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[4.974,1.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[4.974,1.541],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":39,\"ty\":0,\"parent\":35,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"37\"},{\"ind\":35,\"ty\":3,\"parent\":29,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":29,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":45,\"ty\":0,\"parent\":41,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"43\"},{\"ind\":41,\"ty\":3,\"parent\":40,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.474,4.541],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[4.474,1.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[4.474,1.541],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":50,\"ty\":0,\"parent\":46,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"48\"},{\"ind\":46,\"ty\":3,\"parent\":40,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":40,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":55,\"ty\":0,\"parent\":51,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":55,\"st\":0,\"refId\":\"53\"},{\"ind\":51,\"ty\":3,\"parent\":28,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":28,\"ty\":3,\"parent\":2,\"ks\":{\"a\":{\"a\":0,\"k\":[67.649,55.9]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[108.343,99.459],\"i\":{\"x\":[1,0],\"y\":[1,1]},\"o\":{\"x\":[0,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[108.343,139.459],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[108.343,139.459],\"h\":1}]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":48,\"s\":[60,60],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":54,\"s\":[60,60],\"h\":1}]}},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":2,\"ty\":3,\"parent\":1,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0},{\"ind\":1,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":55,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":54,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "assets/lotties/uni-services.json",
    "content": "{\"assets\":[{\"h\":112,\"id\":\"0\",\"p\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAABwCAYAAADG4PRLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQySURBVHgB7dwxSBtRHMfxv61QEdoIhUIHo841jc41oGNV0N1Fx3ZRp6qLuKibOtSORmhnFUw7alDcCsG0s0kcHEpLUrC00GLzD6RITEzse/fufvL7wOFQuvj1vXv33nFNInIhhCp+RwgaA4JjQHAMCI4BwTEgOAYEx4DgGBAcA4JjQHAMCI4BwTEgOAYEx4DgGBAcA4JjQHAMCI4BwTEgOAYEx4DgGBAcA4JrFo/19PSULhOZTEb29/fF1PDwQwmF7oqJ9PG5HKfPJSg8Dzg6Oirz8/NiQuPZCPjyxWOJ9T0QE0vLp4EKyCkUHAOCY0BwDAiOAcExIDgGBMeA4BgQHAOCY0BwDAiOAcExIDgGBMeA4BgQHAOCY0BwDAiOAcExIDgGBMeA4BgQHAOCY0BwDAiOAcExIDgGBMeA4BgQHAOCgwjY1tYmNuRyP8VUONwiQeJ5QP1AgSlbAW8jiBHY2dkpNuRyv8TU00irBInnAVOplNhgI2LWQsBw+J4ECcQUqvRzJaYKhT9iKhRqllhfSILC84D5fL50mRoZGRFTBwcFsSEWM/vWjE1O7oE2PtLT399vPI0WCr9Llyn9YJCOxCBwEjCZTIoNGxsbYmo38U1Maby52XYJAicBbS1kdBSaRkxb+kyWjsLZAER0NoXauA+q8fFxOTk5Kf2sNqXqM2M5dLXnx7fvvogtczPtcnQYlbGxR9Lm05TaVLwuxIHV1VWZnJwU2yoXSZejTkxMSDwev/J/3ie6jT96V43eX/N1VrrdkY9iUdzZg/z29rZ4QUeZRitfl9VauSYSX8ULem/sKD4nXnfZ5iygrU9G3oROpbWmURur0SBwupW2sLAgLmk8vVdW0njrb87kNnAa0I9RWGsafb1+ZmVv1G/ON7N1YWFrRdoInUb1qqSj8NVMRtA5D6h7o66n0lqffN4tLmbQp1JfjpP0kWJzc1Nc0RE4NTVV9d8Wl06hp1Jnz4GVdIGxt7dn/EX7Rum03dXVVXX61iOiD8VnQxdHRfdDR2JR3JcRqPQXOTAwYG2brR79g6m1Dacj8PnQJ8iR6OuJfDni2tqauKBnirWm0nLE4/QPQeL7KxUaUX+p09PTTlanKysrVVelSiM+60vJUvG+iCIw78Towqa3t9fJ4mZra+vae+/i8qk8Ke5ZHhx+l6AL1EtN+oihOye62PAypN536y2edDQOFqfUwaHPVs4QveLbKrQRujmt053uptTa12yU/nHs7OyUNtX/ZzdIV6j6LoweHZmcZNhehQY6YCUdNRpVf0aj0X9BL59CaKjyEVM2my2NNr1svVxVpjEjkVbp6GgpxS2/YlHvUcT2cRJUQLoiHqh7IN0cA4JjQHAMCI4BwTEgOAYEx4DgGBAcA4JjQHAMCI4BwTEgOAYEx4DgGBAcA4JjQHAMCI4Bwem7cHEhVMm/HrdKl/DH/NMAAAAASUVORK5CYII=\",\"u\":\"\",\"w\":112,\"e\":1},{\"h\":129,\"id\":\"1\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":129,\"e\":1},{\"h\":150,\"id\":\"2\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":150,\"e\":1},{\"h\":125,\"id\":\"3\",\"p\":\"data:image/png;base64,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\",\"u\":\"\",\"w\":125,\"e\":1},{\"id\":\"9\",\"layers\":[{\"ind\":8,\"ty\":2,\"parent\":7,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"0\"},{\"ind\":7,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[37.5,37.5]}},\"ip\":0,\"op\":240.4,\"st\":0}]},{\"id\":\"13\",\"layers\":[{\"ind\":12,\"ty\":4,\"td\":1,\"parent\":6,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[21,21]},\"r\":{\"a\":0,\"k\":21},\"s\":{\"a\":0,\"k\":[42,42]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":11,\"ty\":0,\"tt\":1,\"parent\":6,\"ks\":{},\"w\":42,\"h\":42,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"9\"},{\"ind\":6,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0}]},{\"id\":\"18\",\"layers\":[{\"ind\":17,\"ty\":2,\"parent\":16,\"ks\":{\"s\":{\"a\":0,\"k\":[1550.39,1550.39]}},\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"1\"},{\"ind\":16,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[2.15,2.15]}},\"ip\":0,\"op\":240.4,\"st\":0}]},{\"id\":\"22\",\"layers\":[{\"ind\":21,\"ty\":4,\"td\":1,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[21.5,21.5]},\"r\":{\"a\":0,\"k\":21},\"s\":{\"a\":0,\"k\":[43,43]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":20,\"ty\":0,\"tt\":1,\"ks\":{},\"w\":43,\"h\":43,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"18\"}]},{\"id\":\"27\",\"layers\":[{\"ind\":26,\"ty\":2,\"parent\":25,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"2\"},{\"ind\":25,\"ty\":3,\"ks\":{\"p\":{\"a\":0,\"k\":[0,0]},\"s\":{\"a\":0,\"k\":[28,28]}},\"ip\":0,\"op\":240.4,\"st\":0}]},{\"id\":\"31\",\"layers\":[{\"ind\":30,\"ty\":4,\"td\":1,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[21,21]},\"r\":{\"a\":0,\"k\":21},\"s\":{\"a\":0,\"k\":[42,42]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":29,\"ty\":0,\"tt\":1,\"ks\":{},\"w\":42,\"h\":42,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"27\"}]},{\"id\":\"36\",\"layers\":[{\"ind\":35,\"ty\":2,\"parent\":34,\"ks\":{\"s\":{\"a\":0,\"k\":[204.8,204.8]}},\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"3\"},{\"ind\":34,\"ty\":3,\"ks\":{\"s\":{\"a\":0,\"k\":[16.25,16.25]}},\"ip\":0,\"op\":240.4,\"st\":0}]},{\"id\":\"40\",\"layers\":[{\"ind\":39,\"ty\":4,\"td\":1,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[20.802,20.802]},\"r\":{\"a\":0,\"k\":27.3},\"s\":{\"a\":0,\"k\":[41.604,41.604]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0]},\"o\":{\"a\":0,\"k\":100}}]},{\"ind\":38,\"ty\":0,\"tt\":1,\"ks\":{},\"w\":41.604,\"h\":41.604,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"36\"}]},{\"id\":\"47\",\"layers\":[{\"ind\":46,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.17,4.92],[4.59,9.5],[0.02,4.92],[4.59,0.34],[9.17,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"52\",\"layers\":[{\"ind\":51,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[28,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.13,2.16],[26.53,14.56],[14.13,26.96],[1.72,14.56],[14.13,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.59,1.62],[19.89,10.92],[10.59,20.22],[1.29,10.92],[10.59,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"58\",\"layers\":[{\"ind\":57,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[6.5,6.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[13,13]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[2.53,0],[0,2.53],[-2.53,0],[0,-2.53]],\"o\":[[0,2.53],[-2.53,0],[0,-2.53],[2.53,0],[0,0]],\"v\":[[9.55,4.92],[4.97,9.5],[0.39,4.92],[4.97,0.34],[9.55,4.92]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.06,0.06,0.06,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"63\",\"layers\":[{\"ind\":62,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[14.5,14.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[29,29]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-6.85],[6.85,0],[0.01,6.85],[-6.85,0]],\"o\":[[6.85,0],[0,6.85],[-6.85,0],[0,-6.85],[0,0]],\"v\":[[14.63,2.16],[27.03,14.56],[14.63,26.96],[2.22,14.56],[14.63,2.16]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.95,0.95,0.95,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":2.6}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[0,-5.14],[5.14,0],[0,5.14],[-5.14,0]],\"o\":[[5.14,0],[0,5.14],[-5.14,0],[0,-5.14],[0,0]],\"v\":[[10.97,1.62],[20.27,10.92],[10.97,20.22],[1.67,10.92],[10.97,1.62]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]},{\"id\":\"68\",\"layers\":[{\"ind\":67,\"ty\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"rc\",\"p\":{\"a\":0,\"k\":[64.5,63.5]},\"r\":{\"a\":0,\"k\":0},\"s\":{\"a\":0,\"k\":[129,127]}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0,0,0,0]},\"o\":{\"a\":0,\"k\":0}}]},{\"ind\":0,\"ty\":4,\"ks\":{\"s\":{\"a\":0,\"k\":[133.33,133.33]}},\"ip\":0,\"op\":240.4,\"st\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[15.14,18.15],[-7.72,6.52],[-15.14,-18.14],[1.15,-5.79]],\"o\":[[-7.72,6.51],[-15.14,-18.14],[7.72,-6.51],[13.65,16.35],[0,0]],\"v\":[[92.05,71.58],[46.88,56.68],[35.14,9.62],[76.53,30.68],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[23.19,4.11],[1.75,-9.98],[-23.2,-4.11],[-3.19,6.02]],\"o\":[[1.75,-9.98],[-23.2,-4.11],[-1.75,9.98],[21.81,3.87],[0,0]],\"v\":[[92.05,71.58],[53.22,46.06],[8.05,56.68],[46.88,82.2],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.12,0.64]],\"o\":[[0.23,-0.34],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.2,-0.38]],\"o\":[[-0.06,0.37],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[0.13,-0.37]],\"o\":[[-0.14,0.38],[0,0]],\"v\":[[92.05,71.58],[91.65,72.71]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-0.18,0.49]],\"o\":[[0.18,-0.5],[0,0]],\"v\":[[92.05,71.58],[92.59,70.1]]}}},{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":false,\"i\":[[0,0],[-6.1,-2.23],[8.06,-22.26],[6.24,2.28],[-7.72,21.9]],\"o\":[[7.99,-21.35],[6.24,2.29],[-8.06,22.26],[-6.13,-2.24],[0,0]],\"v\":[[92.59,70.1],[117.16,38.55],[113.87,82.98],[87.99,119.15],[91.65,72.71]]}}},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.79,0.82,1,1]},\"lc\":1,\"lj\":1,\"ml\":4,\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":14.3}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100},\"s\":{\"a\":0,\"k\":[75,75]}}]},{\"ty\":\"gr\",\"it\":[{\"ty\":\"sh\",\"ks\":{\"a\":0,\"k\":{\"c\":true,\"i\":[[0,0],[-6.04,16.7],[4.68,1.71],[6,-16.02],[0.18,-0.26],[0.15,-0.29],[-4.6,-1.68]],\"o\":[[4.68,1.71],[6.04,-16.69],[-4.57,-1.67],[-0.09,0.48],[-0.05,0.28],[-5.79,16.43],[0,0]],\"v\":[[65.99,89.36],[85.4,62.23],[87.87,28.91],[69.45,52.57],[69.04,53.68],[68.73,54.53],[65.99,89.36]]}}},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.41,0.48,0.92,1]},\"o\":{\"a\":0,\"k\":100}},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]},{\"ty\":\"tr\",\"o\":{\"a\":0,\"k\":100}}]}]}]}],\"fr\":60,\"h\":185,\"ip\":0,\"layers\":[{\"ind\":15,\"ty\":0,\"parent\":5,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":45.18,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":63.06,\"s\":[100],\"h\":1},{\"t\":239.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[54,122],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":45.18,\"s\":[54,122],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":63.06,\"s\":[20,134],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[20,134],\"h\":1}]}},\"w\":42,\"h\":42,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"13\"},{\"ind\":24,\"ty\":0,\"parent\":5,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":33.3,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":51.18,\"s\":[100],\"h\":1},{\"t\":239.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[136,117],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":33.3,\"s\":[136,117],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":51.18,\"s\":[157,133],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[157,133],\"h\":1}]}},\"w\":43,\"h\":43,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"22\"},{\"ind\":33,\"ty\":0,\"parent\":5,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":21.48,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":39.36,\"s\":[100],\"h\":1},{\"t\":239.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[103,20],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":21.48,\"s\":[103,20],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":39.36,\"s\":[130,0],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[130,0],\"h\":1}]}},\"w\":42,\"h\":42,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"31\"},{\"ind\":42,\"ty\":0,\"parent\":5,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[0],\"h\":1},{\"t\":9.6,\"s\":[0],\"i\":{\"x\":1,\"y\":1},\"o\":{\"x\":0,\"y\":0}},{\"t\":27.48,\"s\":[100],\"h\":1},{\"t\":239.4,\"s\":[100],\"h\":1}]},\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[26,30],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":9.6,\"s\":[26,30],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":27.48,\"s\":[12,9],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[12,9],\"h\":1}]}},\"w\":42,\"h\":42,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"40\"},{\"ind\":49,\"ty\":0,\"parent\":45,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"47\"},{\"ind\":45,\"ty\":3,\"parent\":44,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.974,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":43.86,\"s\":[4.974,4.541],\"i\":{\"x\":[0,1],\"y\":[1,1]},\"o\":{\"x\":[0.5,0],\"y\":[0,0]}},{\"t\":72.3,\"s\":[1.974,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":87.96,\"s\":[1.974,4.541],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":116.4,\"s\":[6.974,6.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":143.76,\"s\":[6.974,6.541],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":172.2,\"s\":[4.974,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[4.974,4.541],\"h\":1}]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":54,\"ty\":0,\"parent\":50,\"ks\":{},\"w\":28,\"h\":29,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"52\"},{\"ind\":50,\"ty\":3,\"parent\":44,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.026,-3.459]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":44,\"ty\":3,\"parent\":43,\"ks\":{\"p\":{\"a\":0,\"k\":[113.1,16.9]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":60,\"ty\":0,\"parent\":56,\"ks\":{},\"w\":13,\"h\":13,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"58\"},{\"ind\":56,\"ty\":3,\"parent\":55,\"ks\":{\"p\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[4.474,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":43.86,\"s\":[4.474,4.541],\"i\":{\"x\":[0,1],\"y\":[1,1]},\"o\":{\"x\":[0.5,0],\"y\":[0,0]}},{\"t\":72.3,\"s\":[1.474,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":87.96,\"s\":[1.474,4.541],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":116.4,\"s\":[6.474,6.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":143.76,\"s\":[6.474,6.541],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":172.2,\"s\":[4.474,4.541],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[4.474,4.541],\"h\":1}]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":65,\"ty\":0,\"parent\":61,\"ks\":{},\"w\":29,\"h\":29,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"63\"},{\"ind\":61,\"ty\":3,\"parent\":55,\"ks\":{\"p\":{\"a\":0,\"k\":[-3.526,-3.459]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":55,\"ty\":3,\"parent\":43,\"ks\":{\"p\":{\"a\":0,\"k\":[80.6,16.9]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":70,\"ty\":0,\"parent\":66,\"ks\":{},\"w\":129,\"h\":127,\"ip\":0,\"op\":240.4,\"st\":0,\"refId\":\"68\"},{\"ind\":66,\"ty\":3,\"parent\":43,\"ks\":{\"p\":{\"a\":0,\"k\":[-7.926,-7.559]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":43,\"ty\":3,\"parent\":5,\"ks\":{\"a\":{\"a\":0,\"k\":[67.649,55.9]},\"p\":{\"a\":0,\"k\":[100.575,99.459]},\"s\":{\"a\":1,\"k\":[{\"t\":0,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":34.8,\"s\":[100,100],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":82.8,\"s\":[105,105],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":156,\"s\":[105,105],\"i\":{\"x\":[0,0],\"y\":[1,1]},\"o\":{\"x\":[0.5,0.5],\"y\":[0,0]}},{\"t\":204,\"s\":[100,100],\"i\":{\"x\":[1,1],\"y\":[1,1]},\"o\":{\"x\":[0,0],\"y\":[0,0]}},{\"t\":239.4,\"s\":[100,100],\"h\":1}]}},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":5,\"ty\":3,\"parent\":4,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0},{\"ind\":4,\"ty\":3,\"ks\":{},\"ip\":0,\"op\":240.4,\"st\":0}],\"meta\":{\"g\":\"https://jitter.video\"},\"op\":239.4,\"v\":\"5.7.4\",\"w\":206}"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = function (api) {\n  api.cache(true);\n  return {\n    presets: ['babel-preset-expo'],\n    plugins: [\n      'react-native-worklets/plugin',\n    ],\n  };\n};\n"
  },
  {
    "path": "components/ActivityIndicator.tsx",
    "content": "import React, { useEffect } from 'react';\nimport { ViewStyle } from 'react-native';\nimport Animated, {\n  useAnimatedStyle,\n  useSharedValue,\n  withRepeat,\n  withTiming,\n  Easing,\n  cancelAnimation,\n} from 'react-native-reanimated';\nimport Svg, { Circle } from 'react-native-svg';\n\ninterface ActivityIndicatorProps {\n  size?: number;\n  color?: string;\n  style?: ViewStyle;\n}\n\nconst ActivityIndicator: React.FC<ActivityIndicatorProps> = ({\n  size = 32,\n  color = '#000000',\n  style,\n}) => {\n  const rotation = useSharedValue(0);\n\n  useEffect(() => {\n    rotation.value = withRepeat(\n      withTiming(360, {\n        duration: 1000,\n        easing: Easing.linear,\n      }),\n      -1 // Infinite repeat\n    );\n    return () => cancelAnimation(rotation);\n  }, [rotation]);\n\n  const animatedStyle = useAnimatedStyle(() => {\n    return {\n      transform: [{ rotateZ: `${rotation.value}deg` }],\n    };\n  });\n\n  const strokeWidth = Math.max(2, size * 0.1);\n  const radius = (size - strokeWidth) / 2;\n  const circumference = 2 * Math.PI * radius;\n  // 75% filled means 0.75 * circumference is drawn, the rest is gap\n  const strokeDasharray = [circumference * 0.75, circumference];\n\n  return (\n    <Animated.View\n      style={[\n        { width: size, height: size, justifyContent: 'center', alignItems: 'center' },\n        animatedStyle,\n        style,\n      ]}\n    >\n      <Svg width={size} height={size}>\n        <Circle\n          cx={size / 2}\n          cy={size / 2}\n          r={radius}\n          stroke={color}\n          strokeWidth={strokeWidth}\n          strokeDasharray={strokeDasharray}\n          strokeLinecap=\"round\"\n          fill=\"transparent\"\n        />\n      </Svg>\n    </Animated.View>\n  );\n};\n\nexport default ActivityIndicator;\n"
  },
  {
    "path": "components/AndroidHeaderBackground.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport { Platform, PlatformColor, View } from \"react-native\";\n\nexport default function AndroidHeaderBackground() {\n  if(Platform.OS !== \"android\") return null;\n  const theme = useTheme();\n  return (\n    <View style={{ flex: 1, backgroundColor: theme.colors.background, elevation: 4 }} />\n  )\n}\n\nexport const AndroidHeaderProps = {\n  headerBackVisible: Platform.select({ android: false, default: true }),\n  headerBackground: AndroidHeaderBackground\n}\n"
  },
  {
    "path": "components/AppColorsSelector.tsx",
    "content": "import React, { useState, useEffect, useMemo, useCallback } from \"react\";\nimport { FlatList, View } from \"react-native\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { t } from \"i18next\";\n\nimport Typography from \"@/ui/components/Typography\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport { useSettingsStore } from \"@/stores/settings\";\nimport { Colors, AppColors } from \"@/utils/colors\";\nimport adjust from \"@/utils/adjustColor\";\nimport { ImpactFeedbackStyle } from \"expo-haptics\";\n\nexport { Colors, AppColors };\n\ninterface ColorSelectorProps {\n  mainColor: string;\n  backgroundColor: string;\n  name: string;\n  onPress?: () => void;\n  selected: boolean;\n  itemWidth: number;\n}\n\ninterface AppColorsSelectorProps {\n  onChangeColor?: (color: string) => void;\n}\n\nconst ColorSelector = React.memo<ColorSelectorProps>(function ColorSelector({\n  mainColor,\n  backgroundColor,\n  name,\n  onPress,\n  selected,\n  itemWidth\n}) {\n  const theme = useTheme();\n\n  const handlePress = useCallback(() => {\n    onPress?.();\n  }, [onPress]);\n\n  const containerStyle = useMemo(() => ({\n    width: itemWidth,\n    height: itemWidth * 0.95,\n    margin: 6,\n    alignItems: \"center\" as const,\n    justifyContent: \"center\" as const,\n    backgroundColor,\n    borderColor: selected ? mainColor : mainColor + \"50\",\n    borderWidth: selected ? 4 : 2,\n    borderRadius: 25,\n    shadowColor: \"#000\",\n    shadowOffset: { width: 0, height: 0 },\n    shadowOpacity: 0.07,\n    shadowRadius: 5,\n  }), [selected, backgroundColor, mainColor, theme.colors.text, itemWidth]);\n\n  const circleStyle = useMemo(() => {\n    const circleSize = Math.min(itemWidth * 0.4, 50);\n    return {\n      width: circleSize,\n      height: circleSize,\n      backgroundColor: mainColor,\n      borderRadius: circleSize / 2,\n      borderWidth: 3,\n      borderColor: \"#FFFFFF\",\n      shadowColor: \"#000\",\n      shadowOffset: { width: 0, height: 0 },\n      shadowOpacity: 0.25,\n      shadowRadius: 3.615,\n      marginBottom: 6,\n    };\n  }, [mainColor, itemWidth]);\n\n  return (\n    <AnimatedPressable onPress={handlePress} style={containerStyle} hapticFeedback={ImpactFeedbackStyle.Light}>\n      <View style={circleStyle} />\n      <Typography variant=\"h6\" color={mainColor}>\n        {name}\n      </Typography>\n    </AnimatedPressable>\n  );\n});\n\nconst AppColorsSelector = React.memo<AppColorsSelectorProps>(function AppColorsSelector({\n  onChangeColor\n}) {\n  const settingsStore = useSettingsStore(state => state.personalization);\n  const theme = useTheme();\n  const [containerWidth, setContainerWidth] = useState(0);\n\n  const defaultColorData = useMemo(\n    () => AppColors.find(color => color.colorEnum === settingsStore.colorSelected) || AppColors[0],\n    [settingsStore.colorSelected]\n  );\n\n  const [selectedColor, setSelectedColor] = useState<string>(defaultColorData.mainColor);\n  const [color, setColor] = useState<Colors>(settingsStore.colorSelected || Colors.PINK);\n\n  const itemWidth = useMemo(() => {\n    if (containerWidth === 0) return 100;\n    return (containerWidth - 36) / 3;\n  }, [containerWidth]);\n\n  useEffect(() => {\n    const colorData = AppColors.find(color => color.colorEnum === settingsStore.colorSelected) || AppColors[0];\n    setSelectedColor(colorData.mainColor);\n    setColor(colorData.colorEnum);\n  }, [settingsStore.colorSelected]);\n\n  const handleColorPress = useCallback((item: typeof AppColors[0]) => {\n    setSelectedColor(item.mainColor);\n    setColor(item.colorEnum);\n    onChangeColor?.(item.mainColor);\n  }, [onChangeColor]);\n\n  const renderItem = useCallback(({ item }: { item: typeof AppColors[0] }) => (\n    <ColorSelector\n      selected={selectedColor === item.mainColor}\n      mainColor={item.mainColor}\n      backgroundColor={adjust(item.mainColor, theme.dark ? -0.8 : 0.8)}\n      name={t(item.nameKey)}\n      onPress={() => handleColorPress(item)}\n      itemWidth={itemWidth}\n    />\n  ), [selectedColor, theme.dark, handleColorPress, itemWidth]);\n\n  return (\n    <FlatList\n      scrollEnabled={false}\n      data={AppColors}\n      numColumns={3}\n      renderItem={renderItem}\n      keyExtractor={(item) => item.colorEnum.toString()}\n      showsHorizontalScrollIndicator={false}\n      onLayout={(event) => {\n        const { width } = event.nativeEvent.layout;\n        setContainerWidth(width);\n      }}\n      contentContainerStyle={{\n        justifyContent: \"center\",\n        alignItems: \"center\",\n      }}\n      columnWrapperStyle={{\n        justifyContent: \"space-between\",\n        alignItems: \"center\",\n      }}\n      style={{\n        width: \"100%\",\n        overflow: \"hidden\"\n      }}\n      removeClippedSubviews\n      maxToRenderPerBatch={6}\n      windowSize={1}\n    />\n  );\n});\n\nexport default AppColorsSelector;\n"
  },
  {
    "path": "components/AppProviders.tsx",
    "content": "import { ThemeProvider } from '@react-navigation/native';\nimport * as SystemUI from 'expo-system-ui';\nimport React, { useEffect, useMemo } from 'react';\nimport { Platform, useColorScheme } from 'react-native';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\n\nimport { DatabaseProvider } from \"@/database/DatabaseProvider\";\nimport { DEFAULT_MATERIAL_YOU_ENABLED, useSettingsStore } from '@/stores/settings';\nimport { AlertProvider } from '@/ui/components/AlertProvider';\nimport { runsIOS26 } from '@/ui/utils/IsLiquidGlass';\nimport { AppColors } from \"@/utils/colors\";\nimport { createDarkTheme, createDefaultTheme } from '@/utils/theme/Theme';\n\ninterface AppProvidersProps {\n  children: React.ReactNode;\n}\n\nexport function AppProviders({ children }: AppProvidersProps) {\n  const colorScheme = useColorScheme();\n  const selectedTheme = useSettingsStore(state => state.personalization.theme);\n  const selectedColorEnum = useSettingsStore(state => state.personalization.colorSelected);\n  const useMaterialYou = useSettingsStore(state => state.personalization.useMaterialYou) ?? DEFAULT_MATERIAL_YOU_ENABLED;\n\n  const color = useMemo(() => {\n    const color = selectedColorEnum !== null ? AppColors.find(appColor => appColor.colorEnum === selectedColorEnum) : null;\n    return color || AppColors[0];\n  }, [selectedColorEnum]);\n\n  // Memoize theme selection to prevent unnecessary re-computations\n  const theme = useMemo(() => {\n    const defaultTheme = createDefaultTheme(useMaterialYou, color.mainColor);\n    const darkTheme = createDarkTheme(useMaterialYou, color.mainColor);\n    const newScheme = selectedTheme === 'auto' ? (colorScheme === 'dark' ? darkTheme : defaultTheme) : (selectedTheme === 'dark' ? darkTheme : defaultTheme);\n    return newScheme;\n  }, [colorScheme, color, selectedTheme, useMaterialYou]);\n\n  // Memoize background color to prevent string recreation\n  const backgroundColor = useMemo(() => {\n    return colorScheme === 'dark' ? '#000000' : '#F5F5F5';\n  }, [colorScheme]);\n\n  // Combined effect for system UI updates to reduce effect overhead\n  useEffect(() => {\n    if (runsIOS26) {\n      SystemUI.setBackgroundColorAsync(backgroundColor);\n    }\n    else {\n      SystemUI.setBackgroundColorAsync(\"#000000\");\n    }\n  }, [backgroundColor]);\n\n  return (\n    <GestureHandlerRootView style={{ flex: 1, backgroundColor: \"black\" }}>\n      <DatabaseProvider>\n        <ThemeProvider value={theme}>\n          <AlertProvider>\n            {children}\n          </AlertProvider>\n        </ThemeProvider>\n      </DatabaseProvider>\n    </GestureHandlerRootView>\n  );\n}\n"
  },
  {
    "path": "components/DevModeNotice.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\r\nimport { Code } from \"lucide-react-native\";\r\nimport React, { memo } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport List from \"@/ui/components/List\";\r\nimport Stack from \"@/ui/components/Stack\";\r\nimport Typography from \"@/ui/components/Typography\";\r\n\r\nfunction DevModeNotice() {\r\n  const { t } = useTranslation();\r\n  const { colors } = useTheme();\r\n\r\n  return (\r\n    <List disablePadding>\r\n      <Stack\r\n        gap={12}\r\n        vAlign=\"center\"\r\n        hAlign=\"center\"\r\n        padding={20}\r\n      >\r\n        <Stack\r\n          vAlign=\"center\"\r\n          hAlign=\"center\"\r\n          padding={10}\r\n          inline\r\n          backgroundColor={colors.primary + \"25\"}\r\n          radius={15}\r\n        >\r\n          <Code strokeWidth={2} size={27} color={colors.primary} />\r\n        </Stack>\r\n        <Stack gap={2} vAlign=\"center\" hAlign=\"center\">\r\n          <Typography align=\"center\" variant=\"h4\">\r\n            {t(\"TabDevModeNotice_Title\")}\r\n          </Typography>\r\n          <Typography align=\"center\" variant=\"body1\" color=\"secondary\">\r\n            {t(\"TabDevModeNotice_Details\")}\r\n          </Typography>\r\n        </Stack>\r\n      </Stack>\r\n    </List>\r\n  );\r\n}\r\n\r\nexport default DevModeNotice;"
  },
  {
    "path": "components/FakeSplash.tsx",
    "content": "import { SplashScreen } from \"expo-router\";\nimport { VideoSource } from 'expo-video';\nimport React from \"react\";\nimport { Image } from \"react-native\";\nimport Reanimated, { Easing, withDelay, withTiming } from \"react-native-reanimated\";\n\nconst assetId = require('@/assets/video/splash.mp4');\n\nconst videoSource: VideoSource = {\n  assetId\n};\n\nexport const PapillonSplashOut = () => {\n  \"worklet\";\n  return {\n    initialValues: {\n      opacity: 1,\n    },\n    animations: {\n      opacity: withDelay(100, withTiming(0, {\n        duration: 250,\n        easing: Easing.out(Easing.ease),\n      })),\n    },\n  };\n};\n\nconst FakeSplash = ({ isAppReady, instant }: { isAppReady: boolean, instant?: boolean }) => {\n  if (instant && isAppReady) {\n    SplashScreen.hideAsync();\n    return null;\n  }\n\n  return (\n    <Reanimated.View\n      style={{\n        flex: 1,\n        width: \"100%\",\n        height: \"100%\",\n        position: \"absolute\",\n        top: 0,\n        left: 0,\n        zIndex: 9999,\n        backgroundColor: \"#29947A\",\n        display: \"flex\",\n        justifyContent: \"center\",\n        alignItems: \"center\",\n      }}\n      exiting={PapillonSplashOut}\n    >\n      <Image\n        source={require('@/assets/images/splash.png')}\n        style={{\n          width: \"100%\",\n          height: \"100%\",\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          zIndex: -1,\n        }}\n        resizeMode=\"cover\"\n      />\n    </Reanimated.View>\n  );\n};\n\nexport default FakeSplash;"
  },
  {
    "path": "components/Log/LogIcon.tsx",
    "content": "import { AlertCircle, Info, TriangleAlert } from 'lucide-react-native';\r\nimport React from 'react';\r\nimport { View } from 'react-native';\r\n\r\nimport { LogType } from '@/stores/logs/types';\r\n\r\nconst ICON_COLORS: Record<LogType, string> = {\r\n  ERROR: '#BE0B00',\r\n  WARN: '#CF6B0F',\r\n  INFO: '#0E7CCB',\r\n  LOG: '#AAA',\r\n};\r\n\r\nconst ICON_COMPONENTS: Record<LogType, React.ComponentType<{ color: string; size: number }>> = {\r\n  ERROR: AlertCircle,\r\n  WARN: TriangleAlert,\r\n  INFO: Info,\r\n  LOG: Info,\r\n};\r\n\r\nconst LogIcon: React.FC<{ type: LogType }> = ({ type }) => {\r\n  const backgroundColor = ICON_COLORS[type] || ICON_COLORS.LOG;\r\n  const Icon = ICON_COMPONENTS[type] || ICON_COMPONENTS.LOG;\r\n\r\n  return (\r\n    <View\r\n      style={{\r\n        width: 35,\r\n        height: 35,\r\n        borderRadius: 12,\r\n        alignItems: 'center',\r\n        justifyContent: 'center',\r\n        backgroundColor,\r\n      }}\r\n    >\r\n      <Icon color=\"#fff\" size={24} />\r\n    </View>\r\n  );\r\n};\r\n\r\nexport default LogIcon;\r\n"
  },
  {
    "path": "components/ModalOverhead.tsx",
    "content": "import Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography, { Variant } from \"@/ui/components/Typography\";\nimport adjust from \"@/utils/adjustColor\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { t } from \"i18next\";\nimport React from \"react\";\nimport { Platform, Text, View, ViewStyle } from \"react-native\";\n\nconst ModalOverhead = ({ style, overhead, overtitle, color, emoji, subject, subjectVariant = \"title\", title, date, dateFormat }: { style?: ViewStyle, overhead?: React.ReactNode, overtitle?: string, color: string, emoji: string, subject: string, subjectVariant?: Variant, title?: string, date?: Date, dateFormat?: Intl.DateTimeFormatOptions }) => {\n  const theme = useTheme();\n\n  return (\n    <Stack\n      vAlign=\"center\"\n      hAlign=\"center\"\n      gap={4}\n      padding={[20, 0]}\n      style={style}\n    >\n      <View\n        style={{\n          backgroundColor: Platform.OS === 'ios' ? color + \"22\" : \"transparent\",\n          width: 48,\n          height: 48,\n          borderRadius: 120,\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          borderColor: color + \"22\",\n          borderWidth: Platform.OS === 'ios' ? 1 : 0,\n        }}\n      >\n        <Text\n          style={{\n            fontSize: Platform.OS === 'ios' ? 28 : 36,\n          }}\n        >\n          {emoji}\n        </Text>\n      </View>\n\n      {overhead}\n\n      {overtitle && (\n        <Typography\n          variant=\"body1\"\n          color='secondary'\n        >\n          {overtitle}\n        </Typography>\n      )}\n      {subject && (\n        <Typography\n          variant={subjectVariant}\n          align=\"center\"\n          color={adjust(color, theme.dark ? 0.3 : -0.3)}\n        >\n          {subject}\n        </Typography>\n      )}\n      {title && (\n        <Typography\n          variant=\"body1\"\n        >\n          {title}\n        </Typography>\n      )}\n      {date && (\n        <Typography\n          variant=\"body1\"\n          color='secondary'\n        >\n          {new Date(date).toLocaleDateString(undefined, dateFormat ? dateFormat : {\n            day: \"numeric\",\n            month: \"long\",\n            year: \"numeric\",\n          })}\n        </Typography>\n      )}\n    </Stack>\n  )\n}\n\nconst ModalOverHeadScore = ({ color, score, outOf }: { color: string, score: string, outOf: number }) => {\n  const theme = useTheme();\n\n  return (\n    <Stack\n      direction='horizontal'\n      vAlign=\"end\"\n      hAlign=\"end\"\n      gap={2}\n      style={{ marginBottom: -4 }}\n    >\n      <Typography variant='h0' weight='medium' inline color={adjust(color, theme.dark ? 0.3 : -0.3)}>\n        {score}\n      </Typography>\n      <Typography variant='h3' weight='semibold' color={adjust(color, theme.dark ? 0.3 : -0.3)} style={{ marginBottom: 7, opacity: 0.5 }}>\n        /{outOf}\n      </Typography>\n    </Stack>\n  )\n}\n\nexport default ModalOverhead;\nexport { ModalOverHeadScore };"
  },
  {
    "path": "components/RootNavigator.tsx",
    "content": "import { useTheme } from '@react-navigation/native';\nimport { Stack } from 'expo-router';\nimport { t } from 'i18next';\nimport React, { useMemo } from 'react';\nimport { Platform, StatusBar, View } from 'react-native';\n\nimport {\n  AI_SCREEN_OPTIONS,\n  ALERT_SCREEN_OPTIONS,\n  CHANGELOG_SCREEN_OPTIONS,\n  CONSENT_SCREEN_OPTIONS,\n  DEMO_SCREEN_OPTIONS,\n  DEVMODE_SCREEN_OPTIONS,\n  STACK_SCREEN_OPTIONS\n} from '@/constants/LayoutScreenOptions';\nimport getCorners from '@/ui/utils/Corners';\nimport { runsIOS26 } from '@/ui/utils/IsLiquidGlass';\nimport { screenOptions } from '@/utils/theme/ScreenOptions';\nimport AndroidHeaderBackground from './AndroidHeaderBackground';\n\nexport function RootNavigator() {\n  const theme = useTheme();\n  const corners = getCorners();\n\n  // Memoize combined screen options to prevent object recreation\n  const stackScreenOptions = useMemo(() => ({\n    ...screenOptions,\n    ...STACK_SCREEN_OPTIONS,\n    contentStyle: {\n      backgroundColor: theme.colors.background\n    }\n  }), [theme]);\n\n  return (\n    <View style={{ flex: 1, backgroundColor: Platform.OS === \"android\" ? theme.colors.background : undefined }}>\n      {Platform.OS === \"android\" && <StatusBar barStyle={theme.dark ? \"light-content\" : \"dark-content\"} animated />}\n      <Stack initialRouteName='(tabs)' screenOptions={stackScreenOptions}>\n\n        <Stack.Screen name=\"(tabs)\" options={{ headerShown: false, gestureEnabled: false }} />\n        <Stack.Screen name=\"(onboarding)\" options={{ headerShown: false }} />\n        <Stack.Screen name=\"(new)\" options={{ headerShown: false, presentation: \"modal\" }} />\n        <Stack.Screen name=\"(settings)\" options={{ headerShown: false, presentation: \"modal\" }} />\n        <Stack.Screen name=\"(modals)\" options={{ headerShown: false, presentation: \"modal\" }} />\n        <Stack.Screen name=\"page\" />\n        <Stack.Screen name=\"demo\" options={DEMO_SCREEN_OPTIONS} />\n        <Stack.Screen name=\"consent\" options={CONSENT_SCREEN_OPTIONS} />\n        <Stack.Screen name=\"changelog\" options={CHANGELOG_SCREEN_OPTIONS} />\n        <Stack.Screen name=\"ai\" options={AI_SCREEN_OPTIONS} />\n        <Stack.Screen name=\"devmode\" options={DEVMODE_SCREEN_OPTIONS} />\n        <Stack.Screen name=\"alert\" options={ALERT_SCREEN_OPTIONS} />\n\n        <Stack.Screen\n          name=\"(modals)/wrapped\"\n          options={{\n            headerShown: false,\n            presentation: \"fullScreenModal\",\n            animation: \"flip\",\n            contentStyle: {\n              borderRadius: corners > 2 ? corners - 2 : 0,\n              overflow: \"hidden\"\n            }\n          }}\n        />\n\n        <Stack.Screen\n          name=\"(modals)/wallpaper\"\n          options={{\n            presentation: \"modal\",\n            headerLargeTitle: false,\n            headerTitle: t(\"Modal_Wallpaper_Title\"),\n            contentStyle: {\n              backgroundColor: theme.colors.card\n            },\n            headerBackground: AndroidHeaderBackground\n          }}\n        />\n\n        <Stack.Screen\n          name=\"(modals)/profile\"\n          options={{\n            presentation: \"modal\",\n            headerLargeTitle: false,\n            headerTitle: t(\"Modal_Profile_Title\"),\n            headerBackground: AndroidHeaderBackground\n          }}\n        />\n        <Stack.Screen\n          name=\"(modals)/task\"\n          options={{\n            headerShown: Platform.OS !== 'ios',\n            headerTitle: t(\"Modal_Task_Title\"),\n            headerTransparent: true,\n            headerLargeTitle: false,\n            presentation: \"modal\",\n            headerBackground: AndroidHeaderBackground\n          }}\n        />\n        <Stack.Screen\n          name=\"(modals)/grade\"\n          options={{\n            headerShown: Platform.OS !== 'ios',\n            headerTitle: t(\"Modal_Grades_Title\"),\n            headerLargeTitle: false,\n            headerTransparent: true,\n            presentation: \"modal\",\n            headerBackground: AndroidHeaderBackground\n          }}\n        />\n        <Stack.Screen\n          name=\"(modals)/news\"\n          options={{\n            headerShown: true,\n            headerTitle: \"\",\n            headerLargeTitle: false,\n            presentation: \"modal\",\n            headerBackground: AndroidHeaderBackground\n          }}\n        />\n        <Stack.Screen\n          name=\"(modals)/course\"\n          options={{\n            headerShown: Platform.OS !== 'ios',\n            headerTitle: t(\"Modal_Course_Title\"),\n            headerLargeTitle: false,\n            headerTransparent: true,\n            presentation: \"modal\",\n            headerBackground: AndroidHeaderBackground,\n            contentStyle: {\n              borderRadius: Platform.OS === 'ios' ? 30 : 0,\n              overflow: Platform.OS === 'ios' ? \"hidden\" : \"visible\",\n            }\n          }}\n        />\n        <Stack.Screen\n          name=\"(modals)/notifications\"\n          options={{\n            headerShown: false,\n            headerTitle: \"Notifications\",\n            headerTransparent: runsIOS26,\n            headerLargeTitle: false,\n            presentation: \"formSheet\",\n            sheetGrabberVisible: true,\n            sheetAllowedDetents: [0.5, 0.75, 1],\n            sheetCornerRadius: runsIOS26 ? undefined : 30,\n            contentStyle: {\n              backgroundColor: runsIOS26 ? 'transparent' : undefined\n            }\n          }}\n        />\n\n        <Stack.Screen\n          name=\"(features)/(news)/news\"\n          options={{\n            headerShown: true,\n            headerTitle: t(\"Tab_News\"),\n            headerTransparent: runsIOS26,\n            headerLargeTitle: false,\n          }}\n        />\n\n        <Stack.Screen\n          name=\"(features)/(news)/specific\"\n          options={{\n            headerShown: true,\n            headerTitle: t(\"Tab_News\"),\n            headerTransparent: runsIOS26,\n            headerLargeTitle: false,\n          }}\n        />\n\n        <Stack.Screen\n          name=\"(features)/soon\"\n          options={{\n            headerShown: Platform.OS !== 'ios',\n            presentation: Platform.select({\n              ios: \"formSheet\",\n              default: \"modal\"\n            }),\n            sheetGrabberVisible: true,\n            sheetAllowedDetents: \"fitToContents\",\n            headerTitle: t(\"Modal_Soon\"),\n            headerBackground: AndroidHeaderBackground\n          }}\n        />\n\n        <Stack.Screen\n          name=\"(features)/(cards)/cards\"\n          options={{\n            headerShown: false,\n            presentation: \"modal\",\n            headerTitle: t(\"Profile_QRCards\"),\n            headerTransparent: runsIOS26,\n          }}\n        />\n\n        <Stack.Screen\n          name=\"(features)/(cards)/specific\"\n          options={{\n            headerShown: false,\n            presentation: \"modal\",\n            headerTitle: t(\"Profile_QRCards\"),\n            headerTransparent: runsIOS26,\n          }}\n        />\n\n        <Stack.Screen\n          name=\"(features)/(cards)/qrcode\"\n          options={{\n            headerShown: false,\n            presentation: \"transparentModal\",\n            headerTitle: \"QR-Code\",\n            animation: \"fade\"\n          }}\n        />\n\n        <Stack.Screen\n          name=\"(features)/attendance\"\n          options={{\n            headerShown: false,\n            headerTitle: t(\"Tab_Attendance\"),\n            headerTransparent: runsIOS26,\n            headerLargeTitle: true,\n            presentation: \"modal\"\n          }}\n        />\n      </Stack>\n    </View>\n  );\n}\n"
  },
  {
    "path": "components/SettingsHeader.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\"\r\nimport { useTheme } from \"@react-navigation/native\"\r\nimport { Image, ImageSourcePropType, View, Switch } from \"react-native\"\r\nimport Stack from \"@/ui/components/Stack\"\r\nimport Typography from \"@/ui/components/Typography\"\r\nimport Icon from \"@/ui/components/Icon\"\r\nimport NativeSwitch from \"@/ui/native/NativeSwitch\"\r\n\r\ninterface SettingsHeaderProps {\r\n  color: string\r\n  title: string\r\n  description: string\r\n  iconName?: string\r\n  imageSource?: ImageSourcePropType\r\n  height?: number\r\n  showSwitch?: boolean\r\n  switchValue?: boolean\r\n  onSwitchChange?: (value: boolean) => void\r\n  switchLabel?: string\r\n  switchColor?: string\r\n  disableMargin?: boolean\r\n}\r\n\r\nexport default function SettingsHeader({\r\n  color,\r\n  title,\r\n  description,\r\n  iconName,\r\n  imageSource,\r\n  height = 280,\r\n  showSwitch = false,\r\n  switchValue = false,\r\n  onSwitchChange,\r\n  switchLabel,\r\n  switchColor,\r\n  disableMargin = false,\r\n}: SettingsHeaderProps) {\r\n  const theme = useTheme()\r\n  const { colors } = theme\r\n\r\n  return (\r\n    <Stack\r\n      direction=\"vertical\"\r\n      style={{\r\n        padding: 13,\r\n        backgroundColor: color,\r\n        borderRadius: 25,\r\n        height: imageSource ? height : undefined,\r\n        justifyContent: imageSource ? \"flex-end\" : \"center\",\r\n        borderWidth: 1,\r\n        borderColor: colors.border\r\n      }}\r\n      hAlign=\"center\"\r\n    >\r\n      {imageSource && (\r\n        <View style={{ justifyContent: \"flex-end\", alignItems: \"center\", marginBottom: disableMargin ? -5 : 5 }}>\r\n          <Image\r\n            source={imageSource}\r\n            style={{\r\n              maxWidth: 350,\r\n              maxHeight: 130\r\n            }}\r\n            resizeMode=\"contain\"\r\n          />\r\n        </View>\r\n      )}\r\n\r\n      <Stack\r\n        flex\r\n        direction=\"horizontal\"\r\n        hAlign=\"center\"\r\n        vAlign=\"center\"\r\n        style={{\r\n          backgroundColor: colors.item,\r\n          gap: 10,\r\n          padding: 18,\r\n          borderRadius: 15,\r\n          elevation: 2,\r\n        }}\r\n      >\r\n        {iconName && (\r\n          <Icon>\r\n            <Papicons name={iconName} opacity={0.6} />\r\n          </Icon>\r\n        )}\r\n\r\n        <Stack flex style={{ flex: 1, gap: 0 }}>\r\n          <Typography variant=\"title\">{title}</Typography>\r\n          <Typography variant=\"caption\" color=\"secondary\">\r\n            {description}\r\n          </Typography>\r\n        </Stack>\r\n        {showSwitch && (\r\n          <Stack direction=\"horizontal\" style={{ alignItems: \"center\", gap: 8 }}>\r\n            {switchLabel && (\r\n              <Typography variant=\"body2\" style={{ flex: 1 }}>\r\n                {switchLabel}\r\n              </Typography>\r\n            )}\r\n            <NativeSwitch\r\n              value={switchValue}\r\n              onValueChange={onSwitchChange}\r\n              trackColor={{ false: colors.border, true: switchColor }}\r\n              thumbColor={switchValue ? \"#FFFFFF\" : \"#f4f3f4\"}\r\n            />\r\n          </Stack>\r\n        )}\r\n      </Stack>\r\n    </Stack>\r\n  )\r\n}\r\n"
  },
  {
    "path": "components/Transit.tsx",
    "content": "import { Cross, Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport * as Linking from \"expo-linking\";\nimport * as Location from \"expo-location\";\nimport * as React from \"react\";\nimport { useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Alert, Dimensions, TouchableOpacity, View } from \"react-native\";\nimport { Text } from \"react-native\";\nimport Svg, { Path } from \"react-native-svg\";\nimport { PathProps } from \"react-native-svg/src/elements/Path\";\n\nimport { AvailableTransportServices } from \"@/constants/AvailableTransportServices\";\nimport * as TransitService from \"@/services/transit\";\nimport { Route } from \"@/services/transit/models/Route\";\nimport { TransportAddress } from \"@/stores/account/types\";\nimport Typography from \"@/ui/components/Typography\";\n\nconst TransitLogo = (props: PathProps) => (\n  <Svg width={12} height={12} fill=\"none\" viewBox=\"0 0 14 14\">\n    <Path\n      {...props}\n      fillOpacity={0.5}\n      fillRule=\"evenodd\"\n      d=\"M9.713 0A3.887 3.887 0 0 1 13.6 3.885l.001.984v.294c0 .035-.034.056-.062.04a2.416 2.416 0 0 0-1.136-.28c-.41 0-.797.1-1.137.28a.045.045 0 0 1-.061-.016.045.045 0 0 1-.006-.023v-.293l-.003-.983a1.485 1.485 0 0 0-2.542-1.07 1.484 1.484 0 0 0-.425 1.068v.064l-.026 5.212v.111a3.887 3.887 0 0 1-7.774.001v-.869l-.002-.409c0-.035.034-.056.063-.04.34.18.726.281 1.136.281.41 0 .797-.101 1.136-.281a.045.045 0 0 1 .068.04l.001.407v.255l.002.612a1.484 1.484 0 1 0 2.967.003V9.21c.003-.563.022-4.7.026-5.26v-.064A3.887 3.887 0 0 1 9.713 0Zm3.87 9.546v.384l.001.207.003 1.49a1.201 1.201 0 1 1-2.403.006l-.003-1.496v-.593c0-.03.034-.053.066-.036.337.178.721.28 1.129.28.412 0 .8-.099 1.141-.28.029-.016.066.003.066.038ZM12.38 5.733a1.621 1.621 0 0 1 1.144 2.764 1.621 1.621 0 0 1-2.289 0 1.621 1.621 0 0 1 0-2.29 1.621 1.621 0 0 1 1.145-.474ZM1.62 4.187A1.621 1.621 0 0 1 2.764 6.95a1.621 1.621 0 0 1-2.29 0 1.621 1.621 0 0 1 .001-2.29 1.622 1.622 0 0 1 1.145-.474ZM1.619.325a1.201 1.201 0 0 1 1.204 1.2l.004 1.602v.485c0 .031-.035.053-.066.037a2.418 2.418 0 0 0-1.13-.28c-.412 0-.8.099-1.141.28-.028.015-.065-.002-.065-.037v-.293l-.001-.192L.42 1.53A1.201 1.201 0 0 1 1.62.325Z\"\n      clipRule=\"evenodd\"\n    />\n  </Svg>\n);\n\nconst Dot = (params: { opacity: number }): React.ReactNode => {\n  const theme = useTheme();\n\n  return (\n    <View\n      style={{\n        width: 7,\n        height: 7,\n        borderRadius: 7,\n        backgroundColor: theme.colors.text,\n        opacity: params.opacity,\n      }}\n    />\n  );\n};\n\nexport interface TransitProps {\n  isDeparture: boolean;\n  homeAddress?: TransportAddress;\n  schoolAddress?: TransportAddress;\n  targetTime: number;\n  service: string;\n}\n\nconst routeIcons: { [key: string]: string } = {\n  \"bus\": \"Bus\",\n  \"metro\": \"Metro\",\n  \"train\": \"Bus\",\n  \"tram\": \"Tramway\",\n  \"tramway\": \"Tramway\",\n};\n\nexport const Transit = ({\n  isDeparture,\n  homeAddress,\n  schoolAddress,\n  targetTime,\n  service,\n}: TransitProps): React.ReactNode | null => {\n  const transit: TransitService.default = new TransitService.default();\n  const theme = useTheme();\n  const { t } = useTranslation();\n  const [status] = Location.useForegroundPermissions();\n\n  const [routeFound, setRouteFound] = React.useState(false);\n  const [error, setError] = React.useState<{\n    title: string;\n    description: string;\n  } | null>(null);\n  const [_transitRoutes, setTransitRoutes] = React.useState<Route[]>([]);\n  const [routeStartTime, setRouteStartTime] = React.useState(0);\n  const [routeIcon, setRouteIcon] = React.useState<string | undefined>(null);\n  const [routesCount, setRoutesCount] = React.useState(0);\n\n  const getTransportResult = async () => {\n    if (service !== \"transit\") {\n      return;\n    }\n    try {\n      if (schoolAddress === undefined || homeAddress === undefined) {\n        throw new Error(\"Transport_Error_Address_Not_Set\");\n      }\n\n      const from = isDeparture ? homeAddress : schoolAddress;\n      const to = isDeparture ? schoolAddress : homeAddress;\n\n      if (to.firstTitle === \"current_location\") {\n        throw new Error(\"Transport_Error_Cant_Go_To_Current_Location\");\n      }\n\n      const departureLocation = await getFromLocation(from);\n      const routeOption: {\n        locale: string;\n        arrivalTime?: number;\n        leaveTime?: number;\n      } = { locale: \"fr\" };\n\n      if (isDeparture) {\n        routeOption.arrivalTime = targetTime;\n      } else {\n        routeOption.leaveTime = targetTime;\n      }\n\n      const routes = await transit.plan(\n        departureLocation.latitude,\n        departureLocation.longitude,\n        to.latitude,\n        to.longitude,\n        routeOption\n      );\n\n      if (routes.results.length > 0) {\n        setRouteFound(true);\n        const selectedTrip = routes.results[0];\n        const allRoutes = selectedTrip.legs.flatMap(leg =>\n          leg.leg_mode === \"transit\" && leg.routes.length > 0\n            ? [leg.routes[0]]\n            : []\n        );\n        setTransitRoutes([...allRoutes].splice(0, 2));\n        setRoutesCount(allRoutes.length);\n\n        const routeType = allRoutes.length > 0 ? allRoutes[0].mode_name.toLowerCase().normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\") : null;\n\n        if (routeType && routeIcons[routeType]) {\n          setRouteIcon(routeIcons[routeType]);\n        } else {\n          setRouteIcon(null);\n        }\n\n        setRouteStartTime(Number(selectedTrip.start_time));\n      }\n    } catch (e: unknown) {\n      setError({\n        title: `${(e as Error).message}_Title`,\n        description: `${(e as Error).message}_Description`,\n      });\n    }\n  };\n\n  const formatStartTime = (timestamp: number): string => {\n    const date = new Date(timestamp * 1000);\n    const now = new Date().getTime();\n    const toNow = (date.getTime() - now);\n\n    if (toNow < 0) {\n      return t(\"Transport_Open_In\");\n    }\n\n    const minutes = Math.floor(toNow / 60);\n    const hours = Math.floor(toNow / (60 * 60));\n\n    if (hours < 1) {\n      return `${t(\"Transport_Leave_In\")} ${minutes}min - ${t(\"Transport_From\")}`;\n    } else if (hours < 2) {\n      return `${t(\"Transport_Leave_In\")} ${hours}h${minutes} - ${t(\"Transport_From\")}`;\n    }\n\n    return `${t(\"Transport_Leave_At\")} ${date.toLocaleTimeString(\"fr-FR\", { hour: \"numeric\", minute: \"numeric\" })} - ${t(\"Transport_From\")}`;\n  };\n\n  const getFromLocation = async (\n    from: TransportAddress\n  ): Promise<{\n    longitude: number;\n    latitude: number;\n  }> => {\n    if (from.firstTitle === \"current_location\") {\n      if (!status?.granted) {\n        throw new Error(\"Transport_Error_Location\");\n      }\n      const location = await Location.getCurrentPositionAsync();\n\n      return {\n        latitude: location.coords.latitude,\n        longitude: location.coords.longitude,\n      };\n    }\n    return {\n      latitude: from.latitude,\n      longitude: from.longitude,\n    };\n  };\n\n  const openInDefaultApp = () => {\n    const app:\n      | {\n        id: string;\n        name: string;\n        icon: unknown;\n        generateDeeplink: (\n          from: TransportAddress,\n          to: TransportAddress,\n          isDeparture: boolean,\n          targetTime: number\n        ) => string;\n      }\n      | undefined = AvailableTransportServices.find(el => el.id === service);\n\n    if (app === undefined) {\n      Alert.alert(\n        t(\"Transport_Error_Unknown_Service_Title\"),\n        t(\"Transport_Error_Unknown_Service_Description\")\n      );\n      return;\n    }\n\n    const from = isDeparture ? homeAddress : schoolAddress;\n    const to = isDeparture ? schoolAddress : homeAddress;\n    const url = app.generateDeeplink(from!, to!, isDeparture, targetTime);\n\n    if (!Linking.canOpenURL(url)) {\n      Alert.alert(\n        t(\"Transport_Error_Cant_Open_Deeplink_Title\"),\n        t(\"Transport_Error_Cant_Open_Deeplink_Description\")\n      );\n      return;\n    }\n    Linking.openURL(url);\n  }\n\n  useEffect(() => {\n    if (status !== null) {\n      getTransportResult();\n    }\n  }, [status]);\n\n  if (homeAddress === undefined || schoolAddress === undefined) {\n    return null;\n  }\n\n  if (homeAddress.firstTitle === \"current_location\" && !isDeparture) {\n    return null;\n  }\n\n  return (\n    <TouchableOpacity\n      style={{\n        height: 60,\n        flexDirection: \"row\",\n        gap: 12,\n        alignItems: \"center\",\n      }}\n      onPress={openInDefaultApp}\n    >\n      <View\n        style={{\n          width: 57,\n          height: \"100%\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          gap: 8,\n          flexDirection: isDeparture ? \"column\" : \"column-reverse\",\n        }}\n      >\n        <Dot opacity={theme.dark ? 0.2 : 0.05} />\n        <Dot opacity={theme.dark ? 0.25 : 0.1} />\n        <Dot opacity={theme.dark ? 0.3 : 0.2} />\n      </View>\n      {error ? (\n        <View\n          style={{\n            flex: 1,\n            justifyContent: \"center\",\n          }}\n        >\n          <View\n            style={{\n              flexDirection: \"row\",\n              alignItems: \"center\",\n              gap: 2,\n              marginBottom: -5,\n            }}\n          >\n            <Cross color={theme.colors.text + \"9F\"} />\n            <Typography\n              variant={\"h5\"}\n              color={theme.colors.text + \"9F\"}\n              inline={true}\n              numberOfLines={1}\n              style={{ width: \"90%\" }}\n            >\n              {error.title}\n            </Typography>\n          </View>\n          <Typography\n            variant={\"caption\"}\n            color={\"secondary\"}\n            numberOfLines={1}\n            style={{ width: \"100%\" }}\n          >\n            {error.description}\n          </Typography>\n        </View>\n      ) : (\n        <View\n          style={{\n            flex: 1,\n            justifyContent: \"center\"\n          }}\n        >\n          <View\n            style={{\n              flexDirection: \"row\",\n              alignItems: \"center\",\n              gap: 4,\n              marginBottom: -5,\n              width: Dimensions.get(\"window\").width - 108,\n            }}\n          >\n            <Papicons name={\"ArrowRightBox\"} color={theme.colors.text + \"9F\"} />\n\n            {_transitRoutes.length > 0 && (\n              <TransitRoutes routes={_transitRoutes} routesCount={routesCount} routeIcon={routeIcon} />\n            )}\n\n            <Typography\n              variant={\"h5\"}\n              color={theme.colors.text + \"9F\"}\n              inline={true}\n              numberOfLines={1}\n              style={{ flex: 1, overflow: \"hidden\" }}\n            >\n              {isDeparture ? schoolAddress.firstTitle : homeAddress.firstTitle}\n            </Typography>\n          </View>\n          <View\n            style={{\n              flexDirection: \"row\",\n              alignItems: \"center\",\n              gap: 4,\n            }}\n          >\n            <Typography variant={\"caption\"} color={\"secondary\"}>\n              {routeFound\n                ? `${formatStartTime(routeStartTime)}`\n                : t(\"Transport_Open_In\")}\n            </Typography>\n            {service === \"transit\" && <TransitLogo fill={theme.colors.text} />}\n            <Typography variant={\"caption\"} color={\"secondary\"}>\n              {AvailableTransportServices.find(el => el.id === service)?.name ??\n                t(\"Transport_Maps_App\")}\n            </Typography>\n          </View>\n        </View>\n      )}\n    </TouchableOpacity>\n  );\n};\n\nconst TransitRoutes = ({ routes, routesCount, routeIcon }: { routes: Route[]; routesCount: number; routeIcon: string | null }): React.ReactNode => {\n  const theme = useTheme();\n\n  return (\n    <View\n      style={{\n        flexDirection: \"row\",\n        alignItems: \"center\",\n        gap: 4,\n        overflow: \"hidden\",\n        marginRight: 2,\n      }}\n    >\n      {routeIcon && <Papicons name={routeIcon} color={theme.colors.text + \"9F\"} style={{ marginRight: -1 }} />}\n\n      {routes.map((route, index) => (\n        <View key={index}\n          style={{\n            backgroundColor: '#' + route.route_color,\n            height: 22,\n            paddingHorizontal: 6,\n            borderRadius: 80,\n            borderCurve: \"continuous\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n          }}\n        >\n          <Text\n            style={{\n              color: '#' + route.route_text_color,\n              fontSize: 17,\n              fontFamily: \"bold\",\n              alignItems: \"center\",\n              minWidth: 10,\n              textAlign: \"center\",\n            }}\n          >\n            {route.route_short_name}\n          </Text>\n        </View>\n      ))}\n\n      {routesCount > routes.length && (\n        <View\n          style={{\n            borderColor: theme.colors.text + \"9F\",\n            borderWidth: 1,\n            height: 22,\n            paddingHorizontal: 6,\n            borderRadius: 80,\n            borderCurve: \"continuous\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n          }}\n        >\n          <Text\n            style={{\n              color: theme.colors.text + \"9F\",\n              fontSize: 17,\n              fontFamily: \"bold\",\n              alignItems: \"center\",\n              minWidth: 10,\n              textAlign: \"center\",\n            }}\n          >\n            +{routesCount - routes.length}\n          </Text>\n        </View>\n      )}\n    </View>\n  );\n}"
  },
  {
    "path": "components/UnderConstructionNotice.tsx",
    "content": "import { AlertTriangle } from \"lucide-react-native\";\r\nimport React, { memo } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nimport List from \"@/ui/components/List\";\r\nimport Stack from \"@/ui/components/Stack\";\r\nimport Typography from \"@/ui/components/Typography\";\r\n\r\nfunction UnderConstructionNotice() {\r\n  const { t } = useTranslation();\r\n\r\n  return (\r\n    <List disablePadding>\r\n      <Stack\r\n        gap={12}\r\n        vAlign=\"center\"\r\n        hAlign=\"center\"\r\n        padding={20}\r\n      >\r\n        <Stack\r\n          vAlign=\"center\"\r\n          hAlign=\"center\"\r\n          padding={10}\r\n          inline\r\n          backgroundColor=\"#EFA40035\"\r\n          radius={30}\r\n        >\r\n          <AlertTriangle strokeWidth={2} size={24} color=\"#c28500\" />\r\n        </Stack>\r\n        <Stack gap={2} vAlign=\"center\" hAlign=\"center\">\r\n          <Typography align=\"center\" variant=\"h4\">\r\n            {t(\"TabUnderConstruction_Title\")}\r\n          </Typography>\r\n          <Typography align=\"center\" variant=\"body1\" color=\"secondary\">\r\n            {t(\"TabUnderConstruction_Details\")}\r\n          </Typography>\r\n        </Stack>\r\n      </Stack>\r\n    </List>\r\n  );\r\n}\r\n\r\nexport default UnderConstructionNotice;"
  },
  {
    "path": "components/onboarding/OnboardingBackButton.tsx",
    "content": "import { useRouter } from \"expo-router\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport React from \"react\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nconst OnboardingBackButton = (props: {\n  icon?: string;\n  position?: 'left' | 'right';\n}) => {\n  const router = useRouter();\n  const insets = useSafeAreaInsets();\n\n  return (\n    <AnimatedPressable\n      onPress={() => router.back()}\n      style={[\n        {\n        position: 'absolute',\n        top: insets.top + 4,\n        zIndex: 200,\n        backgroundColor: '#ffffff42',\n        padding: 10,\n        borderRadius: 100,\n        },\n        props.position === 'right' ? { right: 16 } : { left: 16 }\n      ]}\n    >\n      <Papicons name={props.icon ?? \"ArrowLeft\"} size={26} fill={\"#fff\"}/>\n    </AnimatedPressable>\n  )\n}\n\nexport default OnboardingBackButton;"
  },
  {
    "path": "components/onboarding/OnboardingInput.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport React from \"react\";\nimport { KeyboardTypeOptions, Platform, TextInput, TextInputProps } from \"react-native\";\n\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\n\nconst OnboardingInput = ({ placeholder, text, setText, isPassword, icon, inputProps }: {\n  placeholder: string\n  text: string\n  setText: (text: string) => void\n  icon: string\n  isPassword?: boolean\n  keyboardType?: KeyboardTypeOptions\n  inputProps: TextInputProps\n}) => {\n  const { colors, dark } = useTheme();\n\n  return (\n    <Stack flex direction=\"horizontal\" hAlign=\"center\" vAlign=\"center\">\n      <Stack\n        flex\n        direction=\"horizontal\"\n        vAlign=\"center\"\n        hAlign=\"center\"\n        gap={10}\n        style={{\n          flex: 1,\n          padding: 20,\n          paddingVertical: Platform.OS === \"ios\" ? 20 : 10,\n          backgroundColor: colors.text + (dark ? \"15\" : \"08\"),\n          borderRadius: 300,\n          borderWidth: 1,\n          borderColor: colors.border\n        }}\n      >\n        <Icon\n          papicon\n          size={24}\n          fill={colors.text + \"AF\"}\n        >\n          <Papicons name={icon} />\n        </Icon>\n        <TextInput\n          placeholder={placeholder}\n          placeholderTextColor={colors.text + \"7F\"}\n          onChangeText={setText}\n          value={text}\n          style={{\n            color: colors.text + \"AF\",\n            fontFamily: \"semibold\",\n            fontSize: 19,\n            fontWeight: \"600\",\n            flex: 1,\n          }}\n          secureTextEntry={isPassword ?? false}\n          keyboardType={\"default\"}\n          {...inputProps}\n        />\n      </Stack>\n    </Stack>\n  )\n}\n\nexport default OnboardingInput;"
  },
  {
    "path": "components/onboarding/OnboardingScrollingFlatList.tsx",
    "content": "import { useFocusEffect } from \"expo-router\";\nimport LottieView from \"lottie-react-native\";\nimport React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { FlatList, ListRenderItemInfo } from \"react-native\";\nimport Reanimated, {\n  Extrapolate,\n  interpolate,\n  useAnimatedScrollHandler,\n  useAnimatedStyle,\n  useSharedValue,\n} from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\n\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport ViewContainer from \"@/ui/components/ViewContainer\";\nconst AnimatedFlatList = Reanimated.createAnimatedComponent(FlatList);\n\nconst OnboardingScrollingFlatList = ({ lottie, hasReturnButton = true, title, color, step, totalSteps, elements, renderItem }: {\n  lottie?: string\n  hasReturnButton?: boolean,\n  title: string\n  color: string\n  step: number\n  totalSteps: number\n  elements: unknown[]\n  renderItem: (info: ListRenderItemInfo<unknown>) => React.JSX.Element\n}) => {\n  const insets = useSafeAreaInsets();\n  const animation = React.useRef<LottieView>(null);\n\n  const scrollY = React.useRef(useSharedValue(0)).current;\n  const { t } = useTranslation();\n\n  const height: number = lottie ? 500 : 250;\n\n  const scrollHandler = useAnimatedScrollHandler({\n    onScroll: (event) => {\n      scrollY.value = event.contentOffset.y;\n    },\n  });\n\n  const AnimatedHeaderStyle = useAnimatedStyle(() => ({\n    maxHeight: interpolate(\n      scrollY.value,\n      [0, height - 270],\n      [height, 270],\n      Extrapolate.CLAMP\n    ),\n    height: height,\n    position: \"absolute\",\n    top: 0,\n    left: 0,\n    right: 0,\n    zIndex: 2,\n    transform: [\n      {\n        scaleY: interpolate(\n          scrollY.value,\n          [-500, 0],\n          [1.2, 1],\n          Extrapolate.CLAMP\n        )\n      },\n    ]\n  }));\n\n  const AnimatedLottieContainerStyle = useAnimatedStyle(() => ({\n    opacity: interpolate(\n      scrollY.value,\n      [0, height - 270],\n      [1, 0],\n      Extrapolate.CLAMP\n    ),\n    transform: [\n      {\n        scale: interpolate(\n          scrollY.value,\n          [0, height - 270],\n          [1, 0.8],\n          Extrapolate.CLAMP\n        ),\n      },\n    ],\n  }));\n\n  useFocusEffect(\n    React.useCallback(() => {\n      if (animation.current) {\n        animation.current.reset();\n        animation.current.play();\n      }\n    }, [])\n  );\n\n  return (\n    <ViewContainer>\n      <Reanimated.View\n        style={[AnimatedHeaderStyle, { transformOrigin: \"top\" }]}\n      >\n        <Stack\n          padding={32}\n          backgroundColor={color}\n          gap={20}\n          style={{\n            alignItems: 'center',\n            justifyContent: 'flex-end',\n            borderBottomLeftRadius: 42,\n            borderBottomRightRadius: 42,\n            paddingBottom: 34,\n            borderCurve: \"continuous\",\n            height: \"100%\",\n          }}\n        >\n          <Reanimated.View style={AnimatedLottieContainerStyle}>\n            {lottie && (\n              <LottieView\n                autoPlay\n                loop={false}\n                style={{ width: 230, height: 230 }}\n                source={lottie}\n              />\n            )}\n          </Reanimated.View>\n          <Stack\n            vAlign='start'\n            hAlign='start'\n            width=\"100%\"\n            gap={12}\n          >\n            <Stack flex direction=\"horizontal\">\n              <Typography\n                variant=\"h5\"\n                style={{ color: \"white\", lineHeight: 22, fontSize: 18 }}\n              >\n                {t('OnBoarding_Step') + step}\n              </Typography>\n              <Typography\n                variant=\"h5\"\n                style={{ color: \"#FFFFFF90\", lineHeight: 22, fontSize: 18 }}\n              >\n                {t('OnBoarding_Step_Of') + totalSteps}\n              </Typography>\n            </Stack>\n            <Typography\n              variant=\"h1\"\n              style={{ color: \"white\", fontSize: 32, lineHeight: 34 }}\n            >\n              {title}\n            </Typography>\n          </Stack>\n        </Stack>\n      </Reanimated.View>\n\n      <AnimatedFlatList\n        showsVerticalScrollIndicator={false}\n        scrollEventThrottle={16}\n        onScroll={scrollHandler}\n        data={elements}\n        style={{\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0,\n        }}\n        contentContainerStyle={{\n          paddingTop: height + 16,\n          paddingHorizontal: 16,\n          gap: 10,\n          paddingBottom: insets.bottom + 16,\n        }}\n        renderItem={renderItem}\n      />\n\n      {hasReturnButton && (\n        <OnboardingBackButton />\n      )}\n    </ViewContainer>\n  )\n}\n\nexport default OnboardingScrollingFlatList;"
  },
  {
    "path": "components/onboarding/OnboardingWebview.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport { t } from \"i18next\";\nimport React, { useEffect } from \"react\";\nimport { ActivityIndicator, Keyboard, KeyboardAvoidingView, View } from \"react-native\";\nimport { useSharedValue, withSpring, withTiming } from \"react-native-reanimated\";\nimport Animated from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { WebView, WebViewProps } from \"react-native-webview\";\n\nimport OnboardingBackButton from \"@/components/onboarding/OnboardingBackButton\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\nimport ViewContainer from \"@/ui/components/ViewContainer\";\n\nconst OnboardingWebview = ({ title, color, step, totalSteps, webviewProps, webViewRef }: {\n  title: string\n  color: string\n  step: number\n  totalSteps: number\n  webviewProps: WebViewProps\n  webViewRef?: React.RefObject<WebView<{}> | null>\n}) => {\n  const insets = useSafeAreaInsets();\n  const { colors } = useTheme();\n  const [totallyLoaded, setTotallyLoaded] = React.useState(false);\n\n  const titleOpacity = useSharedValue(1);\n  const headerHeight = useSharedValue(150 + insets.top);\n\n  useEffect(() => {\n    const showSubscription = Keyboard.addListener(\"keyboardDidShow\", onKeyboardShow);\n    const hideSubscription = Keyboard.addListener(\"keyboardDidHide\", onKeyboardHide);\n\n    return () => {\n      showSubscription.remove();\n      hideSubscription.remove();\n    };\n  }, []);\n\n  const onKeyboardShow = () => {\n    titleOpacity.value = withTiming(0, { duration: 100 });\n    headerHeight.value = withTiming(60 + insets.top, { stiffness: 500, damping: 50 });\n  };\n\n  const onKeyboardHide = () => {\n    titleOpacity.value = withSpring(1, { stiffness: 200, damping: 20 });\n    headerHeight.value = withSpring(150 + insets.top, { stiffness: 500, damping: 50 });\n  };\n\n  return (\n    <ViewContainer>\n      <KeyboardAvoidingView\n        style={{ flex: 1 }}\n        behavior=\"height\"\n        keyboardVerticalOffset={-insets.top + 20}\n      >\n        <Stack flex\n          direction=\"horizontal\"\n          height={40}\n          style={{ position: \"absolute\", left: 75, top: insets.top + 7, zIndex: 2 }}\n          hAlign={\"center\"}\n        >\n          <Typography\n            variant=\"h5\"\n            style={{ color: \"white\", lineHeight: 22, fontSize: 18 }}\n          >\n            {\"Étape \" + step}\n          </Typography>\n          <Typography\n            variant=\"h5\"\n            style={{ color: \"#FFFFFF90\", lineHeight: 22, fontSize: 18 }}\n          >\n            {\"sur \" + totalSteps}\n          </Typography>\n        </Stack>\n        <Animated.View\n          style={{\n            padding: 32,\n            backgroundColor: color,\n            gap: 20,\n            alignItems: \"center\",\n            justifyContent: \"flex-end\",\n            borderBottomLeftRadius: 42,\n            borderBottomRightRadius: 42,\n            paddingBottom: 25,\n            borderCurve: \"continuous\",\n            height: headerHeight,\n            paddingTop: insets.top,\n          }}\n        >\n          <Animated.View style={{ opacity: titleOpacity }}>\n            <Typography\n              variant=\"h3\"\n              style={{ color: \"#FFFFFF\", lineHeight: 28, fontSize: 28 }}\n            >\n              {title}\n            </Typography>\n          </Animated.View>\n        </Animated.View>\n        <View style={{ flex: 1, padding: 20, paddingBottom: insets.bottom + 20 }}>\n          <View\n            style={{\n              width: \"100%\",\n              height: \"100%\",\n              borderWidth: 2,\n              borderColor: colors.border,\n              backgroundColor: colors.text + \"10\",\n              borderRadius: 20,\n              overflow: 'hidden',\n            }}\n          >\n            <View\n              style={{\n                position: 'absolute',\n                top: 0,\n                left: 0,\n                right: 0,\n                bottom: 0,\n                alignItems: 'center',\n                justifyContent: 'center',\n                padding: 20,\n                opacity: totallyLoaded ? 0 : 1,\n              }}\n            >\n              <ActivityIndicator size={\"large\"} />\n              <Typography variant={\"h3\"} align={\"center\"} color={colors.text + \"90\"} style={{ marginTop: 10 }}>{t(\"Webview_Wait\")}</Typography>\n              <Typography variant={\"caption\"} align={\"center\"} color={colors.text + \"50\"}>{t(\"Onboarding_Load_Webview_Description\")}</Typography>\n            </View>\n            <WebView\n              ref={webViewRef}\n              {...webviewProps}\n              style={{\n                flex: 1,\n                opacity: totallyLoaded ? 1 : 0,\n              }}\n              onLoadEnd={(e) => {\n                webviewProps.onLoadEnd?.(e);\n                if (e.nativeEvent.url.includes(\"pronote\")) {\n                  if (e.nativeEvent.url !== webviewProps.source?.uri) {\n                    setTotallyLoaded(true);\n                  }\n                } else if (e.nativeEvent.url.includes(\"https://\")) {\n                  setTotallyLoaded(true);\n                }\n              }}\n            />\n          </View>\n        </View>\n        <OnboardingBackButton />\n      </KeyboardAvoidingView>\n    </ViewContainer>\n  );\n};\n\nexport default OnboardingWebview;"
  },
  {
    "path": "components/router/BottomTabs.tsx",
    "content": "import {\n  createNativeBottomTabNavigator,\n  NativeBottomTabNavigationEventMap,\n  NativeBottomTabNavigationOptions,\n} from '@bottom-tabs/react-navigation';\nimport { ParamListBase, TabNavigationState } from '@react-navigation/native';\nimport { withLayoutContext } from 'expo-router';\n\nconst BottomTabNavigator = createNativeBottomTabNavigator().Navigator;\n\nexport const Tabs = withLayoutContext<\n  NativeBottomTabNavigationOptions,\n  typeof BottomTabNavigator,\n  TabNavigationState<ParamListBase>,\n  NativeBottomTabNavigationEventMap\n>(BottomTabNavigator);"
  },
  {
    "path": "constants/AvailableTransportServices.ts",
    "content": "import { Platform } from \"react-native\";\n\nimport { TransportAddress } from \"@/stores/account/types\";\n\nexport const AvailableTransportServices = [\n  {\n    id: \"transit\",\n    name: \"Transit\",\n    icon: require(`@/assets/images/transport/transit.png`),\n    baseUrlScheme: \"transit://\",\n    generateDeeplink: (\n      from: TransportAddress,\n      to: TransportAddress,\n      isDeparture: boolean,\n      targetTime: number\n    ): string => {\n      return `transit://directions?from=${from.firstTitle === \"current_location\" ? \"\" : `${from.address}`}&to=${to.address}&${isDeparture ? `arrive_by=${targetTime}` : `leave_at=${targetTime}`}`;\n    },\n  },\n  Platform.OS === \"ios\" && {\n    id: \"apple_maps\",\n    name: \"Apple Maps\",\n    icon: require(`@/assets/images/transport/apple_maps.png`),\n    baseUrlScheme: \"maps://\",\n    generateDeeplink: (\n      from: TransportAddress,\n      to: TransportAddress,\n      isDeparture: boolean,\n      targetTime: number\n    ): string => {\n      // Apple Maps don't support time in URL... :(\n      return `maps://?${from.firstTitle === \"current_location\" ? \"\" : `saddr=${from.latitude},${from.longitude}&`}daddr=${to.latitude},${to.longitude}`;\n    },\n  },\n  {\n    id: \"google_maps\",\n    name: \"Google Maps\",\n    icon: require(`@/assets/images/transport/google_maps.png`),\n    baseUrlScheme: \"https://www.google.com/maps/dir/\",\n    generateDeeplink: (\n      from: TransportAddress,\n      to: TransportAddress,\n      isDeparture: boolean,\n      targetTime: number\n    ): string => {\n      // Google too, what the f*ck ??\n      return `https://www.google.com/maps/dir/?api=1&${from.firstTitle === \"current_location\" ? \"\" : `origin=${from.latitude},${from.longitude}&`}destination=${to.latitude},${to.longitude}`;\n    },\n  },\n].filter(Boolean) as Array<{\n  id: string;\n  name: string;\n  icon: any;\n  baseUrlScheme: string;\n  generateDeeplink: (\n    from: TransportAddress,\n    to: TransportAddress,\n    isDeparture: boolean,\n    targetTime: number\n  ) => string;\n}>;"
  },
  {
    "path": "constants/LayoutScreenOptions.ts",
    "content": "import { Platform } from 'react-native';\nimport \"@/utils/i18n\";\nimport { t } from 'i18next';\nimport { runsIOS26 } from '@/ui/utils/IsLiquidGlass';\n\nexport const FONT_CONFIG = {\n  light: require('../assets/fonts/SNPro-Light.ttf'),\n  regular: require('../assets/fonts/SNPro-Regular.ttf'),\n  medium: require('../assets/fonts/SNPro-Medium.ttf'),\n  semibold: require('../assets/fonts/SNPro-Semibold.ttf'),\n  bold: require('../assets/fonts/SNPro-Bold.ttf'),\n  black: require('../assets/fonts/SNPro-Black.ttf'),\n  serif_light: require('../assets/fonts/NotoSerif-Light.ttf'),\n  serif_regular: require('../assets/fonts/NotoSerif-Regular.ttf'),\n  serif_medium: require('../assets/fonts/NotoSerif-Medium.ttf'),\n  serif_bold: require('../assets/fonts/NotoSerif-Bold.ttf'),\n  serif_black: require('../assets/fonts/NotoSerif-Black.ttf'),\n} as const;\n\nexport const STACK_SCREEN_OPTIONS = {\n  headerBackButtonDisplayMode: \"minimal\" as const,\n};\n\nexport const ALERT_SCREEN_OPTIONS = {\n  headerShown: false,\n  presentation: 'formSheet' as const,\n  sheetAllowedDetents: Platform.OS === 'ios' ? 'fitToContents' as const : [0.9],\n  sheetCornerRadius: Platform.OS === 'ios' ? undefined : 32,\n  sheetGrabberVisible: false,\n  sheetExpandsWhenScrolledToEdge: false,\n  sheetInitialDetentIndex: 0,\n} as const;\n\nexport const DEVMODE_SCREEN_OPTIONS = {\n  headerTitle: \"DevMode\",\n  headerBackButtonDisplayMode: \"minimal\" as const,\n} as const;\n\nexport const DEMO_SCREEN_OPTIONS = {\n  headerTitle: \"Components Demo\",\n  headerBackButtonDisplayMode: \"minimal\" as const,\n};\n\nexport const CONSENT_SCREEN_OPTIONS = {\n  gesturesEnabled: false,\n  fullScreenGestureEnabled: false,\n  presentation: \"fullScreenModal\" as const,\n  backButtonVisible: false,\n  headerLargeTitle: false,\n  headerShown: false,\n} as const;\n\nexport const CHANGELOG_SCREEN_OPTIONS = {\n  headerTitle: t(\"Changelog_Title\"),\n  headerLargeTitle: false,\n};\n\nexport const AI_SCREEN_OPTIONS = {\n  headerTitle: \"AI\",\n  headerShown: false,\n};\n"
  },
  {
    "path": "constants/UnicodeEmojis.ts",
    "content": "export const UnicodeEmojis = {\n\tsmileys_and_emotion: { \n\t\ticon: \"Emoji\",\n\t\temojis: [0x1F600, 0x1F603, 0x1F604, 0x1F601, 0x1F606, 0x1F605, 0x1F923, 0x1F602, 0x1F642, 0x1F643, 0x1FAE0, 0x1F609, 0x1F60A, 0x1F607, 0x1F970, 0x1F60D, 0x1F929, 0x1F618, 0x1F617, 0x263A, 0x1F61A, 0x1F619, 0x1F972, 0x1F60B, 0x1F61B, 0x1F61C, 0x1F92A, 0x1F61D, 0x1F911, 0x1F917, 0x1F92D, 0x1FAE2, 0x1FAE3, 0x1F92B, 0x1F914, 0x1FAE1, 0x1F910, 0x1F928, 0x1F610, 0x1F611, 0x1F636, 0x1FAE5, 0x1F636, 0x1F60F, 0x1F612, 0x1F644, 0x1F62C, 0x1F62E, 0x1F925, 0x1FAE8, 0x1F642, 0x1F642, 0x1F60C, 0x1F614, 0x1F62A, 0x1F924, 0x1F634, 0x1FAE9, 0x1F637, 0x1F912, 0x1F915, 0x1F922, 0x1F92E, 0x1F927, 0x1F975, 0x1F976, 0x1F974, 0x1F635, 0x1F635, 0x1F92F, 0x1F920, 0x1F973, 0x1F978, 0x1F60E, 0x1F913, 0x1F9D0, 0x1F615, 0x1FAE4, 0x1F61F, 0x1F641, 0x2639, 0x1F62E, 0x1F62F, 0x1F632, 0x1F633, 0x1FAEA, 0x1F97A, 0x1F979, 0x1F626, 0x1F627, 0x1F628, 0x1F630, 0x1F625, 0x1F622, 0x1F62D, 0x1F631, 0x1F616, 0x1F623, 0x1F61E, 0x1F613, 0x1F629, 0x1F62B, 0x1F971, 0x1F624, 0x1F621, 0x1F620, 0x1F92C, 0x1F608, 0x1F47F, 0x1F480, 0x2620, 0x1F4A9, 0x1F921, 0x1F479, 0x1F47A, 0x1F47B, 0x1F47D, 0x1F47E, 0x1F916, 0x1F63A, 0x1F638, 0x1F639, 0x1F63B, 0x1F63C, 0x1F63D, 0x1F640, 0x1F63F, 0x1F63E, 0x1F648, 0x1F649, 0x1F64A, 0x1F48C, 0x1F498, 0x1F49D, 0x1F496, 0x1F497, 0x1F493, 0x1F49E, 0x1F495, 0x1F49F, 0x2763, 0x1F494, 0x2764, 0x2764, 0x2764, 0x1FA77, 0x1F9E1, 0x1F49B, 0x1F49A, 0x1F499, 0x1FA75, 0x1F49C, 0x1F90E, 0x1F5A4, 0x1FA76, 0x1F90D, 0x1F48B, 0x1F4AF, 0x1F4A2, 0x1FAEF, 0x1F4A5, 0x1F4AB, 0x1F4A6, 0x1F4A8, 0x1F573, 0x1F4AC, 0x1F441, 0x1F5E8, 0x1F5EF, 0x1F4AD, 0x1F4A4, ]\n\t},\n\tpeople_and_body: { \n\t\ticon: \"Accessibility\",\n\t\temojis: [0x1F44B, 0x1F44B, 0x1F44B, 0x1F44B, 0x1F44B, 0x1F44B, 0x1F91A, 0x1F91A, 0x1F91A, 0x1F91A, 0x1F91A, 0x1F91A, 0x1F590, 0x1F590, 0x1F590, 0x1F590, 0x1F590, 0x1F590, 0x270B, 0x270B, 0x270B, 0x270B, 0x270B, 0x270B, 0x1F596, 0x1F596, 0x1F596, 0x1F596, 0x1F596, 0x1F596, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF2, 0x1FAF2, 0x1FAF2, 0x1FAF2, 0x1FAF2, 0x1FAF2, 0x1FAF3, 0x1FAF3, 0x1FAF3, 0x1FAF3, 0x1FAF3, 0x1FAF3, 0x1FAF4, 0x1FAF4, 0x1FAF4, 0x1FAF4, 0x1FAF4, 0x1FAF4, 0x1FAF7, 0x1FAF7, 0x1FAF7, 0x1FAF7, 0x1FAF7, 0x1FAF7, 0x1FAF8, 0x1FAF8, 0x1FAF8, 0x1FAF8, 0x1FAF8, 0x1FAF8, 0x1F44C, 0x1F44C, 0x1F44C, 0x1F44C, 0x1F44C, 0x1F44C, 0x1F90C, 0x1F90C, 0x1F90C, 0x1F90C, 0x1F90C, 0x1F90C, 0x1F90F, 0x1F90F, 0x1F90F, 0x1F90F, 0x1F90F, 0x1F90F, 0x270C, 0x270C, 0x270C, 0x270C, 0x270C, 0x270C, 0x1F91E, 0x1F91E, 0x1F91E, 0x1F91E, 0x1F91E, 0x1F91E, 0x1FAF0, 0x1FAF0, 0x1FAF0, 0x1FAF0, 0x1FAF0, 0x1FAF0, 0x1F91F, 0x1F91F, 0x1F91F, 0x1F91F, 0x1F91F, 0x1F91F, 0x1F918, 0x1F918, 0x1F918, 0x1F918, 0x1F918, 0x1F918, 0x1F919, 0x1F919, 0x1F919, 0x1F919, 0x1F919, 0x1F919, 0x1F448, 0x1F448, 0x1F448, 0x1F448, 0x1F448, 0x1F448, 0x1F449, 0x1F449, 0x1F449, 0x1F449, 0x1F449, 0x1F449, 0x1F446, 0x1F446, 0x1F446, 0x1F446, 0x1F446, 0x1F446, 0x1F595, 0x1F595, 0x1F595, 0x1F595, 0x1F595, 0x1F595, 0x1F447, 0x1F447, 0x1F447, 0x1F447, 0x1F447, 0x1F447, 0x261D, 0x261D, 0x261D, 0x261D, 0x261D, 0x261D, 0x1FAF5, 0x1FAF5, 0x1FAF5, 0x1FAF5, 0x1FAF5, 0x1FAF5, 0x1F44D, 0x1F44D, 0x1F44D, 0x1F44D, 0x1F44D, 0x1F44D, 0x1F44E, 0x1F44E, 0x1F44E, 0x1F44E, 0x1F44E, 0x1F44E, 0x270A, 0x270A, 0x270A, 0x270A, 0x270A, 0x270A, 0x1F44A, 0x1F44A, 0x1F44A, 0x1F44A, 0x1F44A, 0x1F44A, 0x1F91B, 0x1F91B, 0x1F91B, 0x1F91B, 0x1F91B, 0x1F91B, 0x1F91C, 0x1F91C, 0x1F91C, 0x1F91C, 0x1F91C, 0x1F91C, 0x1F44F, 0x1F44F, 0x1F44F, 0x1F44F, 0x1F44F, 0x1F44F, 0x1F64C, 0x1F64C, 0x1F64C, 0x1F64C, 0x1F64C, 0x1F64C, 0x1FAF6, 0x1FAF6, 0x1FAF6, 0x1FAF6, 0x1FAF6, 0x1FAF6, 0x1F450, 0x1F450, 0x1F450, 0x1F450, 0x1F450, 0x1F450, 0x1F932, 0x1F932, 0x1F932, 0x1F932, 0x1F932, 0x1F932, 0x1F91D, 0x1F91D, 0x1F91D, 0x1F91D, 0x1F91D, 0x1F91D, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1FAF1, 0x1F64F, 0x1F64F, 0x1F64F, 0x1F64F, 0x1F64F, 0x1F64F, 0x270D, 0x270D, 0x270D, 0x270D, 0x270D, 0x270D, 0x1F485, 0x1F485, 0x1F485, 0x1F485, 0x1F485, 0x1F485, 0x1F933, 0x1F933, 0x1F933, 0x1F933, 0x1F933, 0x1F933, 0x1F4AA, 0x1F4AA, 0x1F4AA, 0x1F4AA, 0x1F4AA, 0x1F4AA, 0x1F9BE, 0x1F9BF, 0x1F9B5, 0x1F9B5, 0x1F9B5, 0x1F9B5, 0x1F9B5, 0x1F9B5, 0x1F9B6, 0x1F9B6, 0x1F9B6, 0x1F9B6, 0x1F9B6, 0x1F9B6, 0x1F442, 0x1F442, 0x1F442, 0x1F442, 0x1F442, 0x1F442, 0x1F9BB, 0x1F9BB, 0x1F9BB, 0x1F9BB, 0x1F9BB, 0x1F9BB, 0x1F443, 0x1F443, 0x1F443, 0x1F443, 0x1F443, 0x1F443, 0x1F9E0, 0x1FAC0, 0x1FAC1, 0x1F9B7, 0x1F9B4, 0x1F440, 0x1F441, 0x1F445, 0x1F444, 0x1FAE6, 0x1F476, 0x1F476, 0x1F476, 0x1F476, 0x1F476, 0x1F476, 0x1F9D2, 0x1F9D2, 0x1F9D2, 0x1F9D2, 0x1F9D2, 0x1F9D2, 0x1F466, 0x1F466, 0x1F466, 0x1F466, 0x1F466, 0x1F466, 0x1F467, 0x1F467, 0x1F467, 0x1F467, 0x1F467, 0x1F467, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F9D4, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F471, 0x1F9D3, 0x1F9D3, 0x1F9D3, 0x1F9D3, 0x1F9D3, 0x1F9D3, 0x1F474, 0x1F474, 0x1F474, 0x1F474, 0x1F474, 0x1F474, 0x1F475, 0x1F475, 0x1F475, 0x1F475, 0x1F475, 0x1F475, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64D, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F64E, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F645, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F646, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F481, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F64B, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F9CF, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F647, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F926, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F937, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F46E, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F575, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F482, 0x1F977, 0x1F977, 0x1F977, 0x1F977, 0x1F977, 0x1F977, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1F477, 0x1FAC5, 0x1FAC5, 0x1FAC5, 0x1FAC5, 0x1FAC5, 0x1FAC5, 0x1F934, 0x1F934, 0x1F934, 0x1F934, 0x1F934, 0x1F934, 0x1F478, 0x1F478, 0x1F478, 0x1F478, 0x1F478, 0x1F478, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F473, 0x1F472, 0x1F472, 0x1F472, 0x1F472, 0x1F472, 0x1F472, 0x1F9D5, 0x1F9D5, 0x1F9D5, 0x1F9D5, 0x1F9D5, 0x1F9D5, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F935, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F470, 0x1F930, 0x1F930, 0x1F930, 0x1F930, 0x1F930, 0x1F930, 0x1FAC3, 0x1FAC3, 0x1FAC3, 0x1FAC3, 0x1FAC3, 0x1FAC3, 0x1FAC4, 0x1FAC4, 0x1FAC4, 0x1FAC4, 0x1FAC4, 0x1FAC4, 0x1F931, 0x1F931, 0x1F931, 0x1F931, 0x1F931, 0x1F931, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F47C, 0x1F47C, 0x1F47C, 0x1F47C, 0x1F47C, 0x1F47C, 0x1F385, 0x1F385, 0x1F385, 0x1F385, 0x1F385, 0x1F385, 0x1F936, 0x1F936, 0x1F936, 0x1F936, 0x1F936, 0x1F936, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B8, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9B9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9D9, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DA, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DB, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DC, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DD, 0x1F9DE, 0x1F9DE, 0x1F9DE, 0x1F9DF, 0x1F9DF, 0x1F9DF, 0x1F9CC, 0x1FAC8, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F486, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F487, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F6B6, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CD, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9CE, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F3C3, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F483, 0x1F483, 0x1F483, 0x1F483, 0x1F483, 0x1F483, 0x1F57A, 0x1F57A, 0x1F57A, 0x1F57A, 0x1F57A, 0x1F57A, 0x1F574, 0x1F574, 0x1F574, 0x1F574, 0x1F574, 0x1F574, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F46F, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D6, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F9D7, 0x1F93A, 0x1F3C7, 0x1F3C7, 0x1F3C7, 0x1F3C7, 0x1F3C7, 0x1F3C7, 0x26F7, 0x1F3C2, 0x1F3C2, 0x1F3C2, 0x1F3C2, 0x1F3C2, 0x1F3C2, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3CC, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F3C4, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F6A3, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x1F3CA, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x26F9, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F3CB, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B4, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F6B5, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F938, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F93C, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93D, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F93E, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F939, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F9D8, 0x1F6C0, 0x1F6C0, 0x1F6C0, 0x1F6C0, 0x1F6C0, 0x1F6C0, 0x1F6CC, 0x1F6CC, 0x1F6CC, 0x1F6CC, 0x1F6CC, 0x1F6CC, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F46D, 0x1F46D, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46D, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46D, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46D, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46D, 0x1F46B, 0x1F46B, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46B, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46B, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46B, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F46B, 0x1F46C, 0x1F46C, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F46C, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F46C, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F46C, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F46C, 0x1F48F, 0x1F48F, 0x1F48F, 0x1F48F, 0x1F48F, 0x1F48F, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F491, 0x1F491, 0x1F491, 0x1F491, 0x1F491, 0x1F491, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F468, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F469, 0x1F5E3, 0x1F464, 0x1F465, 0x1FAC2, 0x1F46A, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F9D1, 0x1F463, 0x1FAC6, ]\n\t},\n\tcomponent: { \n\t\ticon: \"Code\",\n\t\temojis: []\n\t},\n\tanimals_and_nature: { \n\t\ticon: \"Butterfly\",\n\t\temojis: [0x1F435, 0x1F412, 0x1F98D, 0x1F9A7, 0x1F436, 0x1F415, 0x1F9AE, 0x1F415, 0x1F429, 0x1F43A, 0x1F98A, 0x1F99D, 0x1F431, 0x1F408, 0x1F408, 0x1F981, 0x1F42F, 0x1F405, 0x1F406, 0x1F434, 0x1FACE, 0x1FACF, 0x1F40E, 0x1F984, 0x1F993, 0x1F98C, 0x1F9AC, 0x1F42E, 0x1F402, 0x1F403, 0x1F404, 0x1F437, 0x1F416, 0x1F417, 0x1F43D, 0x1F40F, 0x1F411, 0x1F410, 0x1F42A, 0x1F42B, 0x1F999, 0x1F992, 0x1F418, 0x1F9A3, 0x1F98F, 0x1F99B, 0x1F42D, 0x1F401, 0x1F400, 0x1F439, 0x1F430, 0x1F407, 0x1F43F, 0x1F9AB, 0x1F994, 0x1F987, 0x1F43B, 0x1F43B, 0x1F428, 0x1F43C, 0x1F9A5, 0x1F9A6, 0x1F9A8, 0x1F998, 0x1F9A1, 0x1F43E, 0x1F983, 0x1F414, 0x1F413, 0x1F423, 0x1F424, 0x1F425, 0x1F426, 0x1F427, 0x1F54A, 0x1F985, 0x1F986, 0x1F9A2, 0x1F989, 0x1F9A4, 0x1FAB6, 0x1F9A9, 0x1F99A, 0x1F99C, 0x1FABD, 0x1F426, 0x1FABF, 0x1F426, 0x1F438, 0x1F40A, 0x1F422, 0x1F98E, 0x1F40D, 0x1F432, 0x1F409, 0x1F995, 0x1F996, 0x1F433, 0x1F40B, 0x1F42C, 0x1FACD, 0x1F9AD, 0x1F41F, 0x1F420, 0x1F421, 0x1F988, 0x1F419, 0x1F41A, 0x1FAB8, 0x1FABC, 0x1F980, 0x1F99E, 0x1F990, 0x1F991, 0x1F9AA, 0x1F40C, 0x1F98B, 0x1F41B, 0x1F41C, 0x1F41D, 0x1FAB2, 0x1F41E, 0x1F997, 0x1FAB3, 0x1F577, 0x1F578, 0x1F982, 0x1F99F, 0x1FAB0, 0x1FAB1, 0x1F9A0, 0x1F490, 0x1F338, 0x1F4AE, 0x1FAB7, 0x1F3F5, 0x1F339, 0x1F940, 0x1F33A, 0x1F33B, 0x1F33C, 0x1F337, 0x1FABB, 0x1F331, 0x1FAB4, 0x1F332, 0x1F333, 0x1F334, 0x1F335, 0x1F33E, 0x1F33F, 0x2618, 0x1F340, 0x1F341, 0x1F342, 0x1F343, 0x1FAB9, 0x1FABA, 0x1F344, 0x1FABE, ]\n\t},\n\tfood_and_drink: { \n\t\ticon: \"Cutlery\",\n\t\temojis: [0x1F347, 0x1F348, 0x1F349, 0x1F34A, 0x1F34B, 0x1F34B, 0x1F34C, 0x1F34D, 0x1F96D, 0x1F34E, 0x1F34F, 0x1F350, 0x1F351, 0x1F352, 0x1F353, 0x1FAD0, 0x1F95D, 0x1F345, 0x1FAD2, 0x1F965, 0x1F951, 0x1F346, 0x1F954, 0x1F955, 0x1F33D, 0x1F336, 0x1FAD1, 0x1F952, 0x1F96C, 0x1F966, 0x1F9C4, 0x1F9C5, 0x1F95C, 0x1FAD8, 0x1F330, 0x1FADA, 0x1FADB, 0x1F344, 0x1FADC, 0x1F35E, 0x1F950, 0x1F956, 0x1FAD3, 0x1F968, 0x1F96F, 0x1F95E, 0x1F9C7, 0x1F9C0, 0x1F356, 0x1F357, 0x1F969, 0x1F953, 0x1F354, 0x1F35F, 0x1F355, 0x1F32D, 0x1F96A, 0x1F32E, 0x1F32F, 0x1FAD4, 0x1F959, 0x1F9C6, 0x1F95A, 0x1F373, 0x1F958, 0x1F372, 0x1FAD5, 0x1F963, 0x1F957, 0x1F37F, 0x1F9C8, 0x1F9C2, 0x1F96B, 0x1F371, 0x1F358, 0x1F359, 0x1F35A, 0x1F35B, 0x1F35C, 0x1F35D, 0x1F360, 0x1F362, 0x1F363, 0x1F364, 0x1F365, 0x1F96E, 0x1F361, 0x1F95F, 0x1F960, 0x1F961, 0x1F366, 0x1F367, 0x1F368, 0x1F369, 0x1F36A, 0x1F382, 0x1F370, 0x1F9C1, 0x1F967, 0x1F36B, 0x1F36C, 0x1F36D, 0x1F36E, 0x1F36F, 0x1F37C, 0x1F95B, 0x2615, 0x1FAD6, 0x1F375, 0x1F376, 0x1F37E, 0x1F377, 0x1F378, 0x1F379, 0x1F37A, 0x1F37B, 0x1F942, 0x1F943, 0x1FAD7, 0x1F964, 0x1F9CB, 0x1F9C3, 0x1F9C9, 0x1F9CA, 0x1F962, 0x1F37D, 0x1F374, 0x1F944, 0x1F52A, 0x1FAD9, 0x1F3FA, ]\n\t},\n\ttravel_and_places: { \n\t\ticon: \"Bus\",\n\t\temojis: [0x1F30D, 0x1F30E, 0x1F30F, 0x1F310, 0x1F5FA, 0x1F5FE, 0x1F9ED, 0x1F3D4, 0x26F0, 0x1F6D8, 0x1F30B, 0x1F5FB, 0x1F3D5, 0x1F3D6, 0x1F3DC, 0x1F3DD, 0x1F3DE, 0x1F3DF, 0x1F3DB, 0x1F3D7, 0x1F9F1, 0x1FAA8, 0x1FAB5, 0x1F6D6, 0x1F3D8, 0x1F3DA, 0x1F3E0, 0x1F3E1, 0x1F3E2, 0x1F3E3, 0x1F3E4, 0x1F3E5, 0x1F3E6, 0x1F3E8, 0x1F3E9, 0x1F3EA, 0x1F3EB, 0x1F3EC, 0x1F3ED, 0x1F3EF, 0x1F3F0, 0x1F492, 0x1F5FC, 0x1F5FD, 0x26EA, 0x1F54C, 0x1F6D5, 0x1F54D, 0x26E9, 0x1F54B, 0x26F2, 0x26FA, 0x1F301, 0x1F303, 0x1F3D9, 0x1F304, 0x1F305, 0x1F306, 0x1F307, 0x1F309, 0x2668, 0x1F3A0, 0x1F6DD, 0x1F3A1, 0x1F3A2, 0x1F488, 0x1F3AA, 0x1F682, 0x1F683, 0x1F684, 0x1F685, 0x1F686, 0x1F687, 0x1F688, 0x1F689, 0x1F68A, 0x1F69D, 0x1F69E, 0x1F68B, 0x1F68C, 0x1F68D, 0x1F68E, 0x1F690, 0x1F691, 0x1F692, 0x1F693, 0x1F694, 0x1F695, 0x1F696, 0x1F697, 0x1F698, 0x1F699, 0x1F6FB, 0x1F69A, 0x1F69B, 0x1F69C, 0x1F3CE, 0x1F3CD, 0x1F6F5, 0x1F9BD, 0x1F9BC, 0x1F6FA, 0x1F6B2, 0x1F6F4, 0x1F6F9, 0x1F6FC, 0x1F68F, 0x1F6E3, 0x1F6E4, 0x1F6E2, 0x26FD, 0x1F6DE, 0x1F6A8, 0x1F6A5, 0x1F6A6, 0x1F6D1, 0x1F6A7, 0x2693, 0x1F6DF, 0x26F5, 0x1F6F6, 0x1F6A4, 0x1F6F3, 0x26F4, 0x1F6E5, 0x1F6A2, 0x2708, 0x1F6E9, 0x1F6EB, 0x1F6EC, 0x1FA82, 0x1F4BA, 0x1F681, 0x1F69F, 0x1F6A0, 0x1F6A1, 0x1F6F0, 0x1F680, 0x1F6F8, 0x1F6CE, 0x1F9F3, 0x231B, 0x23F3, 0x231A, 0x23F0, 0x23F1, 0x23F2, 0x1F570, 0x1F55B, 0x1F567, 0x1F550, 0x1F55C, 0x1F551, 0x1F55D, 0x1F552, 0x1F55E, 0x1F553, 0x1F55F, 0x1F554, 0x1F560, 0x1F555, 0x1F561, 0x1F556, 0x1F562, 0x1F557, 0x1F563, 0x1F558, 0x1F564, 0x1F559, 0x1F565, 0x1F55A, 0x1F566, 0x1F311, 0x1F312, 0x1F313, 0x1F314, 0x1F315, 0x1F316, 0x1F317, 0x1F318, 0x1F319, 0x1F31A, 0x1F31B, 0x1F31C, 0x1F321, 0x2600, 0x1F31D, 0x1F31E, 0x1FA90, 0x2B50, 0x1F31F, 0x1F320, 0x1F30C, 0x2601, 0x26C5, 0x26C8, 0x1F324, 0x1F325, 0x1F326, 0x1F327, 0x1F328, 0x1F329, 0x1F32A, 0x1F32B, 0x1F32C, 0x1F300, 0x1F308, 0x1F302, 0x2602, 0x2614, 0x26F1, 0x26A1, 0x2744, 0x2603, 0x26C4, 0x2604, 0x1F525, 0x1F4A7, 0x1F30A, ]\n\t},\n\tactivities: { \n\t\ticon: \"Palette\",\n\t\temojis: [0x1F383, 0x1F384, 0x1F386, 0x1F387, 0x1F9E8, 0x2728, 0x1F388, 0x1F389, 0x1F38A, 0x1F38B, 0x1F38D, 0x1F38E, 0x1F38F, 0x1F390, 0x1F391, 0x1F9E7, 0x1F380, 0x1F381, 0x1F397, 0x1F39F, 0x1F3AB, 0x1F396, 0x1F3C6, 0x1F3C5, 0x1F947, 0x1F948, 0x1F949, 0x26BD, 0x26BE, 0x1F94E, 0x1F3C0, 0x1F3D0, 0x1F3C8, 0x1F3C9, 0x1F3BE, 0x1F94F, 0x1F3B3, 0x1F3CF, 0x1F3D1, 0x1F3D2, 0x1F94D, 0x1F3D3, 0x1F3F8, 0x1F94A, 0x1F94B, 0x1F945, 0x26F3, 0x26F8, 0x1F3A3, 0x1F93F, 0x1F3BD, 0x1F3BF, 0x1F6F7, 0x1F94C, 0x1F3AF, 0x1FA80, 0x1FA81, 0x1F52B, 0x1F3B1, 0x1F52E, 0x1FA84, 0x1F3AE, 0x1F579, 0x1F3B0, 0x1F3B2, 0x1F9E9, 0x1F9F8, 0x1FA85, 0x1FAA9, 0x1FA86, 0x2660, 0x2665, 0x2666, 0x2663, 0x265F, 0x1F0CF, 0x1F004, 0x1F3B4, 0x1F3AD, 0x1F5BC, 0x1F3A8, 0x1F9F5, 0x1FAA1, 0x1F9F6, 0x1FAA2, ]\n\t},\n\tobjects: { \n\t\ticon: \"Archive\",\n\t\temojis: [0x1F453, 0x1F576, 0x1F97D, 0x1F97C, 0x1F9BA, 0x1F454, 0x1F455, 0x1F456, 0x1F9E3, 0x1F9E4, 0x1F9E5, 0x1F9E6, 0x1F457, 0x1F458, 0x1F97B, 0x1FA71, 0x1FA72, 0x1FA73, 0x1F459, 0x1F45A, 0x1FAAD, 0x1F45B, 0x1F45C, 0x1F45D, 0x1F6CD, 0x1F392, 0x1FA74, 0x1F45E, 0x1F45F, 0x1F97E, 0x1F97F, 0x1F460, 0x1F461, 0x1FA70, 0x1F462, 0x1FAAE, 0x1F451, 0x1F452, 0x1F3A9, 0x1F393, 0x1F9E2, 0x1FA96, 0x26D1, 0x1F4FF, 0x1F484, 0x1F48D, 0x1F48E, 0x1F507, 0x1F508, 0x1F509, 0x1F50A, 0x1F4E2, 0x1F4E3, 0x1F4EF, 0x1F514, 0x1F515, 0x1F3BC, 0x1F3B5, 0x1F3B6, 0x1F399, 0x1F39A, 0x1F39B, 0x1F3A4, 0x1F3A7, 0x1F4FB, 0x1F3B7, 0x1F3BA, 0x1FA8A, 0x1FA97, 0x1F3B8, 0x1F3B9, 0x1F3BB, 0x1FA95, 0x1F941, 0x1FA98, 0x1FA87, 0x1FA88, 0x1FA89, 0x1F4F1, 0x1F4F2, 0x260E, 0x1F4DE, 0x1F4DF, 0x1F4E0, 0x1F50B, 0x1FAAB, 0x1F50C, 0x1F4BB, 0x1F5A5, 0x1F5A8, 0x2328, 0x1F5B1, 0x1F5B2, 0x1F4BD, 0x1F4BE, 0x1F4BF, 0x1F4C0, 0x1F9EE, 0x1F3A5, 0x1F39E, 0x1F4FD, 0x1F3AC, 0x1F4FA, 0x1F4F7, 0x1F4F8, 0x1F4F9, 0x1F4FC, 0x1F50D, 0x1F50E, 0x1F56F, 0x1F4A1, 0x1F526, 0x1F3EE, 0x1FA94, 0x1F4D4, 0x1F4D5, 0x1F4D6, 0x1F4D7, 0x1F4D8, 0x1F4D9, 0x1F4DA, 0x1F4D3, 0x1F4D2, 0x1F4C3, 0x1F4DC, 0x1F4C4, 0x1F4F0, 0x1F5DE, 0x1F4D1, 0x1F516, 0x1F3F7, 0x1FA99, 0x1F4B0, 0x1FA8E, 0x1F4B4, 0x1F4B5, 0x1F4B6, 0x1F4B7, 0x1F4B8, 0x1F4B3, 0x1F9FE, 0x1F4B9, 0x2709, 0x1F4E7, 0x1F4E8, 0x1F4E9, 0x1F4E4, 0x1F4E5, 0x1F4E6, 0x1F4EB, 0x1F4EA, 0x1F4EC, 0x1F4ED, 0x1F4EE, 0x1F5F3, 0x270F, 0x2712, 0x1F58B, 0x1F58A, 0x1F58C, 0x1F58D, 0x1F4DD, 0x1F4BC, 0x1F4C1, 0x1F4C2, 0x1F5C2, 0x1F4C5, 0x1F4C6, 0x1F5D2, 0x1F5D3, 0x1F4C7, 0x1F4C8, 0x1F4C9, 0x1F4CA, 0x1F4CB, 0x1F4CC, 0x1F4CD, 0x1F4CE, 0x1F587, 0x1F4CF, 0x1F4D0, 0x2702, 0x1F5C3, 0x1F5C4, 0x1F5D1, 0x1F512, 0x1F513, 0x1F50F, 0x1F510, 0x1F511, 0x1F5DD, 0x1F528, 0x1FA93, 0x26CF, 0x2692, 0x1F6E0, 0x1F5E1, 0x2694, 0x1F4A3, 0x1FA83, 0x1F3F9, 0x1F6E1, 0x1FA9A, 0x1F527, 0x1FA9B, 0x1F529, 0x2699, 0x1F5DC, 0x2696, 0x1F9AF, 0x1F517, 0x26D3, 0x26D3, 0x1FA9D, 0x1F9F0, 0x1F9F2, 0x1FA9C, 0x1FA8F, 0x2697, 0x1F9EA, 0x1F9EB, 0x1F9EC, 0x1F52C, 0x1F52D, 0x1F4E1, 0x1F489, 0x1FA78, 0x1F48A, 0x1FA79, 0x1FA7C, 0x1FA7A, 0x1FA7B, 0x1F6AA, 0x1F6D7, 0x1FA9E, 0x1FA9F, 0x1F6CF, 0x1F6CB, 0x1FA91, 0x1F6BD, 0x1FAA0, 0x1F6BF, 0x1F6C1, 0x1FAA4, 0x1FA92, 0x1F9F4, 0x1F9F7, 0x1F9F9, 0x1F9FA, 0x1F9FB, 0x1FAA3, 0x1F9FC, 0x1FAE7, 0x1FAA5, 0x1F9FD, 0x1F9EF, 0x1F6D2, 0x1F6AC, 0x26B0, 0x1FAA6, 0x26B1, 0x1F9FF, 0x1FAAC, 0x1F5FF, 0x1FAA7, 0x1FAAA, ]\n\t},\n\tsymbols: { \n\t\ticon: \"Grid\",\n\t\temojis: [0x1F3E7, 0x1F6AE, 0x1F6B0, 0x267F, 0x1F6B9, 0x1F6BA, 0x1F6BB, 0x1F6BC, 0x1F6BE, 0x1F6C2, 0x1F6C3, 0x1F6C4, 0x1F6C5, 0x26A0, 0x1F6B8, 0x26D4, 0x1F6AB, 0x1F6B3, 0x1F6AD, 0x1F6AF, 0x1F6B1, 0x1F6B7, 0x1F4F5, 0x1F51E, 0x2622, 0x2623, 0x2B06, 0x2197, 0x27A1, 0x2198, 0x2B07, 0x2199, 0x2B05, 0x2196, 0x2195, 0x2194, 0x21A9, 0x21AA, 0x2934, 0x2935, 0x1F503, 0x1F504, 0x1F519, 0x1F51A, 0x1F51B, 0x1F51C, 0x1F51D, 0x1F6D0, 0x269B, 0x1F549, 0x2721, 0x2638, 0x262F, 0x271D, 0x2626, 0x262A, 0x262E, 0x1F54E, 0x1F52F, 0x1FAAF, 0x2648, 0x2649, 0x264A, 0x264B, 0x264C, 0x264D, 0x264E, 0x264F, 0x2650, 0x2651, 0x2652, 0x2653, 0x26CE, 0x1F500, 0x1F501, 0x1F502, 0x25B6, 0x23E9, 0x23ED, 0x23EF, 0x25C0, 0x23EA, 0x23EE, 0x1F53C, 0x23EB, 0x1F53D, 0x23EC, 0x23F8, 0x23F9, 0x23FA, 0x23CF, 0x1F3A6, 0x1F505, 0x1F506, 0x1F4F6, 0x1F6DC, 0x1F4F3, 0x1F4F4, 0x2640, 0x2642, 0x26A7, 0x2716, 0x2795, 0x2796, 0x2797, 0x1F7F0, 0x267E, 0x203C, 0x2049, 0x2753, 0x2754, 0x2755, 0x2757, 0x3030, 0x1F4B1, 0x1F4B2, 0x2695, 0x267B, 0x269C, 0x1F531, 0x1F4DB, 0x1F530, 0x2B55, 0x2705, 0x2611, 0x2714, 0x274C, 0x274E, 0x27B0, 0x27BF, 0x303D, 0x2733, 0x2734, 0x2747, 0x00A9, 0x00AE, 0x2122, 0x1FADF, 0x0023, 0x002A, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x1F51F, 0x1F520, 0x1F521, 0x1F522, 0x1F523, 0x1F524, 0x1F170, 0x1F18E, 0x1F171, 0x1F191, 0x1F192, 0x1F193, 0x2139, 0x1F194, 0x24C2, 0x1F195, 0x1F196, 0x1F17E, 0x1F197, 0x1F17F, 0x1F198, 0x1F199, 0x1F19A, 0x1F201, 0x1F202, 0x1F237, 0x1F236, 0x1F22F, 0x1F250, 0x1F239, 0x1F21A, 0x1F232, 0x1F251, 0x1F238, 0x1F234, 0x1F233, 0x3297, 0x3299, 0x1F23A, 0x1F235, 0x1F534, 0x1F7E0, 0x1F7E1, 0x1F7E2, 0x1F535, 0x1F7E3, 0x1F7E4, 0x26AB, 0x26AA, 0x1F7E5, 0x1F7E7, 0x1F7E8, 0x1F7E9, 0x1F7E6, 0x1F7EA, 0x1F7EB, 0x2B1B, 0x2B1C, 0x25FC, 0x25FB, 0x25FE, 0x25FD, 0x25AA, 0x25AB, 0x1F536, 0x1F537, 0x1F538, 0x1F539, 0x1F53A, 0x1F53B, 0x1F4A0, 0x1F518, 0x1F533, 0x1F532, ]\n\t},\n\tflags: { \n\t\ticon: \"MapPin\",\n\t\temojis: [0x1F3C1, 0x1F6A9, 0x1F38C, 0x1F3F4, 0x1F3F3, 0x1F3F3, 0x1F3F3, 0x1F3F4, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E6, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E7, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E8, 0x1F1E9, 0x1F1E9, 0x1F1E9, 0x1F1E9, 0x1F1E9, 0x1F1E9, 0x1F1E9, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EA, 0x1F1EB, 0x1F1EB, 0x1F1EB, 0x1F1EB, 0x1F1EB, 0x1F1EB, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1EC, 0x1F1ED, 0x1F1ED, 0x1F1ED, 0x1F1ED, 0x1F1ED, 0x1F1ED, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EE, 0x1F1EF, 0x1F1EF, 0x1F1EF, 0x1F1EF, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F0, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F1, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F2, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F3, 0x1F1F4, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F5, 0x1F1F6, 0x1F1F7, 0x1F1F7, 0x1F1F7, 0x1F1F7, 0x1F1F7, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F8, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1F9, 0x1F1FA, 0x1F1FA, 0x1F1FA, 0x1F1FA, 0x1F1FA, 0x1F1FA, 0x1F1FA, 0x1F1FB, 0x1F1FB, 0x1F1FB, 0x1F1FB, 0x1F1FB, 0x1F1FB, 0x1F1FB, 0x1F1FC, 0x1F1FC, 0x1F1FD, 0x1F1FE, 0x1F1FE, 0x1F1FF, 0x1F1FF, 0x1F1FF, 0x1F3F4, 0x1F3F4, 0x1F3F4, ]\n\t}\n};\n"
  },
  {
    "path": "crowdin.yml",
    "content": "files:\n  - source: /locales/fr.json\n    translation: /locales/%two_letters_code%.json\n"
  },
  {
    "path": "database/DatabaseProvider.tsx",
    "content": "import { Database, Q } from \"@nozbe/watermelondb\";\nimport React, { createContext, useContext } from 'react';\n\nimport { error, info } from \"@/utils/logger/logger\";\n\nimport { database } from './index';\nimport { Absence, Attendance, Delay, Observation, Punishment } from \"./models/Attendance\";\nimport { Balance } from \"./models/Balance\";\nimport CanteenHistoryItem from \"./models/CanteenHistory\";\nimport CanteenMenu from \"./models/CanteenMenu\";\nimport { Chat, Message, Recipient } from \"./models/Chat\";\nimport { Grade, Period } from \"./models/Grades\";\nimport Homework from \"./models/Homework\";\nimport Kid from \"./models/Kid\";\nimport News from \"./models/News\";\nimport Subject from \"./models/Subject\";\nimport Course from \"./models/Timetable\";\nimport { batchOperations, safeWrite } from \"./utils/safeTransaction\";\nconst _db: Database = database;\n\nexport const getDatabaseInstance = (): Database => _db;\nconst DatabaseContext = createContext(database);\n\nexport const DatabaseProvider = ({ children }: { children: React.ReactNode }) => (\n  <DatabaseContext.Provider value={database}>{children}</DatabaseContext.Provider>\n);\n\nexport const useDatabase = () => useContext(DatabaseContext);\n\nexport async function ClearDatabaseForAccount(accountId: string) {\n  const db = getDatabaseInstance();\n  const tablesWithAccount = [\n    \"homework\",\n    \"news\",\n    \"periods\",\n    \"grades\",\n    \"periodgrades\",\n    \"attendance\",\n    \"canteenmenus\",\n    \"chats\",\n    \"courses\",\n    \"kids\",\n    \"balances\",\n    \"canteentransactions\",\n  ];\n\n  await safeWrite(db, async () => {\n    for (const table of tablesWithAccount) {\n      try {\n        const collection = db.get(table);\n        const records = await collection\n          .query(Q.where(\"createdByAccount\", accountId))\n          .fetch();\n\n        if (records.length > 0) {\n          await Promise.all(records.map((record) => record.markAsDeleted()));\n          await Promise.all(records.map((record) => record.destroyPermanently()));\n        }\n      } catch (err) {\n        error(String(err))\n      }\n    }\n  }, 10000, 'ClearDatabaseForAccount');\n}\n\nexport async function removeAllDuplicates() {\n  const db = getDatabaseInstance();\n\n  try {\n    const uniqueKeys = {\n      subjects: (r: Subject) => `${r.name}-${r.periodGradeId || ''}`,\n      homework: (r: Homework) => r.homeworkId,\n      news: (r: News) => r.newsId,\n      periods: (r: Period) => r.periodId,\n      grades: (r: Grade) => r.gradeId,\n      attendance: (r: Attendance) => r.attendanceId,\n      delays: (r: Delay) => `${r.attendanceId}-${r.givenAt}`,\n      observations: (r: Observation) => `${r.attendanceId}-${r.givenAt}`,\n      absences: (r: Absence) => `${r.attendanceId}-${r.from}-${r.to}`,\n      punishments: (r: Punishment) => `${r.attendanceId}-${r.givenAt}`,\n      canteenmenus: (r: CanteenMenu) => r.menuId,\n      chats: (r: Chat) => r.chatId,\n      recipients: (r: Recipient) => r.recipientId,\n      messages: (r: Message) => r.messageId,\n      courses: (r: Course) => r.courseId,\n      kids: (r: Kid) => r.kidId,\n      balances: (r: Balance) => r.balanceId,\n      canteentransactions: (r: CanteenHistoryItem) => r.transactionId,\n    };\n    let totalDuplicatesFound = 0;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const allDuplicatesToDelete: any[] = [];\n    for (const [tableName, keyFn] of Object.entries(uniqueKeys)) {\n      const tableDuplicates = await findTableDuplicates(db, tableName, keyFn);\n      if (tableDuplicates.length > 0) {\n        allDuplicatesToDelete.push(...tableDuplicates);\n        totalDuplicatesFound += tableDuplicates.length;\n      }\n    }\n\n    if (allDuplicatesToDelete.length > 0) {\n\n      await safeWrite(db, async () => {\n        const batches = batchOperations(allDuplicatesToDelete, 100);\n\n        for (const batch of batches) {\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          await Promise.all(batch.map((record: any) => record.markAsDeleted()));\n        }\n      }, 120000, 'removeAllDuplicates');\n\n      info(`🍉 Duplicate removal completed successfully`);\n    } else {\n      info(\"🍉 No duplicates found\");\n    }\n\n  } catch (err) {\n    error(`Failed to remove duplicates: ${err}`);\n    throw err;\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function findTableDuplicates(db: Database, tableName: string, keyFn: (record: any) => string): Promise<any[]> {\n  try {\n    const collection = db.collections.get(tableName);\n    const all = await collection.query().fetch();\n    const seen = new Map();\n    const duplicates = [];\n\n    for (const record of all) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const key = keyFn(record as any);\n      if (seen.has(key)) {\n        duplicates.push(record);\n      } else {\n        seen.set(key, record);\n      }\n    }\n\n    return duplicates;\n  } catch (err) {\n    error(`Failed to process table ${tableName}: ${err}`);\n    return [];\n  }\n}"
  },
  {
    "path": "database/index.ts",
    "content": "import { Database } from '@nozbe/watermelondb';\nimport SQLiteAdapter from '@nozbe/watermelondb/adapters/sqlite';\n\nimport { Absence, Attendance, Delay, Observation, Punishment } from '@/database/models/Attendance';\nimport CanteenMenu from '@/database/models/CanteenMenu';\nimport { Chat, Message, Recipient } from '@/database/models/Chat';\nimport Event from '@/database/models/Event';\nimport { Grade, Period, PeriodGrades } from '@/database/models/Grades';\nimport Homework from \"@/database/models/Homework\";\nimport Ical from '@/database/models/Ical';\nimport News from '@/database/models/News';\nimport Subject from '@/database/models/Subject';\nimport Course from '@/database/models/Timetable';\n\nimport { Balance } from './models/Balance';\nimport CanteenHistoryItem from './models/CanteenHistory';\nimport Kid from './models/Kid';\nimport { mySchema } from './schema';\n\nconst adapter = new SQLiteAdapter({\n  schema: mySchema,\n});\n\nexport const database = new Database({\n  adapter,\n  modelClasses: [\n    Event,\n    Ical,\n    Subject, \n    Homework,\n    News,\n    Period,\n    Grade,\n    PeriodGrades,\n    Attendance,\n    Delay,\n    Observation,\n    Absence,\n    Punishment,\n    CanteenMenu,\n    Chat,\n    Message,\n    Recipient,\n    Course,\n    Kid,\n    Balance,\n    CanteenHistoryItem\n  ],\n});\n"
  },
  {
    "path": "database/mappers/attendance.ts",
    "content": "import { Absence, Attendance, Delay, Observation, Punishment } from \"@/database/models/Attendance\";\nimport { Absence as SharedAbsence, Delay as SharedDelay, Observation as SharedObservation,Punishment as SharedPunishment } from \"@/services/shared/attendance\";\n\nexport function mapDelaysToShared(delays: Delay[], parent: Attendance): SharedDelay[] {\n  return delays.map(delay => ({\n    id: delay.id,\n    givenAt: new Date(delay.givenAt),\n    reason: delay.reason,\n    justified: delay.justified,\n    duration: delay.duration,\n    createdByAccount: parent.createdByAccount,\n    kidName: parent.kidName\n  }));\n}\n\nexport function mapAbsencesToShared(absences: Absence[], parent: Attendance): SharedAbsence[] {\n  return absences.map(absence => ({\n    id: absence.id,\n    from: new Date(absence.from),\n    to: new Date(absence.to),\n    reason: absence.reason,\n    justified: absence.justified,\n    createdByAccount: parent.createdByAccount,\n    kidName: parent.kidName\n  }));\n}\n\nexport function mapPunishmentsToShared(punishments: Punishment[]): SharedPunishment[] {\n  return punishments.map(punishment => ({\n    id: punishment.id,\n    givenAt: new Date(punishment.givenAt),\n    givenBy: punishment.givenBy,\n    exclusion: punishment.exclusion,\n    duringLesson: punishment.duringLesson,\n    homework: {\n      text: punishment.homeworkText,\n      documents: punishment.homeworkDocuments\n    },\n    reason: {\n      text: punishment.reasonText,\n      circumstances: punishment.reasonCircumstances,\n      documents: punishment.reasonDocuments\n    },\n    nature: punishment.nature,\n    duration: punishment.duration\n  }));\n}\n\nexport function mapObservationsToShared(observations: Observation[]): SharedObservation[] {\n  return observations.map(observation => ({\n    id: observation.id,\n    givenAt: new Date(observation.givenAt),\n    sectionName: observation.sectionName,\n    sectionType: observation.sectionType,\n    subjectName: observation.subjectName,\n    shouldParentsJustify: observation.shouldParentsJustify,\n    reason: observation.reason\n  }))\n}\n"
  },
  {
    "path": "database/mappers/balances.ts",
    "content": "import { Balance as SharedBalance } from \"@/services/shared/balance\";\n\nimport { Balance } from \"../models/Balance\";\n\nexport function mapBalancesToShared(balance: Balance): SharedBalance {\n  return {\n    createdByAccount: balance.createdByAccount,\n    currency: balance.currency,\n    lunchRemaining: balance.lunchRemaining,\n    lunchPrice: balance.lunchPrice,\n    amount: balance.amount,\n    label: balance.label,\n    fromCache: true\n  }\n}"
  },
  {
    "path": "database/mappers/canteen.ts",
    "content": "import CanteenMenu from \"@/database/models/CanteenMenu\";\nimport { CanteenMenu as SharedCanteenMenu, CanteenHistoryItem as SharedCanteenHistoryItem } from \"@/services/shared/canteen\";\nimport CanteenHistoryItem from \"../models/CanteenHistory\";\n\nexport function mapCanteenMenuToShared(menu: CanteenMenu): SharedCanteenMenu {\n  return {\n    date: new Date(menu.date),\n    lunch: menu.lunch,\n    dinner: menu.dinner,\n    createdByAccount: menu.createdByAccount,\n    fromCache: true\n  }\n}\n\nexport function mapCanteenTransactionToShared(transaction: CanteenHistoryItem): SharedCanteenHistoryItem {\n  return {\n    createdByAccount: transaction.createdByAccount,\n    date: new Date(transaction.date),\n    label: transaction.label,\n    currency: transaction.currency,\n    amount: transaction.amount\n  }\n}"
  },
  {
    "path": "database/mappers/chats.ts",
    "content": "import { Attachment } from \"@/services/shared/attachment\";\nimport { Chat as SharedChat, Message as SharedMessage,Recipient as SharedRecipient } from \"@/services/shared/chat\";\n\nimport { Chat, Message, Recipient } from \"../models/Chat\";\nimport { parseJsonArray } from \"../useHomework\";\n\nexport function mapChatsToShared(data: Chat[]): SharedChat[] {\n  return data.map(chat => ({\n    fromCache: true,\n    createdByAccount: chat.createdByAccount,\n    id: chat.chatId,\n    subject: chat.subject,\n    recipient: chat.recipient,\n    creator: chat.creator,\n    date: new Date(chat.date)\n  }))\n}\n\nexport function mapRecipientsToShared(data: Recipient[]): SharedRecipient[] {\n  return data.map(recipient => ({\n    id: recipient.id,\n    name: recipient.name,\n    class: recipient.class \n  }))\n}\n\nexport function mapMessagesToShared(data: Message[]): SharedMessage[] {\n  return data.map(message => ({\n    id: message.id,\n    content: message.content,\n    author: message.author,\n    subject: message.subject,\n    date: new Date(message.date),\n    attachments: parseJsonArray(message.attachments) as Attachment[]\n  }));\n}"
  },
  {
    "path": "database/mappers/course.ts",
    "content": "import { Course as SharedCourse } from \"@/services/shared/timetable\";\n\nimport Course from \"../models/Timetable\";\n\nexport function mapCourseToShared(course: Course): SharedCourse {\n  return {\n    subject: course.subject,\n    id: course.id,\n    fromCache: true,\n    createdByAccount: course.createdByAccount,\n    type: course.type,\n    from: new Date(course.from),\n    to: new Date(course.to),\n    additionalInfo: course.additionalInfo,\n    room: course.room,\n    teacher: course.teacher,\n    group: course.group,\n    backgroundColor: course.backgroundColor,\n    status: course.status,\n    customStatus: course.customStatus,\n    url: course.url,\n    kidName: course.kidName\n  }\n}"
  },
  {
    "path": "database/mappers/grade.ts",
    "content": "import { mapSubjectToShared } from \"@/database/mappers/subject\";\nimport { Grade, Period, PeriodGrades } from \"@/database/models/Grades\";\nimport { Attachment } from \"@/services/shared/attachment\";\nimport { Grade as SharedGrade, Period as SharedPeriod, PeriodGrades as SharedPeriodGrades } from \"@/services/shared/grade\";\n\nexport function mapPeriodToShared(period: Period): SharedPeriod {\n  return {\n    name: period.name,\n    id: period.id,\n    start: new Date(period.start),\n    end: new Date(period.end),\n    createdByAccount: period.createdByAccount,\n    kidName: period.kidName,\n    fromCache: true\n  }\n}\n\nexport function mapGradeToShared(grade: Grade): SharedGrade {\n  return {\n    id: grade.gradeId,\n    subjectName: grade.subjectName,\n    subjectId: grade.subjectId ?? \"\",\n    description: grade.description,\n    givenAt: new Date(grade.givenAt),\n    subjectFile: JSON.parse(grade.subjectFile ?? \"\") as Attachment,\n    correctionFile: JSON.parse(grade.correctionFile ?? \"\") as Attachment,\n    bonus: grade.bonus,\n    optional: grade.optional,\n    outOf: grade.outOf,\n    coefficient: grade.coefficient,\n    studentScore: grade.studentScore,\n    averageScore: grade.averageScore,\n    minScore: grade.minScore,\n    maxScore: grade.maxScore,\n    fromCache: true,\n    createdByAccount: grade.createdByAccount\n  }\n}\n\nexport function mapPeriodGradesToShared(data: PeriodGrades): SharedPeriodGrades {\n  return {\n    studentOverall: data.studentOverall,\n    classAverage: data.classAverage,\n    subjects: data.subjects.map(mapSubjectToShared),\n    createdByAccount: data.createdByAccount\n  }\n}"
  },
  {
    "path": "database/mappers/kids.ts",
    "content": "import { Kid as SharedKid } from \"@/services/shared/kid\";\n\nimport Kid from \"../models/Kid\";\n\nexport function mapKidsToShared(kid: Kid): SharedKid {\n  return {\n    createdByAccount: kid.createdByAccount,\n    id: kid.kidId,\n    firstName: kid.firstName,\n    lastName: kid.lastName,\n    class: kid.class,\n    dateOfBirth: new Date(kid.dateOfBirth)\n  }\n}"
  },
  {
    "path": "database/mappers/subject.ts",
    "content": "import { mapGradeToShared } from \"@/database/mappers/grade\";\nimport Subject from \"@/database/models/Subject\";\nimport { Subject as SharedSubject } from \"@/services/shared/grade\";\n\nexport function mapSubjectToShared(subject: Subject): SharedSubject {\n  return {\n    id: subject.id,\n    name: subject.name,\n    studentAverage: subject.studentAverage,\n    classAverage: subject.classAverage,\n    maximum: subject.maximum,\n    minimum: subject.minimum,\n    outOf: subject.outOf,\n    grades: subject.grades.map(mapGradeToShared)\n  }\n}\n"
  },
  {
    "path": "database/models/Attendance.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model } from '@nozbe/watermelondb';\nimport { children, field, relation } from '@nozbe/watermelondb/decorators';\n\nimport { Attachment } from '@/services/shared/attachment';\n\nexport class Attendance extends Model {\n  static table = \"attendance\";\n\n  static associations = {\n    delays: { type: 'has_many', foreignKey: 'attendanceId' },\n    absences: { type: 'has_many', foreignKey: 'attendanceId' },\n    observations: { type: 'has_many', foreignKey: 'attendanceId' },\n    punishments: { type: 'has_many', foreignKey: 'attendanceId' },\n  };\n  \n  @field('attendanceId') attendanceId: string;\n  @field('createdByAccount') createdByAccount: string;\n\t@field('kidName') kidName?: string;\n  @field('period') period: string;\n\n  @children('delays') delays!: Query<Delay>;\n  @children('absences') absences!: Query<Absence>;\n  @children('observations') observations!: Query<Observation>;\n  @children('punishments') punishments!: Query<Punishment>;\n}\n\nexport class Delay extends Model {\n  static table = \"delays\";\n\n  static associations = {\n    attendance: { type: 'belongs_to', key: 'attendanceId' },\n  };\n\n  @field('givenAt') givenAt: number;\n  @field('reason') reason?: string;\n  @field('justified') justified: boolean;\n  @field('duration') duration: number;\n  @field('attendanceId') attendanceId: string;\n\t@field('kidName') kidName: string;\n  @relation('attendance', 'attendanceId') attendance: Attendance;\n}\n\nexport class Observation extends Model {\n  static table = \"observations\";\n\n  static associations = {\n    attendance: { type: 'belongs_to', key: 'attendanceId' },\n  };\n\n  @field('givenAt') givenAt: number;\n  @field('sectionName') sectionName: string;\n  @field('sectionType') sectionType: number;\n  @field('subjectName') subjectName?: string;\n  @field('shouldParentsJustify') shouldParentsJustify: boolean;\n  @field('reason') reason?: string;\n  @field('attendanceId') attendanceId: string;\n  @relation('attendance', 'attendanceId') attendance: Attendance;\n}\n\nexport class Absence extends Model {\n  static table = \"absences\";\n\n  static associations = {\n    attendance: { type: 'belongs_to', key: 'attendanceId' },\n  };\n\n  @field('from') from: number;\n  @field('to') to: number;\n  @field('reason') reason?: string;\n  @field('justified') justified: boolean;\n  @field('attendanceId') attendanceId: string;\n\t@field('kidName') kidName: string;\n  @relation('attendance', 'attendanceId') attendance: Attendance;\n}\n\nexport class Punishment extends Model {\n  static table = \"punishments\";\n\n  static associations = {\n    attendance: { type: 'belongs_to', key: 'attendanceId' },\n  };\n\n  @field('givenAt') givenAt: number;\n  @field('givenBy') givenBy: string;\n  @field('exclusion') exclusion: boolean;\n  @field('duringLesson') duringLesson: boolean;\n  @field('nature') nature: string;\n  @field('duration') duration: number;\n\n  @field('homeworkDocumentsRaw') homeworkDocumentsRaw: string;\n  @field('reasonDocumentsRaw') reasonDocumentsRaw: string;\n  @field('homeworkText') homeworkText: string;\n  @field('reasonText') reasonText: string;\n  @field('reasonCircumstances') reasonCircumstances: string;\n  @field('attendanceId') attendanceId: string;\n  @relation('attendance', 'attendanceId') attendance: Attendance;\n\n  get homeworkDocuments(): Attachment[] {\n    return JSON.parse(this.homeworkDocumentsRaw);\n  }\n\n  get reasonDocuments(): Attachment[] {\n    return JSON.parse(this.reasonDocumentsRaw);\n  }\n}"
  },
  {
    "path": "database/models/Balance.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model } from '@nozbe/watermelondb';\nimport { children, field, relation } from '@nozbe/watermelondb/decorators';\n\nexport class Balance extends Model {\n\tstatic table = \"balances\";\n\n\t@field('createdByAccount') createdByAccount: string;\n\t@field('balanceId') balanceId: string;\n\t@field('amount') amount: number;\n\t@field('currency') currency: string;\n\t@field('lunchRemaining') lunchRemaining: number;\n\t@field('lunchPrice') lunchPrice: number;\n\t@field('label') label: string;\n}"
  },
  {
    "path": "database/models/CanteenHistory.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model } from '@nozbe/watermelondb';\nimport { field } from '@nozbe/watermelondb/decorators';\n\nexport default class CanteenHistoryItem extends Model {\n    static table = \"canteentransactions\";\n\n    @field('transactionId') transactionId: string;\n    @field('date') date: number;\n    @field('label') label: string;\n    @field('currency') currency: string;\n    @field('amount') amount: number;\n    @field('createdByAccount') createdByAccount: string;\n}"
  },
  {
    "path": "database/models/CanteenMenu.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model } from '@nozbe/watermelondb';\nimport { field } from '@nozbe/watermelondb/decorators';\n\nimport { Meal } from '@/services/shared/canteen';\n\nexport default class CanteenMenu extends Model {\n  \tstatic table = \"canteenmenus\";\n\n\t@field('menuId') menuId: string;\n\t@field('date') date: number;\n\t@field('lunch') lunchRaw: string;\n\t@field('dinner') mealRaw: string;\n\t@field('createdByAccount') createdByAccount: string;\n\t\n\tget lunch(): Meal {\n\t  return JSON.parse(this.lunchRaw);\n\t}\n\n\tget dinner(): Meal {\n\t  return JSON.parse(this.mealRaw);\n\t}\n}"
  },
  {
    "path": "database/models/Chat.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model, Relation } from '@nozbe/watermelondb';\nimport { children, field, relation } from '@nozbe/watermelondb/decorators';\n\nexport class Chat extends Model {\n  static table = 'chats';\n\t\n  static associations = {\n    recipients: { type: 'has_many', foreignKey: 'chatId' },\n    messages: { type: 'has_many', foreignKey: 'chatId' },\n  };\n\n\t@field('createdByAccount') createdByAccount: string;\n\t@field('chatId') chatId: string;\n\t@field('subject') subject: string;\n\t@field('recipient') recipient?: string;\n\t@field('creator') creator?: string;\n\t@field('date') date: number;\n\t@children('recipients') recipients?: Relation<Recipient>;\n\t@children('messages') messages?: Relation<Message>;\n}\n\nexport class Recipient extends Model {\n  static table = 'recipients';\n\n  static associations = {\n    chats: { type: 'belongs_to', key: 'chatId' },\n  };\n\n\t@field('recipientId') recipientId: string;\n\t@field('name') name: string;\n\t@field('class') class?: string;\n\t@field('chatId') chatId: string;\n\t@relation('chats', 'chatId') chat: Chat;\n}\n\nexport class Message extends Model {\n  static table = 'messages';\n\n  static associations = {\n    chats: { type: 'belongs_to', key: 'chatId' },\n  };\n\n\t@field('messageId') messageId: string;\n\t@field('content') content: string;\n\t@field('author') author: string;\n\t@field('subject') subject: string;\n\t@field('date') date: number;\n\t@field('attachments') attachments: string;\n\t@field('chatId') chatId: string;\n\t@relation('chats', 'chatId') chat: Chat;\n}"
  },
  {
    "path": "database/models/Event.ts",
    "content": "// @ts-nocheck\n\nimport { Model } from '@nozbe/watermelondb';\nimport { field, relation } from '@nozbe/watermelondb/decorators';\n\nexport default class Event extends Model {\n  static table = 'events';\n\n  static associations = {\n    subjects: { type: 'belongs_to', key: 'subject_id' },\n  };\n\n  @field('title') title!: string;\n  @field('start') start!: number;\n  @field('end') end!: number;\n  @field('color') color?: string;\n  @field('room') room?: string;\n  @field('teacher') teacher?: string;\n  @field('status') status?: string;\n  @field('canceled') canceled?: boolean;\n  @field('readonly') readonly?: boolean;\n  @field('subject_id') subject_id?: string;\n  @relation('subjects', 'subject_id') subject: any;\n}\n"
  },
  {
    "path": "database/models/Grades.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model } from '@nozbe/watermelondb';\nimport { children, field, relation } from \"@nozbe/watermelondb/decorators\";\n\nimport { GradeScore } from '@/services/shared/grade';\n\nimport Subject from './Subject';\n\nexport class Period extends Model {\n  static table = 'periods';\n\n  static associations = {\n    periodgrades: { type: 'has_many', foreignKey: 'periodId' },\n  };\n\n  @field('createdByAccount') createdByAccount: string;\n\t@field('kidName') kidName?: string;\n  @field('name') name: string;\n  @field('periodId') periodId: string;\n  @field('start') start: number;\n  @field('end') end: number;\n  @children('periodgrades') grades: PeriodGrades[];\n}\n\nexport class Grade extends Model {\n  static table = 'grades';\n\n  static associations = {\n    subjects: { type: 'belongs_to', key: 'subjectId' },\n  };\n\n  @field('createdByAccount') createdByAccount: string;\n  @field('gradeId') gradeId: string;\n  @field('subjectName') subjectName: string;\n  @field('subjectId') subjectId?: string;\n  @relation('subjects', 'subjectId') subject?: Subject;\n  @field('description') description: string;\n  @field('givenAt') givenAt: number;\n  @field('subjectFile') subjectFile?: string;\n  @field('correctionFile') correctionFile?: string;\n  @field('bonus') bonus?: boolean;\n  @field('optional') optional?: boolean;\n  @field('coefficient') coefficient: number;\n\t@field('outOf') outOfRaw: string;\n\t@field('studentScore') studentScoreRaw: string;\n\t@field('averageScore') averageScoreRaw: string;\n\t@field('minScore') minScoreRaw: string;\n\t@field('maxScore') maxScoreRaw: string;\n\n\tget outOf(): GradeScore {\n\t  return JSON.parse(this.outOfRaw || '{}');\n\t}\n\n\tget studentScore(): GradeScore {\n\t  return JSON.parse(this.studentScoreRaw || '{}');\n\t}\n\n\tget averageScore(): GradeScore {\n\t  return JSON.parse(this.averageScoreRaw || '{}');\n\t}\n\n\tget minScore(): GradeScore {\n\t  return JSON.parse(this.minScoreRaw || '{}');\n\t}\n\n\tget maxScore(): GradeScore {\n\t  return JSON.parse(this.maxScoreRaw || '{}');\n\t}\n}\n\nexport class PeriodGrades extends Model {\n  static table = 'periodgrades';\n\n  static associations = {\n    periods: { type: 'belongs_to', key: 'periodId' },\n    subjects: { type: 'has_many', foreignKey: 'periodGradeId' },\n  };\n\n  @field('periodGradeId') id: string;\n  @field('createdByAccount') createdByAccount: string;\n  @field('studentOverall') studentOverallRaw: string;\n  @field('classAverage') classAverageRaw: string;\n  @field('periodId') periodId: string;\n\n  @relation('periods', 'periodId') period: Period;\n  @children('subjects') subjects: Subject[];\n\n  get studentOverall(): GradeScore {\n    return JSON.parse(this.studentOverallRaw || '{}');\n  }\n\n  get classAverage(): GradeScore {\n    return JSON.parse(this.classAverageRaw || '{}');\n  }\n}\n"
  },
  {
    "path": "database/models/Homework.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model } from '@nozbe/watermelondb';\nimport { field} from \"@nozbe/watermelondb/decorators\";\n\nexport default class Homework extends Model {\n  static table = 'homework';\n\n  static associations = {\n    subjects: { type: 'belongs_to', key: 'subjectId' },\n  };\n\n  @field('createdByAccount') createdByAccount: string;\n\t@field('kidName') kidName: string;\n  @field('homeworkId') homeworkId: string;\n  @field('subject') subject: string;\n  @field('content') content: string;\n  @field('dueDate') dueDate: number;\n  @field('isDone') isDone: boolean;\n  @field('returnFormat') returnFormat: number;\n  @field('attachments') attachments: string;\n  @field('evaluation') evaluation: boolean;\n  @field('custom') custom: boolean;\n}"
  },
  {
    "path": "database/models/Ical.ts",
    "content": "// @ts-nocheck\n\nimport { Model } from '@nozbe/watermelondb';\nimport { field } from '@nozbe/watermelondb/decorators';\n\nexport default class Ical extends Model {\n  static table = 'icals';\n\n  @field('title') title!: string;\n  @field('url') url!: string;\n  @field('lastupdated') lastUpdated!: number;\n  @field('intelligent_parsing') intelligentParsing!: boolean;\n  @field('provider') provider!: string;\n}\n"
  },
  {
    "path": "database/models/Kid.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model } from '@nozbe/watermelondb';\nimport { field } from \"@nozbe/watermelondb/decorators\";\n\nexport default class Kid extends Model {\n  static table = 'kids';\n\n  @field('createdByAccount') createdByAccount: string;\n  @field('kidId') kidId: string;\n\t@field('firstName') firstName: string;\n\t@field('lastName') lastName: string;\n\t@field('class') class: string;\n\t@field('dateOfBirth') dateOfBirth: number\n}"
  },
  {
    "path": "database/models/News.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model } from \"@nozbe/watermelondb\";\nimport { field, text } from \"@nozbe/watermelondb/decorators\";\n\nexport default class News extends Model {\n  static table = 'news';\n\n  @field('createdByAccount') createdByAccount!: string;\n  @field('newsId') newsId!: string;\n  @text('title') title!: string;\n  @field('createdAt') createdAt!: number;\n  @field('acknowledged') acknowledged!: boolean;\n  @text('attachments') attachments!: string;\n  @text('content') content!: string;\n  @text('author') author!: string;\n  @text('category') category!: string;\n  @field('question') question!: boolean;\n}\n"
  },
  {
    "path": "database/models/Subject.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model } from '@nozbe/watermelondb';\nimport { children,field, relation } from \"@nozbe/watermelondb/decorators\";\n\nimport { GradeScore } from '@/services/shared/grade';\n\nimport { Grade, PeriodGrades } from './Grades';\n\nexport default class Subject extends Model {\n  static table = 'subjects';\n\n  static associations = {\n    periodgrades: { type: 'belongs_to', key: 'periodGradeId' },\n    grades: { type: 'has_many', foreignKey: 'subjectId' },\n  };\n\n  @field('name') name: string;\n  @field('subjectId') subjectId: string;\n  @field('studentAverage') studentAverageRaw: string;\n  @field('classAverage') classAverageRaw: string;\n  @field('maximum') maximumRaw: string;\n  @field('minimum') minimumRaw: string;\n  @field('outOf') outOfRaw: string;\n  @field('periodGradeId') periodGradeId?: string;\n\n  @relation('periodgrades', 'periodGradeId') periodGrade?: PeriodGrades;\n  @children('grades') grades: Grade[];\n\n  get studentAverage(): GradeScore {\n    return JSON.parse(this.studentAverageRaw || '{}');\n  }\n\n  get classAverage(): GradeScore {\n    return JSON.parse(this.classAverageRaw || '{}');\n  }\n\n  get maximum(): GradeScore {\n    return JSON.parse(this.maximumRaw || '{}');\n  }\n\n  get minimum(): GradeScore {\n    return JSON.parse(this.minimumRaw || '{}');\n  }\n\n  get outOf(): GradeScore {\n    return JSON.parse(this.outOfRaw || '{}');\n  }\n}\n"
  },
  {
    "path": "database/models/Timetable.ts",
    "content": "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { Model } from '@nozbe/watermelondb';\nimport { field } from \"@nozbe/watermelondb/decorators\";\n\nexport default class Course extends Model {\n  static table = 'courses';\n\n  @field('createdByAccount') createdByAccount: string;\n  @field('kidName') kidName: string;\n  @field('courseId') courseId: string;\n  @field('subject') subject: string;\n  @field('type') type: number;\n  @field('from') from: number;\n  @field('to') to: number;\n  @field('additionalInfo') additionalInfo?: string;\n  @field('room') room?: string;\n  @field('teacher') teacher?: string;\n  @field('group') group?: string;\n  @field('backgroundColor') backgroundColor?: string;\n  @field('status') status?: number;\n  @field('customStatus') customStatus?: string;\n  @field('url') url?: string;\n}"
  },
  {
    "path": "database/schema.ts",
    "content": "import { appSchema, tableSchema } from '@nozbe/watermelondb';\n\nexport const mySchema = appSchema({\n  version: 37,\n  tables: [\n    tableSchema({\n      name: 'events',\n      columns: [\n        { name: 'title', type: 'string' },\n        { name: 'start', type: 'number' },\n        { name: 'end', type: 'number' },\n        { name: 'color', type: 'string', isOptional: true },\n        { name: 'room', type: 'string', isOptional: true },\n        { name: 'teacher', type: 'string', isOptional: true },\n        { name: 'status', type: 'string', isOptional: true },\n        { name: 'canceled', type: 'boolean', isOptional: true },\n        { name: 'readonly', type: 'boolean', isOptional: true },\n        { name: 'subject_id', type: 'string', isOptional: true, isIndexed: true },\n      ],\n    }),\n    tableSchema({\n      name: 'icals',\n      columns: [\n        { name: 'title', type: 'string' },\n        { name: 'url', type: 'string' },\n        { name: 'lastupdated', type: 'number' },\n        { name: 'intelligent_parsing', type: 'boolean', isOptional: true },\n        { name: 'provider', type: 'string', isOptional: true },\n      ],\n    }),\n    tableSchema({\n      name: 'subjects',\n      columns: [\n        { name: 'name', type: 'string' },\n        { name: 'subjects', type: 'string' },\n        { name: 'studentAverage', type: 'string' },\n        { name: 'classAverage', type: 'string' },\n        { name: 'maximum', type: 'string' },\n        { name: 'minimum', type: 'string' },\n        { name: 'outOf', type: 'string' },\n        { name: 'periodGradeId', type: 'string', isOptional: true, isIndexed: true }\n      ],\n    }),\n    tableSchema({\n      name: 'homework',\n      columns: [\n        { name: 'homeworkId', type: 'string' },\n        { name: 'subject', type: 'string' },\n        { name: 'content', type: 'string' },\n        { name: 'dueDate', type: 'number' },\n        { name: 'isDone', type: 'boolean' },\n        { name: 'returnFormat', type: 'number' },\n        { name: \"attachments\", type: 'string', isOptional: true },\n        { name: 'evaluation', type: 'boolean' },\n        { name: 'custom', type: 'boolean' },\n        { name: 'createdByAccount', type: \"string\" },\n        { name: 'kidName', type: \"string\", isOptional: true }\n      ],\n    }),\n    tableSchema({\n      name: 'news',\n      columns: [\n        { name: 'newsId', type: 'string' },\n        { name: 'title', type: 'string' },\n        { name: 'createdAt', type: 'number' },\n        { name: 'acknowledged', type: 'boolean' },\n        { name: \"attachments\", type: 'string', isOptional: true },\n        { name: 'content', type: 'string' },\n        { name: 'author', type: 'string' },\n        { name: 'category', type: 'string' },\n        { name: 'createdByAccount', type: \"string\" },\n        { name: 'question', type: 'boolean', isOptional: true }\n      ],\n    }),\n    tableSchema({\n      name: 'periods',\n      columns: [\n        { name: 'name', type: 'string' },\n        { name: 'periodId', type: 'string' },\n        { name: 'start', type: 'number' },\n        { name: 'end', type: 'number' },\n        { name: 'createdByAccount', type: \"string\" },\n        { name: 'kidName', type: \"string\", isOptional: true }\n        \n      ],\n    }),\n    tableSchema({\n      name: 'grades',\n      columns: [\n        { name: 'createdByAccount', type: 'string' },\n        { name: 'gradeId', type: 'string' },\n        { name: 'subjectName', type: 'string' },\n        { name: 'subjectId', type: 'string', isOptional: true },\n        { name: 'description', type: 'string' },\n        { name: 'givenAt', type: 'number' },\n        { name: 'subjectFile', type: 'string', isOptional: true },\n        { name: 'correctionFile', type: 'string', isOptional: true },\n        { name: 'bonus', type: 'boolean', isOptional: true },\n        { name: 'optional', type: 'boolean', isOptional: true },\n        { name: 'coefficient', type: 'number' },\n        { name: 'outOf', type: 'string' },\n        { name: 'studentScore', type: 'string' },\n        { name: 'averageScore', type: 'string' },\n        { name: 'minScore', type: 'string' },\n        { name: 'maxScore', type: 'string' }\n      ],\n    }),\n    tableSchema({\n      name: 'periodgrades',\n      columns: [\n        { name: 'periodGradeId', type: 'string' },\n        { name: 'periodId', type: 'string', isIndexed: true },\n        { name: 'createdByAccount', type: 'string' },\n        { name: 'studentOverall', type: 'string' },\n        { name: 'classAverage', type: 'string' }\n      ]\n    }),\n    tableSchema({\n      name: \"attendance\",\n      columns: [\n        { name: \"attendanceId\", type: 'string' },\n        { name: 'createdByAccount', type: 'string' },\n        { name: 'kidName', type: 'string', isOptional: true },\n        { name: 'period', type: 'string' }\n      ]\n    }),\n    tableSchema({\n      name: \"delays\",\n      columns: [\n        { name: 'givenAt', type: 'number' },\n        { name: 'reason', type: 'string', isOptional: true },\n        { name: 'justified', type: 'boolean' },\n        { name: 'duration', type: 'number' },\n        { name: 'attendanceId', type: 'string', isIndexed: true },\n        { name: 'kidName', type: 'string', isOptional: true }\n      ]\n    }),\n    tableSchema({\n      name: \"observations\",\n      columns: [\n        { name: 'givenAt', type: 'number' },\n        { name: 'sectionName', type: 'string' },\n        { name: 'sectionType', type: 'string' },\n        { name: 'subjectName', type: 'string', isOptional: true },\n        { name: 'shouldParentsJustify', type: 'boolean' },\n        { name: 'reason', type: 'string' },\n        { name: 'attendanceId', type: 'string', isIndexed: true }\n      ]\n    }),\n    tableSchema({\n      name: \"absences\",\n      columns: [\n        { name: 'from', type: 'number' },\n        { name: 'to', type: 'number' },\n        { name: 'reason', type: 'string', isOptional: true },\n        { name: 'justified', type: 'boolean' },\n        { name: 'attendanceId', type: 'string', isIndexed: true },\n        { name: 'kidName', type: 'string', isOptional: true }\n      ]\n    }),\n    tableSchema({\n      name: \"punishments\",\n      columns: [\n        { name: 'givenAt', type: 'number' },\n        { name: 'givenBy', type: 'string' },\n        { name: 'exclusion', type: 'boolean' },\n        { name: 'duringLesson', type: 'boolean' },\n        { name: 'nature', type: 'string' },\n        { name: 'duration', type: 'number' },\n        { name: 'homeworkDocumentsRaw', type: 'string' },\n        { name: 'reasonDocumentsRaw', type: 'string' },\n        { name: 'homeworkText', type: 'string' },\n        { name: 'reasonText', type: 'string' },\n        { name: 'reasonCircumstances', type: 'string' },\n        { name: 'attendanceId', type: 'string', isIndexed: true }\n      ]\n    }),\n    tableSchema({\n      name: \"canteenmenus\",\n      columns: [\n        { name: 'menuId', type: 'string' },\n        { name: 'date', type: 'number' },\n        { name: 'lunch', type: 'string', isOptional: true },\n        { name: 'dinner', type: 'string', isOptional: true },\n        { name: 'createdByAccount', type: 'string' }\n      ]\n    }),\n    tableSchema({\n      name: \"chats\",\n      columns: [\n        { name: 'chatId', type: 'string' },\n        { name: 'subject', type: 'string' },\n        { name: 'recipient', type: 'string', isOptional: true },\n        { name: 'creator', type: 'string', isOptional: true },\n        { name: 'date', type: 'number' },\n        { name: 'createdByAccount', type: 'string' }\n      ]\n    }),\n    tableSchema({\n      name: \"recipients\",\n      columns: [\n        { name: 'recipientId', type: 'string' },\n        { name: 'name', type: 'string' },\n        { name: 'class', type: 'string', isOptional: true },\n        { name: 'chatId', type: 'string', isIndexed: true }\n      ]\n    }),\n    tableSchema({\n      name: \"messages\",\n      columns: [\n        { name: 'messageId', type: 'string' },\n        { name: 'content', type: 'string' },\n        { name: 'author', type: 'string' },\n        { name: 'subject', type: 'string' },\n        { name: 'date', type: 'number' },\n        { name: 'attachments', type: 'string' },\n        { name: 'chatId', type: 'string', isIndexed: true }\n      ]\n    }),\n    tableSchema({\n      name: \"courses\",\n      columns: [\n        { name: 'createdByAccount', type: 'string' },\n        { name: 'kidName', type: 'string', isOptional: true },\n        { name: 'courseId', type: 'string' },\n        { name: 'subject', type: 'string' },\n        { name: 'type', type: 'number' },\n        { name: 'from', type: 'number' },\n        { name: 'to', type: 'number' },\n        { name: 'additionalInfo', type: 'string', isOptional: true },\n        { name: 'room', type: 'string', isOptional: true },\n        { name: 'teacher', type: 'string', isOptional: true },\n        { name: 'group', type: 'string', isOptional: true },\n        { name: 'backgroundColor', type: 'string', isOptional: true },\n        { name: 'status', type: 'number', isOptional: true },\n        { name: 'customStatus', type: 'string', isOptional: true },\n        { name: 'url', type: 'string', isOptional: true }\n      ]\n    }),\n    tableSchema({\n      name: \"kids\",\n      columns:[\n        { name: 'createdByAccount', type: 'string' },\n        { name: 'kidId', type: 'string' },\n        { name: 'firstName', type: 'string' },\n        { name: 'lastName', type: 'string' },\n        { name: 'class', type: 'string' },\n        { name: 'dateOfBirth', type: 'number' },\n      ]\n    }),\n    tableSchema({\n      name: \"balances\",\n      columns: [\n        { name: 'createdByAccount', type: 'string' },\n        { name: 'balanceId', type: 'string' },\n        { name: 'amount', type: 'number' },\n        { name: 'currency', type: 'string' },\n        { name: 'lunchRemaining', type: 'number' },\n        { name: 'lunchPrice', type: 'number' },\n        { name: 'label', type: 'string' }\n      ]\n    }),\n    tableSchema({\n      name: \"canteentransactions\",\n      columns: [\n        { name: 'createdByAccount', type: 'string' },\n        { name: 'transactionId', type: 'string' },\n        { name: 'date', type: 'number' },\n        { name: 'label', type: 'string' },\n        { name: 'currency', type: 'string' },\n        { name: 'amount', type: 'number' },\n      ]\n    })\n  ],\n});\n"
  },
  {
    "path": "database/useAttendance.ts",
    "content": "import { Q } from \"@nozbe/watermelondb\";\n\nimport {Attendance as SharedAttendance } from \"@/services/shared/attendance\";\nimport { generateId } from \"@/utils/generateId\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance } from \"./DatabaseProvider\";\nimport { mapAbsencesToShared, mapDelaysToShared, mapObservationsToShared,mapPunishmentsToShared } from \"./mappers/attendance\";\nimport { Absence, Attendance, Delay, Observation, Punishment } from \"./models/Attendance\";\nimport { safeWrite } from \"./utils/safeTransaction\";\n\nexport async function addAttendanceToDatabase(attendances: SharedAttendance[], period: string) {\n  const db = getDatabaseInstance();\n  for (const attendance of attendances) {\n    const id = generateId(attendance.createdByAccount + period + attendance.kidName);\n\n    await safeWrite(db, async () => {\n      const existing = await db.get('attendance').query(Q.where('attendanceId', id)).fetch();\n\n      if (existing.length > 0) {\n        const existingAttendance = existing[0] as Attendance;\n\n        await existingAttendance.update(record => {\n          record.createdByAccount = attendance.createdByAccount;\n          record.kidName = attendance.kidName ?? undefined;\n          record.period = period;\n        });\n\n        await Promise.all([\n          ...(await existingAttendance.delays.fetch()).map((d: Delay) => d.markAsDeleted()),\n          ...(await existingAttendance.absences.fetch()).map((a: Absence) => a.markAsDeleted()),\n          ...(await existingAttendance.observations.fetch()).map((o: Observation) => o.markAsDeleted()),\n          ...(await existingAttendance.punishments.fetch()).map((p: Punishment) => p.markAsDeleted()),\n        ]);\n\n\n        for (const delay of attendance.delays) {\n          await db.get('delays').create(record => {\n            Object.assign(record, {\n              givenAt: delay.givenAt.getTime(),\n              reason: delay.reason,\n              justified: delay.justified,\n              duration: delay.duration,\n              attendanceId: id,\n              kidName: delay.kidName\n            });\n          });\n        }\n\n        for (const absence of attendance.absences) {\n          await db.get('absences').create(record => {\n            Object.assign(record, {\n              from: absence.from.getTime(),\n              to: absence.to.getTime(),\n              reason: absence.reason,\n              justified: absence.justified,\n              attendanceId: id,\n              kidName: absence.kidName\n            });\n          });\n        }\n\n        for (const observation of attendance.observations) {\n          await db.get('observations').create(record => {\n            Object.assign(record, {\n              givenAt: observation.givenAt.getTime(),\n              sectionName: observation.sectionName,\n              sectionType: observation.sectionType,\n              subjectName: observation.subjectName,\n              shouldParentsJustify: observation.shouldParentsJustify,\n              reason: observation.reason,\n              attendanceId: id\n            });\n          });\n        }\n\n        for (const punishment of attendance.punishments) {\n          await db.get('punishments').create(record => {\n            Object.assign(record, {\n              givenAt: punishment.givenAt.getTime(),\n              givenBy: punishment.givenBy,\n              exclusion: punishment.exclusion,\n              duringLesson: punishment.duringLesson,\n              nature: punishment.nature,\n              duration: punishment.duration,\n              homeworkDocumentsRaw: JSON.stringify(punishment.homework.documents ?? []),\n              reasonDocumentsRaw: JSON.stringify(punishment.reason.documents ?? []),\n              homeworkText: punishment.homework.text,\n              reasonText: punishment.reason.text,\n              reasonCircumstances: punishment.reason.circumstances,\n              attendanceId: id\n            });\n          });\n        }\n      } else {\n        await db.get('attendance').create(record => {\n          const att = record as Attendance;\n          att.attendanceId = id;\n          att.createdByAccount = attendance.createdByAccount;\n          att.period = period;\n        });\n\n        for (const delay of attendance.delays) {\n          await db.get('delays').create(record => {\n            Object.assign(record, {\n              givenAt: delay.givenAt.getTime(),\n              reason: delay.reason,\n              justified: delay.justified,\n              duration: delay.duration,\n              attendanceId: id\n            });\n          });\n        }\n\n        for (const absence of attendance.absences) {\n          await db.get('absences').create(record => {\n            Object.assign(record, {\n              from: absence.from.getTime(),\n              to: absence.to.getTime(),\n              reason: absence.reason,\n              justified: absence.justified,\n              attendanceId: id\n            });\n          });\n        }\n\n        for (const observation of attendance.observations) {\n          await db.get('observations').create(record => {\n            Object.assign(record, {\n              givenAt: observation.givenAt.getTime(),\n              sectionName: observation.sectionName,\n              sectionType: observation.sectionType,\n              subjectName: observation.subjectName,\n              shouldParentsJustify: observation.shouldParentsJustify,\n              reason: observation.reason,\n              attendanceId: id\n            });\n          });\n        }\n\n        for (const punishment of attendance.punishments) {\n          await db.get('punishments').create(record => {\n            Object.assign(record, {\n              givenAt: punishment.givenAt.getTime(),\n              givenBy: punishment.givenBy,\n              exclusion: punishment.exclusion,\n              duringLesson: punishment.duringLesson,\n              nature: punishment.nature,\n              duration: punishment.duration,\n              homeworkDocumentsRaw: JSON.stringify(punishment.homework.documents ?? []),\n              reasonDocumentsRaw: JSON.stringify(punishment.reason.documents ?? []),\n              homeworkText: punishment.homework.text,\n              reasonText: punishment.reason.text,\n              reasonCircumstances: punishment.reason.circumstances,\n              attendanceId: id\n            });\n          });\n        }\n      }\n    }, 10000, 'addAttendanceToDatabase');\n  }\n}\n\n\nexport async function getAttendanceFromCache(period: string): Promise<SharedAttendance> {\n  try {\n    const database = getDatabaseInstance();\n\n    const attendance = await database\n      .get<Attendance>('attendance')\n      .query(Q.where('period', period))\n      .fetch();\n\n    if (!attendance[0]) {\n      throw new Error(\"Attendance not found\");\n    }\n    const att = attendance[0];\n    return {\n      createdByAccount: att.createdByAccount,\n      delays: mapDelaysToShared(att.delays, att),\n      absences: mapAbsencesToShared(att.absences, att),\n      punishments: mapPunishmentsToShared(att.punishments),\n      observations: mapObservationsToShared(att.observations),\n      fromCache: true\n    };\n  } catch (err) {\n    error(\"Failed to fetch attendance from cache: \" + String(err));\n  }\n}\n"
  },
  {
    "path": "database/useBalance.ts",
    "content": "import { Model, Q } from \"@nozbe/watermelondb\";\n\nimport { Balance as SharedBalance } from \"@/services/shared/balance\";\nimport { generateId } from \"@/utils/generateId\";\nimport { warn } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance } from \"./DatabaseProvider\";\nimport { mapBalancesToShared } from \"./mappers/balances\";\nimport { Balance } from \"./models/Balance\";\nimport { safeWrite } from \"./utils/safeTransaction\";\n\nexport async function removeBalanceFromDatabase(serviceId: string) {\n  const db = getDatabaseInstance();\n  const dbBalances = await db.get<Balance>('balances')\n    .query(\n      Q.where('createdByAccount', serviceId)\n    )\n    .fetch();\n  \n  for (const balance of dbBalances) {\n    if (balance.createdByAccount === serviceId) {\n      await safeWrite(db, async () => {\n        balance.markAsDeleted()\n      })\n    }\n  }\n}\n\nexport async function addBalancesToDatabase(balances: SharedBalance[]) {\n  const db = getDatabaseInstance();\n  for (const balance of balances) {\n    const id = generateId(balance.label + balance.createdByAccount)\n    const existing = await db.get('balances').query(Q.where('balanceId', id)).fetch();\n\n    if (existing.length === 0) {\n      await safeWrite(db, async () => {\n        await db.get('balances').create((record: Model) => {\n          const balanceModel = record as Balance;\n          Object.assign(balanceModel, {\n            createdByAccount: balance.createdByAccount,\n            balanceId: id,\n            currency: balance.currency,\n            amount: balance.amount,\n            lunchRemaining: balance.lunchRemaining,\n            lunchPrice: balance.lunchPrice,\n            label: balance.label\n          })\n        })\n      }, 10000, 'addBalancesToDatabase')\n    }\n  }\n}\n\nexport async function getBalancesFromCache(): Promise<SharedBalance[]> {\n  try {\n    const database = getDatabaseInstance();\n    const balances = await database\n      .get<Balance>('balances')\n      .query()\n      .fetch()\n\n    return balances.map(mapBalancesToShared)\n  } catch (e) {\n    warn(String(e));\n    return [];\n  }\n}"
  },
  {
    "path": "database/useCanteen.ts",
    "content": "import { Model, Q } from \"@nozbe/watermelondb\";\n\nimport { CanteenHistoryItem as SharedCanteenHistoryItem,CanteenMenu as SharedCanteenMenu } from \"@/services/shared/canteen\";\nimport { generateId } from \"@/utils/generateId\";\nimport { info,warn } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance } from \"./DatabaseProvider\";\nimport { mapCanteenMenuToShared, mapCanteenTransactionToShared } from \"./mappers/canteen\";\nimport CanteenHistoryItem from \"./models/CanteenHistory\";\nimport CanteenMenu from \"./models/CanteenMenu\";\nimport { safeWrite } from \"./utils/safeTransaction\";\n\n\nexport async function addCanteenMenuToDatabase(menus: SharedCanteenMenu[]) {\n  const db = getDatabaseInstance();\n\n  const menusToCreate: Array<{\n    id: string;\n    item: SharedCanteenMenu;\n  }> = [];\n\n  for (const item of menus) {\n    const id = generateId(item.createdByAccount + item.date);\n    const existing = await db.get('canteenmenus').query(Q.where('menuId', id)).fetch();\n\n    if (existing.length === 0) {\n      menusToCreate.push({ id, item });\n    }\n  }\n\n  if (menusToCreate.length > 0) {\n    await safeWrite(\n      db,\n      async () => {\n        const promises = menusToCreate.map(({ id, item }) =>\n          db.get('canteenmenus').create((record: Model) => {\n            const menu = record as CanteenMenu;\n            Object.assign(menu, {\n              menuId: id,\n              date: item.date.getTime(),\n              lunch: JSON.stringify(item.lunch),\n              dinner: JSON.stringify(item.dinner),\n              createdByAccount: item.createdByAccount\n            });\n          })\n        );\n        await Promise.all(promises);\n      },\n      10000,\n      `add_canteen_menus_${menusToCreate.length}_items`\n    );\n  } else {\n    info(`🍉 No new canteen menus to add (all ${menus.length} already exist)`);\n  }\n}\n\nexport async function getCanteenMenuFromCache(startDate: Date): Promise<SharedCanteenMenu[]> {\n  try {\n    const database = getDatabaseInstance();\n    const { start, end } = getWeekRangeForDate(startDate);\n\n    const menus = await database\n      .get<CanteenMenu>('canteenmenus')\n      .query(Q.where('date', Q.between(start.getTime(), end.getTime())))\n      .fetch();\n\n    return menus\n      .map(mapCanteenMenuToShared)\n      .sort((a, b) => a.date.getTime() - b.date.getTime());\n  } catch (e) {\n    warn(String(e));\n    return [];\n  }\n}\n\nexport async function addCanteenTransactionToDatabase(transactions: SharedCanteenHistoryItem[]) {\n  const db = getDatabaseInstance();\n\n  const transactionsToCreate: Array<{\n    id: string;\n    item: SharedCanteenHistoryItem;\n  }> = [];\n\n  for (const item of transactions) {\n    const id = generateId(item.createdByAccount + item.date + item.amount + item.label + item.currency);\n    const existing = await db.get('canteentransactions').query(\n      Q.where('transactionId', id)\n    ).fetch();\n\n    if (existing.length === 0) {\n      transactionsToCreate.push({ id, item });\n    }\n  }\n\n  if (transactionsToCreate.length > 0) {\n    await safeWrite(\n      db,\n      async () => {\n        const promises = transactionsToCreate.map(({ id, item }) =>\n          db.get('canteentransactions').create((record: Model) => {\n            const transaction = record as CanteenHistoryItem;\n            Object.assign(transaction, {\n              createdByAccount: item.createdByAccount,\n              transactionId: id,\n              date: item.date,\n              label: item.label,\n              currency: item.currency,\n              amount: item.amount\n            });\n          })\n        );\n        await Promise.all(promises);\n      },\n      10000,\n      `add_canteen_transactions_${transactionsToCreate.length}_items`\n    );\n  } else {\n    info(`🍉 No new canteen transactions to add (all ${transactions.length} already exist)`);\n  }\n}\n\nexport async function getCanteenTransactionsFromCache(): Promise<SharedCanteenHistoryItem[]> {\n  try {\n    const database = getDatabaseInstance();\n\n    const transactions = await database\n      .get<CanteenHistoryItem>('canteentransactions')\n      .query()\n      .fetch();\n\n    return transactions\n      .map(mapCanteenTransactionToShared)\n      .sort((a, b) => a.date.getTime() - b.date.getTime());\n  } catch (e) {\n    warn(String(e));\n    return [];\n  }\n}\n\nexport function getWeekRangeForDate(date: Date) {\n  const day = date.getDay();\n  const diffToMonday = (day === 0 ? -6 : 1) - day;\n  const start = new Date(date);\n  start.setHours(0, 0, 0, 0);\n  start.setDate(start.getDate() + diffToMonday);\n\n  const end = new Date(start);\n  end.setDate(start.getDate() + 6);\n  end.setHours(23, 59, 59, 999);\n\n  return { start, end };\n}"
  },
  {
    "path": "database/useChat.ts",
    "content": "import { Model, Q } from \"@nozbe/watermelondb\";\n\nimport { Chat as SharedChat, Message as SharedMessage, Recipient as SharedRecipient } from \"@/services/shared/chat\";\nimport { generateId } from \"@/utils/generateId\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance } from \"./DatabaseProvider\";\nimport { mapChatsToShared, mapMessagesToShared, mapRecipientsToShared } from \"./mappers/chats\";\nimport { Chat, Message, Recipient } from \"./models/Chat\";\nimport { safeWrite } from \"./utils/safeTransaction\";\n\nexport async function addChatsToDatabase(chats: SharedChat[]) {\n  const db = getDatabaseInstance();\n  for (const item of chats) {\n    const id = generateId(item.createdByAccount + item.subject + item.date)\n    const existing = await db.get('chats').query(Q.where('chatId', id)).fetch();\n\n    if (existing.length === 0) {\n      await safeWrite(db, async () => {\n        await db.get('chats').create((record: Model) => {\n          const chat = record as Chat;\n          Object.assign(chat, {\n            chatId: id,\n            subject: item.subject,\n            recipient: item.recipient,\n            creator: item.creator,\n            date: item.date.getTime(),\n            createdByAccount: item.createdByAccount\n          })\n        })\n      }, 10000, 'addChatsToDatabase')\n    }\n  }\n}\n\nexport async function addRecipientsToDatabase(chat: SharedChat, recipients: SharedRecipient[]) {\n  const db = getDatabaseInstance();\n  const chatId = generateId(chat.createdByAccount + chat.subject + chat.date)\n  const dbChat = await db.get('chats').find(chatId);\n  if (!dbChat) {\n    error(\"We're unable to find the chat in cache, please rehydrate chats before...\")\n  }\n\n  for (const item of recipients) {\n    const id = generateId(chatId + item.name + item.class)\n    const existing = await db.get('recipients').query(\n      Q.where('recipientId', id)\n    ).fetch();\n\n    if (existing.length > 0) {continue;}\n\t\t\n    await safeWrite(db, async () => {\n      await db.get('recipients').create((record: Model) => {\n        const recipient = record as Recipient;\n        Object.assign(recipient, {\n          recipientId: id,\n          name: item.name,\n          class: item.class,\n          chatId: chatId\n        })\n      })\n    }, 10000, 'addRecipientsToDatabase')\n  }\n}\n\nexport async function addMessagesToDatabase(chat: SharedChat, messages: SharedMessage[]) {\n  const db = getDatabaseInstance();\n  const chatId = generateId(chat.createdByAccount + chat.subject + chat.date)\n  const dbChat = await db.get('chats').find(chatId);\n  if (!dbChat) {\n    error(\"We're unable to find the chat in cache, please rehydrate chats before...\")\n  }\n\n  for (const item of messages) {\n    const id = generateId(chatId + item.content + item.author + item.date + item.subject)\n    const existing = await db.get('messages').query(\n      Q.where('messageId', id)\n    ).fetch();\n\n    if (existing.length > 0) {continue;}\n\t\t\n    await safeWrite(db, async () => {\n      await db.get('messages').create((record: Model) => {\n        const message = record as Message;\n        Object.assign(message, {\n          messageId: id,\n          subject: item.subject,\n          content: item.content,\n          author: item.author,\n          date: item.date.getTime(),\n          attachments: JSON.stringify(item.attachments),\n          chatId: chatId\n        })\n      })\n    }, 10000, 'addMessagesToDatabase')\n  }\n}\n\nexport async function getChatsFromCache(): Promise<SharedChat[]> {\n  try {\n    const database = getDatabaseInstance();\n    const chats = await database.get<Chat>('chats').query();\n\n    return mapChatsToShared(chats)\n  } catch (e) {\n    error(String(e));\n  }\n}\n\nexport async function getRecipientsFromCache(chat: SharedChat): Promise<SharedRecipient[]> {\n  try {\n    const database = getDatabaseInstance();\n    const chatId = generateId(chat.createdByAccount + chat.subject + chat.date);\n    const recipients = await database.get<Recipient>('recipients').query(\n      Q.where('chatId', chatId)\n    ).fetch();\n\n    return mapRecipientsToShared(recipients);\n  } catch (e) {\n    error(String(e));\n  }\n}\n\nexport async function getMessagesFromCache(chat: SharedChat): Promise<SharedMessage[]> {\n  try {\n    const database = getDatabaseInstance();\n    const chatId = generateId(chat.createdByAccount + chat.subject + chat.date);\n    const messages = await database.get<Message>('messages').query(\n      Q.where('chatId', chatId)\n    ).fetch();\n\n    return mapMessagesToShared(messages);\n  } catch (e) {\n    error(String(e));\n  }\n}\n"
  },
  {
    "path": "database/useEvents.ts",
    "content": "import { Q } from '@nozbe/watermelondb';\nimport { useEffect, useState } from 'react';\n\nimport { useDatabase } from './DatabaseProvider';\nimport Event from './models/Event';\n\nexport function useEventsForDay(date: Date, refresh = 0) {\n  const database = useDatabase();\n  const [eventsWithSubjects, setEventsWithSubjects] = useState<any[]>([]);\n\n  useEffect(() => {\n    const startOfDay = new Date(date);\n    startOfDay.setHours(0, 0, 0, 0);\n    const endOfDay = new Date(date);\n    endOfDay.setHours(23, 59, 59, 999);\n\n    const query = database.get<Event>('events').query(\n      Q.where('start', Q.between(startOfDay.getTime(), endOfDay.getTime()))\n    );\n    const subscription = query.observe().subscribe(async (events) => {\n      const eventsWithSubjects = await Promise.all(\n        events.map(async (event) => {\n          const subject = await event.subject.fetch();\n          // Use event.start from the Event instance, not from _raw\n          return { ...event._raw, start: event.start, end: event.end, subject: subject ? subject._raw : null };\n        })\n      );\n      setEventsWithSubjects(eventsWithSubjects.sort((a, b) => a.start - b.start));\n    });\n    return () => subscription.unsubscribe();\n  }, [date, database, refresh]);\n\n  return eventsWithSubjects;\n}\n"
  },
  {
    "path": "database/useEventsById.ts",
    "content": "import { Q } from '@nozbe/watermelondb';\nimport { useEffect, useState } from 'react';\n\nimport { useDatabase } from './DatabaseProvider';\nimport Event from './models/Event';\n\nexport function useEventById(id: string | number | undefined) {\n  const database = useDatabase();\n  const [event, setEvent] = useState<Event | null>(null);\n\n  useEffect(() => {\n    if (!id) {\n      setEvent(null);\n      return;\n    }\n    const query = database.get<Event>('events').query(Q.where('id', id));\n    const subscription = query.observe().subscribe(events => {\n      setEvent(events[0] || null);\n    });\n    return () => subscription.unsubscribe();\n  }, [id, database]);\n\n  return event;\n}\n"
  },
  {
    "path": "database/useGrades.ts",
    "content": "import { Model, Q } from \"@nozbe/watermelondb\";\n\nimport { Grade as SharedGrade, Period as SharedPeriod, PeriodGrades as SharedPeriodGrades } from \"@/services/shared/grade\";\nimport { generateId } from \"@/utils/generateId\";\nimport { error, warn } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance } from \"./DatabaseProvider\";\nimport { mapPeriodGradesToShared,mapPeriodToShared } from \"./mappers/grade\";\nimport { Grade, Period, PeriodGrades } from \"./models/Grades\";\nimport { safeWrite } from \"./utils/safeTransaction\";\n\nexport async function addPeriodsToDatabase(periods: SharedPeriod[]) {\n  const db = getDatabaseInstance();\n\n  await safeWrite(db, async () => {\n    for (const item of periods) {\n      const id = generateId(item.name + item.createdByAccount);\n\n      const existing = await db.get('periods')\n        .query(Q.where(\"periodId\", id))\n        .fetch();\n\n      if (existing.length === 0) {\n        await db.get('periods').create((record: Model) => {\n          const period = record as Period;\n          Object.assign(period, {\n            periodId: id,\n            name: item.name,\n            createdByAccount: item.createdByAccount,\n            start: item.start.getTime(),\n            end: item.end.getTime(),\n          });\n        });\n      }\n    }\n  }, 10000, 'addPeriodsToDatabase');\n}\n\n\nexport async function getPeriodsFromCache(): Promise<SharedPeriod[]> {\n  try {\n    const database = getDatabaseInstance();\n\n    const period = await database\n      .get<Period>('periods')\n      .query()\n      .fetch();\n\n    return period\n      .map(mapPeriodToShared)\n      .sort((a, b) => a.end.getTime() - b.end.getTime());\n  } catch (e) {\n    warn(String(e));\n    return [];\n  }\n}\n\nexport async function addGradesToDatabase(grades: SharedGrade[], subject: string) {\n  const db = getDatabaseInstance();\n  for (const item of grades) {\n    const id = generateId(item.createdByAccount + item.description + item.givenAt)\n\n    const existing = await db.get('grades').query(Q.where('gradeId', id)).fetch();\n\n    if(existing.length === 0) {\n      await safeWrite(db, async () => {\n        await db.get('grades').create((record: Model) => {\n          const grade = record as Grade\n          Object.assign(grade, {\n            gradeId: id,\n            createdByAccount: item.createdByAccount,\n            subjectName: item.subjectName,\n            subjectId: generateId(subject),\n            description: item.description,\n            givenAt: item.givenAt.getTime(),\n            subjectFile: JSON.stringify(item.subjectFile),\n            correctionFile: JSON.stringify(item.correctionFile),\n            bonus: item.bonus,\n            optional: item.optional,\n            outOf: JSON.stringify(item.outOf),\n            coefficient: item.coefficient,\n            studentScore: JSON.stringify(item.studentScore),\n            averageScore: JSON.stringify(item.averageScore),\n            minScore: JSON.stringify(item.minScore),\n            maxScore: JSON.stringify(item.maxScore)\n          })\n        })\n      }, 10000, 'addGradesToDatabase')\n    }\n  }\n}\n\nexport async function addPeriodGradesToDatabase(item: SharedPeriodGrades, period: string) {\n  const db = getDatabaseInstance();\n  const id = generateId(period + item.createdByAccount);\n\n  const existing = await db.get('periodgrades').query(\n    Q.where(\"id\", id)\n  ).fetch();\n\n  await safeWrite(db, async () => {\n    if (existing.length > 0) {\n      await existing[0].update((record: Model) => {\n        const periodGrade = record as PeriodGrades;\n        Object.assign(periodGrade, {\n          createdByAccount: item.createdByAccount,\n          studentOverallRaw: JSON.stringify(item.studentOverall),\n          classAverageRaw: JSON.stringify(item.classAverage)\n        });\n      });\n    } else {\n      await db.get('periodgrades').create((record: Model) => {\n        const periodGrade = record as PeriodGrades;\n        Object.assign(periodGrade, {\n          id: id,\n          createdByAccount: item.createdByAccount,\n          studentOverallRaw: JSON.stringify(item.studentOverall),\n          classAverageRaw: JSON.stringify(item.classAverage)\n        });\n      });\n    }\n  }, 10000, 'addPeriodGradesToDatabase');\n}\n\nexport async function getGradePeriodsFromCache(period: string): Promise<SharedPeriodGrades> {\n  try {\n    const database = getDatabaseInstance();\n    const id = generateId(period)\n    const periodgrades = await database\n      .get<PeriodGrades>('periodgrades')\n      .query(Q.where('id', id))\n      .fetch();\n\n    return mapPeriodGradesToShared(periodgrades[0])\n  } catch (e) {\n    error(String(e));\n  }\n}\n"
  },
  {
    "path": "database/useHomework.ts",
    "content": "import { Model, Q } from \"@nozbe/watermelondb\";\nimport { useEffect, useState } from \"react\";\n\nimport { Attachment } from \"@/services/shared/attachment\";\nimport { Homework as SharedHomework } from \"@/services/shared/homework\";\nimport { generateId } from \"@/utils/generateId\";\nimport { warn } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance, useDatabase } from \"./DatabaseProvider\";\nimport Homework from \"./models/Homework\";\nimport { safeWrite } from \"./utils/safeTransaction\";\n\nfunction mapHomeworkToShared(homework: Homework): SharedHomework {\n  return {\n    id: homework.homeworkId,\n    subject: homework.subject,\n    content: homework.content,\n    dueDate: new Date(homework.dueDate),\n    isDone: homework.isDone,\n    returnFormat: homework.returnFormat,\n    attachments: parseJsonArray(homework.attachments) as Attachment[],\n    evaluation: homework.evaluation,\n    custom: homework.custom,\n    createdByAccount: homework.createdByAccount,\n    kidName: homework.kidName,\n    fromCache: true,\n  };\n}\n\nexport function useHomeworkForWeek(weekNumber: number, refresh = 0) {\n  const database = useDatabase();\n  const [homeworks, setHomeworks] = useState<SharedHomework[]>([]);\n\n  useEffect(() => {\n    const fetchHomeworks = async () => {\n      const homeworksFetched = await getHomeworksFromCache(weekNumber);\n      setHomeworks(homeworksFetched);\n    };\n    fetchHomeworks();\n  }, [weekNumber, refresh, database]);\n\n  return homeworks;\n}\n\nexport async function getHomeworksFromCache(\n  weekNumber: number\n): Promise<SharedHomework[]> {\n  try {\n    const database = getDatabaseInstance();\n    const { start, end } = getDateRangeOfWeek(weekNumber);\n    const homeworks = await database\n      .get<Homework>(\"homework\")\n      .query(Q.where(\"dueDate\", Q.between(start.getTime(), end.getTime())))\n      .fetch();\n\n    return homeworks\n      .map(mapHomeworkToShared)\n      .sort((a, b) => a.dueDate.getTime() - b.dueDate.getTime());\n  } catch (e) {\n    warn(String(e));\n    return [];\n  }\n}\n\nexport async function addHomeworkToDatabase(homeworks: SharedHomework[]) {\n  const db = getDatabaseInstance();\n\n  const weekNumber = getWeekNumberFromDate(homeworks[0].dueDate);\n  const { start, end } = getDateRangeOfWeek(weekNumber);\n  const dbHomeworks = await db.get<Homework>(\"homework\")\n    .query(Q.where(\"dueDate\", Q.between(start.getTime(), end.getTime())))\n    .fetch();\n\n  const homeworkIds: string[] = [];\n  for (const hw of homeworks) {\n    const oldId = generateId(hw.subject + hw.content + hw.createdByAccount);\n    const id = generateId(\n      hw.subject + hw.content + hw.createdByAccount + hw.dueDate.toDateString()\n    );\n\n    homeworkIds.push(oldId, id);\n  }\n\n  const homeworksToDelete = dbHomeworks.filter(\n    dbHomeworks => !homeworkIds.includes(dbHomeworks.homeworkId)\n  );\n\n  for (const homework of homeworksToDelete) {\n    await homework.markAsDeleted();\n  }\n\n  for (const hw of homeworks) {\n    const oldId = generateId(hw.subject + hw.content + hw.createdByAccount);\n    const id = generateId(\n      hw.subject + hw.content + hw.createdByAccount + hw.dueDate.toDateString()\n    );\n\n    const existing = await db\n      .get(\"homework\")\n      .query(Q.where(\"homeworkId\", id))\n      .fetch();\n    const oldExisting = await db\n      .get(\"homework\")\n      .query(Q.where(\"homeworkId\", oldId))\n      .fetch();\n\n    for (const oldRecord of oldExisting) {\n      await oldRecord.markAsDeleted();\n    }\n\n    if (existing.length === 0) {\n      await safeWrite(\n        db,\n        async () => {\n          await db.get(\"homework\").create((record: Model) => {\n            const homework = record as Homework;\n            Object.assign(homework, {\n              homeworkId: id,\n              subject: hw.subject,\n              content: hw.content,\n              dueDate: hw.dueDate.getTime(),\n              isDone: hw.isDone,\n              returnFormat: hw.returnFormat,\n              attachments: JSON.stringify(hw.attachments),\n              evaluation: hw.evaluation,\n              custom: hw.custom,\n              createdByAccount: hw.createdByAccount,\n              kidName: hw.kidName,\n              fromCache: true,\n            });\n          });\n        },\n        10000,\n        \"addHomeworkToDatabase\"\n      );\n    } else {\n      const recordToUpdate = existing[0];\n      await safeWrite(\n        db,\n        async () => {\n          await recordToUpdate.update((record: Model) => {\n            const homework = record as Homework;\n            Object.assign(homework, {\n              subject: hw.subject,\n              content: hw.content,\n              dueDate: hw.dueDate.getTime(),\n              isDone: hw.isDone,\n              returnFormat: hw.returnFormat,\n              attachments: JSON.stringify(hw.attachments),\n              evaluation: hw.evaluation,\n              custom: hw.custom,\n              createdByAccount: hw.createdByAccount,\n              kidName: hw.kidName,\n              fromCache: true,\n            });\n          });\n        },\n        10000,\n        \"updateHomeworkToDatabase\"\n      );\n    }\n  }\n}\n\nexport async function updateHomeworkIsDone(\n  homeworkId: string,\n  isDone: boolean\n) {\n  const db = getDatabaseInstance();\n\n  const existing = await db\n    .get(\"homework\")\n    .query(Q.where(\"homeworkId\", homeworkId))\n    .fetch();\n\n  if (existing.length === 0) {\n    warn(`Homework with ID ${homeworkId} not found`);\n    return;\n  }\n\n  const recordToUpdate = existing[0];\n\n  await safeWrite(\n    db,\n    async () => {\n      await recordToUpdate.update((record: Model) => {\n        const homework = record as Homework;\n        homework.isDone = isDone;\n      });\n    },\n    10000,\n    \"updateHomeworkIsDone\"\n  );\n}\n\nexport function getDateRangeOfWeek(\n  weekNumber: number,\n  year = new Date().getFullYear()\n) {\n  const janFirst = new Date(year, 0, 1);\n  const daysOffset = (weekNumber - 1) * 7;\n  const weekStart = new Date(janFirst.setDate(janFirst.getDate() + daysOffset));\n  const day = weekStart.getDay();\n  const diff = weekStart.getDate() - day + (day <= 4 ? 1 : 8);\n  const start = new Date(weekStart.setDate(diff));\n  const end = new Date(start);\n  end.setDate(start.getDate() + 6);\n  start.setHours(0, 0, 0, 0);\n  end.setHours(23, 59, 59, 999);\n  return { start, end };\n}\n\nexport function parseJsonArray(s: string): unknown[] {\n  try {\n    const result = JSON.parse(s);\n    return Array.isArray(result) ? result : [];\n  } catch {\n    return [];\n  }\n}\n\nexport function getWeekNumberFromDate(date: Date): number {\n  const startOfYear = new Date(date.getFullYear(), 0, 1);\n  const days = Math.floor(\n    (date.getTime() - startOfYear.getTime()) / (1000 * 60 * 60 * 24)\n  );\n  return Math.ceil((days + startOfYear.getDay() + 1) / 7);\n}\n"
  },
  {
    "path": "database/useIcals.ts",
    "content": "import { useCallback,useEffect, useState } from 'react';\n\nimport { useDatabase } from './DatabaseProvider';\nimport Ical from './models/Ical';\nimport { safeWrite } from \"./utils/safeTransaction\";\n\nexport function useIcals(refresh = 0) {\n  const database = useDatabase();\n  const [icals, setIcals] = useState<Ical[]>([]);\n\n  useEffect(() => {\n    const query = database.get<Ical>('icals').query();\n    const subscription = query.observe().subscribe(setIcals);\n    return () => subscription.unsubscribe();\n  }, [database, refresh]);\n\n  return icals;\n}\n\nexport function useAddIcal() {\n  const database = useDatabase();\n  return useCallback(async (title: string, url: string, intelligentParsing: boolean = false, provider: string = 'unknown') => {\n    await safeWrite(database, async () => {\n      await database.get('icals').create((ical: any) => {\n        ical.title = title;\n        ical.url = url;\n        ical.lastUpdated = Date.now();\n        ical.intelligentParsing = intelligentParsing;\n        ical.provider = provider;\n      });\n    }, 10000, 'useAddIcal');\n  }, [database]);\n}\n\nexport function useRemoveIcal() {\n  const database = useDatabase();\n  return useCallback(async (id: string) => {\n    await safeWrite(database, async () => {\n      const ical = await database.get('icals').find(id);\n      await ical.destroyPermanently();\n    }, 10000, 'useRemoveIcal');\n  }, [database]);\n}\n\nexport function useUpdateIcalParsing() {\n  const database = useDatabase();\n  return useCallback(async (id: string, intelligentParsing: boolean) => {\n    await safeWrite(database,async () => {\n      const ical = await database.get('icals').find(id);\n      await ical.update((ical: any) => {\n        ical.intelligentParsing = intelligentParsing;\n      });\n    }, 1000, 'useUpdateIcalParsing');\n  }, [database]);\n}\n"
  },
  {
    "path": "database/useKids.ts",
    "content": "import { Model, Q } from \"@nozbe/watermelondb\";\n\nimport { Kid as SharedKid } from \"@/services/shared/kid\";\nimport { warn } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance } from \"./DatabaseProvider\";\nimport { mapKidsToShared } from \"./mappers/kids\";\nimport Kid from \"./models/Kid\";\nimport { safeWrite } from \"./utils/safeTransaction\";\n\nexport async function addKidToDatabase(kids: SharedKid[]) {\n  const db = getDatabaseInstance()\n  for (const kid of kids) {\n    const existing = await db.get('kids').query(Q.where('kidId', kid.id)).fetch();\n\n    if (existing.length === 0) {\n      await safeWrite(db, async () => {\n        await db.get('kids').create((record: Model) => {\n          const kidsModel = record as Kid\n          Object.assign(kidsModel, {\n            createByAccount: kid.createdByAccount,\n            kidId: kid.id,\n            firstName: kid.firstName,\n            lastName: kid.lastName,\n            class: kid.class,\n            dateOfBirth: kid.dateOfBirth.getTime()\n          })\n        })\n      }, 10000, 'addKidToDatabase')\n    }\n  }\n}\n\nexport async function getKidsFromCache(): Promise<SharedKid[]> {\n  try {\n    const db = getDatabaseInstance();\n    const kids = await db\n      .get<Kid>('kids')\n      .query()\n      .fetch()\n\n    return kids.map(mapKidsToShared)\n  } catch (error) {\n    warn(String(error))\n    return[]\n  }\n}"
  },
  {
    "path": "database/useNews.ts",
    "content": "import { Model, Q } from \"@nozbe/watermelondb\";\nimport { useEffect, useState } from \"react\";\n\nimport { Attachment } from \"@/services/shared/attachment\";\nimport { News as SharedNews } from \"@/services/shared/news\";\nimport { generateId } from \"@/utils/generateId\";\nimport { info,warn } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance, useDatabase } from \"./DatabaseProvider\";\nimport News from \"./models/News\";\nimport { parseJsonArray } from \"./useHomework\";\nimport { safeWrite } from \"./utils/safeTransaction\";\n\nexport function useNews(refresh = 0) {\n  const database = useDatabase();\n  const [news, setNews] = useState<SharedNews[]>([]);\n\n  useEffect(() => {\n\n    const query = database.get<News>('news').query();\n\n    const sub = query.observe().subscribe(news =>\n      setNews(\n        news.map(mapNewsToShared).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())\n      )\n    );\n\n    return () => sub.unsubscribe();\n  }, [refresh, database]);\n\n  return news;\n}\n\nexport async function addNewsToDatabase(news: SharedNews[]) {\n  const db = getDatabaseInstance();\n\n  const itemsToCreate: Array<{ id: string; item: SharedNews }> = [];\n  const itemsToUpdate: Array<{ record: Model; item: SharedNews }> = [];\n\n  for (const item of news) {\n    const id = generateId(item.author + item.title + item.createdByAccount);\n\n    const existingRecords = await db.get('news')\n      .query(Q.where(\"newsId\", id))\n      .fetch();\n\n    if (existingRecords.length === 0) {\n      itemsToCreate.push({ id, item });\n    } else {\n      itemsToUpdate.push({ record: existingRecords[0], item });\n    }\n  }\n\n  if (itemsToCreate.length > 0 || itemsToUpdate.length > 0) {\n    await safeWrite(\n      db,\n      async () => {\n        const createPromises = itemsToCreate.map(({ id, item }) =>\n          db.get('news').create((record: Model) => {\n            const newsModel = record as News;\n            newsModel.newsId = id;\n            newsModel.title = item.title ?? \"\";\n            newsModel.createdAt = item.createdAt.getTime();\n            newsModel.acknowledged = item.acknowledged;\n            newsModel.attachments = JSON.stringify(item.attachments ?? []);\n            newsModel.content = item.content ?? \"\";\n            newsModel.author = item.author ?? \"\";\n            newsModel.category = item.category ?? \"\";\n            newsModel.createdByAccount = item.createdByAccount ?? \"\";\n            newsModel.question = item.question ?? false;\n          })\n        );\n\n        const updatePromises = itemsToUpdate.map(({ record, item }) =>\n          record.update((model: Model) => {\n            const newsModel = model as News;\n            newsModel.title = item.title ?? newsModel.title;\n            newsModel.createdAt = item.createdAt.getTime();\n            newsModel.acknowledged = item.acknowledged;\n            newsModel.attachments = JSON.stringify(item.attachments ?? []);\n            newsModel.content = item.content ?? newsModel.content;\n            newsModel.author = item.author ?? newsModel.author;\n            newsModel.category = item.category ?? newsModel.category;\n            newsModel.createdByAccount = item.createdByAccount ?? newsModel.createdByAccount;\n            newsModel.question = item.question ?? newsModel.question;\n          })\n        );\n\n        await Promise.all([...createPromises, ...updatePromises]);\n      },\n      10000,\n      `add_news_${itemsToCreate.length}_create_${itemsToUpdate.length}_update`\n    );\n  } else {\n    info(`🍉 No news items to process`);\n  }\n}\n\n\nexport async function getNewsFromCache(): Promise<SharedNews[]> {\n  try {\n    const database = getDatabaseInstance();\n\n    const news = await database\n      .get<News>('news')\n      .query()\n      .fetch();\n\n    return news\n      .map(mapNewsToShared)\n      .sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n  } catch (e) {\n    warn(String(e));\n    return [];\n  }\n}\n\nfunction mapNewsToShared(news: News): SharedNews {\n  return {\n    id: news.id,\n    title: news.title,\n    createdAt: new Date(news.createdAt),\n    acknowledged: news.acknowledged,\n    attachments: parseJsonArray(news.attachments) as Attachment[],\n    content: news.content,\n    author: news.author,\n    category: news.category,\n    createdByAccount: news.createdByAccount,\n    fromCache: true\n  };\n}"
  },
  {
    "path": "database/usePeriodsCache.tsx",
    "content": "import { useEffect, useMemo, useState } from \"react\"\nimport { Grade, Period } from \"./models/Grades\"\nimport { getDatabaseInstance, useDatabase } from \"./DatabaseProvider\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { Q } from \"@nozbe/watermelondb\";\n\nexport function usePeriods() {\n  const database = useDatabase()\n  const [periods, setPeriods] = useState<any[]>([])\n\n  const store = useAccountStore.getState();\n\n  useEffect(() => {\n    const collection = database.get<Period>(\"periods\")\n\n    // Load existing rows from cache\n    setPeriods(Array.from(collection._cache.map.values()).map((model) => model._raw).filter((row) => row.createdByAccount === store.lastUsedAccount))\n\n    // Observe future updates\n    const subscription = collection\n      .query(\n        Q.where(\"createdByAccount\", store.lastUsedAccount)\n      )\n      .observe()\n      .subscribe((rows) => {\n        setPeriods(\n          rows.map((row) => ({\n            ...row._raw,\n            start: new Date(row.start),\n            end: new Date(row.end),\n          }))\n        );\n      });\n\n    // update all periods to change start to new Date(start)\n    setPeriods((prevPeriods) =>\n      prevPeriods.map((period) => ({\n        ...period,\n        start: new Date(period.start),\n        end: new Date(period.end),\n      }))\n    );\n\n    return () => subscription.unsubscribe()\n  }, [database])\n\n  return periods;\n}"
  },
  {
    "path": "database/useSubject.ts",
    "content": "import { Model, Q } from \"@nozbe/watermelondb\";\n\nimport { Subject as SharedSubject } from \"@/services/shared/grade\";\nimport { generateId } from \"@/utils/generateId\";\nimport { info } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance } from \"./DatabaseProvider\";\nimport Subject from \"./models/Subject\";\nimport { safeWrite } from \"./utils/safeTransaction\";\n\nexport async function addSubjectsToDatabase(\n  subjects: SharedSubject[],\n  periodGradeId?: string\n) {\n  const db = getDatabaseInstance();\n\n  const subjectsToCreate: Array<{\n    id: string;\n    item: SharedSubject;\n  }> = [];\n\n  for (const item of subjects) {\n    const id = generateId(item.name);\n    const existingForAccount = await db.get('subjects').query(Q.where('subjectId', id)).fetch();\n\n    if (existingForAccount.length === 0) {\n      subjectsToCreate.push({ id, item });\n    }\n  }\n\n  if (subjectsToCreate.length > 0) {\n    await safeWrite(\n      db,\n      async () => {\n        const promises = subjectsToCreate.map(({ id, item }) =>\n          db.get('subjects').create((record: Model) => {\n            const subject = record as Subject;\n            Object.assign(subject, {\n              subjectId: id,\n              name: item.name,\n              studentAverage: JSON.stringify(item.studentAverage),\n              classAverage: JSON.stringify(item.classAverage),\n              maximum: JSON.stringify(item.maximum),\n              minimum: JSON.stringify(item.minimum),\n              outOf: JSON.stringify(item.outOf),\n              periodGradeId: periodGradeId ?? null\n            });\n          })\n        );\n        await Promise.all(promises);\n      },\n      10000,\n      `add_subjects_${subjectsToCreate.length}_items`\n    );\n  } else {\n    info(`🍉 No new subjects to add (all ${subjects.length} already exist)`);\n  }\n}\n"
  },
  {
    "path": "database/useTimetable.ts",
    "content": "import { Model, Q } from \"@nozbe/watermelondb\";\nimport { useEffect, useState } from \"react\";\n\nimport { getICalEventsForWeek } from \"@/services/local/ical\";\nimport { Course as SharedCourse,CourseDay as SharedCourseDay } from \"@/services/shared/timetable\"\nimport { generateId } from \"@/utils/generateId\";\nimport { warn } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance, useDatabase } from \"./DatabaseProvider\"\nimport { mapCourseToShared } from \"./mappers/course\";\nimport Course from \"./models/Timetable\";\nimport { getDateRangeOfWeek } from \"./useHomework\";\nimport { safeWrite } from \"./utils/safeTransaction\";\n\nexport function useTimetable(refresh = 0, weekNumber: number | number[] = 0, date: Date = new Date()) {\n  const database = useDatabase();\n  const [timetable, setTimetable] = useState<SharedCourseDay[]>([]);\n\n  const weeks = Array.isArray(weekNumber) ? weekNumber : [weekNumber];\n  // Create a stable key for the weeks array to use in dependency arrays\n  const weeksKey = weeks.join(',');\n\n  useEffect(() => {\n    const fetchTimetable = async () => {\n      const timetableFetched = await getCoursesFromCache(weeks, date.getFullYear());\n      setTimetable(timetableFetched);\n    };\n    fetchTimetable();\n  }, [refresh, database, weeksKey, date.getFullYear()]);\n\n  useEffect(() => {\n    const icalQuery = database.get('icals').query();\n    const subscription = icalQuery.observe().subscribe(() => {\n      const fetchTimetable = async () => {\n        const timetableFetched = await getCoursesFromCache(weeks, date.getFullYear());\n        setTimetable(timetableFetched);\n      };\n      fetchTimetable();\n    });\n    return () => subscription.unsubscribe();\n  }, [database, weeksKey, date.getFullYear()]);\n\n  return timetable;\n}\n\nexport async function addCourseDayToDatabase(courses: SharedCourseDay[]) {\n  const db = getDatabaseInstance();\n  await safeWrite(\n    db,\n    async () => {\n      for (const day of courses) {\n        const dayTimestamp = day.date.getTime();\n        const oneDayMs = 24 * 60 * 60 * 1000;\n\n        const dbCourses = await db.get<Course>('courses')\n          .query(\n            Q.where('from', Q.between(dayTimestamp, dayTimestamp + oneDayMs))\n          )\n          .fetch();\n\n        const dayCourseIds = new Set(\n          day.courses.map(course => {\n            const oldId = generateId(course.from.toISOString() + course.to.toISOString() + course.subject + course.teacher + course.room + course.createdByAccount);\n            const newId = generateId(course.from.toISOString() + course.to.toISOString() + course.subject + course.teacher + course.createdByAccount);\n            return [oldId, newId];\n          }).flat()\n        );\n\n        const coursesToDelete = dbCourses.filter(\n          dbCourse => !dayCourseIds.has(dbCourse.courseId)\n        );\n\n        for (const course of coursesToDelete) {\n          await course.markAsDeleted();\n        }\n\n        for (const item of day.courses) {\n          // MIGRATION TO AVOID DUPES, DO NOT DELETE\n          const oldId = generateId(item.from.toISOString() + item.to.toISOString() + item.subject + item.teacher + item.room + item.createdByAccount);\n          const id = generateId(item.from.toISOString() + item.to.toISOString() + item.subject + item.teacher + item.createdByAccount);\n\n          const oldExistingRecords = await db.get('courses')\n            .query(Q.where('courseId', oldId))\n            .fetch();\n          const existingRecords = await db.get('courses')\n            .query(Q.where('courseId', id))\n            .fetch();\n\n          if (oldId !== id) {\n            for (const oldRecord of oldExistingRecords) {\n              await oldRecord.markAsDeleted();\n            }\n          }\n\n          if (existingRecords.length === 0) {\n            await db.get('courses').create((record: Model) => {\n              const course = record as Course;\n              Object.assign(course, {\n                createdByAccount: item.createdByAccount,\n                courseId: id,\n                subject: item.subject,\n                type: item.type,\n                from: item.from.getTime(),\n                to: item.to.getTime(),\n                additionalInfo: item.additionalInfo,\n                room: item.room,\n                teacher: item.teacher,\n                group: item.group,\n                backgroundColor: item.backgroundColor,\n                status: item.status,\n                customStatus: item.customStatus,\n                url: item.url,\n                kidName: item.kidName,\n              });\n            });\n          } else {\n            const courseToUpdate = existingRecords[0];\n            await courseToUpdate.update((model: Model) => {\n              const course = model as Course;\n              Object.assign(course, {\n                subject: item.subject ?? course.subject,\n                type: item.type ?? course.type,\n                from: item.from.getTime(),\n                to: item.to.getTime(),\n                additionalInfo: item.additionalInfo ?? course.additionalInfo,\n                room: item.room ?? course.room,\n                teacher: item.teacher ?? course.teacher,\n                group: item.group ?? course.group,\n                backgroundColor: item.backgroundColor ?? course.backgroundColor,\n                status: item.status ?? course.status,\n                customStatus: item.customStatus ?? course.customStatus,\n                url: item.url ?? course.url,\n                kidName: item.kidName ?? course.kidName,\n              });\n            });\n          }\n        }\n      }\n    },\n    15000,\n    `add_timetable_${courses.length}_days`\n  );\n}\n\nexport async function getCoursesFromCache(weeks: number[], year: number): Promise<SharedCourseDay[]> {\n  try {\n    const database = getDatabaseInstance();\n    \n    let minStart = new Date(8640000000000000);\n    let maxEnd = new Date(-8640000000000000);\n    \n    for (const w of weeks) {\n      const { start, end } = getDateRangeOfWeek(w, year);\n      if (start < minStart) {minStart = start;}\n      if (end > maxEnd) {maxEnd = end;}\n    }\n\n    const courses = await database\n      .get<Course>('courses')\n      .query(Q.where('from', Q.between(minStart.getTime(), maxEnd.getTime())))\n      .fetch();\n\n    const dayMap: Record<string, SharedCourse[]> = {};\n    for (const course of courses) {\n      const dayKey = new Date(course.from).toISOString().split(\"T\")[0];\n      dayMap[dayKey] = dayMap[dayKey] || [];\n      dayMap[dayKey].push(mapCourseToShared(course));\n    }\n\n    try {\n      const icalEvents = await getICalEventsForWeek(minStart, maxEnd);\n      for (const event of icalEvents) {\n        const dayKey = new Date(event.from).toISOString().split(\"T\")[0];\n        dayMap[dayKey] = dayMap[dayKey] || [];\n        dayMap[dayKey].push(event);\n      }\n    } catch (icalError) {\n      console.warn('Error loading iCal events:', icalError);\n    }\n\n    for (const day in dayMap) {\n      dayMap[day].sort((a, b) => a.from.getTime() - b.from.getTime());\n    }\n\t\t\n    return Object.entries(dayMap).map(([day, courses]) => ({\n      date: new Date(day),\n      courses\n    }));\n  } catch (e) {\n    warn(String(e));\n    return [];\n  }\n}"
  },
  {
    "path": "database/utils/initialization.ts",
    "content": "import { Database } from \"@nozbe/watermelondb\";\n\nimport { error,info, warn } from \"@/utils/logger/logger\";\n\nimport { getDatabaseInstance } from \"../DatabaseProvider\";\n\nexport class DatabaseInitializer {\n  private static instance: DatabaseInitializer;\n  private isInitialized = false;\n\n  static getInstance(): DatabaseInitializer {\n    if (!DatabaseInitializer.instance) {\n      DatabaseInitializer.instance = new DatabaseInitializer();\n    }\n    return DatabaseInitializer.instance;\n  }\n\n  async initializeDatabase(): Promise<void> {\n    if (this.isInitialized) {\n      return;\n    }\n\n    try {\n      const db = getDatabaseInstance();\n\n      await this.forceResetDatabaseQueue(db);\n\n      const isResponsive = await this.testInitialDatabaseHealth(db);\n      \n      if (!isResponsive) {\n        warn(\"Database appears to be unresponsive, attempting recovery...\");\n        await this.attemptDatabaseRecovery(db);\n      }\n\n      this.isInitialized = true;\n      info(\"🍉 Database initialization completed successfully\");\n\n    } catch (err) {\n      error(`Database initialization failed: ${err}`);\n      throw err;\n    }\n  }\n\n  private async forceResetDatabaseQueue(db: Database): Promise<void> {\n    try {\n      info(\"🍉 Force resetting database queue...\");\n      \n      for (let i = 0; i < 3; i++) {\n        const resetPromise = db.write(async () => {\n          // Empty write operation to flush the queue\n        });\n\n        await Promise.race([\n          resetPromise,\n          new Promise<void>((_, reject) => {\n            setTimeout(() => {\n              reject(new Error(`Queue reset ${i + 1} timeout`));\n            }, 3000);\n          })\n        ]);\n\n        await new Promise(resolve => setTimeout(resolve, 100));\n      }\n\n      info(\"🍉 Database queue reset completed\");\n      \n    } catch (err) {\n      warn(`Database queue reset failed: ${err}`);\n      warn(\"🍉 Database may start with degraded performance\");\n    }\n  }\n\n  private async testInitialDatabaseHealth(db: Database): Promise<boolean> {\n    try {\n      const startTime = Date.now();\n      \n      const testPromise = db.collections.get('news').query().fetch();\n      const timeoutPromise = new Promise<never>((_, reject) => {\n        setTimeout(() => {\n          reject(new Error(\"Database health check timeout\"));\n        }, 5000);\n      });\n\n      await Promise.race([testPromise, timeoutPromise]);\n\n      const duration = Date.now() - startTime;\n      info(`🍉 Database health check passed (${duration}ms)`);\n      \n      return duration < 3000; // Consider healthy if under 3 seconds\n      \n    } catch (err) {\n      error(`Database health check failed: ${err}`);\n      return false;\n    }\n  }\n\n  private async attemptDatabaseRecovery(db: Database): Promise<void> {\n    try {\n      info(\"🍉 Attempting database recovery...\");\n      \n      const recoveryPromise = db.write(async () => {\n        const collections = ['news', 'homework', 'grades', 'subjects'];\n        for (const collectionName of collections) {\n          try {\n            await db.collections.get(collectionName).query().fetch();\n          } catch (err) {\n            warn(`Failed to read from ${collectionName}: ${err}`);\n          }\n        }\n      });\n\n      await Promise.race([\n        recoveryPromise,\n        new Promise<never>((_, reject) => {\n          setTimeout(() => {\n            reject(new Error(\"Recovery timeout\"));\n          }, 10000);\n        })\n      ]);\n\n      info(\"🍉 Database recovery completed\");\n      \n    } catch (err) {\n      error(`Database recovery failed: ${err}`);\n    }\n  }\n\n  isReady(): boolean {\n    return this.isInitialized;\n  }\n}\n\nexport async function initializeDatabaseOnStartup(): Promise<void> {\n  const initializer = DatabaseInitializer.getInstance();\n  await initializer.initializeDatabase();\n}"
  },
  {
    "path": "database/utils/safeTransaction.ts",
    "content": "import { Database } from '@nozbe/watermelondb';\n\nimport { error,info } from '@/utils/logger/logger';\n\nexport async function safeWrite<T>(\n  database: Database,\n  operation: () => Promise<T>,\n  timeoutMs: number = 10000,\n  operationName: string = 'unnamed'\n): Promise<T> {\n  const timeoutPromise = new Promise<never>((_, reject) => {\n    setTimeout(() => {\n      reject(new Error(`🍉 Database write operation \"${operationName}\" timed out after ${timeoutMs}ms`));\n    }, timeoutMs);\n  });\n\n  try {\n    const result = await Promise.race([\n      database.write(operation),\n      timeoutPromise\n    ]);\n    return result;\n  } catch (err) {\n    error(`🍉 Failed safe write operation \"${operationName}\":`, String(err));\n    throw err;\n  }\n}\n\nexport async function safeRead<T>(\n  database: Database,\n  operation: () => Promise<T>,\n  timeoutMs: number = 5000,\n  operationName: string = 'unnamed'\n): Promise<T> {\n  const timeoutPromise = new Promise<never>((_, reject) => {\n    setTimeout(() => {\n      reject(new Error(`🍉 Database read operation \"${operationName}\" timed out after ${timeoutMs}ms`));\n    }, timeoutMs);\n  });\n\n  try {\n    const result = await Promise.race([\n      database.read(operation),\n      timeoutPromise\n    ]);\n    info(`🍉 Completed safe read operation: ${operationName}`);\n    return result;\n  } catch (err) {\n    error(`🍉 Failed safe read operation \"${operationName}\":`, String(err));\n    throw err;\n  }\n}\n\nexport function batchOperations<T>(\n  items: T[],\n  batchSize: number = 100\n): T[][] {\n  const batches: T[][] = [];\n  for (let i = 0; i < items.length; i += batchSize) {\n    batches.push(items.slice(i, i + batchSize));\n  }\n  return batches;\n}\n\nexport async function executeBatchedOperations<T>(\n  database: Database,\n  batches: (() => Promise<T>)[],\n  delayMs: number = 100,\n  operationName: string = 'batched'\n): Promise<T[]> {\n  const results: T[] = [];\n  \n  for (let i = 0; i < batches.length; i++) {\n    info(`🍉 Executing batch ${i + 1}/${batches.length} for ${operationName}`);\n    \n    try {\n      const result = await safeWrite(\n        database,\n        batches[i],\n        15000,\n        `${operationName}_batch_${i + 1}`\n      );\n      results.push(result);\n      \n      if (i < batches.length - 1 && delayMs > 0) {\n        await new Promise(resolve => setTimeout(resolve, delayMs));\n      }\n    } catch (err) {\n      error(`🍉 Failed batch ${i + 1} for ${operationName}:`, String(err));\n      throw err;\n    }\n  }\n  \n  return results;\n}"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import js from \"@eslint/js\";\nimport { defineConfig } from \"eslint/config\";\nimport prettierConfig from \"eslint-config-prettier\";\nimport pluginReact from \"eslint-plugin-react\";\nimport simpleImportSort from \"eslint-plugin-simple-import-sort\";\nimport unusedImports from \"eslint-plugin-unused-imports\";\nimport globals from \"globals\";\nimport tseslint from \"typescript-eslint\";\n\nexport default defineConfig([\n  {\n    files: [\"**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}\"],\n    plugins: { js },\n    extends: [\"js/recommended\"],\n  },\n  {\n    files: [\"**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}\"],\n    languageOptions: {\n      globals: Object.fromEntries(\n        Object.entries(globals.browser).map(([key, value]) => [\n          key.trim(),\n          value,\n        ])\n      ),\n    },\n  },\n  ...tseslint.configs.recommended,\n  pluginReact.configs.flat.recommended,\n  prettierConfig, // Désactive les règles ESLint qui entrent en conflit avec Prettier\n  {\n    plugins: {\n      \"simple-import-sort\": simpleImportSort,\n      \"unused-imports\": unusedImports,\n    },\n    settings: {\n      react: {\n        version: \"detect\",\n      },\n    },\n    rules: {\n      indent: [\"error\", 2],\n      \"no-duplicate-imports\": \"error\",\n      \"no-self-compare\": \"error\",\n      \"no-template-curly-in-string\": \"warn\",\n      \"no-unassigned-vars\": \"error\",\n      \"no-unreachable-loop\": \"error\",\n      \"no-useless-assignment\": \"error\",\n      \"react/display-name\": \"off\",\n      camelcase: [\"error\", { properties: \"always\" }],\n      curly: \"error\",\n      \"default-case\": \"error\",\n      \"default-case-last\": \"error\",\n      \"default-param-last\": \"error\",\n      eqeqeq: \"error\",\n      \"max-depth\": [\"error\", 4],\n      \"no-console\": \"warn\",\n      \"no-else-return\": \"error\",\n      \"no-empty-function\": \"error\",\n      \"no-extra-label\": \"error\",\n      \"no-lonely-if\": \"error\",\n      \"no-unneeded-ternary\": \"error\",\n      \"no-unused-expressions\": \"error\",\n      \"no-useless-rename\": \"error\",\n      \"no-var\": \"error\",\n      \"no-warning-comments\": \"warn\",\n      \"prefer-promise-reject-errors\": \"error\",\n      \"simple-import-sort/imports\": \"warn\",\n      \"simple-import-sort/exports\": \"warn\",\n      \"@typescript-eslint/no-unused-vars\": \"off\", // Désactiver la règle de base\n      \"unused-imports/no-unused-imports\": \"error\", // Supprimer automatiquement les imports inutilisés\n      \"@typescript-eslint/no-require-imports\": \"off\", // Interdire les imports CommonJS\n      \"@typescript-eslint/no-explicit-any\": \"warn\", // Avertir sur l'utilisation de 'any'\n      \"@typescript-eslint/no-unescaped-entities\": \"warn\", // Interdire les entités non échappées dans les chaînes de caractères\n      \"unused-imports/no-unused-vars\": [\n        \"warn\",\n        {\n          vars: \"all\",\n          varsIgnorePattern: \"^_\",\n          args: \"after-used\",\n          argsIgnorePattern: \"^_\",\n        },\n      ],\n    },\n  },\n]);\n"
  },
  {
    "path": "hooks/useAppInitialization.ts",
    "content": "import { useEffect, useState, useRef, useCallback } from 'react';\nimport { AppState, AppStateStatus } from 'react-native';\nimport * as SplashScreen from 'expo-splash-screen';\nimport { useFonts } from 'expo-font';\nimport Countly from 'countly-sdk-react-native-bridge';\nimport CountlyConfig from 'countly-sdk-react-native-bridge/CountlyConfig';\n\nimport { initializeDatabaseOnStartup } from '@/database/utils/initialization';\nimport { initializeAccountManager } from '@/services/shared';\nimport { useSettingsStore } from '@/stores/settings';\nimport i18n from '@/utils/i18n';\nimport { checkConsent } from '@/utils/logger/consent';\nimport { log, warn } from '@/utils/logger/logger';\nimport ModelManager from '@/utils/magic/ModelManager';\nimport { FONT_CONFIG } from '@/constants/LayoutScreenOptions';\n\n// Prevent the splash screen from auto-hiding before asset loading is complete.\nSplashScreen.preventAutoHideAsync();\n\nlet secrets = { APP_KEY: \"\", SALT: \"\", SERVER_URL: \"\" };\n\ntry {\n  secrets = require('../secrets.json') ?? { APP_KEY: \"\", SALT: \"\", SERVER_URL: \"\" };\n} catch {\n  warn(\"No secrets.json file found, Countly will not be initialized properly.\");\n}\n\nconst APP_KEY = secrets.APP_KEY;\nconst SALT = secrets.SALT;\nconst SERVER_URL = secrets.SERVER_URL ?? \"https://analytics.papillon.bzh\";\n\nexport function useAppInitialization() {\n  const [fontsLoaded, fontsError] = useFonts(FONT_CONFIG);\n  const [isDatabaseReady, setIsDatabaseReady] = useState(false);\n  \n  // Settings\n  const customLanguage = useSettingsStore(state => state.personalization.language);\n  const magicEnabled = useSettingsStore(state => state.personalization.magicEnabled);\n  const selectedTheme = useSettingsStore(state => state.personalization.theme);\n  const mutateProperty = useSettingsStore(state => state.mutateProperty);\n\n  // Initialize Theme if not set\n  if (!selectedTheme) {\n    mutateProperty('personalization', {\n      theme: \"auto\"\n    });\n  }\n\n  // Language Initialization\n  useEffect(() => {\n    if (customLanguage) {\n      i18n.changeLanguage(customLanguage).catch((error) => {\n        console.error(\"Error changing language:\", error);\n      });\n    }\n  }, [customLanguage]);\n\n  // Database Initialization\n  useEffect(() => {\n    async function initDatabase() {\n      try {\n        await initializeDatabaseOnStartup();\n      } catch (err) {\n        warn(`Database initialization failed: ${err}`);\n      } finally {\n        setIsDatabaseReady(true);\n      }\n    }\n\n    initDatabase();\n  }, []);\n\n  // AppState Monitoring\n  const appState = useRef<AppStateStatus>(AppState.currentState);\n  const [lastBackground, setLastBackground] = useState<Date | null>(null);\n\n  useEffect(() => {\n    const subscription = AppState.addEventListener(\"change\", (nextAppState) => {\n      if (appState.current.match(/inactive|background/) && nextAppState === \"active\") {\n        if (lastBackground) {\n          const now = new Date();\n          const durationMs = now.getTime() - lastBackground.getTime();\n\n          if (durationMs > 5 * 60 * 1000) {\n            initializeAccountManager();\n          }\n        }\n      }\n\n      if (nextAppState === \"background\") {\n        setLastBackground(new Date());\n      }\n\n      appState.current = nextAppState;\n    });\n\n    return () => {\n      subscription.remove();\n    };\n  }, [lastBackground]);\n\n  // Magic/ModelManager Initialization\n  useEffect(() => {\n    if (magicEnabled) {\n      ModelManager.safeInit();\n    }\n  }, [magicEnabled]);\n\n  // Countly Initialization\n  useEffect(() => {\n    async function initializeCountly() {\n      const consent = await checkConsent();\n      log(`Countly Consent: ${JSON.stringify(consent)}`);\n\n      const countlyConfig = new CountlyConfig(SERVER_URL, APP_KEY);\n      countlyConfig.setRequiresConsent(true);\n      countlyConfig.setLoggingEnabled(false);\n      countlyConfig.enableCrashReporting();\n      countlyConfig.enableParameterTamperingProtection(SALT);\n\n      if (consent.given) {\n        if (consent.advanced) {\n          countlyConfig.giveConsent([\"sessions\", \"crashes\", \"users\", \"location\", \"attribution\", \"push\", \"star-rating\", \"feedback\"]);\n        }\n\n        if (consent.optional) {\n          countlyConfig.giveConsent([\"sessions\", \"crashes\", \"users\"]);\n        }\n\n        if (consent.required) {\n          countlyConfig.giveConsent([\"sessions\"]);\n        }\n\n        if (consent.required || consent.optional || consent.advanced) {\n          await Countly.initWithConfig(countlyConfig);\n        }\n      }\n    }\n\n    initializeCountly();\n  }, []);\n\n  // Error Handling for Fonts\n  const handleError = useCallback(() => {\n    if (fontsError) { throw fontsError; }\n  }, [fontsError]);\n\n  useEffect(handleError, [handleError]);\n\n  // Splash Screen Handling\n  const hideSplashScreen = useCallback(async () => {\n    if (fontsLoaded && isDatabaseReady) {\n      // We don't hide it here anymore, FakeSplash handles the visual transition\n      // But we could signal readiness\n    }\n  }, [fontsLoaded, isDatabaseReady]);\n\n  useEffect(() => {\n    hideSplashScreen();\n  }, [hideSplashScreen]);\n\n  return {\n    isAppReady: isDatabaseReady && fontsLoaded,\n    fontsLoaded,\n    fontsError\n  };\n}\n"
  },
  {
    "path": "ios/Papillon/AppDelegate.swift",
    "content": "internal import Expo\nimport React\nimport ReactAppDependencyProvider\n\n@main\nclass AppDelegate: ExpoAppDelegate {\n  var window: UIWindow?\n\n  var reactNativeDelegate: ExpoReactNativeFactoryDelegate?\n  var reactNativeFactory: RCTReactNativeFactory?\n\n  public override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil\n  ) -> Bool {\n    let delegate = ReactNativeDelegate()\n    let factory = ExpoReactNativeFactory(delegate: delegate)\n    delegate.dependencyProvider = RCTAppDependencyProvider()\n\n    reactNativeDelegate = delegate\n    reactNativeFactory = factory\n\n#if os(iOS) || os(tvOS)\n    window = UIWindow(frame: UIScreen.main.bounds)\n    factory.startReactNative(\n      withModuleName: \"main\",\n      in: window,\n      launchOptions: launchOptions)\n#endif\n\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n\n  // Linking API\n  public override func application(\n    _ app: UIApplication,\n    open url: URL,\n    options: [UIApplication.OpenURLOptionsKey: Any] = [:]\n  ) -> Bool {\n    return super.application(app, open: url, options: options) || RCTLinkingManager.application(app, open: url, options: options)\n  }\n\n  // Universal Links\n  public override func application(\n    _ application: UIApplication,\n    continue userActivity: NSUserActivity,\n    restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void\n  ) -> Bool {\n    let result = RCTLinkingManager.application(application, continue: userActivity, restorationHandler: restorationHandler)\n    return super.application(application, continue: userActivity, restorationHandler: restorationHandler) || result\n  }\n}\n\nclass ReactNativeDelegate: ExpoReactNativeFactoryDelegate {\n  // Extension point for config-plugins\n\n  override func sourceURL(for bridge: RCTBridge) -> URL? {\n    // needed to return the correct URL for expo-dev-client.\n    bridge.bundleURL ?? bundleURL()\n  }\n\n  override func bundleURL() -> URL? {\n#if DEBUG\n    return RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: \".expo/.virtual-metro-entry\")\n#else\n    return Bundle.main.url(forResource: \"main\", withExtension: \"jsbundle\")\n#endif\n  }\n}\n"
  },
  {
    "path": "ios/Papillon/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"platform\" : \"ios\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"expo\"\n  }\n}"
  },
  {
    "path": "ios/Papillon/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"expo\"\n  }\n}\n"
  },
  {
    "path": "ios/Papillon/Images.xcassets/SplashScreenBackground.colorset/Contents.json",
    "content": "{\n  \"colors\": [\n    {\n      \"color\": {\n        \"components\": {\n          \"alpha\": \"1.000\",\n          \"blue\": \"0.129411764705882\",\n          \"green\": \"0.227450980392157\",\n          \"red\": \"0.00000000000000\"\n        },\n        \"color-space\": \"srgb\"\n      },\n      \"idiom\": \"universal\"\n    }\n  ],\n  \"info\": {\n    \"version\": 1,\n    \"author\": \"expo\"\n  }\n}"
  },
  {
    "path": "ios/Papillon/Images.xcassets/SplashScreenLegacy.imageset/Contents.json",
    "content": "{\n  \"images\": [\n    {\n      \"idiom\": \"universal\",\n      \"filename\": \"image.png\",\n      \"scale\": \"1x\"\n    },\n    {\n      \"idiom\": \"universal\",\n      \"filename\": \"image@2x.png\",\n      \"scale\": \"2x\"\n    },\n    {\n      \"idiom\": \"universal\",\n      \"filename\": \"image@3x.png\",\n      \"scale\": \"3x\"\n    }\n  ],\n  \"info\": {\n    \"version\": 1,\n    \"author\": \"expo\"\n  }\n}"
  },
  {
    "path": "ios/Papillon/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n  <dict>\n    <key>CADisableMinimumFrameDurationOnPhone</key>\n    <true/>\n    <key>CFBundleDevelopmentRegion</key>\n    <string>$(DEVELOPMENT_LANGUAGE)</string>\n    <key>CFBundleDisplayName</key>\n    <string>Papillon</string>\n    <key>CFBundleExecutable</key>\n    <string>$(EXECUTABLE_NAME)</string>\n    <key>CFBundleIdentifier</key>\n    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n    <key>CFBundleInfoDictionaryVersion</key>\n    <string>6.0</string>\n    <key>CFBundleLocalizations</key>\n    <array>\n      <string>fr</string>\n      <string>en</string>\n      <string>br</string>\n      <string>pt</string>\n      <string>de</string>\n      <string>es</string>\n      <string>tr</string>\n      <string>ja</string>\n      <string>ru</string>\n      <string>ko</string>\n      <string>af</string>\n      <string>ar</string>\n      <string>el</string>\n      <string>hi</string>\n      <string>nl</string>\n      <string>pl</string>\n      <string>ro</string>\n      <string>sq</string>\n      <string>uk</string>\n      <string>vi</string>\n      <string>bg</string>\n      <string>bn</string>\n      <string>cs</string>\n      <string>da</string>\n      <string>fi</string>\n      <string>he</string>\n      <string>hu</string>\n      <string>id</string>\n      <string>no</string>\n      <string>sk</string>\n      <string>sv</string>\n      <string>sw</string>\n      <string>th</string>\n      <string>it</string>\n      <string>fa</string>\n      <string>ur</string>\n      <string>ms</string>\n      <string>hr</string>\n      <string>et</string>\n    </array>\n    <key>CFBundleName</key>\n    <string>$(PRODUCT_NAME)</string>\n    <key>CFBundlePackageType</key>\n    <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n    <key>CFBundleShortVersionString</key>\n    <string>8.4.1</string>\n    <key>CFBundleSignature</key>\n    <string>????</string>\n    <key>CFBundleURLTypes</key>\n    <array>\n      <dict>\n        <key>CFBundleURLSchemes</key>\n        <array>\n          <string>papillon</string>\n          <string>izly</string>\n          <string>skoapp-prod</string>\n        </array>\n      </dict>\n      <dict>\n        <key>CFBundleURLSchemes</key>\n        <array>\n          <string>exp+papillon</string>\n        </array>\n      </dict>\n    </array>\n    <key>CFBundleVersion</key>\n    <string>1</string>\n    <key>ITSAppUsesNonExemptEncryption</key>\n    <false/>\n    <key>LSApplicationQueriesSchemes</key>\n    <array>\n      <string>transit</string>\n      <string>maps</string>\n    </array>\n    <key>LSMinimumSystemVersion</key>\n    <string>12.0</string>\n    <key>LSRequiresIPhoneOS</key>\n    <true/>\n    <key>NSAppTransportSecurity</key>\n    <dict>\n      <key>NSAllowsArbitraryLoads</key>\n      <false/>\n      <key>NSAllowsLocalNetworking</key>\n      <true/>\n    </dict>\n    <key>NSBonjourServices</key>\n    <array>\n      <string>_expo._tcp</string>\n    </array>\n    <key>NSCameraUsageDescription</key>\n    <string>Allow $(PRODUCT_NAME) to access your camera</string>\n    <key>NSFaceIDUsageDescription</key>\n    <string>Allow $(PRODUCT_NAME) to access your Face ID biometric data.</string>\n    <key>NSLocalNetworkUsageDescription</key>\n    <string>Expo Dev Launcher uses the local network to discover and connect to development servers running on your computer.</string>\n    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>\n    <string>Allow $(PRODUCT_NAME) to access your location</string>\n    <key>NSLocationAlwaysUsageDescription</key>\n    <string>Allow $(PRODUCT_NAME) to access your location</string>\n    <key>NSLocationWhenInUseUsageDescription</key>\n    <string>Papillon utilise ton emplacement pour trouver les établissements autour de toi.</string>\n    <key>NSMicrophoneUsageDescription</key>\n    <string>Allow $(PRODUCT_NAME) to access your microphone</string>\n    <key>NSPhotoLibraryUsageDescription</key>\n    <string>Papillon utilise ta galerie pour te permettre de personnaliser ta photo de profil</string>\n    <key>NSUserActivityTypes</key>\n    <array>\n      <string>$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route</string>\n    </array>\n    <key>RCTNewArchEnabled</key>\n    <true/>\n    <key>UIBackgroundModes</key>\n    <array>\n      <string>audio</string>\n    </array>\n    <key>UILaunchStoryboardName</key>\n    <string>SplashScreen</string>\n    <key>UIRequiredDeviceCapabilities</key>\n    <array>\n      <string>arm64</string>\n    </array>\n    <key>UIRequiresFullScreen</key>\n    <false/>\n    <key>UIStatusBarStyle</key>\n    <string>UIStatusBarStyleDefault</string>\n    <key>UISupportedInterfaceOrientations</key>\n    <array>\n      <string>UIInterfaceOrientationPortrait</string>\n      <string>UIInterfaceOrientationPortraitUpsideDown</string>\n    </array>\n    <key>UISupportedInterfaceOrientations~ipad</key>\n    <array>\n      <string>UIInterfaceOrientationPortrait</string>\n      <string>UIInterfaceOrientationPortraitUpsideDown</string>\n      <string>UIInterfaceOrientationLandscapeLeft</string>\n      <string>UIInterfaceOrientationLandscapeRight</string>\n    </array>\n    <key>UIUserInterfaceStyle</key>\n    <string>Automatic</string>\n    <key>UIViewControllerBasedStatusBarAppearance</key>\n    <false/>\n  </dict>\n</plist>"
  },
  {
    "path": "ios/Papillon/Papillon-Bridging-Header.h",
    "content": "//\n// Use this file to import your target's public headers that you would like to expose to Swift.\n//\n"
  },
  {
    "path": "ios/Papillon/Papillon.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n  <dict>\n    <key>aps-environment</key>\n    <string>development</string>\n    <key>com.apple.developer.associated-domains</key>\n    <array>\n      <string>applinks:getpapillon.xyz</string>\n    </array>\n  </dict>\n</plist>"
  },
  {
    "path": "ios/Papillon/PrivacyInfo.xcprivacy",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>NSPrivacyAccessedAPITypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>NSPrivacyAccessedAPIType</key>\n\t\t\t<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>\n\t\t\t<key>NSPrivacyAccessedAPITypeReasons</key>\n\t\t\t<array>\n\t\t\t\t<string>C617.1</string>\n\t\t\t\t<string>0A2A.1</string>\n\t\t\t\t<string>3B52.1</string>\n\t\t\t</array>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>NSPrivacyAccessedAPIType</key>\n\t\t\t<string>NSPrivacyAccessedAPICategoryUserDefaults</string>\n\t\t\t<key>NSPrivacyAccessedAPITypeReasons</key>\n\t\t\t<array>\n\t\t\t\t<string>CA92.1</string>\n\t\t\t</array>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>NSPrivacyAccessedAPIType</key>\n\t\t\t<string>NSPrivacyAccessedAPICategorySystemBootTime</string>\n\t\t\t<key>NSPrivacyAccessedAPITypeReasons</key>\n\t\t\t<array>\n\t\t\t\t<string>35F9.1</string>\n\t\t\t</array>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>NSPrivacyAccessedAPIType</key>\n\t\t\t<string>NSPrivacyAccessedAPICategoryDiskSpace</string>\n\t\t\t<key>NSPrivacyAccessedAPITypeReasons</key>\n\t\t\t<array>\n\t\t\t\t<string>E174.1</string>\n\t\t\t\t<string>85F4.1</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>NSPrivacyCollectedDataTypes</key>\n\t<array/>\n\t<key>NSPrivacyTracking</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Papillon/SplashScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"24093.7\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"EXPO-VIEWCONTROLLER-1\">\n    <device id=\"retina6_12\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"24053.1\"/>\n        <capability name=\"Named colors\" minToolsVersion=\"9.0\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <scene sceneID=\"EXPO-SCENE-1\">\n            <objects>\n                <viewController storyboardIdentifier=\"SplashScreenViewController\" id=\"EXPO-VIEWCONTROLLER-1\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" insetsLayoutMarginsFromSafeArea=\"NO\" id=\"EXPO-ContainerView\" userLabel=\"ContainerView\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"393\" height=\"852\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                        <subviews>\n                            <imageView id=\"EXPO-SplashScreen\" userLabel=\"SplashScreenLegacy\" image=\"SplashScreenLegacy\" contentMode=\"scaleAspectFill\" clipsSubviews=\"true\" userInteractionEnabled=\"false\" translatesAutoresizingMaskIntoConstraints=\"false\">\n                                <rect key=\"frame\" x=\"0\" y=\"0\" width=\"414\" height=\"736\"/>\n                            </imageView>\n                        </subviews>\n                        <viewLayoutGuide key=\"safeArea\" id=\"Rmq-lb-GrQ\"/>\n                        <constraints>\n                            <constraint firstItem=\"EXPO-SplashScreen\" firstAttribute=\"top\" secondItem=\"EXPO-ContainerView\" secondAttribute=\"top\" id=\"83fcb9b545b870ba44c24f0feeb116490c499c52\"/>\n                            <constraint firstItem=\"EXPO-SplashScreen\" firstAttribute=\"leading\" secondItem=\"EXPO-ContainerView\" secondAttribute=\"leading\" id=\"61d16215e44b98e39d0a2c74fdbfaaa22601b12c\"/>\n                            <constraint firstItem=\"EXPO-SplashScreen\" firstAttribute=\"trailing\" secondItem=\"EXPO-ContainerView\" secondAttribute=\"trailing\" id=\"f934da460e9ab5acae3ad9987d5b676a108796c1\"/>\n                            <constraint firstItem=\"EXPO-SplashScreen\" firstAttribute=\"bottom\" secondItem=\"EXPO-ContainerView\" secondAttribute=\"bottom\" id=\"d6a0be88096b36fb132659aa90203d39139deda9\"/>\n                        </constraints>\n                        <color key=\"backgroundColor\" name=\"SplashScreenBackground\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"EXPO-PLACEHOLDER-1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"0.0\" y=\"0.0\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"SplashScreenLegacy\" width=\"414\" height=\"736\"/>\n        <systemColor name=\"systemBackgroundColor\">\n            <color white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n        <namedColor name=\"SplashScreenBackground\">\n            <color alpha=\"1.000\" blue=\"0.129411764705882\" green=\"0.227450980392157\" red=\"0.00000000000000\" customColorSpace=\"sRGB\" colorSpace=\"custom\"/>\n        </namedColor>\n    </resources>\n</document>"
  },
  {
    "path": "ios/Papillon/Supporting/Expo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n  <dict>\n    <key>EXUpdatesCheckOnLaunch</key>\n    <string>ALWAYS</string>\n    <key>EXUpdatesEnabled</key>\n    <false/>\n    <key>EXUpdatesLaunchWaitMs</key>\n    <integer>0</integer>\n  </dict>\n</plist>"
  },
  {
    "path": "locales/af.json",
    "content": "{\r\n  \"Global_Back\": \"Terug\",\r\n  \"Global_DatePrefix\": \"op\",\r\n\r\n  \"Tab_Home\": \"Tuis\",\r\n  \"Tab_Calendar\": \"Lesse\",\r\n  \"Tab_Tasks\": \"Take\",\r\n  \"Tab_Grades\": \"Punte\",\r\n  \"Tab_Profile\": \"Profiel\",\r\n  \"Tab_Custom_Profile\": \"Wysig my profiel\",\r\n  \"Button_Change_ProfilePicture\": \"Verander profielfoto\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Neem 'n foto\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Uit biblioteek\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Kry vanaf jou skoolstelsel\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Verwyder foto\",\r\n  \"Tab_Page\": \"Bladsy\",\r\n  \"Tab_Settings\": \"Instellings\",\r\n  \"Tab_News\": \"Nuus\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Die toepassing om jou skoollewe te bestuur\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Koppel jou skooltoepassings om toegang te kry tot jou punte, lesse, huiswerk en meer in die Papillon-koppelvlak!\",\r\n  \"ONBOARDING_START_BTN\": \"Begin\",\r\n  \"ONBOARDING_HELP_BTN\": \"Hulp nodig?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Universiteitsdiens\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Spysenieringsdiens\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Kies jou skooldiens\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Kies jou spysenieringsdiens\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Kies jou universiteitsdiens\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Hoe wil jy inteken?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Gebruik my ligging\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Soek vir 'n stad\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Ek het 'n QR-kode\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Ek het 'n skakel-URL\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Kies jou skool\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Sleutel jou stad se naam in en kies jou skool\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Teken in soos gewoonlik\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Teken in op jou rekening\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Kies die gasheer vir hierdie rekening\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Sleutel die 4-syfer kode in wat jy nou net op PRONOTE geskep het\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Verbind tans met\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Skandeer jou skool se QR-kode om in te teken.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validering van QR-kode\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Dit kan 'n oomblik neem...\",\r\n  \"ONBOARDING_URL\": \"Sleutel jou skool se URL in\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL van jou PRONOTE-instansie\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Voordat jy klaarmaak\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Kies 'n\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"temakleur\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Sleutel jou PRONOTE-PIN in\",\r\n  \"Onboarding_Load_Webview_Description\": \"Ons laai tans jou skool se webwerf\",\r\n  \"INPUT_PIN\": \"PIN-kode\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Soek vir 'n instansie...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Teken tans in...\",\r\n\r\n  \"WAITING\": \"Wag tans\",\r\n  \"IZLY_SMS_SEND\": \"Jy het nou net 'n skakel ontvang om in te teken, klik daarop en volg die stappe.\",\r\n  \"STEP\": \"Stap\",\r\n  \"STEP_OUTOF\": \"van\",\r\n  \"INPUT_USERNAME\": \"Gebruikersnaam\",\r\n  \"INPUT_MAIL\": \"E-posadres\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-pos of gebruikersnaam\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Telefoonnommer of e-pos\",\r\n  \"INPUT_PASSWORD\": \"Wagwoord\",\r\n  \"INPUT_PASSWORD_CODE\": \"Toegangskode\",\r\n  \"INPUT_ETABID\": \"Skool-identifiseerder\",\r\n  \"LOGIN_BTN\": \"Teken in\",\r\n  \"CONFIRM_BTN\": \"Bevestig\",\r\n  \"CANCEL_BTN\": \"Kanselleer\",\r\n\r\n  \"Tab_New_Event\": \"Nuwe geleentheid\",\r\n\r\n  \"Tab_Calendar_Icals\": \"iCal-bestuur\",\r\n  \"Tab_Calendar_Icals_Description\": \"Bestuur jou iCal-URL's\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Voeg 'n iCal-URL by\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Bestuur {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Voeg iCal-URL's by of verwyder dit om met jou kalender te sinchroniseer.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Titel ontbreek\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Gee hierdie iCal-URL 'n naam om dit by te voeg.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Geen iCal-URL's bygevoeg nie\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Hierdie blad is nog onder konstruksie.\",\r\n  \"TabUnderConstruction_Details\": \"Kom later weer terug vir opdaterings.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Ontwikkelaarsmodus\",\r\n  \"TabDevModeNotice_Details\": \"Volledige toetsomgewing vir ontwikkelaars.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Tegniese besonderhede\",\r\n\r\n  \"Online_Course\": \"Aanlyn\",\r\n  \"Evaluated_Course\": \"Assessering\",\r\n  \"Edited_Course\": \"Gewysigde les\",\r\n  \"Canceled_Course\": \"Les gekanselleer\",\r\n  \"No_Course_Room\": \"Lokaal onbekend\",\r\n  \"Event_DeleteEvent\": \"Verwyder geleentheid\",\r\n  \"Event_Confirm_DeleteEvent\": \"Is jy seker jy wil hierdie geleentheid verwyder?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Middagpouse\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Lekker eet!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Mjam!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Oggendpouse\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Gaan slaap!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Ontbyttyd\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Middagpouse\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Tyd vir 'n blaaskans!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Peuseltyd!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Aandpouse\",\r\n  \"Course_Separator_Night_Alt_1\": \"Gaan slaap!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Dit is nag!\",\r\n\r\n  \"Context_Delete\": \"Verwyder\",\r\n  \"Context_Cancel\": \"Kanselleer\",\r\n  \"Context_Edit\": \"Wysig\",\r\n  \"Context_Add\": \"Voeg by\",\r\n\r\n  \"Form_Title\": \"Titel\",\r\n  \"Form_Location\": \"Ligging\",\r\n  \"Form_Organizer\": \"Organiseerder\",\r\n  \"Form_Start\": \"Begin\",\r\n  \"Form_End\": \"Einde\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Is jy seker jy wil hierdie geleentheid verwyder?\",\r\n\r\n  \"Home_Welcome_Name\": \"Goeiedag, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Wys meer\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"beskikbaar\",\r\n  \"Home_Chats_Plurial\": \"gesprekke\",\r\n  \"Home_Chats_Singular\": \"gesprek\",\r\n  \"Home_See_All_Tasks\": \"Sien alle take\",\r\n  \"Home_Welcome\": \"Goeiedag!\",\r\n  \"Home_Planned_None\": \"Jy het geen lesse meer oor vir vandag nie\",\r\n  \"Home_Planned_One\": \"Jy het nog een les oor vandag\",\r\n  \"Home_Planned_Number\": \"Jy het {{number}} lesse oor vandag\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Volgende lesse\",\r\n  \"Home_Widget_NewGrades\": \"Nuwe punte\",\r\n  \"Home_Widget_NewHomeworks\": \"Take om te doen\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Geen lesse op pad nie\",\r\n  \"Home_Widget_NoCourses_Description\": \"Daar is geen lesse vir vandag beplan nie.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kaarte\",\r\n  \"Home_Cards_Button_Description_None\": \"Geen kaarte nie\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Een kaart\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kaarte\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Boodskappe\",\r\n  \"Home_Chats_Button_Description_None\": \"Geen boodskappe nie\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Een boodskap\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} boodskappe\",\r\n\r\n  \"Home_Attendance_Title\": \"Afwesigheid\",\r\n  \"Home_Attendance_Button_Description_None\": \"Geen afwesigheid\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Een afwesigheid\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} afwesighede\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Spyskaart\",\r\n  \"Home_Menu_Button_Description\": \"Spyskaart van die dag\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Geen geleenthede gevind nie\",\r\n  \"Tab_Calendar_Empty_Description\": \"Voeg 'n geleentheid by of sinchroniseer jou kalender om te begin.\",\r\n\r\n  \"Modal_Course_Title\": \"My les\",\r\n  \"Modal_Course_StartsIn\": \"Begin oor\",\r\n  \"Modal_Course_StartedAgo\": \"Klaar sedert\",\r\n  \"Modal_Course_Ongoing\": \"Begin sedert\",\r\n  \"Modal_Course_Group\": \"Groep\",\r\n  \"Modal_Course_Group_Full\": \"Klas\",\r\n\r\n  \"Modal_Course_Details\": \"Lesbesonderhede\",\r\n  \"Modal_Course_Teacher\": \"Onderwyser\",\r\n  \"Modal_Course_Room\": \"Lokaal\",\r\n  \"Modal_Course_Duration\": \"Tydsduur\",\r\n\r\n  \"Modal_Course_Time\": \"Lestye\",\r\n  \"Modal_Course_Start\": \"Begin\",\r\n  \"Modal_Course_End\": \"Einde\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Soek vir take\",\r\n  \"Tasks_LeftHomeworks_Title\": \"oorblywende take\",\r\n  \"Tasks_LeftHomeworks_Time\": \"hierdie week\",\r\n  \"Tasks_Done_AllTasks\": \"Alle take\",\r\n  \"Tasks_Done_CompletedTasks\": \"is voltooi\",\r\n  \"Tasks_Nav_Left\": \"Nog {{count}} taak/take om te doen\",\r\n  \"Tasks_Nav_One\": \"Net nog een taak om te doen\",\r\n  \"Tasks_Nav_Completed\": \"Alles is klaar!\",\r\n  \"Tasks_Week\": \"Week\",\r\n  \"Tasks_NoTasks_Title\": \"Geen take\",\r\n  \"Tasks_NoTasks_Description\": \"Daar is geen take vir hierdie week beplan nie. Geniet jou rus!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"vir week {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Geen take\",\r\n  \"Task_Start\": \"Om te doen\",\r\n  \"Task_Complete\": \"Voltooi\",\r\n  \"Task_Sorting_Title\": \"Sorteer volgens\",\r\n  \"Task_OnlyShowUndone\": \"Voltooide take\",\r\n  \"Task_Show_Title\": \"Wys\",\r\n  \"Settings_General\": \"Algemeen\",\r\n\r\n  \"Latest_Grades\": \"Nuwe punte\",\r\n  \"Grades_Search_Placeholder\": \"Soek vir 'n punt of vak\",\r\n\r\n  \"Grades_Avg_Methods\": \"Berekeningsmetodes\",\r\n  \"Grades_Avg_All_Title\": \"Algemene gemiddelde\",\r\n  \"Grades_Avg_All_Short\": \"Alg. gemiddelde\",\r\n  \"Grades_Avg_All_Pond\": \"Geweegde gemiddelde\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Gew. gemiddelde\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Bereken die geweegde gemiddelde van alle punte\",\r\n  \"Grades_Avg_Subject_Title\": \"Gemiddelde van vakke\",\r\n  \"Grades_Avg_Subject_Short\": \"Vakgemiddelde\",\r\n  \"Grades_Avg_Subject_Description\": \"Bereken die geweegde gemiddelde van vakgemiddeldes\",\r\n  \"Grades_Avg_Median_Title\": \"Mediaan\",\r\n  \"Grades_Avg_Median_Short\": \"Mediaan\",\r\n\r\n  \"Grades_Avg_More\": \"Sien meer\",\r\n  \"Grades_Avg_KnowMore\": \"Sien meer\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Verstaan die berekeningsmetodes van die algemene gemiddelde\",\r\n\r\n  \"Grades_SubjectInfo\": \"Vakinligting\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} punt(e)\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Gemiddelde van leerling\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistiek\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Klasgemiddelde\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Algemene gemiddelde van die klas\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Maksimum gemiddelde\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Beste gemiddelde van die groep\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Minimum gemiddelde\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Laagste gemiddelde van die groep\",\r\n\r\n  \"Grades_Semester\": \"Semester\",\r\n  \"Grades_Trimester\": \"Kwartaal\",\r\n  \"Grades_OutPeriod\": \"Buite periode\",\r\n  \"Grades_Year\": \"Jaar\",\r\n  \"Grades_MockExamBac\": \"Proefeksamen\",\r\n  \"Grades_MockExamBrevet\": \"Proefeksamen\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Alle vakke\",\r\n  \"Grades_Method_Weighted\": \"Weging\",\r\n\r\n  \"Grades_Sort\": \"Sorteer\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabeties\",\r\n  \"Grades_Sorting_Averages\": \"Gemiddeldes\",\r\n  \"Grades_Sorting_Date\": \"Datum\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Sorteer volgens\",\r\n  \"Grades_Menu_AverageBy\": \"Gemiddelde volgens\",\r\n  \"NoAverage\": \"Geen gemiddelde\",\r\n\r\n  \"Grades_Empty_Title\": \"Geen punte\",\r\n  \"Grades_Empty_Description\": \"Jy het nog nie punte gekry in hierdie periode nie.\",\r\n\r\n  \"Grade_NoDescription\": \"Opdrag vir {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Vakke\",\r\n  \"Grades_Tab_Latest\": \"Nuwe punte\",\r\n\r\n  \"Profile_Attendance_Title\": \"Bywoning\",\r\n  \"Profile_Attendance_Denominator_Single\": \"afwesigheid\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"afwesighede\",\r\n\r\n  \"Profile_Discussions_Title\": \"Gesprekke\",\r\n  \"Profile_Discussions_Denominator_Single\": \"ongelees\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"ongelees\",\r\n\r\n  \"Profile_News_Title\": \"Nuus\",\r\n  \"Profile_News_Denominator_Single\": \"nuut\",\r\n  \"Profile_News_Denominator_Plural\": \"nuut\",\r\n  \"Profile_News_Open\": \"Maak oop\",\r\n  \"Profile_News_Loading_Title\": \"Laai nuus tans...\",\r\n  \"Profile_News_Author_Unknown\": \"Skrywer onbekend\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-kode en kaarte\",\r\n\r\n  \"Modal_Grades_Title\": \"Puntbesonderhede\",\r\n  \"Modal_Grades_BestGrade\": \"Beste punt in die groep\",\r\n\r\n  \"Grades_Details_Title\": \"Besonderhede\",\r\n  \"Grades_NormalizedGrade_Title\": \"Punt herlei na 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Waarde van die punt omgeskakel na 'n skaal van 20\",\r\n  \"Grades_HighestGrade_Title\": \"Hoogste punt\",\r\n  \"Grades_HighestGrade_Description\": \"Maksimum punt behaal in die groep\",\r\n  \"Grades_LowestGrade_Title\": \"Laagste punt\",\r\n  \"Grades_LowestGrade_Description\": \"Minimum punt behaal in die groep\",\r\n  \"Grades_Influence_Title\": \"Invloed\",\r\n  \"Grades_Avg_Group_Title\": \"Groepgemiddelde\",\r\n  \"Grades_Coefficient\": \"Koëffisiënt\",\r\n  \"Grades_Avg_Group_Short\": \"Groepgemiddelde\",\r\n  \"Grades_Tab_Rank\": \"Rangorde\",\r\n  \"Grades_Tab_Rank_Description\": \"Posisie in die groep\",\r\n\r\n  \"News_Search_Placeholder\": \"Soek vir nuus\",\r\n  \"News_Empty_Title\": \"Geen nuus\",\r\n  \"News_Empty_Description\": \"Geen nuus in jou skool gevind nie.\",\r\n  \"News_Search_NoResults\": \"Geen nuus gevind nie\",\r\n  \"News_Search_NoResults_Description\": \"Geen nuus gevind vir jou soektog nie.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"'n Sagte en elegante tema\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Lees\",\r\n  \"News_Theme_Reading_Description\": \"'n Tema ontwerp vir lees\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Ure gemis\",\r\n  \"Attendance_Hours_Unjustified\": \"Ongeverantwoordelike ure\",\r\n  \"Attendance_Missing\": \"Afwesighede\",\r\n  \"Attendance_Delays\": \"Laatkommes\",\r\n  \"Attendance_NoReason\": \"Geen rede\",\r\n  \"Attendance_NoEvent_Title\": \"Geen gebeurtenis nie\",\r\n  \"Attendance_NoEvent_Description\": \"Geen afwesigheid of laatkommes geregistreer vir hierdie periode nie.\",\r\n\r\n  \"Settings_Account_Title\": \"My rekening\",\r\n  \"Settings_Account_Description\": \"My rekening\",\r\n  \"Settings_Services_Title\": \"Gekoppelde rekeninge\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Laaste rekening gebruik\",\r\n  \"Settings_Notifications_Title\": \"Kennisgewings\",\r\n  \"Settings_Notifications_Description\": \"Alerts, frekwensie...\",\r\n  \"Settings_Subjects_Title\": \"Vakke\",\r\n  \"Settings_Subjects_Description\": \"Naam, kleur, skrif...\",\r\n  \"Settings_Personalization_Title\": \"Verpersoonliking\",\r\n  \"Settings_Personalization_Description\": \"Temas, kleure...\",\r\n  \"Settings_Cards_Title\": \"Kaarte\",\r\n  \"Settings_Cards_Description\": \"Kantiens, toegang...\",\r\n  \"Settings_Accessibility_Title\": \"Toeganklikheid\",\r\n  \"Settings_Accessibility_Description\": \"Vertoon, klank...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Slim funksies\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI funksies\",\r\n  \"Settings_MagicPlus_Enable\": \"Aktiveer Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimaliseer outomaties die organisasie van jou take om produktiwiteit te verbeter\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Heeltemal plaaslike model, geen data word buite jou toestel oorgedra nie\",\r\n  \"Settings_Donate_Title\": \"Skenk\",\r\n  \"Settings_Donate_Description\": \"Ondersteun die projek\",\r\n  \"Settings_Telemetry_Title\": \"Telemetrie en privaatheid\",\r\n  \"Settings_Telemetry_Description\": \"Bestuur data wat versamel word\",\r\n  \"Settings_About_Title\": \"Oor\",\r\n  \"Settings_About_Description\": \"Weergawe\",\r\n  \"Settings_Logout_Title\": \"Teken uit\",\r\n  \"Settings_Logout_Description\": \"Verwyder hierdie rekening van Papillon\",\r\n  \"Settings_Language_Title\": \"Taal\",\r\n  \"Settings_Language_Description\": \"Verander die taal\",\r\n  \"Settings_Tabs_Title\": \"Tabs\",\r\n  \"Settings_Tabs_Description\": \"Steek tabs van die spyskaart weg\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Verpersoonliking\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Temas, vakke...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Verpersoonlik vakke\",\r\n  \"Settings_Personalization_Accent\": \"Aksentkleur\",\r\n  \"Settings_Personalization_Accent_Description\": \"Die kleur wat jy hier kies sal op die Papillon-tuisblad toegepas word.\",\r\n  \"Settings_Personalization_Theme\": \"Tema\",\r\n  \"Settings_Personalization_Icon_Title\": \"Verander ikoon\",\r\n  \"Settings_Personalization_Icon_Description\": \"Verpersoonlik die toepassing se ikoon\",\r\n  \"Settings_Personalization_Subject_Title\": \"Verpersoonlik vakke\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Vakke\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikone, kleure\",\r\n  \"Settings_About_Papillion_Behind\": \"Agter Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon word onderhou deur 100% vrywillige studente\",\r\n  \"Settings_About_Discord\": \"Discord-bediener\",\r\n  \"Settings_About_Discord_Description\": \"Sluit aan by die Discord-bediener\",\r\n  \"Settings_About_Crowdin\": \"Crowdin-projek\",\r\n  \"Settings_About_Crowdin_Description\": \"Help om Papillon te vertaal\",\r\n  \"Settings_About_Github\": \"GitHub-projek\",\r\n  \"Settings_About_Github_Description\": \"Dra by tot die projek op GitHub\",\r\n  \"Settings_About_Issue\": \"Rapporteer 'n fout\",\r\n  \"Settings_About_Issue_Description\": \"Rapporteer 'n fout wat jy gevind het\",\r\n  \"Settings_About_Dependency_Version\": \"Weergawe van afhanklikhede\",\r\n\r\n  \"Alert_No_Technical\": \"Geen tegniese inligting beskikbaar nie.\",\r\n  \"Alert_Auth_Error\": \"Verifiëringsfout\",\r\n  \"Alert_Auth_Bad_Creds\": \"Die besonderhede wat jy ingesleutel het is verkeerd of jy probeer met 'n ouer-rekening inteken. Hierdie tipe rekening word nog nie deur Papillon ondersteun nie.\",\r\n  \"Alert_Not_Supported\": \"Instansie nie ondersteun nie\",\r\n  \"Alert_Security_Instance_HTTP\": \"Vir sekuriteitsredes aanvaar Papillon nie instansies wat nog die HTTP-protokol gebruik nie. Ons raai jou aan om die skoolhoof in te lig sodat die instansie opgedateer kan word.\",\r\n  \"Alert_NoDemo\": \"Papillon is nie gemaak om met demo-instansies te werk nie, gebruik asseblief 'n ander instansie.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon kan nie inligting van hierdie PRONOTE-instansie kry nie, is dit nog geldig?\",\r\n  \"Alert_No_Pos\": \"Kon nie ligging kry nie\",\r\n  \"Alert_Connexion_Fail\": \"Kon nie verbind nie\",\r\n\r\n  \"Feature_Limited\": \"Beperkte funksies\",\r\n  \"Feature_Soon\": \"Dit kom binnekort!\",\r\n  \"Feature_Soon_Notification\": \"Ons werk hard om hierdie funksie in 'n toekomstige opdatering aan te bied.\",\r\n  \"Feature_Add_Card\": \"Voeg 'n nuwe kaart by vanaf die Profiel-tab in die navigasiebalk\",\r\n\r\n  \"Webview_Wait\": \"Net 'n bietjie geduld...\",\r\n\r\n  \"Profile_QRCards\": \"QR-kode en kaarten\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} kaart(e)\",\r\n  \"Profile_Cards_Loading_History\": \"Laai transaksiegeskiedenis tans\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Dit kan 'n oomblik neem...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kaarte\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Kantiens, toegang\",\r\n  \"Settings_Cards_Banner_Description\": \"Voeg jou kantien- en vervoerskaarte by vir toegang op jou foon via Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Geen kaarte nie\",\r\n  \"Settings_Cards_Add_Button\": \"Voeg by\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Voeg een by om jou kantien-balans te sien, jou QR-kode te skandeer en meer\",\r\n  \"Settings_Subjects_None_Title\": \"Geen vakke nie\",\r\n  \"Settings_Subjects_None_Description\": \"Blaai deur die verskillende tabs van die toepassing om vakke te kan aanpas.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Herstel\",\r\n  \"Settings_Subjects_Reset_Message\": \"Wil jy regtig alle vakke herstel?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Herstel\",\r\n\r\n  \"Settings_Donator\": \"Donateurs\",\r\n  \"Settings_Donator_Description\": \"Sien die lys van donateurs\",\r\n  \"Settings_App_Version\": \"Toepassing-weergawe\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Rig die QR-kode na die skandeerder\",\r\n  \"Profile_Cards_No_Reservation\": \"Geen bespreking nie\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Dit lyk of jy nie op hierdie dag kan bespreek nie.\",\r\n  \"Profile_Cards_History\": \"Geskiedenis\",\r\n  \"Magic_Important\": \"Miskien belangrik\",\r\n\r\n  \"OnBoarding_Step\": \"Stap \",\r\n  \"OnBoarding_Step_Of\": \"van \",\r\n\r\n  \"Consent_Advanced_Title\": \"Ek wil Papillon help\",\r\n  \"Consent_Advanced_Description\": \"Ons versamel meer gedetailleerde inligting oor jou gebruik.\",\r\n  \"Consent_Required_Title\": \"Net die noodsaaklike\",\r\n  \"Consent_Required_Description\": \"Kortom, om te weet dat iemand Papillon gebruik, of dit goed gewerk het en watter diens gebruik word.\",\r\n  \"Consent_None_Title\": \"Helemaal niks nie\",\r\n  \"Consent_None_Description\": \"Ons sal nie eens weet van jou bestaan nie.\",\r\n  \"Consent_Title\": \"Jy en Papillon\",\r\n  \"Consent_Intro1\": \"Om Papillon te help groei, kan jy kies om gebruiksdata te deel.\",\r\n  \"Consent_PrivacyPolicy\": \"Raadpleeg ons privaatheidsbeleid as jy twyfel\",\r\n  \"Consent_Refuse\": \"Weier\",\r\n  \"Consent_Accept\": \"Aanvaar\",\r\n  \"Consent_ChangeMind\": \"Jy kan jou keuse enige tyd in die instellings verander.\",\r\n  \"Consent_Arg1\": \"Dien slegs om die toepassing te verbeter\",\r\n  \"Consent_Arg2\": \"Anoniem en nie gekoppel aan jou identiteit nie\",\r\n  \"Consent_Arg3\": \"Ons het nie toegang tot jou rekeninge nie\",\r\n\r\n  \"Changelog_Title\": \"Vrystellingnotas\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Sperdatum\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Vakke\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Nie voltooi nie\",\r\n  \"Tasks_ThisWeek\": \"Hierdie week\",\r\n\r\n  \"Task_Undone\": \"Nie voltooi nie\",\r\n  \"Task_Done\": \"Voltooi\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Verander agtergrond\",\r\n  \"Modal_Profile_Title\": \"Verander profiel\",\r\n\r\n  \"Modal_Task_Status\": \"Taakstatus\",\r\n  \"Modal_Task_Description\": \"Taakbeskrywing\",\r\n  \"Modal_Task_Attachments\": \"Aanhangsels\",\r\n\r\n  \"Today\": \"Vandag\",\r\n  \"Yesterday\": \"Gister\",\r\n  \"Tomorrow\": \"Môre\"\r\n}"
  },
  {
    "path": "locales/ar.json",
    "content": "{\r\n  \"Global_Back\": \"رجوع\",\r\n  \"Global_DatePrefix\": \"يوم\",\r\n\r\n  \"Tab_Home\": \"الرئيسية\",\r\n  \"Tab_Calendar\": \"الحصص\",\r\n  \"Tab_Tasks\": \"المهام\",\r\n  \"Tab_Grades\": \"الدرجات\",\r\n  \"Tab_Profile\": \"الملف الشخصي\",\r\n  \"Tab_Custom_Profile\": \"تعديل ملفي الشخصي\",\r\n  \"Button_Change_ProfilePicture\": \"تغيير صورة الملف الشخصي\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"التقاط صورة\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"من مكتبة الصور\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"استيراد من نظام المدرسة (ENT)\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"حذف الصورة\",\r\n  \"Tab_Page\": \"صفحة\",\r\n  \"Tab_Settings\": \"الإعدادات\",\r\n  \"Tab_News\": \"الأخبار\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"التطبيق الأمثل لإدارة حياتك المدرسية\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"اربط تطبيقاتك المدرسية للوصول إلى درجاتك، حصصك، واجباتك والمزيد عبر واجهة Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"ابدأ الآن\",\r\n  \"ONBOARDING_HELP_BTN\": \"هل تحتاج مساعدة؟\",\r\n  \"ONBOARDING_UNIVERSITY\": \"الخدمة الجامعية\",\r\n  \"ONBOARDING_RESTAURANTS\": \"خدمة الطعام\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"اختر خدمتك المدرسية\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"اختر خدمة الطعام الخاصة بك\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"اختر خدمتك الجامعية\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"كيف تود تسجيل الدخول؟\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"استخدام موقعي الحالي\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"البحث عن مدينة\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"لدي رمز QR\",\r\n  \"ONBOARDING_METHOD_LINK\": \"لدي رابط تسجيل دخول\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"اختر مدرستك\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"أدخل اسم مدينتك واختر مدرستك\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"سجل دخولك بالطريقة المعتادة\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"تسجيل الدخول إلى حسابك\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"اختر المضيف المخصص للحساب\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"أدخل الرمز المكون من 4 أرقام الذي أنشأته للتو على PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"الاتصال بـ\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"امسح رمز QR الخاص بمدرستك للاتصال.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"التحقق من رمز QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"قد يستغرق هذا بضع لحظات...\",\r\n  \"ONBOARDING_URL\": \"أدخل رابط (URL) مدرستك\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"رابط خادم PRONOTE الخاص بك\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"قبل الانتهاء\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"اختر\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"لون الثيم\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"أدخل رمز PIN الخاص بـ PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"نقوم بتحميل موقع مدرستك\",\r\n  \"INPUT_PIN\": \"رمز PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"بحث عن خادم...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"جاري تسجيل الدخول...\",\r\n\r\n  \"WAITING\": \"انتظار\",\r\n  \"IZLY_SMS_SEND\": \"لقد تلقيت للتو رابطاً لتسجيل الدخول، اضغط عليه واتبع الخطوات.\",\r\n  \"STEP\": \"الخطوة\",\r\n  \"STEP_OUTOF\": \"من\",\r\n  \"INPUT_USERNAME\": \"اسم المستخدم\",\r\n  \"INPUT_MAIL\": \"البريد الإلكتروني\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"البريد الإلكتروني أو اسم المستخدم\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"رقم الهاتف أو البريد الإلكتروني\",\r\n  \"INPUT_PASSWORD\": \"كلمة المرور\",\r\n  \"INPUT_PASSWORD_CODE\": \"رمز الدخول\",\r\n  \"INPUT_ETABID\": \"معرف مدرستك\",\r\n  \"LOGIN_BTN\": \"تسجيل الدخول\",\r\n  \"CONFIRM_BTN\": \"تأكيد\",\r\n  \"CANCEL_BTN\": \"إلغاء\",\r\n\r\n  \"Tab_New_Event\": \"حدث جديد\",\r\n\r\n  \"Tab_Calendar_Icals\": \"إدارة ملفات iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"إدارة روابط iCal الخاصة بك\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"إضافة رابط iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"إدارة {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"إضافة أو حذف روابط iCal للمزامنة مع تقويمك.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"العنوان مفقود\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"أعطِ اسماً لرابط iCal هذا لإضافته.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"لم يتم إضافة أي رابط iCal\",\r\n\r\n  \"TabUnderConstruction_Title\": \"هذا التبويب قيد الإنشاء.\",\r\n  \"TabUnderConstruction_Details\": \"عد لاحقاً للاطلاع على التحديثات.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"وضع التطوير\",\r\n  \"TabDevModeNotice_Details\": \"بيئة اختبار كاملة للمطورين.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"تفاصيل تقنية\",\r\n\r\n  \"Online_Course\": \"أونلاين\",\r\n  \"Evaluated_Course\": \"تقييم\",\r\n  \"Edited_Course\": \"حصة معدلة\",\r\n  \"Canceled_Course\": \"حصة ملغاة\",\r\n  \"No_Course_Room\": \"قاعة غير معروفة\",\r\n  \"Event_DeleteEvent\": \"حذف الحدث\",\r\n  \"Event_Confirm_DeleteEvent\": \"هل أنت متأكد أنك تريد حذف هذا الحدث؟\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"استراحة الغداء\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"بالهناء والشفاء!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"لذيذ!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"استراحة الصباح\",\r\n  \"Course_Separator_Morning_Alt_1\": \"وقت النوم!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"الفطور\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"استراحة بعد الظهر\",\r\n  \"Course_Separator_Evening_Alt_1\": \"حان وقت الاستراحة!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"وقت الوجبة الخفيفة!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"استراحة المساء\",\r\n  \"Course_Separator_Night_Alt_1\": \"وقت النوم!\",\r\n  \"Course_Separator_Night_Alt_2\": \"لقد حل الليل!\",\r\n\r\n  \"Context_Delete\": \"حذف\",\r\n  \"Context_Cancel\": \"إلغاء\",\r\n  \"Context_Edit\": \"تعديل\",\r\n  \"Context_Add\": \"إضافة\",\r\n\r\n  \"Form_Title\": \"العنوان\",\r\n  \"Form_Location\": \"الموقع\",\r\n  \"Form_Organizer\": \"المنظم\",\r\n  \"Form_Start\": \"البداية\",\r\n  \"Form_End\": \"النهاية\",\r\n\r\n  \"Confirm_DeleteEvent\": \"هل أنت متأكد أنك تريد حذف هذا الحدث؟\",\r\n\r\n  \"Home_Welcome_Name\": \"أهلاً، {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"عرض المزيد\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"متاحة\",\r\n  \"Home_Chats_Plurial\": \"محادثات\",\r\n  \"Home_Chats_Singular\": \"محادثة\",\r\n  \"Home_See_All_Tasks\": \"مشاهدة كل المهام\",\r\n  \"Home_Welcome\": \"أهلاً بك!\",\r\n  \"Home_Planned_None\": \"ليس لديك أي حصص متبقية اليوم\",\r\n  \"Home_Planned_One\": \"لديك حصة واحدة متبقية اليوم\",\r\n  \"Home_Planned_Number\": \"لديك {{number}} حصص متبقية اليوم\",\r\n\r\n  \"Home_Widget_NextCourses\": \"الحصص القادمة\",\r\n  \"Home_Widget_NewGrades\": \"درجات جديدة\",\r\n  \"Home_Widget_NewHomeworks\": \"مهام للقيام بها\",\r\n\r\n  \"Home_Widget_NoCourses\": \"لا توجد حصص قادمة\",\r\n  \"Home_Widget_NoCourses_Description\": \"لا توجد حصص مجدولة لهذا اليوم.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"البطاقات\",\r\n  \"Home_Cards_Button_Description_None\": \"لا توجد بطاقات\",\r\n  \"Home_Cards_Button_Description_Singular\": \"بطاقة واحدة\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} بطاقات\",\r\n\r\n  \"Home_Chats_Button_Title\": \"الرسائل\",\r\n  \"Home_Chats_Button_Description_None\": \"لا توجد رسائل\",\r\n  \"Home_Chats_Button_Description_Singular\": \"رسالة واحدة\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} رسائل\",\r\n\r\n  \"Home_Attendance_Title\": \"الغياب\",\r\n  \"Home_Attendance_Button_Description_None\": \"لا يوجد غياب\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"غياب واحد\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} حالات غياب\",\r\n\r\n  \"Home_Menu_Button_Title\": \"القائمة\",\r\n  \"Home_Menu_Button_Description\": \"قائمة طعام اليوم\",\r\n\r\n  \"Tab_Calendar_Empty\": \"لم يتم العثور على أي حدث\",\r\n  \"Tab_Calendar_Empty_Description\": \"أضف حدثاً أو قم بمزامنة تقويمك للبدء.\",\r\n\r\n  \"Modal_Course_Title\": \"حصتي\",\r\n  \"Modal_Course_StartsIn\": \"تبدأ خلال\",\r\n  \"Modal_Course_StartedAgo\": \"انتهت منذ\",\r\n  \"Modal_Course_Ongoing\": \"بدأت منذ\",\r\n  \"Modal_Course_Group\": \"المجموعة\",\r\n  \"Modal_Course_Group_Full\": \"الفصل\",\r\n\r\n  \"Modal_Course_Details\": \"تفاصيل الحصة\",\r\n  \"Modal_Course_Teacher\": \"المعلم\",\r\n  \"Modal_Course_Room\": \"القاعة\",\r\n  \"Modal_Course_Duration\": \"المدة\",\r\n\r\n  \"Modal_Course_Time\": \"أوقات الحصة\",\r\n  \"Modal_Course_Start\": \"البداية\",\r\n  \"Modal_Course_End\": \"النهاية\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"البحث عن مهام\",\r\n  \"Tasks_LeftHomeworks_Title\": \"مهام متبقية\",\r\n  \"Tasks_LeftHomeworks_Time\": \"هذا الأسبوع\",\r\n  \"Tasks_Done_AllTasks\": \"كل المهام\",\r\n  \"Tasks_Done_CompletedTasks\": \"تم إكمالها\",\r\n  \"Tasks_Nav_Left\": \"بقي {{count}} مهام للقيام بها\",\r\n  \"Tasks_Nav_One\": \"بقت مهمة واحدة فقط للقيام بها\",\r\n  \"Tasks_Nav_Completed\": \"كل شيء انتهى!\",\r\n  \"Tasks_Week\": \"أسبوع\",\r\n  \"Tasks_NoTasks_Title\": \"لا توجد مهام\",\r\n  \"Tasks_NoTasks_Description\": \"لا توجد مهام مجدولة لهذا الأسبوع. استمتع براحتك!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"للأسبوع {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"لا توجد مهام\",\r\n  \"Task_Start\": \"لللقيام بها\",\r\n  \"Task_Complete\": \"مكتملة\",\r\n  \"Task_Sorting_Title\": \"ترتيب حسب\",\r\n  \"Task_OnlyShowUndone\": \"المهام المكتملة\",\r\n  \"Task_Show_Title\": \"عرض\",\r\n  \"Settings_General\": \"عام\",\r\n\r\n  \"Latest_Grades\": \"درجات جديدة\",\r\n  \"Grades_Search_Placeholder\": \"بحث عن درجة أو مادة\",\r\n\r\n  \"Grades_Avg_Methods\": \"طرق الحساب\",\r\n  \"Grades_Avg_All_Title\": \"المعدل العام\",\r\n  \"Grades_Avg_All_Short\": \"المعدل العام\",\r\n  \"Grades_Avg_All_Pond\": \"المعدل الموزون\",\r\n  \"Grades_Avg_All_Pond_Short\": \"معدل موزون\",\r\n  \"Grades_Avg_All_Pond_Description\": \"يحسب المعدل الموزون لجميع الدرجات\",\r\n  \"Grades_Avg_Subject_Title\": \"معدل المواد\",\r\n  \"Grades_Avg_Subject_Short\": \"معدل المواد\",\r\n  \"Grades_Avg_Subject_Description\": \"يحسب المتوسط الموزون لمعدلات المواد\",\r\n  \"Grades_Avg_Median_Title\": \"الوسيط\",\r\n  \"Grades_Avg_Median_Short\": \"الوسيط\",\r\n\r\n  \"Grades_Avg_More\": \"معرفة المزيد\",\r\n  \"Grades_Avg_KnowMore\": \"معرفة المزيد\",\r\n  \"Grades_Avg_KnowMore_Description\": \"فهم طرق حساب المعدل العام\",\r\n\r\n  \"Grades_SubjectInfo\": \"معلومات المادة\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} درجات\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"معدل الطالب\",\r\n  \"SubjectInfo_Stats_Header\": \"إحصائيات\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"معدل القسم\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"المعدل العام للقسم\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"أعلى معدل\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"أفضل معدل في المجموعة\",\r\n  \"SubjectInfo_MinAverage_Label\": \"أدنى معدل\",\r\n  \"SubjectInfo_MinAverage_Description\": \"أقل معدل في المجموعة\",\r\n\r\n  \"Grades_Semester\": \"أسدوس\",\r\n  \"Grades_Trimester\": \"دورة\",\r\n  \"Grades_OutPeriod\": \"خارج الفترة\",\r\n  \"Grades_Year\": \"السنة\",\r\n  \"Grades_MockExamBac\": \"امتحان تجريبي\",\r\n  \"Grades_MockExamBrevet\": \"امتحان تجريبي\",\r\n\r\n  \"Grades_Method_AllGrades\": \"جميع المواد\",\r\n  \"Grades_Method_Weighted\": \"المعامل\",\r\n\r\n  \"Grades_Sort\": \"ترتيب\",\r\n  \"Grades_Sorting_Alphabetical\": \"أبجدي\",\r\n  \"Grades_Sorting_Averages\": \"المعدلات\",\r\n  \"Grades_Sorting_Date\": \"التاريخ\",\r\n\r\n  \"Grades_Menu_SortBy\": \"ترتيب حسب\",\r\n  \"Grades_Menu_AverageBy\": \"المعدل حسب\",\r\n  \"NoAverage\": \"لا يوجد معدل\",\r\n\r\n  \"Grades_Empty_Title\": \"لا توجد درجات\",\r\n  \"Grades_Empty_Description\": \"لم تحصل على أي درجة بعد في هذه الفترة.\",\r\n\r\n  \"Grade_NoDescription\": \"واجب في مادة {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"المواد\",\r\n  \"Grades_Tab_Latest\": \"درجات جديدة\",\r\n\r\n  \"Profile_Attendance_Title\": \"المواظبة\",\r\n  \"Profile_Attendance_Denominator_Single\": \"غياب\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"غيابات\",\r\n\r\n  \"Profile_Discussions_Title\": \"المناقشات\",\r\n  \"Profile_Discussions_Denominator_Single\": \"غير مقروءة\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"غير مقروءة\",\r\n\r\n  \"Profile_News_Title\": \"الأخبار\",\r\n  \"Profile_News_Denominator_Single\": \"جديد\",\r\n  \"Profile_News_Denominator_Plural\": \"جديدة\",\r\n  \"Profile_News_Open\": \"فتح\",\r\n  \"Profile_News_Loading_Title\": \"جاري تحميل الأخبار...\",\r\n  \"Profile_News_Author_Unknown\": \"كاتب مجهول\",\r\n\r\n  \"Profile_Cards_Title\": \"رمز QR والبطاقات\",\r\n\r\n  \"Modal_Grades_Title\": \"تفاصيل الدرجة\",\r\n  \"Modal_Grades_BestGrade\": \"أفضل درجة في المجموعة\",\r\n\r\n  \"Grades_Details_Title\": \"التفاصيل\",\r\n  \"Grades_NormalizedGrade_Title\": \"الدرجة على 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"قيمة الدرجة محولة إلى سلم 20\",\r\n  \"Grades_HighestGrade_Title\": \"أعلى درجة\",\r\n  \"Grades_HighestGrade_Description\": \"أقصى درجة تم الحصول عليها في المجموعة\",\r\n  \"Grades_LowestGrade_Title\": \"أدنى درجة\",\r\n  \"Grades_LowestGrade_Description\": \"أقل درجة تم الحصول عليها في المجموعة\",\r\n  \"Grades_Influence_Title\": \"التأثير\",\r\n  \"Grades_Avg_Group_Title\": \"معدل المجموعة\",\r\n  \"Grades_Coefficient\": \"المعامل\",\r\n  \"Grades_Avg_Group_Short\": \"معدل المجموعة\",\r\n  \"Grades_Tab_Rank\": \"الترتيب\",\r\n  \"Grades_Tab_Rank_Description\": \"الترتيب داخل المجموعة\",\r\n\r\n  \"News_Search_Placeholder\": \"البحث عن خبر\",\r\n  \"News_Empty_Title\": \"لا توجد أخبار\",\r\n  \"News_Empty_Description\": \"لم يتم العثور على أي أخبار في مؤسستك.\",\r\n  \"News_Search_NoResults\": \"لم يتم العثور على أي خبر\",\r\n  \"News_Search_NoResults_Description\": \"لم يتم العثور على أي خبر يطابق بحثك.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"ثيم ناعم وأنيق\",\r\n\r\n  \"News_Theme_Reading_Title\": \"قراءة\",\r\n  \"News_Theme_Reading_Description\": \"ثيم مصمم للقراءة\",\r\n\r\n  \"Attendance_Hours_Missed\": \"الساعات الضائعة\",\r\n  \"Attendance_Hours_Unjustified\": \"الساعات غير المبررة\",\r\n  \"Attendance_Missing\": \"الغيابات\",\r\n  \"Attendance_Delays\": \"التأخرات\",\r\n  \"Attendance_NoReason\": \"بدون سبب\",\r\n  \"Attendance_NoEvent_Title\": \"لا يوجد أي حدث\",\r\n  \"Attendance_NoEvent_Description\": \"لا توجد غيابات أو تأخرات مسجلة لهذه الفترة.\",\r\n\r\n  \"Settings_Account_Title\": \"حسابي\",\r\n  \"Settings_Account_Description\": \"حسابي الشخصي\",\r\n  \"Settings_Services_Title\": \"الحسابات المرتبطة\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"آخر حساب تم استخدامه\",\r\n  \"Settings_Notifications_Title\": \"التنبيهات\",\r\n  \"Settings_Notifications_Description\": \"التنبيهات، التردد...\",\r\n  \"Settings_Subjects_Title\": \"المواد\",\r\n  \"Settings_Subjects_Description\": \"الاسم، اللون، الخط...\",\r\n  \"Settings_Personalization_Title\": \"التخصيص\",\r\n  \"Settings_Personalization_Description\": \"الثيمات، الألوان...\",\r\n  \"Settings_Cards_Title\": \"البطاقات\",\r\n  \"Settings_Cards_Description\": \"المطعم، الوصول...\",\r\n  \"Settings_Accessibility_Title\": \"إمكانية الوصول\",\r\n  \"Settings_Accessibility_Description\": \"العرض، الصوت...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"ميزات ذكية\",\r\n  \"Settings_MagicPlus_Description_Card\": \"ميزات الذكاء الاصطناعي\",\r\n  \"Settings_MagicPlus_Enable\": \"تفعيل Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"يحسن تلقائياً تنظيم مهامك لزيادة إنتاجيتك\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"نموذج محلي بالكامل، لا يتم نقل أي بيانات خارج جهازك\",\r\n  \"Settings_Donate_Title\": \"التبرع\",\r\n  \"Settings_Donate_Description\": \"دعم المشروع\",\r\n  \"Settings_Telemetry_Title\": \"القياس والخصوصية\",\r\n  \"Settings_Telemetry_Description\": \"إدارة البيانات المجمعة\",\r\n  \"Settings_About_Title\": \"حول التطبيق\",\r\n  \"Settings_About_Description\": \"الإصدار\",\r\n  \"Settings_Logout_Title\": \"تسجيل الخروج\",\r\n  \"Settings_Logout_Description\": \"حذف هذا الحساب من Papillon\",\r\n  \"Settings_Language_Title\": \"اللغة\",\r\n  \"Settings_Language_Description\": \"تغيير اللغة\",\r\n  \"Settings_Tabs_Title\": \"التبويبات\",\r\n  \"Settings_Tabs_Description\": \"إخفاء تبويبات من القائمة\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"التخصيص\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"الثيمات، المواد...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"تخصيص المواد\",\r\n  \"Settings_Personalization_Accent\": \"لون التمييز\",\r\n  \"Settings_Personalization_Accent_Description\": \"اللون الذي تختاره هنا سيطبق على الصفحة الرئيسية لـ Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"الثيم\",\r\n  \"Settings_Personalization_Icon_Title\": \"تغيير الأيقونة\",\r\n  \"Settings_Personalization_Icon_Description\": \"تخصيص أيقونة التطبيق\",\r\n  \"Settings_Personalization_Subject_Title\": \"تخصيص المواد\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"المواد\",\r\n  \"Settings_Personalization_Subject_Description\": \"الأيقونات، الألوان\",\r\n  \"Settings_About_Papillion_Behind\": \"من يقف وراء Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"يدار Papillon من قبل طلاب متطوعين بنسبة 100%\",\r\n  \"Settings_About_Discord\": \"خادم ديسكورد\",\r\n  \"Settings_About_Discord_Description\": \"انضم إلى خادم ديسكورد\",\r\n  \"Settings_About_Crowdin\": \"مشروع Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"ساعد في ترجمة Papillon\",\r\n  \"Settings_About_Github\": \"مشروع GitHub\",\r\n  \"Settings_About_Github_Description\": \"ساهم في المشروع على GitHub\",\r\n  \"Settings_About_Issue\": \"الإبلاغ عن خلل\",\r\n  \"Settings_About_Issue_Description\": \"الإبلاغ عن مشكلة واجهتها\",\r\n  \"Settings_About_Dependency_Version\": \"إصدار التبعيات\",\r\n\r\n  \"Alert_No_Technical\": \"لا توجد معلومات تقنية متاحة.\",\r\n  \"Alert_Auth_Error\": \"خطأ في المصادقة\",\r\n  \"Alert_Auth_Bad_Creds\": \"المعلومات التي أدخلتها غير صحيحة أو أنك تحاول الاتصال بحساب ولي أمر. هذا النوع من الحسابات غير مدعوم حالياً في Papillon.\",\r\n  \"Alert_Not_Supported\": \"خادم غير مدعوم\",\r\n  \"Alert_Security_Instance_HTTP\": \"لأسباب أمنية، لا يقبل Papillon الخوادم التي لا تزال تستخدم بروتوكول HTTP. نوصيك بإبلاغ مدير المؤسسة لتحديث هذا الخادم وحماية أمنه.\",\r\n  \"Alert_NoDemo\": \"Papillon غير مصمم للعمل مع خوادم العرض التجريبي (demo)، يرجى استخدام خادم حقيقي.\",\r\n  \"Alert_Invalid_Instance\": \"تعذر على Papillon الحصول على معلومات من خادم PRONOTE هذا، هل لا يزال صالحاً؟\",\r\n  \"Alert_No_Pos\": \"تعذر الحصول على الموقع\",\r\n  \"Alert_Connexion_Fail\": \"تعذر الاتصال\",\r\n\r\n  \"Feature_Limited\": \"ميزات محدودة\",\r\n  \"Feature_Soon\": \"قادمة قريباً!\",\r\n  \"Feature_Soon_Notification\": \"نحن نعمل بجد لنقدم لكم هذه الميزة في تحديث مستقبلي.\",\r\n  \"Feature_Add_Card\": \"أضف بطاقة جديدة من تبويب الملف الشخصي المتاح في شريط التنقل\",\r\n\r\n  \"Webview_Wait\": \"قليلاً من الصبر...\",\r\n\r\n  \"Profile_QRCards\": \"رمز QR والبطاقات\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} بطاقة/بطاقات\",\r\n  \"Profile_Cards_Loading_History\": \"جاري تحميل سجل العمليات\",\r\n  \"Profile_Cards_Loading_History_Description\": \"قد يستغرق هذا لحظة...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"البطاقات\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"المطعم، الوصول\",\r\n  \"Settings_Cards_Banner_Description\": \"أضف بطاقات المطعم والنقل الخاصة بك للوصول إليها في أي مكان من هاتفك عبر Papillon\",\r\n  \"Settings_Cards_None_Title\": \"لا توجد بطاقات\",\r\n  \"Settings_Cards_Add_Button\": \"إضافة\",\r\n\r\n  \"Settings_Cards_None_Description\": \"أضف بطاقة للاطلاع على رصيد المطعم، مسح رمز QR الخاص بك والمزيد\",\r\n  \"Settings_Subjects_None_Title\": \"لا توجد مواد\",\r\n  \"Settings_Subjects_None_Description\": \"تصفح التبويبات المختلفة للتطبيق لتتمكن من تخصيص المواد.\",\r\n  \"Settings_Subjects_Reset_Title\": \"إعادة ضبط\",\r\n  \"Settings_Subjects_Reset_Message\": \"هل تريد حقاً إعادة ضبط جميع المواد؟\",\r\n  \"Settings_Subjects_Reset_Button\": \"إعادة ضبط\",\r\n\r\n  \"Settings_Donator\": \"المتبرعون\",\r\n  \"Settings_Donator_Description\": \"مشاهدة قائمة المتبرعين\",\r\n  \"Settings_App_Version\": \"إصدار التطبيق\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"وجه رمز QR نحو ماسح المحطة\",\r\n  \"Profile_Cards_No_Reservation\": \"لا يوجد حجز\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"يبدو أنه لا يمكنك الحجز في هذا اليوم.\",\r\n  \"Profile_Cards_History\": \"السجل\",\r\n  \"Magic_Important\": \"قد يكون مهماً\",\r\n\r\n  \"OnBoarding_Step\": \"الخطوة \",\r\n  \"OnBoarding_Step_Of\": \"من \",\r\n\r\n  \"Consent_Advanced_Title\": \"أريد مساعدة Papillon\",\r\n  \"Consent_Advanced_Description\": \"نجمع معلومات أكثر تفصيلاً حول استخدامك.\",\r\n  \"Consent_Required_Title\": \"الأساسيات فقط\",\r\n  \"Consent_Required_Description\": \"ببساطة، معرفة أن شخصاً ما استخدم Papillon، وما إذا سار كل شيء على ما يرام وأي خدمة يستخدم.\",\r\n  \"Consent_None_Title\": \"لا شيء على الإطلاق\",\r\n  \"Consent_None_Description\": \"لن نكون على علم حتى بوجودك.\",\r\n  \"Consent_Title\": \"أنت و Papillon\",\r\n  \"Consent_Intro1\": \"للمساعدة في تطوير Papillon، يمكنك اختيار مشاركة بعض معلومات الاستخدام.\",\r\n  \"Consent_PrivacyPolicy\": \"في حالة الشك، راجع سياسة الخصوصية الخاصة بنا\",\r\n  \"Consent_Refuse\": \"رفض\",\r\n  \"Consent_Accept\": \"قبول\",\r\n  \"Consent_ChangeMind\": \"يمكنك تغيير رأيك في أي وقت من إعدادات التطبيق.\",\r\n  \"Consent_Arg1\": \"يستخدم فقط لتحسين التطبيق\",\r\n  \"Consent_Arg2\": \"مجهول وغير مرتبط بهويتك\",\r\n  \"Consent_Arg3\": \"لا نملك صلاحية الوصول إلى حساباتك\",\r\n\r\n  \"Changelog_Title\": \"ملاحظات التحديث\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"تاريخ التسليم\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"المواد\",\r\n  \"Tasks_Sorting_Methods_Done\": \"غير مكتملة\",\r\n  \"Tasks_ThisWeek\": \"هذا الأسبوع\",\r\n\r\n  \"Task_Undone\": \"غير مكتملة\",\r\n  \"Task_Done\": \"مكتملة\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"تخصيص خلفية الشاشة\",\r\n  \"Modal_Profile_Title\": \"تخصيص الملف الشخصي\",\r\n\r\n  \"Modal_Task_Status\": \"حالة الواجب\",\r\n  \"Modal_Task_Description\": \"وصف الواجب\",\r\n  \"Modal_Task_Attachments\": \"المرفقات\",\r\n\r\n  \"Today\": \"اليوم\",\r\n  \"Yesterday\": \"أمس\",\r\n  \"Tomorrow\": \"غداً\"\r\n}"
  },
  {
    "path": "locales/bg.json",
    "content": "{\r\n  \"Global_Back\": \"Назад\",\r\n  \"Global_DatePrefix\": \"на\",\r\n\r\n  \"Tab_Home\": \"Начало\",\r\n  \"Tab_Calendar\": \"Програма\",\r\n  \"Tab_Tasks\": \"Задачи\",\r\n  \"Tab_Grades\": \"Оценки\",\r\n  \"Tab_Profile\": \"Профил\",\r\n  \"Tab_Custom_Profile\": \"Редактиране на профила\",\r\n  \"Button_Change_ProfilePicture\": \"Смяна на профилната снимка\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Направи снимка\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"От галерията\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Изтегли от училищната система\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Изтрий снимката\",\r\n  \"Tab_Page\": \"Страница\",\r\n  \"Tab_Settings\": \"Настройки\",\r\n  \"Tab_News\": \"Новини\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Приложението за управление на твоя училищен живот\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Свържи училищните си приложения, за да имаш достъп до оценките, програмата, задачите и още много в интерфейса на Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Започни\",\r\n  \"ONBOARDING_HELP_BTN\": \"Нуждаеш се от помощ?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Университетска услуга\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Столово хранене\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Избери твоята училищна услуга\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Избери услуга за хранене\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Избери твоята университетска услуга\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Как искаш да се впишеш?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Използвай моето местоположение\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Търсене на град\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Имам QR код\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Имам URL адрес за вход\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Избери твоето училище\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Въведи името на града и избери училището си\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Впиши се както обикновено\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Влез в акаунта си\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Избери хоста за акаунта\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Въведи 4-цифрения код, който току-що създаде в PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Вписване в\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Сканирай QR кода на училището си, за да се свържеш.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Валидиране на QR кода\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Това може да отнеме няколко момента...\",\r\n  \"ONBOARDING_URL\": \"Въведи URL адреса на училището си\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL на твоята PRONOTE инстанция\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Преди да завършим\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Избери\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"цвят на темата\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Въведи ПИН кода на твоя PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"Зареждаме сайта на твоето училище\",\r\n  \"INPUT_PIN\": \"ПИН код\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Търсене на инстанция...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Вписване...\",\r\n\r\n  \"WAITING\": \"Изчакване\",\r\n  \"IZLY_SMS_SEND\": \"Току-що получи линк за вход, кликни върху него и следвай стъпките.\",\r\n  \"STEP\": \"Стъпка\",\r\n  \"STEP_OUTOF\": \"от\",\r\n  \"INPUT_USERNAME\": \"Потребителско име\",\r\n  \"INPUT_MAIL\": \"Имейл адрес\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Имейл или потребителско име\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Телефонен номер или имейл\",\r\n  \"INPUT_PASSWORD\": \"Парола\",\r\n  \"INPUT_PASSWORD_CODE\": \"Код за достъп\",\r\n  \"INPUT_ETABID\": \"Идентификатор на училището\",\r\n  \"LOGIN_BTN\": \"Вход\",\r\n  \"CONFIRM_BTN\": \"Потвърди\",\r\n  \"CANCEL_BTN\": \"Отказ\",\r\n\r\n  \"Tab_New_Event\": \"Ново събитие\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Управление на iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Управлявай твоите iCal URL адреси\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Добави iCal URL\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Управление на {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Добавяй или изтривай iCal URL адреси за синхронизация с календара ти.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Липсва заглавие\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Дай име на този iCal URL, за да го добавиш.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Няма добавени iCal URL адреси\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Този раздел е в процес на изграждане.\",\r\n  \"TabUnderConstruction_Details\": \"Върни се по-късно за актуализации.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Режим за разработчици\",\r\n  \"TabDevModeNotice_Details\": \"Пълна тестова среда за разработчици.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Технически детайли\",\r\n\r\n  \"Online_Course\": \"Онлайн\",\r\n  \"Evaluated_Course\": \"Изпитване/Тест\",\r\n  \"Edited_Course\": \"Променен час\",\r\n  \"Canceled_Course\": \"Отменен час\",\r\n  \"No_Course_Room\": \"Неизвестна стая\",\r\n  \"Event_DeleteEvent\": \"Изтрий събитието\",\r\n  \"Event_Confirm_DeleteEvent\": \"Сигурен ли си, че искаш да изтриеш това събитие?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Обедна почивка\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Приятен апетит!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Мням!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Сутрешна почивка\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Време за сън!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Закуска\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Следобедна почивка\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Време за почивка!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Време за следобедна закуска!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Вечерна почивка\",\r\n  \"Course_Separator_Night_Alt_1\": \"Време за сън!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Вече е нощ!\",\r\n\r\n  \"Context_Delete\": \"Изтрий\",\r\n  \"Context_Cancel\": \"Отказ\",\r\n  \"Context_Edit\": \"Промени\",\r\n  \"Context_Add\": \"Добави\",\r\n\r\n  \"Form_Title\": \"Заглавие\",\r\n  \"Form_Location\": \"Местоположение\",\r\n  \"Form_Organizer\": \"Организатор\",\r\n  \"Form_Start\": \"Начало\",\r\n  \"Form_End\": \"Край\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Сигурен ли си, че искаш да изтриеш това събитие?\",\r\n\r\n  \"Home_Welcome_Name\": \"Здравей, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Покажи повече\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"налични\",\r\n  \"Home_Chats_Plurial\": \"дискусии\",\r\n  \"Home_Chats_Singular\": \"дискусия\",\r\n  \"Home_See_All_Tasks\": \"Виж всички задачи\",\r\n  \"Home_Welcome\": \"Здравей!\",\r\n  \"Home_Planned_None\": \"Нямаш оставащи часове за днес\",\r\n  \"Home_Planned_One\": \"Имаш един оставащ час за днес\",\r\n  \"Home_Planned_Number\": \"Имаш още {{number}} часа за днес\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Следващи часове\",\r\n  \"Home_Widget_NewGrades\": \"Нови оценки\",\r\n  \"Home_Widget_NewHomeworks\": \"Задачи за изпълнение\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Няма предстоящи часове\",\r\n  \"Home_Widget_NoCourses_Description\": \"Няма планирани часове за днес.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Карти\",\r\n  \"Home_Cards_Button_Description_None\": \"Няма карти\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Една карта\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} карти\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Съобщения\",\r\n  \"Home_Chats_Button_Description_None\": \"Няма съобщения\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Едно съобщение\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} съобщения\",\r\n\r\n  \"Home_Attendance_Title\": \"Отсъствия\",\r\n  \"Home_Attendance_Button_Description_None\": \"Няма отсъствия\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Едно отсъствие\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} отсъствия\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Меню\",\r\n  \"Home_Menu_Button_Description\": \"Меню за деня\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Няма намерени събития\",\r\n  \"Tab_Calendar_Empty_Description\": \"Добави събитие или синхронизирай календара си, за да започнеш.\",\r\n\r\n  \"Modal_Course_Title\": \"Моят час\",\r\n  \"Modal_Course_StartsIn\": \"Започва след\",\r\n  \"Modal_Course_StartedAgo\": \"Завършил преди\",\r\n  \"Modal_Course_Ongoing\": \"Започнал преди\",\r\n  \"Modal_Course_Group\": \"Група\",\r\n  \"Modal_Course_Group_Full\": \"Клас\",\r\n\r\n  \"Modal_Course_Details\": \"Детайли за часа\",\r\n  \"Modal_Course_Teacher\": \"Учител\",\r\n  \"Modal_Course_Room\": \"Стая\",\r\n  \"Modal_Course_Duration\": \"Продължителност\",\r\n\r\n  \"Modal_Course_Time\": \"График на часа\",\r\n  \"Modal_Course_Start\": \"Начало\",\r\n  \"Modal_Course_End\": \"Край\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Търсене на задачи\",\r\n  \"Tasks_LeftHomeworks_Title\": \"оставащи задачи\",\r\n  \"Tasks_LeftHomeworks_Time\": \"тази седмица\",\r\n  \"Tasks_Done_AllTasks\": \"Всички задачи\",\r\n  \"Tasks_Done_CompletedTasks\": \"са изпълнени\",\r\n  \"Tasks_Nav_Left\": \"Още {{count}} задачи за правене\",\r\n  \"Tasks_Nav_One\": \"Още само една задача\",\r\n  \"Tasks_Nav_Completed\": \"Всичко е завършено!\",\r\n  \"Tasks_Week\": \"Седмица\",\r\n  \"Tasks_NoTasks_Title\": \"Няма задачи\",\r\n  \"Tasks_NoTasks_Description\": \"Няма планирани задачи за тази седмица. Възползвай се да си починеш!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"за седмица {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Няма задачи\",\r\n  \"Task_Start\": \"За правене\",\r\n  \"Task_Complete\": \"Завършена\",\r\n  \"Task_Sorting_Title\": \"Сортиране по\",\r\n  \"Task_OnlyShowUndone\": \"Завършени задачи\",\r\n  \"Task_Show_Title\": \"Покажи\",\r\n  \"Settings_General\": \"Общи\",\r\n\r\n  \"Latest_Grades\": \"Нови оценки\",\r\n  \"Grades_Search_Placeholder\": \"Търсене на оценка, предмет\",\r\n\r\n  \"Grades_Avg_Methods\": \"Методи на изчисление\",\r\n  \"Grades_Avg_All_Title\": \"Общ успех\",\r\n  \"Grades_Avg_All_Short\": \"Общ успех\",\r\n  \"Grades_Avg_All_Pond\": \"Средно претеглена оценка\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Ср. претеглена\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Изчислява средно претеглената стойност на всички оценки\",\r\n  \"Grades_Avg_Subject_Title\": \"Среден успех по предмети\",\r\n  \"Grades_Avg_Subject_Short\": \"Ср. по предмети\",\r\n  \"Grades_Avg_Subject_Description\": \"Изчислява средната стойност на успехите по отделните предмети\",\r\n  \"Grades_Avg_Median_Title\": \"Медиана\",\r\n  \"Grades_Avg_Median_Short\": \"Медиана\",\r\n\r\n  \"Grades_Avg_More\": \"Научи повече\",\r\n  \"Grades_Avg_KnowMore\": \"Научи повече\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Разбери методите за изчисляване на общия успех\",\r\n\r\n  \"Grades_SubjectInfo\": \"Информация за предмета\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} оценки\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Успех на ученика\",\r\n  \"SubjectInfo_Stats_Header\": \"Статистика\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Среден успех на класа\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Общият успех на целия клас\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Максимален успех\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Най-високият успех в групата\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Минимален успех\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Най-ниският успех в групата\",\r\n\r\n  \"Grades_Semester\": \"Срок\",\r\n  \"Grades_Trimester\": \"Триместър\",\r\n  \"Grades_OutPeriod\": \"Извън периода\",\r\n  \"Grades_Year\": \"Година\",\r\n  \"Grades_MockExamBac\": \"Пробен изпит\",\r\n  \"Grades_MockExamBrevet\": \"Пробно външно оценяване\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Всички предмети\",\r\n  \"Grades_Method_Weighted\": \"Тежест (Коефициент)\",\r\n\r\n  \"Grades_Sort\": \"Сортиране\",\r\n  \"Grades_Sorting_Alphabetical\": \"Азбучен ред\",\r\n  \"Grades_Sorting_Averages\": \"Успех\",\r\n  \"Grades_Sorting_Date\": \"Дата\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Сортиране по\",\r\n  \"Grades_Menu_AverageBy\": \"Успех по\",\r\n  \"NoAverage\": \"Няма успех\",\r\n\r\n  \"Grades_Empty_Title\": \"Няма оценки\",\r\n  \"Grades_Empty_Description\": \"Все още нямаш оценки за този период.\",\r\n\r\n  \"Grade_NoDescription\": \"Задание по {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Предмети\",\r\n  \"Grades_Tab_Latest\": \"Нови оценки\",\r\n\r\n  \"Profile_Attendance_Title\": \"Присъствия\",\r\n  \"Profile_Attendance_Denominator_Single\": \"отсъствие\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"отсъствия\",\r\n\r\n  \"Profile_Discussions_Title\": \"Дискусии\",\r\n  \"Profile_Discussions_Denominator_Single\": \"непрочетено\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"непрочетени\",\r\n\r\n  \"Profile_News_Title\": \"Новини\",\r\n  \"Profile_News_Denominator_Single\": \"нова\",\r\n  \"Profile_News_Denominator_Plural\": \"нови\",\r\n  \"Profile_News_Open\": \"Отвори\",\r\n  \"Profile_News_Loading_Title\": \"Зареждане на новини...\",\r\n  \"Profile_News_Author_Unknown\": \"Неизвестен автор\",\r\n\r\n  \"Profile_Cards_Title\": \"QR код и карти\",\r\n\r\n  \"Modal_Grades_Title\": \"Детайли на оценката\",\r\n  \"Modal_Grades_BestGrade\": \"Най-висока оценка в групата\",\r\n\r\n  \"Grades_Details_Title\": \"Детайли\",\r\n  \"Grades_NormalizedGrade_Title\": \"Оценка по скала 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Стойност на оценката, приравнена към скала от 20\",\r\n  \"Grades_HighestGrade_Title\": \"Най-висока оценка\",\r\n  \"Grades_HighestGrade_Description\": \"Максималната оценка, получена в групата\",\r\n  \"Grades_LowestGrade_Title\": \"Най-ниска оценка\",\r\n  \"Grades_LowestGrade_Description\": \"Минималната оценка, получена в групата\",\r\n  \"Grades_Influence_Title\": \"Влияние\",\r\n  \"Grades_Avg_Group_Title\": \"Среден успех на групата\",\r\n  \"Grades_Coefficient\": \"Коефициент\",\r\n  \"Grades_Avg_Group_Short\": \"Ср. на групата\",\r\n  \"Grades_Tab_Rank\": \"Класиране\",\r\n  \"Grades_Tab_Rank_Description\": \"Позиция в групата\",\r\n\r\n  \"News_Search_Placeholder\": \"Търсене на новина\",\r\n  \"News_Empty_Title\": \"Няма новини\",\r\n  \"News_Empty_Description\": \"Не са намерени новини във вашето училище.\",\r\n  \"News_Search_NoResults\": \"Няма намерени новини\",\r\n  \"News_Search_NoResults_Description\": \"Няма намерени новини за вашето търсене.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Мека и елегантна тема\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Четене\",\r\n  \"News_Theme_Reading_Description\": \"Тема, създадена за четене\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Пропуснати часове\",\r\n  \"Attendance_Hours_Unjustified\": \"Неизвинени часове\",\r\n  \"Attendance_Missing\": \"Отсъствия\",\r\n  \"Attendance_Delays\": \"Закъснения\",\r\n  \"Attendance_NoReason\": \"Няма причина\",\r\n  \"Attendance_NoEvent_Title\": \"Няма събития\",\r\n  \"Attendance_NoEvent_Description\": \"Няма регистрирани отсъствия или закъснения за този период.\",\r\n\r\n  \"Settings_Account_Title\": \"Моят акаунт\",\r\n  \"Settings_Account_Description\": \"Моят акаунт\",\r\n  \"Settings_Services_Title\": \"Свързани акаунти\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Последно използван акаунт\",\r\n  \"Settings_Notifications_Title\": \"Известия\",\r\n  \"Settings_Notifications_Description\": \"Сигнали, честота...\",\r\n  \"Settings_Subjects_Title\": \"Предмети\",\r\n  \"Settings_Subjects_Description\": \"Име, цвят, шрифт...\",\r\n  \"Settings_Personalization_Title\": \"Персонализиране\",\r\n  \"Settings_Personalization_Description\": \"Теми, цветове...\",\r\n  \"Settings_Cards_Title\": \"Карти\",\r\n  \"Settings_Cards_Description\": \"Столова, достъп...\",\r\n  \"Settings_Accessibility_Title\": \"Достъпност\",\r\n  \"Settings_Accessibility_Description\": \"Дисплей, звук...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Интелигентни функции\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI функции\",\r\n  \"Settings_MagicPlus_Enable\": \"Активирай Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Автоматично оптимизира организацията на задачите ти за по-добра продуктивност\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Изцяло локален модел, никакви данни не напускат устройството ти\",\r\n  \"Settings_Donate_Title\": \"Дари\",\r\n  \"Settings_Donate_Description\": \"Подкрепи проекта\",\r\n  \"Settings_Telemetry_Title\": \"Телеметрия и поверителност\",\r\n  \"Settings_Telemetry_Description\": \"Управлявай събираните данни\",\r\n  \"Settings_About_Title\": \"Относно\",\r\n  \"Settings_About_Description\": \"Версия\",\r\n  \"Settings_Logout_Title\": \"Изход\",\r\n  \"Settings_Logout_Description\": \"Премахни този акаунт от Papillon\",\r\n  \"Settings_Language_Title\": \"Език\",\r\n  \"Settings_Language_Description\": \"Промени езика\",\r\n  \"Settings_Tabs_Title\": \"Раздели\",\r\n  \"Settings_Tabs_Description\": \"Скрий раздели от менюто\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Персонализиране\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Теми, предмети...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Персонализиране на предметите\",\r\n  \"Settings_Personalization_Accent\": \"Акцентен цвят\",\r\n  \"Settings_Personalization_Accent_Description\": \"Цветът, който избереш тук, ще се прилага на началната страница на Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Тема\",\r\n  \"Settings_Personalization_Icon_Title\": \"Смяна на иконата\",\r\n  \"Settings_Personalization_Icon_Description\": \"Персонализирай иконата на приложението\",\r\n  \"Settings_Personalization_Subject_Title\": \"Персонализиране на предметите\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Предмети\",\r\n  \"Settings_Personalization_Subject_Description\": \"Икони, цветове\",\r\n  \"Settings_About_Papillion_Behind\": \"Зад Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon се поддържа от 100% доброволни студенти\",\r\n  \"Settings_About_Discord\": \"Discord сървър\",\r\n  \"Settings_About_Discord_Description\": \"Присъедини се към Discord сървъра\",\r\n  \"Settings_About_Crowdin\": \"Проект в Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Помогни за превода на Papillon\",\r\n  \"Settings_About_Github\": \"Проект в GitHub\",\r\n  \"Settings_About_Github_Description\": \"Допринеси за проекта в GitHub\",\r\n  \"Settings_About_Issue\": \"Докладвай за бъг\",\r\n  \"Settings_About_Issue_Description\": \"Докладвай за срещнат проблем\",\r\n  \"Settings_About_Dependency_Version\": \"Версия на зависимостите\",\r\n\r\n  \"Alert_No_Technical\": \"Няма налична техническа информация.\",\r\n  \"Alert_Auth_Error\": \"Грешка при автентификация\",\r\n  \"Alert_Auth_Bad_Creds\": \"Данните, които въведе, са грешни или се опитваш да влезеш с родителски акаунт. Този тип акаунти все още не се поддържат от Papillon.\",\r\n  \"Alert_Not_Supported\": \"Инстанцията не се поддържа\",\r\n  \"Alert_Security_Instance_HTTP\": \"От съображения за сигурност Papillon не приема инстанции, които все още използват HTTP протокол. Препоръчваме ти да информираш училищното ръководство за актуализация на инстанцията.\",\r\n  \"Alert_NoDemo\": \"Papillon не е предназначен за работа с демо инстанции, моля, използвай реална инстанция.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon не успява да получи информация от тази PRONOTE инстанция, все още ли е валидна?\",\r\n  \"Alert_No_Pos\": \"Невъзможно определяне на местоположението\",\r\n  \"Alert_Connexion_Fail\": \"Невъзможна връзка\",\r\n\r\n  \"Feature_Limited\": \"Ограничени функции\",\r\n  \"Feature_Soon\": \"Очаквайте скоро!\",\r\n  \"Feature_Soon_Notification\": \"Работим усилено, за да ви предложим тази функция в бъдеща актуализация.\",\r\n  \"Feature_Add_Card\": \"Добави нова карта от раздел Профил в лентата за навигация\",\r\n\r\n  \"Webview_Wait\": \"Малко търпение...\",\r\n\r\n  \"Profile_QRCards\": \"QR код и карти\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} карти\",\r\n  \"Profile_Cards_Loading_History\": \"Зареждане на история на трансакциите\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Това може да отнеме момент...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Карти\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Столова, достъп\",\r\n  \"Settings_Cards_Banner_Description\": \"Добави картите си за столова и транспорт, за да имаш достъп до тях навсякъде от телефона си чрез Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Няма карти\",\r\n  \"Settings_Cards_Add_Button\": \"Добави\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Добави карта, за да виждаш баланса си за столовата, да сканираш QR кода си и още\",\r\n  \"Settings_Subjects_None_Title\": \"Няма предмети\",\r\n  \"Settings_Subjects_None_Description\": \"Разгледай различните раздели на приложението, за да можеш да персонализираш предметите.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Нулиране\",\r\n  \"Settings_Subjects_Reset_Message\": \"Наистина ли искаш да нулираш всички предмети?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Нулиране\",\r\n\r\n  \"Settings_Donator\": \"Дарители\",\r\n  \"Settings_Donator_Description\": \"Виж списъка с дарителите\",\r\n  \"Settings_App_Version\": \"Версия на приложението\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Насочи QR кода към скенера на терминала\",\r\n  \"Profile_Cards_No_Reservation\": \"Няма резервация\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Изглежда, че не можеш да резервираш за този ден.\",\r\n  \"Profile_Cards_History\": \"История\",\r\n  \"Magic_Important\": \"Може би е важно\",\r\n\r\n  \"OnBoarding_Step\": \"Стъпка \",\r\n  \"OnBoarding_Step_Of\": \"от \",\r\n\r\n  \"Consent_Advanced_Title\": \"Искам да помогна на Papillon\",\r\n  \"Consent_Advanced_Description\": \"Събираме по-подробна информация за твоето ползване.\",\r\n  \"Consent_Required_Title\": \"Само най-важното\",\r\n  \"Consent_Required_Description\": \"Накратко, да знаем, че някой е използвал Papillon, дали всичко е минало добре и коя услуга използва.\",\r\n  \"Consent_None_Title\": \"Нищо\",\r\n  \"Consent_None_Description\": \"Ние дори няма да знаем за съществуването ти.\",\r\n  \"Consent_Title\": \"Ти и Papillon\",\r\n  \"Consent_Intro1\": \"За да помогнеш на Papillon да расте, можеш да избереш да споделяш малко информация за ползването.\",\r\n  \"Consent_PrivacyPolicy\": \"В случай на съмнение, консултирай се с нашата политика за поверителност\",\r\n  \"Consent_Refuse\": \"Отказ\",\r\n  \"Consent_Accept\": \"Приемам\",\r\n  \"Consent_ChangeMind\": \"Можеш да промениш мнението си по всяко време от настройките на приложението.\",\r\n  \"Consent_Arg1\": \"Служи единствено за подобряване на приложението\",\r\n  \"Consent_Arg2\": \"Анонимно и без връзка с твоята самоличност\",\r\n  \"Consent_Arg3\": \"Нямаме достъп до твоите акаунти\",\r\n\r\n  \"Changelog_Title\": \"Бележки към версията\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Краен срок\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Предмети\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Незавършени\",\r\n  \"Tasks_ThisWeek\": \"Тази седмица\",\r\n\r\n  \"Task_Undone\": \"Незавършена\",\r\n  \"Task_Done\": \"Завършена\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Персонализиране на тапета\",\r\n  \"Modal_Profile_Title\": \"Персонализиране на профила\",\r\n\r\n  \"Modal_Task_Status\": \"Статус на задачата\",\r\n  \"Modal_Task_Description\": \"Описание на задачата\",\r\n  \"Modal_Task_Attachments\": \"Прикачени файлове\",\r\n\r\n  \"Today\": \"Днес\",\r\n  \"Yesterday\": \"Вчера\",\r\n  \"Tomorrow\": \"Утре\"\r\n}"
  },
  {
    "path": "locales/bn.json",
    "content": "{\r\n  \"Global_Back\": \"ফিরে যান\",\r\n  \"Global_DatePrefix\": \"তারিখে\",\r\n\r\n  \"Tab_Home\": \"হোম\",\r\n  \"Tab_Calendar\": \"ক্লাস\",\r\n  \"Tab_Tasks\": \"কাজ\",\r\n  \"Tab_Grades\": \"নম্বর\",\r\n  \"Tab_Profile\": \"প্রোফাইল\",\r\n  \"Tab_Custom_Profile\": \"প্রোফাইল পরিবর্তন করুন\",\r\n  \"Button_Change_ProfilePicture\": \"প্রোফাইল ছবি পরিবর্তন করুন\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"ছবি তুলুন\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"গ্যালারি থেকে\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"স্কুল সিস্টেম থেকে নিন\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"ছবি মুছে ফেলুন\",\r\n  \"Tab_Page\": \"পৃষ্ঠা\",\r\n  \"Tab_Settings\": \"সেটিংস\",\r\n  \"Tab_News\": \"খবর\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"তোমার স্কুল জীবন পরিচালনা করার অ্যাপ\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"তোমার স্কুলের অ্যাপগুলো যুক্ত করো এবং পাপিলন (Papillon) ইন্টারফেসে তোমার নম্বর, ক্লাস, বাড়ির কাজ এবং আরও অনেক কিছু দেখো!\",\r\n  \"ONBOARDING_START_BTN\": \"শুরু করি\",\r\n  \"ONBOARDING_HELP_BTN\": \"সাহায্য প্রয়োজন?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"বিশ্ববিদ্যালয় পরিষেবা\",\r\n  \"ONBOARDING_RESTAURANTS\": \"ক্যান্টিন পরিষেবা\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"তোমার স্কুল পরিষেবা নির্বাচন করো\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"তোমার ক্যান্টিন পরিষেবা নির্বাচন করো\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"তোমার বিশ্ববিদ্যালয় পরিষেবা নির্বাচন করো\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"তুমি কীভাবে লগ-ইন করতে চাও?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"আমার বর্তমান অবস্থান ব্যবহার করো\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"শহর খুঁজুন\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"আমার কাছে QR-কোড আছে\",\r\n  \"ONBOARDING_METHOD_LINK\": \"আমার কাছে লগ-ইন URL আছে\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"তোমার শিক্ষা প্রতিষ্ঠান বেছে নাও\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"তোমার শহরের নাম লিখে শিক্ষা প্রতিষ্ঠানটি বেছে নাও\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"সাধারণভাবেই লগ-ইন করো\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"তোমার অ্যাকাউন্টে লগ-ইন করো\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"অ্যাকাউন্টের জন্য নির্ধারিত হোস্ট বেছে নাও\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"PRONOTE-এ তোমার তৈরি করা ৪ সংখ্যার পিন কোডটি দাও\",\r\n  \"ONBOARDING_LOGIN_TO\": \"সংযুক্ত হচ্ছে:\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"সংযুক্ত হতে তোমার স্কুলের QR-কোডটি স্ক্যান করো।\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR-কোড যাচাই করা হচ্ছে\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"এতে কিছুক্ষণ সময় লাগতে পারে...\",\r\n  \"ONBOARDING_URL\": \"তোমার স্কুলের URL ঠিকানাটি দাও\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"তোমার PRONOTE সার্ভারের URL\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"শেষ করার আগে\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"একটি থিম\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"রঙ বেছে নাও\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"তোমার PRONOTE পিন কোডটি দাও\",\r\n  \"Onboarding_Load_Webview_Description\": \"আমরা তোমার স্কুলের ওয়েবসাইট লোড করছি\",\r\n  \"INPUT_PIN\": \"পিন কোড\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"সার্ভার খুঁজুন...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"লগ-ইন হচ্ছে...\",\r\n\r\n  \"WAITING\": \"অপেক্ষা করুন\",\r\n  \"IZLY_SMS_SEND\": \"তুমি লগ-ইন করার জন্য একটি লিঙ্ক পেয়েছ, সেটিতে ক্লিক করো এবং ধাপগুলো অনুসরণ করো।\",\r\n  \"STEP\": \"ধাপ\",\r\n  \"STEP_OUTOF\": \"এর মধ্যে\",\r\n  \"INPUT_USERNAME\": \"ইউজারনেম\",\r\n  \"INPUT_MAIL\": \"ইমেল ঠিকানা\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"ইমেল বা ইউজারনেম\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"ফোন নম্বর বা ইমেল\",\r\n  \"INPUT_PASSWORD\": \"পাসওয়ার্ড\",\r\n  \"INPUT_PASSWORD_CODE\": \"অ্যাক্সেস কোড\",\r\n  \"INPUT_ETABID\": \"তোমার স্কুলের আইডি\",\r\n  \"LOGIN_BTN\": \"লগ-ইন\",\r\n  \"CONFIRM_BTN\": \"নিশ্চিত করুন\",\r\n  \"CANCEL_BTN\": \"বাতিল\",\r\n\r\n  \"Tab_New_Event\": \"নতুন ইভেন্ট\",\r\n\r\n  \"Tab_Calendar_Icals\": \"iCal পরিচালনা\",\r\n  \"Tab_Calendar_Icals_Description\": \"তোমার iCal URL-গুলো পরিচালনা করো\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"নতুন iCal URL যোগ করুন\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"{{title}} পরিচালনা করুন\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"ক্যালেন্ডারের সাথে সিঙ্ক করার জন্য iCal URL যোগ করুন বা মুছুন।\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"শিরোনাম নেই\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"যোগ করার জন্য এই iCal URL-টির একটি নাম দাও।\",\r\n  \"Tab_Calendar_Icals_Empty\": \"কোনো iCal URL যোগ করা হয়নি\",\r\n\r\n  \"TabUnderConstruction_Title\": \"এই ট্যাবটি তৈরির কাজ চলছে।\",\r\n  \"TabUnderConstruction_Details\": \"আপডেটের জন্য পরে আবার দেখুন।\",\r\n\r\n  \"TabDevModeNotice_Title\": \"ডেভেলপার মোড\",\r\n  \"TabDevModeNotice_Details\": \"ডেভেলপারদের জন্য পূর্ণাঙ্গ টেস্টিং পরিবেশ।\",\r\n\r\n  \"Alert_TechnicalDetails\": \"কারিগরি তথ্য\",\r\n\r\n  \"Online_Course\": \"অনলাইন\",\r\n  \"Evaluated_Course\": \"মূল্যায়ন/পরীক্ষা\",\r\n  \"Edited_Course\": \"পরিবর্তিত ক্লাস\",\r\n  \"Canceled_Course\": \"ক্লাস বাতিল\",\r\n  \"No_Course_Room\": \"রুম অজানা\",\r\n  \"Event_DeleteEvent\": \"ইভেন্ট মুছে ফেলুন\",\r\n  \"Event_Confirm_DeleteEvent\": \"তুমি কি নিশ্চিত যে এই ইভেন্টটি মুছে ফেলতে চাও?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"দুপুরের বিরতি\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"খাবার উপভোগ করো!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"দারুণ খাবার!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"সকালের বিরতি\",\r\n  \"Course_Separator_Morning_Alt_1\": \"ঘুমানোর সময়!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"সকালের নাস্তা\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"বিকেলের বিরতি\",\r\n  \"Course_Separator_Evening_Alt_1\": \"একটু বিশ্রাম প্রয়োজন!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"নাস্তার সময়!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"রাতের বিরতি\",\r\n  \"Course_Separator_Night_Alt_1\": \"ঘুমানোর সময়!\",\r\n  \"Course_Separator_Night_Alt_2\": \"এখন রাত!\",\r\n\r\n  \"Context_Delete\": \"মুছে ফেলুন\",\r\n  \"Context_Cancel\": \"বাতিল\",\r\n  \"Context_Edit\": \"সম্পাদনা\",\r\n  \"Context_Add\": \"যোগ করুন\",\r\n\r\n  \"Form_Title\": \"শিরোনাম\",\r\n  \"Form_Location\": \"অবস্থান\",\r\n  \"Form_Organizer\": \"আয়োজক\",\r\n  \"Form_Start\": \"শুরু\",\r\n  \"Form_End\": \"শেষ\",\r\n\r\n  \"Confirm_DeleteEvent\": \"তুমি কি নিশ্চিত যে এই ইভেন্টটি মুছে ফেলতে চাও?\",\r\n\r\n  \"Home_Welcome_Name\": \"হ্যালো, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"আরও দেখুন\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"পাওয়া যাবে\",\r\n  \"Home_Chats_Plurial\": \"কথোপকথন\",\r\n  \"Home_Chats_Singular\": \"কথোপকথন\",\r\n  \"Home_See_All_Tasks\": \"সব কাজ দেখুন\",\r\n  \"Home_Welcome\": \"স্বাগতম!\",\r\n  \"Home_Planned_None\": \"আজ তোমার আর কোনো ক্লাস নেই\",\r\n  \"Home_Planned_One\": \"আজ তোমার একটি ক্লাস বাকি আছে\",\r\n  \"Home_Planned_Number\": \"আজ তোমার আরও {{number}}টি ক্লাস বাকি আছে\",\r\n\r\n  \"Home_Widget_NextCourses\": \"পরবর্তী ক্লাস\",\r\n  \"Home_Widget_NewGrades\": \"নতুন নম্বর\",\r\n  \"Home_Widget_NewHomeworks\": \"করণীয় কাজ\",\r\n\r\n  \"Home_Widget_NoCourses\": \"কোনো ক্লাস নেই\",\r\n  \"Home_Widget_NoCourses_Description\": \"আজকের জন্য কোনো ক্লাস নির্ধারিত নেই।\",\r\n\r\n  \"Home_Cards_Button_Title\": \"কার্ড\",\r\n  \"Home_Cards_Button_Description_None\": \"কোনো কার্ড নেই\",\r\n  \"Home_Cards_Button_Description_Singular\": \"একটি কার্ড\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}}টি কার্ড\",\r\n\r\n  \"Home_Chats_Button_Title\": \"বার্তা\",\r\n  \"Home_Chats_Button_Description_None\": \"কোনো বার্তা নেই\",\r\n  \"Home_Chats_Button_Description_Singular\": \"একটি বার্তা\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}}টি বার্তা\",\r\n\r\n  \"Home_Attendance_Title\": \"অনুপস্থিতি\",\r\n  \"Home_Attendance_Button_Description_None\": \"কোনো অনুপস্থিতি নেই\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"একটি অনুপস্থিতি\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}}টি অনুপস্থিতি\",\r\n\r\n  \"Home_Menu_Button_Title\": \"মেনু\",\r\n  \"Home_Menu_Button_Description\": \"আজকের খাবার\",\r\n\r\n  \"Tab_Calendar_Empty\": \"কোনো ইভেন্ট পাওয়া যায়নি\",\r\n  \"Tab_Calendar_Empty_Description\": \"শুরু করতে ক্যালেন্ডার সিঙ্ক করো বা ইভেন্ট যোগ করো।\",\r\n\r\n  \"Modal_Course_Title\": \"আমার ক্লাস\",\r\n  \"Modal_Course_StartsIn\": \"শুরু হবে\",\r\n  \"Modal_Course_StartedAgo\": \"শেষ হয়েছে\",\r\n  \"Modal_Course_Ongoing\": \"চলছে\",\r\n  \"Modal_Course_Group\": \"গ্রুপ\",\r\n  \"Modal_Course_Group_Full\": \"ক্লাস\",\r\n\r\n  \"Modal_Course_Details\": \"ক্লাসের বিবরণ\",\r\n  \"Modal_Course_Teacher\": \"শিক্ষক\",\r\n  \"Modal_Course_Room\": \"রুম\",\r\n  \"Modal_Course_Duration\": \"সময়সীমা\",\r\n\r\n  \"Modal_Course_Time\": \"ক্লাসের সময়\",\r\n  \"Modal_Course_Start\": \"শুরু\",\r\n  \"Modal_Course_End\": \"শেষ\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"কাজ খুঁজুন\",\r\n  \"Tasks_LeftHomeworks_Title\": \"টি কাজ বাকি\",\r\n  \"Tasks_LeftHomeworks_Time\": \"এই সপ্তাহে\",\r\n  \"Tasks_Done_AllTasks\": \"সব কাজ\",\r\n  \"Tasks_Done_CompletedTasks\": \"সম্পন্ন হয়েছে\",\r\n  \"Tasks_Nav_Left\": \"আরও {{count}}টি কাজ বাকি\",\r\n  \"Tasks_Nav_One\": \"মাত্র একটি কাজ বাকি\",\r\n  \"Tasks_Nav_Completed\": \"সব কাজ শেষ!\",\r\n  \"Tasks_Week\": \"সপ্তাহ\",\r\n  \"Tasks_NoTasks_Title\": \"কোনো কাজ নেই\",\r\n  \"Tasks_NoTasks_Description\": \"এই সপ্তাহে কোনো কাজ বাকি নেই। একটু বিশ্রাম নাও!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"{{week}} সপ্তাহের জন্য\",\r\n  \"Tasks_NoTasks_Nav\": \"কোনো কাজ নেই\",\r\n  \"Task_Start\": \"বাকি আছে\",\r\n  \"Task_Complete\": \"সম্পন্ন\",\r\n  \"Task_Sorting_Title\": \"সাজানোর ধরণ\",\r\n  \"Task_OnlyShowUndone\": \"সম্পন্ন কাজ\",\r\n  \"Task_Show_Title\": \"দেখান\",\r\n  \"Settings_General\": \"সাধারণ\",\r\n\r\n  \"Latest_Grades\": \"নতুন নম্বর\",\r\n  \"Grades_Search_Placeholder\": \"নম্বর বা বিষয় খুঁজুন\",\r\n\r\n  \"Grades_Avg_Methods\": \"গণনা পদ্ধতি\",\r\n  \"Grades_Avg_All_Title\": \"মোট গড়\",\r\n  \"Grades_Avg_All_Short\": \"গড়\",\r\n  \"Grades_Avg_All_Pond\": \"ওজনযুক্ত গড়\",\r\n  \"Grades_Avg_All_Pond_Short\": \"ওজনযুক্ত গড়\",\r\n  \"Grades_Avg_All_Pond_Description\": \"সব নম্বরের ওজনযুক্ত গড় হিসাব করে\",\r\n  \"Grades_Avg_Subject_Title\": \"বিষয়ের গড়\",\r\n  \"Grades_Avg_Subject_Short\": \"বিষয়ের গড়\",\r\n  \"Grades_Avg_Subject_Description\": \"বিষয়গুলোর গড়ের ওপর ভিত্তি করে গড় হিসাব করে\",\r\n  \"Grades_Avg_Median_Title\": \"মধ্যমা\",\r\n  \"Grades_Avg_Median_Short\": \"মধ্যমা\",\r\n\r\n  \"Grades_Avg_More\": \"আরও জানুন\",\r\n  \"Grades_Avg_KnowMore\": \"আরও তথ্য\",\r\n  \"Grades_Avg_KnowMore_Description\": \"মোট গড় গণনার পদ্ধতিগুলো বুঝুন\",\r\n\r\n  \"Grades_SubjectInfo\": \"বিষয়ের তথ্য\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}}টি নম্বর\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"ছাত্রের গড়\",\r\n  \"SubjectInfo_Stats_Header\": \"পরিসংখ্যান\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"ক্লাসের গড়\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"পুরো ক্লাসের মোট গড়\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"সর্বোচ্চ গড়\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"গ্রুপের সেরা গড়\",\r\n  \"SubjectInfo_MinAverage_Label\": \"সর্বনিম্ন গড়\",\r\n  \"SubjectInfo_MinAverage_Description\": \"গ্রুপের সর্বনিম্ন গড়\",\r\n\r\n  \"Grades_Semester\": \"সেমিস্টার\",\r\n  \"Grades_Trimester\": \"ত্রৈমাসিক\",\r\n  \"Grades_OutPeriod\": \"সময়ের বাইরে\",\r\n  \"Grades_Year\": \"বছর\",\r\n  \"Grades_MockExamBac\": \"মক পরীক্ষা\",\r\n  \"Grades_MockExamBrevet\": \"মক টেস্ট\",\r\n\r\n  \"Grades_Method_AllGrades\": \"সব বিষয়\",\r\n  \"Grades_Method_Weighted\": \"ওয়েটেজ\",\r\n\r\n  \"Grades_Sort\": \"সাজান\",\r\n  \"Grades_Sorting_Alphabetical\": \"বর্ণানুক্রমিক\",\r\n  \"Grades_Sorting_Averages\": \"গড় অনুযায়ী\",\r\n  \"Grades_Sorting_Date\": \"তারিখ অনুযায়ী\",\r\n\r\n  \"Grades_Menu_SortBy\": \"সাজানোর ধরণ\",\r\n  \"Grades_Menu_AverageBy\": \"গড় অনুযায়ী\",\r\n  \"NoAverage\": \"কোনো গড় নেই\",\r\n\r\n  \"Grades_Empty_Title\": \"কোনো নম্বর নেই\",\r\n  \"Grades_Empty_Description\": \"এই সময়ের মধ্যে তোমাকে কোনো নম্বর দেওয়া হয়নি।\",\r\n\r\n  \"Grade_NoDescription\": \"{{subject}}-এর কাজ\",\r\n\r\n  \"Grades_Tab_Subjects\": \"বিষয়সমূহ\",\r\n  \"Grades_Tab_Latest\": \"নতুন নম্বর\",\r\n\r\n  \"Profile_Attendance_Title\": \"উপস্থিতি\",\r\n  \"Profile_Attendance_Denominator_Single\": \"অনুপস্থিতি\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"অনুপস্থিতি\",\r\n\r\n  \"Profile_Discussions_Title\": \"কথোপকথন\",\r\n  \"Profile_Discussions_Denominator_Single\": \"অপঠিত\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"অপঠিত\",\r\n\r\n  \"Profile_News_Title\": \"সংবাদ\",\r\n  \"Profile_News_Denominator_Single\": \"নতুন\",\r\n  \"Profile_News_Denominator_Plural\": \"নতুন\",\r\n  \"Profile_News_Open\": \"খুলুন\",\r\n  \"Profile_News_Loading_Title\": \"সংবাদ লোড হচ্ছে...\",\r\n  \"Profile_News_Author_Unknown\": \"অজানা লেখক\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-কোড এবং কার্ড\",\r\n\r\n  \"Modal_Grades_Title\": \"নম্বরের বিবরণ\",\r\n  \"Modal_Grades_BestGrade\": \"গ্রুপের সর্বোচ্চ নম্বর\",\r\n\r\n  \"Grades_Details_Title\": \"বিবরণ\",\r\n  \"Grades_NormalizedGrade_Title\": \"২০-এর মধ্যে নম্বর\",\r\n  \"Grades_NormalizedGrade_Description\": \"২০-এর স্কেলে পরিবর্তিত নম্বরের মান\",\r\n  \"Grades_HighestGrade_Title\": \"সর্বোচ্চ নম্বর\",\r\n  \"Grades_HighestGrade_Description\": \"গ্রুপে প্রাপ্ত সর্বোচ্চ নম্বর\",\r\n  \"Grades_LowestGrade_Title\": \"সর্বনিম্ন নম্বর\",\r\n  \"Grades_LowestGrade_Description\": \"গ্রুপে প্রাপ্ত সর্বনিম্ন নম্বর\",\r\n  \"Grades_Influence_Title\": \"প্রভাব\",\r\n  \"Grades_Avg_Group_Title\": \"গ্রুপের গড়\",\r\n  \"Grades_Coefficient\": \"কোফিসিয়েন্ট\",\r\n  \"Grades_Avg_Group_Short\": \"গ্রুপ গড়\",\r\n  \"Grades_Tab_Rank\": \"র‍্যাঙ্ক\",\r\n  \"Grades_Tab_Rank_Description\": \"গ্রুপে অবস্থান\",\r\n\r\n  \"News_Search_Placeholder\": \"সংবাদ খুঁজুন\",\r\n  \"News_Empty_Title\": \"কোনো সংবাদ নেই\",\r\n  \"News_Empty_Description\": \"তোমার শিক্ষা প্রতিষ্ঠানে কোনো সংবাদ পাওয়া যায়নি।\",\r\n  \"News_Search_NoResults\": \"কোনো সংবাদ পাওয়া যায়নি\",\r\n  \"News_Search_NoResults_Description\": \"তোমার অনুসন্ধানের সাথে মেলে এমন কোনো খবর নেই।\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"পাপিলন\",\r\n  \"News_Theme_Papillon_Description\": \"একটি নরম ও মার্জিত থিম\",\r\n\r\n  \"News_Theme_Reading_Title\": \"পড়া\",\r\n  \"News_Theme_Reading_Description\": \"পড়ার জন্য বিশেষভাবে তৈরি থিম\",\r\n\r\n  \"Attendance_Hours_Missed\": \"মিস হওয়া ঘণ্টা\",\r\n  \"Attendance_Hours_Unjustified\": \"অজুহাতহীন ঘণ্টা\",\r\n  \"Attendance_Missing\": \"অনুপস্থিতি\",\r\n  \"Attendance_Delays\": \"দেরি\",\r\n  \"Attendance_NoReason\": \"কোনো কারণ নেই\",\r\n  \"Attendance_NoEvent_Title\": \"কোনো ইভেন্ট নেই\",\r\n  \"Attendance_NoEvent_Description\": \"এই সময়ের মধ্যে কোনো অনুপস্থিতি বা দেরি রেকর্ড করা হয়নি।\",\r\n\r\n  \"Settings_Account_Title\": \"আমার অ্যাকাউন্ট\",\r\n  \"Settings_Account_Description\": \"আমার অ্যাকাউন্ট তথ্য\",\r\n  \"Settings_Services_Title\": \"যুক্ত অ্যাকাউন্টসমূহ\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"সর্বশেষ ব্যবহৃত অ্যাকাউন্ট\",\r\n  \"Settings_Notifications_Title\": \"নোটিফিকেশন\",\r\n  \"Settings_Notifications_Description\": \"সতর্কবার্তা, ফ্রিকোয়েন্সি...\",\r\n  \"Settings_Subjects_Title\": \"বিষয়সমূহ\",\r\n  \"Settings_Subjects_Description\": \"নাম, রঙ, ফন্ট...\",\r\n  \"Settings_Personalization_Title\": \"ব্যক্তিগতকরণ\",\r\n  \"Settings_Personalization_Description\": \"থিম, রঙ...\",\r\n  \"Settings_Cards_Title\": \"কার্ড\",\r\n  \"Settings_Cards_Description\": \"ক্যান্টিন, অ্যাক্সেস...\",\r\n  \"Settings_Accessibility_Title\": \"অ্যাক্সেসিবিলিটি\",\r\n  \"Settings_Accessibility_Description\": \"ডিসপ্লে, শব্দ...\",\r\n  \"Settings_MagicPlus_Title\": \"ম্যাজিক+\",\r\n  \"Settings_MagicPlus_Description\": \"স্মার্ট ফিচারসমূহ\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI ফিচারসমূহ\",\r\n  \"Settings_MagicPlus_Enable\": \"ম্যাজিক+ চালু করুন\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"কাজের দক্ষতা বাড়াতে তোমার কাজের তালিকা স্বয়ংক্রিয়ভাবে সাজিয়ে দেয়\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"সম্পূর্ণ লোকাল মডেল, তোমার ডিভাইসের বাইরে কোনো তথ্য যাবে না\",\r\n  \"Settings_Donate_Title\": \"দান করুন\",\r\n  \"Settings_Donate_Description\": \"প্রজেক্টটি সমর্থন করুন\",\r\n  \"Settings_Telemetry_Title\": \"টেলিমেট্রি ও গোপনীয়তা\",\r\n  \"Settings_Telemetry_Description\": \"সংগৃহীত তথ্য পরিচালনা করুন\",\r\n  \"Settings_About_Title\": \"অ্যাপ সম্পর্কে\",\r\n  \"Settings_About_Description\": \"ভার্সন\",\r\n  \"Settings_Logout_Title\": \"লগ আউট\",\r\n  \"Settings_Logout_Description\": \"পাপিলন থেকে এই অ্যাকাউন্টটি মুছে ফেলুন\",\r\n  \"Settings_Language_Title\": \"ভাষা\",\r\n  \"Settings_Language_Description\": \"ভাষা পরিবর্তন করুন\",\r\n  \"Settings_Tabs_Title\": \"ট্যাবসমূহ\",\r\n  \"Settings_Tabs_Description\": \"মেনু থেকে ট্যাব লুকিয়ে রাখুন\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"ব্যক্তিগতকরণ\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"থিম, বিষয়...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"বিষয়গুলো কাস্টমাইজ করুন\",\r\n  \"Settings_Personalization_Accent\": \"অ্যাকসেন্ট রঙ\",\r\n  \"Settings_Personalization_Accent_Description\": \"এখানে বেছে নেওয়া রঙটি পাপিলন হোম পেজে দেখা যাবে।\",\r\n  \"Settings_Personalization_Theme\": \"থিম\",\r\n  \"Settings_Personalization_Icon_Title\": \"আইকন পরিবর্তন করুন\",\r\n  \"Settings_Personalization_Icon_Description\": \"অ্যাপের আইকন কাস্টমাইজ করুন\",\r\n  \"Settings_Personalization_Subject_Title\": \"বিষয়গুলো কাস্টমাইজ করুন\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"বিষয়সমূহ\",\r\n  \"Settings_Personalization_Subject_Description\": \"আইকন, রঙ\",\r\n  \"Settings_About_Papillion_Behind\": \"পাপিলনের নেপথ্যে\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"পাপিলন ১০০% স্বেচ্ছাসেবক ছাত্রদের দ্বারা পরিচালিত হয়\",\r\n  \"Settings_About_Discord\": \"ডিসকর্ড সার্ভার\",\r\n  \"Settings_About_Discord_Description\": \"ডিসকর্ড সার্ভারে যোগ দিন\",\r\n  \"Settings_About_Crowdin\": \"ক্রাউডিন প্রজেক্ট\",\r\n  \"Settings_About_Crowdin_Description\": \"পাপিলন অনুবাদ করতে সাহায্য করুন\",\r\n  \"Settings_About_Github\": \"গিটহাব প্রজেক্ট\",\r\n  \"Settings_About_Github_Description\": \"গিটহাবে প্রজেক্টে অবদান রাখুন\",\r\n  \"Settings_About_Issue\": \"বাগ রিপোর্ট করুন\",\r\n  \"Settings_About_Issue_Description\": \"অ্যাপে কোনো সমস্যা পেলে জানান\",\r\n  \"Settings_About_Dependency_Version\": \"ডিপেন্ডেন্সি ভার্সন\",\r\n\r\n  \"Alert_No_Technical\": \"কোনো কারিগরি তথ্য নেই।\",\r\n  \"Alert_Auth_Error\": \"অথেন্টিকেশন ত্রুটি\",\r\n  \"Alert_Auth_Bad_Creds\": \"তোমার দেওয়া তথ্য সঠিক নয় অথবা তুমি কোনো অভিভাবক অ্যাকাউন্ট দিয়ে লগ-ইন করার চেষ্টা করছো। পাপিলন এখনও এই ধরণের অ্যাকাউন্ট সমর্থন করে না।\",\r\n  \"Alert_Not_Supported\": \"সার্ভার সমর্থিত নয়\",\r\n  \"Alert_Security_Instance_HTTP\": \"নিরাপদ থাকার জন্য, পাপিলন HTTP প্রোটোকল ব্যবহার করা সার্ভার গ্রহণ করে না। আমরা তোমাকে স্কুলের প্রধানকে এটি আপডেট করতে বলার পরামর্শ দিচ্ছি।\",\r\n  \"Alert_NoDemo\": \"পাপিলন ডেমো সার্ভারে কাজ করার জন্য তৈরি নয়, দয়া করে আসল সার্ভার ব্যবহার করো।\",\r\n  \"Alert_Invalid_Instance\": \"পাপিলন এই PRONOTE সার্ভার থেকে তথ্য পাচ্ছে না, এটি কি এখনও সচল?\",\r\n  \"Alert_No_Pos\": \"অবস্থান পাওয়া যাচ্ছে না\",\r\n  \"Alert_Connexion_Fail\": \"সংযুক্ত হওয়া সম্ভব হচ্ছে না\",\r\n\r\n  \"Feature_Limited\": \"সীমিত ফিচার\",\r\n  \"Feature_Soon\": \"শীঘ্রই আসছে!\",\r\n  \"Feature_Soon_Notification\": \"ভবিষ্যতের আপডেটে এই ফিচারটি দেওয়ার জন্য আমরা কাজ করছি।\",\r\n  \"Feature_Add_Card\": \"নেভিগেশন বারে প্রোফাইল ট্যাব থেকে নতুন কার্ড যোগ করো\",\r\n\r\n  \"Webview_Wait\": \"একটু অপেক্ষা করুন...\",\r\n\r\n  \"Profile_QRCards\": \"QR-কোড এবং কার্ড\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}}টি কার্ড\",\r\n  \"Profile_Cards_Loading_History\": \"লেনদেনের ইতিহাস লোড হচ্ছে\",\r\n  \"Profile_Cards_Loading_History_Description\": \"এতে কিছুক্ষণ সময় লাগতে পারে...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"কার্ড\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"ক্যান্টিন, অ্যাক্সেস\",\r\n  \"Settings_Cards_Banner_Description\": \"তোমার ক্যান্টিন এবং যাতায়াত কার্ডগুলো যোগ করো যাতে ফোনের মাধ্যমে সবখানে সহজে ব্যবহার করতে পারো\",\r\n  \"Settings_Cards_None_Title\": \"কোনো কার্ড নেই\",\r\n  \"Settings_Cards_Add_Button\": \"যোগ করুন\",\r\n\r\n  \"Settings_Cards_None_Description\": \"ক্যান্টিন ব্যালেন্স দেখতে বা QR-কোড স্ক্যান করতে একটি কার্ড যোগ করো\",\r\n  \"Settings_Subjects_None_Title\": \"কোনো বিষয় নেই\",\r\n  \"Settings_Subjects_None_Description\": \"বিষয়গুলো কাস্টমাইজ করতে অ্যাপের বিভিন্ন ট্যাব ঘুরে দেখো।\",\r\n  \"Settings_Subjects_Reset_Title\": \"রিসেট করুন\",\r\n  \"Settings_Subjects_Reset_Message\": \"তুমি কি নিশ্চিত যে সব বিষয়ের তথ্য রিসেট করতে চাও?\",\r\n  \"Settings_Subjects_Reset_Button\": \"রিসেট করুন\",\r\n\r\n  \"Settings_Donator\": \"দানকারীগণ\",\r\n  \"Settings_Donator_Description\": \"দানকারীদের তালিকা দেখুন\",\r\n  \"Settings_App_Version\": \"অ্যাপ ভার্সন\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"QR-কোডটি স্ক্যানারের দিকে ধরুন\",\r\n  \"Profile_Cards_No_Reservation\": \"কোনো বুকিং নেই\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"মনে হচ্ছে আজ তুমি বুকিং করতে পারবে না।\",\r\n  \"Profile_Cards_History\": \"ইতিহাস\",\r\n  \"Magic_Important\": \"হয়তো গুরুত্বপূর্ণ\",\r\n\r\n  \"OnBoarding_Step\": \"ধাপ \",\r\n  \"OnBoarding_Step_Of\": \"এর মধ্যে \",\r\n\r\n  \"Consent_Advanced_Title\": \"আমি পাপিলনকে সাহায্য করতে চাই\",\r\n  \"Consent_Advanced_Description\": \"আমরা তোমার অ্যাপ ব্যবহারের বিস্তারিত তথ্য সংগ্রহ করবো।\",\r\n  \"Consent_Required_Title\": \"শুধু প্রয়োজনীয় তথ্য\",\r\n  \"Consent_Required_Description\": \"সংক্ষেপে, কেউ পাপিলন ব্যবহার করছে কিনা, সব ঠিক আছে কিনা এবং কোন সার্ভিস ব্যবহার করছে তা জানা।\",\r\n  \"Consent_None_Title\": \"একদম কিছু না\",\r\n  \"Consent_None_Description\": \"আমরা জানবোই না যে তুমি আছো।\",\r\n  \"Consent_Title\": \"তুমি এবং পাপিলন\",\r\n  \"Consent_Intro1\": \"পাপিলনকে বড় করতে সাহায্য করার জন্য, তুমি ব্যবহারের কিছু তথ্য শেয়ার করতে পারো।\",\r\n  \"Consent_PrivacyPolicy\": \"সন্দেহ থাকলে আমাদের গোপনীয়তা নীতি দেখুন\",\r\n  \"Consent_Refuse\": \"প্রত্যাখ্যান করুন\",\r\n  \"Consent_Accept\": \"গ্রহণ করুন\",\r\n  \"Consent_ChangeMind\": \"তুমি চাইলে পরে সেটিংস থেকে এটি পরিবর্তন করতে পারো।\",\r\n  \"Consent_Arg1\": \"শুধুমাত্র অ্যাপ উন্নত করার জন্য ব্যবহৃত হয়\",\r\n  \"Consent_Arg2\": \"সম্পূর্ণ বেনামী এবং তোমার পরিচয়ের সাথে যুক্ত নয়\",\r\n  \"Consent_Arg3\": \"তোমার অ্যাকাউন্টে আমাদের কোনো অ্যাক্সেস নেই\",\r\n\r\n  \"Changelog_Title\": \"আপডেট নোটস\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"জমা দেওয়ার তারিখ\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"বিষয়সমূহ\",\r\n  \"Tasks_Sorting_Methods_Done\": \"অসম্পূর্ণ\",\r\n  \"Tasks_ThisWeek\": \"এই সপ্তাহ\",\r\n\r\n  \"Task_Undone\": \"অসম্পূর্ণ\",\r\n  \"Task_Done\": \"সম্পন্ন\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"ওয়ালপেপার পরিবর্তন করুন\",\r\n  \"Modal_Profile_Title\": \"প্রোফাইল কাস্টমাইজ করুন\",\r\n\r\n  \"Modal_Task_Status\": \"কাজের অবস্থা\",\r\n  \"Modal_Task_Description\": \"কাজের বিবরণ\",\r\n  \"Modal_Task_Attachments\": \"অ্যাটাচমেন্ট\",\r\n\r\n  \"Today\": \"আজ\",\r\n  \"Yesterday\": \"গতকাল\",\r\n  \"Tomorrow\": \"আগামীকাল\"\r\n}"
  },
  {
    "path": "locales/br.json",
    "content": "{\r\n  \"Global_Back\": \"Distro\",\r\n  \"Global_DatePrefix\": \"ar\",\r\n  \"Tab_Home\": \"Degemer\",\r\n  \"Tab_Calendar\": \"Kentelioù\",\r\n  \"Tab_Tasks\": \"Labour noz\",\r\n  \"Tab_Grades\": \"Notennoù\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Cheñch va profil\",\r\n  \"Button_Change_ProfilePicture\": \"Cheñch ar skeudenn profil\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Kemer ur poltred\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Diwar ar fototek\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Kemer eus an ENT\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Lemel ar poltred\",\r\n  \"Tab_Page\": \"Pagenn\",\r\n  \"Tab_Settings\": \"Arventennoù\",\r\n  \"Tab_News\": \"Keleier\",\r\n  \"ONBOARDING_MAIN_TITLE\": \"Ar meziant evit ober war-dro da vuhez skol\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Kevreañ da meziantoù skol evit haeziñ d'az notennoù, kentelioù, labour noz, ha muioc'h c'hoas etrefas Papillon !\",\r\n  \"ONBOARDING_START_BTN\": \"Kregiñ\",\r\n  \"ONBOARDING_HELP_BTN\": \"Ezhomm sikour ?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Servij skol-veur\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Servij boued\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Dibab da servij skol\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Dibab da servij boued\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Dibab da servij skol-veur\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Penaos 'peus c'hoant en em gevreañ ?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Implij va lec'hiadur\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Klask ur ger\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Ur QR-Code am eus\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Un URL gevreañ am eus\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Choaz da annezadeg\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Lakait anv ho kêr ha dibabit ho annezadeg\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"En em gevreañ evel kustum\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Kevreañ ouzh da gont\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Dibab an ostiz deverket d'ar c'hont\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Lak da c'hod gant 4 sifr az peus graet war Pronote\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Gevreañ da\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Skannit QR-Code ho annezadeg evit mont e-barzh.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Kadarnaat ar QR-Kod\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Gellout a ra kemer un tamm amzer...\",\r\n  \"ONBOARDING_URL\": \"Lak URL da annezadeg\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL da ensavadur PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"A-raok echuiñ\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Choaz un\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"liv an tem\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Ro Kod PIN da PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"O kargañ lec'hienn da annezadeg emaomp\",\r\n  \"INPUT_PIN\": \"Kod PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Klask un ensavadur...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"O kevreañ...\",\r\n  \"WAITING\": \"O c'hortoz\",\r\n  \"IZLY_SMS_SEND\": \"Resevet peus ul liamm evit kevreañ, klikit warnañ ha heuliit ar pazennoù.\",\r\n  \"STEP\": \"Pazenn\",\r\n  \"STEP_OUTOF\": \"war\",\r\n  \"INPUT_USERNAME\": \"Anv implijer\",\r\n  \"INPUT_MAIL\": \"Chomlec'h postel\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Chomlec'h postel pe anv implijer\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Niverenn pellgomz pe lec'hienn postel\",\r\n  \"INPUT_PASSWORD\": \"Ger-kuzh\",\r\n  \"INPUT_PASSWORD_CODE\": \"Kod tremen\",\r\n  \"INPUT_ETABID\": \"Kod da ensavadur\",\r\n  \"LOGIN_BTN\": \"En em gevreiñ\",\r\n  \"CONFIRM_BTN\": \"Kadarnaat\",\r\n  \"CANCEL_BTN\": \"Nullañ\",\r\n  \"Tab_New_Event\": \"Darvoud nevez\",\r\n  \"Tab_Calendar_Icals\": \"Merañ da iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Merañ da URLoù iCal\",\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Ouzhpennañ un URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Merañ {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Ouzhpennañ pe lemel da URL iCal da sinkronizañ gant da deiziataer.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Titl diank\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Lak un anv d'an URL iCal se evit ouzhpennañ anezhi.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"URL iCal ouzhpennet ebet\",\r\n  \"TabUnderConstruction_Title\": \"Ivinell war ober.\",\r\n  \"TabUnderConstruction_Details\": \"Distroit diwezhatoc'h evit kaout hizivadennoù.\",\r\n  \"TabDevModeNotice_Title\": \"Mod diorren\",\r\n  \"TabDevModeNotice_Details\": \"Titouroù Endro amprouiñ klok evit an diorroerien.\",\r\n  \"Alert_TechnicalDetails\": \"Munudoù teknikel\",\r\n  \"Online_Course\": \"En linenn\",\r\n  \"Evaluated_Course\": \"Priziadenn\",\r\n  \"Edited_Course\": \"Kentel cheñchet\",\r\n  \"Canceled_Course\": \"Kentel nullet\",\r\n  \"No_Course_Room\": \"Sal dianavezet\",\r\n  \"Event_DeleteEvent\": \"Lemel an darvoud\",\r\n  \"Event_Confirm_DeleteEvent\": \"Sur out 'peus c'hoant lemel an darvoud-se?\",\r\n  \"Course_Separator_Lunch_Default\": \"Ehan merenn\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Yec'hed mat !\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Menam !\",\r\n  \"Course_Separator_Morning_Default\": \"Ehan mintin\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Da gousket !\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Dijuniñ\",\r\n  \"Course_Separator_Evening_Default\": \"Ehan goude merenn\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Un ehan da zistanañ !\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Amzer ar merenn !\",\r\n  \"Course_Separator_Night_Default\": \"Ehan an noz\",\r\n  \"Course_Separator_Night_Alt_1\": \"Da gousket !\",\r\n  \"Course_Separator_Night_Alt_2\": \"An noz eo !\",\r\n  \"Context_Delete\": \"Lemel\",\r\n  \"Context_Cancel\": \"Nullañ\",\r\n  \"Context_Edit\": \"Cheñch\",\r\n  \"Context_Add\": \"Ouzhpennañ\",\r\n  \"Form_Title\": \"Titl\",\r\n  \"Form_Location\": \"Lec'hiadenn\",\r\n  \"Form_Organizer\": \"Aozer\",\r\n  \"Form_Start\": \"Penn kentañ\",\r\n  \"Form_End\": \"Fin\",\r\n  \"Confirm_DeleteEvent\": \"Sur out 'peus c'hoant lemel an darvoud-se?\",\r\n  \"Home_Welcome_Name\": \"Demat, {{name}} {{emoji}}\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"dieub\",\r\n  \"Home_Chats_Plurial\": \"kaozeadegoù\",\r\n  \"Home_Chats_Singular\": \"kaozeadeg\",\r\n  \"Home_See_All_Tasks\": \"Sellout ouzh pep labour noz\",\r\n  \"Home_Welcome\": \"Demat !\",\r\n  \"Home_Planned_None\": \"Ne 'peus kentel raktreset ebet hiziv\",\r\n  \"Home_Planned_One\": \"Ur gentel a chom dit hiziv\",\r\n  \"Home_Planned_Number\": \"{{number}} kentel a chom dit hiziv\",\r\n  \"Home_Widget_NextCourses\": \"Kentel o tont\",\r\n  \"Home_Widget_NewGrades\": \"Notennoù nevez\",\r\n  \"Home_Widget_NewHomeworks\": \"Labour noz d'ober\",\r\n  \"Home_Widget_NoCourses\": \"Kentel ebet o tont\",\r\n  \"Home_Widget_NoCourses_Description\": \"N'ez eus kentel raktreset ebet hiziv.\",\r\n  \"Home_Cards_Button_Title\": \"Kartennoù\",\r\n  \"Home_Cards_Button_Description_None\": \"Kartenn ebet\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Ur gartenn\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} c'hartenn\",\r\n  \"Home_Chats_Button_Title\": \"Kemennadennoù\",\r\n  \"Home_Chats_Button_Description_None\": \"Kemennadenn ebet\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Ur gemennadenn\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} kemennadennoù\",\r\n  \"Home_Attendance_Title\": \"Ezvezañsoù\",\r\n  \"Home_Attendance_Button_Description_None\": \"Ezvezañs ebet\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Un ezvezañs\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} ezvezañsoù\",\r\n  \"Home_Menu_Button_Title\": \"Roll ar meuzioù\",\r\n  \"Home_Menu_Button_Description\": \"Roll meuzioù an devezh\",\r\n  \"Tab_Calendar_Empty\": \"Darvoud ebet kavet\",\r\n  \"Tab_Calendar_Empty_Description\": \"Ouzhpenn un darvoud pe sinkroniz da zeiziataer evit kregiñ\",\r\n  \"Modal_Course_Title\": \"Va c’hentel\",\r\n  \"Modal_Course_StartsIn\": \"Krog a ra a-benn\",\r\n  \"Modal_Course_StartedAgo\": \"Echuet dibaoe\",\r\n  \"Modal_Course_Ongoing\": \"Kroget dibaoe\",\r\n  \"Modal_Course_Group\": \"Strollad\",\r\n  \"Modal_Course_Group_Full\": \"Klas\",\r\n  \"Modal_Course_Details\": \"Munudoù ar gentel\",\r\n  \"Modal_Course_Teacher\": \"Kelenner\",\r\n  \"Modal_Course_Room\": \"Sal klas\",\r\n  \"Modal_Course_Duration\": \"Padelezh\",\r\n  \"Modal_Course_Time\": \"Eurvezhioù ar gentel\",\r\n  \"Modal_Course_Start\": \"Penn-kentañ\",\r\n  \"Modal_Course_End\": \"Fin\",\r\n  \"Tasks_Search_Placeholder\": \"Klask al labourioù noz\",\r\n  \"Tasks_LeftHomeworks_Title\": \"labour noz a zilerc'h\",\r\n  \"Tasks_LeftHomeworks_Time\": \"ar sizun-mañ\",\r\n  \"Tasks_Done_AllTasks\": \"An holl labourioù-noz\",\r\n  \"Tasks_Done_CompletedTasks\": \"a zo bet graet\",\r\n  \"Tasks_Nav_Left\": \"{{count}} labour(ioù)-noz a chom d'ober\",\r\n  \"Tasks_Nav_One\": \"Ne chom nemet ul labour noz da ober\",\r\n  \"Tasks_Nav_Completed\": \"Pep tra 'zo echuet !\",\r\n  \"Tasks_Week\": \"Sizun\",\r\n  \"Tasks_NoTasks_Title\": \"Labour-noz ebet\",\r\n  \"Tasks_NoTasks_Description\": \"N'ez eus labour-noz ebet evit ar sizun mañ. Kemer an amzer-mañ evit diskuizhañ !\",\r\n  \"Tasks_NoTasks_ForWeek\": \"evit ar sizun {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Labour-noz ebet\",\r\n  \"Task_Start\": \"Da ober\",\r\n  \"Task_Complete\": \"Echuet\",\r\n  \"Task_Sorting_Title\": \"Renkañ dre\",\r\n  \"Task_OnlyShowUndone\": \"Labourioù-noz echuet\",\r\n  \"Task_Show_Title\": \"Diskouez\",\r\n  \"Settings_General\": \"Hollek\",\r\n  \"Latest_Grades\": \"Notennoù nevez\",\r\n  \"Grades_Search_Placeholder\": \"Klask un notenn, un danvez\",\r\n  \"Grades_Avg_Methods\": \"Doareoù jediñ\",\r\n  \"Grades_Avg_All_Title\": \"Keidenn hollek\",\r\n  \"Grades_Avg_All_Short\": \"Keid. hollek\",\r\n  \"Grades_Avg_All_Pond\": \"Keidenn kompez\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Keid. kompez\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Jediñ keidenn kompez an holl notennoù\",\r\n  \"Grades_Avg_Subject_Title\": \"Keidenn an notennoù\",\r\n  \"Grades_Avg_Subject_Short\": \"Keid. notennoù\",\r\n  \"Grades_Avg_Subject_Description\": \"Jediñ keidenn kompez keidennoù an danvezioù\",\r\n  \"Grades_Avg_Median_Title\": \"Median\",\r\n  \"Grades_Avg_Median_Short\": \"Median\",\r\n  \"Grades_Avg_More\": \"Gouzout muioc'h\",\r\n  \"Grades_Avg_KnowMore\": \"Gouzout muioc'h\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Kompren an hentennoù jediñ eus ar geidenn hollad\",\r\n  \"Grades_SubjectInfo\": \"Keleier war an danvezioù\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} notenn.où\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Keidenn ar skolier\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistikoù\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Keidenn ar c’hlasad\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Keidenn hollek ar c'hlasad\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Keidenn brasañ\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Keidenn gwellañ ar strollad\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Keidenn bihanañ\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Keidenn bihanañ ar strollad\",\r\n  \"Grades_Semester\": \"Cʼhwecʼhmiziad\",\r\n  \"Grades_Trimester\": \"Trimiziad\",\r\n  \"Grades_OutPeriod\": \"Maez-mare\",\r\n  \"Grades_Year\": \"Bloaz\",\r\n  \"Grades_MockExamBac\": \"Bak gwenn\",\r\n  \"Grades_MockExamBrevet\": \"Breved gwenn\",\r\n  \"Grades_Method_AllGrades\": \"An holl danvezioù\",\r\n  \"Grades_Method_Weighted\": \"Pozadur\",\r\n  \"Grades_Sort\": \"Dibab\",\r\n  \"Grades_Sorting_Alphabetical\": \"Lizherennek\",\r\n  \"Grades_Sorting_Averages\": \"Keidennoù\",\r\n  \"Grades_Sorting_Date\": \"Deiziad\",\r\n  \"Grades_Menu_SortBy\": \"Renk dre\",\r\n  \"Grades_Menu_AverageBy\": \"Keidennoù dre\",\r\n  \"NoAverage\": \"Keidenn ebet\",\r\n  \"Grades_Empty_Title\": \"Notenn ebet\",\r\n  \"Grades_Empty_Description\": \"N'out ket bet notennet er mare-mañ.\",\r\n  \"Grade_NoDescription\": \"Labour-noz {{subject}}\",\r\n  \"Grades_Tab_Subjects\": \"Danvezioù\",\r\n  \"Grades_Tab_Latest\": \"Notennoù nevez\",\r\n  \"Profile_Attendance_Title\": \"Buhez skol\",\r\n  \"Profile_Attendance_Denominator_Single\": \"ezvezañs\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"ezvezañsoù\",\r\n  \"Profile_Discussions_Title\": \"Kaozeadegoù\",\r\n  \"Profile_Discussions_Denominator_Single\": \"n'eo ket bet lennet\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"n'int ket bet lennet\",\r\n  \"Profile_News_Title\": \"Kentaouadoù\",\r\n  \"Profile_News_Denominator_Single\": \"nevez\",\r\n  \"Profile_News_Denominator_Plural\": \"keleier\",\r\n  \"Profile_News_Open\": \"Digeriñ\",\r\n  \"Profile_News_Loading_Title\": \"Kargadenn ar c'heleier...\",\r\n  \"Profile_News_Author_Unknown\": \"Oberer dianavezet\",\r\n  \"Profile_Cards_Title\": \"QR-Kodoù ha kartennoù\",\r\n  \"Modal_Grades_Title\": \"Munudoù an notenn\",\r\n  \"Modal_Grades_BestGrade\": \"Notenn wellañ ar strollad\",\r\n  \"Grades_Details_Title\": \"Munudoù\",\r\n  \"Grades_NormalizedGrade_Title\": \"Notenn lakaet war 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Talvoud an notenn lakaet war ur skeul eus 20\",\r\n  \"Grades_HighestGrade_Title\": \"Notenn uhelañ\",\r\n  \"Grades_HighestGrade_Description\": \"Notenn uhelañ ar strollad\",\r\n  \"Grades_LowestGrade_Title\": \"Notenn an izhellañ\",\r\n  \"Grades_LowestGrade_Description\": \"Notenn izhellañ ar strollad\",\r\n  \"Grades_Influence_Title\": \"Levezon\",\r\n  \"Grades_Avg_Group_Title\": \"Keidenn ar strollad\",\r\n  \"Grades_Coefficient\": \"Kenefeder\",\r\n  \"Grades_Avg_Group_Short\": \"Keid. strollad\",\r\n  \"Grades_Tab_Rank\": \"Renkadur\",\r\n  \"Grades_Tab_Rank_Description\": \"Plas er strollad\",\r\n  \"News_Search_Placeholder\": \"Klask keleier\",\r\n  \"News_Empty_Title\": \"Keleier ebet\",\r\n  \"News_Empty_Description\": \"Keleier ebet kavet en hoc’h ensavadur\",\r\n  \"News_Search_NoResults\": \"Keleier ebet kavet\",\r\n  \"News_Search_NoResults_Description\": \"N'eus bet kavet keleier ebet evit ho klask.\",\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Un tem dous ha brav\",\r\n  \"News_Theme_Reading_Title\": \"Lennadenn\",\r\n  \"News_Theme_Reading_Description\": \"Un tem graet evit lenn\",\r\n  \"Attendance_Hours_Missed\": \"Eurvezhioù c’huitaet\",\r\n  \"Attendance_Hours_Unjustified\": \"Eurvezhioù diabeget\",\r\n  \"Attendance_Missing\": \"Ezvezañsoù\",\r\n  \"Attendance_Delays\": \"Daleoù\",\r\n  \"Attendance_NoReason\": \"Abeg ebet\",\r\n  \"Attendance_NoEvent_Title\": \"Darvoud ebet\",\r\n  \"Attendance_NoEvent_Description\": \"N'ez eus ezvezañs pe dale ebet evit ar mare-mañ.\",\r\n  \"Settings_Account_Title\": \"Va c’hont\",\r\n  \"Settings_Account_Description\": \"Va c'hont\",\r\n  \"Settings_Services_Title\": \"Kontoù liammet\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Kont diwezhañ implijet\",\r\n  \"Settings_Notifications_Title\": \"Notifiadennoù\",\r\n  \"Settings_Notifications_Description\": \"Diwall, aliested...\",\r\n  \"Settings_Subjects_Title\": \"Danvezioù\",\r\n  \"Settings_Subjects_Description\": \"Anv, liv, font...\",\r\n  \"Settings_Personalization_Title\": \"Personelaat\",\r\n  \"Settings_Personalization_Description\": \"Temoù, livioù...\",\r\n  \"Settings_Cards_Title\": \"Kartennoù\",\r\n  \"Settings_Cards_Description\": \"Predva, tremen...\",\r\n  \"Settings_Accessibility_Title\": \"Haezadusted\",\r\n  \"Settings_Accessibility_Description\": \"Diskwel, son...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Keweriusterioù speredek\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Keweriusterioù I.A\",\r\n  \"Settings_MagicPlus_Enable\": \"Aktivañ Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Gwellaat aozadur al labourioù-noz evit gwellaat ho produusted\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Ur patrom lec'hel penn-da-benn, ne vez treuzkaset roadennoù ebet e-maez ho penveg\",\r\n  \"Settings_Donate_Title\": \"Ober ur prof\",\r\n  \"Settings_Donate_Description\": \"Souten ar raktres\",\r\n  \"Settings_Telemetry_Title\": \"Telemetriezh ha buhez prevez\",\r\n  \"Settings_Telemetry_Description\": \"Merañ ar roadennoù dastumet\",\r\n  \"Settings_About_Title\": \"Diwar-benn\",\r\n  \"Settings_About_Description\": \"Version\",\r\n  \"Settings_Logout_Title\": \"Digevreañ\",\r\n  \"Settings_Logout_Description\": \"Lemel ar c'hont-mañ eus Papillon\",\r\n  \"Settings_Language_Title\": \"Yezh\",\r\n  \"Settings_Language_Description\": \"Cheñch ar yezh\",\r\n  \"Settings_Personalization_Title_Card\": \"Personeladur\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Temoù, danvezioù...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Personelañ an danvezhioù\",\r\n  \"Settings_Personalization_Accent\": \"Kreñvadur ul liv\",\r\n  \"Settings_Personalization_Accent_Description\": \"Al liv dibabet ganeoc'h amañ a vo arveret war bajenn degemer Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Tem\",\r\n  \"Settings_Personalization_Icon_Title\": \"Cheñch an ikon\",\r\n  \"Settings_Personalization_Icon_Description\": \"Personelañ ikon ar meziant\",\r\n  \"Settings_Personalization_Subject_Title\": \"Personelañ an danvezioù\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikonoù ha livioù\",\r\n  \"Settings_About_Papillion_Behind\": \"A-dreñv Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon a vez dalc'het gant studierien a youl vat 100%\",\r\n  \"Settings_About_Discord\": \"Servijer Discord\",\r\n  \"Settings_About_Discord_Description\": \"Mont war ar servijer Discord\",\r\n  \"Settings_About_Github\": \"Raktres GitHub\",\r\n  \"Settings_About_Github_Description\": \"Kemer perzh er raktres war GitHub\",\r\n  \"Settings_About_Dependency_Version\": \"Version an diazalc'hoù\",\r\n  \"Alert_No_Technical\": \"N'ez eus keleier teknikel hegerz ebet.\",\r\n  \"Alert_Auth_Error\": \"Kudenn aotentikadur\",\r\n  \"Alert_Auth_Bad_Creds\": \"Direizh eo an titouroù ho peus lakaet pe emaoc'h o klask kevreañ gant ur gont gerent. N'eo ket skoret ar seurt kont-mañ gant Papillon c'hoazh.\",\r\n  \"Alert_Not_Supported\": \"Ensavadur diskoret\",\r\n  \"Alert_Security_Instance_HTTP\": \"Evit abegoù surentez, ne zegemer ket Papillon an ensavadurioù a implij c'hoazh ar c'homenad HTTP. Aliañ a reomp ac'hanoc'h da gemenn penn an annezadeg evit ma c'hallfe nevesaat an ensavadur-mañ ha mirout he surentez.\",\r\n  \"Alert_NoDemo\": \"N'eo ket graet Papillon evit mont war-dro gant un ensavadur diskouez.\",\r\n  \"Alert_Invalid_Instance\": \"N'eo ket deuet a-benn Papillon da gaout titouroù an ensavadur PRONOTE-mañ, reizh eo c'hoas ?\",\r\n  \"Alert_No_Pos\": \"N'haller ket tapout al lec'hiadur\",\r\n  \"Alert_Connexion_Fail\": \"N'hall ket kevreañ\",\r\n  \"Feature_Limited\": \"Elfennoù bevennet\",\r\n  \"Feature_Soon\": \"Dont a ra a-benn nebeut !\",\r\n  \"Feature_Soon_Notification\": \"Labourat a reomp start evit kinnig deoc'h an elfenn-mañ en un adnevezadur da zont.\",\r\n  \"Feature_Add_Card\": \"Ouzhpennañ ur gartenn nevez diwar an ivinell Profil a c'haller kavout er varrenn merdeiñ\",\r\n  \"Webview_Wait\": \"Gortozit un tamm...\",\r\n  \"Profile_QRCards\": \"QR-Kod ha kartennoù\",\r\n  \"Settings_Cards_Banner_Title\": \"Kartennoù\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Predva, tremen...\",\r\n  \"Settings_Cards_Banner_Description\": \"Ouzhpennit ho kartennoù-predva hag ho kartennoù treuzdougen evit implij anezho e pep lec'h diwar ho pellgomzer war Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Kartenn ebet\",\r\n  \"Settings_Cards_Add_Button\": \"Ouzhpennañ\",\r\n  \"Settings_Cards_None_Description\": \"Ouzhpennit unan evit mont e darempred gant ho peurrest er c'hantin, skaniñ ho QR-Kod ha muioc'h c'hoazh\",\r\n  \"Settings_Subjects_None_Title\": \"Danvez ebet\",\r\n  \"Settings_Subjects_None_Description\": \"Furchal e ivinelloù disheñvel an arload evit personelaat an danvezioù.\",\r\n  \"Settings_Donator\": \"Donezour\",\r\n  \"Settings_Donator_Description\": \"Sellout ouzh listenn an donezourien\",\r\n  \"Settings_App_Version\": \"Version ar meziant\",\r\n  \"Profile_Cards_Scan_Orientation\": \"Lak ar QR-Kod war-zu ar vonn\",\r\n  \"Profile_Cards_No_Reservation\": \"Amberz ebet\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Seblantout a ra ne c'hellez ket amberz an deiz-se.\",\r\n  \"Profile_Cards_History\": \"Istoreg\",\r\n  \"Magic_Important\": \"Gellout a ra bezañ pouezhus\",\r\n  \"OnBoarding_Step\": \"Pazenn\",\r\n  \"OnBoarding_Step_Of\": \"war\",\r\n  \"Consent_Advanced_Title\": \"C'hoant am eus sikour Papillon\",\r\n  \"Consent_Advanced_Description\": \"Dastum a reomp titouroù resisoc'h diwar-benn hoc'h implij.\",\r\n  \"Consent_Required_Title\": \"An traoù diazez hepken\",\r\n  \"Consent_Required_Description\": \"Dre vras, gouzout e oa bet implijet Papillon gant unan bennak, hag-eñ e oa aet mat ha peseurt servij a implijont.\",\r\n  \"Consent_None_Title\": \"Netra\",\r\n  \"Consent_None_Description\": \"Ne ouiomp ket zoken emaoc'h.\",\r\n  \"Consent_Title\": \"Te ha Papillon\",\r\n  \"Consent_Intro1\": \"Evit sikour Papillon da greskiñ e c'hallit dibab rannañ titouroù talvoudus.\",\r\n  \"Consent_PrivacyPolicy\": \"M'ho peus douetañs, sellit ouzh hor politikerezh prevezded\",\r\n  \"Consent_Refuse\": \"Nac'hañ\",\r\n  \"Consent_Accept\": \"Asantiñ\",\r\n  \"Consent_ChangeMind\": \"Gellout a rit cheñch ali p'ho peus c'hoant en arventennoù\",\r\n  \"Consent_Arg1\": \"Implijet evit gwellaat ar meziant hepken\",\r\n  \"Consent_Arg2\": \"Dizanv ha hep liamm gant ho identelezh\",\r\n  \"Consent_Arg3\": \"N'hon eus ket tu da vont e-barzh ho kontoù\",\r\n  \"Changelog_Title\": \"Notennoù embann\",\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Deiziad distreiñ\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Danvezhioù\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Ket echuet\",\r\n  \"Tasks_ThisWeek\": \"Ar sizhun-mañ\",\r\n  \"Task_Undone\": \"Ket echuet\",\r\n  \"Task_Done\": \"Echuet\",\r\n  \"Modal_Wallpaper_Title\": \"Personelaat ar foñs-skramm\",\r\n  \"Modal_Profile_Title\": \"Personelaat ar profil\",\r\n  \"Modal_Task_Status\": \"Stad al labour noz\",\r\n  \"Modal_Task_Description\": \"Diskrivadur al labour-noz\",\r\n  \"Modal_Task_Attachments\": \"Pezhioù-stag\",\r\n  \"Today\": \"Hiziv\",\r\n  \"Yesterday\": \"Dec'h\",\r\n  \"Tomorrow\": \"warc'hoazh\"\r\n}"
  },
  {
    "path": "locales/cs.json",
    "content": "{\r\n  \"Global_Back\": \"Zpět\",\r\n  \"Global_DatePrefix\": \"dne\",\r\n\r\n  \"Tab_Home\": \"Domů\",\r\n  \"Tab_Calendar\": \"Rozvrh\",\r\n  \"Tab_Tasks\": \"Úkoly\",\r\n  \"Tab_Grades\": \"Známky\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Upravit profil\",\r\n  \"Button_Change_ProfilePicture\": \"Změnit profilovou fotku\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Pořídit fotku\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Z galerie\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Načíst ze školního systému (ENT)\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Odstranit fotku\",\r\n  \"Tab_Page\": \"Stránka\",\r\n  \"Tab_Settings\": \"Nastavení\",\r\n  \"Tab_News\": \"Novinky\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Aplikace pro správu tvého školního života\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Propoj své školní aplikace a měj známky, rozvrh, úkoly a mnoho dalšího v rozhraní Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Začít\",\r\n  \"ONBOARDING_HELP_BTN\": \"Potřebuješ pomoc?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Univerzitní služby\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Stravovací služby\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Vyber svou školní službu\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Vyber svou stravovací službu\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Vyber svou univerzitní službu\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Jak se chceš přihlásit?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Použít mou polohu\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Hledat město\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Mám QR kód\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Mám přihlašovací URL\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Vyber svou školu\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Zadej název města a vyber svou školu\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Přihlas se tak, jak jsi zvyklý\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Přihlas se ke svému účtu\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Vyber hostitele přiřazeného k účtu\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Zadej 4místný kód, který jsi právě vytvořil v PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Přihlašování k\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Naskenuj QR kód své školy pro připojení.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Ověřování QR kódu\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"To může chvíli trvat...\",\r\n  \"ONBOARDING_URL\": \"Zadej URL adresu své školy\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL tvé instance PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Před dokončením\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Vyber si\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"barvu motivu\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Zadej PIN kód ze svého PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"Načítáme stránky tvé školy\",\r\n  \"INPUT_PIN\": \"PIN kód\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Hledat instanci...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Přihlašování...\",\r\n\r\n  \"WAITING\": \"Čekejte\",\r\n  \"IZLY_SMS_SEND\": \"Právě jsi obdržel odkaz k přihlášení, klikni na něj a postupuj podle kroků.\",\r\n  \"STEP\": \"Krok\",\r\n  \"STEP_OUTOF\": \"z\",\r\n  \"INPUT_USERNAME\": \"Uživatelské jméno\",\r\n  \"INPUT_MAIL\": \"E-mailová adresa\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-mail nebo uživatelské jméno\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Telefonní číslo nebo e-mail\",\r\n  \"INPUT_PASSWORD\": \"Heslo\",\r\n  \"INPUT_PASSWORD_CODE\": \"Přístupový kód\",\r\n  \"INPUT_ETABID\": \"Identifikátor tvé školy\",\r\n  \"LOGIN_BTN\": \"Přihlásit se\",\r\n  \"CONFIRM_BTN\": \"Potvrdit\",\r\n  \"CANCEL_BTN\": \"Zrušit\",\r\n\r\n  \"Tab_New_Event\": \"Nová událost\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Správa iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Spravuj své iCal URL adresy\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Přidat iCal URL\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Spravovat {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Přidej nebo odstraň iCal URL pro synchronizaci s tvým rozvrhem.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Chybí název\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Pojmenuj tuto iCal URL pro její přidání.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Žádné přidané iCal URL\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Tato karta se připravuje.\",\r\n  \"TabUnderConstruction_Details\": \"Vrať se později pro aktualizace.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Vývojářský režim\",\r\n  \"TabDevModeNotice_Details\": \"Kompletní testovací prostředí pro vývojáře.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Technické detaily\",\r\n\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Hodnocení/Test\",\r\n  \"Edited_Course\": \"Změněná lekce\",\r\n  \"Canceled_Course\": \"Zrušená lekce\",\r\n  \"No_Course_Room\": \"Neznámá učebna\",\r\n  \"Event_DeleteEvent\": \"Smazat událost\",\r\n  \"Event_Confirm_DeleteEvent\": \"Opravdu chceš tuto událost smazat?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Polední přestávka\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Dobrou chuť!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Mňam!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Dopolední přestávka\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Šup do hajan!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Snídaně\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Odpolední přestávka\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Čas na pauzu!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Čas na svačinu!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Večerní přestávka\",\r\n  \"Course_Separator_Night_Alt_1\": \"Šup do hajan!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Už je noc!\",\r\n\r\n  \"Context_Delete\": \"Smazat\",\r\n  \"Context_Cancel\": \"Zrušit\",\r\n  \"Context_Edit\": \"Upravit\",\r\n  \"Context_Add\": \"Přidat\",\r\n\r\n  \"Form_Title\": \"Název\",\r\n  \"Form_Location\": \"Umístění\",\r\n  \"Form_Organizer\": \"Organizátor\",\r\n  \"Form_Start\": \"Začátek\",\r\n  \"Form_End\": \"Konec\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Opravdu chceš tuto událost smazat?\",\r\n\r\n  \"Home_Welcome_Name\": \"Ahoj, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Zobrazit více\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"k dispozici\",\r\n  \"Home_Chats_Plurial\": \"diskusí\",\r\n  \"Home_Chats_Singular\": \"diskuse\",\r\n  \"Home_See_All_Tasks\": \"Zobrazit všechny úkoly\",\r\n  \"Home_Welcome\": \"Dobrý den!\",\r\n  \"Home_Planned_None\": \"Dnes už nemáš žádné další lekce\",\r\n  \"Home_Planned_One\": \"Dnes ti zbývá jedna lekce\",\r\n  \"Home_Planned_Number\": \"Dnes ti zbývá {{number}} lekcí\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Následující lekce\",\r\n  \"Home_Widget_NewGrades\": \"Nové známky\",\r\n  \"Home_Widget_NewHomeworks\": \"Úkoly k vypracování\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Žádné nadcházející lekce\",\r\n  \"Home_Widget_NoCourses_Description\": \"Na dnešek nejsou naplánovány žádné lekce.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Karty\",\r\n  \"Home_Cards_Button_Description_None\": \"Žádná karta\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Jedna karta\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} karet\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Zprávy\",\r\n  \"Home_Chats_Button_Description_None\": \"Žádná zpráva\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Jedna zpráva\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} zpráv\",\r\n\r\n  \"Home_Attendance_Title\": \"Absence\",\r\n  \"Home_Attendance_Button_Description_None\": \"Žádná absence\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Jedna absence\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} absencí\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Menu\",\r\n  \"Home_Menu_Button_Description\": \"Dnešní jídelníček\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Nenalezeny žádné události\",\r\n  \"Tab_Calendar_Empty_Description\": \"Přidej událost nebo synchronizuj svůj rozvrh, abys mohl začít.\",\r\n\r\n  \"Modal_Course_Title\": \"Moje lekce\",\r\n  \"Modal_Course_StartsIn\": \"Začíná za\",\r\n  \"Modal_Course_StartedAgo\": \"Skončilo před\",\r\n  \"Modal_Course_Ongoing\": \"Probíhá již\",\r\n  \"Modal_Course_Group\": \"Skupina\",\r\n  \"Modal_Course_Group_Full\": \"Třída\",\r\n\r\n  \"Modal_Course_Details\": \"Detaily lekce\",\r\n  \"Modal_Course_Teacher\": \"Vyučující\",\r\n  \"Modal_Course_Room\": \"Učebna\",\r\n  \"Modal_Course_Duration\": \"Délka\",\r\n\r\n  \"Modal_Course_Time\": \"Čas lekce\",\r\n  \"Modal_Course_Start\": \"Začátek\",\r\n  \"Modal_Course_End\": \"Konec\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Hledat úkoly\",\r\n  \"Tasks_LeftHomeworks_Title\": \"zbývající úkoly\",\r\n  \"Tasks_LeftHomeworks_Time\": \"tento týden\",\r\n  \"Tasks_Done_AllTasks\": \"Všechny úkoly\",\r\n  \"Tasks_Done_CompletedTasks\": \"byly splněny\",\r\n  \"Tasks_Nav_Left\": \"Zbývá {{count}} úkol(ů)\",\r\n  \"Tasks_Nav_One\": \"Zbývá poslední úkol\",\r\n  \"Tasks_Nav_Completed\": \"Vše hotovo!\",\r\n  \"Tasks_Week\": \"Týden\",\r\n  \"Tasks_NoTasks_Title\": \"Žádné úkoly\",\r\n  \"Tasks_NoTasks_Description\": \"Na tento týden nejsou naplánovány žádné úkoly. Užij si odpočinek!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"pro týden {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Žádné úkoly\",\r\n  \"Task_Start\": \"K udělání\",\r\n  \"Task_Complete\": \"Hotovo\",\r\n  \"Task_Sorting_Title\": \"Seřadit podle\",\r\n  \"Task_OnlyShowUndone\": \"Hotové úkoly\",\r\n  \"Task_Show_Title\": \"Zobrazit\",\r\n  \"Settings_General\": \"Obecné\",\r\n\r\n  \"Latest_Grades\": \"Nové známky\",\r\n  \"Grades_Search_Placeholder\": \"Hledat známku, předmět\",\r\n\r\n  \"Grades_Avg_Methods\": \"Metody výpočtu\",\r\n  \"Grades_Avg_All_Title\": \"Celkový průměr\",\r\n  \"Grades_Avg_All_Short\": \"Celk. průměr\",\r\n  \"Grades_Avg_All_Pond\": \"Vážený průměr\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Váž. průměr\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Vypočítá vážený průměr všech známek\",\r\n  \"Grades_Avg_Subject_Title\": \"Průměr předmětů\",\r\n  \"Grades_Avg_Subject_Short\": \"Průměr předm.\",\r\n  \"Grades_Avg_Subject_Description\": \"Vypočítá vážený průměr z průměrů jednotlivých předmětů\",\r\n  \"Grades_Avg_Median_Title\": \"Medián\",\r\n  \"Grades_Avg_Median_Short\": \"Medián\",\r\n\r\n  \"Grades_Avg_More\": \"Zjistit více\",\r\n  \"Grades_Avg_KnowMore\": \"Zjistit více\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Pochopte metody výpočtu celkového průměru\",\r\n\r\n  \"Grades_SubjectInfo\": \"Informace o předmětu\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} známka/y\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Průměr žáka\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistiky\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Průměr třídy\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Celkový průměr třídy\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Maximální průměr\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Nejlepší průměr ve skupině\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Minimální průměr\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Nejslabší průměr ve skupině\",\r\n\r\n  \"Grades_Semester\": \"Pololetí\",\r\n  \"Grades_Trimester\": \"Trimestr\",\r\n  \"Grades_OutPeriod\": \"Mimo období\",\r\n  \"Grades_Year\": \"Rok\",\r\n  \"Grades_MockExamBac\": \"Maturita nanečisto\",\r\n  \"Grades_MockExamBrevet\": \"Zkoušky nanečisto\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Všechny předměty\",\r\n  \"Grades_Method_Weighted\": \"Váha (Koeficient)\",\r\n\r\n  \"Grades_Sort\": \"Seřadit\",\r\n  \"Grades_Sorting_Alphabetical\": \"Abecedně\",\r\n  \"Grades_Sorting_Averages\": \"Podle průměru\",\r\n  \"Grades_Sorting_Date\": \"Podle data\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Seřadit podle\",\r\n  \"Grades_Menu_AverageBy\": \"Průměr podle\",\r\n  \"NoAverage\": \"Žádný průměr\",\r\n\r\n  \"Grades_Empty_Title\": \"Žádné známky\",\r\n  \"Grades_Empty_Description\": \"V tomto období jsi zatím nebyl hodnocen.\",\r\n\r\n  \"Grade_NoDescription\": \"Úkol z předmětu {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Předměty\",\r\n  \"Grades_Tab_Latest\": \"Nové známky\",\r\n\r\n  \"Profile_Attendance_Title\": \"Docházka\",\r\n  \"Profile_Attendance_Denominator_Single\": \"absence\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"absencí\",\r\n\r\n  \"Profile_Discussions_Title\": \"Diskuse\",\r\n  \"Profile_Discussions_Denominator_Single\": \"nepřečteno\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"nepřečtených\",\r\n\r\n  \"Profile_News_Title\": \"Novinky\",\r\n  \"Profile_News_Denominator_Single\": \"nová\",\r\n  \"Profile_News_Denominator_Plural\": \"nové\",\r\n  \"Profile_News_Open\": \"Otevřít\",\r\n  \"Profile_News_Loading_Title\": \"Načítání novinek...\",\r\n  \"Profile_News_Author_Unknown\": \"Neznámý autor\",\r\n\r\n  \"Profile_Cards_Title\": \"QR kód a karty\",\r\n\r\n  \"Modal_Grades_Title\": \"Detail známky\",\r\n  \"Modal_Grades_BestGrade\": \"Nejlepší známka ve skupině\",\r\n\r\n  \"Grades_Details_Title\": \"Detaily\",\r\n  \"Grades_NormalizedGrade_Title\": \"Známka v přepočtu na 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Hodnota známky převedená na stupnici 20\",\r\n  \"Grades_HighestGrade_Title\": \"Nejvyšší známka\",\r\n  \"Grades_HighestGrade_Description\": \"Maximální známka dosažená ve skupině\",\r\n  \"Grades_LowestGrade_Title\": \"Nejnižší známka\",\r\n  \"Grades_LowestGrade_Description\": \"Minimální známka dosažená ve skupině\",\r\n  \"Grades_Influence_Title\": \"Vliv\",\r\n  \"Grades_Avg_Group_Title\": \"Průměr skupiny\",\r\n  \"Grades_Coefficient\": \"Váha (Koeficient)\",\r\n  \"Grades_Avg_Group_Short\": \"Průměr sk.\",\r\n  \"Grades_Tab_Rank\": \"Pořadí\",\r\n  \"Grades_Tab_Rank_Description\": \"Pozice ve skupině\",\r\n\r\n  \"News_Search_Placeholder\": \"Hledat novinku\",\r\n  \"News_Empty_Title\": \"Žádné novinky\",\r\n  \"News_Empty_Description\": \"Ve tvé škole nebyly nalezeny žádné novinky.\",\r\n  \"News_Search_NoResults\": \"Žádná novinka nenalezena\",\r\n  \"News_Search_NoResults_Description\": \"Pro tvé vyhledávání nebyly nalezeny žádné výsledky.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Jemný a elegantní motiv\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Čtení\",\r\n  \"News_Theme_Reading_Description\": \"Motiv navržený pro pohodlné čtení\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Zameškané hodiny\",\r\n  \"Attendance_Hours_Unjustified\": \"Neomluvené hodiny\",\r\n  \"Attendance_Missing\": \"Absence\",\r\n  \"Attendance_Delays\": \"Pozdní příchody\",\r\n  \"Attendance_NoReason\": \"Bez důvodu\",\r\n  \"Attendance_NoEvent_Title\": \"Žádná událost\",\r\n  \"Attendance_NoEvent_Description\": \"Pro toto období nejsou zaznamenány žádné absence ani zpoždění.\",\r\n\r\n  \"Settings_Account_Title\": \"Můj účet\",\r\n  \"Settings_Account_Description\": \"Můj účet\",\r\n  \"Settings_Services_Title\": \"Propojené účty\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Naposledy použitý účet\",\r\n  \"Settings_Notifications_Title\": \"Oznámení\",\r\n  \"Settings_Notifications_Description\": \"Upozornění, frekvence...\",\r\n  \"Settings_Subjects_Title\": \"Předměty\",\r\n  \"Settings_Subjects_Description\": \"Název, barva, písmo...\",\r\n  \"Settings_Personalization_Title\": \"Personalizace\",\r\n  \"Settings_Personalization_Description\": \"Motivy, barvy...\",\r\n  \"Settings_Cards_Title\": \"Karty\",\r\n  \"Settings_Cards_Description\": \"Jídelna, přístup...\",\r\n  \"Settings_Accessibility_Title\": \"Přístupnost\",\r\n  \"Settings_Accessibility_Description\": \"Zobrazení, zvuk...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Chytré funkce\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI funkce\",\r\n  \"Settings_MagicPlus_Enable\": \"Aktivovat Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Automaticky optimalizuje organizaci tvých úkolů pro zvýšení produktivity\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Zcela lokální model, žádná data neopouštějí tvé zařízení\",\r\n  \"Settings_Donate_Title\": \"Podpořit nás\",\r\n  \"Settings_Donate_Description\": \"Podpoř projekt\",\r\n  \"Settings_Telemetry_Title\": \"Telemetrie a soukromí\",\r\n  \"Settings_Telemetry_Description\": \"Správa sbíraných dat\",\r\n  \"Settings_About_Title\": \"O aplikaci\",\r\n  \"Settings_About_Description\": \"Verze\",\r\n  \"Settings_Logout_Title\": \"Odhlásit se\",\r\n  \"Settings_Logout_Description\": \"Odstranit tento účet z Papillonu\",\r\n  \"Settings_Language_Title\": \"Jazyk\",\r\n  \"Settings_Language_Description\": \"Změnit jazyk\",\r\n  \"Settings_Tabs_Title\": \"Karty\",\r\n  \"Settings_Tabs_Description\": \"Skrýt karty z menu\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personalizace\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Motivy, předměty...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Personalizovat předměty\",\r\n  \"Settings_Personalization_Accent\": \"Barva zvýraznění\",\r\n  \"Settings_Personalization_Accent_Description\": \"Barva, kterou zde vybereš, se použije na domovské stránce Papillonu.\",\r\n  \"Settings_Personalization_Theme\": \"Motiv\",\r\n  \"Settings_Personalization_Icon_Title\": \"Změnit ikonu\",\r\n  \"Settings_Personalization_Icon_Description\": \"Uprav si ikonu aplikace\",\r\n  \"Settings_Personalization_Subject_Title\": \"Personalizovat předměty\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Předměty\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikony, barvy\",\r\n  \"Settings_About_Papillion_Behind\": \"Kdo stojí za Papillonem\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon spravují 100% dobrovolní studenti\",\r\n  \"Settings_About_Discord\": \"Discord server\",\r\n  \"Settings_About_Discord_Description\": \"Připoj se na náš Discord\",\r\n  \"Settings_About_Crowdin\": \"Projekt Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Pomoz s překladem Papillonu\",\r\n  \"Settings_About_Github\": \"Projekt GitHub\",\r\n  \"Settings_About_Github_Description\": \"Přispěj k projektu na GitHubu\",\r\n  \"Settings_About_Issue\": \"Nahlásit chybu\",\r\n  \"Settings_About_Issue_Description\": \"Nahlásit nalezenou chybu\",\r\n  \"Settings_About_Dependency_Version\": \"Verze závislostí\",\r\n\r\n  \"Alert_No_Technical\": \"Nejsou k dispozici žádné technické informace.\",\r\n  \"Alert_Auth_Error\": \"Chyba autentizace\",\r\n  \"Alert_Auth_Bad_Creds\": \"Zadané údaje jsou nesprávné nebo se pokoušíš přihlásit rodičovským účtem. Tento typ účtu zatím není v Papillonu podporován.\",\r\n  \"Alert_Not_Supported\": \"Instance není podporována\",\r\n  \"Alert_Security_Instance_HTTP\": \"Z bezpečnostních důvodů Papillon nepřijímá instance využívající protokol HTTP. Doporučujeme informovat vedení školy, aby instanci aktualizovalo.\",\r\n  \"Alert_NoDemo\": \"Papillon není určen pro práci s demo instancemi, použij prosím reálnou instanci.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon nemůže získat informace z této instance PRONOTE, je stále platná?\",\r\n  \"Alert_No_Pos\": \"Nelze získat polohu\",\r\n  \"Alert_Connexion_Fail\": \"Připojení se nezdařilo\",\r\n\r\n  \"Feature_Limited\": \"Omezené funkce\",\r\n  \"Feature_Soon\": \"Již brzy!\",\r\n  \"Feature_Soon_Notification\": \"Tvrdě pracujeme na tom, abychom ti tuto funkci nabídli v budoucí aktualizaci.\",\r\n  \"Feature_Add_Card\": \"Přidej novou kartu v záložce Profil v navigačním panelu\",\r\n\r\n  \"Webview_Wait\": \"Chvilku strpení...\",\r\n\r\n  \"Profile_QRCards\": \"QR kód a karty\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} karta/y\",\r\n  \"Profile_Cards_Loading_History\": \"Načítání historie transakcí\",\r\n  \"Profile_Cards_Loading_History_Description\": \"To může chvilku trvat...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Karty\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Jídelna, přístup\",\r\n  \"Settings_Cards_Banner_Description\": \"Přidej své karty na obědy a dopravu, abys k nim měl přístup kdekoli ze svého telefonu v Papillonu\",\r\n  \"Settings_Cards_None_Title\": \"Žádné karty\",\r\n  \"Settings_Cards_Add_Button\": \"Přidat\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Přidej kartu pro sledování zůstatku v jídelně, skenování QR kódu a další\",\r\n  \"Settings_Subjects_None_Title\": \"Žádné předměty\",\r\n  \"Settings_Subjects_None_Description\": \"Procházej různé karty aplikace, aby bylo možné předměty přizpůsobit.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Resetovat\",\r\n  \"Settings_Subjects_Reset_Message\": \"Opravdu chceš resetovat nastavení všech předmětů?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Resetovat\",\r\n\r\n  \"Settings_Donator\": \"Dárci\",\r\n  \"Settings_Donator_Description\": \"Zobrazit seznam dárců\",\r\n  \"Settings_App_Version\": \"Verze aplikace\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Namiř QR kód na čtečku terminálu\",\r\n  \"Profile_Cards_No_Reservation\": \"Žádná rezervace\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Vypadá to, že na tento den nemůžeš rezervovat.\",\r\n  \"Profile_Cards_History\": \"Historie\",\r\n  \"Magic_Important\": \"Možná důležité\",\r\n\r\n  \"OnBoarding_Step\": \"Krok \",\r\n  \"OnBoarding_Step_Of\": \"z \",\r\n\r\n  \"Consent_Advanced_Title\": \"Chci pomoci Papillonu\",\r\n  \"Consent_Advanced_Description\": \"Sbíráme podrobnější informace o tvém používání.\",\r\n  \"Consent_Required_Title\": \"Jen to podstatné\",\r\n  \"Consent_Required_Description\": \"Stručně řečeno: vědět, že někdo použil Papillon, zda vše proběhlo v pořádku a jakou službu používá.\",\r\n  \"Consent_None_Title\": \"Vůbec nic\",\r\n  \"Consent_None_Description\": \"Nebudeme o tvé existenci vůbec vědět.\",\r\n  \"Consent_Title\": \"Ty a Papillon\",\r\n  \"Consent_Intro1\": \"Abys pomohl Papillonu růst, můžeš se rozhodnout sdílet některé informace o používání.\",\r\n  \"Consent_PrivacyPolicy\": \"V případě pochybností si přečti naše zásady ochrany osobních údajů\",\r\n  \"Consent_Refuse\": \"Odmítnout\",\r\n  \"Consent_Accept\": \"Přijmout\",\r\n  \"Consent_ChangeMind\": \"Své rozhodnutí můžeš kdykoli změnit v nastavení aplikace.\",\r\n  \"Consent_Arg1\": \"Slouží výhradně ke zlepšování aplikace\",\r\n  \"Consent_Arg2\": \"Anonymní a nespojené s tvou identitou\",\r\n  \"Consent_Arg3\": \"Nemáme přístup k tvým účtům\",\r\n\r\n  \"Changelog_Title\": \"Poznámky k vydání\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Datum odevzdání\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Předměty\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Nedokončeno\",\r\n  \"Tasks_ThisWeek\": \"Tento týden\",\r\n\r\n  \"Task_Undone\": \"Nedokončeno\",\r\n  \"Task_Done\": \"Hotovo\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Upravit tapetu\",\r\n  \"Modal_Profile_Title\": \"Upravit profil\",\r\n\r\n  \"Modal_Task_Status\": \"Stav úkolu\",\r\n  \"Modal_Task_Description\": \"Popis úkolu\",\r\n  \"Modal_Task_Attachments\": \"Přílohy\",\r\n\r\n  \"Today\": \"Dnes\",\r\n  \"Yesterday\": \"Včera\",\r\n  \"Tomorrow\": \"Zítra\"\r\n}"
  },
  {
    "path": "locales/da.json",
    "content": "{\r\n  \"Global_Back\": \"Tilbage\",\r\n  \"Global_DatePrefix\": \"den\",\r\n\r\n  \"Tab_Home\": \"Hjem\",\r\n  \"Tab_Calendar\": \"Skema\",\r\n  \"Tab_Tasks\": \"Opgaver\",\r\n  \"Tab_Grades\": \"Karakterer\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Rediger min profil\",\r\n  \"Button_Change_ProfilePicture\": \"Skift profilbillede\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Tag et billede\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Fra biblioteket\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Hent fra dit skolesystem\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Slet billede\",\r\n  \"Tab_Page\": \"Side\",\r\n  \"Tab_Settings\": \"Indstillinger\",\r\n  \"Tab_News\": \"Nyheder\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Appen til at styre dit skoleliv\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Forbind dine skole-apps for at få adgang til dine karakterer, lektioner, lektier og meget mere i Papillon-brugerfladen!\",\r\n  \"ONBOARDING_START_BTN\": \"Begynd\",\r\n  \"ONBOARDING_HELP_BTN\": \"Brug for hjælp?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Universitetstjeneste\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Kantineordning\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Vælg din skoletjeneste\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Vælg din kantineordning\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Vælg din universitetstjeneste\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Hvordan vil du logge ind?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Brug min placering\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Søg efter by\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Jeg har en QR-kode\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Jeg har en login-URL\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Vælg din skole\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Indtast din by og vælg din skole\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Log ind som du plejer\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Log ind på din konto\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Vælg værten tilknyttet kontoen\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Indtast den 4-cifrede kode, du lige har oprettet i PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Forbinder til\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Scan din skoles QR-kode for at forbinde.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validering af QR-kode\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Dette kan tage et øjeblik...\",\r\n  \"ONBOARDING_URL\": \"Angiv din skoles URL-adresse\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL til din PRONOTE-instans\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Før vi er færdige\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Vælg en\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"temafarve\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Indtast din PRONOTE PIN-kode\",\r\n  \"Onboarding_Load_Webview_Description\": \"Vi indlæser din skoles hjemmeside\",\r\n  \"INPUT_PIN\": \"PIN-kode\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Søg efter instans...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Logger ind...\",\r\n\r\n  \"WAITING\": \"Venter\",\r\n  \"IZLY_SMS_SEND\": \"Du har lige modtaget et link til at logge ind. Klik på det og følg trinnene.\",\r\n  \"STEP\": \"Trin\",\r\n  \"STEP_OUTOF\": \"af\",\r\n  \"INPUT_USERNAME\": \"Brugernavn\",\r\n  \"INPUT_MAIL\": \"E-mailadresse\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-mail eller brugernavn\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Telefonnummer eller e-mail\",\r\n  \"INPUT_PASSWORD\": \"Adgangskode\",\r\n  \"INPUT_PASSWORD_CODE\": \"Adgangskode\",\r\n  \"INPUT_ETABID\": \"Din skoles ID\",\r\n  \"LOGIN_BTN\": \"Log ind\",\r\n  \"CONFIRM_BTN\": \"Bekræft\",\r\n  \"CANCEL_BTN\": \"Annuller\",\r\n\r\n  \"Tab_New_Event\": \"Ny begivenhed\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Administrer iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Administrer dine iCal-URL'er\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Tilføj iCal-URL\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Administrer {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Tilføj eller slet iCal-URL'er for at synkronisere med dit skema.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Titel mangler\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Giv denne iCal-URL et navn for at tilføje den.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Ingen iCal-URL'er tilføjet\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Denne fane er under opbygning.\",\r\n  \"TabUnderConstruction_Details\": \"Kom tilbage senere for opdateringer.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Udviklertilstand\",\r\n  \"TabDevModeNotice_Details\": \"Komplet testmiljø til udviklere.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Tekniske detaljer\",\r\n\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Evaluering\",\r\n  \"Edited_Course\": \"Ændret lektion\",\r\n  \"Canceled_Course\": \"Aflyst lektion\",\r\n  \"No_Course_Room\": \"Ukendt lokale\",\r\n  \"Event_DeleteEvent\": \"Slet begivenhed\",\r\n  \"Event_Confirm_DeleteEvent\": \"Er du sikker på, at du vil slette denne begivenhed?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Frokostpause\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Velbekomme!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Mums!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Formiddagspause\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Søvntid!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Morgenmad\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Eftermiddagspause\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Tid til en pause!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Snacktid!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Aftenpause\",\r\n  \"Course_Separator_Night_Alt_1\": \"Søvntid!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Det er nat!\",\r\n\r\n  \"Context_Delete\": \"Slet\",\r\n  \"Context_Cancel\": \"Annuller\",\r\n  \"Context_Edit\": \"Rediger\",\r\n  \"Context_Add\": \"Tilføj\",\r\n\r\n  \"Form_Title\": \"Titel\",\r\n  \"Form_Location\": \"Lokation\",\r\n  \"Form_Organizer\": \"Arrangør\",\r\n  \"Form_Start\": \"Start\",\r\n  \"Form_End\": \"Slut\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Er du sikker på, at du vil slette denne begivenhed?\",\r\n\r\n  \"Home_Welcome_Name\": \"Hej, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Vis mere\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"tilgængelige\",\r\n  \"Home_Chats_Plurial\": \"samtaler\",\r\n  \"Home_Chats_Singular\": \"samtale\",\r\n  \"Home_See_All_Tasks\": \"Se alle opgaver\",\r\n  \"Home_Welcome\": \"Hej!\",\r\n  \"Home_Planned_None\": \"Du har ikke flere planlagte lektioner i dag\",\r\n  \"Home_Planned_One\": \"Du har én lektion tilbage i dag\",\r\n  \"Home_Planned_Number\": \"Du har {{number}} lektioner tilbage i dag\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Næste lektioner\",\r\n  \"Home_Widget_NewGrades\": \"Nye karakterer\",\r\n  \"Home_Widget_NewHomeworks\": \"Opgaver der skal laves\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Ingen kommende lektioner\",\r\n  \"Home_Widget_NoCourses_Description\": \"Der er ingen lektioner planlagt for i dag.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kort\",\r\n  \"Home_Cards_Button_Description_None\": \"Ingen kort\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Ét kort\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kort\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Beskeder\",\r\n  \"Home_Chats_Button_Description_None\": \"Ingen beskeder\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Én besked\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} beskeder\",\r\n\r\n  \"Home_Attendance_Title\": \"Fravær\",\r\n  \"Home_Attendance_Button_Description_None\": \"Intet fravær\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Ét fravær\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} fravær\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Menu\",\r\n  \"Home_Menu_Button_Description\": \"Dagens menu\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Ingen begivenheder fundet\",\r\n  \"Tab_Calendar_Empty_Description\": \"Tilføj en begivenhed eller synkroniser dit skema for at komme i gang.\",\r\n\r\n  \"Modal_Course_Title\": \"Min lektion\",\r\n  \"Modal_Course_StartsIn\": \"Starter om\",\r\n  \"Modal_Course_StartedAgo\": \"Sluttede for\",\r\n  \"Modal_Course_Ongoing\": \"I gang i\",\r\n  \"Modal_Course_Group\": \"Gruppe\",\r\n  \"Modal_Course_Group_Full\": \"Klasse\",\r\n\r\n  \"Modal_Course_Details\": \"Lektionsdetaljer\",\r\n  \"Modal_Course_Teacher\": \"Underviser\",\r\n  \"Modal_Course_Room\": \"Lokale\",\r\n  \"Modal_Course_Duration\": \"Varighed\",\r\n\r\n  \"Modal_Course_Time\": \"Tidspunkter\",\r\n  \"Modal_Course_Start\": \"Start\",\r\n  \"Modal_Course_End\": \"Slut\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Søg efter opgaver\",\r\n  \"Tasks_LeftHomeworks_Title\": \"resterende opgaver\",\r\n  \"Tasks_LeftHomeworks_Time\": \"i denne uge\",\r\n  \"Tasks_Done_AllTasks\": \"Alle opgaver\",\r\n  \"Tasks_Done_CompletedTasks\": \"er fuldført\",\r\n  \"Tasks_Nav_Left\": \"Endnu {{count}} opgave(r) tilbage\",\r\n  \"Tasks_Nav_One\": \"Kun én opgave tilbage\",\r\n  \"Tasks_Nav_Completed\": \"Alt er færdigt!\",\r\n  \"Tasks_Week\": \"Uge\",\r\n  \"Tasks_NoTasks_Title\": \"Ingen opgaver\",\r\n  \"Tasks_NoTasks_Description\": \"Der er ingen planlagte opgaver i denne uge. Nyd din pause!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"for uge {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Ingen opgaver\",\r\n  \"Task_Start\": \"Skal gøres\",\r\n  \"Task_Complete\": \"Færdig\",\r\n  \"Task_Sorting_Title\": \"Sorter efter\",\r\n  \"Task_OnlyShowUndone\": \"Færdige opgaver\",\r\n  \"Task_Show_Title\": \"Vis\",\r\n  \"Settings_General\": \"Generelt\",\r\n\r\n  \"Latest_Grades\": \"Nye karakterer\",\r\n  \"Grades_Search_Placeholder\": \"Søg efter en karakter, et fag\",\r\n\r\n  \"Grades_Avg_Methods\": \"Beregningsmetoder\",\r\n  \"Grades_Avg_All_Title\": \"Samlet gennemsnit\",\r\n  \"Grades_Avg_All_Short\": \"Gennemsnit\",\r\n  \"Grades_Avg_All_Pond\": \"Vægtet gennemsnit\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Vægtet gns.\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Beregner det vægtede gennemsnit af alle karakterer\",\r\n  \"Grades_Avg_Subject_Title\": \"Fagligt gennemsnit\",\r\n  \"Grades_Avg_Subject_Short\": \"Fagsnit\",\r\n  \"Grades_Avg_Subject_Description\": \"Beregner det vægtede gennemsnit af fagenes gennemsnit\",\r\n  \"Grades_Avg_Median_Title\": \"Median\",\r\n  \"Grades_Avg_Median_Short\": \"Median\",\r\n\r\n  \"Grades_Avg_More\": \"Læs mere\",\r\n  \"Grades_Avg_KnowMore\": \"Læs mere\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Forstå metoderne til beregning af det samlede gennemsnit\",\r\n\r\n  \"Grades_SubjectInfo\": \"Information om faget\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} karakter(er)\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Elevens gennemsnit\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistik\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Klassens gennemsnit\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Det samlede gennemsnit for klassen\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Højeste gennemsnit\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Bedste gennemsnit i gruppen\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Laveste gennemsnit\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Laveste gennemsnit i gruppen\",\r\n\r\n  \"Grades_Semester\": \"Semester\",\r\n  \"Grades_Trimester\": \"Trimester\",\r\n  \"Grades_OutPeriod\": \"Uden for periode\",\r\n  \"Grades_Year\": \"År\",\r\n  \"Grades_MockExamBac\": \"Terminsprøve\",\r\n  \"Grades_MockExamBrevet\": \"Øveprøve\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Alle fag\",\r\n  \"Grades_Method_Weighted\": \"Vægtning\",\r\n\r\n  \"Grades_Sort\": \"Sorter\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabetisk\",\r\n  \"Grades_Sorting_Averages\": \"Gennemsnit\",\r\n  \"Grades_Sorting_Date\": \"Dato\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Sortering efter\",\r\n  \"Grades_Menu_AverageBy\": \"Gennemsnit efter\",\r\n  \"NoAverage\": \"Intet gennemsnit\",\r\n\r\n  \"Grades_Empty_Title\": \"Ingen karakterer\",\r\n  \"Grades_Empty_Description\": \"Du har endnu ikke fået karakterer i denne periode.\",\r\n\r\n  \"Grade_NoDescription\": \"Opgave i {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Fag\",\r\n  \"Grades_Tab_Latest\": \"Nye karakterer\",\r\n\r\n  \"Profile_Attendance_Title\": \"Fremmøde\",\r\n  \"Profile_Attendance_Denominator_Single\": \"fravær\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"fravær\",\r\n\r\n  \"Profile_Discussions_Title\": \"Samtaler\",\r\n  \"Profile_Discussions_Denominator_Single\": \"ulæst\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"ulæste\",\r\n\r\n  \"Profile_News_Title\": \"Nyheder\",\r\n  \"Profile_News_Denominator_Single\": \"ny\",\r\n  \"Profile_News_Denominator_Plural\": \"nye\",\r\n  \"Profile_News_Open\": \"Åbn\",\r\n  \"Profile_News_Loading_Title\": \"Indlæser nyheder...\",\r\n  \"Profile_News_Author_Unknown\": \"Ukendt forfatter\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-kode og kort\",\r\n\r\n  \"Modal_Grades_Title\": \"Detaljer for karakter\",\r\n  \"Modal_Grades_BestGrade\": \"Bedste karakter i gruppen\",\r\n\r\n  \"Grades_Details_Title\": \"Detaljer\",\r\n  \"Grades_NormalizedGrade_Title\": \"Karakter omregnet til 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Værdien af karakteren omregnet til en skala på 20\",\r\n  \"Grades_HighestGrade_Title\": \"Højeste karakter\",\r\n  \"Grades_HighestGrade_Description\": \"Højeste karakter opnået i gruppen\",\r\n  \"Grades_LowestGrade_Title\": \"Laveste karakter\",\r\n  \"Grades_LowestGrade_Description\": \"Laveste karakter opnået i gruppen\",\r\n  \"Grades_Influence_Title\": \"Indflydelse\",\r\n  \"Grades_Avg_Group_Title\": \"Gruppens gennemsnit\",\r\n  \"Grades_Coefficient\": \"Koefficient\",\r\n  \"Grades_Avg_Group_Short\": \"Gns. gruppe\",\r\n  \"Grades_Tab_Rank\": \"Rangering\",\r\n  \"Grades_Tab_Rank_Description\": \"Placering i gruppen\",\r\n\r\n  \"News_Search_Placeholder\": \"Søg efter en nyhed\",\r\n  \"News_Empty_Title\": \"Ingen nyheder\",\r\n  \"News_Empty_Description\": \"Der blev ikke fundet nogen nyheder på din skole.\",\r\n  \"News_Search_NoResults\": \"Ingen nyheder fundet\",\r\n  \"News_Search_NoResults_Description\": \"Der blev ikke fundet nogen nyheder for din søgning.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Et blødt og elegant tema\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Læsning\",\r\n  \"News_Theme_Reading_Description\": \"Et tema designet til læsning\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Forsømte timer\",\r\n  \"Attendance_Hours_Unjustified\": \"Ulovligt fravær\",\r\n  \"Attendance_Missing\": \"Fravær\",\r\n  \"Attendance_Delays\": \"Forsinkelser\",\r\n  \"Attendance_NoReason\": \"Ingen årsag\",\r\n  \"Attendance_NoEvent_Title\": \"Ingen hændelser\",\r\n  \"Attendance_NoEvent_Description\": \"Ingen fravær eller forsinkelser registreret for denne periode.\",\r\n\r\n  \"Settings_Account_Title\": \"Min konto\",\r\n  \"Settings_Account_Description\": \"Min konto\",\r\n  \"Settings_Services_Title\": \"Forbundne konti\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Sidst brugte konto\",\r\n  \"Settings_Notifications_Title\": \"Notifikationer\",\r\n  \"Settings_Notifications_Description\": \"Advarsler, frekvens...\",\r\n  \"Settings_Subjects_Title\": \"Fag\",\r\n  \"Settings_Subjects_Description\": \"Navn, farve, skrifttype...\",\r\n  \"Settings_Personalization_Title\": \"Personliggørelse\",\r\n  \"Settings_Personalization_Description\": \"Temaer, farver...\",\r\n  \"Settings_Cards_Title\": \"Kort\",\r\n  \"Settings_Cards_Description\": \"Kantine, adgang...\",\r\n  \"Settings_Accessibility_Title\": \"Tilgængelighed\",\r\n  \"Settings_Accessibility_Description\": \"Visning, lyd...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Intelligente funktioner\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI-funktioner\",\r\n  \"Settings_MagicPlus_Enable\": \"Aktiver Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimerer automatisk organiseringen af dine opgaver for at forbedre din produktivitet\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Fuldt lokal model, ingen data overføres uden for din enhed\",\r\n  \"Settings_Donate_Title\": \"Giv et bidrag\",\r\n  \"Settings_Donate_Description\": \"Støt projektet\",\r\n  \"Settings_Telemetry_Title\": \"Telemetri og privatliv\",\r\n  \"Settings_Telemetry_Description\": \"Administrer indsamlede data\",\r\n  \"Settings_About_Title\": \"Om appen\",\r\n  \"Settings_About_Description\": \"Version\",\r\n  \"Settings_Logout_Title\": \"Log ud\",\r\n  \"Settings_Logout_Description\": \"Slet denne konto fra Papillon\",\r\n  \"Settings_Language_Title\": \"Sprog\",\r\n  \"Settings_Language_Description\": \"Skift sprog\",\r\n  \"Settings_Tabs_Title\": \"Faner\",\r\n  \"Settings_Tabs_Description\": \"Skjul faner fra menuen\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personliggørelse\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Temaer, fag...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Tilpas fag\",\r\n  \"Settings_Personalization_Accent\": \"Accentfarve\",\r\n  \"Settings_Personalization_Accent_Description\": \"Farven du vælger her, vil blive brugt på Papillons startside.\",\r\n  \"Settings_Personalization_Theme\": \"Tema\",\r\n  \"Settings_Personalization_Icon_Title\": \"Skift ikon\",\r\n  \"Settings_Personalization_Icon_Description\": \"Tilpas appens ikon\",\r\n  \"Settings_Personalization_Subject_Title\": \"Tilpas fag\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Fag\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikoner, farver\",\r\n  \"Settings_About_Papillion_Behind\": \"Bag Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon vedligeholdes af 100 % frivillige studerende\",\r\n  \"Settings_About_Discord\": \"Discord-server\",\r\n  \"Settings_About_Discord_Description\": \"Deltag i Discord-serveren\",\r\n  \"Settings_About_Crowdin\": \"Crowdin-projekt\",\r\n  \"Settings_About_Crowdin_Description\": \"Hjælp med at oversætte Papillon\",\r\n  \"Settings_About_Github\": \"GitHub-projekt\",\r\n  \"Settings_About_Github_Description\": \"Bidrag til projektet på GitHub\",\r\n  \"Settings_About_Issue\": \"Rapporter en fejl\",\r\n  \"Settings_About_Issue_Description\": \"Rapporter en fejl du har fundet\",\r\n  \"Settings_About_Dependency_Version\": \"Version af afhængigheder\",\r\n\r\n  \"Alert_No_Technical\": \"Ingen teknisk information tilgængelig.\",\r\n  \"Alert_Auth_Error\": \"Godkendelsesfejl\",\r\n  \"Alert_Auth_Bad_Creds\": \"De oplysninger, du indtastede, er forkerte, eller du prøver at logge ind med en forældrekonto. Denne kontotype understøttes endnu ikke af Papillon.\",\r\n  \"Alert_Not_Supported\": \"Instans understøttes ikke\",\r\n  \"Alert_Security_Instance_HTTP\": \"Af sikkerhedsmæssige årsager accepterer Papillon ikke instanser, der stadig bruger HTTP-protokollen. Vi anbefaler, at du informerer skolelederen, så de kan opdatere instansen.\",\r\n  \"Alert_NoDemo\": \"Papillon er ikke bygget til at fungere med demo-instanser. Brug venligst en rigtig konto.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon kan ikke hente oplysninger fra denne PRONOTE-instans. Er den stadig gyldig?\",\r\n  \"Alert_No_Pos\": \"Kunne ikke hente placering\",\r\n  \"Alert_Connexion_Fail\": \"Forbindelse ikke mulig\",\r\n\r\n  \"Feature_Limited\": \"Begrænsede funktioner\",\r\n  \"Feature_Soon\": \"Det kommer snart!\",\r\n  \"Feature_Soon_Notification\": \"Vi arbejder hårdt på at tilbyde dig denne funktion i en fremtidig opdatering.\",\r\n  \"Feature_Add_Card\": \"Tilføj et nyt kort fra fanen Profil i navigationslinjen\",\r\n\r\n  \"Webview_Wait\": \"Lidt tålmodighed...\",\r\n\r\n  \"Profile_QRCards\": \"QR-kode og kort\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} kort\",\r\n  \"Profile_Cards_Loading_History\": \"Indlæser transaktionshistorik\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Dette kan tage et øjeblik...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kort\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Kantine, adgang\",\r\n  \"Settings_Cards_Banner_Description\": \"Tilføj dine kantinekort og transportkort for at få adgang til dem overalt fra din telefon i Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Ingen kort\",\r\n  \"Settings_Cards_Add_Button\": \"Tilføj\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Tilføj ét for at se din kantinesaldo, scanne din QR-kode og mere\",\r\n  \"Settings_Subjects_None_Title\": \"Ingen fag\",\r\n  \"Settings_Subjects_None_Description\": \"Gennemse appens forskellige faner for at kunne tilpasse fagene.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Nulstil\",\r\n  \"Settings_Subjects_Reset_Message\": \"Vil du virkelig nulstille alle fag?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Nulstil\",\r\n\r\n  \"Settings_Donator\": \"Donorer\",\r\n  \"Settings_Donator_Description\": \"Se listen over donorer\",\r\n  \"Settings_App_Version\": \"App-version\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Ret QR-koden mod terminalens scanner\",\r\n  \"Profile_Cards_No_Reservation\": \"Ingen reservation\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Det ser ud til, at du ikke kan reservere denne dag.\",\r\n  \"Profile_Cards_History\": \"Historik\",\r\n  \"Magic_Important\": \"Kan være vigtigt\",\r\n\r\n  \"OnBoarding_Step\": \"Trin \",\r\n  \"OnBoarding_Step_Of\": \"af \",\r\n\r\n  \"Consent_Advanced_Title\": \"Jeg vil hjælpe Papillon\",\r\n  \"Consent_Advanced_Description\": \"Vi indsamler mere detaljerede oplysninger om din brug.\",\r\n  \"Consent_Required_Title\": \"Kun det nødvendige\",\r\n  \"Consent_Required_Description\": \"Kort sagt: vide at nogen har brugt Papillon, om det gik godt, og hvilken tjeneste der bruges.\",\r\n  \"Consent_None_Title\": \"Slet ingenting\",\r\n  \"Consent_None_Description\": \"Vi vil ikke engang vide, at du eksisterer.\",\r\n  \"Consent_Title\": \"Dig og Papillon\",\r\n  \"Consent_Intro1\": \"For at hjælpe Papillon med at vokse, kan du vælge at dele nogle brugsoplysninger.\",\r\n  \"Consent_PrivacyPolicy\": \"I tvivlstilfælde kan du læse vores privatlivspolitik\",\r\n  \"Consent_Refuse\": \"Afvis\",\r\n  \"Consent_Accept\": \"Accepter\",\r\n  \"Consent_ChangeMind\": \"Du kan til enhver tid ændre mening i appens indstillinger.\",\r\n  \"Consent_Arg1\": \"Bruges udelukkende til at forbedre appen\",\r\n  \"Consent_Arg2\": \"Anonymt og ikke knyttet til din identitet\",\r\n  \"Consent_Arg3\": \"Vi har ikke adgang til dine konti\",\r\n\r\n  \"Changelog_Title\": \"Versionsnoter\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Afleveringsdato\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Fag\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Ikke færdig\",\r\n  \"Tasks_ThisWeek\": \"Denne uge\",\r\n\r\n  \"Task_Undone\": \"Ikke færdig\",\r\n  \"Task_Done\": \"Færdig\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Tilpas baggrund\",\r\n  \"Modal_Profile_Title\": \"Tilpas profil\",\r\n\r\n  \"Modal_Task_Status\": \"Status på opgave\",\r\n  \"Modal_Task_Description\": \"Beskrivelse af opgave\",\r\n  \"Modal_Task_Attachments\": \"Vedhæftede filer\",\r\n\r\n  \"Today\": \"I dag\",\r\n  \"Yesterday\": \"I går\",\r\n  \"Tomorrow\": \"I morgen\"\r\n}"
  },
  {
    "path": "locales/de.json",
    "content": "{\r\n  \"Global_Back\": \"Zurück\",\r\n  \"Global_DatePrefix\": \"Die\",\r\n  \"Tab_Home\": \"Home\",\r\n  \"Tab_Calendar\": \"Fächer\",\r\n  \"Tab_Tasks\": \"Aufgaben\",\r\n  \"Tab_Grades\": \"Noten\",\r\n  \"Tab_Profile\": \"Profile\",\r\n  \"Tab_Custom_Profile\": \"Mein Profil bearbeiten\",\r\n  \"Button_Change_ProfilePicture\": \"Profilbild ändern\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Foto aufnehmen\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Aus der Fotogalerie\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Vom ENT abrufen\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Bild entfernen\",\r\n  \"Tab_Page\": \"Seite\",\r\n  \"Tab_Settings\": \"Einstellungen\",\r\n  \"Tab_News\": \"Neuigkeiten\",\r\n  \"ONBOARDING_MAIN_TITLE\": \"Die App um dein Schulleben zu managen\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Verbinde deine Schulapps um auf deine Noten, Fächer, Hausaufgaben und mehr in der Papillon-Oberfläche zuzugreifen!\",\r\n  \"ONBOARDING_START_BTN\": \"Start\",\r\n  \"ONBOARDING_HELP_BTN\": \"Hilfe benötigt?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Universitätsservice\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Mensaservice\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Wähle deinen Schulservice\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Wähle deinen Mensaservice\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Wähle deinen Universitätsservice\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Wie möchtest du dich anmelden?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Meinen Standord benutzen\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Eine Stadt suchen\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Ich habe einen QR-Code\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Ich habe eine Anmeld-URL\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Wähle deine Schule\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Gebe den Namen deiner Stadt ein und wähle deine Schule\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Wie gewöhnlich anmelden\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Anmelden\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Wähle den deinem Account zugewiesenen Host\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Gebe den 4-Ziffern Code den du eben bei PRONOTE erstellt hast\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Anmelden in\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Scanne den QR-Code deiner Schule zum Anmelden.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR-Code Validierung\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Dies könnte ein paar Augenblicke dauern...\",\r\n  \"ONBOARDING_URL\": \"Egeb die URL deiner Schule ein\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL deiner PRONOTE Instanz\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Bevor wie fertig sind\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Wähle eine\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"Themenfarbe\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Gebe deinen PRONOTE PIN-Code ein\",\r\n  \"Onboarding_Load_Webview_Description\": \"Wir laden die Website deiner Schule\",\r\n  \"INPUT_PIN\": \"PIN-Code\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Nach einer Instanz suchen...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Anmeldung läuft...\",\r\n  \"WAITING\": \"Warten\",\r\n  \"IZLY_SMS_SEND\": \"Du hast soeben einen Anmeldelink erhalten, tippe ihn an und folge den Schritten.\",\r\n  \"STEP\": \"Schritt\",\r\n  \"STEP_OUTOF\": \"von\",\r\n  \"INPUT_USERNAME\": \"Benutzername\",\r\n  \"INPUT_MAIL\": \"Email-Adresse\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Email-Adresse oder Benutzername\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Telefonnummer oder Email-Adresse\",\r\n  \"INPUT_PASSWORD\": \"Passwort\",\r\n  \"INPUT_PASSWORD_CODE\": \"Zugriffcode\",\r\n  \"INPUT_ETABID\": \"Deine Schul-ID\",\r\n  \"LOGIN_BTN\": \"Anmelden\",\r\n  \"CONFIRM_BTN\": \"Bestätigen\",\r\n  \"CANCEL_BTN\": \"Abbrechen\",\r\n  \"Tab_New_Event\": \"Neues Event\",\r\n  \"Tab_Calendar_Icals\": \"iCal-Verwaltung\",\r\n  \"Tab_Calendar_Icals_Description\": \"Verwalte deine iCal-URLs\",\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Füge eine iCal-URL hinzu\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Verwalte {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Füge hinzu oder entferne iCal-URLs zum Synchronisieren mit deinem Kalendar.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Fehlender Titel\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Gib dieser iCal-URL einen Namen, um sie hinzuzufügen.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Keine iCal-URL hinzugefügt\",\r\n  \"TabUnderConstruction_Title\": \"Dieser Tab ist unter Arbeiten.\",\r\n  \"TabUnderConstruction_Details\": \"Bitte komme später zurück für Updates.\",\r\n  \"TabDevModeNotice_Title\": \"Entwicklungsmodus\",\r\n  \"TabDevModeNotice_Details\": \"Vollständige Entwicklungsumgebung für Entwickler.\",\r\n  \"Alert_TechnicalDetails\": \"Technische Details\",\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Evaluation\",\r\n  \"Edited_Course\": \"Unterricht bearbeitet\",\r\n  \"Canceled_Course\": \"Unterricht abgesagt\",\r\n  \"No_Course_Room\": \"Unbekannter Raum\",\r\n  \"Event_DeleteEvent\": \"Event löschen\",\r\n  \"Event_Confirm_DeleteEvent\": \"Möchtest du diese Event wirklich löschen?\",\r\n  \"Course_Separator_Lunch_Default\": \"Mittagspause\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Guten Appetit!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Lecker !\",\r\n  \"Course_Separator_Morning_Default\": \"Morgenpause\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Ab ins Bett!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Frühstück\",\r\n  \"Course_Separator_Evening_Default\": \"Mittagspause\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Eine pause naht sich!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Zeit zum Essen!\",\r\n  \"Course_Separator_Night_Default\": \"Abends pause\",\r\n  \"Course_Separator_Night_Alt_1\": \"Ab ins Bett!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Es ist Nacht!\",\r\n  \"Context_Delete\": \"Löschen\",\r\n  \"Context_Cancel\": \"Abbrechen\",\r\n  \"Context_Edit\": \"Bearbeiten\",\r\n  \"Context_Add\": \"Hinzufügen\",\r\n  \"Form_Title\": \"Titel\",\r\n  \"Form_Location\": \"Standort\",\r\n  \"Form_Organizer\": \"Organisierer\",\r\n  \"Form_Start\": \"Start\",\r\n  \"Form_End\": \"Ende\",\r\n  \"Confirm_DeleteEvent\": \"Möchtest du diese Event wirklich löschen?\",\r\n  \"Home_Welcome_Name\": \"Hallo, {{name}} {{emoji}}\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"Verfügbar\",\r\n  \"Home_Chats_Plurial\": \"Gespräche\",\r\n  \"Home_Chats_Singular\": \"Gespräch\",\r\n  \"Home_See_All_Tasks\": \"Alle Aufgaben anzeigen\",\r\n  \"Home_Welcome\": \"Hallo!\",\r\n  \"Home_Planned_None\": \"Für heute ist kein Unterricht eingeplant\",\r\n  \"Home_Planned_One\": \"Du hast einen Kurs übrig für heute\",\r\n  \"Home_Planned_Number\": \"Du hast heute {{number}} Kurse eingeplant\",\r\n  \"Home_Widget_NextCourses\": \"Kommende Kurse\",\r\n  \"Home_Widget_NewGrades\": \"Neue Noten\",\r\n  \"Home_Widget_NewHomeworks\": \"Zu erledigende Aufgaben\",\r\n  \"Home_Widget_NoCourses\": \"Keine bevorstehenden Kurse\",\r\n  \"Home_Widget_NoCourses_Description\": \"Keine Kurse für heute geplant.\",\r\n  \"Home_Cards_Button_Title\": \"Karten\",\r\n  \"Home_Cards_Button_Description_None\": \"Keine Karten\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Eine Karte\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} Karten\",\r\n  \"Home_Chats_Button_Title\": \"Nachrichten\",\r\n  \"Home_Chats_Button_Description_None\": \"Keine Nachrichten\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Eine Nachricht\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} Nachrichten\",\r\n  \"Home_Attendance_Title\": \"Abwesenheiten\",\r\n  \"Home_Attendance_Button_Description_None\": \"Keine Abwesenheit\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Eine Abwesenheit\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} Abwesenheiten\",\r\n  \"Home_Menu_Button_Title\": \"Menü\",\r\n  \"Home_Menu_Button_Description\": \"Heutiges Menü\",\r\n  \"Tab_Calendar_Empty\": \"Keine Events gefunden\",\r\n  \"Tab_Calendar_Empty_Description\": \"Füge ein Event hinzu oder synchronisiere mit deinem Kalender um zu beginnen.\",\r\n  \"Modal_Course_Title\": \"Mein Unterricht\",\r\n  \"Modal_Course_StartsIn\": \"Startet in\",\r\n  \"Modal_Course_StartedAgo\": \"Fertig seit\",\r\n  \"Modal_Course_Ongoing\": \"Angefangen seit\",\r\n  \"Modal_Course_Group\": \"Gruppe\",\r\n  \"Modal_Course_Group_Full\": \"Kurs\",\r\n  \"Modal_Course_Details\": \"Kursdetails\",\r\n  \"Modal_Course_Teacher\": \"Lehrer\",\r\n  \"Modal_Course_Room\": \"Raum\",\r\n  \"Modal_Course_Duration\": \"Dauer\",\r\n  \"Modal_Course_Time\": \"Kurszeiten\",\r\n  \"Modal_Course_Start\": \"Start\",\r\n  \"Modal_Course_End\": \"Ende\",\r\n  \"Tasks_Search_Placeholder\": \"Aufgaben suchen\",\r\n  \"Tasks_LeftHomeworks_Title\": \"Aufgaben übrig\",\r\n  \"Tasks_LeftHomeworks_Time\": \"diese Woche\",\r\n  \"Tasks_Done_AllTasks\": \"Alle Aufgaben\",\r\n  \"Tasks_Done_CompletedTasks\": \"wurden abgeschlossen\",\r\n  \"Tasks_Nav_Left\": \"{{count}} Aufgabe(n) übrig\",\r\n  \"Tasks_Nav_One\": \"Nur eine Aufgabe übrig\",\r\n  \"Tasks_Nav_Completed\": \"Alles ist erledigt!\",\r\n  \"Tasks_Week\": \"Woche\",\r\n  \"Tasks_NoTasks_Title\": \"Keine Aufgaben\",\r\n  \"Tasks_NoTasks_Description\": \"Es wurden keine Aufgaben für diese Woche eingeplant. Nutze die Gelegenheit zum Ausruhen!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"für Woche {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Keine Aufgaben\",\r\n  \"Task_Start\": \"To do\",\r\n  \"Task_Complete\": \"Abgeschlossen\",\r\n  \"Task_Sorting_Title\": \"Sortieren nach\",\r\n  \"Task_OnlyShowUndone\": \"Fertige Aufgaben\",\r\n  \"Task_Show_Title\": \"Anzeigen\",\r\n  \"Settings_General\": \"Generell\",\r\n  \"Latest_Grades\": \"Neue Noten\",\r\n  \"Grades_Search_Placeholder\": \"Suchen nach einer Note, ein Kurs\",\r\n  \"Grades_Avg_Methods\": \"Rechenmethode\",\r\n  \"Grades_Avg_All_Title\": \"Insgesamter Durchschnitt\",\r\n  \"Grades_Avg_All_Short\": \"Insg. Durschschnitt\",\r\n  \"Grades_Avg_All_Pond\": \"Gemessener Durchschnitt\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Gemessener Durchschnitt\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Rechnen des gemessenen durchschnitt von allen Noten\",\r\n  \"Grades_Avg_Subject_Title\": \"Notendurchschnitt\",\r\n  \"Grades_Avg_Subject_Short\": \"Notendurchschn\",\r\n  \"Grades_Avg_Subject_Description\": \"Rechnen des gemessenen durchschnitt von allen fächern\",\r\n  \"Grades_Avg_Median_Title\": \"Median\",\r\n  \"Grades_Avg_Median_Short\": \"Median\",\r\n  \"Grades_Avg_More\": \"Mehr wissen\",\r\n  \"Grades_Avg_KnowMore\": \"Mehr wissen\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Verstehen der Rechenmethode der Durchschnittsnote\",\r\n  \"Grades_SubjectInfo\": \"Informationen über dieses Fach\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} Note(n)\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Durchschnitt des Schülers\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistiken\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Durchschnitt der Klasse\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Der allgemeine Klassendurchschnitt\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Maximaler Durchschnitt\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Bester Durchschnitt der Gruppe\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Mindestdurchschnitt\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Schwächster Durchschnitt der Gruppe\",\r\n  \"Grades_Semester\": \"Semester\",\r\n  \"Grades_Trimester\": \"Trimester\",\r\n  \"Grades_OutPeriod\": \"Außerhalb des Zeitraums\",\r\n  \"Grades_Year\": \"Jahr\",\r\n  \"Grades_MockExamBac\": \"Probe-Abitur\",\r\n  \"Grades_MockExamBrevet\": \"Probe-Brevet\",\r\n  \"Grades_Method_AllGrades\": \"Alle Fächer\",\r\n  \"Grades_Method_Weighted\": \"Notengewichtung\",\r\n  \"Grades_Sort\": \"Sortieren\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabetisch\",\r\n  \"Grades_Sorting_Averages\": \"Durschnitte\",\r\n  \"Grades_Sorting_Date\": \"Datum\",\r\n  \"Grades_Menu_SortBy\": \"Sortiermodus\",\r\n  \"Grades_Menu_AverageBy\": \"Durschnitt von\",\r\n  \"NoAverage\": \"Keine Durchschnitts-Note\",\r\n  \"Grades_Empty_Title\": \"Keine Noten\",\r\n  \"Grades_Empty_Description\": \"Du wurdest noch nicht für diese Stunde benotet.\",\r\n  \"Grade_NoDescription\": \"{{subject}} Aufgaben\",\r\n  \"Grades_Tab_Subjects\": \"Fächer\",\r\n  \"Grades_Tab_Latest\": \"Neue Noten\",\r\n  \"Profile_Attendance_Title\": \"Anwesenheit\",\r\n  \"Profile_Attendance_Denominator_Single\": \"Abwesenheit\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"Abwesenheiten\",\r\n  \"Profile_Discussions_Title\": \"Diskussionen\",\r\n  \"Profile_Discussions_Denominator_Single\": \"ungelesen\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"ungelesen\",\r\n  \"Profile_News_Title\": \"Neuigkeiten\",\r\n  \"Profile_News_Denominator_Single\": \"neu\",\r\n  \"Profile_News_Denominator_Plural\": \"neu\",\r\n  \"Profile_News_Open\": \"Offen\",\r\n  \"Profile_News_Loading_Title\": \"Neuigkeiten werden geladen...\",\r\n  \"Profile_News_Author_Unknown\": \"Unbekannter Autor\",\r\n  \"Profile_Cards_Title\": \"QR-Code und Karten\",\r\n  \"Modal_Grades_Title\": \"Notendetails\",\r\n  \"Modal_Grades_BestGrade\": \"Beste Note der Gruppe\",\r\n  \"Grades_Details_Title\": \"Details\",\r\n  \"Grades_NormalizedGrade_Title\": \"Auf 20 normalisierte Note\",\r\n  \"Grades_NormalizedGrade_Description\": \"Notenwert umgerechnet auf eine Skala von 20\",\r\n  \"Grades_HighestGrade_Title\": \"Höchste Note\",\r\n  \"Grades_HighestGrade_Description\": \"Höchste Note in der Gruppe erhalten\",\r\n  \"Grades_LowestGrade_Title\": \"Niedrigste Note\",\r\n  \"Grades_LowestGrade_Description\": \"Niedrigste Note in der Gruppe erhalten\",\r\n  \"Grades_Influence_Title\": \"Einfluss\",\r\n  \"Grades_Avg_Group_Title\": \"Gruppendurschnitt\",\r\n  \"Grades_Coefficient\": \"Koeffizient\",\r\n  \"Grades_Avg_Group_Short\": \"Gruppendurschn\",\r\n  \"Grades_Tab_Rank\": \"Rang\",\r\n  \"Grades_Tab_Rank_Description\": \"Position in der Gruppe\",\r\n  \"News_Search_Placeholder\": \"Neuigkeiten suchen\",\r\n  \"News_Empty_Title\": \"Keine Neuigkeiten\",\r\n  \"News_Empty_Description\": \"Es wurden keine Neuigkeiten in deinem Gebäude gefunden.\",\r\n  \"News_Search_NoResults\": \"Keine Neuigkeiten gefunden\",\r\n  \"News_Search_NoResults_Description\": \"Keine Neuigkeiten gefunden für ihre Suche.\",\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Ein weiches und elegantes Design\",\r\n  \"News_Theme_Reading_Title\": \"Lesen\",\r\n  \"News_Theme_Reading_Description\": \"Ein Design gemacht fürs Lesen\",\r\n  \"Attendance_Hours_Missed\": \"Verpasste Stunden\",\r\n  \"Attendance_Hours_Unjustified\": \"Unentschuldigte Stunden\",\r\n  \"Attendance_Missing\": \"Abwesenheiten\",\r\n  \"Attendance_Delays\": \"Verspätungen\",\r\n  \"Attendance_NoReason\": \"Kein Grund\",\r\n  \"Attendance_NoEvent_Title\": \"Kein Event\",\r\n  \"Attendance_NoEvent_Description\": \"Keine Abwesenheiten oder Verspätungen für diese Stunde festgestellt.\",\r\n  \"Settings_Account_Title\": \"Mein Account\",\r\n  \"Settings_Account_Description\": \"Mein Account\",\r\n  \"Settings_Services_Title\": \"Verknüpfte Accounts\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Letztes Konto verwendet\",\r\n  \"Settings_Notifications_Title\": \"Benachrichtigungen\",\r\n  \"Settings_Notifications_Description\": \"Warnungen, Häufigkeit...\",\r\n  \"Settings_Subjects_Title\": \"Fächer\",\r\n  \"Settings_Subjects_Description\": \"Name, Farbe, Schriftart...\",\r\n  \"Settings_Personalization_Title\": \"Personalisation\",\r\n  \"Settings_Personalization_Description\": \"Designs, Farben...\",\r\n  \"Settings_Cards_Title\": \"Karten\",\r\n  \"Settings_Cards_Description\": \"Mensa, Zugriff...\",\r\n  \"Settings_Accessibility_Title\": \"Zugänglichkeit\",\r\n  \"Settings_Accessibility_Description\": \"Bildschirm, Sound...\",\r\n  \"Settings_MagicPlus_Title\": \"Magie+\",\r\n  \"Settings_MagicPlus_Description\": \"Schlaue Features\",\r\n  \"Settings_MagicPlus_Description_Card\": \"KI Funktionen\",\r\n  \"Settings_MagicPlus_Enable\": \"Magie+ einschalten\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimieren Sie Ihre Aufgabenorganisation automatisch, um Ihre Produktivität zu steigern\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Vollkommen lokales Modell, keine daten verlassen dein Gerät\",\r\n  \"Settings_Donate_Title\": \"Spenden\",\r\n  \"Settings_Donate_Description\": \"Unterstütze das Projekt\",\r\n  \"Settings_Telemetry_Title\": \"Telemetrie und Privatsphäre\",\r\n  \"Settings_Telemetry_Description\": \"Gesammelte Daten verwalten\",\r\n  \"Settings_About_Title\": \"Über\",\r\n  \"Settings_About_Description\": \"Version 8.0.0\",\r\n  \"Settings_Logout_Title\": \"Abmelden\",\r\n  \"Settings_Logout_Description\": \"Diesen Account von Papillon entfernen\",\r\n  \"Settings_Language_Title\": \"Sprache\",\r\n  \"Settings_Language_Description\": \"Sprache ändern\",\r\n  \"Settings_Personalization_Title_Card\": \"Personalisierung\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Themen, fächer...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Personalisieren der fächer\",\r\n  \"Settings_Personalization_Accent\": \"Akzentfarbe\",\r\n  \"Settings_Personalization_Accent_Description\": \"Die Farbe die du hier auswählst wird in Papillon's Startseite verwendendet.\",\r\n  \"Settings_Personalization_Theme\": \"Design\",\r\n  \"Settings_Personalization_Icon_Title\": \"Icon ändern\",\r\n  \"Settings_Personalization_Icon_Description\": \"App Icon anpassen\",\r\n  \"Settings_Personalization_Subject_Title\": \"Fächer anpassen\",\r\n  \"Settings_Personalization_Subject_Description\": \"Icons, Farben\",\r\n  \"Settings_About_Papillion_Behind\": \"Über papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon wird zu 100% von studentischen Freiwilligen betreut\",\r\n  \"Settings_About_Discord\": \"Discord Server\",\r\n  \"Settings_About_Discord_Description\": \"Dem Discord Server beitreten\",\r\n  \"Settings_About_Github\": \"GitHub Projekt\",\r\n  \"Settings_About_Github_Description\": \"Zum GitHub Projekt Beitragen\",\r\n  \"Settings_About_Dependency_Version\": \"Abhängigkeitsversion\",\r\n  \"Alert_No_Technical\": \"Keine technischen Infos verfügbar.\",\r\n  \"Alert_Auth_Error\": \"Authentifizierungsfehler\",\r\n  \"Alert_Auth_Bad_Creds\": \"Die eingegebenen Anmeldeinformationen sind falsch oder du versuchst dich mit einem Elternaccount anzumelden. Dieser Accounttyp wird noch nicht von Papillon unterstützt.\",\r\n  \"Alert_Not_Supported\": \"Instanz nicht unterstüzt\",\r\n  \"Alert_Security_Instance_HTTP\": \"Aus Sicherheitsgründen, akzeptiert Papillon keine Instanzen die noch das HTTP Protokoll verwenden. Wir empfehlen den/die Schulleiter/-in zu informieren sodass die Instanz aktualisiert und ihre Sicherheit bewahrt werden kann.\",\r\n  \"Alert_NoDemo\": \"Papillon ist nicht für Demoinstanzen gemacht, bitte nutze eine andere Instanz.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon kann keine Informationen von dieser PRONOTE Instanz abrufen. Ist sie noch gültig?\",\r\n  \"Alert_No_Pos\": \"Standort konnte nicht abgerufen werden\",\r\n  \"Alert_Connexion_Fail\": \"Verbindung fehlgeschlagen\",\r\n  \"Feature_Limited\": \"Limitierte Funktionen\",\r\n  \"Feature_Soon\": \"Kommt bald!\",\r\n  \"Feature_Soon_Notification\": \"Wir arbeiten hart daran, Ihnen diese Funktionalität in einem zukünftigen Update anzubieten.\",\r\n  \"Feature_Add_Card\": \"Füge eine neue Karte vom Profiltab, aufrufbar in der Navigationsleiste, hinzu\",\r\n  \"Webview_Wait\": \"Bitte warten...\",\r\n  \"Profile_QRCards\": \"QR-Code und Karten\",\r\n  \"Settings_Cards_Banner_Title\": \"Karten\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Kantine, Zugriff\",\r\n  \"Settings_Cards_Banner_Description\": \"Füge deine Mensa- und Transportkarten hinzu um von überall mit deinem handy auf sie zugreifen zu können\",\r\n  \"Settings_Cards_None_Title\": \"Keine Karten\",\r\n  \"Settings_Cards_Add_Button\": \"Hinzufügen\",\r\n  \"Settings_Cards_None_Description\": \"Füge eine hinzu um auf deinen Mensastand zugreifen zu können, deinen QR-Code zu scannen und mehr\",\r\n  \"Settings_Subjects_None_Title\": \"Keine Fächer\",\r\n  \"Settings_Subjects_None_Description\": \"Füge eine hinzu um auf deinen Mensastand zugreifen zu können, deinen QR-Code zu scannen und mehr\",\r\n  \"Settings_Donator\": \"Spender\",\r\n  \"Settings_Donator_Description\": \"Liste der Spender ansehen\",\r\n  \"Settings_App_Version\": \"App Version\",\r\n  \"Profile_Cards_Scan_Orientation\": \"Richte den QR-Code auf den Terminal-Scanner\",\r\n  \"Profile_Cards_No_Reservation\": \"keine Reservierung\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"es sieht aus als könntest du heute keine Reservierung machen.\",\r\n  \"Profile_Cards_History\": \"Verlauf\",\r\n  \"Magic_Important\": \"Könnte wichtig sein\",\r\n  \"OnBoarding_Step\": \"Stufe \",\r\n  \"OnBoarding_Step_Of\": \"Auf \",\r\n  \"Consent_Advanced_Title\": \"Ich möchte papillon helfen\",\r\n  \"Consent_Advanced_Description\": \"Wir erfassen detailliertere Informationen zu Ihrer Nutzung.\",\r\n  \"Consent_Required_Title\": \"Nur das nötige\",\r\n  \"Consent_Required_Description\": \"Im Grunde, wissen ob jemand papillon benutzt hat, ob es gut lief mit dem Service denn er benutzt hat.\",\r\n  \"Consent_None_Title\": \"Nichts\",\r\n  \"Consent_None_Description\": \"Wir werden nicht Mal wissen, dass du existiert.\",\r\n  \"Consent_Title\": \"Du und papillon\",\r\n  \"Consent_Intro1\": \"Um Papillon beim Wachstum zu unterstützen, können Sie einige nützliche Informationen weitergeben\",\r\n  \"Consent_PrivacyPolicy\": \"Im Zweifelsfall, lesen Sie bitte unsere Datenschutzrichtlinie\",\r\n  \"Consent_Refuse\": \"Ablehnen\",\r\n  \"Consent_Accept\": \"Akzeptieren\",\r\n  \"Consent_ChangeMind\": \"Sie können ihre meine jederzeit ändern in den Einstellungen der App.\",\r\n  \"Consent_Arg1\": \"Dient nur, um die App zu verbessern\",\r\n  \"Consent_Arg2\": \"Anonym & ohne Bezug zu Ihrer Identität\",\r\n  \"Consent_Arg3\": \"Wir haben keinen Zugriff auf Ihr Konto\",\r\n  \"Changelog_Title\": \"Patch Notizen\",\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Liefertermin\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Fächer\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Nicht fertiggestellt\",\r\n  \"Tasks_ThisWeek\": \"Diese Woche\",\r\n  \"Task_Undone\": \"Nicht beendet\",\r\n  \"Task_Done\": \"Beendet\",\r\n  \"Modal_Wallpaper_Title\": \"Hintergrund anpassen\",\r\n  \"Modal_Profile_Title\": \"Profil anpassen\",\r\n  \"Modal_Task_Status\": \"Stand der Hausaufgabe\",\r\n  \"Modal_Task_Description\": \"Beschreibung der Aufgabe\",\r\n  \"Modal_Task_Attachments\": \"Anhänge\",\r\n  \"Today\": \"Heute\",\r\n  \"Yesterday\": \"Gestern\",\r\n  \"Tomorrow\": \"Morgen\"\r\n}"
  },
  {
    "path": "locales/el.json",
    "content": "{\r\n  \"Global_Back\": \"Πίσω\",\r\n  \"Global_DatePrefix\": \"στις\",\r\n\r\n  \"Tab_Home\": \"Αρχική\",\r\n  \"Tab_Calendar\": \"Πρόγραμμα\",\r\n  \"Tab_Tasks\": \"Εργασίες\",\r\n  \"Tab_Grades\": \"Βαθμοί\",\r\n  \"Tab_Profile\": \"Προφίλ\",\r\n  \"Tab_Custom_Profile\": \"Επεξεργασία προφίλ\",\r\n  \"Button_Change_ProfilePicture\": \"Αλλαγή φωτογραφίας προφίλ\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Λήψη φωτογραφίας\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Από τη βιβλιοθήκη\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Ανάκτηση από το σχολείο\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Διαγραφή φωτογραφίας\",\r\n  \"Tab_Page\": \"Σελίδα\",\r\n  \"Tab_Settings\": \"Ρυθμίσεις\",\r\n  \"Tab_News\": \"Νέα\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Η εφαρμογή για τη διαχείριση της σχολικής σου ζωής\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Σύνδεσε τις σχολικές σου εφαρμογές για να έχεις πρόσβαση σε βαθμούς, μαθήματα, εργασίες και πολλά άλλα στο περιβάλλον του Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Ξεκίνα\",\r\n  \"ONBOARDING_HELP_BTN\": \"Χρειάζεσαι βοήθεια;\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Πανεπιστημιακή υπηρεσία\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Υπηρεσία εστίασης\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Επίλεξε τη σχολική σου υπηρεσία\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Επίλεξε την υπηρεσία εστίασης\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Επίλεξε την πανεπιστημιακή σου υπηρεσία\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Πώς θέλεις να συνδεθείς;\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Χρήση της τοποθεσίας μου\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Αναζήτηση πόλης\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Έχω QR-Code\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Έχω ένα URL σύνδεσης\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Επίλεξε το σχολείο σου\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Πληκτρολόγησε το όνομα της πόλης σου και επίλεξε σχολείο\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Συνδέσου όπως συνήθως\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Συνδέσου στον λογαριασμό σου\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Επίλεξε τον διακομιστή του λογαριασμού\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Εισάγετε τον 4ψήφιο κωδικό που μόλις δημιουργήσατε στο PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Σύνδεση σε\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Σάρωσε το QR-Code του σχολείου σου για να συνδεθείς.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Επικύρωση QR-Code\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Αυτό μπορεί να πάρει μερικά λεπτά...\",\r\n  \"ONBOARDING_URL\": \"Εισάγετε τη διεύθυνση URL του σχολείου σου\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL του δικού σου PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Πριν τελειώσεις\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Επίλεξε ένα\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"χρώμα θέματος\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Εισάγετε τον κωδικό PIN του PRONOTE σου\",\r\n  \"Onboarding_Load_Webview_Description\": \"Φορτώνουμε την ιστοσελίδα του σχολείου σου\",\r\n  \"INPUT_PIN\": \"Κωδικός PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Αναζήτηση υπηρεσίας...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Σύνδεση σε εξέλιξη...\",\r\n\r\n  \"WAITING\": \"Σε αναμονή\",\r\n  \"IZLY_SMS_SEND\": \"Μόλις έλαβες έναν σύνδεσμο για σύνδεση, κάνε κλικ σε αυτόν και ακολούθησε τα βήματα.\",\r\n  \"STEP\": \"Βήμα\",\r\n  \"STEP_OUTOF\": \"από\",\r\n  \"INPUT_USERNAME\": \"Όνομα χρήστη\",\r\n  \"INPUT_MAIL\": \"Διεύθυνση e-mail\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-mail ή όνομα χρήστη\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Τηλέφωνο ή e-mail\",\r\n  \"INPUT_PASSWORD\": \"Κωδικός πρόσβασης\",\r\n  \"INPUT_PASSWORD_CODE\": \"Κωδικός πρόσβασης\",\r\n  \"INPUT_ETABID\": \"Αναγνωριστικό σχολείου\",\r\n  \"LOGIN_BTN\": \"Σύνδεση\",\r\n  \"CONFIRM_BTN\": \"Επιβεβαίωση\",\r\n  \"CANCEL_BTN\": \"Ακύρωση\",\r\n\r\n  \"Tab_New_Event\": \"Νέο συμβάν\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Διαχείριση iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Διαχείριση των URL iCal σου\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Προσθήκη URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Διαχείριση {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Προσθήκη ή διαγραφή URL iCal για συγχρονισμό με το ημερολόγιό σου.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Λείπει ο τίτλος\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Δώσε ένα όνομα σε αυτό το URL iCal για να το προσθέσεις.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Δεν έχει προστεθεί κανένα URL iCal\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Αυτή η καρτέλα είναι υπό κατασκευή.\",\r\n  \"TabUnderConstruction_Details\": \"Επίστρεψε αργότερα για ενημερώσεις.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Λειτουργία Προγραμματιστή\",\r\n  \"TabDevModeNotice_Details\": \"Πλήρες περιβάλλον δοκιμών για προγραμματιστές.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Τεχνικές λεπτομέρειες\",\r\n\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Αξιολόγηση\",\r\n  \"Edited_Course\": \"Τροποποιημένο μάθημα\",\r\n  \"Canceled_Course\": \"Ακυρωμένο μάθημα\",\r\n  \"No_Course_Room\": \"Άγνωστη αίθουσα\",\r\n  \"Event_DeleteEvent\": \"Διαγραφή συμβάντος\",\r\n  \"Event_Confirm_DeleteEvent\": \"Είσαι σίγουρος ότι θέλεις να διαγράψεις αυτό το συμβάν;\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Μεσημεριανό διάλειμμα\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Καλή όρεξη!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Μιαμ!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Πρωινό διάλειμμα\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Ώρα για ύπνο!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Πρωινό γεύμα\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Απογευματινό διάλειμμα\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Ώρα για διάλειμμα!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Ώρα για σνακ!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Βραδινό διάλειμμα\",\r\n  \"Course_Separator_Night_Alt_1\": \"Ώρα για ύπνο!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Είναι νύχτα!\",\r\n\r\n  \"Context_Delete\": \"Διαγραφή\",\r\n  \"Context_Cancel\": \"Ακύρωση\",\r\n  \"Context_Edit\": \"Επεξεργασία\",\r\n  \"Context_Add\": \"Προσθήκη\",\r\n\r\n  \"Form_Title\": \"Τίτλος\",\r\n  \"Form_Location\": \"Τοποθεσία\",\r\n  \"Form_Organizer\": \"Διοργανωτής\",\r\n  \"Form_Start\": \"Έναρξη\",\r\n  \"Form_End\": \"Λήξη\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Είσαι σίγουρος ότι θέλεις να διαγράψεις αυτό το συμβάν;\",\r\n\r\n  \"Home_Welcome_Name\": \"Γεια σου, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Εμφάνιση περισσότερων\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"διαθέσιμα\",\r\n  \"Home_Chats_Plurial\": \"συνομιλίες\",\r\n  \"Home_Chats_Singular\": \"συνομιλία\",\r\n  \"Home_See_All_Tasks\": \"Δες όλες τις εργασίες\",\r\n  \"Home_Welcome\": \"Καλημέρα!\",\r\n  \"Home_Planned_None\": \"Δεν έχεις άλλα προγραμματισμένα μαθήματα για σήμερα\",\r\n  \"Home_Planned_One\": \"Έχεις ένα μάθημα ακόμα σήμερα\",\r\n  \"Home_Planned_Number\": \"Έχεις {{number}} μαθήματα ακόμα σήμερα\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Επόμενα μαθήματα\",\r\n  \"Home_Widget_NewGrades\": \"Νέοι βαθμοί\",\r\n  \"Home_Widget_NewHomeworks\": \"Εργασίες για υλοποίηση\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Κανένα επόμενο μάθημα\",\r\n  \"Home_Widget_NoCourses_Description\": \"Δεν υπάρχουν μαθήματα προγραμματισμένα για σήμερα.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Κάρτες\",\r\n  \"Home_Cards_Button_Description_None\": \"Καμία κάρτα\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Μία κάρτα\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} κάρτες\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Μηνύματα\",\r\n  \"Home_Chats_Button_Description_None\": \"Κανένα μήνυμα\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Ένα μήνυμα\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} μηνύματα\",\r\n\r\n  \"Home_Attendance_Title\": \"Απουσίες\",\r\n  \"Home_Attendance_Button_Description_None\": \"Καμία απουσία\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Μία απουσία\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} απουσίες\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Μενού\",\r\n  \"Home_Menu_Button_Description\": \"Μενού της ημέρας\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Δεν βρέθηκε κανένα συμβάν\",\r\n  \"Tab_Calendar_Empty_Description\": \"Πρόσθεσε ένα συμβάν ή συγχρόνισε το ημερολόγιό σου για να ξεκινήσεις.\",\r\n\r\n  \"Modal_Course_Title\": \"Το μάθημά μου\",\r\n  \"Modal_Course_StartsIn\": \"Ξεκινά σε\",\r\n  \"Modal_Course_StartedAgo\": \"Τελείωσε πριν από\",\r\n  \"Modal_Course_Ongoing\": \"Ξεκίνησε εδώ και\",\r\n  \"Modal_Course_Group\": \"Ομάδα\",\r\n  \"Modal_Course_Group_Full\": \"Τμήμα\",\r\n\r\n  \"Modal_Course_Details\": \"Λεπτομέρειες μαθήματος\",\r\n  \"Modal_Course_Teacher\": \"Καθηγητής\",\r\n  \"Modal_Course_Room\": \"Αίθουσα\",\r\n  \"Modal_Course_Duration\": \"Διάρκεια\",\r\n\r\n  \"Modal_Course_Time\": \"Ώρες μαθήματος\",\r\n  \"Modal_Course_Start\": \"Έναρξη\",\r\n  \"Modal_Course_End\": \"Λήξη\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Αναζήτηση εργασιών\",\r\n  \"Tasks_LeftHomeworks_Title\": \"εργασίες απομένουν\",\r\n  \"Tasks_LeftHomeworks_Time\": \"αυτή την εβδομάδα\",\r\n  \"Tasks_Done_AllTasks\": \"Όλες οι εργασίες\",\r\n  \"Tasks_Done_CompletedTasks\": \"έχουν ολοκληρωθεί\",\r\n  \"Tasks_Nav_Left\": \"Ακόμα {{count}} εργασία/ες\",\r\n  \"Tasks_Nav_One\": \"Μία μόνο εργασία απομένει\",\r\n  \"Tasks_Nav_Completed\": \"Όλα ολοκληρώθηκαν!\",\r\n  \"Tasks_Week\": \"Εβδομάδα\",\r\n  \"Tasks_NoTasks_Title\": \"Καμία εργασία\",\r\n  \"Tasks_NoTasks_Description\": \"Δεν υπάρχουν προγραμματισμένες εργασίες για αυτή την εβδομάδα. Ξεκουράσου!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"για την εβδομάδα {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Καμία εργασία\",\r\n  \"Task_Start\": \"Προς υλοποίηση\",\r\n  \"Task_Complete\": \"Ολοκληρώθηκε\",\r\n  \"Task_Sorting_Title\": \"Ταξινόμηση κατά\",\r\n  \"Task_OnlyShowUndone\": \"Ολοκληρωμένες εργασίες\",\r\n  \"Task_Show_Title\": \"Εμφάνιση\",\r\n  \"Settings_General\": \"Γενικά\",\r\n\r\n  \"Latest_Grades\": \"Νέοι βαθμοί\",\r\n  \"Grades_Search_Placeholder\": \"Αναζήτηση βαθμού ή μαθήματος\",\r\n\r\n  \"Grades_Avg_Methods\": \"Μέθοδοι υπολογισμού\",\r\n  \"Grades_Avg_All_Title\": \"Γενικός μέσος όρος\",\r\n  \"Grades_Avg_All_Short\": \"Γεν. Μ.Ο.\",\r\n  \"Grades_Avg_All_Pond\": \"Σταθμισμένος μέσος όρος\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Σταθμ. Μ.Ο.\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Υπολογίζει τον σταθμισμένο μέσο όρο όλων των βαθμών\",\r\n  \"Grades_Avg_Subject_Title\": \"Μέσος όρος μαθημάτων\",\r\n  \"Grades_Avg_Subject_Short\": \"Μ.Ο. μαθημάτων\",\r\n  \"Grades_Avg_Subject_Description\": \"Υπολογίζει τον σταθμισμένο μέσο όρο των μέσων όρων των μαθημάτων\",\r\n  \"Grades_Avg_Median_Title\": \"Διάμεσος\",\r\n  \"Grades_Avg_Median_Short\": \"Διάμεσος\",\r\n\r\n  \"Grades_Avg_More\": \"Μάθε περισσότερα\",\r\n  \"Grades_Avg_KnowMore\": \"Μάθε περισσότερα\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Κατανόησε τις μεθόδους υπολογισμού του γενικού μέσου όρου\",\r\n\r\n  \"Grades_SubjectInfo\": \"Πληροφορίες μαθήματος\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} βαθμός/οί\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Μέσος όρος μαθητή\",\r\n  \"SubjectInfo_Stats_Header\": \"Στατιστικά\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Μέσος όρος τάξης\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Γενικός μέσος όρος της τάξης\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Μέγιστος μέσος όρος\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Καλύτερος μέσος όρος της ομάδας\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Ελάχιστος μέσος όρος\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Χαμηλότερος μέσος όρος της ομάδας\",\r\n\r\n  \"Grades_Semester\": \"Εξάμηνο\",\r\n  \"Grades_Trimester\": \"Τρίμηνο\",\r\n  \"Grades_OutPeriod\": \"Εκτός περιόδου\",\r\n  \"Grades_Year\": \"Έτος\",\r\n  \"Grades_MockExamBac\": \"Προσομοίωση εξετάσεων\",\r\n  \"Grades_MockExamBrevet\": \"Προσομοίωση Γυμνασίου\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Όλα τα μαθήματα\",\r\n  \"Grades_Method_Weighted\": \"Συντελεστής βαρύτητας\",\r\n\r\n  \"Grades_Sort\": \"Ταξινόμηση\",\r\n  \"Grades_Sorting_Alphabetical\": \"Αλφαβητικά\",\r\n  \"Grades_Sorting_Averages\": \"Μέσοι όροι\",\r\n  \"Grades_Sorting_Date\": \"Ημερομηνία\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Ταξινόμηση κατά\",\r\n  \"Grades_Menu_AverageBy\": \"Μέσος όρος κατά\",\r\n  \"NoAverage\": \"Κανένας μέσος όρος\",\r\n\r\n  \"Grades_Empty_Title\": \"Κανένας βαθμός\",\r\n  \"Grades_Empty_Description\": \"Δεν έχεις βαθμολογηθεί ακόμα για αυτή την περίοδο.\",\r\n\r\n  \"Grade_NoDescription\": \"Εργασία στο μάθημα {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Μαθήματα\",\r\n  \"Grades_Tab_Latest\": \"Νέοι βαθμοί\",\r\n\r\n  \"Profile_Attendance_Title\": \"Παρουσίες\",\r\n  \"Profile_Attendance_Denominator_Single\": \"απουσία\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"απουσίες\",\r\n\r\n  \"Profile_Discussions_Title\": \"Συνομιλίες\",\r\n  \"Profile_Discussions_Denominator_Single\": \"μη αναγνωσμένο\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"μη αναγνωσμένα\",\r\n\r\n  \"Profile_News_Title\": \"Νέα\",\r\n  \"Profile_News_Denominator_Single\": \"νέο\",\r\n  \"Profile_News_Denominator_Plural\": \"νέα\",\r\n  \"Profile_News_Open\": \"Άνοιγμα\",\r\n  \"Profile_News_Loading_Title\": \"Φόρτωση νέων...\",\r\n  \"Profile_News_Author_Unknown\": \"Άγνωστος συντάκτης\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-Code και κάρτες\",\r\n\r\n  \"Modal_Grades_Title\": \"Λεπτομέρειες βαθμού\",\r\n  \"Modal_Grades_BestGrade\": \"Καλύτερος βαθμός ομάδας\",\r\n\r\n  \"Grades_Details_Title\": \"Λεπτομέρειες\",\r\n  \"Grades_NormalizedGrade_Title\": \"Αναγωγή βαθμού στο 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Τιμή βαθμού μετατραπημένη σε κλίμακα 20\",\r\n  \"Grades_HighestGrade_Title\": \"Υψηλότερος βαθμός\",\r\n  \"Grades_HighestGrade_Description\": \"Μέγιστος βαθμός που επιτεύχθηκε στην ομάδα\",\r\n  \"Grades_LowestGrade_Title\": \"Χαμηλότερος βαθμός\",\r\n  \"Grades_LowestGrade_Description\": \"Ελάχιστος βαθμός που επιτεύχθηκε στην ομάδα\",\r\n  \"Grades_Influence_Title\": \"Επιρροή\",\r\n  \"Grades_Avg_Group_Title\": \"Μέσος όρος ομάδας\",\r\n  \"Grades_Coefficient\": \"Συντελεστής\",\r\n  \"Grades_Avg_Group_Short\": \"Μ.Ο. ομάδας\",\r\n  \"Grades_Tab_Rank\": \"Κατάταξη\",\r\n  \"Grades_Tab_Rank_Description\": \"Θέση στην ομάδα\",\r\n\r\n  \"News_Search_Placeholder\": \"Αναζήτηση νέων\",\r\n  \"News_Empty_Title\": \"Κανένα νέο\",\r\n  \"News_Empty_Description\": \"Δεν βρέθηκαν νέα στο σχολείο σου.\",\r\n  \"News_Search_NoResults\": \"Δεν βρέθηκαν νέα\",\r\n  \"News_Search_NoResults_Description\": \"Δεν βρέθηκαν νέα για την αναζήτησή σου.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Ένα απαλό και κομψό θέμα\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Ανάγνωση\",\r\n  \"News_Theme_Reading_Description\": \"Ένα θέμα σχεδιασμένο για ανάγνωση\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Ώρες που χάθηκαν\",\r\n  \"Attendance_Hours_Unjustified\": \"Αδικαιολόγητες ώρες\",\r\n  \"Attendance_Missing\": \"Απουσίες\",\r\n  \"Attendance_Delays\": \"Καθυστερήσεις\",\r\n  \"Attendance_NoReason\": \"Χωρίς αιτιολογία\",\r\n  \"Attendance_NoEvent_Title\": \"Κανένα συμβάν\",\r\n  \"Attendance_NoEvent_Description\": \"Δεν καταγράφηκαν απουσίες ή καθυστερήσεις για αυτή την περίοδο.\",\r\n\r\n  \"Settings_Account_Title\": \"Ο λογαριασμός μου\",\r\n  \"Settings_Account_Description\": \"Ο λογαριασμός μου\",\r\n  \"Settings_Services_Title\": \"Συνδεδεμένοι λογαριασμοί\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Τελευταίος λογαριασμός που χρησιμοποιήθηκε\",\r\n  \"Settings_Notifications_Title\": \"Ειδοποιήσεις\",\r\n  \"Settings_Notifications_Description\": \"Ειδοποιήσεις, συχνότητα...\",\r\n  \"Settings_Subjects_Title\": \"Μαθήματα\",\r\n  \"Settings_Subjects_Description\": \"Όνομα, χρώμα, γραμματοσειρά...\",\r\n  \"Settings_Personalization_Title\": \"Εξατομίκευση\",\r\n  \"Settings_Personalization_Description\": \"Θέματα, χρώματα...\",\r\n  \"Settings_Cards_Title\": \"Κάρτες\",\r\n  \"Settings_Cards_Description\": \"Κυλικείο, πρόσβαση...\",\r\n  \"Settings_Accessibility_Title\": \"Προσβασιμότητα\",\r\n  \"Settings_Accessibility_Description\": \"Εμφάνιση, ήχος...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Έξυπνες λειτουργίες\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Λειτουργίες AI\",\r\n  \"Settings_MagicPlus_Enable\": \"Ενεργοποίηση Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Βελτιστοποιεί αυτόματα την οργάνωση των εργασιών σου για βελτίωση της παραγωγικότητας\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Πλήρως τοπικό μοντέλο, κανένα δεδομένο δεν μεταφέρεται εκτός της συσκευής σου\",\r\n  \"Settings_Donate_Title\": \"Δωρεά\",\r\n  \"Settings_Donate_Description\": \"Υποστήριξε το έργο\",\r\n  \"Settings_Telemetry_Title\": \"Τηλεμετρία και ιδιωτικότητα\",\r\n  \"Settings_Telemetry_Description\": \"Διαχείριση συλλεγόμενων δεδομένων\",\r\n  \"Settings_About_Title\": \"Σχετικά\",\r\n  \"Settings_About_Description\": \"Έκδοση\",\r\n  \"Settings_Logout_Title\": \"Αποσύνδεση\",\r\n  \"Settings_Logout_Description\": \"Διαγραφή αυτού του λογαριασμού από το Papillon\",\r\n  \"Settings_Language_Title\": \"Γλώσσα\",\r\n  \"Settings_Language_Description\": \"Αλλαγή γλώσσας\",\r\n  \"Settings_Tabs_Title\": \"Καρτέλες\",\r\n  \"Settings_Tabs_Description\": \"Απόκρυψη καρτελών από το μενού\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Εξατομίκευση\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Θέματα, μαθήματα...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Εξατομίκευση μαθημάτων\",\r\n  \"Settings_Personalization_Accent\": \"Χρώμα έμφασης\",\r\n  \"Settings_Personalization_Accent_Description\": \"Το χρώμα που επιλέγεις εδώ θα εφαρμόζεται στην αρχική σελίδα του Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Θέμα\",\r\n  \"Settings_Personalization_Icon_Title\": \"Αλλαγή εικονιδίου\",\r\n  \"Settings_Personalization_Icon_Description\": \"Εξατομίκευση του εικονιδίου της εφαρμογής\",\r\n  \"Settings_Personalization_Subject_Title\": \"Εξατομίκευση μαθημάτων\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Μαθήματα\",\r\n  \"Settings_Personalization_Subject_Description\": \"Εικονίδια, χρώματα\",\r\n  \"Settings_About_Papillion_Behind\": \"Πίσω από το Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Το Papillon συντηρείται από 100% εθελοντές μαθητές\",\r\n  \"Settings_About_Discord\": \"Διακομιστής Discord\",\r\n  \"Settings_About_Discord_Description\": \"Συνδέσου στον διακομιστή Discord\",\r\n  \"Settings_About_Crowdin\": \"Έργο Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Βοήθησε στη μετάφραση του Papillon\",\r\n  \"Settings_About_Github\": \"Έργο GitHub\",\r\n  \"Settings_About_Github_Description\": \"Συνεισέφερε στο έργο στο GitHub\",\r\n  \"Settings_About_Issue\": \"Αναφορά σφάλματος\",\r\n  \"Settings_About_Issue_Description\": \"Ανάφερε ένα σφάλμα που συνάντησες\",\r\n  \"Settings_About_Dependency_Version\": \"Έκδοση εξαρτήσεων\",\r\n\r\n  \"Alert_No_Technical\": \"Δεν υπάρχουν διαθέσιμες τεχνικές πληροφορίες.\",\r\n  \"Alert_Auth_Error\": \"Σφάλμα ελέγχου ταυτότητας\",\r\n  \"Alert_Auth_Bad_Creds\": \"Τα διαπιστευτήρια που εισήγαγες είναι λανθασμένα ή προσπαθείς να συνδεθείς με λογαριασμό γονέα. Αυτός ο τύπος λογαριασμού δεν υποστηρίζεται ακόμη από το Papillon.\",\r\n  \"Alert_Not_Supported\": \"Η υπηρεσία δεν υποστηρίζεται\",\r\n  \"Alert_Security_Instance_HTTP\": \"Για λόγους ασφαλείας, το Papillon δεν δέχεται υπηρεσίες που χρησιμοποιούν ακόμα το πρωτόκολλο HTTP. Σας συνιστούμε να ενημερώσετε τη διεύθυνση του σχολείου ώστε να προχωρήσει στην ενημέρωση της υπηρεσίας.\",\r\n  \"Alert_NoDemo\": \"Το Papillon δεν έχει σχεδιαστεί για να λειτουργεί με δοκιμαστικές υπηρεσίες (demo), παρακαλούμε χρησιμοποίησε μια πραγματική υπηρεσία.\",\r\n  \"Alert_Invalid_Instance\": \"Το Papillon δεν μπορεί να λάβει πληροφορίες από αυτή την υπηρεσία PRONOTE, είναι ακόμα έγκυρη;\",\r\n  \"Alert_No_Pos\": \"Αδυναμία ανάκτησης τοποθεσίας\",\r\n  \"Alert_Connexion_Fail\": \"Αδύνατη η σύνδεση\",\r\n\r\n  \"Feature_Limited\": \"Περιορισμένες λειτουργίες\",\r\n  \"Feature_Soon\": \"Έρχεται σύντομα!\",\r\n  \"Feature_Soon_Notification\": \"Εργαζόμαστε σκληρά για να σας προσφέρουμε αυτή τη λειτουργία σε μελλοντική ενημέρωση.\",\r\n  \"Feature_Add_Card\": \"Πρόσθεσε μια νέα κάρτα από την καρτέλα Προφίλ που βρίσκεται στη γραμμή πλοήγησης\",\r\n\r\n  \"Webview_Wait\": \"Λίγη υπομονή...\",\r\n\r\n  \"Profile_QRCards\": \"QR-Code και κάρτες\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} κάρτα(/ες)\",\r\n  \"Profile_Cards_Loading_History\": \"Φόρτωση ιστορικού συναλλαγών\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Αυτό μπορεί να πάρει λίγο χρόνο...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Κάρτες\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Κυλικείο, πρόσβαση\",\r\n  \"Settings_Cards_Banner_Description\": \"Πρόσθεσε τις κάρτες κυλικείου και μεταφορών σου για να τις έχεις παντού από το κινητό σου μέσω του Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Καμία κάρτα\",\r\n  \"Settings_Cards_Add_Button\": \"Προσθήκη\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Πρόσθεσε μία για να βλέπεις το υπόλοιπο του κυλικείου, να σκανάρεις το QR-Code σου και άλλα\",\r\n  \"Settings_Subjects_None_Title\": \"Κανένα μάθημα\",\r\n  \"Settings_Subjects_None_Description\": \"Περιηγήσου στις διάφορες καρτέλες της εφαρμογής για να μπορέσεις να εξατομικεύσεις τα μαθήματα.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Επαναφορά\",\r\n  \"Settings_Subjects_Reset_Message\": \"Θέλετε πραγματικά να επαναφέρετε όλα τα μαθήματα;\",\r\n  \"Settings_Subjects_Reset_Button\": \"Επαναφορά\",\r\n\r\n  \"Settings_Donator\": \"Δωρητές\",\r\n  \"Settings_Donator_Description\": \"Δες τη λίστα των δωρητών\",\r\n  \"Settings_App_Version\": \"Έκδοση εφαρμογής\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Στρέψτε το QR-Code προς τον σαρωτή του μηχανήματος\",\r\n  \"Profile_Cards_No_Reservation\": \"Καμία κράτηση\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Φαίνεται ότι δεν μπορείτε να κάνετε κράτηση αυτή την ημέρα.\",\r\n  \"Profile_Cards_History\": \"Ιστορικό\",\r\n  \"Magic_Important\": \"Ίσως σημαντικό\",\r\n\r\n  \"OnBoarding_Step\": \"Βήμα \",\r\n  \"OnBoarding_Step_Of\": \"από \",\r\n\r\n  \"Consent_Advanced_Title\": \"Θέλω να βοηθήσω το Papillon\",\r\n  \"Consent_Advanced_Description\": \"Συλλέγουμε πιο λεπτομερείς πληροφορίες σχετικά με τη χρήση σου.\",\r\n  \"Consent_Required_Title\": \"Μόνο τα απαραίτητα\",\r\n  \"Consent_Required_Description\": \"Εν συντομία, να γνωρίζουμε ότι κάποιος χρησιμοποίησε το Papillon, αν πήγαν όλα καλά και ποια υπηρεσία χρησιμοποιεί.\",\r\n  \"Consent_None_Title\": \"Τίποτα απολύτως\",\r\n  \"Consent_None_Description\": \"Δεν θα γνωρίζουμε καν την ύπαρξή σου.\",\r\n  \"Consent_Title\": \"Εσύ και το Papillon\",\r\n  \"Consent_Intro1\": \"Για να βοηθήσεις το Papillon να μεγαλώσει, μπορείς να επιλέξεις να μοιραστείς μερικές πληροφορίες χρήσης.\",\r\n  \"Consent_PrivacyPolicy\": \"Σε περίπτωση αμφιβολίας, συμβουλεύσου την πολιτική απορρήτου μας\",\r\n  \"Consent_Refuse\": \"Άρνηση\",\r\n  \"Consent_Accept\": \"Αποδοχή\",\r\n  \"Consent_ChangeMind\": \"Μπορείς να αλλάξεις γνώμη ανά πάσα στιγμή από τις ρυθμίσεις της εφαρμογής.\",\r\n  \"Consent_Arg1\": \"Χρησιμεύει αποκλειστικά στη βελτίωση της εφαρμογής\",\r\n  \"Consent_Arg2\": \"Ανώνυμο και χωρίς σύνδεση με την ταυτότητά σου\",\r\n  \"Consent_Arg3\": \"Δεν έχουμε πρόσβαση στους λογαριασμούς σου\",\r\n\r\n  \"Changelog_Title\": \"Σημειώσεις έκδοσης\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Ημερομηνία παράδοσης\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Μαθήματα\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Μη ολοκληρωμένο\",\r\n  \"Tasks_ThisWeek\": \"Αυτή την εβδομάδα\",\r\n\r\n  \"Task_Undone\": \"Μη ολοκληρωμένο\",\r\n  \"Task_Done\": \"Ολοκληρωμένο\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Εξατομίκευση φόντου\",\r\n  \"Modal_Profile_Title\": \"Εξατομίκευση προφίλ\",\r\n\r\n  \"Modal_Task_Status\": \"Κατάσταση εργασίας\",\r\n  \"Modal_Task_Description\": \"Περιγραφή εργασίας\",\r\n  \"Modal_Task_Attachments\": \"Συνημμένα\",\r\n\r\n  \"Today\": \"Σήμερα\",\r\n  \"Yesterday\": \"Χθες\",\r\n  \"Tomorrow\": \"Αύριο\"\r\n}"
  },
  {
    "path": "locales/en.json",
    "content": "{\n  \"Global_Back\": \"Back\",\n  \"Global_DatePrefix\": \"on\",\n  \"Global_Recommended\": \"Recommended\",\n  \"Tab_Home\": \"Home\",\n  \"Tab_Calendar\": \"Timetable\",\n  \"Tab_Tasks\": \"Tasks\",\n  \"Tab_Grades\": \"Grades\",\n  \"Tab_Profile\": \"Profile\",\n  \"Tab_Custom_Profile\": \"Edit my profile\",\n  \"Button_Change_ProfilePicture\": \"Change profile picture\",\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Take a photo\",\n  \"Button_Change_ProfilePicture_FromLibrary\": \"From photo library\",\n  \"Button_Change_ProfilePicture_FromService\": \"Retrieve from your ENT\",\n  \"Button_Change_ProfilePicture_Remove\": \"Remove picture\",\n  \"Tab_Page\": \"Page\",\n  \"Tab_Settings\": \"Settings\",\n  \"Tab_News\": \"News\",\n  \"ONBOARDING_MAIN_TITLE\": \"The app to manage your school life\",\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Connect your school apps to access your grades, classes, homework and more in the Papillon interface!\",\n  \"ONBOARDING_START_BTN\": \"Start\",\n  \"ONBOARDING_HELP_BTN\": \"Need help?\",\n  \"ONBOARDING_UNIVERSITY\": \"University service\",\n  \"ONBOARDING_RESTAURANTS\": \"Cafeteria service\",\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Select your school service\",\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Select your cafeteria service\",\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Select your university service\",\n  \"ONBOARDING_LOGIN_METHOD\": \"How would you like to log in?\",\n  \"ONBOARDING_METHOD_POSITION\": \"Use my location\",\n  \"ONBOARDING_METHOD_SEARCH\": \"Search a city\",\n  \"ONBOARDING_METHOD_QRCODE\": \"I have a QR-code\",\n  \"ONBOARDING_METHOD_LINK\": \"I have a login URL\",\n  \"ONBOARDING_SELECT_SCHOOL\": \"Choose your school\",\n  \"ONBOARDING_SEARCH_TITLE\": \"Enter your city name and choose your school\",\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Log in as usual\",\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Log in to your account\",\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Choose the host assigned to the account\",\n  \"ONBOARDING_PRONOTE_PIN\": \"Enter the 4-digit code you just created on PRONOTE\",\n  \"ONBOARDING_LOGIN_TO\": \"Log in to\",\n  \"ONBOARDING_SCAN_QRCODE\": \"Scan your school’s QR-code to log in.\",\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR-code validation\",\n  \"ONBOARDING_QRCODE_WAIT\": \"This may take a few moments...\",\n  \"ONBOARDING_URL\": \"Enter your school’s URL\",\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL of your PRONOTE instance\",\n  \"ONBOARDING_COLOR_TITLE\": \"Before finishing\",\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Choose a\",\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"theme color\",\n  \"ONBOARDING_LOGIN_PINCODE\": \"Enter your PRONOTE PIN code\",\n  \"Onboarding_Load_Webview_Description\": \"We are loading your school’s website\",\n  \"INPUT_PIN\": \"PIN code\",\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Search an instance...\",\n  \"ONBOARDING_LOADING_LOGIN\": \"Logging in...\",\n  \"ONBOARDING_LOADING\": \"Loading...\",\n  \"ONBOARDING_WELCOME_DESCRIPTION\": \"The ultimate app to manage your school life without compromise.\",\n  \"ONBOARDING_WELCOME_LOGIN_WITH\": \"Log in with\",\n  \"ONBOARDING_WELCOME_LEGAL\": \"By continuing, you accept the terms of use and the privacy policy.\",\n  \"ONBOARDING_AGE_TITLE\": \"Who are you?\",\n  \"ONBOARDING_AGE_DESCRIPTION\": \"Select your school level\",\n  \"ONBOARDING_LEVEL_MIDDLE_SCHOOL\": \"Middle school student\",\n  \"ONBOARDING_LEVEL_HIGH_SCHOOL\": \"High school student\",\n  \"ONBOARDING_LEVEL_UNIVERSITY\": \"University student\",\n  \"ONBOARDING_LEVEL_PARENT\": \"Parent\",\n  \"ONBOARDING_LEVEL_TEACHER\": \"Teacher\",\n  \"ONBOARDING_CONTINUE\": \"Continue\",\n  \"ONBOARDING_CANCEL\": \"Cancel\",\n  \"ONBOARDING_SERVICE_SELECTION_TITLE_UNIV\": \"Which service do you want to use?\",\n  \"ONBOARDING_SERVICE_SELECTION_TITLE_SCHOOL\": \"Which app do you usually use?\",\n  \"ONBOARDING_SERVICE_SELECTION_DESCRIPTION\": \"Select the service you usually use in your school.\",\n  \"ONBOARDING_UNSUPPORTED_TITLE\": \"Papillon is not available for you yet.\",\n  \"ONBOARDING_UNSUPPORTED_DESCRIPTION\": \"Parent and teacher accounts are not compatible with Papillon at the moment.\",\n  \"ONBOARDING_RESTAURANT_SELECTION_TITLE\": \"What is your cafeteria service?\",\n  \"ONBOARDING_HEADER_ABOUTYOU\": \"About you\",\n  \"ONBOARDING_HEADER_SCHOOLSERVICE\": \"School service\",\n  \"ONBOARDING_HEADER_LOCATION_SEARCH\": \"Location search\",\n  \"ONBOARDING_HEADER_SCHOOLS\": \"Schools\",\n  \"ONBOARDING_HEADER_SCHOOL_URL\": \"School URL\",\n  \"ONBOARDING_HEADER_ENT_LOGIN\": \"Login via ENT\",\n  \"ONBOARDING_HEADER_QRCODE_LOGIN\": \"Login via QR-code\",\n  \"ONBOARDING_HEADER_ED_LOGIN\": \"Login via ÉcoleDirecte\",\n  \"ONBOARDING_HEADER_SKOLENGO_LOGIN\": \"Login via Skolengo\",\n  \"ONBOARDING_HEADER_UNIVERSITY_LOGIN\": \"University login\",\n  \"ONBOARDING_PRONOTE_LOCATION_HELP\": \"To log in, we need your school location.\",\n  \"ONBOARDING_SEARCH_SCHOOL_PLACEHOLDER\": \"Search a school\",\n  \"ONBOARDING_SCHOOLS_SEARCHING\": \"Searching schools...\",\n  \"ONBOARDING_SCHOOLS_SEARCHING_HINT\": \"This may take a few seconds.\",\n  \"ONBOARDING_SCHOOLS_IN_CITY\": \"Schools in {{city}}\",\n  \"ONBOARDING_PRONOTE_LOGIN_QRCODE\": \"Log in with a QR code\",\n  \"ONBOARDING_PRONOTE_LOGIN_QRCODE_DESCRIPTION\": \"Use a QR code generated on PRONOTE\",\n  \"ONBOARDING_PRONOTE_LOGIN_URL\": \"Log in with a URL\",\n  \"ONBOARDING_LOGIN_TO_SERVICE\": \"Service login\",\n  \"ONBOARDING_YOUR_SCHOOL\": \"your school\",\n  \"ONBOARDING_UNKNOWN_SERVICE\": \"Unknown service\",\n  \"ONBOARDING_THIS_SERVICE\": \"this service\",\n  \"ONBOARDING_LOGIN_DISCLAIMER\": \"Papillon is not affiliated with {{service}}. Your password is not read or stored by Papillon.\",\n  \"ONBOARDING_LOGIN_HELP_ACTION\": \"Having login issues?\",\n  \"ONBOARDING_LOGIN_HELP_TITLE\": \"Login help\",\n  \"ONBOARDING_LOGIN_HELP_DESCRIPTION\": \"If you have trouble logging in, contact your service support or verify your credentials.\",\n  \"ONBOARDING_ERROR\": \"Error\",\n  \"ONBOARDING_REQUIRED_FIELDS\": \"Required fields\",\n  \"ONBOARDING_FILL_ALL_FIELDS\": \"Please fill in all fields\",\n  \"ONBOARDING_APPSCHO_INSTANCE_NOT_FOUND\": \"Instance not found\",\n  \"ONBOARDING_ALERT_LOGIN_ABORTED\": \"An error occurred during login, so it was cancelled.\",\n  \"ONBOARDING_ALERT_OAUTH_LOGIN_ABORTED\": \"An error occurred during OAuth login.\",\n  \"ONBOARDING_ALERT_BAD_CREDENTIALS_PRONOTE\": \"We couldn't log you in to your Pronote account. Check your username and password, then try again.\",\n  \"ONBOARDING_ALERT_BAD_CREDENTIALS_TURBOSELF\": \"We couldn't log you in to your TurboSelf account. Check your username and password, then try again.\",\n  \"ONBOARDING_ALERT_ALISE_LOGIN_ABORTED\": \"An error occurred while logging in to Alise, so it was cancelled.\",\n  \"ONBOARDING_SMS_SENT_TITLE\": \"SMS sent\",\n  \"ONBOARDING_IZLY_SMS_SENT_DESCRIPTION\": \"A verification SMS was sent to your phone number. Tap the link in that SMS to finish logging in.\",\n  \"ONBOARDING_ALERT_NO_POSITION_DESCRIPTION\": \"We couldn't get your location. Check that airplane mode is disabled and that the app has required permissions.\",\n  \"ONBOARDING_LANNION_ANDROID_TITLE\": \"Lannion is not available on Android yet\",\n  \"ONBOARDING_LANNION_ANDROID_DESCRIPTION\": \"We're working hard to make required libraries available on Android.\",\n  \"ONBOARDING_UNKNOWN_NAME\": \"Unknown\",\n  \"ONBOARDING_UNKNOWN_STUDENT\": \"Student\",\n  \"ONBOARDING_DEFAULT_USER_FIRSTNAME\": \"User\",\n  \"ONBOARDING_DOUBLE_AUTH\": \"Double authentication\",\n  \"ONBOARDING_OTHER_UNIVERSITIES\": \"Other universities\",\n  \"ONBOARDING_SERVICE_PRONOTE\": \"PRONOTE\",\n  \"ONBOARDING_SERVICE_ED\": \"ÉcoleDirecte\",\n  \"ONBOARDING_SERVICE_SKOLENGO\": \"Skolengo\",\n  \"ONBOARDING_SERVICE_LANNION\": \"IUT de Lannion\",\n  \"ONBOARDING_SERVICE_UNIV_LORRAINE\": \"University of Lorraine\",\n  \"ONBOARDING_SERVICE_UNIV_NIMES\": \"University of Nîmes\",\n  \"ONBOARDING_SERVICE_UNIV_UPHF\": \"Polytechnic University Hauts-de-France\",\n  \"ONBOARDING_SERVICE_TURBOSELF\": \"TurboSelf\",\n  \"ONBOARDING_SERVICE_ARD\": \"ARD\",\n  \"ONBOARDING_SERVICE_IZLY\": \"Izly\",\n  \"ONBOARDING_SERVICE_ALISE\": \"Alise\",\n  \"WAITING\": \"Waiting\",\n  \"IZLY_SMS_SEND\": \"You just received a login link, click on it and follow the steps.\",\n  \"STEP\": \"Step\",\n  \"STEP_OUTOF\": \"of\",\n  \"INPUT_USERNAME\": \"Username\",\n  \"INPUT_MAIL\": \"Email address\",\n  \"INPUT_MAIL_OR_USERNAME\": \"Email address or username\",\n  \"INPUT_PHONE_OR_MAIL\": \"Phone number or email address\",\n  \"INPUT_PASSWORD\": \"Password\",\n  \"INPUT_PASSWORD_CODE\": \"Access code\",\n  \"INPUT_ETABID\": \"Your school ID\",\n  \"LOGIN_BTN\": \"Log in\",\n  \"CONFIRM_BTN\": \"Confirm\",\n  \"CANCEL_BTN\": \"Cancel\",\n  \"Tab_New_Event\": \"New event\",\n  \"Tab_Calendar_Icals\": \"iCal management\",\n  \"Tab_Calendar_Icals_Description\": \"Manage your iCal URLs\",\n  \"Tab_Calendar_Icals_Add_URL\": \"Add an iCal URL\",\n  \"Tab_Calendar_Icals_Manage_Title\": \"Manage {{title}}\",\n  \"Tab_Calendar_Icals_Manage_Description\": \"Add or remove iCal URLs to sync with your calendar.\",\n  \"Tab_Calendar_Icals_Add_Title\": \"Missing title\",\n  \"Tab_Calendar_Icals_Add_Description\": \"Give a name to this iCal URL to add it.\",\n  \"Tab_Calendar_Icals_Empty\": \"No iCal URL added\",\n  \"TabUnderConstruction_Title\": \"This tab is under construction.\",\n  \"TabUnderConstruction_Details\": \"Please check back later for updates.\",\n  \"TabDevModeNotice_Title\": \"Development Mode\",\n  \"TabDevModeNotice_Details\": \"Full testing environment for developers.\",\n  \"Alert_TechnicalDetails\": \"Technical details\",\n  \"Online_Course\": \"Online\",\n  \"Evaluated_Course\": \"Evaluation\",\n  \"Edited_Course\": \"Edited class\",\n  \"Canceled_Course\": \"Canceled class\",\n  \"No_Course_Room\": \"Unknown room\",\n  \"Event_DeleteEvent\": \"Delete event\",\n  \"Event_Confirm_DeleteEvent\": \"Are you sure you want to delete this event?\",\n  \"Course_Separator_Lunch_Default\": \"Lunch break\",\n  \"Course_Separator_Lunch_Alt_1\": \"Enjoy your meal!\",\n  \"Course_Separator_Lunch_Alt_2\": \"Yummy!\",\n  \"Course_Separator_Morning_Default\": \"Morning break\",\n  \"Course_Separator_Morning_Alt_1\": \"Sleepy time!\",\n  \"Course_Separator_Morning_Alt_2\": \"Breakfast\",\n  \"Course_Separator_Evening_Default\": \"Afternoon break\",\n  \"Course_Separator_Evening_Alt_1\": \"Time for a break!\",\n  \"Course_Separator_Evening_Alt_2\": \"Snack time!\",\n  \"Course_Separator_Night_Default\": \"Evening break\",\n  \"Course_Separator_Night_Alt_1\": \"Good night !\",\n  \"Course_Separator_Night_Alt_2\": \"It's dark !\",\n  \"Context_Delete\": \"Delete\",\n  \"Context_Cancel\": \"Cancel\",\n  \"Context_Edit\": \"Edit\",\n  \"Context_Add\": \"Add\",\n  \"Form_Title\": \"Title\",\n  \"Form_Location\": \"Location\",\n  \"Form_Organizer\": \"Organizer\",\n  \"Form_Start\": \"Start\",\n  \"Form_End\": \"End\",\n  \"Confirm_DeleteEvent\": \"Are you sure you want to delete this event?\",\n  \"Home_Welcome_Name\": \"Hello, {{name}} {{emoji}}\",\n  \"Home_Display_More\": \"Display more\",\n  \"Home_Cards_Button_Description_Plurial\": \"available\",\n  \"Home_Chats_Plurial\": \"chats\",\n  \"Home_Chats_Singular\": \"chat\",\n  \"Home_See_All_Tasks\": \"View all tasks\",\n  \"Home_Welcome\": \"Hello!\",\n  \"Home_Planned_None\": \"You have no classes scheduled today\",\n  \"Home_Planned_One\": \"You have one class left today\",\n  \"Home_Planned_Number\": \"You have {{number}} classes scheduled today\",\n  \"Home_Widget_NextCourses\": \"Upcoming classes\",\n  \"Home_Widget_NewGrades\": \"New grades\",\n  \"Home_Widget_NewHomeworks\": \"To do\",\n  \"Home_Widget_NoCourses\": \"No upcoming classes\",\n  \"Home_Widget_NoCourses_Description\": \"There are no classes scheduled for today.\",\n  \"Home_Widget_Grades_Average\": \"Average\",\n  \"Home_Cards_Button_Title\": \"Cards\",\n  \"Home_Cards_Button_Description_None\": \"No cards\",\n  \"Home_Cards_Button_Description_Singular\": \"One card\",\n  \"Home_Cards_Button_Description_Number\": \"{{number}} cards\",\n  \"Home_Chats_Button_Title\": \"Messages\",\n  \"Home_Chats_Button_Description_None\": \"No messages\",\n  \"Home_Chats_Button_Description_Singular\": \"One message\",\n  \"Home_Chats_Button_Description_Number\": \"{{number}} messages\",\n  \"Home_Attendance_Title\": \"Absences\",\n  \"Home_Attendance_Button_Description_None\": \"No absences\",\n  \"Home_Attendance_Button_Description_Singular\": \"One absence\",\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} absences\",\n  \"Home_Menu_Button_Title\": \"Menu\",\n  \"Home_Menu_Button_Description\": \"Today's menu\",\n  \"Home_Release_Notes_Banner\": \"What's new in version {{version}}\",\n  \"Home_Release_Notes_Banner_Description\": \"Discover the latest improvements and bug fixes.\",\n  \"Tab_Calendar_Empty\": \"No events found\",\n  \"Tab_Calendar_Empty_Description\": \"Add an event or sync your calendar to get started.\",\n  \"Modal_Course_Title\": \"My class\",\n  \"Modal_Course_StartsIn\": \"Starts in\",\n  \"Modal_Course_StartedAgo\": \"Started ago\",\n  \"Modal_Course_Ongoing\": \"Ongoing\",\n  \"Modal_Course_Group\": \"Group\",\n  \"Modal_Course_Group_Full\": \"Class\",\n  \"Modal_Course_Details\": \"Class details\",\n  \"Modal_Course_Teacher\": \"Teacher\",\n  \"Modal_Course_Room\": \"Room\",\n  \"Modal_Course_Duration\": \"Duration\",\n  \"Modal_Course_Time\": \"Class hours\",\n  \"Modal_Course_Start\": \"Start\",\n  \"Modal_Course_End\": \"End\",\n  \"Tasks_Search_Placeholder\": \"Search tasks\",\n  \"Tasks_LeftHomeworks_Title\": \"tasks left\",\n  \"Tasks_LeftHomeworks_Time\": \"this week\",\n  \"Tasks_Done_AllTasks\": \"All tasks\",\n  \"Tasks_Done_CompletedTasks\": \"have been completed\",\n  \"Tasks_Nav_Left\": \"{{count}} task(s) left\",\n  \"Tasks_Nav_One\": \"Only one task left\",\n  \"Tasks_Nav_Completed\": \"Everything is done!\",\n  \"Tasks_Week\": \"Week\",\n  \"Tasks_NoTasks_Title\": \"No tasks\",\n  \"Tasks_NoTasks_Description\": \"There are no tasks planned for this week. Take the opportunity to rest!\",\n  \"Tasks_NoTasks_ForWeek\": \"for week {{week}}\",\n  \"Tasks_NoTasks_Nav\": \"No tasks\",\n  \"Task_Start\": \"To do\",\n  \"Task_Complete\": \"Completed\",\n  \"Task_Sorting_Title\": \"Sort by\",\n  \"Task_OnlyShowUndone\": \"Finished tasks\",\n  \"Task_Show_Title\": \"Display\",\n  \"Settings_General\": \"General\",\n  \"Latest_Grades\": \"New grades\",\n  \"Grades_Search_Placeholder\": \"Search for a grade, a subject\",\n  \"Grades_Avg_Methods\": \"Calculation Type\",\n  \"Grades_Avg_All_Title\": \"Overall average\",\n  \"Grades_Avg_All_Short\": \"Overall avg\",\n  \"Grades_Avg_All_Pond\": \"Weighted average\",\n  \"Grades_Avg_All_Pond_Short\": \"Weighted avg\",\n  \"Grades_Avg_All_Pond_Description\": \"Calculates the weighted average of every grade\",\n  \"Grades_Avg_Subject_Title\": \"Grades average\",\n  \"Grades_Avg_Subject_Short\": \"Grades avg\",\n  \"Grades_Avg_Subject_Description\": \"Calculates the weighted average of all subjects' averages\",\n  \"Grades_Avg_Median_Title\": \"Median\",\n  \"Grades_Avg_Median_Short\": \"Median\",\n  \"Grades_Avg_More\": \"Learn more\",\n  \"Grades_Avg_KnowMore\": \"Learn more\",\n  \"Grades_Avg_KnowMore_Description\": \"Understand how the overall average is calculated\",\n  \"Grades_SubjectInfo\": \"Subject information\",\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} grade(s)\",\n  \"SubjectInfo_StudentAverage_Label\": \"Student average\",\n  \"SubjectInfo_Stats_Header\": \"Statistics\",\n  \"SubjectInfo_ClassAverage_Label\": \"Class average\",\n  \"SubjectInfo_ClassAverage_Description\": \"Overall class average\",\n  \"SubjectInfo_MaxAverage_Label\": \"Maximum average\",\n  \"SubjectInfo_MaxAverage_Description\": \"Best average in the group\",\n  \"SubjectInfo_MinAverage_Label\": \"Minimum average\",\n  \"SubjectInfo_MinAverage_Description\": \"Lowest average in the group\",\n  \"Grades_Semester\": \"Semester\",\n  \"Grades_Trimester\": \"Trimester\",\n  \"Grades_OutPeriod\": \"Out of period\",\n  \"Grades_Year\": \"Year\",\n  \"Grades_MockExamBac\": \"Mock Baccalaureate\",\n  \"Grades_MockExamBrevet\": \"Mock Brevet\",\n  \"Grades_Method_AllGrades\": \"All subjects\",\n  \"Grades_Method_Weighted\": \"Weighting\",\n  \"Grades_Sort\": \"Sort\",\n  \"Grades_Sorting_Alphabetical\": \"Alphabetical\",\n  \"Grades_Sorting_Averages\": \"Averages\",\n  \"Grades_Sorting_Date\": \"Date\",\n  \"Grades_Menu_SortBy\": \"Sort by\",\n  \"Grades_Menu_AverageBy\": \"Average by\",\n  \"NoAverage\": \"No average\",\n  \"Grades_Empty_Title\": \"No grades\",\n  \"Grades_Empty_Description\": \"You haven’t been graded yet for this period.\",\n  \"Grade_NoDescription\": \"{{subject}} assignment\",\n  \"Grades_Tab_Subjects\": \"Subjects\",\n  \"Grades_Tab_Latest\": \"New grades\",\n  \"Profile_Attendance_Title\": \"Attendance\",\n  \"Profile_Attendance_Denominator_Single\": \"absence\",\n  \"Profile_Attendance_Denominator_Plural\": \"absences\",\n  \"Profile_Discussions_Title\": \"Discussions\",\n  \"Profile_Discussions_Denominator_Single\": \"unread\",\n  \"Profile_Discussions_Denominator_Plural\": \"unread\",\n  \"Profile_News_Title\": \"News\",\n  \"Profile_News_Denominator_Single\": \"new\",\n  \"Profile_News_Denominator_Plural\": \"news\",\n  \"Profile_News_Open\": \"Open\",\n  \"Profile_News_Loading_Title\": \"Loading news...\",\n  \"Profile_News_Author_Unknown\": \"Unknown author\",\n  \"Profile_Cards_Title\": \"QR-code and cards\",\n  \"Modal_Grades_Title\": \"Grade details\",\n  \"Modal_Grades_BestGrade\": \"Best grade of your group\",\n  \"Grades_Details_Title\": \"Details\",\n  \"Grades_NormalizedGrade_Title\": \"Grade normalized to 20\",\n  \"Grades_NormalizedGrade_Description\": \"Grade value converted to a scale of 20\",\n  \"Grades_HighestGrade_Title\": \"Highest grade\",\n  \"Grades_HighestGrade_Description\": \"Highest grade obtained in the group\",\n  \"Grades_LowestGrade_Title\": \"Lowest grade\",\n  \"Grades_LowestGrade_Description\": \"Lowest grade obtained in the group\",\n  \"Grades_Influence_Title\": \"Influence\",\n  \"Grades_Avg_Group_Title\": \"Group average\",\n  \"Grades_Coefficient\": \"Coefficient\",\n  \"Grades_Avg_Group_Short\": \"Group avg\",\n  \"Grades_Tab_Rank\": \"Rankings\",\n  \"Grades_Tab_Rank_Description\": \"Rank in the group\",\n  \"News_Search_Placeholder\": \"Search for news\",\n  \"News_Empty_Title\": \"No news\",\n  \"News_Empty_Description\": \"There is no news in your school.\",\n  \"News_Search_NoResults\": \"No news found\",\n  \"News_Search_NoResults_Description\": \"No news found for your search.\",\n  \"News_Theme_Papillon_Title\": \"Papillon\",\n  \"News_Theme_Papillon_Description\": \"A soft and elegant theme\",\n  \"News_Theme_Reading_Title\": \"Reading\",\n  \"News_Theme_Reading_Description\": \"A theme designed for reading\",\n  \"Attendance_Hours_Missed\": \"Hours missed\",\n  \"Attendance_Hours_Unjustified\": \"Unjustified hours\",\n  \"Attendance_Hours_Unjustified_Value\": \"{{duration}} unjustified\",\n  \"Attendance_Missing\": \"Absences\",\n  \"Attendance_Delays\": \"Delays\",\n  \"Attendance_NoReason\": \"No reason\",\n  \"Attendance_Duration_Minutes\": \"{{value}} min\",\n  \"Attendance_Duration_HoursMinutes_Detailed\": \"{{hours}} h {{minutes}} min\",\n  \"Attendance_Duration_HoursMinutes_Compact\": \"{{hours}}h{{minutes}}\",\n  \"Attendance_Unjustified_Description\": \"Remember to justify your absences and delays with your school office or institution.\",\n  \"Attendance_NoUnjustified_Title\": \"No unjustified hours\",\n  \"Attendance_NoUnjustified_Description\": \"Well done! Papillon did not find any unjustified hours for this period.\",\n  \"Attendance_InvalidPeriod\": \"Invalid period\",\n  \"Attendance_NoEvent_Title\": \"No event\",\n  \"Attendance_NoEvent_Description\": \"No absences or delays recorded for this period.\",\n  \"Settings_Account_Title\": \"My account\",\n  \"Settings_Account_Description\": \"My account\",\n  \"Settings_Services_Title\": \"Linked accounts\",\n  \"Settings_Services_Title_LastAccountUsed\": \"Last account used\",\n  \"Settings_Notifications_Title\": \"Notifications\",\n  \"Settings_Notifications_Description\": \"Alerts, frequency...\",\n  \"Settings_Subjects_Title\": \"Subjects\",\n  \"Settings_Subjects_Description\": \"Name, color, font...\",\n  \"Settings_Personalization_Title\": \"Personalization\",\n  \"Settings_Personalization_Description\": \"Themes, colors...\",\n  \"Settings_Cards_Title\": \"Cards\",\n  \"Settings_Cards_Description\": \"Cafeteria, access...\",\n  \"Settings_Accessibility_Title\": \"Accessibility\",\n  \"Settings_Accessibility_Description\": \"Display, sound...\",\n  \"Settings_MagicPlus_Title\": \"Magic+\",\n  \"Settings_MagicPlus_Description\": \"Smart features\",\n  \"Settings_MagicPlus_Description_Card\": \"AI features\",\n  \"Settings_MagicPlus_Enable\": \"Enable Magic+\",\n  \"Settings_MagicPlus_Description_Optimization\": \"Automatically optimize your task organization to improve your productivity\",\n  \"Settings_MagicPlus_ExplanationLocal\": \"Fully local model, no data is transferred outside your device\",\n  \"Settings_Donate_Title\": \"Donate\",\n  \"Settings_Donate_Description\": \"Support the project\",\n  \"Settings_Telemetry_Title\": \"Telemetry & privacy\",\n  \"Settings_Telemetry_Description\": \"Manage collected data\",\n  \"Settings_About_Title\": \"About\",\n  \"Settings_About_Description\": \"Version\",\n  \"Settings_Logout_Title\": \"Log out\",\n  \"Settings_Logout_Description\": \"Remove this account from Papillon\",\n  \"Settings_ReleaseNotes_Title\": \"Release notes\",\n  \"Settings_ReleaseNotes_Description\": \"See what's new in the latest version\",\n  \"Settings_Language_Title\": \"Language\",\n  \"Settings_Language_Description\": \"Change language\",\n  \"Settings_Personalization_Title_Card\": \"Personalization\",\n  \"Settings_Personalization_Subtitle_Card\": \"Themes, subject...\",\n  \"Settings_SubjectPersonalization_Title\": \"Customize subjects\",\n  \"Settings_Personalization_Accent\": \"Accent color\",\n  \"Settings_Personalization_Accent_Description\": \"The color you choose here will apply to Papillon’s home page.\",\n  \"Settings_Personalization_Theme\": \"Theme\",\n  \"Settings_Personalization_MaterialYou_Title\": \"Use Material You (Beta)\",\n  \"Settings_Personalization_MaterialYou_Description\": \"Use Android dynamic system colors.\",\n  \"Settings_Personalization_Icon_Title\": \"Change icon\",\n  \"Settings_Personalization_Icon_Description\": \"Customize the app icon\",\n  \"Settings_Personalization_Subject_Title\": \"Customize subjects\",\n  \"Settings_Personalization_Subject_Description\": \"Icons, colors\",\n  \"Settings_About_Papillion_Behind\": \"Behind Papillon\",\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon is maintained by 100% student volunteers\",\n  \"Settings_About_Discord\": \"Discord Server\",\n  \"Settings_About_Discord_Description\": \"Join the Discord server\",\n  \"Settings_About_Crowdin\": \"Project Crowdin\",\n  \"Settings_About_Crowdin_Description\": \"Help translate Papillon\",\n  \"Settings_About_Github\": \"Github Project\",\n  \"Settings_About_Github_Description\": \"Contribute to the project on GitHub\",\n  \"Settings_About_Issue\": \"Report a bug\",\n  \"Settings_About_Issue_Description\": \"Report a bug encountered\",\n  \"Settings_About_Dependency_Version\": \"Dependency Version\",\n  \"Settings_Preferences\": \"Features\",\n  \"Settings_More\": \"About\",\n  \"Settings_About\": \"You and Papillon\",\n  \"Alert_No_Technical\": \"No technical information available.\",\n  \"Alert_Auth_Error\": \"Authentication error\",\n  \"Alert_Auth_Bad_Creds\": \"The credentials you entered are incorrect or you are trying to log in with a parent account. This type of account is not yet supported by Papillon.\",\n  \"Alert_Not_Supported\": \"Instance not supported\",\n  \"Alert_Security_Instance_HTTP\": \"For security reasons, Papillon does not accept instances still using the HTTP protocol. We recommend informing the school principal so they can update this instance and preserve its security.\",\n  \"Alert_NoDemo\": \"Papillon is not meant to work with demo instances, please use another instance.\",\n  \"Alert_Invalid_Instance\": \"Papillon cannot retrieve information from this PRONOTE instance. Is it still valid?\",\n  \"Alert_No_Pos\": \"Unable to retrieve location\",\n  \"Alert_Connexion_Fail\": \"Connection failed\",\n  \"Feature_Limited\": \"Limited features\",\n  \"Feature_Soon\": \"Coming soon!\",\n  \"Feature_Soon_Notification\": \"We are working hard to offer you this functionality in a future update.\",\n  \"Feature_Add_Card\": \"Add a new card from the Profile tab accessible in the navigation bar\",\n  \"Webview_Wait\": \"Please wait...\",\n  \"Profile_QRCards\": \"QR-code and cards\",\n  \"Settings_Cards_Banner_Title\": \"Cards\",\n  \"Settings_Cantineen_Subtitle_Card\": \"Canteen, access\",\n  \"Settings_Cards_Banner_Description\": \"Add your cafeteria and transport cards to access them anywhere from your phone with Papillon\",\n  \"Settings_Cards_None_Title\": \"No cards\",\n  \"Settings_Cards_Add_Button\": \"Add\",\n  \"Settings_Cards_None_Description\": \"Add one to access your cafeteria balance, scan your QR code and more\",\n  \"Settings_Subjects_None_Title\": \"No subjects\",\n  \"Settings_Subjects_None_Description\": \"Add one to access your cafeteria balance, scan your QR code and more\",\n  \"Settings_Subjects_Reset_Title\": \"Reset\",\n  \"Settings_Subjects_Reset_Message\": \"Are you sure you want to reset all subjects?\",\n  \"Settings_Subjects_Reset_Button\": \"Reset\",\n  \"Settings_Donator\": \"Donors\",\n  \"Settings_Donator_Description\": \"View the list of donors\",\n  \"Settings_App_Version\": \"App version\",\n  \"Profile_Cards_Scan_Orientation\": \"Point the QR-code towards the terminal scanner\",\n  \"Profile_Cards_No_Reservation\": \"No reservation\",\n  \"Profile_Cards_No_Available_Reservation\": \"It looks like you can’t make a reservation today.\",\n  \"Profile_Cards_History\": \"History\",\n  \"Magic_Important\": \"May be important\",\n  \"OnBoarding_Step\": \"Step \",\n  \"OnBoarding_Step_Of\": \"of \",\n  \"Consent_Advanced_Title\": \"I want to help Papillon\",\n  \"Consent_Advanced_Description\": \"We collect more detailed information about your usage.\",\n  \"Consent_Required_Title\": \"Just the essentials\",\n  \"Consent_Required_Description\": \"We just know that someone used Papillon, and how it went.\",\n  \"Consent_None_Title\": \"Nothing at all\",\n  \"Consent_None_Description\": \"We won't even know you exist.\",\n  \"Consent_Title\": \"Papillon & you\",\n  \"Consent_Intro1\": \"To help Papillon grow, you can choose to share usage data.\",\n  \"Consent_PrivacyPolicy\": \"If in doubt, check our privacy policy\",\n  \"Consent_Refuse\": \"Refuse\",\n  \"Consent_Accept\": \"Accept\",\n  \"Consent_ChangeMind\": \"You can change your mind at any time from the app settings.\",\n  \"Consent_Arg1\": \"Only used to improve the app\",\n  \"Consent_Arg2\": \"Private and not linked to your ID\",\n  \"Consent_Arg3\": \"We have no access to your accounts\",\n  \"Changelog_Title\": \"Release notes\",\n  \"Tasks_Sorting_Methods_DueDate\": \"Due date\",\n  \"Tasks_Sorting_Methods_Subject\": \"Subjects\",\n  \"Tasks_Sorting_Methods_Done\": \"Undone\",\n  \"Tasks_ThisWeek\": \"This week\",\n  \"Task_Undone\": \"Undone\",\n  \"Task_Done\": \"Done\",\n  \"Modal_Wallpaper_Title\": \"Customize wallpaper\",\n  \"Modal_Wallpaper_Clear\": \"Clear wallpaper\",\n  \"Modal_Wallpaper_Downloads\": \"Downloads\",\n  \"Modal_Wallpaper_Downloads_Size\": \"Download size\",\n  \"Modal_Wallpaper_ClearDownloads\": \"Clear downloads\",\n  \"Modal_Profile_Title\": \"Customize profile\",\n  \"Modal_Task_Status\": \"Assignment status\",\n  \"Modal_Task_Description\": \"Assignment description\",\n  \"Modal_Task_Attachments\": \"Attachments\",\n  \"Today\": \"Today\",\n  \"Yesterday\": \"Yesterday\",\n  \"Tomorrow\": \"Tomorrow\",\n  \"Settings_Transport_Address_Not_Set\": \"Not set\",\n  \"Modal_Grades_OptionalGrade\": \"Optional grade\",\n  \"Modal_Grades_BonusGrade\": \"Bonus grade\",\n  \"Settings_Transport_Current_Position\": \"Current location\",\n  \"Settings_Transport_Banner_Title\": \"Transport\",\n  \"Settings_Transport_Banner_Description\": \"Turn this option on to see transport times in your schedule.\",\n  \"Settings_Transport_Address_Title\": \"Address\",\n  \"Settings_Transport_Address_Home_Title\": \"Home\",\n  \"Settings_Transport_Address_School_Title\": \"School\",\n  \"Settings_Transport_Address_Description\": \"This information will be sent to your default transport app. It will not be shared with any other third parties.\",\n  \"Settings_Transport_Default_Application_Title\": \"Default application\",\n  \"Settings_Transport_Title\": \"Transport\",\n  \"Settings_Transport_Description\": \"Transport app, addresses...\",\n  \"Transport_Error_Address_Not_Set_Title\": \"No address has been specified\",\n  \"Transport_Error_Address_Not_Set_Description\": \"Set up your email addresses in the preferences.\",\n  \"Transport_Error_Cant_Go_To_Current_Location_Title\": \"Unable to display this route\",\n  \"Transport_Error_Cant_Go_To_Current_Location_Description\": \"We can't display a route to your current location.\",\n  \"Transport_Leave_In\": \"Depart in\",\n  \"Transport_Leave_At\": \"Leave at\",\n  \"Transport_From\": \"From\",\n  \"Transport_Error_Location_Title\": \"We can't access your location\",\n  \"Transport_Error_Location_Description\": \"Make sure Papillon can see where you are.\",\n  \"Transport_Maps_App\": \"your transportation app\",\n  \"Transport_Open_In\": \"Open in\",\n  \"Settings_Transport_Search_Address_Placeholder\": \"Search for an address, a place, a stop…\",\n  \"Settings_Transport_Current_Position_Description\": \"Use your current location when you're in your calendar.\",\n  \"Settings_Transport_Place\": \"Addresses and places\",\n  \"Settings_Transport_Stops\": \"Stops and stations\",\n  \"Cancel\": \"Cancel\",\n  \"Transport_Error_Unknown_Service_Title\": \"Oops, that service no longer exists!\",\n  \"Transport_Error_Unknown_Service_Description\": \"The service you're trying to open is no longer available in Papillon. Try changing the service in the settings.\",\n  \"Transport_Error_Cant_Open_Deeplink_Title\": \"Unable to open the service\",\n  \"Transport_Error_Cant_Open_Deeplink_Description\": \"Make sure the app is installed on your device, then try again.\",\n  \"Settings_Transport_Localisation_Needed\": \"Papillon needs your location\",\n  \"Settings_Transport_Localisation_Needed_Description\": \"To use transport features, Papillon needs access to your location to provide accurate transit information.\",\n  \"Settings_Transport_Localisation_Request\": \"Enable location\",\n  \"Settings_Personalization_Emoji_Picker_Title\": \"Emoji selector\",\n  \"Settings_Personalization_Emoji_Picker_SetEmoji\": \"Select\",\n  \"Home_Add_Profile\": \"Ajouter un profil\",\n  \"Home_Edit_Profile\": \"Modifier mon profil\",\n  \"Modal_Soon\": \"Bientôt disponible\",\n  \"Modal_Task_Title\": \"Détail de la tâche\",\n  \"Profile_Cards_Loading_History\": \"Chargement de l\\\"historique des transactions\",\n  \"Profile_Cards_Loading_History_Description\": \"Cela peut prendre un moment...\",\n  \"Profile_QRCards_Subtitle\": \"{{count}} carte(s)\",\n  \"Settings_About_Contributors\": \"Contributeurs\",\n  \"Settings_About_Contributors_Description\": \"Voir les contributeurs GitHub\",\n  \"Settings_Accounts_Description\": \"Comptes, cantine...\",\n  \"Settings_Accounts_Title\": \"Comptes liés\",\n  \"Settings_Dev\": \"Développement\",\n  \"Settings_Personalization_Subject_Title_Card\": \"Matières\",\n  \"Settings_Tabs_Description\": \"Masquer des onglets du menu\",\n  \"Settings_Tabs_Title\": \"Onglets\"\n}\n"
  },
  {
    "path": "locales/es.json",
    "content": "{\r\n  \"Global_Back\": \"Volver\",\r\n  \"Global_DatePrefix\": \"él\",\r\n  \"Tab_Home\": \"Casa\",\r\n  \"Tab_Calendar\": \"Cursos\",\r\n  \"Tab_Tasks\": \"Tareas\",\r\n  \"Tab_Grades\": \"Notas\",\r\n  \"Tab_Profile\": \"Perfil\",\r\n  \"Tab_Custom_Profile\": \"Modificar mi perfil\",\r\n  \"Button_Change_ProfilePicture\": \"Cambiar la imagen de perfil\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Tomar foto\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Desde la galería\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Recuperar desde tu ENT\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Eliminar la foto\",\r\n  \"Tab_Page\": \"Página\",\r\n  \"Tab_Settings\": \"Configuración\",\r\n  \"Tab_News\": \"Noticias\",\r\n  \"ONBOARDING_MAIN_TITLE\": \"La aplicación para gestionar tu vida escolar\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"¡ Conecta tus aplicaciones escolares para acceder a tus notas, clases, tareas y mucho más en la interfaz de Papillon !\",\r\n  \"ONBOARDING_START_BTN\": \"Empezar\",\r\n  \"ONBOARDING_HELP_BTN\": \"¿Necesitas ayuda?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Servicio universitario\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Servicio de comedor\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Selecciona tu servicio escolar\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Selecciona tu servicio de comedor\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Selecciona tu servicio universitario\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"¿Cómo deseas conectarte?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Usar mi ubicación\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Buscar una ciudad\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Tengo un código QR\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Tengo una URL de conexión\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Elige tu institución\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Escribe el nombre de tu ciudad y elige tu institución\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Conéctate como lo haces habitualmente\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Conéctate a tu cuenta\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Elige el anfitrión asignado a la cuenta\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Indica el código de 4 dígitos que acabas de crear en PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Conexión a\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Escanea el código QR de tu institución para conectarte.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validación del código QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Esto puede tardar unos instantes...\",\r\n  \"ONBOARDING_URL\": \"Indica la dirección URL de tu institución\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL de tu instancia PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Antes de finalizar\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Elige una\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"color de tema\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Ingresa el código PIN de tu PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"Estamos cargando el sitio de tu institución\",\r\n  \"INPUT_PIN\": \"Código PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Buscar una instancia...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Conectando...\",\r\n  \"WAITING\": \"En espera\",\r\n  \"IZLY_SMS_SEND\": \"Acabas de recibir un enlace para conectarte, haz clic en él y sigue los pasos.\",\r\n  \"STEP\": \"Etapa\",\r\n  \"STEP_OUTOF\": \"de\",\r\n  \"INPUT_USERNAME\": \"Nombre de usuario\",\r\n  \"INPUT_MAIL\": \"Dirección de correo electrónico\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Dirección de correo electrónico o nombre de usuario\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Número de teléfono o dirección de correo electrónico\",\r\n  \"INPUT_PASSWORD\": \"Contraseña\",\r\n  \"INPUT_PASSWORD_CODE\": \"Código de acceso\",\r\n  \"INPUT_ETABID\": \"Identificador de tu institución\",\r\n  \"LOGIN_BTN\": \"Iniciar sesión\",\r\n  \"CONFIRM_BTN\": \"Confirmar\",\r\n  \"CANCEL_BTN\": \"Cancelar\",\r\n  \"Tab_New_Event\": \"Nuevo evento\",\r\n  \"Tab_Calendar_Icals\": \"Gestión de iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Gestionar tus URL iCal\",\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Agregar una URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Gestionar {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Agregar o eliminar URL iCal para sincronizar con tu calendario.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Título faltante\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Ponle un nombre a esta URL iCal para añadirla.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Ninguna URL iCal añadida\",\r\n  \"TabUnderConstruction_Title\": \"Esta pestaña está en construcción.\",\r\n  \"TabUnderConstruction_Details\": \"Vuelve más tarde para actualizaciones.\",\r\n  \"TabDevModeNotice_Title\": \"Modo Desarrollador\",\r\n  \"TabDevModeNotice_Details\": \"Entorno de prueba completo para desarrolladores.\",\r\n  \"Alert_TechnicalDetails\": \"Detalles técnicos\",\r\n  \"Online_Course\": \"En línea\",\r\n  \"Evaluated_Course\": \"Evaluación\",\r\n  \"Edited_Course\": \"Curso modificado\",\r\n  \"Canceled_Course\": \"Curso cancelado\",\r\n  \"No_Course_Room\": \"Sala desconocida\",\r\n  \"Event_DeleteEvent\": \"Eliminar el evento\",\r\n  \"Event_Confirm_DeleteEvent\": \"¿Estás seguro de que quieres eliminar este evento?\",\r\n  \"Course_Separator_Lunch_Default\": \"Receso del mediodía\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"¡Que aproveche!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"¡Ñam!\",\r\n  \"Course_Separator_Morning_Default\": \"Receso de la mañana\",\r\n  \"Course_Separator_Morning_Alt_1\": \"¡Hora de dormir!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Desayuno\",\r\n  \"Course_Separator_Evening_Default\": \"Receso de la tarde\",\r\n  \"Course_Separator_Evening_Alt_1\": \"¡Toca parar un rato!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"¡Hora de la merienda!\",\r\n  \"Course_Separator_Night_Default\": \"Receso de la noche\",\r\n  \"Course_Separator_Night_Alt_1\": \"¡Hora de dormir!\",\r\n  \"Course_Separator_Night_Alt_2\": \"¡Es de noche!\",\r\n  \"Context_Delete\": \"Eliminar\",\r\n  \"Context_Cancel\": \"Cancelar\",\r\n  \"Context_Edit\": \"Modificar\",\r\n  \"Context_Add\": \"Agregar\",\r\n  \"Form_Title\": \"Título\",\r\n  \"Form_Location\": \"Ubicación\",\r\n  \"Form_Organizer\": \"Organizador\",\r\n  \"Form_Start\": \"Inicio\",\r\n  \"Form_End\": \"Fin\",\r\n  \"Confirm_DeleteEvent\": \"¿Estás seguro de que quieres eliminar este evento?\",\r\n  \"Home_Welcome_Name\": \"¡Hola, {{name}}!\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"disponibles\",\r\n  \"Home_Chats_Plurial\": \"discusiones\",\r\n  \"Home_Chats_Singular\": \"discusión\",\r\n  \"Home_See_All_Tasks\": \"Ver todas las tareas\",\r\n  \"Home_Welcome\": \"¡Hola!\",\r\n  \"Home_Planned_None\": \"No tienes ningún curso pendiente hoy\",\r\n  \"Home_Planned_One\": \"Tienes un curso pendiente hoy\",\r\n  \"Home_Planned_Number\": \"Tienes {{number}} cursos pendientes hoy\",\r\n  \"Home_Widget_NextCourses\": \"Próximos cursos\",\r\n  \"Home_Widget_NewGrades\": \"Nuevas calificaciones\",\r\n  \"Home_Widget_NewHomeworks\": \"Tareas pendientes\",\r\n  \"Home_Widget_NoCourses\": \"No hay próximas clases\",\r\n  \"Home_Widget_NoCourses_Description\": \"No hay clases previstas para hoy.\",\r\n  \"Home_Cards_Button_Title\": \"Tarjetas\",\r\n  \"Home_Cards_Button_Description_None\": \"Ninguna tarjeta\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Una tarjeta\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} tarjetas\",\r\n  \"Home_Chats_Button_Title\": \"Mensajes\",\r\n  \"Home_Chats_Button_Description_None\": \"Ningún mensaje\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Un mensaje\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} mensajes\",\r\n  \"Home_Attendance_Title\": \"Ausencias\",\r\n  \"Home_Attendance_Button_Description_None\": \"Ninguna ausencia\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Una ausencia\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} ausencias\",\r\n  \"Home_Menu_Button_Title\": \"Menú\",\r\n  \"Home_Menu_Button_Description\": \"Menú del día\",\r\n  \"Tab_Calendar_Empty\": \"No se encontró ningún evento\",\r\n  \"Tab_Calendar_Empty_Description\": \"Agrega un evento o sincroniza tu calendario para comenzar.\",\r\n  \"Modal_Course_Title\": \"Mi curso\",\r\n  \"Modal_Course_StartsIn\": \"Comienza en\",\r\n  \"Modal_Course_StartedAgo\": \"Terminado hace\",\r\n  \"Modal_Course_Ongoing\": \"Comenzado desde\",\r\n  \"Modal_Course_Group\": \"Grupo\",\r\n  \"Modal_Course_Group_Full\": \"Clase\",\r\n  \"Modal_Course_Details\": \"Detalles del curso\",\r\n  \"Modal_Course_Teacher\": \"Profesor\",\r\n  \"Modal_Course_Room\": \"Sala\",\r\n  \"Modal_Course_Duration\": \"Duración\",\r\n  \"Modal_Course_Time\": \"Hora de la clase\",\r\n  \"Modal_Course_Start\": \"Inicio\",\r\n  \"Modal_Course_End\": \"Fin\",\r\n  \"Tasks_Search_Placeholder\": \"Buscar tareas\",\r\n  \"Tasks_LeftHomeworks_Title\": \"tareas restantes\",\r\n  \"Tasks_LeftHomeworks_Time\": \"esta semana\",\r\n  \"Tasks_Done_AllTasks\": \"Todas las tareas\",\r\n  \"Tasks_Done_CompletedTasks\": \"se han completado\",\r\n  \"Tasks_Nav_Left\": \"Quedan {{count}} tarea(s) por hacer\",\r\n  \"Tasks_Nav_One\": \"Solo queda una tarea por hacer\",\r\n  \"Tasks_Nav_Completed\": \"¡Todo está terminado!\",\r\n  \"Tasks_Week\": \"Semana\",\r\n  \"Tasks_NoTasks_Title\": \"Ninguna tarea\",\r\n  \"Tasks_NoTasks_Description\": \"No hay tareas programadas para esta semana. ¡Aprovéchalo para descansar!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"para la semana {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Ninguna tarea\",\r\n  \"Task_Start\": \"Por hacer\",\r\n  \"Task_Complete\": \"Terminado\",\r\n  \"Task_Sorting_Title\": \"Ordenar por\",\r\n  \"Task_OnlyShowUndone\": \"Mostrar solo las tareas no terminadas\",\r\n  \"Task_Show_Title\": \"Mostrar\",\r\n  \"Settings_General\": \"General\",\r\n  \"Latest_Grades\": \"Nuevas notas\",\r\n  \"Grades_Search_Placeholder\": \"Buscar una nota, una materia\",\r\n  \"Grades_Avg_Methods\": \"Métodos de cálculo\",\r\n  \"Grades_Avg_All_Title\": \"Promedio general\",\r\n  \"Grades_Avg_All_Short\": \"Promedio general\",\r\n  \"Grades_Avg_All_Pond\": \"Media ponderada\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Media ponderada\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Calcula la media ponderada de todas las notas\",\r\n  \"Grades_Avg_Subject_Title\": \"Promedio de las notas\",\r\n  \"Grades_Avg_Subject_Short\": \"Promedio de notas\",\r\n  \"Grades_Avg_Subject_Description\": \"Calcula la media ponderada de las medias de materias\",\r\n  \"Grades_Avg_Median_Title\": \"Mediana\",\r\n  \"Grades_Avg_Median_Short\": \"Mediana\",\r\n  \"Grades_Avg_More\": \"Más información\",\r\n  \"Grades_Avg_KnowMore\": \"Más información\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Entender como está calculada la media general\",\r\n  \"Grades_SubjectInfo\": \"Informaciones acerca de la materia\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} nota(s)\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Media del alumno\",\r\n  \"SubjectInfo_Stats_Header\": \"Estadísticas\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Media de la clase\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Media global de la clase\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Media máxima\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Mejor media del grupo\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Media mínima\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Media más baja del grupo\",\r\n  \"Grades_Semester\": \"Semestre\",\r\n  \"Grades_Trimester\": \"Trimestre\",\r\n  \"Grades_OutPeriod\": \"Fuera de período\",\r\n  \"Grades_Year\": \"Año\",\r\n  \"Grades_MockExamBac\": \"Bachillerato de prueba\",\r\n  \"Grades_MockExamBrevet\": \"Brevet de prueba\",\r\n  \"Grades_Method_AllGrades\": \"Todas las materias\",\r\n  \"Grades_Method_Weighted\": \"Ponderación\",\r\n  \"Grades_Sort\": \"Ordenar\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabético\",\r\n  \"Grades_Sorting_Averages\": \"Promedios\",\r\n  \"Grades_Sorting_Date\": \"Fecha\",\r\n  \"Grades_Menu_SortBy\": \"Ordenar por\",\r\n  \"Grades_Menu_AverageBy\": \"Promedio por\",\r\n  \"NoAverage\": \"Sin promedio\",\r\n  \"Grades_Empty_Title\": \"Sin nota\",\r\n  \"Grades_Empty_Description\": \"Aún no has sido calificado en este período.\",\r\n  \"Grade_NoDescription\": \"Tarea de {{subject}}\",\r\n  \"Grades_Tab_Subjects\": \"Materias\",\r\n  \"Grades_Tab_Latest\": \"Nuevas notas\",\r\n  \"Profile_Attendance_Title\": \"Asistencia\",\r\n  \"Profile_Attendance_Denominator_Single\": \"ausencia\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"ausencias\",\r\n  \"Profile_Discussions_Title\": \"Discusiones\",\r\n  \"Profile_Discussions_Denominator_Single\": \"no leído\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"no leídos\",\r\n  \"Profile_News_Title\": \"Noticias\",\r\n  \"Profile_News_Denominator_Single\": \"nuevo\",\r\n  \"Profile_News_Denominator_Plural\": \"nuevas\",\r\n  \"Profile_News_Open\": \"Abrir\",\r\n  \"Profile_News_Loading_Title\": \"Cargando noticias...\",\r\n  \"Profile_News_Author_Unknown\": \"Autor desconocido\",\r\n  \"Profile_Cards_Title\": \"Código QR y tarjetas\",\r\n  \"Modal_Grades_Title\": \"Detalle de la nota\",\r\n  \"Modal_Grades_BestGrade\": \"Mejor nota del grupo\",\r\n  \"Grades_Details_Title\": \"Detalles\",\r\n  \"Grades_NormalizedGrade_Title\": \"Nota normalizada sobre 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Valor de la nota convertido a una escala de 20\",\r\n  \"Grades_HighestGrade_Title\": \"Nota más alta\",\r\n  \"Grades_HighestGrade_Description\": \"Nota máxima obtenida en el grupo\",\r\n  \"Grades_LowestGrade_Title\": \"La nota más baja\",\r\n  \"Grades_LowestGrade_Description\": \"La nota mínima obtenida en el grupo\",\r\n  \"Grades_Influence_Title\": \"Influencia\",\r\n  \"Grades_Avg_Group_Title\": \"Promedio del grupo\",\r\n  \"Grades_Coefficient\": \"Coeficiente\",\r\n  \"Grades_Avg_Group_Short\": \"Promedio del grupo\",\r\n  \"Grades_Tab_Rank\": \"Ranking\",\r\n  \"Grades_Tab_Rank_Description\": \"Posición en el grupo\",\r\n  \"News_Search_Placeholder\": \"Buscar una noticia\",\r\n  \"News_Empty_Title\": \"Ninguna noticia\",\r\n  \"News_Empty_Description\": \"No se han encontrado noticias en su establecimiento.\",\r\n  \"News_Search_NoResults\": \"No se han encontrado noticias\",\r\n  \"News_Search_NoResults_Description\": \"No se ha encontrado ninguna noticia para su búsqueda.\",\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Un tema suave y elegante\",\r\n  \"News_Theme_Reading_Title\": \"Lectura\",\r\n  \"News_Theme_Reading_Description\": \"Un tema diseñado para la lectura\",\r\n  \"Attendance_Hours_Missed\": \"Horas perdidas\",\r\n  \"Attendance_Hours_Unjustified\": \"Horas no justificadas\",\r\n  \"Attendance_Missing\": \"Ausencias\",\r\n  \"Attendance_Delays\": \"Retrasos\",\r\n  \"Attendance_NoReason\": \"Sin motivo\",\r\n  \"Attendance_NoEvent_Title\": \"Ningún evento\",\r\n  \"Attendance_NoEvent_Description\": \"No hay ausencias ni retrasos registrados para este período.\",\r\n  \"Settings_Account_Title\": \"Mi cuenta\",\r\n  \"Settings_Account_Description\": \"Mi cuenta\",\r\n  \"Settings_Services_Title\": \"Cuentas vinculadas\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Última cuenta utilizada\",\r\n  \"Settings_Notifications_Title\": \"Notificaciones\",\r\n  \"Settings_Notifications_Description\": \"Alertas, frecuencia...\",\r\n  \"Settings_Subjects_Title\": \"Materias\",\r\n  \"Settings_Subjects_Description\": \"Nombre, color, fuente...\",\r\n  \"Settings_Personalization_Title\": \"Personalización\",\r\n  \"Settings_Personalization_Description\": \"Temas, colores...\",\r\n  \"Settings_Cards_Title\": \"Tarjetas\",\r\n  \"Settings_Cards_Description\": \"Comedor, acceso...\",\r\n  \"Settings_Accessibility_Title\": \"Accesibilidad\",\r\n  \"Settings_Accessibility_Description\": \"Pantalla, sonido...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Funciones inteligentes\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Funciones de I.A\",\r\n  \"Settings_MagicPlus_Enable\": \"Activar Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimiza automáticamente la organización de tus tareas para mejorar tu productividad\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Modelo totalmente local, ningún dato se transfiere fuera de tu dispositivo\",\r\n  \"Settings_Donate_Title\": \"Hacer una donación\",\r\n  \"Settings_Donate_Description\": \"Apoyar el proyecto\",\r\n  \"Settings_Telemetry_Title\": \"Telemetría y vida privada\",\r\n  \"Settings_Telemetry_Description\": \"Gestionar los datos recopilados\",\r\n  \"Settings_About_Title\": \"Acerca de\",\r\n  \"Settings_About_Description\": \"Versión\",\r\n  \"Settings_Logout_Title\": \"Desconectarse\",\r\n  \"Settings_Logout_Description\": \"Eliminar esta cuenta de Mariposa\",\r\n  \"Settings_Language_Title\": \"Idioma\",\r\n  \"Settings_Language_Description\": \"Cambiar el idioma\",\r\n  \"Settings_Personalization_Title_Card\": \"Personalización\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Temas, materias...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Personalizar las materias\",\r\n  \"Settings_Personalization_Accent\": \"Color de acentuación\",\r\n  \"Settings_Personalization_Accent_Description\": \"El color que elijas aquí se aplicará en la página de inicio de Mariposa.\",\r\n  \"Settings_Personalization_Theme\": \"Tema\",\r\n  \"Settings_Personalization_Icon_Title\": \"Cambiar el ícono\",\r\n  \"Settings_Personalization_Icon_Description\": \"Personaliza el ícono de la aplicación\",\r\n  \"Settings_Personalization_Subject_Title\": \"Personalizar las materias\",\r\n  \"Settings_Personalization_Subject_Description\": \"Íconos, colores\",\r\n  \"Settings_About_Papillion_Behind\": \"Detrás de Mariposa\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon es mantenido por estudiantes 100% voluntarios\",\r\n  \"Settings_About_Discord\": \"Servidor Discord\",\r\n  \"Settings_About_Discord_Description\": \"Unirse al servidor Discord\",\r\n  \"Settings_About_Crowdin\": \"Proyecto Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Ayuda a traducir Papillon\",\r\n  \"Settings_About_Github\": \"Proyecto GitHub\",\r\n  \"Settings_About_Github_Description\": \"Contribuir al proyecto en GitHub\",\r\n  \"Settings_About_Issue\": \"Reportar un error\",\r\n  \"Settings_About_Issue_Description\": \"Reportar un error encontrado\",\r\n  \"Settings_About_Dependency_Version\": \"Versión de las dependencias\",\r\n\r\n  \"Alert_No_Technical\": \"Ninguna información técnica disponible.\",\r\n  \"Alert_Auth_Error\": \"Error de autenticación\",\r\n  \"Alert_Auth_Bad_Creds\": \"Las credenciales que has introducido son incorrectas o intentas conectarte con una cuenta de padre. Este tipo de cuenta aún no es compatible con Papillon.\",\r\n  \"Alert_Not_Supported\": \"Instancia no compatible\",\r\n  \"Alert_Security_Instance_HTTP\": \"Por razones de seguridad, Papillon no acepta instancias que aún utilizan el protocolo HTTP. Te recomendamos informar al director del centro educativo para que actualice esta instancia y así preserve su seguridad.\",\r\n  \"Alert_NoDemo\": \"Papillon no está hecho para funcionar con instancias de demostración, por favor, utiliza otra instancia.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon no puede obtener la información de esta instancia de PRONOTE, ¿es todavía válida?\",\r\n  \"Alert_No_Pos\": \"Imposible recuperar la posición\",\r\n  \"Alert_Connexion_Fail\": \"Conexión imposible\",\r\n  \"Feature_Limited\": \"Funcionalidades limitadas\",\r\n  \"Feature_Soon\": \"¡Llega pronto!\",\r\n  \"Feature_Soon_Notification\": \"Estamos trabajando duro para ofrecerte esta funcionalidad en una futura actualización.\",\r\n  \"Feature_Add_Card\": \"Agrega una nueva tarjeta desde la pestaña Perfil accesible en la barra de navegación\",\r\n  \"Webview_Wait\": \"Un poco de paciencia...\",\r\n  \"Profile_QRCards\": \"Código QR y tarjetas\",\r\n  \"Settings_Cards_Banner_Title\": \"Tarjetas\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Comedor, acceso\",\r\n  \"Settings_Cards_Banner_Description\": \"Agrega tus tarjetas de comedor y transporte para acceder a ellas desde cualquier lugar desde tu teléfono en Mariposa\",\r\n  \"Settings_Cards_None_Title\": \"Ninguna tarjeta\",\r\n  \"Settings_Cards_Add_Button\": \"Añadir\",\r\n  \"Settings_Cards_None_Description\": \"Agrega una para acceder a tu saldo de comedor, escanear tu Código QR y más\",\r\n  \"Settings_Subjects_None_Title\": \"Ninguna materia\",\r\n  \"Settings_Subjects_None_Description\": \"Recorre las diferentes pestañas de la aplicación para poder personalizar las materias.\",\r\n  \"Settings_Donator\": \"Donantes\",\r\n  \"Settings_Donator_Description\": \"Ver la lista de donantes\",\r\n  \"Settings_App_Version\": \"Versión de la aplicación\",\r\n  \"Profile_Cards_Scan_Orientation\": \"Orienta el Código QR hacia el escáner del terminal\",\r\n  \"Profile_Cards_No_Reservation\": \"Ninguna reserva\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Parece que no puedes reservar hoy.\",\r\n  \"Profile_Cards_History\": \"Historial\",\r\n  \"Magic_Important\": \"Quizás importante\",\r\n  \"OnBoarding_Step\": \"Etapa \",\r\n  \"OnBoarding_Step_Of\": \"sobre \",\r\n  \"Consent_Advanced_Title\": \"Quiero ayudar\",\r\n  \"Consent_Advanced_Description\": \"Recopilamos más información detallada sobre tu uso.\",\r\n  \"Consent_Required_Title\": \"Solo lo esencial\",\r\n  \"Consent_Required_Description\": \"En resumen, saber que alguien ha utilizado Mariposa, si ha ido bien y qué servicio utiliza.\",\r\n  \"Consent_None_Title\": \"Nada en absoluto\",\r\n  \"Consent_None_Description\": \"Ni siquiera estaremos al tanto de tu existencia.\",\r\n  \"Consent_Title\": \"Tú y Papillon\",\r\n  \"Consent_Intro1\": \"Para ayudar a que Mariposa crezca, puedes elegir compartir alguna información de uso.\",\r\n  \"Consent_PrivacyPolicy\": \"En caso de duda, consulta nuestra política de privacidad\",\r\n  \"Consent_Refuse\": \"Rechazar\",\r\n  \"Consent_Accept\": \"Aceptar\",\r\n  \"Consent_ChangeMind\": \"Puedes cambiar de opinión en cualquier momento desde la configuración de la app.\",\r\n  \"Consent_Arg1\": \"Sirve únicamente para mejorar la aplicación\",\r\n  \"Consent_Arg2\": \"Anónimo y sin vínculo con tu identidad\",\r\n  \"Consent_Arg3\": \"No tenemos acceso a tus cuentas\",\r\n  \"Changelog_Title\": \"Notas de actualización\",\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Fecha de entrega\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Materias\",\r\n  \"Tasks_Sorting_Methods_Done\": \"No terminado\",\r\n  \"Tasks_ThisWeek\": \"Esta semana\",\r\n  \"Task_Undone\": \"No terminado\",\r\n  \"Task_Done\": \"Terminado\",\r\n  \"Modal_Wallpaper_Title\": \"Personalizar el fondo de pantalla\",\r\n  \"Modal_Profile_Title\": \"Personalizar el perfil\",\r\n  \"Modal_Task_Status\": \"Estado de la tarea\",\r\n  \"Modal_Task_Description\": \"Descripción de la tarea\",\r\n  \"Modal_Task_Attachments\": \"Archivos adjuntos\",\r\n  \"Today\": \"Hoy\",\r\n  \"Yesterday\": \"Ayer\",\r\n  \"Tomorrow\": \"Mañana\"\r\n}\r\n"
  },
  {
    "path": "locales/et.json",
    "content": "{\n  \"Global_Back\": \"Tagasi\",\n  \"Global_DatePrefix\": \" \",\n\n  \"Tab_Home\": \"Kodu\",\n  \"Tab_Calendar\": \"Tunniplaan\",\n  \"Tab_Tasks\": \"Ülesanded\",\n  \"Tab_Grades\": \"Hinded\",\n  \"Tab_Profile\": \"Profiil\",\n  \"Tab_Custom_Profile\": \"Muuda profiili\",\n  \"Button_Change_ProfilePicture\": \"Muuda profiilipilti\",\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Tee pilt\",\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Vali galeriist\",\n  \"Button_Change_ProfilePicture_FromService\": \"Hangi koolisüsteemist\",\n  \"Button_Change_ProfilePicture_Remove\": \"Eemalda pilt\",\n  \"Tab_Page\": \"Leht\",\n  \"Tab_Settings\": \"Seaded\",\n  \"Tab_News\": \"Uudised\",\n\n  \"ONBOARDING_MAIN_TITLE\": \"Äpp sinu koolielu haldamiseks\",\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Ühenda oma kooli infosüsteemid, et näha hindeid, tunniplaani, kodutöid ja muud otse Papilloni liideses!\",\n  \"ONBOARDING_START_BTN\": \"Alusta\",\n  \"ONBOARDING_HELP_BTN\": \"Vajad abi?\",\n  \"ONBOARDING_UNIVERSITY\": \"Ülikooli teenus\",\n  \"ONBOARDING_RESTAURANTS\": \"Toitlustusteenus\",\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Vali oma kooliteenus\",\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Vali oma toitlustusteenus\",\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Vali oma ülikooliteenus\",\n  \"ONBOARDING_LOGIN_METHOD\": \"Kuidas soovid sisse logida?\",\n  \"ONBOARDING_METHOD_POSITION\": \"Kasuta minu asukohta\",\n  \"ONBOARDING_METHOD_SEARCH\": \"Otsi linna\",\n  \"ONBOARDING_METHOD_QRCODE\": \"Mul on QR-kood\",\n  \"ONBOARDING_METHOD_LINK\": \"Mul on sisselogimise URL\",\n  \"ONBOARDING_SELECT_SCHOOL\": \"Vali oma õppeasutus\",\n  \"ONBOARDING_SEARCH_TITLE\": \"Sisesta linna nimi ja vali oma kool\",\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Logi sisse nagu tavaliselt\",\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Logi oma kontole sisse\",\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Vali kontole määratud server\",\n  \"ONBOARDING_PRONOTE_PIN\": \"Sisesta 4-kohaline kood, mille just PRONOTE-is lõid\",\n  \"ONBOARDING_LOGIN_TO\": \"Sisselogimine teenusesse\",\n  \"ONBOARDING_SCAN_QRCODE\": \"Skaneeri oma kooli QR-kood, et ühenduda.\",\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR-koodi kinnitamine\",\n  \"ONBOARDING_QRCODE_WAIT\": \"See võib võtta hetke...\",\n  \"ONBOARDING_URL\": \"Sisesta oma kooli URL-aadress\",\n  \"ONBOARDING_URL_PLACEHOLDER\": \"Sinu PRONOTE-i instantsi URL\",\n  \"ONBOARDING_COLOR_TITLE\": \"Enne lõpetamist\",\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Vali\",\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"teemavärv\",\n  \"ONBOARDING_LOGIN_PINCODE\": \"Sisesta oma PRONOTE-i PIN-kood\",\n  \"Onboarding_Load_Webview_Description\": \"Laadime sinu kooli veebilehte\",\n  \"INPUT_PIN\": \"PIN-kood\",\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Otsi serverit...\",\n  \"ONBOARDING_LOADING_LOGIN\": \"Sisselogimine...\",\n\n  \"WAITING\": \"Ootel\",\n  \"IZLY_SMS_SEND\": \"Said just sisselogimise lingi, klõpsa sellel ja järgi juhiseid.\",\n  \"STEP\": \"Samm\",\n  \"STEP_OUTOF\": \"/\",\n  \"INPUT_USERNAME\": \"Kasutajanimi\",\n  \"INPUT_MAIL\": \"E-posti aadress\",\n  \"INPUT_MAIL_OR_USERNAME\": \"E-post või kasutajanimi\",\n  \"INPUT_PHONE_OR_MAIL\": \"Telefoninumber või e-post\",\n  \"INPUT_PASSWORD\": \"Parool\",\n  \"INPUT_PASSWORD_CODE\": \"Pääsukood\",\n  \"INPUT_ETABID\": \"Sinu kooli identifikaator\",\n  \"LOGIN_BTN\": \"Logi sisse\",\n  \"CONFIRM_BTN\": \"Kinnita\",\n  \"CANCEL_BTN\": \"Tühista\",\n\n  \"Tab_New_Event\": \"Uus sündmus\",\n\n  \"Tab_Calendar_Icals\": \"iCal-i haldamine\",\n  \"Tab_Calendar_Icals_Description\": \"Halda oma iCal-i URL-e\",\n\n  \"Tab_Calendar_Icals_Add_URL\": \"Lisa iCal-i URL\",\n  \"Tab_Calendar_Icals_Manage_Title\": \"Halda: {{title}}\",\n  \"Tab_Calendar_Icals_Manage_Description\": \"Lisa või eemalda iCal-i URL-e, mida oma tunniplaaniga sünroonida.\",\n  \"Tab_Calendar_Icals_Add_Title\": \"Pealkiri puudub\",\n  \"Tab_Calendar_Icals_Add_Description\": \"Pane sellele iCal-i URL-ile nimi, et see lisada.\",\n  \"Tab_Calendar_Icals_Empty\": \"iCal-i URL-e pole lisatud\",\n\n  \"TabUnderConstruction_Title\": \"See vahekaart on arendamisel.\",\n  \"TabUnderConstruction_Details\": \"Tule hiljem tagasi, et näha uuendusi.\",\n\n  \"TabDevModeNotice_Title\": \"Arendajarežiim\",\n  \"TabDevModeNotice_Details\": \"Täielik testkeskkond arendajatele.\",\n\n  \"Alert_TechnicalDetails\": \"Tehnilised andmed\",\n\n  \"Online_Course\": \"Veebis\",\n  \"Evaluated_Course\": \"Kontrolltöö / Hindamine\",\n  \"Edited_Course\": \"Muudetud tund\",\n  \"Canceled_Course\": \"Tund jääb ära\",\n  \"No_Course_Room\": \"Ruum teadmata\",\n  \"Event_DeleteEvent\": \"Kustuta sündmus\",\n  \"Event_Confirm_DeleteEvent\": \"Kas oled kindel, et soovid selle sündmuse kustutada?\",\n\n  \"Course_Separator_Lunch_Default\": \"Lõunapaus\",\n  \"Course_Separator_Lunch_Alt_1\": \"Head isu!\",\n  \"Course_Separator_Lunch_Alt_2\": \"Nämma!\",\n\n  \"Course_Separator_Morning_Default\": \"Hommikupaus\",\n  \"Course_Separator_Morning_Alt_1\": \"Aeg magada!\",\n  \"Course_Separator_Morning_Alt_2\": \"Hommikusöök\",\n\n  \"Course_Separator_Evening_Default\": \"Pärastlõunane paus\",\n  \"Course_Separator_Evening_Alt_1\": \"Väike paus kulub ära!\",\n  \"Course_Separator_Evening_Alt_2\": \"Ooteaeg!\",\n\n  \"Course_Separator_Night_Default\": \"Õhtupaus\",\n  \"Course_Separator_Night_Alt_1\": \"Aeg magada!\",\n  \"Course_Separator_Night_Alt_2\": \"Kätte on jõudnud öö!\",\n\n  \"Context_Delete\": \"Kustuta\",\n  \"Context_Cancel\": \"Tühista\",\n  \"Context_Edit\": \"Muuda\",\n  \"Context_Add\": \"Lisa\",\n\n  \"Form_Title\": \"Pealkiri\",\n  \"Form_Location\": \"Asukoht\",\n  \"Form_Organizer\": \"Korraldaja\",\n  \"Form_Start\": \"Algus\",\n  \"Form_End\": \"Lõpp\",\n\n  \"Confirm_DeleteEvent\": \"Kas oled kindel, et soovid selle sündmuse kustutada?\",\n\n  \"Home_Welcome_Name\": \"Tere, {{name}} {{emoji}}\",\n  \"Home_Display_More\": \"Näita rohkem\",\n  \"Home_Cards_Button_Description_Plurial\": \"saadaval\",\n  \"Home_Chats_Plurial\": \"vestlust\",\n  \"Home_Chats_Singular\": \"vestlus\",\n  \"Home_See_All_Tasks\": \"Vaata kõiki ülesandeid\",\n  \"Home_Welcome\": \"Tere!\",\n  \"Home_Planned_None\": \"Sul pole täna rohkem tunde\",\n  \"Home_Planned_One\": \"Sul on täna veel üks tund\",\n  \"Home_Planned_Number\": \"Sul on täna veel {{number}} tundi\",\n\n  \"Home_Widget_NextCourses\": \"Järgmised tunnid\",\n  \"Home_Widget_NewGrades\": \"Uued hinded\",\n  \"Home_Widget_NewHomeworks\": \"Tegemata ülesanded\",\n\n  \"Home_Widget_NoCourses\": \"Tunde pole tulemas\",\n  \"Home_Widget_NoCourses_Description\": \"Tänaseks pole rohkem tunde planeeritud.\",\n\n  \"Home_Cards_Button_Title\": \"Kaardid\",\n  \"Home_Cards_Button_Description_None\": \"Kaarte pole\",\n  \"Home_Cards_Button_Description_Singular\": \"Üks kaart\",\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kaarti\",\n\n  \"Home_Chats_Button_Title\": \"Sõnumid\",\n  \"Home_Chats_Button_Description_None\": \"Sõnumeid pole\",\n  \"Home_Chats_Button_Description_Singular\": \"Üks sõnum\",\n  \"Home_Chats_Button_Description_Number\": \"{{number}} sõnumit\",\n\n  \"Home_Attendance_Title\": \"Puudumised\",\n  \"Home_Attendance_Button_Description_None\": \"Puudumisi pole\",\n  \"Home_Attendance_Button_Description_Singular\": \"Üks puudumine\",\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} puudumist\",\n\n  \"Home_Menu_Button_Title\": \"Menüü\",\n  \"Home_Menu_Button_Description\": \"Tänane menüü\",\n\n  \"Tab_Calendar_Empty\": \"Sündmusi ei leitud\",\n  \"Tab_Calendar_Empty_Description\": \"Alustamiseks lisa sündmus või sünrooni oma tunniplaan.\",\n\n  \"Modal_Course_Title\": \"Minu tund\",\n  \"Modal_Course_StartsIn\": \"Algab:\",\n  \"Modal_Course_StartedAgo\": \"Lõppes:\",\n  \"Modal_Course_Ongoing\": \"Kestnud juba:\",\n  \"Modal_Course_Group\": \"Grupp\",\n  \"Modal_Course_Group_Full\": \"Klass\",\n\n  \"Modal_Course_Details\": \"Tunni andmed\",\n  \"Modal_Course_Teacher\": \"Õpetaja\",\n  \"Modal_Course_Room\": \"Ruum\",\n  \"Modal_Course_Duration\": \"Kestus\",\n\n  \"Modal_Course_Time\": \"Tunni kellaajad\",\n  \"Modal_Course_Start\": \"Algus\",\n  \"Modal_Course_End\": \"Lõpp\",\n\n  \"Tasks_Search_Placeholder\": \"Otsi ülesandeid\",\n  \"Tasks_LeftHomeworks_Title\": \"tegemata ülesannet\",\n  \"Tasks_LeftHomeworks_Time\": \"sel nädalal\",\n  \"Tasks_Done_AllTasks\": \"Kõik ülesanded\",\n  \"Tasks_Done_CompletedTasks\": \"on tehtud\",\n  \"Tasks_Nav_Left\": \"Veel {{count}} ülesannet teha\",\n  \"Tasks_Nav_One\": \"Veel vaid üks ülesanne\",\n  \"Tasks_Nav_Completed\": \"Kõik on tehtud!\",\n  \"Tasks_Week\": \"Nädal\",\n  \"Tasks_NoTasks_Title\": \"Ülesandeid pole\",\n  \"Tasks_NoTasks_Description\": \"Selleks nädalaks pole ülesandeid märgitud. Puhka rahus!\",\n  \"Tasks_NoTasks_ForWeek\": \"nädalaks {{week}}\",\n  \"Tasks_NoTasks_Nav\": \"Ülesandeid pole\",\n  \"Task_Start\": \"Tegemata\",\n  \"Task_Complete\": \"Tehtud\",\n  \"Task_Sorting_Title\": \"Sorteeri:\",\n  \"Task_OnlyShowUndone\": \"Tehtud ülesanded\",\n  \"Task_Show_Title\": \"Kuva\",\n  \"Settings_General\": \"Üldine\",\n\n  \"Latest_Grades\": \"Uued hinded\",\n  \"Grades_Search_Placeholder\": \"Otsi hinnet või õppeainet\",\n\n  \"Grades_Avg_Methods\": \"Arvutusmeetodid\",\n  \"Grades_Avg_All_Title\": \"Üldine keskmine\",\n  \"Grades_Avg_All_Short\": \"Üldine kesk.\",\n  \"Grades_Avg_All_Pond\": \"Kaalutud keskmine\",\n  \"Grades_Avg_All_Pond_Short\": \"Kaalutud kesk.\",\n  \"Grades_Avg_All_Pond_Description\": \"Arvutab kõikide hinnete kaalutud keskmise\",\n  \"Grades_Avg_Subject_Title\": \"Ainete keskmine\",\n  \"Grades_Avg_Subject_Short\": \"Ainete kesk.\",\n  \"Grades_Avg_Subject_Description\": \"Arvutab ainete keskmiste kaalutud keskmise\",\n  \"Grades_Avg_Median_Title\": \"Mediaan\",\n  \"Grades_Avg_Median_Short\": \"Mediaan\",\n\n  \"Grades_Avg_More\": \"Loe lähemalt\",\n  \"Grades_Avg_KnowMore\": \"Loe lähemalt\",\n  \"Grades_Avg_KnowMore_Description\": \"Mõista üldkeskmise arvutamise meetodeid\",\n\n  \"Grades_SubjectInfo\": \"Aine info\",\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} hinnet\",\n  \"SubjectInfo_StudentAverage_Label\": \"Õpilase keskmine\",\n  \"SubjectInfo_Stats_Header\": \"Statistika\",\n  \"SubjectInfo_ClassAverage_Label\": \"Klassi keskmine\",\n  \"SubjectInfo_ClassAverage_Description\": \"Klassi üldine keskmine hinne\",\n  \"SubjectInfo_MaxAverage_Label\": \"Maksimaalne keskmine\",\n  \"SubjectInfo_MaxAverage_Description\": \"Grupi parim keskmine\",\n  \"SubjectInfo_MinAverage_Label\": \"Minimaalne keskmine\",\n  \"SubjectInfo_MinAverage_Description\": \"Grupi nõrgim keskmine\",\n\n  \"Grades_Semester\": \"Semester\",\n  \"Grades_Trimester\": \"Trimester\",\n  \"Grades_OutPeriod\": \"Perioodiväline\",\n  \"Grades_Year\": \"Õppeaasta\",\n  \"Grades_MockExamBac\": \"Riigieksami proovieksam\",\n  \"Grades_MockExamBrevet\": \"Lõpueksami proovieksam\",\n\n  \"Grades_Method_AllGrades\": \"Kõik ained\",\n  \"Grades_Method_Weighted\": \"Kaalutud\",\n\n  \"Grades_Sort\": \"Sorteeri\",\n  \"Grades_Sorting_Alphabetical\": \"Tähestikuline\",\n  \"Grades_Sorting_Averages\": \"Keskmised\",\n  \"Grades_Sorting_Date\": \"Kuupäev\",\n\n  \"Grades_Menu_SortBy\": \"Sorteeri:\",\n  \"Grades_Menu_AverageBy\": \"Keskmine:\",\n  \"NoAverage\": \"Keskmist pole\",\n\n  \"Grades_Empty_Title\": \"Hindeid pole\",\n  \"Grades_Empty_Description\": \"Sellel perioodil pole sulle veel hindeid pandud.\",\n\n  \"Grade_NoDescription\": \"{{subject}} ülesanne\",\n\n  \"Grades_Tab_Subjects\": \"Õppeained\",\n  \"Grades_Tab_Latest\": \"Uued hinded\",\n\n  \"Profile_Attendance_Title\": \"Osavõtt\",\n  \"Profile_Attendance_Denominator_Single\": \"puudumine\",\n  \"Profile_Attendance_Denominator_Plural\": \"puudumist\",\n\n  \"Profile_Discussions_Title\": \"Vestlused\",\n  \"Profile_Discussions_Denominator_Single\": \"lugemata\",\n  \"Profile_Discussions_Denominator_Plural\": \"lugemata\",\n\n  \"Profile_News_Title\": \"Uudised\",\n  \"Profile_News_Denominator_Single\": \"uus\",\n  \"Profile_News_Denominator_Plural\": \"uut\",\n  \"Profile_News_Open\": \"Ava\",\n  \"Profile_News_Loading_Title\": \"Uudiste laadimine...\",\n  \"Profile_News_Author_Unknown\": \"Tundmatu autor\",\n\n  \"Profile_Cards_Title\": \"QR-kood ja kaardid\",\n\n  \"Modal_Grades_Title\": \"Hinde üksikasjad\",\n  \"Modal_Grades_BestGrade\": \"Grupi parim hinne\",\n\n  \"Grades_Details_Title\": \"Üksikasjad\",\n  \"Grades_NormalizedGrade_Title\": \"Hinne 20-palli skaalal\",\n  \"Grades_NormalizedGrade_Description\": \"Hinde väärtus teisendatuna 20-palli skaalale\",\n  \"Grades_HighestGrade_Title\": \"Kõrgeim hinne\",\n  \"Grades_HighestGrade_Description\": \"Grupi kõrgeim saavutatud hinne\",\n  \"Grades_LowestGrade_Title\": \"Madalaim hinne\",\n  \"Grades_LowestGrade_Description\": \"Grupi madalaim saavutatud hinne\",\n  \"Grades_Influence_Title\": \"Mõju\",\n  \"Grades_Avg_Group_Title\": \"Grupi keskmine\",\n  \"Grades_Coefficient\": \"Koefitsient\",\n  \"Grades_Avg_Group_Short\": \"Grupi kesk.\",\n  \"Grades_Tab_Rank\": \"Edetabel\",\n  \"Grades_Tab_Rank_Description\": \"Koht grupis\",\n\n  \"News_Search_Placeholder\": \"Otsi uudist\",\n  \"News_Empty_Title\": \"Uudiseid pole\",\n  \"News_Empty_Description\": \"Sinu koolist ei leitud ühtegi uudist.\",\n  \"News_Search_NoResults\": \"Uudiseid ei leitud\",\n  \"News_Search_NoResults_Description\": \"Sinu otsingule vastavaid uudiseid ei leitud.\",\n\n  \"News_Theme_Papillon_Title\": \"Papillon\",\n  \"News_Theme_Papillon_Description\": \"Pehme ja elegantne teema\",\n\n  \"News_Theme_Reading_Title\": \"Lugemine\",\n  \"News_Theme_Reading_Description\": \"Lugemiseks kohandatud teema\",\n\n  \"Attendance_Hours_Missed\": \"Puudutud tunnid\",\n  \"Attendance_Hours_Unjustified\": \"Põhjuseta puudutud tunnid\",\n  \"Attendance_Missing\": \"Puudumised\",\n  \"Attendance_Delays\": \"Hilinemised\",\n  \"Attendance_NoReason\": \"Põhjus märkimata\",\n  \"Attendance_NoEvent_Title\": \"Sündmusi pole\",\n  \"Attendance_NoEvent_Description\": \"Sellel perioodil pole registreeritud puudumisi ega hilinemisi.\",\n\n  \"Settings_Account_Title\": \"Minu konto\",\n  \"Settings_Account_Description\": \"Minu konto seaded\",\n  \"Settings_Services_Title\": \"Seotud kontod\",\n  \"Settings_Services_Title_LastAccountUsed\": \"Viimati kasutatud konto\",\n  \"Settings_Notifications_Title\": \"Teavitused\",\n  \"Settings_Notifications_Description\": \"Hoiatused, sagedus...\",\n  \"Settings_Subjects_Title\": \"Õppeained\",\n  \"Settings_Subjects_Description\": \"Nimi, värv, font...\",\n  \"Settings_Personalization_Title\": \"Isikupärastamine\",\n  \"Settings_Personalization_Description\": \"Teemad, värvid...\",\n  \"Settings_Cards_Title\": \"Kaardid\",\n  \"Settings_Cards_Description\": \"Söökla, läbipääs...\",\n  \"Settings_Accessibility_Title\": \"Hõlbustus\",\n  \"Settings_Accessibility_Description\": \"Ekraan, heli...\",\n  \"Settings_MagicPlus_Title\": \"Magic+\",\n  \"Settings_MagicPlus_Description\": \"Nutikad funktsioonid\",\n  \"Settings_MagicPlus_Description_Card\": \"Tehisintellekti funktsioonid\",\n  \"Settings_MagicPlus_Enable\": \"Lülita Magic+ sisse\",\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimeerib automaatselt ülesannete korraldust, et tõsta produktiivsust\",\n  \"Settings_MagicPlus_ExplanationLocal\": \"Täielikult seadmesisene mudel, andmeid ei saadeta seadmest välja\",\n  \"Settings_Donate_Title\": \"Toeta meid\",\n  \"Settings_Donate_Description\": \"Toeta projekti arengut\",\n  \"Settings_Telemetry_Title\": \"Telemeetria ja privaatsus\",\n  \"Settings_Telemetry_Description\": \"Halda kogutavaid andmeid\",\n  \"Settings_About_Title\": \"Teave\",\n  \"Settings_About_Description\": \"Versioon\",\n  \"Settings_Logout_Title\": \"Logi välja\",\n  \"Settings_Logout_Description\": \"Eemalda see konto Papillonist\",\n  \"Settings_Language_Title\": \"Keel\",\n  \"Settings_Language_Description\": \"Muuda keelt\",\n  \"Settings_Tabs_Title\": \"Vahekaardid\",\n  \"Settings_Tabs_Description\": \"Peida menüüst vahekaarte\",\n\n  \"Settings_Personalization_Title_Card\": \"Isikupärastamine\",\n  \"Settings_Personalization_Subtitle_Card\": \"Teemad, ained...\",\n  \"Settings_SubjectPersonalization_Title\": \"Muuda õppeaineid\",\n  \"Settings_Personalization_Accent\": \"Rõhuasetuse värv\",\n  \"Settings_Personalization_Accent_Description\": \"Siin valitud värv kehtib Papilloni avalehel.\",\n  \"Settings_Personalization_Theme\": \"Teema\",\n  \"Settings_Personalization_Icon_Title\": \"Muuda ikooni\",\n  \"Settings_Personalization_Icon_Description\": \"Isikupärasta äpi ikooni\",\n  \"Settings_Personalization_Subject_Title\": \"Muuda õppeaineid\",\n  \"Settings_Personalization_Subject_Title_Card\": \"Õppeained\",\n  \"Settings_Personalization_Subject_Description\": \"Ikoonid, värvid\",\n  \"Settings_About_Papillion_Behind\": \"Papilloni meeskond\",\n  \"Settings_About_Papillion_Behind_Description\": \"Papilloni haldavad 100% vabatahtlikud üliõpilased\",\n  \"Settings_About_Discord\": \"Discordi server\",\n  \"Settings_About_Discord_Description\": \"Liitu Discordi serveriga\",\n  \"Settings_About_Crowdin\": \"Crowdin-i projekt\",\n  \"Settings_About_Crowdin_Description\": \"Aita Papilloni tõlkida\",\n  \"Settings_About_Github\": \"GitHub-i projekt\",\n  \"Settings_About_Github_Description\": \"Aita kaasa arendusele GitHubis\",\n  \"Settings_About_Issue\": \"Teata veast\",\n  \"Settings_About_Issue_Description\": \"Anna teada leitud veast\",\n  \"Settings_About_Dependency_Version\": \"Sõltuvuste versioonid\",\n\n  \"Alert_No_Technical\": \"Tehniline info puudub.\",\n  \"Alert_Auth_Error\": \"Autentimise viga\",\n  \"Alert_Auth_Bad_Creds\": \"Sisestatud andmed on valed või proovid sisse logida lapsevanema kontoga. Papillon ei toeta veel seda tüüpi kontosid.\",\n  \"Alert_Not_Supported\": \"Serverit ei toetata\",\n  \"Alert_Security_Instance_HTTP\": \"Turvakaalutlustel ei luba Papillon servereid, mis kasutavad siiani HTTP-protokolli. Soovitame teavitada kooli juhtkonda, et nad serverit turvalisuse huvides uuendaksid.\",\n  \"Alert_NoDemo\": \"Papillon ei ole mõeldud töötama demo-serveritega, palun kasuta päriskontot.\",\n  \"Alert_Invalid_Instance\": \"Papillon ei saa sellelt PRONOTE-i serverilt andmeid, kas see on veel kehtiv?\",\n  \"Alert_No_Pos\": \"Asukohta ei õnnestunud tuvastada\",\n  \"Alert_Connexion_Fail\": \"Ühendus ebaõnnestus\",\n\n  \"Feature_Limited\": \"Piiratud funktsioonid\",\n  \"Feature_Soon\": \"Tulemas peagi!\",\n  \"Feature_Soon_Notification\": \"Töötame kõvasti, et pakkuda seda funktsiooni tulevases uuenduses.\",\n  \"Feature_Add_Card\": \"Lisa uus kaart profiili vahekaardilt\",\n\n  \"Webview_Wait\": \"Veidi kannatust...\",\n\n  \"Profile_QRCards\": \"QR-kood ja kaardid\",\n  \"Profile_QRCards_Subtitle\": \"{{count}} kaarti\",\n  \"Profile_Cards_Loading_History\": \"Tehingute ajaloo laadimine\",\n  \"Profile_Cards_Loading_History_Description\": \"See võib võtta aega...\",\n\n  \"Settings_Cards_Banner_Title\": \"Kaardid\",\n  \"Settings_Cantineen_Subtitle_Card\": \"Söökla, läbipääs\",\n  \"Settings_Cards_Banner_Description\": \"Lisa oma söökla- ja sõidukaardid, et pääseda neile Papilloni kaudu telefonist ligi\",\n  \"Settings_Cards_None_Title\": \"Kaarte pole\",\n  \"Settings_Cards_Add_Button\": \"Lisa\",\n\n  \"Settings_Cards_None_Description\": \"Lisa kaart, et näha söökla jääki, skaneerida oma QR-koodi ja muud\",\n  \"Settings_Subjects_None_Title\": \"Õppeaineid pole\",\n  \"Settings_Subjects_None_Description\": \"Sirvi äpi erinevaid vahekaarte, et saaksid õppeaineid muuta.\",\n  \"Settings_Subjects_Reset_Title\": \"Lähtesta\",\n  \"Settings_Subjects_Reset_Message\": \"Kas soovid tõesti kõik õppeained lähtestada?\",\n  \"Settings_Subjects_Reset_Button\": \"Lähtesta\",\n\n  \"Settings_Donator\": \"Toetajad\",\n  \"Settings_Donator_Description\": \"Vaata toetajate nimekirja\",\n  \"Settings_App_Version\": \"Äpi versioon\",\n\n  \"Profile_Cards_Scan_Orientation\": \"Suuna QR-kood terminali skanneri poole\",\n  \"Profile_Cards_No_Reservation\": \"Broneeringuid pole\",\n  \"Profile_Cards_No_Available_Reservation\": \"Näib, et selleks päevaks pole võimalik broneerida.\",\n  \"Profile_Cards_History\": \"Ajalugu\",\n  \"Magic_Important\": \"Võib olla oluline\",\n\n  \"OnBoarding_Step\": \"Samm \",\n  \"OnBoarding_Step_Of\": \"/ \",\n\n  \"Consent_Advanced_Title\": \"Soovin Papilloni aidata\",\n  \"Consent_Advanced_Description\": \"Kogume üksikasjalikumat teavet sinu kasutusharjumuste kohta.\",\n  \"Consent_Required_Title\": \"Ainult hädavajalik\",\n  \"Consent_Required_Description\": \"Lühidalt: teadmine, et keegi kasutas Papilloni, kas see töötas ja millist teenust ta kasutab.\",\n  \"Consent_None_Title\": \"Mitte midagi\",\n  \"Consent_None_Description\": \"Me ei tea isegi sinu olemasolust.\",\n  \"Consent_Title\": \"Sina ja Papillon\",\n  \"Consent_Intro1\": \"Et aidata Papillonil kasvada, saad valida kasutusandmete jagamise meiega.\",\n  \"Consent_PrivacyPolicy\": \"Kahtluse korral tutvu meie privaatsuspoliitikaga\",\n  \"Consent_Refuse\": \"Keeldu\",\n  \"Consent_Accept\": \"Nõustu\",\n  \"Consent_ChangeMind\": \"Saad oma otsust igal ajal äpi seadetest muuta.\",\n  \"Consent_Arg1\": \"Kasutatakse ainult rakenduse parandamiseks\",\n  \"Consent_Arg2\": \"Anonüümne ja ei ole seotud sinu isikuga\",\n  \"Consent_Arg3\": \"Meil pole ligipääsu sinu kontodele\",\n\n  \"Changelog_Title\": \"Uuenduste ajalugu\",\n\n  \"Tasks_Sorting_Methods_DueDate\": \"Tähtaeg\",\n  \"Tasks_Sorting_Methods_Subject\": \"Õppeained\",\n  \"Tasks_Sorting_Methods_Done\": \"Tegemata\",\n  \"Tasks_ThisWeek\": \"Sel nädalal\",\n\n  \"Task_Undone\": \"Tegemata\",\n  \"Task_Done\": \"Tehtud\",\n\n  \"Modal_Wallpaper_Title\": \"Muuda taustapilti\",\n  \"Modal_Profile_Title\": \"Muuda profiili\",\n\n  \"Modal_Task_Status\": \"Ülesande olek\",\n  \"Modal_Task_Description\": \"Ülesande kirjeldus\",\n  \"Modal_Task_Attachments\": \"Manused\",\n\n  \"Today\": \"Täna\",\n  \"Yesterday\": \"Eile\",\n  \"Tomorrow\": \"Homme\"\n}"
  },
  {
    "path": "locales/fa.json",
    "content": "{\r\n  \"Global_Back\": \"بازگشت\",\r\n  \"Global_DatePrefix\": \"در تاریخ\",\r\n\r\n  \"Tab_Home\": \"خانه\",\r\n  \"Tab_Calendar\": \"برنامه\",\r\n  \"Tab_Tasks\": \"تکالیف\",\r\n  \"Tab_Grades\": \"نمرات\",\r\n  \"Tab_Profile\": \"پروفایل\",\r\n  \"Tab_Custom_Profile\": \"ویرایش پروفایل من\",\r\n  \"Button_Change_ProfilePicture\": \"تغییر عکس پروفایل\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"گرفتن عکس\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"از گالری\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"دریافت از سیستم مدرسه\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"حذف عکس\",\r\n  \"Tab_Page\": \"صفحه\",\r\n  \"Tab_Settings\": \"تنظیمات\",\r\n  \"Tab_News\": \"اخبار\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"اپلیکیشنی برای مدیریت زندگی تحصیلی تو\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"برنامه‌های مدرسه‌ات را وصل کن تا به نمرات، برنامه هفتگی، تکالیف و موارد دیگر در محیط پاپیون (Papillon) دسترسی داشته باشی!\",\r\n  \"ONBOARDING_START_BTN\": \"شروع\",\r\n  \"ONBOARDING_HELP_BTN\": \"نیاز به راهنمایی داری؟\",\r\n  \"ONBOARDING_UNIVERSITY\": \"سرویس دانشگاهی\",\r\n  \"ONBOARDING_RESTAURANTS\": \"سرویس سلف‌سرویس\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"سرویس مدرسه خود را انتخاب کن\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"سرویس غذاخوری خود را انتخاب کن\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"سرویس دانشگاهی خود را انتخاب کن\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"چطور می‌خواهی وارد شوی؟\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"استفاده از موقعیت من\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"جستجوی شهر\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"کد QR دارم\",\r\n  \"ONBOARDING_METHOD_LINK\": \"لینک ورود دارم\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"مدرسه خود را انتخاب کن\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"نام شهرت را وارد و مدرسه‌ات را انتخاب کن\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"مثل همیشه وارد شو\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"ورود به حساب کاربری\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"میزبان اختصاص داده شده به حساب را انتخاب کن\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"کد ۴ رقمی که در PRONOTE ساختی را وارد کن\",\r\n  \"ONBOARDING_LOGIN_TO\": \"اتصال به\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"برای اتصال، کد QR مدرسه خود را اسکن کن.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"تأیید کد QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"این کار ممکن است لحظاتی طول بکشد...\",\r\n  \"ONBOARDING_URL\": \"آدرس URL مدرسه خود را وارد کن\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"آدرس URL سرور PRONOTE شما\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"قبل از تمام کردن\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"یک رنگ برای\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"تم انتخاب کن\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"پین‌کد PRONOTE خود را وارد کن\",\r\n  \"Onboarding_Load_Webview_Description\": \"در حال بارگذاری سایت مدرسه شما\",\r\n  \"INPUT_PIN\": \"پین‌کد\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"جستجوی سرور...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"در حال اتصال...\",\r\n\r\n  \"WAITING\": \"در انتظار\",\r\n  \"IZLY_SMS_SEND\": \"یک لینک برای ورود دریافت کردی، روی آن کلیک کن و مراحل را ادامه بده.\",\r\n  \"STEP\": \"مرحله\",\r\n  \"STEP_OUTOF\": \"از\",\r\n  \"INPUT_USERNAME\": \"نام کاربری\",\r\n  \"INPUT_MAIL\": \"آدرس ایمیل\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"ایمیل یا نام کاربری\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"شماره تلفن یا ایمیل\",\r\n  \"INPUT_PASSWORD\": \"رمز عبور\",\r\n  \"INPUT_PASSWORD_CODE\": \"کد دسترسی\",\r\n  \"INPUT_ETABID\": \"شناسه مدرسه شما\",\r\n  \"LOGIN_BTN\": \"ورود\",\r\n  \"CONFIRM_BTN\": \"تأیید\",\r\n  \"CANCEL_BTN\": \"لغو\",\r\n\r\n  \"Tab_New_Event\": \"رویداد جدید\",\r\n\r\n  \"Tab_Calendar_Icals\": \"مدیریت iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"مدیریت لینک‌های iCal شما\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"افزودن لینک iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"مدیریت {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"افزودن یا حذف لینک‌های iCal برای همگام‌سازی با تقویم.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"عنوان وارد نشده\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"برای افزودن، یک نام برای این لینک iCal انتخاب کن.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"هیچ لینکی اضافه نشده است\",\r\n\r\n  \"TabUnderConstruction_Title\": \"این بخش در حال ساخت است.\",\r\n  \"TabUnderConstruction_Details\": \"بعداً برای دیدن آپدیت‌ها برگرد.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"حالت توسعه‌دهنده\",\r\n  \"TabDevModeNotice_Details\": \"محیط تست کامل برای برنامه‌نویسان.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"جزئیات فنی\",\r\n\r\n  \"Online_Course\": \"آنلاین\",\r\n  \"Evaluated_Course\": \"ارزشیابی / امتحان\",\r\n  \"Edited_Course\": \"کلاس تغییر یافته\",\r\n  \"Canceled_Course\": \"کلاس لغو شده\",\r\n  \"No_Course_Room\": \"اتاق نامشخص\",\r\n  \"Event_DeleteEvent\": \"حذف رویداد\",\r\n  \"Event_Confirm_DeleteEvent\": \"آیا از حذف این رویداد مطمئن هستی؟\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"وقت ناهار\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"نوش جان!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"اوممم، خوشمزه است!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"استراحت صبحگاهی\",\r\n  \"Course_Separator_Morning_Alt_1\": \"وقت خواب!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"صبحانه\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"استراحت عصرگاهی\",\r\n  \"Course_Separator_Evening_Alt_1\": \"یک استراحت لازم است!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"وقت عصرانه!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"استراحت شبانه\",\r\n  \"Course_Separator_Night_Alt_1\": \"وقت خواب!\",\r\n  \"Course_Separator_Night_Alt_2\": \"شب شده است!\",\r\n\r\n  \"Context_Delete\": \"حذف\",\r\n  \"Context_Cancel\": \"لغو\",\r\n  \"Context_Edit\": \"ویرایش\",\r\n  \"Context_Add\": \"افزودن\",\r\n\r\n  \"Form_Title\": \"عنوان\",\r\n  \"Form_Location\": \"مکان\",\r\n  \"Form_Organizer\": \"برگزارکننده\",\r\n  \"Form_Start\": \"شروع\",\r\n  \"Form_End\": \"پایان\",\r\n\r\n  \"Confirm_DeleteEvent\": \"آیا از حذف این رویداد مطمئن هستی؟\",\r\n\r\n  \"Home_Welcome_Name\": \"سلام، {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"نمایش بیشتر\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"در دسترس\",\r\n  \"Home_Chats_Plurial\": \"گفتگو\",\r\n  \"Home_Chats_Singular\": \"گفتگو\",\r\n  \"Home_See_All_Tasks\": \"مشاهده همه تکالیف\",\r\n  \"Home_Welcome\": \"خوش آمدی!\",\r\n  \"Home_Planned_None\": \"امروز دیگر کلاسی نداری\",\r\n  \"Home_Planned_One\": \"امروز یک کلاس باقی‌مانده داری\",\r\n  \"Home_Planned_Number\": \"امروز {{number}} کلاس باقی‌مانده داری\",\r\n\r\n  \"Home_Widget_NextCourses\": \"کلاس‌های بعدی\",\r\n  \"Home_Widget_NewGrades\": \"نمرات جدید\",\r\n  \"Home_Widget_NewHomeworks\": \"تکالیف برای انجام\",\r\n\r\n  \"Home_Widget_NoCourses\": \"کلاسی در پیش نیست\",\r\n  \"Home_Widget_NoCourses_Description\": \"هیچ کلاسی برای امروز برنامه‌ریزی نشده است.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"کارت‌ها\",\r\n  \"Home_Cards_Button_Description_None\": \"بدون کارت\",\r\n  \"Home_Cards_Button_Description_Singular\": \"یک کارت\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} کارت\",\r\n\r\n  \"Home_Chats_Button_Title\": \"پیام‌ها\",\r\n  \"Home_Chats_Button_Description_None\": \"بدون پیام\",\r\n  \"Home_Chats_Button_Description_Singular\": \"یک پیام\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} پیام\",\r\n\r\n  \"Home_Attendance_Title\": \"حضور و غیاب\",\r\n  \"Home_Attendance_Button_Description_None\": \"بدون غیبت\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"یک غیبت\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} غیبت\",\r\n\r\n  \"Home_Menu_Button_Title\": \"منو\",\r\n  \"Home_Menu_Button_Description\": \"منوی امروز\",\r\n\r\n  \"Tab_Calendar_Empty\": \"رویدادی پیدا نشد\",\r\n  \"Tab_Calendar_Empty_Description\": \"برای شروع، یک رویداد اضافه کن یا تقویمت را همگام‌سازی کن.\",\r\n\r\n  \"Modal_Course_Title\": \"کلاس من\",\r\n  \"Modal_Course_StartsIn\": \"شروع می‌شود در\",\r\n  \"Modal_Course_StartedAgo\": \"پایان یافته از\",\r\n  \"Modal_Course_Ongoing\": \"در حال برگزاری از\",\r\n  \"Modal_Course_Group\": \"گروه\",\r\n  \"Modal_Course_Group_Full\": \"کلاس\",\r\n\r\n  \"Modal_Course_Details\": \"جزئیات کلاس\",\r\n  \"Modal_Course_Teacher\": \"دبیر\",\r\n  \"Modal_Course_Room\": \"کلاس / اتاق\",\r\n  \"Modal_Course_Duration\": \"مدت زمان\",\r\n\r\n  \"Modal_Course_Time\": \"زمان کلاس\",\r\n  \"Modal_Course_Start\": \"شروع\",\r\n  \"Modal_Course_End\": \"پایان\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"جستجوی تکالیف\",\r\n  \"Tasks_LeftHomeworks_Title\": \"تکلیف باقی‌مانده\",\r\n  \"Tasks_LeftHomeworks_Time\": \"این هفته\",\r\n  \"Tasks_Done_AllTasks\": \"همه تکالیف\",\r\n  \"Tasks_Done_CompletedTasks\": \"انجام شده‌اند\",\r\n  \"Tasks_Nav_Left\": \"هنوز {{count}} تکلیف باقی‌مانده\",\r\n  \"Tasks_Nav_One\": \"فقط یک تکلیف دیگر باقی‌مانده\",\r\n  \"Tasks_Nav_Completed\": \"همه تمام شد!\",\r\n  \"Tasks_Week\": \"هفته\",\r\n  \"Tasks_NoTasks_Title\": \"بدون تکلیف\",\r\n  \"Tasks_NoTasks_Description\": \"هیچ تکلیفی برای این هفته برنامه‌ریزی نشده است. از استراحت لذت ببر!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"برای هفته {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"بدون تکلیف\",\r\n  \"Task_Start\": \"برای انجام\",\r\n  \"Task_Complete\": \"انجام شده\",\r\n  \"Task_Sorting_Title\": \"مرتب‌سازی بر اساس\",\r\n  \"Task_OnlyShowUndone\": \"تکالیف تمام شده\",\r\n  \"Task_Show_Title\": \"نمایش\",\r\n  \"Settings_General\": \"عمومی\",\r\n\r\n  \"Latest_Grades\": \"نمرات جدید\",\r\n  \"Grades_Search_Placeholder\": \"جستجوی نمره یا درس\",\r\n\r\n  \"Grades_Avg_Methods\": \"روش‌های محاسبه\",\r\n  \"Grades_Avg_All_Title\": \"معدل کل\",\r\n  \"Grades_Avg_All_Short\": \"معدل کل\",\r\n  \"Grades_Avg_All_Pond\": \"معدل وزنی\",\r\n  \"Grades_Avg_All_Pond_Short\": \"معدل وزنی\",\r\n  \"Grades_Avg_All_Pond_Description\": \"معدل وزنی تمام نمرات را محاسبه می‌کند\",\r\n  \"Grades_Avg_Subject_Title\": \"میانگین دروس\",\r\n  \"Grades_Avg_Subject_Short\": \"میانگین دروس\",\r\n  \"Grades_Avg_Subject_Description\": \"معدل وزنیِ میانگینِ دروس را محاسبه می‌کند\",\r\n  \"Grades_Avg_Median_Title\": \"میانه\",\r\n  \"Grades_Avg_Median_Short\": \"میانه\",\r\n\r\n  \"Grades_Avg_More\": \"بیشتر بدانید\",\r\n  \"Grades_Avg_KnowMore\": \"اطلاعات بیشتر\",\r\n  \"Grades_Avg_KnowMore_Description\": \"درک روش‌های محاسبه معدل کل\",\r\n\r\n  \"Grades_SubjectInfo\": \"اطلاعات درس\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} نمره\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"معدل دانش‌آموز\",\r\n  \"SubjectInfo_Stats_Header\": \"آمار\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"میانگین کلاس\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"معدل کل کلاس\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"بالاترین معدل\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"بهترین معدل در گروه\",\r\n  \"SubjectInfo_MinAverage_Label\": \"پایین‌ترین معدل\",\r\n  \"SubjectInfo_MinAverage_Description\": \"پایین‌ترین معدل در گروه\",\r\n\r\n  \"Grades_Semester\": \"نیم‌سال\",\r\n  \"Grades_Trimester\": \"دوره سه ماهه\",\r\n  \"Grades_OutPeriod\": \"خارج از دوره\",\r\n  \"Grades_Year\": \"سال تحصیلی\",\r\n  \"Grades_MockExamBac\": \"امتحان آزمایشی\",\r\n  \"Grades_MockExamBrevet\": \"تست آزمایشی\",\r\n\r\n  \"Grades_Method_AllGrades\": \"همه دروس\",\r\n  \"Grades_Method_Weighted\": \"ضریب‌دهی\",\r\n\r\n  \"Grades_Sort\": \"مرتب‌سازی\",\r\n  \"Grades_Sorting_Alphabetical\": \"الفبایی\",\r\n  \"Grades_Sorting_Averages\": \"معدل‌ها\",\r\n  \"Grades_Sorting_Date\": \"تاریخ\",\r\n\r\n  \"Grades_Menu_SortBy\": \"مرتب‌سازی بر اساس\",\r\n  \"Grades_Menu_AverageBy\": \"میانگین بر اساس\",\r\n  \"NoAverage\": \"بدون معدل\",\r\n\r\n  \"Grades_Empty_Title\": \"نمره‌ای نیست\",\r\n  \"Grades_Empty_Description\": \"هنوز در این دوره نمره‌ای برای شما ثبت نشده است.\",\r\n\r\n  \"Grade_NoDescription\": \"تکلیف درس {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"دروس\",\r\n  \"Grades_Tab_Latest\": \"نمرات جدید\",\r\n\r\n  \"Profile_Attendance_Title\": \"حضور و غیاب\",\r\n  \"Profile_Attendance_Denominator_Single\": \"غیبت\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"غیبت\",\r\n\r\n  \"Profile_Discussions_Title\": \"گفتگوها\",\r\n  \"Profile_Discussions_Denominator_Single\": \"خوانده نشده\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"خوانده نشده\",\r\n\r\n  \"Profile_News_Title\": \"اخبار\",\r\n  \"Profile_News_Denominator_Single\": \"جدید\",\r\n  \"Profile_News_Denominator_Plural\": \"جدید\",\r\n  \"Profile_News_Open\": \"باز کردن\",\r\n  \"Profile_News_Loading_Title\": \"در حال بارگذاری اخبار...\",\r\n  \"Profile_News_Author_Unknown\": \"نویسنده ناشناس\",\r\n\r\n  \"Profile_Cards_Title\": \"کد QR و کارت‌ها\",\r\n\r\n  \"Modal_Grades_Title\": \"جزئیات نمره\",\r\n  \"Modal_Grades_BestGrade\": \"بهترین نمره در گروه\",\r\n\r\n  \"Grades_Details_Title\": \"جزئیات\",\r\n  \"Grades_NormalizedGrade_Title\": \"نمره از ۲۰\",\r\n  \"Grades_NormalizedGrade_Description\": \"مقدار نمره تبدیل شده به مقیاس ۲۰\",\r\n  \"Grades_HighestGrade_Title\": \"بالاترین نمره\",\r\n  \"Grades_HighestGrade_Description\": \"بیشترین نمره کسب شده در گروه\",\r\n  \"Grades_LowestGrade_Title\": \"پایین‌ترین نمره\",\r\n  \"Grades_LowestGrade_Description\": \"کمترین نمره کسب شده در گروه\",\r\n  \"Grades_Influence_Title\": \"تأثیر نمره\",\r\n  \"Grades_Avg_Group_Title\": \"میانگین گروه\",\r\n  \"Grades_Coefficient\": \"ضریب\",\r\n  \"Grades_Avg_Group_Short\": \"میانگین گروه\",\r\n  \"Grades_Tab_Rank\": \"رتبه\",\r\n  \"Grades_Tab_Rank_Description\": \"جایگاه در گروه\",\r\n\r\n  \"News_Search_Placeholder\": \"جستجوی خبر\",\r\n  \"News_Empty_Title\": \"خبری نیست\",\r\n  \"News_Empty_Description\": \"هیچ خبری در موسسه شما پیدا نشد.\",\r\n  \"News_Search_NoResults\": \"خبری پیدا نشد\",\r\n  \"News_Search_NoResults_Description\": \"هیچ خبری مطابق با جستجوی شما یافت نشد.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"پاپیون\",\r\n  \"News_Theme_Papillon_Description\": \"یک تم ملایم و شیک\",\r\n\r\n  \"News_Theme_Reading_Title\": \"مطالعه\",\r\n  \"News_Theme_Reading_Description\": \"تمی طراحی شده برای مطالعه\",\r\n\r\n  \"Attendance_Hours_Missed\": \"ساعت‌های غیبت\",\r\n  \"Attendance_Hours_Unjustified\": \"غیبت‌های غیرموجه\",\r\n  \"Attendance_Missing\": \"غیبت‌ها\",\r\n  \"Attendance_Delays\": \"تأخیرها\",\r\n  \"Attendance_NoReason\": \"بدون دلیل\",\r\n  \"Attendance_NoEvent_Title\": \"بدون رویداد\",\r\n  \"Attendance_NoEvent_Description\": \"هیچ غیبت یا تأخیری برای این دوره ثبت نشده است.\",\r\n\r\n  \"Settings_Account_Title\": \"حساب من\",\r\n  \"Settings_Account_Description\": \"اطلاعات حساب من\",\r\n  \"Settings_Services_Title\": \"حساب‌های متصل\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"آخرین حساب استفاده شده\",\r\n  \"Settings_Notifications_Title\": \"اعلان‌ها\",\r\n  \"Settings_Notifications_Description\": \"هشدارها، فرکانس...\",\r\n  \"Settings_Subjects_Title\": \"دروس\",\r\n  \"Settings_Subjects_Description\": \"نام، رنگ، فونت...\",\r\n  \"Settings_Personalization_Title\": \"شخصی‌سازی\",\r\n  \"Settings_Personalization_Description\": \"تم‌ها، رنگ‌ها...\",\r\n  \"Settings_Cards_Title\": \"کارت‌ها\",\r\n  \"Settings_Cards_Description\": \"سلف، دسترسی...\",\r\n  \"Settings_Accessibility_Title\": \"دسترسی‌پذیری\",\r\n  \"Settings_Accessibility_Description\": \"نمایش، صدا...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"ویژگی‌های هوشمند\",\r\n  \"Settings_MagicPlus_Description_Card\": \"ویژگی‌های هوش مصنوعی\",\r\n  \"Settings_MagicPlus_Enable\": \"فعال‌سازی Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"سازماندهی تکالیف شما را برای افزایش بهره‌وری به طور خودکار بهینه می‌کند\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"مدل کاملاً محلی؛ هیچ داده‌ای به خارج از دستگاه شما ارسال نمی‌شود\",\r\n  \"Settings_Donate_Title\": \"حمایت مالی\",\r\n  \"Settings_Donate_Description\": \"حمایت از پروژه\",\r\n  \"Settings_Telemetry_Title\": \"تله‌متری و حریم خصوصی\",\r\n  \"Settings_Telemetry_Description\": \"مدیریت داده‌های جمع‌آوری شده\",\r\n  \"Settings_About_Title\": \"درباره اپلیکیشن\",\r\n  \"Settings_About_Description\": \"نسخه\",\r\n  \"Settings_Logout_Title\": \"خروج از حساب\",\r\n  \"Settings_Logout_Description\": \"حذف این حساب از پاپیون\",\r\n  \"Settings_Language_Title\": \"زبان\",\r\n  \"Settings_Language_Description\": \"تغییر زبان\",\r\n  \"Settings_Tabs_Title\": \"تب‌ها\",\r\n  \"Settings_Tabs_Description\": \"مخفی کردن تب‌ها از منو\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"شخصی‌سازی\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"تم‌ها، دروس...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"شخصی‌سازی دروس\",\r\n  \"Settings_Personalization_Accent\": \"رنگ اصلی (Accent)\",\r\n  \"Settings_Personalization_Accent_Description\": \"رنگی که اینجا انتخاب می‌کنی در صفحه اصلی پاپیون اعمال می‌شود.\",\r\n  \"Settings_Personalization_Theme\": \"تم\",\r\n  \"Settings_Personalization_Icon_Title\": \"تغییر آیکون\",\r\n  \"Settings_Personalization_Icon_Description\": \"شخصی‌سازی آیکون برنامه\",\r\n  \"Settings_Personalization_Subject_Title\": \"شخصی‌سازی دروس\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"دروس\",\r\n  \"Settings_Personalization_Subject_Description\": \"آیکون‌ها، رنگ‌ها\",\r\n  \"Settings_About_Papillion_Behind\": \"پشت صحنه پاپیون\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"پاپیون توسط دانشجویان ۱۰۰٪ داوطلب نگهداری می‌شود\",\r\n  \"Settings_About_Discord\": \"سرور دیسکورد\",\r\n  \"Settings_About_Discord_Description\": \"عضویت در سرور دیسکورد\",\r\n  \"Settings_About_Crowdin\": \"پروژه کرودین\",\r\n  \"Settings_About_Crowdin_Description\": \"کمک به ترجمه پاپیون\",\r\n  \"Settings_About_Github\": \"پروژه گیت‌هاب\",\r\n  \"Settings_About_Github_Description\": \"مشارکت در پروژه در گیت‌هاب\",\r\n  \"Settings_About_Issue\": \"گزارش مشکل\",\r\n  \"Settings_About_Issue_Description\": \"گزارش یک باگ مشاهده شده\",\r\n  \"Settings_About_Dependency_Version\": \"نسخه وابستگی‌ها\",\r\n\r\n  \"Alert_No_Technical\": \"هیچ اطلاعات فنی در دسترس نیست.\",\r\n  \"Alert_Auth_Error\": \"خطا در احراز هویت\",\r\n  \"Alert_Auth_Bad_Creds\": \"اطلاعات وارد شده اشتباه است یا سعی داری با حساب والدین وارد شوی. این نوع حساب هنوز توسط پاپیون پشتیبانی نمی‌شود.\",\r\n  \"Alert_Not_Supported\": \"سرور پشتیبانی نمی‌شود\",\r\n  \"Alert_Security_Instance_HTTP\": \"به دلایل امنیتی، پاپیون سرورهایی که هنوز از پروتکل HTTP استفاده می‌کنند را نمی‌پذیرد. توصیه می‌کنیم به مدیر موسسه اطلاع دهی تا آن را به‌روزرسانی کند.\",\r\n  \"Alert_NoDemo\": \"پاپیون برای کار با سرورهای آزمایشی (Demo) ساخته نشده است، لطفاً از سرور واقعی استفاده کن.\",\r\n  \"Alert_Invalid_Instance\": \"پاپیون نمی‌تواند اطلاعات را از این سرور PRONOTE دریافت کند، آیا هنوز معتبر است؟\",\r\n  \"Alert_No_Pos\": \"امکان دریافت موقعیت مکانی وجود ندارد\",\r\n  \"Alert_Connexion_Fail\": \"اتصال برقرار نشد\",\r\n\r\n  \"Feature_Limited\": \"ویژگی‌های محدود\",\r\n  \"Feature_Soon\": \"به‌زودی می‌آید!\",\r\n  \"Feature_Soon_Notification\": \"ما سخت در تلاشیم تا این ویژگی را در آپدیت‌های آینده ارائه دهیم.\",\r\n  \"Feature_Add_Card\": \"یک کارت جدید از تب پروفایل در نوار ناوبری اضافه کن\",\r\n\r\n  \"Webview_Wait\": \"کمی صبور باش...\",\r\n\r\n  \"Profile_QRCards\": \"کد QR و کارت‌ها\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} کارت\",\r\n  \"Profile_Cards_Loading_History\": \"در حال بارگذاری تاریخچه تراکنش‌ها\",\r\n  \"Profile_Cards_Loading_History_Description\": \"این کار ممکن است کمی طول بکشد...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"کارت‌ها\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"سلف، دسترسی\",\r\n  \"Settings_Cards_Banner_Description\": \"کارت‌های سلف و حمل‌ونقل خود را اضافه کن تا همه جا از طریق تلفنت در پاپیون به آن‌ها دسترسی داشته باشی\",\r\n  \"Settings_Cards_None_Title\": \"بدون کارت\",\r\n  \"Settings_Cards_Add_Button\": \"افزودن\",\r\n\r\n  \"Settings_Cards_None_Description\": \"برای مشاهده موجودی سلف، اسکن کد QR و موارد دیگر، یک کارت اضافه کن\",\r\n  \"Settings_Subjects_None_Title\": \"بدون درس\",\r\n  \"Settings_Subjects_None_Description\": \"در تب‌های مختلف برنامه بگرد تا بتوانی دروس را شخصی‌سازی کنی.\",\r\n  \"Settings_Subjects_Reset_Title\": \"بازنشانی\",\r\n  \"Settings_Subjects_Reset_Message\": \"آیا واقعاً می‌خواهی تنظیمات تمام دروس را بازنشانی کنی؟\",\r\n  \"Settings_Subjects_Reset_Button\": \"بازنشانی\",\r\n\r\n  \"Settings_Donator\": \"حامیان\",\r\n  \"Settings_Donator_Description\": \"مشاهده لیست حامیان\",\r\n  \"Settings_App_Version\": \"نسخه اپلیکیشن\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"کد QR را به سمت اسکنر دستگاه بگیر\",\r\n  \"Profile_Cards_No_Reservation\": \"بدون رزرو\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"به نظر می‌رسد امکان رزرو برای این روز وجود ندارد.\",\r\n  \"Profile_Cards_History\": \"تاریخچه\",\r\n  \"Magic_Important\": \"شاید مهم باشد\",\r\n\r\n  \"OnBoarding_Step\": \"مرحله \",\r\n  \"OnBoarding_Step_Of\": \" از \",\r\n\r\n  \"Consent_Advanced_Title\": \"می‌خواهم به پاپیون کمک کنم\",\r\n  \"Consent_Advanced_Description\": \"ما اطلاعات دقیق‌تری درباره نحوه استفاده شما جمع‌آوری می‌کنیم.\",\r\n  \"Consent_Required_Title\": \"فقط موارد ضروری\",\r\n  \"Consent_Required_Description\": \"به طور خلاصه، دانستن اینکه کسی از پاپیون استفاده کرده، آیا همه چیز خوب پیش رفته و از کدام سرویس استفاده می‌کند.\",\r\n  \"Consent_None_Title\": \"هیچ‌چیز\",\r\n  \"Consent_None_Description\": \"ما حتی از وجود شما باخبر نخواهیم شد.\",\r\n  \"Consent_Title\": \"تو و پاپیون\",\r\n  \"Consent_Intro1\": \"برای کمک به رشد پاپیون، می‌توانی برخی اطلاعات استفاده را به اشتراک بگذاری.\",\r\n  \"Consent_PrivacyPolicy\": \"در صورت شک، سیاست حریم خصوصی ما را مطالعه کنید\",\r\n  \"Consent_Refuse\": \"رد کردن\",\r\n  \"Consent_Accept\": \"پذیرفتن\",\r\n  \"Consent_ChangeMind\": \"می‌توانی در هر زمان از تنظیمات برنامه نظرت را تغییر دهی.\",\r\n  \"Consent_Arg1\": \"فقط برای بهبود اپلیکیشن استفاده می‌شود\",\r\n  \"Consent_Arg2\": \"ناشناس و بدون ارتباط با هویت شما\",\r\n  \"Consent_Arg3\": \"ما به حساب‌های شما دسترسی نداریم\",\r\n\r\n  \"Changelog_Title\": \"یادداشت‌های تغییرات\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"تاریخ تحویل\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"دروس\",\r\n  \"Tasks_Sorting_Methods_Done\": \"تکمیل نشده\",\r\n  \"Tasks_ThisWeek\": \"این هفته\",\r\n\r\n  \"Task_Undone\": \"تکمیل نشده\",\r\n  \"Task_Done\": \"تکمیل شده\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"شخصی‌سازی پس‌زمینه\",\r\n  \"Modal_Profile_Title\": \"شخصی‌سازی پروفایل\",\r\n\r\n  \"Modal_Task_Status\": \"وضعیت تکلیف\",\r\n  \"Modal_Task_Description\": \"توضیحات تکلیف\",\r\n  \"Modal_Task_Attachments\": \"پیوست‌ها\",\r\n\r\n  \"Today\": \"امروز\",\r\n  \"Yesterday\": \"دیروز\",\r\n  \"Tomorrow\": \"فردا\"\r\n}"
  },
  {
    "path": "locales/fi.json",
    "content": "{\r\n  \"Global_Back\": \"Takaisin\",\r\n  \"Global_DatePrefix\": \" \",\r\n\r\n  \"Tab_Home\": \"Koti\",\r\n  \"Tab_Calendar\": \"Oppitunnit\",\r\n  \"Tab_Tasks\": \"Tehtävät\",\r\n  \"Tab_Grades\": \"Arvosanat\",\r\n  \"Tab_Profile\": \"Profiili\",\r\n  \"Tab_Custom_Profile\": \"Muokkaa profiilia\",\r\n  \"Button_Change_ProfilePicture\": \"Vaihda profiilikuva\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Ota kuva\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Valitse galleriasta\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Hae koulun järjestelmästä\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Poista kuva\",\r\n  \"Tab_Page\": \"Sivu\",\r\n  \"Tab_Settings\": \"Asetukset\",\r\n  \"Tab_News\": \"Uutiset\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Sovellus kouluelämäsi hallintaan\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Yhdistä koulusovelluksesi nähdäksesi arvosanat, oppitunnit, tehtävät ja paljon muuta Papillon-käyttöliittymässä!\",\r\n  \"ONBOARDING_START_BTN\": \"Aloita\",\r\n  \"ONBOARDING_HELP_BTN\": \"Tarvitsetko apua?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Yliopistopalvelu\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Ruokailupalvelu\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Valitse koulupalvelusi\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Valitse ruokailupalvelusi\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Valitse yliopistopalvelusi\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Miten haluat kirjautua sisään?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Käytä sijaintiani\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Etsi kaupunkia\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Minulla on QR-koodi\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Minulla on kirjautumis-URL\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Valitse oppilaitoksesi\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Kirjoita kaupungin nimi ja valitse oppilaitoksesi\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Kirjaudu sisään kuten yleensä\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Kirjaudu tilillesi\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Valitse tilille määritetty palvelin\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Syötä 4-numeroinen koodi, jonka loit juuri PRONOTE-palvelussa\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Kirjaudutaan palveluun\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Skannaa oppilaitoksesi QR-koodi kirjautuaksesi.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR-koodin vahvistaminen\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Tämä voi kestää hetken...\",\r\n  \"ONBOARDING_URL\": \"Anna oppilaitoksesi URL-osoite\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"PRONOTE-instanssisi URL\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Ennen kuin lopetat\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Valitse\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"teeman väri\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Syötä PRONOTE-palvelun PIN-koodi\",\r\n  \"Onboarding_Load_Webview_Description\": \"Ladataan oppilaitoksesi verkkosivua\",\r\n  \"INPUT_PIN\": \"PIN-koodi\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Etsi palvelinta...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Kirjaudutaan sisään...\",\r\n\r\n  \"WAITING\": \"Odotetaan\",\r\n  \"IZLY_SMS_SEND\": \"Sait juuri kirjautumislinkin, klikkaa sitä ja seuraa ohjeita.\",\r\n  \"STEP\": \"Vaihe\",\r\n  \"STEP_OUTOF\": \"/\",\r\n  \"INPUT_USERNAME\": \"Käyttäjätunnus\",\r\n  \"INPUT_MAIL\": \"Sähköpostiosoite\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Sähköposti tai käyttäjätunnus\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Puhelinnumero tai sähköposti\",\r\n  \"INPUT_PASSWORD\": \"Salasana\",\r\n  \"INPUT_PASSWORD_CODE\": \"Pääsykoodi\",\r\n  \"INPUT_ETABID\": \"Oppilaitoksesi tunniste\",\r\n  \"LOGIN_BTN\": \"Kirjaudu sisään\",\r\n  \"CONFIRM_BTN\": \"Vahvista\",\r\n  \"CANCEL_BTN\": \"Peruuta\",\r\n\r\n  \"Tab_New_Event\": \"Uusi tapahtuma\",\r\n\r\n  \"Tab_Calendar_Icals\": \"iCal-hallinta\",\r\n  \"Tab_Calendar_Icals_Description\": \"Hallitse iCal-osoitteitasi\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Lisää iCal-URL\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Hallitse: {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Lisää tai poista iCal-osoitteita synkronoidaksesi ne lukujärjestyksesi kanssa.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Otsikko puuttuu\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Anna nimi tälle iCal-osoitteelle lisätäksesi sen.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Ei lisättyjä iCal-osoitteita\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Tämä välilehti on työn alla.\",\r\n  \"TabUnderConstruction_Details\": \"Palaa myöhemmin tarkistamaan päivitykset.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Kehittäjätila\",\r\n  \"TabDevModeNotice_Details\": \"Täysi testausympäristö kehittäjille.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Tekniset tiedot\",\r\n\r\n  \"Online_Course\": \"Etäopetus\",\r\n  \"Evaluated_Course\": \"Koe / Arviointi\",\r\n  \"Edited_Course\": \"Muokattu tunti\",\r\n  \"Canceled_Course\": \"Peruttu tunti\",\r\n  \"No_Course_Room\": \"Tuntematon luokka\",\r\n  \"Event_DeleteEvent\": \"Poista tapahtuma\",\r\n  \"Event_Confirm_DeleteEvent\": \"Haluatko varmasti poistaa tämän tapahtuman?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Ruokatunti\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Hyvää ruokahalua!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Nams!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Aamupäivän tauko\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Nukkumaan!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Aamiainen\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Iltapäivän tauko\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Tauko paikallaan!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Välipala-aika!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Iltatauko\",\r\n  \"Course_Separator_Night_Alt_1\": \"Nukkumaan!\",\r\n  \"Course_Separator_Night_Alt_2\": \"On jo yö!\",\r\n\r\n  \"Context_Delete\": \"Poista\",\r\n  \"Context_Cancel\": \"Peruuta\",\r\n  \"Context_Edit\": \"Muokkaa\",\r\n  \"Context_Add\": \"Lisää\",\r\n\r\n  \"Form_Title\": \"Otsikko\",\r\n  \"Form_Location\": \"Sijainti\",\r\n  \"Form_Organizer\": \"Järjestäjä\",\r\n  \"Form_Start\": \"Alkaa\",\r\n  \"Form_End\": \"Päättyy\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Haluatko varmasti poistaa tämän tapahtuman?\",\r\n\r\n  \"Home_Welcome_Name\": \"Hei, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Näytä lisää\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"saatavilla\",\r\n  \"Home_Chats_Plurial\": \"keskustelua\",\r\n  \"Home_Chats_Singular\": \"keskustelu\",\r\n  \"Home_See_All_Tasks\": \"Katso kaikki tehtävät\",\r\n  \"Home_Welcome\": \"Hei!\",\r\n  \"Home_Planned_None\": \"Sinulla ei ole enää tunteja tälle päivälle\",\r\n  \"Home_Planned_One\": \"Sinulla on vielä yksi tunti tänään\",\r\n  \"Home_Planned_Number\": \"Sinulla on vielä {{number}} tuntia tänään\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Seuraavat tunnit\",\r\n  \"Home_Widget_NewGrades\": \"Uudet arvosanat\",\r\n  \"Home_Widget_NewHomeworks\": \"Tehtävät\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Ei tulevia tunteja\",\r\n  \"Home_Widget_NoCourses_Description\": \"Tälle päivälle ei ole suunniteltuja tunteja.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kortit\",\r\n  \"Home_Cards_Button_Description_None\": \"Ei kortteja\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Yksi kortti\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} korttia\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Viestit\",\r\n  \"Home_Chats_Button_Description_None\": \"Ei viestejä\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Yksi viesti\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} viestiä\",\r\n\r\n  \"Home_Attendance_Title\": \"Poissaolot\",\r\n  \"Home_Attendance_Button_Description_None\": \"Ei poissaoloja\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Yksi poissaolo\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} poissaoloa\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Ruokalista\",\r\n  \"Home_Menu_Button_Description\": \"Päivän menu\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Ei tapahtumia\",\r\n  \"Tab_Calendar_Empty_Description\": \"Lisää tapahtuma tai synkronoi lukujärjestyksesi aloittaaksesi.\",\r\n\r\n  \"Modal_Course_Title\": \"Oppituntini\",\r\n  \"Modal_Course_StartsIn\": \"Alkaa kuluttua\",\r\n  \"Modal_Course_StartedAgo\": \"Päättyi\",\r\n  \"Modal_Course_Ongoing\": \"Kestänyt jo\",\r\n  \"Modal_Course_Group\": \"Ryhmä\",\r\n  \"Modal_Course_Group_Full\": \"Luokka\",\r\n\r\n  \"Modal_Course_Details\": \"Tunnin tiedot\",\r\n  \"Modal_Course_Teacher\": \"Opettaja\",\r\n  \"Modal_Course_Room\": \"Luokka\",\r\n  \"Modal_Course_Duration\": \"Kesto\",\r\n\r\n  \"Modal_Course_Time\": \"Tunnin ajat\",\r\n  \"Modal_Course_Start\": \"Alkaa\",\r\n  \"Modal_Course_End\": \"Päättyy\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Etsi tehtäviä\",\r\n  \"Tasks_LeftHomeworks_Title\": \"tehtävää jäljellä\",\r\n  \"Tasks_LeftHomeworks_Time\": \"tällä viikolla\",\r\n  \"Tasks_Done_AllTasks\": \"Kaikki tehtävät\",\r\n  \"Tasks_Done_CompletedTasks\": \"on suoritettu\",\r\n  \"Tasks_Nav_Left\": \"Vielä {{count}} tehtävää tekemättä\",\r\n  \"Tasks_Nav_One\": \"Vielä yksi tehtävä tekemättä\",\r\n  \"Tasks_Nav_Completed\": \"Kaikki valmiina!\",\r\n  \"Tasks_Week\": \"Viikko\",\r\n  \"Tasks_NoTasks_Title\": \"Ei tehtäviä\",\r\n  \"Tasks_NoTasks_Description\": \"Tälle viikolle ei ole suunniteltuja tehtäviä. Nauti vapaasta!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"viikolle {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Ei tehtäviä\",\r\n  \"Task_Start\": \"Tekemättä\",\r\n  \"Task_Complete\": \"Valmis\",\r\n  \"Task_Sorting_Title\": \"Järjestä\",\r\n  \"Task_OnlyShowUndone\": \"Valmiit tehtävät\",\r\n  \"Task_Show_Title\": \"Näytä\",\r\n  \"Settings_General\": \"Yleiset\",\r\n\r\n  \"Latest_Grades\": \"Uudet arvosanat\",\r\n  \"Grades_Search_Placeholder\": \"Etsi arvosanaa tai ainetta\",\r\n\r\n  \"Grades_Avg_Methods\": \"Laskentatavat\",\r\n  \"Grades_Avg_All_Title\": \"Keskiarvo\",\r\n  \"Grades_Avg_All_Short\": \"Keskiarvo\",\r\n  \"Grades_Avg_All_Pond\": \"Painotettu keskiarvo\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Pain. ka.\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Laskee kaikkien arvosanojen painotetun keskiarvon\",\r\n  \"Grades_Avg_Subject_Title\": \"Aineiden keskiarvo\",\r\n  \"Grades_Avg_Subject_Short\": \"Aineiden ka.\",\r\n  \"Grades_Avg_Subject_Description\": \"Laskee ainekohtaisten keskiarvojen painotetun keskiarvon\",\r\n  \"Grades_Avg_Median_Title\": \"Mediaani\",\r\n  \"Grades_Avg_Median_Short\": \"Mediaani\",\r\n\r\n  \"Grades_Avg_More\": \"Lue lisää\",\r\n  \"Grades_Avg_KnowMore\": \"Lue lisää\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Ymmärrä keskiarvon laskentatavat\",\r\n\r\n  \"Grades_SubjectInfo\": \"Tietoa aineesta\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} arvosanaa\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Oppilaan keskiarvo\",\r\n  \"SubjectInfo_Stats_Header\": \"Tilastot\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Luokan keskiarvo\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Luokan yleinen keskiarvo\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Korkein keskiarvo\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Ryhmän paras keskiarvo\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Alhaisin keskiarvo\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Ryhmän alhaisin keskiarvo\",\r\n\r\n  \"Grades_Semester\": \"Lukukausi\",\r\n  \"Grades_Trimester\": \"Jakso\",\r\n  \"Grades_OutPeriod\": \"Kauden ulkopuolella\",\r\n  \"Grades_Year\": \"Vuosi\",\r\n  \"Grades_MockExamBac\": \"Harjoituskoe\",\r\n  \"Grades_MockExamBrevet\": \"Harjoituskoe\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Kaikki aineet\",\r\n  \"Grades_Method_Weighted\": \"Painotus\",\r\n\r\n  \"Grades_Sort\": \"Järjestä\",\r\n  \"Grades_Sorting_Alphabetical\": \"Aakkosjärjestys\",\r\n  \"Grades_Sorting_Averages\": \"Keskiarvot\",\r\n  \"Grades_Sorting_Date\": \"Päivämäärä\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Järjestys\",\r\n  \"Grades_Menu_AverageBy\": \"Keskiarvo\",\r\n  \"NoAverage\": \"Ei keskiarvoa\",\r\n\r\n  \"Grades_Empty_Title\": \"Ei arvosanoja\",\r\n  \"Grades_Empty_Description\": \"Sinulle ei ole vielä annettu arvosanoja tällä kaudella.\",\r\n\r\n  \"Grade_NoDescription\": \"Tehtävä aineessa {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Aineet\",\r\n  \"Grades_Tab_Latest\": \"Uudet arvosanat\",\r\n\r\n  \"Profile_Attendance_Title\": \"Poissaolot\",\r\n  \"Profile_Attendance_Denominator_Single\": \"poissaolo\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"poissaoloa\",\r\n\r\n  \"Profile_Discussions_Title\": \"Keskustelut\",\r\n  \"Profile_Discussions_Denominator_Single\": \"lukematon\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"lukematonta\",\r\n\r\n  \"Profile_News_Title\": \"Uutiset\",\r\n  \"Profile_News_Denominator_Single\": \"uusi\",\r\n  \"Profile_News_Denominator_Plural\": \"uutta\",\r\n  \"Profile_News_Open\": \"Avaa\",\r\n  \"Profile_News_Loading_Title\": \"Ladataan uutisia...\",\r\n  \"Profile_News_Author_Unknown\": \"Tuntematon kirjoittaja\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-koodi ja kortit\",\r\n\r\n  \"Modal_Grades_Title\": \"Arvosanan tiedot\",\r\n  \"Modal_Grades_BestGrade\": \"Ryhmän paras arvosana\",\r\n\r\n  \"Grades_Details_Title\": \"Tiedot\",\r\n  \"Grades_NormalizedGrade_Title\": \"Arvosana asteikolla 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Arvosanan arvo muutettuna 20-asteikolle\",\r\n  \"Grades_HighestGrade_Title\": \"Korkein arvosana\",\r\n  \"Grades_HighestGrade_Description\": \"Ryhmän korkein saavutettu arvosana\",\r\n  \"Grades_LowestGrade_Title\": \"Alhaisin arvosana\",\r\n  \"Grades_LowestGrade_Description\": \"Ryhmän alhaisin saavutettu arvosana\",\r\n  \"Grades_Influence_Title\": \"Vaikutus\",\r\n  \"Grades_Avg_Group_Title\": \"Ryhmän keskiarvo\",\r\n  \"Grades_Coefficient\": \"Kerroin\",\r\n  \"Grades_Avg_Group_Short\": \"Ryhmän ka.\",\r\n  \"Grades_Tab_Rank\": \"Sijoitus\",\r\n  \"Grades_Tab_Rank_Description\": \"Sija ryhmässä\",\r\n\r\n  \"News_Search_Placeholder\": \"Etsi uutisia\",\r\n  \"News_Empty_Title\": \"Ei uutisia\",\r\n  \"News_Empty_Description\": \"Oppilaitoksestasi ei löytynyt uutisia.\",\r\n  \"News_Search_NoResults\": \"Ei uutisia\",\r\n  \"News_Search_NoResults_Description\": \"Haullasi ei löytynyt uutisia.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Pehmeä ja tyylikäs teema\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Lukutila\",\r\n  \"News_Theme_Reading_Description\": \"Lukemiseen suunniteltu teema\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Puuttuvat tunnit\",\r\n  \"Attendance_Hours_Unjustified\": \"Selvittämättömät tunnit\",\r\n  \"Attendance_Missing\": \"Poissaolot\",\r\n  \"Attendance_Delays\": \"Myöhästymiset\",\r\n  \"Attendance_NoReason\": \"Ei syytä\",\r\n  \"Attendance_NoEvent_Title\": \"Ei merkintöjä\",\r\n  \"Attendance_NoEvent_Description\": \"Ei poissaoloja tai myöhästymisiä tällä kaudella.\",\r\n\r\n  \"Settings_Account_Title\": \"Oma tili\",\r\n  \"Settings_Account_Description\": \"Oma tili\",\r\n  \"Settings_Services_Title\": \"Linkitetyt tilit\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Viimeksi käytetty tili\",\r\n  \"Settings_Notifications_Title\": \"Ilmoitukset\",\r\n  \"Settings_Notifications_Description\": \"Hälytykset, tiheys...\",\r\n  \"Settings_Subjects_Title\": \"Aineet\",\r\n  \"Settings_Subjects_Description\": \"Nimi, väri, fontti...\",\r\n  \"Settings_Personalization_Title\": \"Personointi\",\r\n  \"Settings_Personalization_Description\": \"Teemat, värit...\",\r\n  \"Settings_Cards_Title\": \"Kortit\",\r\n  \"Settings_Cards_Description\": \"Ruokala, kulku...\",\r\n  \"Settings_Accessibility_Title\": \"Saavutettavuus\",\r\n  \"Settings_Accessibility_Description\": \"Näyttö, ääni...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Älykkäät toiminnot\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Tekoälytoiminnot\",\r\n  \"Settings_MagicPlus_Enable\": \"Ota Magic+ käyttöön\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimoi automaattisesti tehtävien hallinnan parantaakseen tuottavuutta\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Täysin paikallinen malli, tietoja ei lähetetä laitteesi ulkopuolelle\",\r\n  \"Settings_Donate_Title\": \"Lahjoita\",\r\n  \"Settings_Donate_Description\": \"Tue projektia\",\r\n  \"Settings_Telemetry_Title\": \"Telemetria ja yksityisyys\",\r\n  \"Settings_Telemetry_Description\": \"Hallitse kerättyjä tietoja\",\r\n  \"Settings_About_Title\": \"Tietoa\",\r\n  \"Settings_About_Description\": \"Versio\",\r\n  \"Settings_Logout_Title\": \"Kirjaudu ulos\",\r\n  \"Settings_Logout_Description\": \"Poista tämä tili Papillonista\",\r\n  \"Settings_Language_Title\": \"Kieli\",\r\n  \"Settings_Language_Description\": \"Vaihda kieli\",\r\n  \"Settings_Tabs_Title\": \"Välilehdet\",\r\n  \"Settings_Tabs_Description\": \"Piilota välilehtiä valikosta\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personointi\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Teemat, aineet...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Muokkaa aineita\",\r\n  \"Settings_Personalization_Accent\": \"Tehosteväri\",\r\n  \"Settings_Personalization_Accent_Description\": \"Tässä valitsemasi väri näkyy Papillonin etusivulla.\",\r\n  \"Settings_Personalization_Theme\": \"Teema\",\r\n  \"Settings_Personalization_Icon_Title\": \"Vaihda kuvake\",\r\n  \"Settings_Personalization_Icon_Description\": \"Muokkaa sovelluksen kuvaketta\",\r\n  \"Settings_Personalization_Subject_Title\": \"Muokkaa aineita\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Aineet\",\r\n  \"Settings_Personalization_Subject_Description\": \"Kuvakkeet, värit\",\r\n  \"Settings_About_Papillion_Behind\": \"Papillonin takana\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillonia ylläpitävät 100 % vapaaehtoiset opiskelijat\",\r\n  \"Settings_About_Discord\": \"Discord-palvelin\",\r\n  \"Settings_About_Discord_Description\": \"Liity Discord-palvelimelle\",\r\n  \"Settings_About_Crowdin\": \"Crowdin-projekti\",\r\n  \"Settings_About_Crowdin_Description\": \"Auta kääntämään Papillon\",\r\n  \"Settings_About_Github\": \"GitHub-projekti\",\r\n  \"Settings_About_Github_Description\": \"Osallistu kehitykseen GitHubissa\",\r\n  \"Settings_About_Issue\": \"Ilmoita virheestä\",\r\n  \"Settings_About_Issue_Description\": \"Raportoi kohtaamastasi ongelmasta\",\r\n  \"Settings_About_Dependency_Version\": \"Riippuvuuksien versio\",\r\n\r\n  \"Alert_No_Technical\": \"Teknisiä tietoja ei ole saatavilla.\",\r\n  \"Alert_Auth_Error\": \"Todennusvirhe\",\r\n  \"Alert_Auth_Bad_Creds\": \"Syöttämäsi tiedot ovat virheelliset tai yrität kirjautua vanhemman tilillä. Papillon ei vielä tue tätä tilityyppiä.\",\r\n  \"Alert_Not_Supported\": \"Instanssia ei tueta\",\r\n  \"Alert_Security_Instance_HTTP\": \"Turvallisuussyistä Papillon ei hyväksy instansseja, jotka käyttävät yhä HTTP-protokollaa. Suosittelemme ilmoittamaan asiasta koulun johdolle, jotta instanssi voidaan päivittää.\",\r\n  \"Alert_NoDemo\": \"Papillonia ei ole tarkoitettu käytettäväksi demotilien kanssa, käytäthän oikeaa tiliä.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon ei saa tietoja tästä PRONOTE-instanssista, onkohan se vielä voimassa?\",\r\n  \"Alert_No_Pos\": \"Sijaintia ei voitu hakea\",\r\n  \"Alert_Connexion_Fail\": \"Yhteys epäonnistui\",\r\n\r\n  \"Feature_Limited\": \"Rajoitetut toiminnot\",\r\n  \"Feature_Soon\": \"Tulossa pian!\",\r\n  \"Feature_Soon_Notification\": \"Teemme kovasti töitä tuodaksemme tämän toiminnon tulevassa päivityksessä.\",\r\n  \"Feature_Add_Card\": \"Lisää uusi kortti navigointipalkin Profiili-välilehdeltä\",\r\n\r\n  \"Webview_Wait\": \"Hetki pieni...\",\r\n\r\n  \"Profile_QRCards\": \"QR-koodi ja kortit\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} korttia\",\r\n  \"Profile_Cards_Loading_History\": \"Ladataan tapahtumahistoriaa\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Tämä voi kestää hetken...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kortit\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Ruokala, kulku\",\r\n  \"Settings_Cards_Banner_Description\": \"Lisää ruokala- ja matkakorttisi käyttääksesi niitä missä vain puhelimellasi\",\r\n  \"Settings_Cards_None_Title\": \"Ei kortteja\",\r\n  \"Settings_Cards_Add_Button\": \"Lisää\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Lisää kortti nähdäksesi ruokalan saldon, skannataksesi QR-koodin ja paljon muuta\",\r\n  \"Settings_Subjects_None_Title\": \"Ei aineita\",\r\n  \"Settings_Subjects_None_Description\": \"Selaa sovelluksen eri välilehtiä voidaksesi muokata aineita.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Nollaa\",\r\n  \"Settings_Subjects_Reset_Message\": \"Haluatko varmasti nollata kaikki aineet?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Nollaa\",\r\n\r\n  \"Settings_Donator\": \"Lahjoittajat\",\r\n  \"Settings_Donator_Description\": \"Katso lahjoittajalista\",\r\n  \"Settings_App_Version\": \"Sovellusversio\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Suuntaa QR-koodi lukijaa kohti\",\r\n  \"Profile_Cards_No_Reservation\": \"Ei varausta\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Vaikuttaa siltä, ettet voi varata tälle päivälle.\",\r\n  \"Profile_Cards_History\": \"Historia\",\r\n  \"Magic_Important\": \"Saattaa olla tärkeää\",\r\n\r\n  \"OnBoarding_Step\": \"Vaihe \",\r\n  \"OnBoarding_Step_Of\": \"/ \",\r\n\r\n  \"Consent_Advanced_Title\": \"Haluan auttaa Papillonia\",\r\n  \"Consent_Advanced_Description\": \"Keräämme tarkempaa tietoa sovelluksen käytöstäsi.\",\r\n  \"Consent_Required_Title\": \"Vain välttämätön\",\r\n  \"Consent_Required_Description\": \"Pähkinänkuoressa: tieto siitä, että joku käytti sovellusta, toimiko se ja mitä palvelua käytetään.\",\r\n  \"Consent_None_Title\": \"Ei mitään\",\r\n  \"Consent_None_Description\": \"Emme tiedä edes olemassaolostasi.\",\r\n  \"Consent_Title\": \"Sinä ja Papillon\",\r\n  \"Consent_Intro1\": \"Auttaaksesi Papillonia kasvamaan, voit valita joidenkin käyttötietojen jakamisen.\",\r\n  \"Consent_PrivacyPolicy\": \"Epäselvissä tapauksissa tutustu tietosuojaselosteeseemme\",\r\n  \"Consent_Refuse\": \"Kieltäydy\",\r\n  \"Consent_Accept\": \"Hyväksy\",\r\n  \"Consent_ChangeMind\": \"Voit muuttaa mieltäsi milloin vain sovelluksen asetuksista.\",\r\n  \"Consent_Arg1\": \"Käytetään vain sovelluksen parantamiseen\",\r\n  \"Consent_Arg2\": \"Anonyymi eikä yhdistetä henkilöllisyyteesi\",\r\n  \"Consent_Arg3\": \"Meillä ei ole pääsyä tileihisi\",\r\n\r\n  \"Changelog_Title\": \"Päivitystiedot\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Palautuspäivä\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Aineet\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Keskeneräiset\",\r\n  \"Tasks_ThisWeek\": \"Tällä viikolla\",\r\n\r\n  \"Task_Undone\": \"Keskeneräinen\",\r\n  \"Task_Done\": \"Valmis\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Muokkaa taustakuvaa\",\r\n  \"Modal_Profile_Title\": \"Muokkaa profiilia\",\r\n\r\n  \"Modal_Task_Status\": \"Tehtävän tila\",\r\n  \"Modal_Task_Description\": \"Tehtävän kuvaus\",\r\n  \"Modal_Task_Attachments\": \"Liitteet\",\r\n\r\n  \"Today\": \"Tänään\",\r\n  \"Yesterday\": \"Eilen\",\r\n  \"Tomorrow\": \"Huomenna\"\r\n}"
  },
  {
    "path": "locales/fr.json",
    "content": "{\n  \"Global_Back\": \"Retour\",\n  \"Global_DatePrefix\": \"le\",\n  \"Global_Recommended\": \"Recommandé\",\n\n  \"Tab_Home\": \"Accueil\",\n  \"Tab_Calendar\": \"Cours\",\n  \"Tab_Tasks\": \"Tâches\",\n  \"Tab_Grades\": \"Notes\",\n  \"Tab_Profile\": \"Profil\",\n  \"Tab_Custom_Profile\": \"Modifier mon profil\",\n  \"Button_Change_ProfilePicture\": \"Changer la photo de profil\",\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Prendre une photo\",\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Depuis la photothèque\",\n  \"Button_Change_ProfilePicture_FromService\": \"Récupérer depuis ton ENT\",\n  \"Button_Change_ProfilePicture_Remove\": \"Supprimer la photo\",\n  \"Tab_Page\": \"Page\",\n  \"Tab_Settings\": \"Paramètres\",\n  \"Tab_News\": \"Actualités\",\n  \"Modal_Soon\": \"Bientôt disponible\",\n\n  \"ONBOARDING_MAIN_TITLE\": \"L'application pour gérer ta vie scolaire\",\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Connecte tes applications scolaires pour accéder à tes notes, cours, devoirs et bien plus dans l'interface Papillon !\",\n  \"ONBOARDING_START_BTN\": \"Commencer\",\n  \"ONBOARDING_HELP_BTN\": \"Besoin d'aide ?\",\n  \"ONBOARDING_UNIVERSITY\": \"Service universitaire\",\n  \"ONBOARDING_RESTAURANTS\": \"Service de restauration\",\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Sélectionne ton service scolaire\",\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Sélectionne ton service de restauration\",\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Sélectionne ton service universitaire\",\n  \"ONBOARDING_LOGIN_METHOD\": \"Comment souhaites-tu te connecter ?\",\n  \"ONBOARDING_METHOD_POSITION\": \"Utiliser ma position\",\n  \"ONBOARDING_METHOD_SEARCH\": \"Rechercher une ville\",\n  \"ONBOARDING_METHOD_QRCODE\": \"J'ai un QR-Code\",\n  \"ONBOARDING_METHOD_LINK\": \"J'ai une URL de connexion\",\n  \"ONBOARDING_SELECT_SCHOOL\": \"Choisis ton établissement\",\n  \"ONBOARDING_SEARCH_TITLE\": \"Entre le nom de ta ville et choisis ton établissement\",\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Connecte-toi comme tu en as l'habitude\",\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Connecte-toi à ton compte\",\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Choisis l'hôte assigné au compte\",\n  \"ONBOARDING_PRONOTE_PIN\": \"Indique le code à 4 chiffres que tu viens de créer sur PRONOTE\",\n  \"ONBOARDING_LOGIN_TO\": \"Connexion à\",\n  \"ONBOARDING_SCAN_QRCODE\": \"Scanne le QR-Code de ton établissement pour te connecter.\",\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validation du QR-Code\",\n  \"ONBOARDING_QRCODE_WAIT\": \"Cela peut prendre quelques instants...\",\n  \"ONBOARDING_URL\": \"Indique l’adresse URL de ton établissement\",\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL de ton instance PRONOTE\",\n  \"ONBOARDING_COLOR_TITLE\": \"Avant de terminer\",\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Choisis une\",\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"couleur de thème\",\n  \"ONBOARDING_LOGIN_PINCODE\": \"Entre le Code PIN de ton PRONOTE\",\n  \"Onboarding_Load_Webview_Description\": \"Nous chargeons le site de ton établissement\",\n  \"INPUT_PIN\": \"Code PIN\",\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Rechercher une instance...\",\n  \"ONBOARDING_LOADING_LOGIN\": \"Connexion en cours...\",\n  \"ONBOARDING_LOADING\": \"Chargement...\",\n  \"ONBOARDING_WELCOME_DESCRIPTION\": \"L'application ultime pour gérer toute ta vie scolaire sans compromis.\",\n  \"ONBOARDING_WELCOME_LOGIN_WITH\": \"Se connecter avec\",\n  \"ONBOARDING_WELCOME_LEGAL\": \"En continuant, vous acceptez les conditions d’utilisation ainsi que la politique de confidentialité.\",\n  \"ONBOARDING_AGE_TITLE\": \"Qui est-tu ?\",\n  \"ONBOARDING_AGE_DESCRIPTION\": \"Sélectionne ton niveau scolaire\",\n  \"ONBOARDING_LEVEL_MIDDLE_SCHOOL\": \"Collégien\",\n  \"ONBOARDING_LEVEL_HIGH_SCHOOL\": \"Lycéen\",\n  \"ONBOARDING_LEVEL_UNIVERSITY\": \"Étudiant\",\n  \"ONBOARDING_LEVEL_PARENT\": \"Parent d'élève\",\n  \"ONBOARDING_LEVEL_TEACHER\": \"Professeur\",\n  \"ONBOARDING_CONTINUE\": \"Continuer\",\n  \"ONBOARDING_CANCEL\": \"Annuler\",\n  \"ONBOARDING_SERVICE_SELECTION_TITLE_UNIV\": \"Quel service souhaites-tu utiliser ?\",\n  \"ONBOARDING_SERVICE_SELECTION_TITLE_SCHOOL\": \"Quelle application utilises-tu habituellement ?\",\n  \"ONBOARDING_SERVICE_SELECTION_DESCRIPTION\": \"Sélectionne le service que tu as l’habitude d’utiliser dans ton établissement.\",\n  \"ONBOARDING_UNSUPPORTED_TITLE\": \"Papillon n'est pas encore disponible pour vous.\",\n  \"ONBOARDING_UNSUPPORTED_DESCRIPTION\": \"Les comptes parents et professeurs ne sont pas compatibles avec Papillon pour le moment.\",\n  \"ONBOARDING_RESTAURANT_SELECTION_TITLE\": \"Quel est ton service de cantine ?\",\n  \"ONBOARDING_HEADER_ABOUTYOU\": \"À propos de toi\",\n  \"ONBOARDING_HEADER_SCHOOLSERVICE\": \"Service scolaire\",\n  \"ONBOARDING_HEADER_LOCATION_SEARCH\": \"Recherche de l'emplacement\",\n  \"ONBOARDING_HEADER_SCHOOLS\": \"Établissements\",\n  \"ONBOARDING_HEADER_SCHOOL_URL\": \"URL de l'établissement\",\n  \"ONBOARDING_HEADER_ENT_LOGIN\": \"Connexion par ENT\",\n  \"ONBOARDING_HEADER_QRCODE_LOGIN\": \"Connexion par QR-Code\",\n  \"ONBOARDING_HEADER_ED_LOGIN\": \"Connexion via ÉcoleDirecte\",\n  \"ONBOARDING_HEADER_SKOLENGO_LOGIN\": \"Connexion via Skolengo\",\n  \"ONBOARDING_HEADER_UNIVERSITY_LOGIN\": \"Connexion universitaire\",\n  \"ONBOARDING_PRONOTE_LOCATION_HELP\": \"Pour te connecter, nous avons besoin de l'emplacement de ton établissement.\",\n  \"ONBOARDING_SEARCH_SCHOOL_PLACEHOLDER\": \"Rechercher un établissement\",\n  \"ONBOARDING_SCHOOLS_SEARCHING\": \"Recherche des établissements...\",\n  \"ONBOARDING_SCHOOLS_SEARCHING_HINT\": \"Cela peut prendre quelques secondes.\",\n  \"ONBOARDING_SCHOOLS_IN_CITY\": \"Établissements à {{city}}\",\n  \"ONBOARDING_PRONOTE_LOGIN_QRCODE\": \"Me connecter avec un QR code\",\n  \"ONBOARDING_PRONOTE_LOGIN_QRCODE_DESCRIPTION\": \"Utiliser un QR code généré sur Pronote\",\n  \"ONBOARDING_PRONOTE_LOGIN_URL\": \"Me connecter avec une URL\",\n  \"ONBOARDING_LOGIN_TO_SERVICE\": \"Connexion au service\",\n  \"ONBOARDING_YOUR_SCHOOL\": \"ton établissement\",\n  \"ONBOARDING_UNKNOWN_SERVICE\": \"Service inconnu\",\n  \"ONBOARDING_THIS_SERVICE\": \"ce service\",\n  \"ONBOARDING_LOGIN_DISCLAIMER\": \"Papillon n’est pas affilié à {{service}}. Votre mot de passe n’est pas lu ou conservé par Papillon.\",\n  \"ONBOARDING_LOGIN_HELP_ACTION\": \"Problèmes de connexion ?\",\n  \"ONBOARDING_LOGIN_HELP_TITLE\": \"Aide à la connexion\",\n  \"ONBOARDING_LOGIN_HELP_DESCRIPTION\": \"Si vous rencontrez des problèmes pour vous connecter, veuillez contacter le support de votre service ou vérifier vos identifiants.\",\n  \"ONBOARDING_ERROR\": \"Erreur\",\n  \"ONBOARDING_REQUIRED_FIELDS\": \"Champs requis\",\n  \"ONBOARDING_FILL_ALL_FIELDS\": \"Veuillez remplir tous les champs\",\n  \"ONBOARDING_APPSCHO_INSTANCE_NOT_FOUND\": \"Instance non trouvée\",\n  \"ONBOARDING_ALERT_LOGIN_ABORTED\": \"Une erreur est survenue lors de la connexion, elle a donc été abandonnée.\",\n  \"ONBOARDING_ALERT_OAUTH_LOGIN_ABORTED\": \"Une erreur est survenue lors de la connexion OAuth.\",\n  \"ONBOARDING_ALERT_BAD_CREDENTIALS_PRONOTE\": \"Nous n’avons pas réussi à te connecter à ton compte Pronote. Vérifie ton identifiant et ton mot de passe puis essaie de nouveau.\",\n  \"ONBOARDING_ALERT_BAD_CREDENTIALS_TURBOSELF\": \"Nous n’avons pas réussi à te connecter à ton compte TurboSelf. Vérifie ton identifiant et ton mot de passe puis essaie de nouveau.\",\n  \"ONBOARDING_ALERT_ALISE_LOGIN_ABORTED\": \"Une erreur est survenue lors de la connexion à Alise, elle a donc été abandonnée.\",\n  \"ONBOARDING_SMS_SENT_TITLE\": \"SMS envoyé\",\n  \"ONBOARDING_IZLY_SMS_SENT_DESCRIPTION\": \"Un SMS de vérification a été envoyé à ton numéro de téléphone. Merci de cliquer sur le lien présent dans ce SMS pour finaliser la connexion.\",\n  \"ONBOARDING_ALERT_NO_POSITION_DESCRIPTION\": \"Nous n'avons pas pu récupérer ta position. Vérifie que le mode avion est désactivé et que l'application dispose des autorisations nécessaires.\",\n  \"ONBOARDING_LANNION_ANDROID_TITLE\": \"Lannion n'est pas encore disponible sur Android\",\n  \"ONBOARDING_LANNION_ANDROID_DESCRIPTION\": \"On travaille dur pour rendre les librairies nécessaires disponibles sur Android.\",\n  \"ONBOARDING_UNKNOWN_NAME\": \"Inconnu\",\n  \"ONBOARDING_UNKNOWN_STUDENT\": \"Étudiant\",\n  \"ONBOARDING_DEFAULT_USER_FIRSTNAME\": \"Utilisateur\",\n  \"ONBOARDING_DOUBLE_AUTH\": \"Double authentification\",\n  \"ONBOARDING_OTHER_UNIVERSITIES\": \"Autres universités\",\n  \"ONBOARDING_SERVICE_PRONOTE\": \"PRONOTE\",\n  \"ONBOARDING_SERVICE_ED\": \"ÉcoleDirecte\",\n  \"ONBOARDING_SERVICE_SKOLENGO\": \"Skolengo\",\n  \"ONBOARDING_SERVICE_LANNION\": \"IUT de Lannion\",\n  \"ONBOARDING_SERVICE_UNIV_LORRAINE\": \"Université de Lorraine\",\n  \"ONBOARDING_SERVICE_UNIV_NIMES\": \"Université de Nîmes\",\n  \"ONBOARDING_SERVICE_UNIV_UPHF\": \"Université Polytechnique Hauts-de-France\",\n  \"ONBOARDING_SERVICE_TURBOSELF\": \"TurboSelf\",\n  \"ONBOARDING_SERVICE_ARD\": \"ARD\",\n  \"ONBOARDING_SERVICE_IZLY\": \"Izly\",\n  \"ONBOARDING_SERVICE_ALISE\": \"Alise\",\n\n  \"WAITING\": \"En attente\",\n  \"IZLY_SMS_SEND\": \"Tu viens de recevoir un lien pour te connecter, clique dessus et suis les étapes.\",\n  \"STEP\": \"Étape\",\n  \"STEP_OUTOF\": \"sur\",\n  \"INPUT_USERNAME\": \"Nom d'utilisateur\",\n  \"INPUT_MAIL\": \"Adresse e-mail\",\n  \"INPUT_MAIL_OR_USERNAME\": \"Adresse e-mail ou nom d'utilisateur\",\n  \"INPUT_PHONE_OR_MAIL\": \"Numéro de téléphone ou adresse e-mail\",\n  \"INPUT_PASSWORD\": \"Mot de passe\",\n  \"INPUT_PASSWORD_CODE\": \"Code d'accès\",\n  \"INPUT_ETABID\": \"Identifiant de ton établissement\",\n  \"LOGIN_BTN\": \"Se connecter\",\n  \"CONFIRM_BTN\": \"Confirmer\",\n  \"CANCEL_BTN\": \"Annuler\",\n\n  \"Tab_New_Event\": \"Nouvel événement\",\n\n  \"Tab_Calendar_Icals\": \"Gestion des iCal\",\n  \"Tab_Calendar_Icals_Description\": \"Gérer tes URL iCal\",\n\n  \"Tab_Calendar_Icals_Add_URL\": \"Ajouter une URL iCal\",\n  \"Tab_Calendar_Icals_Manage_Title\": \"Gérer {{title}}\",\n  \"Tab_Calendar_Icals_Manage_Description\": \"Ajouter ou supprimer des URL iCal à synchroniser avec ton calendrier.\",\n  \"Tab_Calendar_Icals_Add_Title\": \"Titre manquant\",\n  \"Tab_Calendar_Icals_Add_Description\": \"Donne un nom à cette URL iCal pour l'ajouter.\",\n  \"Tab_Calendar_Icals_Empty\": \"Aucune URL iCal ajoutée\",\n\n  \"TabUnderConstruction_Title\": \"Cet onglet est en construction.\",\n  \"TabUnderConstruction_Details\": \"Reviens plus tard pour des mises à jour.\",\n\n  \"TabDevModeNotice_Title\": \"Mode Développement\",\n  \"TabDevModeNotice_Details\": \"Environnement de test complet pour les développeurs.\",\n\n  \"Alert_TechnicalDetails\": \"Détails techniques\",\n\n  \"Online_Course\": \"En ligne\",\n  \"Evaluated_Course\": \"Évaluation\",\n  \"Edited_Course\": \"Cours modifié\",\n  \"Canceled_Course\": \"Cours annulé\",\n  \"No_Course_Room\": \"Salle inconnue\",\n  \"Event_DeleteEvent\": \"Supprimer l'événement\",\n  \"Event_Confirm_DeleteEvent\": \"Es-tu sûr de vouloir supprimer cet événement ?\",\n\n  \"Course_Separator_Lunch_Default\": \"Pause méridienne\",\n  \"Course_Separator_Lunch_Alt_1\": \"Bon appétit !\",\n  \"Course_Separator_Lunch_Alt_2\": \"Miam !\",\n\n  \"Course_Separator_Morning_Default\": \"Pause matinale\",\n  \"Course_Separator_Morning_Alt_1\": \"Au dodo !\",\n  \"Course_Separator_Morning_Alt_2\": \"Petit déjeuner\",\n\n  \"Course_Separator_Evening_Default\": \"Pause de l'après-midi\",\n  \"Course_Separator_Evening_Alt_1\": \"Une pause s'impose !\",\n  \"Course_Separator_Evening_Alt_2\": \"Heure du goûter !\",\n\n  \"Course_Separator_Night_Default\": \"Pause du soir\",\n  \"Course_Separator_Night_Alt_1\": \"Au dodo !\",\n  \"Course_Separator_Night_Alt_2\": \"Il fait nuit !\",\n\n  \"Context_Delete\": \"Supprimer\",\n  \"Context_Cancel\": \"Annuler\",\n  \"Context_Edit\": \"Modifier\",\n  \"Context_Add\": \"Ajouter\",\n\n  \"Form_Title\": \"Titre\",\n  \"Form_Location\": \"Emplacement\",\n  \"Form_Organizer\": \"Organisateur\",\n  \"Form_Start\": \"Début\",\n  \"Form_End\": \"Fin\",\n\n  \"Confirm_DeleteEvent\": \"Es-tu sûr de vouloir supprimer cet événement ?\",\n\n  \"Home_Welcome_Name\": \"Bonjour, {{name}} {{emoji}}\",\n  \"Home_Display_More\": \"Afficher plus\",\n  \"Home_Cards_Button_Description_Plurial\": \"disponibles\",\n  \"Home_Chats_Plurial\": \"discussions\",\n  \"Home_Chats_Singular\": \"discussion\",\n  \"Home_See_All_Tasks\": \"Voir toutes les tâches\",\n  \"Home_Welcome\": \"Bonjour !\",\n  \"Home_Planned_None\": \"Tu n'as aucun cours restant de prévu aujourd'hui\",\n  \"Home_Planned_One\": \"Tu as un cours restant aujourd'hui\",\n  \"Home_Planned_Number\": \"Tu as {{number}} cours restants aujourd'hui\",\n\n  \"Home_Widget_NextCourses\": \"Prochains cours\",\n  \"Home_Widget_NewGrades\": \"Nouvelles notes\",\n  \"Home_Widget_NewHomeworks\": \"Tâches à faire\",\n  \"Home_Widget_Grades_Average\": \"Moyenne\",\n\n  \"Home_Widget_NoCourses\": \"Aucun cours à venir\",\n  \"Home_Widget_NoCourses_Description\": \"Il n'y a pas de cours prévus pour aujourd'hui.\",\n\n  \"Home_Cards_Button_Title\": \"Cartes\",\n  \"Home_Cards_Button_Description_None\": \"Aucune carte\",\n  \"Home_Cards_Button_Description_Singular\": \"Une carte\",\n  \"Home_Cards_Button_Description_Number\": \"{{number}} cartes\",\n\n  \"Home_Chats_Button_Title\": \"Messages\",\n  \"Home_Chats_Button_Description_None\": \"Aucun message\",\n  \"Home_Chats_Button_Description_Singular\": \"Un message\",\n  \"Home_Chats_Button_Description_Number\": \"{{number}} messages\",\n\n  \"Home_Attendance_Title\": \"Absences\",\n  \"Home_Attendance_Button_Description_None\": \"Aucune absence\",\n  \"Home_Attendance_Button_Description_Singular\": \"Une absence\",\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} absences\",\n\n  \"Home_Menu_Button_Title\": \"Menu\",\n  \"Home_Menu_Button_Description\": \"Menu du jour\",\n\n  \"Home_Release_Notes_Banner\": \"Nouveautés de la version {{version}}\",\n  \"Home_Release_Notes_Banner_Description\": \"Découvre les dernières améliorations et corrections de bugs.\",\n\n  \"Tab_Calendar_Empty\": \"Aucun événement trouvé\",\n  \"Tab_Calendar_Empty_Description\": \"Ajoute un événement ou synchronise ton calendrier pour commencer.\",\n\n  \"Modal_Course_Title\": \"Mon cours\",\n  \"Modal_Course_StartsIn\": \"Commence dans\",\n  \"Modal_Course_StartedAgo\": \"Terminé il y a\",\n  \"Modal_Course_Ongoing\": \"Commencé depuis\",\n  \"Modal_Course_Group\": \"Groupe\",\n  \"Modal_Course_Group_Full\": \"Classe\",\n\n  \"Modal_Course_Details\": \"Détails du cours\",\n  \"Modal_Course_Teacher\": \"Enseignant\",\n  \"Modal_Course_Room\": \"Salle\",\n  \"Modal_Course_Duration\": \"Durée\",\n\n  \"Modal_Course_Time\": \"Horaires du cours\",\n  \"Modal_Course_Start\": \"Début\",\n  \"Modal_Course_End\": \"Fin\",\n\n  \"Tasks_Search_Placeholder\": \"Rechercher des tâches\",\n  \"Tasks_LeftHomeworks_Title\": \"tâches restantes\",\n  \"Tasks_LeftHomeworks_Time\": \"cette semaine\",\n  \"Tasks_Done_AllTasks\": \"Toutes les tâches\",\n  \"Tasks_Done_CompletedTasks\": \"ont été complétées\",\n  \"Tasks_Nav_Left\": \"Encore {{count}} tâche(s) à faire\",\n  \"Tasks_Nav_One\": \"Plus qu'une tâche à faire\",\n  \"Tasks_Nav_Completed\": \"Tout est terminé !\",\n  \"Tasks_Week\": \"Semaine\",\n  \"Tasks_NoTasks_Title\": \"Aucune tâche\",\n  \"Tasks_NoTasks_Description\": \"Il n'y a pas de tâches prévues pour cette semaine. Profite-en pour te reposer !\",\n  \"Tasks_NoTasks_ForWeek\": \"pour la semaine {{week}}\",\n  \"Tasks_NoTasks_Nav\": \"Aucune tâche\",\n  \"Task_Start\": \"À faire\",\n  \"Task_Complete\": \"Terminé\",\n  \"Task_Sorting_Title\": \"Trier par\",\n  \"Task_OnlyShowUndone\": \"Tâches terminées\",\n  \"Task_Show_Title\": \"Afficher\",\n  \"Settings_General\": \"Général\",\n\n  \"Latest_Grades\": \"Nouvelles notes\",\n  \"Grades_Search_Placeholder\": \"Rechercher une note, une matière\",\n\n  \"Grades_Avg_Methods\": \"Méthodes de calcul\",\n  \"Grades_Avg_All_Title\": \"Moyenne générale\",\n  \"Grades_Avg_All_Short\": \"Moy. générale\",\n  \"Grades_Avg_All_Pond\": \"Moyenne pondérée\",\n  \"Grades_Avg_All_Pond_Short\": \"Moy. pondérée\",\n  \"Grades_Avg_All_Pond_Description\": \"Calcule la moyenne pondérée de toutes les notes\",\n  \"Grades_Avg_Subject_Title\": \"Moyenne des matières\",\n  \"Grades_Avg_Subject_Short\": \"Moy. matières\",\n  \"Grades_Avg_Subject_Description\": \"Calcule la moyenne pondérée des moyennes de matières\",\n  \"Grades_Avg_Median_Title\": \"Médiane\",\n  \"Grades_Avg_Median_Short\": \"Médiane\",\n\n  \"Grades_Avg_More\": \"En savoir plus\",\n  \"Grades_Avg_KnowMore\": \"En savoir plus\",\n  \"Grades_Avg_KnowMore_Description\": \"Comprendre les méthodes de calcul de la moyenne générale\",\n\n  \"Grades_SubjectInfo\": \"Informations sur la matière\",\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} note(s)\",\n  \"SubjectInfo_StudentAverage_Label\": \"Moyenne de l'élève\",\n  \"SubjectInfo_Stats_Header\": \"Statistiques\",\n  \"SubjectInfo_ClassAverage_Label\": \"Moyenne de classe\",\n  \"SubjectInfo_ClassAverage_Description\": \"Moyenne générale de la classe\",\n  \"SubjectInfo_MaxAverage_Label\": \"Moyenne maximale\",\n  \"SubjectInfo_MaxAverage_Description\": \"Meilleure moyenne du groupe\",\n  \"SubjectInfo_MinAverage_Label\": \"Moyenne minimale\",\n  \"SubjectInfo_MinAverage_Description\": \"Moyenne la plus faible du groupe\",\n\n  \"Grades_Semester\": \"Semestre\",\n  \"Grades_Trimester\": \"Trimestre\",\n  \"Grades_OutPeriod\": \"Hors période\",\n  \"Grades_Year\": \"Année\",\n  \"Grades_MockExamBac\": \"Bac blanc\",\n  \"Grades_MockExamBrevet\": \"Brevet blanc\",\n\n  \"Grades_Method_AllGrades\": \"Toutes les matières\",\n  \"Grades_Method_Weighted\": \"Pondération\",\n\n  \"Grades_Sort\": \"Trier\",\n  \"Grades_Sorting_Alphabetical\": \"Alphabétique\",\n  \"Grades_Sorting_Averages\": \"Moyennes\",\n  \"Grades_Sorting_Date\": \"Date\",\n\n  \"Grades_Menu_SortBy\": \"Tri par\",\n  \"Grades_Menu_AverageBy\": \"Moyenne par\",\n  \"NoAverage\": \"Aucune moyenne\",\n\n  \"Grades_Empty_Title\": \"Aucune note\",\n  \"Grades_Empty_Description\": \"Tu n'as pas encore été noté sur cette période.\",\n\n  \"Grade_NoDescription\": \"Devoir de {{subject}}\",\n\n  \"Grades_Tab_Subjects\": \"Matières\",\n  \"Grades_Tab_Latest\": \"Nouvelles notes\",\n\n  \"Profile_Attendance_Title\": \"Assiduité\",\n  \"Profile_Attendance_Denominator_Single\": \"absence\",\n  \"Profile_Attendance_Denominator_Plural\": \"absences\",\n\n  \"Profile_Discussions_Title\": \"Discussions\",\n  \"Profile_Discussions_Denominator_Single\": \"non lu\",\n  \"Profile_Discussions_Denominator_Plural\": \"non lus\",\n\n  \"Profile_News_Title\": \"Actualités\",\n  \"Profile_News_Denominator_Single\": \"nouveau\",\n  \"Profile_News_Denominator_Plural\": \"nouvelles\",\n  \"Profile_News_Open\": \"Ouvrir\",\n  \"Profile_News_Loading_Title\": \"Chargement des actualités...\",\n  \"Profile_News_Author_Unknown\": \"Auteur inconnu\",\n\n  \"Profile_Cards_Title\": \"QR-Code et cartes\",\n\n  \"Modal_Grades_Title\": \"Détail de la note\",\n  \"Modal_Grades_BestGrade\": \"Meilleure note du groupe\",\n\n  \"Modal_Grades_OptionalGrade\": \"Note optionnelle\",\n  \"Modal_Grades_BonusGrade\": \"Note bonus\",\n\n  \"Grades_Details_Title\": \"Détails\",\n  \"Grades_NormalizedGrade_Title\": \"Note ramenée sur 20\",\n  \"Grades_NormalizedGrade_Description\": \"Valeur de la note convertie sur une échelle de 20\",\n  \"Grades_HighestGrade_Title\": \"Note la plus haute\",\n  \"Grades_HighestGrade_Description\": \"Note maximale obtenue dans le groupe\",\n  \"Grades_LowestGrade_Title\": \"Note la plus basse\",\n  \"Grades_LowestGrade_Description\": \"Note minimale obtenue dans le groupe\",\n  \"Grades_Influence_Title\": \"Influence\",\n  \"Grades_Avg_Group_Title\": \"Moyenne du groupe\",\n  \"Grades_Coefficient\": \"Coefficient\",\n  \"Grades_Avg_Group_Short\": \"Moy. groupe\",\n  \"Grades_Tab_Rank\": \"Classement\",\n  \"Grades_Tab_Rank_Description\": \"Position dans le groupe\",\n\n  \"News_Search_Placeholder\": \"Rechercher une actualité\",\n  \"News_Empty_Title\": \"Aucune actualité\",\n  \"News_Empty_Description\": \"Il n'y a pas d'actualités trouvées dans ton établissement.\",\n  \"News_Search_NoResults\": \"Aucune actualité trouvée\",\n  \"News_Search_NoResults_Description\": \"Aucune actualité trouvée pour votre recherche.\",\n\n  \"News_Theme_Papillon_Title\": \"Papillon\",\n  \"News_Theme_Papillon_Description\": \"Un thème doux et élégant\",\n\n  \"News_Theme_Reading_Title\": \"Lecture\",\n  \"News_Theme_Reading_Description\": \"Un thème conçu pour la lecture\",\n\n  \"Attendance_Hours_Missed\": \"Heures manquées\",\n  \"Attendance_Hours_Unjustified\": \"Heures injustifiées\",\n  \"Attendance_Hours_Unjustified_Value\": \"{{duration}} injustifiées\",\n  \"Attendance_Missing\": \"Absences\",\n  \"Attendance_Delays\": \"Retards\",\n  \"Attendance_NoReason\": \"Aucune raison\",\n  \"Attendance_Duration_Minutes\": \"{{value}} min\",\n  \"Attendance_Duration_HoursMinutes_Detailed\": \"{{hours}} h {{minutes}} min\",\n  \"Attendance_Duration_HoursMinutes_Compact\": \"{{hours}}h{{minutes}}\",\n  \"Attendance_Unjustified_Description\": \"Pense à justifier tes absences et retards auprès de ta vie scolaire ou de ton établissement.\",\n  \"Attendance_NoUnjustified_Title\": \"Aucune heure injustifiée\",\n  \"Attendance_NoUnjustified_Description\": \"Félicitations ! Papillon n'a pas trouvé d'heures injustifiées pour cette période.\",\n  \"Attendance_InvalidPeriod\": \"Période invalide\",\n  \"Attendance_NoEvent_Title\": \"Aucun événement\",\n  \"Attendance_NoEvent_Description\": \"Aucune absence ni aucun retard n'a été enregistré pour cette période.\",\n\n  \"Settings_Account_Title\": \"Mon compte\",\n  \"Settings_Account_Description\": \"Mon compte\",\n  \"Settings_Services_Title\": \"Comptes liés\",\n  \"Settings_Services_Title_LastAccountUsed\": \"Dernier compte utilisé\",\n  \"Settings_Notifications_Title\": \"Notifications\",\n  \"Settings_Notifications_Description\": \"Alertes, fréquence...\",\n  \"Settings_Subjects_Title\": \"Matières\",\n  \"Settings_Subjects_Description\": \"Nom, couleur, police...\",\n  \"Settings_Personalization_Title\": \"Personnalisation\",\n  \"Settings_Personalization_Description\": \"Thèmes, couleurs...\",\n  \"Settings_Cards_Title\": \"Cartes\",\n  \"Settings_Cards_Description\": \"Cantine, accès...\",\n  \"Settings_Accounts_Title\": \"Comptes liés\",\n  \"Settings_Accounts_Description\": \"Comptes, cantine...\",\n  \"Settings_Accessibility_Title\": \"Accessibilité\",\n  \"Settings_Accessibility_Description\": \"Affichage, son...\",\n  \"Settings_MagicPlus_Title\": \"Magic+\",\n  \"Settings_MagicPlus_Description\": \"Fonctionnalités intelligentes\",\n  \"Settings_MagicPlus_Description_Card\": \"Fonctionnalités IA\",\n  \"Settings_MagicPlus_Enable\": \"Activer Magic+\",\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimise automatiquement l’organisation de tes tâches pour améliorer ta productivité\",\n  \"Settings_MagicPlus_ExplanationLocal\": \"Modèle entièrement local, aucune donnée n’est transférée en dehors de ton appareil\",\n  \"Settings_Donate_Title\": \"Faire un don\",\n  \"Settings_Donate_Description\": \"Soutenir le projet\",\n  \"Settings_Telemetry_Title\": \"Télémétrie et vie privée\",\n  \"Settings_Telemetry_Description\": \"Gérer les données collectées\",\n  \"Settings_About_Title\": \"À propos\",\n  \"Settings_About_Description\": \"Version\",\n  \"Settings_Logout_Title\": \"Se déconnecter\",\n  \"Settings_ReleaseNotes_Title\": \"Notes de version\",\n  \"Settings_ReleaseNotes_Description\": \"Quoi de neuf dans cette version ?\",\n\n  \"Settings_Logout_Description\": \"Supprimer ce compte de Papillon\",\n  \"Settings_Language_Title\": \"Langue\",\n  \"Settings_Language_Description\": \"Changer la langue\",\n  \"Settings_Tabs_Title\": \"Onglets\",\n  \"Settings_Tabs_Description\": \"Masquer des onglets du menu\",\n\n  \"Settings_Personalization_Title_Card\": \"Personnalisation\",\n  \"Settings_Personalization_Subtitle_Card\": \"Thèmes, matières...\",\n  \"Settings_SubjectPersonalization_Title\": \"Personnaliser les matières\",\n  \"Settings_Personalization_Accent\": \"Couleur d'accentuation\",\n  \"Settings_Personalization_Accent_Description\": \"La couleur que tu choisis ici s'appliquera sur la page d'accueil de Papillon.\",\n  \"Settings_Personalization_Theme\": \"Thème\",\n  \"Settings_Personalization_MaterialYou_Title\": \"Utiliser les couleurs Android\",\n  \"Settings_Personalization_MaterialYou_Description\": \"Utiliser les couleurs Material You basées sur ton thème système\",\n  \"Settings_Personalization_Icon_Title\": \"Changer l’icône\",\n  \"Settings_Personalization_Icon_Description\": \"Personnalise l’icône de l’application\",\n  \"Settings_Personalization_Subject_Title\": \"Personnaliser les matières\",\n  \"Settings_Personalization_Subject_Title_Card\": \"Matières\",\n  \"Settings_Personalization_Subject_Description\": \"Icônes, couleurs\",\n  \"Settings_About_Papillion_Behind\": \"Derrière Papillon\",\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon est maintenu par des étudiants 100% bénévoles\",\n  \"Settings_About_Discord\": \"Serveur Discord\",\n  \"Settings_About_Discord_Description\": \"Rejoindre le serveur Discord\",\n  \"Settings_About_Crowdin\": \"Projet Crowdin\",\n  \"Settings_About_Crowdin_Description\": \"Aider à traduire Papillon\",\n  \"Settings_About_Github\": \"Projet GitHub\",\n  \"Settings_About_Github_Description\": \"Contribuer au projet sur GitHub\",\n  \"Settings_About_Contributors\": \"Contributeurs\",\n  \"Settings_About_Contributors_Description\": \"Voir les contributeurs GitHub\",\n  \"Settings_About_Issue\": \"Signaler un bug\",\n  \"Settings_About_Issue_Description\": \"Reporter un bug rencontré\",\n  \"Settings_About_Dependency_Version\": \"Version des dépendances\",\n\n  \"Alert_No_Technical\": \"Aucune information technique disponible.\",\n  \"Alert_Auth_Error\": \"Erreur d'authentification\",\n  \"Alert_Auth_Bad_Creds\": \"Les identifiants que tu as saisis sont incorrects ou tu essaies de te connecter avec un compte parent. Ce type de compte n’est pas encore pris en charge par Papillon.\",\n  \"Alert_Not_Supported\": \"Instance non supportée\",\n  \"Alert_Security_Instance_HTTP\": \"Pour des raisons de sécurité, Papillon n'accepte pas les instances utilisant encore le protocole HTTP. Nous te recommandons d’informer le chef d’établissement afin qu’il procède à la mise à jour de cette instance et préserve ainsi sa sécurité.\",\n  \"Alert_NoDemo\": \"Papillon n'est pas fait pour fonctionner avec des instances de démonstration, merci d'utiliser une autre instance.\",\n  \"Alert_Invalid_Instance\": \"Papillon n'arrive pas à obtenir les informations de cette instance PRONOTE, est-elle encore valide ?\",\n  \"Alert_No_Pos\": \"Impossible de récupérer la position\",\n  \"Alert_Connexion_Fail\": \"Connexion impossible\",\n\n  \"Feature_Limited\": \"Fonctionnalités limitées\",\n  \"Feature_Soon\": \"Ça arrive bientôt !\",\n  \"Feature_Soon_Notification\": \"Nous travaillons dur pour vous offrir cette fonctionnalité dans une future mise à jour.\",\n  \"Feature_Add_Card\": \"Ajoute une nouvelle carte depuis l’onglet Profil accessible dans la barre de navigation\",\n\n  \"Webview_Wait\": \"Un peu de patience...\",\n\n  \"Profile_QRCards\": \"QR-Code et cartes\",\n  \"Profile_QRCards_Subtitle\": \"{{count}} carte(s)\",\n  \"Profile_Cards_Loading_History\": \"Chargement de l'historique des transactions\",\n  \"Profile_Cards_Loading_History_Description\": \"Cela peut prendre un moment...\",\n\n  \"Settings_Cards_Banner_Title\": \"Cartes\",\n  \"Settings_Cantineen_Subtitle_Card\": \"Cantine, accès\",\n  \"Settings_Cards_Banner_Description\": \"Ajoute tes cartes de cantine et de transport pour y accéder n'importe où depuis ton téléphone sur Papillon\",\n  \"Settings_Cards_None_Title\": \"Aucune carte\",\n  \"Settings_Cards_Add_Button\": \"Ajouter\",\n\n  \"Settings_Cards_None_Description\": \"Ajoute en-une pour accéder à ton solde de cantine, scanner ton QR-Code et plus encore\",\n  \"Settings_Subjects_None_Title\": \"Aucune matière\",\n  \"Settings_Subjects_None_Description\": \"Parcours les différents onglets de l'application afin de pouvoir customiser les matières.\",\n  \"Settings_Subjects_Reset_Title\": \"Réinitialiser\",\n  \"Settings_Subjects_Reset_Message\": \"Voulez-vous vraiment réinitialiser toutes les matières ?\",\n  \"Settings_Subjects_Reset_Button\": \"Réinitialiser\",\n\n  \"Settings_Donator\": \"Donateurs\",\n  \"Settings_Donator_Description\": \"Voir la liste des donateurs\",\n  \"Settings_App_Version\": \"Version de l'application\",\n\n  \"Profile_Cards_Scan_Orientation\": \"Oriente le QR-Code vers le scanner de la borne\",\n  \"Profile_Cards_No_Reservation\": \"Aucune réservation\",\n  \"Profile_Cards_No_Available_Reservation\": \"Il semblerait que tu ne puisses pas réserver ce jour.\",\n  \"Profile_Cards_History\": \"Historique\",\n  \"Magic_Important\": \"Peut-être important\",\n\n  \"OnBoarding_Step\": \"Étape \",\n  \"OnBoarding_Step_Of\": \"sur \",\n\n  \"Consent_Advanced_Title\": \"Je veux aider Papillon\",\n  \"Consent_Advanced_Description\": \"On récolte plus d’informations détaillées sur ton utilisation.\",\n  \"Consent_Required_Title\": \"Juste l'essentiel\",\n  \"Consent_Required_Description\": \"En gros, savoir que quelqu’un a utilisé Papillon, si ça s’est bien passé et quel service il utilise.\",\n  \"Consent_None_Title\": \"Rien du tout\",\n  \"Consent_None_Description\": \"On ne sera même pas au courant de ton existence.\",\n  \"Consent_Title\": \"Toi et Papillon\",\n  \"Consent_Intro1\": \"Pour aider à faire grandir Papillon, tu peux choisir de partager quelques infos d’usage.\",\n  \"Consent_PrivacyPolicy\": \"En cas de doute, consultez notre politique de confidentialité\",\n  \"Consent_Refuse\": \"Refuser\",\n  \"Consent_Accept\": \"Accepter\",\n  \"Consent_ChangeMind\": \"Vous pouvez changer d’avis à tout moment depuis les paramètres de l’appli.\",\n  \"Consent_Arg1\": \"Sert uniquement à améliorer l’application\",\n  \"Consent_Arg2\": \"Anonyme & sans lien avec ton identité\",\n  \"Consent_Arg3\": \"On n'a pas accès à tes comptes\",\n\n  \"Changelog_Title\": \"Notes de mise à jour\",\n\n  \"Tasks_Sorting_Methods_DueDate\": \"Date de rendu\",\n  \"Tasks_Sorting_Methods_Subject\": \"Matières\",\n  \"Tasks_Sorting_Methods_Done\": \"Non terminé\",\n  \"Tasks_ThisWeek\": \"Cette semaine\",\n\n  \"Task_Undone\": \"Non terminé\",\n  \"Task_Done\": \"Terminé\",\n\n  \"Modal_Wallpaper_Title\": \"Personnaliser le fond d'écran\",\n  \"Modal_Wallpaper_Clear\": \"Supprimer le fond d'écran\",\n  \"Modal_Wallpaper_Downloads\": \"Téléchargements\",\n  \"Modal_Wallpaper_Downloads_Size\": \"Taille des téléchargements\",\n  \"Modal_Wallpaper_ClearDownloads\": \"Vider les téléchargements\",\n  \"Modal_Profile_Title\": \"Personnaliser le profil\",\n\n  \"Modal_Task_Title\": \"Détail de la tâche\",\n  \"Modal_Task_Status\": \"État du devoir\",\n  \"Modal_Task_Description\": \"Description du devoir\",\n  \"Modal_Task_Attachments\": \"Pièces jointes\",\n\n  \"Today\": \"Aujourd'hui\",\n  \"Yesterday\": \"Hier\",\n  \"Tomorrow\": \"Demain\",\n\n  \"Home_Edit_Profile\": \"Modifier mon profil\",\n  \"Home_Add_Profile\": \"Ajouter un profil\",\n\n  \"Settings_Transport_Address_Not_Set\": \"Non définie\",\n  \"Settings_Transport_Current_Position\": \"Position actuelle\",\n  \"Settings_Transport_Banner_Title\": \"Transport\",\n  \"Settings_Transport_Banner_Description\": \"Active cette option pour voir les horaires de transport dans ton emploi du temps.\",\n  \"Settings_Transport_Address_Title\": \"Adresse\",\n  \"Settings_Transport_Address_Home_Title\": \"Domicile\",\n  \"Settings_Transport_Address_School_Title\": \"École\",\n  \"Settings_Transport_Address_Description\": \"Ces informations seront envoyées à ton application de transport par défaut. Elles ne seront pas partagées avec d'autres tiers.\",\n  \"Settings_Transport_Default_Application_Title\": \"Application par défaut\",\n  \"Settings_Transport_Title\": \"Transport\",\n  \"Settings_Transport_Description\": \"Application de transport, adresses...\",\n  \"Transport_Error_Address_Not_Set_Title\": \"Aucune adresse n'a été définie\",\n  \"Transport_Error_Address_Not_Set_Description\": \"Configure tes adresses dans les préférences.\",\n  \"Transport_Error_Cant_Go_To_Current_Location_Title\": \"Impossible d'afficher cet itinéraire\",\n  \"Transport_Error_Cant_Go_To_Current_Location_Description\": \"Nous ne pouvons pas afficher un trajet vers ta position actuelle.\",\n  \"Transport_Leave_In\": \"Départ dans\",\n  \"Transport_Leave_At\": \"Départ à\",\n  \"Transport_From\": \"depuis\",\n  \"Transport_Error_Location_Title\": \"Nous n'arrivons pas à accéder à ta position\",\n  \"Transport_Error_Location_Description\": \"Vérifie que Papillon a bien accès à ta localisation.\",\n  \"Transport_Maps_App\": \"ton application de transport\",\n  \"Transport_Open_In\": \"Ouvrir dans\",\n  \"Settings_Transport_Search_Address_Placeholder\": \"Rechercher une adresse, un arrêt...\",\n  \"Settings_Transport_Current_Position_Description\": \"Utilise ta position actuelle quand tu es dans ton calendrier.\",\n  \"Settings_Transport_Place\": \"Adresses et lieux\",\n  \"Settings_Transport_Stops\": \"Arrêts et stations\",\n  \"Transport_Error_Unknown_Service_Title\": \"Oups, ce service n'existe plus !\",\n  \"Transport_Error_Unknown_Service_Description\": \"Le service que tu essaies d'ouvrir n'est plus disponible sur Papillon. Essaie de changer le service dans les paramètres.\",\n  \"Transport_Error_Cant_Open_Deeplink_Title\": \"Impossible d'ouvrir le service\",\n  \"Transport_Error_Cant_Open_Deeplink_Description\": \"Vérifie que l'application est installée sur ton appareil, puis réessaie.\",\n  \"Settings_Transport_Localisation_Needed\": \"Papillon a besoin de ta localisation.\",\n  \"Settings_Transport_Localisation_Needed_Description\": \"Pour utiliser les fonctionnalités de transport, Papillon doit accéder à ta localisation afin de fournir des estimations de temps de trajets.\",\n  \"Settings_Transport_Localisation_Request\": \"Activer la localisation\",\n  \"Settings_Preferences\": \"Fonctionnalités\",\n  \"Settings_More\": \"À propos\",\n  \"Settings_About\": \"Toi et Papillon\",\n  \"Settings_Dev\": \"Développement\",\n\n  \"Settings_Personalization_Emoji_Picker_Title\": \"Sélectionne un emoji\",\n  \"Settings_Personalization_Emoji_Picker_SetEmoji\": \"Sélectionner\"\n}\n"
  },
  {
    "path": "locales/he.json",
    "content": "{\r\n  \"Global_Back\": \"חזור\",\r\n  \"Global_DatePrefix\": \"ב-\",\r\n\r\n  \"Tab_Home\": \"בית\",\r\n  \"Tab_Calendar\": \"מערכת שעות\",\r\n  \"Tab_Tasks\": \"משימות\",\r\n  \"Tab_Grades\": \"ציונים\",\r\n  \"Tab_Profile\": \"פרופיל\",\r\n  \"Tab_Custom_Profile\": \"עריכת פרופיל\",\r\n  \"Button_Change_ProfilePicture\": \"שינוי תמונת פרופיל\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"צלם תמונה\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"מהגלריה\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"ייבוא ממערכת בית הספר\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"הסרת תמונה\",\r\n  \"Tab_Page\": \"עמוד\",\r\n  \"Tab_Settings\": \"הגדרות\",\r\n  \"Tab_News\": \"חדשות\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"האפליקציה לניהול חיי הלימודים שלך\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"חבר את האפליקציות של בית הספר כדי לגשת לציונים, מערכת השעות, המשימות ועוד, הכל בממשק של Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"להתחיל\",\r\n  \"ONBOARDING_HELP_BTN\": \"צריך עזרה?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"שירות אוניברסיטאי\",\r\n  \"ONBOARDING_RESTAURANTS\": \"שירות קפיטריה\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"בחר את שירות בית הספר שלך\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"בחר את שירות הקפיטריה\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"בחר את השירות האוניברסיטאי\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"איך תרצה להתחבר?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"שימוש במיקום שלי\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"חיפוש עיר\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"יש לי קוד QR\",\r\n  \"ONBOARDING_METHOD_LINK\": \"יש לי כתובת התחברות (URL)\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"בחר את מוסד הלימודים שלך\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"הזן את שם העיר ובחר את מוסד הלימודים\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"התחבר כפי שאתה רגיל\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"התחבר לחשבונך\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"בחר את השרת המוקצה לחשבון\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"הזן את קוד ה-PIN בן 4 הספרות שיצרת ב-PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"התחברות ל-\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"סרוק את קוד ה-QR של מוסד הלימודים כדי להתחבר.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"אימות קוד QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"זה עשוי לקחת כמה רגעים...\",\r\n  \"ONBOARDING_URL\": \"הזן את כתובת ה-URL של מוסד הלימודים\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"כתובת ה-URL של שרת ה-PRONOTE שלך\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"לפני שמסיימים\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"בחר\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"צבע ערכת נושא\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"הזן את קוד ה-PIN של ה-PRONOTE שלך\",\r\n  \"Onboarding_Load_Webview_Description\": \"טוען את אתר מוסד הלימודים שלך\",\r\n  \"INPUT_PIN\": \"קוד PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"חיפוש שרת...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"מתחבר...\",\r\n\r\n  \"WAITING\": \"בהמתנה\",\r\n  \"IZLY_SMS_SEND\": \"קיבלת הרגע קישור להתחברות, לחץ עליו ובצע את השלבים.\",\r\n  \"STEP\": \"שלב\",\r\n  \"STEP_OUTOF\": \"מתוך\",\r\n  \"INPUT_USERNAME\": \"שם משתמש\",\r\n  \"INPUT_MAIL\": \"כתובת אימייל\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"אימייל או שם משתמש\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"מספר טלפון או אימייל\",\r\n  \"INPUT_PASSWORD\": \"סיסמה\",\r\n  \"INPUT_PASSWORD_CODE\": \"קוד גישה\",\r\n  \"INPUT_ETABID\": \"מזהה מוסד הלימודים\",\r\n  \"LOGIN_BTN\": \"התחבר\",\r\n  \"CONFIRM_BTN\": \"אישור\",\r\n  \"CANCEL_BTN\": \"ביטול\",\r\n\r\n  \"Tab_New_Event\": \"אירוע חדש\",\r\n\r\n  \"Tab_Calendar_Icals\": \"ניהול iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"נהל את כתובות ה-iCal שלך\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"הוספת כתובת iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"נהל את {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"הוסף או הסר כתובות iCal לסנכרון עם לוח השנה שלך.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"כותרת חסרה\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"תן שם לכתובת ה-iCal הזו כדי להוסיף אותה.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"לא נוספו כתובות iCal\",\r\n\r\n  \"TabUnderConstruction_Title\": \"לשונית זו בבנייה.\",\r\n  \"TabUnderConstruction_Details\": \"חזור מאוחר יותר לעדכונים.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"מצב מפתחים\",\r\n  \"TabDevModeNotice_Details\": \"סביבת בדיקות מלאה למפתחים.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"פרטים טכניים\",\r\n\r\n  \"Online_Course\": \"מקוון\",\r\n  \"Evaluated_Course\": \"מבחן / הערכה\",\r\n  \"Edited_Course\": \"שיעור עודכן\",\r\n  \"Canceled_Course\": \"שיעור בוטל\",\r\n  \"No_Course_Room\": \"חדר לא ידוע\",\r\n  \"Event_DeleteEvent\": \"מחיקת אירוע\",\r\n  \"Event_Confirm_DeleteEvent\": \"האם אתה בטוח שברצונך למחוק אירוע זה?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"הפסקת צהריים\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"בתיאבון!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"יאמי!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"הפסקת בוקר\",\r\n  \"Course_Separator_Morning_Alt_1\": \"לילה טוב!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"ארוחת בוקר\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"הפסקת אחר הצהריים\",\r\n  \"Course_Separator_Evening_Alt_1\": \"זמן להפסקה!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"זמן לנשנוש!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"הפסקת ערב\",\r\n  \"Course_Separator_Night_Alt_1\": \"לילה טוב!\",\r\n  \"Course_Separator_Night_Alt_2\": \"כבר לילה!\",\r\n\r\n  \"Context_Delete\": \"מחק\",\r\n  \"Context_Cancel\": \"ביטול\",\r\n  \"Context_Edit\": \"ערוך\",\r\n  \"Context_Add\": \"הוסף\",\r\n\r\n  \"Form_Title\": \"כותרת\",\r\n  \"Form_Location\": \"מיקום\",\r\n  \"Form_Organizer\": \"מארגן\",\r\n  \"Form_Start\": \"התחלה\",\r\n  \"Form_End\": \"סיום\",\r\n\r\n  \"Confirm_DeleteEvent\": \"האם אתה בטוח שברצונך למחוק אירוע זה?\",\r\n\r\n  \"Home_Welcome_Name\": \"שלום, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"הצג עוד\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"זמינים\",\r\n  \"Home_Chats_Plurial\": \"שיחות\",\r\n  \"Home_Chats_Singular\": \"שיחה\",\r\n  \"Home_See_All_Tasks\": \"צפייה בכל המשימות\",\r\n  \"Home_Welcome\": \"שלום!\",\r\n  \"Home_Planned_None\": \"אין לך עוד שיעורים מתוכננים להיום\",\r\n  \"Home_Planned_One\": \"נשאר לך שיעור אחד היום\",\r\n  \"Home_Planned_Number\": \"נשארו לך {{number}} שיעורים היום\",\r\n\r\n  \"Home_Widget_NextCourses\": \"השיעורים הבאים\",\r\n  \"Home_Widget_NewGrades\": \"ציונים חדשים\",\r\n  \"Home_Widget_NewHomeworks\": \"משימות לביצוע\",\r\n\r\n  \"Home_Widget_NoCourses\": \"אין שיעורים קרובים\",\r\n  \"Home_Widget_NoCourses_Description\": \"אין שיעורים מתוכננים להיום.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"כרטיסים\",\r\n  \"Home_Cards_Button_Description_None\": \"אין כרטיסים\",\r\n  \"Home_Cards_Button_Description_Singular\": \"כרטיס אחד\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} כרטיסים\",\r\n\r\n  \"Home_Chats_Button_Title\": \"הודעות\",\r\n  \"Home_Chats_Button_Description_None\": \"אין הודעות\",\r\n  \"Home_Chats_Button_Description_Singular\": \"הודעה אחת\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} הודעות\",\r\n\r\n  \"Home_Attendance_Title\": \"חיסורים\",\r\n  \"Home_Attendance_Button_Description_None\": \"אין חיסורים\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"חיסור אחד\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} חיסורים\",\r\n\r\n  \"Home_Menu_Button_Title\": \"תפריט\",\r\n  \"Home_Menu_Button_Description\": \"תפריט היום\",\r\n\r\n  \"Tab_Calendar_Empty\": \"לא נמצאו אירועים\",\r\n  \"Tab_Calendar_Empty_Description\": \"הוסף אירוע או סנכרן את לוח השנה שלך כדי להתחיל.\",\r\n\r\n  \"Modal_Course_Title\": \"השיעור שלי\",\r\n  \"Modal_Course_StartsIn\": \"מתחיל בעוד\",\r\n  \"Modal_Course_StartedAgo\": \"הסתיים לפני\",\r\n  \"Modal_Course_Ongoing\": \"מתקיים כבר\",\r\n  \"Modal_Course_Group\": \"קבוצה\",\r\n  \"Modal_Course_Group_Full\": \"כיתה\",\r\n\r\n  \"Modal_Course_Details\": \"פרטי השיעור\",\r\n  \"Modal_Course_Teacher\": \"מורה\",\r\n  \"Modal_Course_Room\": \"חדר\",\r\n  \"Modal_Course_Duration\": \"משך זמן\",\r\n\r\n  \"Modal_Course_Time\": \"שעות השיעור\",\r\n  \"Modal_Course_Start\": \"התחלה\",\r\n  \"Modal_Course_End\": \"סיום\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"חיפוש משימות\",\r\n  \"Tasks_LeftHomeworks_Title\": \"משימות נותרו\",\r\n  \"Tasks_LeftHomeworks_Time\": \"השבוע\",\r\n  \"Tasks_Done_AllTasks\": \"כל המשימות\",\r\n  \"Tasks_Done_CompletedTasks\": \"הושלמו\",\r\n  \"Tasks_Nav_Left\": \"עוד {{count}} משימות לביצוע\",\r\n  \"Tasks_Nav_One\": \"עוד משימה אחת בלבד\",\r\n  \"Tasks_Nav_Completed\": \"הכל הסתיים!\",\r\n  \"Tasks_Week\": \"שבוע\",\r\n  \"Tasks_NoTasks_Title\": \"אין משימות\",\r\n  \"Tasks_NoTasks_Description\": \"אין משימות מתוכננות לשבוע זה. נצלו את הזמן למנוחה!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"לשבוע {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"אין משימות\",\r\n  \"Task_Start\": \"לביצוע\",\r\n  \"Task_Complete\": \"הושלם\",\r\n  \"Task_Sorting_Title\": \"מיון לפי\",\r\n  \"Task_OnlyShowUndone\": \"משימות שהושלמו\",\r\n  \"Task_Show_Title\": \"הצגה\",\r\n  \"Settings_General\": \"כללי\",\r\n\r\n  \"Latest_Grades\": \"ציונים חדשים\",\r\n  \"Grades_Search_Placeholder\": \"חיפוש ציון או מקצוע\",\r\n\r\n  \"Grades_Avg_Methods\": \"שיטות חישוב\",\r\n  \"Grades_Avg_All_Title\": \"ממוצע כללי\",\r\n  \"Grades_Avg_All_Short\": \"ממוצע כללי\",\r\n  \"Grades_Avg_All_Pond\": \"ממוצע משוקלל\",\r\n  \"Grades_Avg_All_Pond_Short\": \"ממוצע משוקלל\",\r\n  \"Grades_Avg_All_Pond_Description\": \"מחשב את הממוצע המשוקלל של כל הציונים\",\r\n  \"Grades_Avg_Subject_Title\": \"ממוצע מקצועות\",\r\n  \"Grades_Avg_Subject_Short\": \"ממוצע מקצועות\",\r\n  \"Grades_Avg_Subject_Description\": \"מחשב את הממוצע המשוקלל של ממוצעי המקצועות\",\r\n  \"Grades_Avg_Median_Title\": \"חציון\",\r\n  \"Grades_Avg_Median_Short\": \"חציון\",\r\n\r\n  \"Grades_Avg_More\": \"למידע נוסף\",\r\n  \"Grades_Avg_KnowMore\": \"למידע נוסף\",\r\n  \"Grades_Avg_KnowMore_Description\": \"הבנת שיטות חישוב הממוצע הכללי\",\r\n\r\n  \"Grades_SubjectInfo\": \"מידע על המקצוע\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} ציונים\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"ממוצע התלמיד\",\r\n  \"SubjectInfo_Stats_Header\": \"סטטיסטיקה\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"ממוצע כיתתי\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"ממוצע כללי של הכיתה\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"ממוצע מקסימלי\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"הממוצע הגבוה ביותר בקבוצה\",\r\n  \"SubjectInfo_MinAverage_Label\": \"ממוצע מינימלי\",\r\n  \"SubjectInfo_MinAverage_Description\": \"הממוצע הנמוך ביותר בקבוצה\",\r\n\r\n  \"Grades_Semester\": \"סמסטר\",\r\n  \"Grades_Trimester\": \"שליש\",\r\n  \"Grades_OutPeriod\": \"מחוץ לתקופה\",\r\n  \"Grades_Year\": \"שנה\",\r\n  \"Grades_MockExamBac\": \"בגרות מדומה\",\r\n  \"Grades_MockExamBrevet\": \"מבחן מגן\",\r\n\r\n  \"Grades_Method_AllGrades\": \"כל המקצועות\",\r\n  \"Grades_Method_Weighted\": \"משקל (מקדם)\",\r\n\r\n  \"Grades_Sort\": \"מיון\",\r\n  \"Grades_Sorting_Alphabetical\": \"אלפביתי\",\r\n  \"Grades_Sorting_Averages\": \"ממוצעים\",\r\n  \"Grades_Sorting_Date\": \"תאריך\",\r\n\r\n  \"Grades_Menu_SortBy\": \"מיון לפי\",\r\n  \"Grades_Menu_AverageBy\": \"ממוצע לפי\",\r\n  \"NoAverage\": \"אין ממוצע\",\r\n\r\n  \"Grades_Empty_Title\": \"אין ציונים\",\r\n  \"Grades_Empty_Description\": \"עדיין לא קיבלת ציונים בתקופה זו.\",\r\n\r\n  \"Grade_NoDescription\": \"מטלה במקצוע {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"מקצועות\",\r\n  \"Grades_Tab_Latest\": \"ציונים חדשים\",\r\n\r\n  \"Profile_Attendance_Title\": \"נוכחות\",\r\n  \"Profile_Attendance_Denominator_Single\": \"חיסור\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"חיסורים\",\r\n\r\n  \"Profile_Discussions_Title\": \"שיחות\",\r\n  \"Profile_Discussions_Denominator_Single\": \"שלא נקרא\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"שלא נקראו\",\r\n\r\n  \"Profile_News_Title\": \"חדשות\",\r\n  \"Profile_News_Denominator_Single\": \"חדש\",\r\n  \"Profile_News_Denominator_Plural\": \"חדשים\",\r\n  \"Profile_News_Open\": \"פתיחה\",\r\n  \"Profile_News_Loading_Title\": \"טוען חדשות...\",\r\n  \"Profile_News_Author_Unknown\": \"מחבר לא ידוע\",\r\n\r\n  \"Profile_Cards_Title\": \"קוד QR וכרטיסים\",\r\n\r\n  \"Modal_Grades_Title\": \"פרטי הציון\",\r\n  \"Modal_Grades_BestGrade\": \"הציון הכי גבוה בקבוצה\",\r\n\r\n  \"Grades_Details_Title\": \"פרטים\",\r\n  \"Grades_NormalizedGrade_Title\": \"ציון מנורמל ל-20\",\r\n  \"Grades_NormalizedGrade_Description\": \"ערך הציון מומר לסולם של 20\",\r\n  \"Grades_HighestGrade_Title\": \"הציון הגבוה ביותר\",\r\n  \"Grades_HighestGrade_Description\": \"הציון המקסימלי שהושג בקבוצה\",\r\n  \"Grades_LowestGrade_Title\": \"הציון הנמוך ביותר\",\r\n  \"Grades_LowestGrade_Description\": \"הציון המינימלי שהושג בקבוצה\",\r\n  \"Grades_Influence_Title\": \"השפעה\",\r\n  \"Grades_Avg_Group_Title\": \"ממוצע הקבוצה\",\r\n  \"Grades_Coefficient\": \"מקדם\",\r\n  \"Grades_Avg_Group_Short\": \"ממוצע קבוצה\",\r\n  \"Grades_Tab_Rank\": \"דירוג\",\r\n  \"Grades_Tab_Rank_Description\": \"מיקום בקבוצה\",\r\n\r\n  \"News_Search_Placeholder\": \"חיפוש ידיעה\",\r\n  \"News_Empty_Title\": \"אין חדשות\",\r\n  \"News_Empty_Description\": \"לא נמצאו ידיעות במוסד הלימודים שלך.\",\r\n  \"News_Search_NoResults\": \"לא נמצאו ידיעות\",\r\n  \"News_Search_NoResults_Description\": \"לא נמצאו ידיעות התואמות לחיפוש שלך.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"ערכת נושא רכה ואלגנטית\",\r\n\r\n  \"News_Theme_Reading_Title\": \"קריאה\",\r\n  \"News_Theme_Reading_Description\": \"ערכת נושא המיועדת לקריאה\",\r\n\r\n  \"Attendance_Hours_Missed\": \"שעות שהוחסרו\",\r\n  \"Attendance_Hours_Unjustified\": \"שעות לא מוצדקות\",\r\n  \"Attendance_Missing\": \"חיסורים\",\r\n  \"Attendance_Delays\": \"איחורים\",\r\n  \"Attendance_NoReason\": \"אין סיבה\",\r\n  \"Attendance_NoEvent_Title\": \"אין אירועים\",\r\n  \"Attendance_NoEvent_Description\": \"לא נרשמו חיסורים או איחורים לתקופה זו.\",\r\n\r\n  \"Settings_Account_Title\": \"החשבון שלי\",\r\n  \"Settings_Account_Description\": \"החשבון שלי\",\r\n  \"Settings_Services_Title\": \"חשבונות מחוברים\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"החשבון האחרון בשימוש\",\r\n  \"Settings_Notifications_Title\": \"התראות\",\r\n  \"Settings_Notifications_Description\": \"התראות, תדירות...\",\r\n  \"Settings_Subjects_Title\": \"מקצועות\",\r\n  \"Settings_Subjects_Description\": \"שם, צבע, גופן...\",\r\n  \"Settings_Personalization_Title\": \"התאמה אישית\",\r\n  \"Settings_Personalization_Description\": \"ערכות נושא, צבעים...\",\r\n  \"Settings_Cards_Title\": \"כרטיסים\",\r\n  \"Settings_Cards_Description\": \"קפיטריה, גישה...\",\r\n  \"Settings_Accessibility_Title\": \"נגישות\",\r\n  \"Settings_Accessibility_Description\": \"תצוגה, שמע...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"תכונות חכמות\",\r\n  \"Settings_MagicPlus_Description_Card\": \"תכונות בינה מלאכותית\",\r\n  \"Settings_MagicPlus_Enable\": \"הפעל את Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"מבצע אופטימיזציה אוטומטית לארגון המשימות שלך לשיפור הפרודוקטיביות\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"מודל מקומי לחלוטין, שום נתון לא מועבר מחוץ למכשיר שלך\",\r\n  \"Settings_Donate_Title\": \"תרומה\",\r\n  \"Settings_Donate_Description\": \"תמיכה בפרויקט\",\r\n  \"Settings_Telemetry_Title\": \"טלמטריה ופרטיות\",\r\n  \"Settings_Telemetry_Description\": \"ניהול הנתונים שנאספו\",\r\n  \"Settings_About_Title\": \"אודות\",\r\n  \"Settings_About_Description\": \"גרסה\",\r\n  \"Settings_Logout_Title\": \"התנתק\",\r\n  \"Settings_Logout_Description\": \"הסרת חשבון זה מ-Papillon\",\r\n  \"Settings_Language_Title\": \"שפה\",\r\n  \"Settings_Language_Description\": \"שינוי שפה\",\r\n  \"Settings_Tabs_Title\": \"לשוניות\",\r\n  \"Settings_Tabs_Description\": \"הסתרת לשוניות מהתפריט\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"התאמה אישית\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"ערכות נושא, מקצועות...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"התאמה אישית של מקצועות\",\r\n  \"Settings_Personalization_Accent\": \"צבע דגש\",\r\n  \"Settings_Personalization_Accent_Description\": \"הצבע שתבחר כאן יוחל על דף הבית של Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"ערכת נושא\",\r\n  \"Settings_Personalization_Icon_Title\": \"שינוי האייקון\",\r\n  \"Settings_Personalization_Icon_Description\": \"התאמה אישית של אייקון האפליקציה\",\r\n  \"Settings_Personalization_Subject_Title\": \"התאמה אישית של מקצועות\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"מקצועות\",\r\n  \"Settings_Personalization_Subject_Description\": \"אייקונים, צבעים\",\r\n  \"Settings_About_Papillion_Behind\": \"מאחורי Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon מתוחזקת על ידי סטודנטים מתנדבים ב-100%\",\r\n  \"Settings_About_Discord\": \"שרת Discord\",\r\n  \"Settings_About_Discord_Description\": \"הצטרפות לשרת ה-Discord\",\r\n  \"Settings_About_Crowdin\": \"פרויקט Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"עזרו לתרגם את Papillon\",\r\n  \"Settings_About_Github\": \"פרויקט GitHub\",\r\n  \"Settings_About_Github_Description\": \"תרומה לפרויקט ב-GitHub\",\r\n  \"Settings_About_Issue\": \"דיווח על באג\",\r\n  \"Settings_About_Issue_Description\": \"דיווח על תקלה שנתקלת בה\",\r\n  \"Settings_About_Dependency_Version\": \"גרסת ספריות\",\r\n\r\n  \"Alert_No_Technical\": \"אין מידע טכני זמין.\",\r\n  \"Alert_Auth_Error\": \"שגיאת אימות\",\r\n  \"Alert_Auth_Bad_Creds\": \"פרטי ההתחברות שהזנת שגויים או שאתה מנסה להתחבר עם חשבון הורה. סוג חשבון זה עדיין אינו נתמך על ידי Papillon.\",\r\n  \"Alert_Not_Supported\": \"שרת לא נתמך\",\r\n  \"Alert_Security_Instance_HTTP\": \"מטעמי אבטחה, Papillon אינה מקבלת שרתים שעדיין משתמשים בפרוטוקול HTTP. אנו ממליצים לך ליידע את מנהל המוסד כדי שיעדכן את השרת ובכך ישמור על אבטחתו.\",\r\n  \"Alert_NoDemo\": \"Papillon לא נועדה לעבוד עם שרתי דמו, אנא השתמש בשרת אמיתי.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon לא מצליחה לקבל מידע משרת ה-PRONOTE הזה, האם הוא עדיין תקף?\",\r\n  \"Alert_No_Pos\": \"לא ניתן לקבל את המיקום\",\r\n  \"Alert_Connexion_Fail\": \"התחברות נכשלה\",\r\n\r\n  \"Feature_Limited\": \"תכונות מוגבלות\",\r\n  \"Feature_Soon\": \"זה מגיע בקרוב!\",\r\n  \"Feature_Soon_Notification\": \"אנו עובדים קשה כדי להציע לכם תכונה זו בעדכון עתידי.\",\r\n  \"Feature_Add_Card\": \"הוסף כרטיס חדש מלשונית הפרופיל הנגישה בסרגל הניווט\",\r\n\r\n  \"Webview_Wait\": \"מעט סבלנות...\",\r\n\r\n  \"Profile_QRCards\": \"קוד QR וכרטיסים\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} כרטיסים\",\r\n  \"Profile_Cards_Loading_History\": \"טוען היסטוריית עסקאות\",\r\n  \"Profile_Cards_Loading_History_Description\": \"זה עשוי לקחת רגע...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"כרטיסים\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"קפיטריה, גישה\",\r\n  \"Settings_Cards_Banner_Description\": \"הוסף את כרטיסי הקפיטריה והתחבורה שלך כדי לגשת אליהם מכל מקום מהטלפון שלך ב-Papillon\",\r\n  \"Settings_Cards_None_Title\": \"אין כרטיסים\",\r\n  \"Settings_Cards_Add_Button\": \"הוספה\",\r\n\r\n  \"Settings_Cards_None_Description\": \"הוסף כרטיס כדי לראות את יתרת הקפיטריה, לסרוק את קוד ה-QR שלך ועוד\",\r\n  \"Settings_Subjects_None_Title\": \"אין מקצועות\",\r\n  \"Settings_Subjects_None_Description\": \"עיין בלשוניות השונות של האפליקציה כדי שתוכל להתאים אישית את המקצועות.\",\r\n  \"Settings_Subjects_Reset_Title\": \"איפוס\",\r\n  \"Settings_Subjects_Reset_Message\": \"האם אתה באמת רוצה לאפס את כל המקצועות?\",\r\n  \"Settings_Subjects_Reset_Button\": \"איפוס\",\r\n\r\n  \"Settings_Donator\": \"תורמים\",\r\n  \"Settings_Donator_Description\": \"צפייה ברשימת התורמים\",\r\n  \"Settings_App_Version\": \"גרסת האפליקציה\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"כוון את קוד ה-QR אל הסורק\",\r\n  \"Profile_Cards_No_Reservation\": \"אין הזמנה\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"נראה שאינך יכול להזמין ביום זה.\",\r\n  \"Profile_Cards_History\": \"היסטוריה\",\r\n  \"Magic_Important\": \"אולי חשוב\",\r\n\r\n  \"OnBoarding_Step\": \"שלב \",\r\n  \"OnBoarding_Step_Of\": \"מתוך \",\r\n\r\n  \"Consent_Advanced_Title\": \"אני רוצה לעזור ל-Papillon\",\r\n  \"Consent_Advanced_Description\": \"אנו אוספים מידע מפורט יותר על השימוש שלך.\",\r\n  \"Consent_Required_Title\": \"רק מה שחיוני\",\r\n  \"Consent_Required_Description\": \"בגדול, לדעת שמישהו השתמש ב-Papillon, אם הכל עבר כשורה ובאיזה שירות הוא משתמש.\",\r\n  \"Consent_None_Title\": \"שום דבר בכלל\",\r\n  \"Consent_None_Description\": \"אנחנו אפילו לא נדע על קיומך.\",\r\n  \"Consent_Title\": \"אתה ו-Papillon\",\r\n  \"Consent_Intro1\": \"כדי לעזור ל-Papillon לגדול, אתה יכול לבחור לשתף חלק ממידע השימוש.\",\r\n  \"Consent_PrivacyPolicy\": \"במקרה של ספק, עיין במדיניות הפרטיות שלנו\",\r\n  \"Consent_Refuse\": \"סירוב\",\r\n  \"Consent_Accept\": \"אישור\",\r\n  \"Consent_ChangeMind\": \"אתה יכול לשנות את דעתך בכל עת מהגדרות האפליקציה.\",\r\n  \"Consent_Arg1\": \"משמש אך ורק לשיפור האפליקציה\",\r\n  \"Consent_Arg2\": \"אנונימי וללא קשר לזהותך\",\r\n  \"Consent_Arg3\": \"אין לנו גישה לחשבונות שלך\",\r\n\r\n  \"Changelog_Title\": \"הערות גרסה\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"תאריך הגשה\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"מקצועות\",\r\n  \"Tasks_Sorting_Methods_Done\": \"לא הושלם\",\r\n  \"Tasks_ThisWeek\": \"השבוע\",\r\n\r\n  \"Task_Undone\": \"לא הושלם\",\r\n  \"Task_Done\": \"הושלם\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"התאמת רקע\",\r\n  \"Modal_Profile_Title\": \"התאמת פרופיל\",\r\n\r\n  \"Modal_Task_Status\": \"מצב המטלה\",\r\n  \"Modal_Task_Description\": \"תיאור המטלה\",\r\n  \"Modal_Task_Attachments\": \"קבצים מצורפים\",\r\n\r\n  \"Today\": \"היום\",\r\n  \"Yesterday\": \"אתמול\",\r\n  \"Tomorrow\": \"מחר\"\r\n}"
  },
  {
    "path": "locales/hi.json",
    "content": "{\r\n  \"Global_Back\": \"पीछे\",\r\n  \"Global_DatePrefix\": \"को\",\r\n\r\n  \"Tab_Home\": \"होम\",\r\n  \"Tab_Calendar\": \"कक्षाएं\",\r\n  \"Tab_Tasks\": \"कार्य\",\r\n  \"Tab_Grades\": \"अंक\",\r\n  \"Tab_Profile\": \"प्रोफ़ाइल\",\r\n  \"Tab_Custom_Profile\": \"प्रोफ़ाइल संपादित करें\",\r\n  \"Button_Change_ProfilePicture\": \"प्रोफ़ाइल फोटो बदलें\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"फोटो खींचें\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"लाइब्रेरी से चुनें\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"अपने स्कूल सिस्टम (ENT) से प्राप्त करें\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"फोटो हटाएं\",\r\n  \"Tab_Page\": \"पेज\",\r\n  \"Tab_Settings\": \"सेटिंग्स\",\r\n  \"Tab_News\": \"समाचार\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"अपने स्कूली जीवन को प्रबंधित करने के लिए ऐप\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"अंक, कक्षाएं, होमवर्क और बहुत कुछ Papillon इंटरफ़ेस में देखने के लिए अपने स्कूली ऐप्स को कनेक्ट करें!\",\r\n  \"ONBOARDING_START_BTN\": \"शुरू करें\",\r\n  \"ONBOARDING_HELP_BTN\": \"क्या आपको मदद चाहिए?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"विश्वविद्यालय सेवा\",\r\n  \"ONBOARDING_RESTAURANTS\": \"कैंटीन सेवा\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"अपनी स्कूली सेवा चुनें\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"अपनी कैंटीन सेवा चुनें\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"अपनी विश्वविद्यालय सेवा चुनें\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"आप कैसे जुड़ना चाहते हैं?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"मेरी लोकेशन का उपयोग करें\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"शहर खोजें\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"मेरे पास QR कोड है\",\r\n  \"ONBOARDING_METHOD_LINK\": \"मेरे पास लॉगिन URL है\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"अपना संस्थान चुनें\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"अपने शहर का नाम डालें और अपना संस्थान चुनें\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"हमेशा की तरह लॉगिन करें\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"अपने खाते में लॉगिन करें\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"खाते के लिए निर्दिष्ट होस्ट चुनें\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"वही 4-अंकों का कोड डालें जो आपने अभी PRONOTE पर बनाया है\",\r\n  \"ONBOARDING_LOGIN_TO\": \"लॉगिन करें\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"जुड़ने के लिए अपने संस्थान का QR कोड स्कैन करें।\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR कोड का सत्यापन\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"इसमें कुछ क्षण लग सकते हैं...\",\r\n  \"ONBOARDING_URL\": \"अपने संस्थान का URL पता बताएं\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"अपने PRONOTE सर्वर का URL\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"समाप्त करने से पहले\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"एक\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"थीम रंग चुनें\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"अपने PRONOTE का पिन कोड डालें\",\r\n  \"Onboarding_Load_Webview_Description\": \"हम आपके संस्थान की वेबसाइट लोड कर रहे हैं\",\r\n  \"INPUT_PIN\": \"पिन कोड\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"सर्वर खोजें...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"लॉगिन हो रहा है...\",\r\n\r\n  \"WAITING\": \"प्रतीक्षा करें\",\r\n  \"IZLY_SMS_SEND\": \"आपको अभी जुड़ने के लिए एक लिंक मिला है, उस पर क्लिक करें और चरणों का पालन करें।\",\r\n  \"STEP\": \"चरण\",\r\n  \"STEP_OUTOF\": \"में से\",\r\n  \"INPUT_USERNAME\": \"यूज़रनेम\",\r\n  \"INPUT_MAIL\": \"ईमेल पता\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"ईमेल या यूज़रनेम\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"फ़ोन नंबर या ईमेल\",\r\n  \"INPUT_PASSWORD\": \"पासवर्ड\",\r\n  \"INPUT_PASSWORD_CODE\": \"एक्सेस कोड\",\r\n  \"INPUT_ETABID\": \"अपने संस्थान की आईडी\",\r\n  \"LOGIN_BTN\": \"लॉगिन\",\r\n  \"CONFIRM_BTN\": \"पुष्टि करें\",\r\n  \"CANCEL_BTN\": \"रद्द करें\",\r\n\r\n  \"Tab_New_Event\": \"नई घटना\",\r\n\r\n  \"Tab_Calendar_Icals\": \"iCal प्रबंधन\",\r\n  \"Tab_Calendar_Icals_Description\": \"अपने iCal URL प्रबंधित करें\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"iCal URL जोड़ें\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"{{title}} प्रबंधित करें\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"अपने कैलेंडर के साथ सिंक करने के लिए iCal URL जोड़ें या हटाएं।\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"शीर्षक गायब है\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"जोड़ने के लिए इस iCal URL को एक नाम दें।\",\r\n  \"Tab_Calendar_Icals_Empty\": \"कोई iCal URL नहीं जोड़ा गया\",\r\n\r\n  \"TabUnderConstruction_Title\": \"यह टैब अभी निर्माणाधीन है।\",\r\n  \"TabUnderConstruction_Details\": \"अपडेट के लिए बाद में वापस आएं।\",\r\n\r\n  \"TabDevModeNotice_Title\": \"डेवलपर मोड\",\r\n  \"TabDevModeNotice_Details\": \"डेवलपर्स के लिए पूर्ण परीक्षण वातावरण।\",\r\n\r\n  \"Alert_TechnicalDetails\": \"तकनीकी विवरण\",\r\n\r\n  \"Online_Course\": \"ऑनलाइन\",\r\n  \"Evaluated_Course\": \"मूल्यांकन\",\r\n  \"Edited_Course\": \"बदली हुई कक्षा\",\r\n  \"Canceled_Course\": \"कक्षा रद्द\",\r\n  \"No_Course_Room\": \"अज्ञात कमरा\",\r\n  \"Event_DeleteEvent\": \"घटना हटाएं\",\r\n  \"Event_Confirm_DeleteEvent\": \"क्या आप वाकई इस घटना को हटाना चाहते हैं?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"दोपहर का भोजन (लंच ब्रेक)\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"अच्छे भोजन का आनंद लें!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"यम!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"सुबह का ब्रेक\",\r\n  \"Course_Separator_Morning_Alt_1\": \"सोने का समय!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"नाश्ता\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"दोपहर का ब्रेक\",\r\n  \"Course_Separator_Evening_Alt_1\": \"ब्रेक तो बनता है!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"नाश्ते का समय!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"रात का ब्रेक\",\r\n  \"Course_Separator_Night_Alt_1\": \"सोने का समय!\",\r\n  \"Course_Separator_Night_Alt_2\": \"रात हो गई है!\",\r\n\r\n  \"Context_Delete\": \"हटाएं\",\r\n  \"Context_Cancel\": \"रद्द करें\",\r\n  \"Context_Edit\": \"संपादित करें\",\r\n  \"Context_Add\": \"जोड़ें\",\r\n\r\n  \"Form_Title\": \"शीर्षक\",\r\n  \"Form_Location\": \"स्थान\",\r\n  \"Form_Organizer\": \"आयोजक\",\r\n  \"Form_Start\": \"शुरू\",\r\n  \"Form_End\": \"अंत\",\r\n\r\n  \"Confirm_DeleteEvent\": \"क्या आप वाकई इस घटना को हटाना चाहते हैं?\",\r\n\r\n  \"Home_Welcome_Name\": \"नमस्ते, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"और दिखाएं\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"उपलब्ध\",\r\n  \"Home_Chats_Plurial\": \"चर्चाएं\",\r\n  \"Home_Chats_Singular\": \"चर्चा\",\r\n  \"Home_See_All_Tasks\": \"सभी कार्य देखें\",\r\n  \"Home_Welcome\": \"नमस्ते!\",\r\n  \"Home_Planned_None\": \"आज आपकी कोई कक्षा शेष नहीं है\",\r\n  \"Home_Planned_One\": \"आज आपकी एक कक्षा शेष है\",\r\n  \"Home_Planned_Number\": \"आज आपकी {{number}} कक्षाएं शेष हैं\",\r\n\r\n  \"Home_Widget_NextCourses\": \"अगली कक्षाएं\",\r\n  \"Home_Widget_NewGrades\": \"नए अंक\",\r\n  \"Home_Widget_NewHomeworks\": \"करने के लिए कार्य\",\r\n\r\n  \"Home_Widget_NoCourses\": \"कोई आगामी कक्षा नहीं\",\r\n  \"Home_Widget_NoCourses_Description\": \"आज के लिए कोई कक्षा निर्धारित नहीं है।\",\r\n\r\n  \"Home_Cards_Button_Title\": \"कार्ड\",\r\n  \"Home_Cards_Button_Description_None\": \"कोई कार्ड नहीं\",\r\n  \"Home_Cards_Button_Description_Singular\": \"एक कार्ड\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} कार्ड\",\r\n\r\n  \"Home_Chats_Button_Title\": \"संदेश\",\r\n  \"Home_Chats_Button_Description_None\": \"कोई संदेश नहीं\",\r\n  \"Home_Chats_Button_Description_Singular\": \"एक संदेश\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} संदेश\",\r\n\r\n  \"Home_Attendance_Title\": \"अनुपस्थिति\",\r\n  \"Home_Attendance_Button_Description_None\": \"कोई अनुपस्थिति नहीं\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"एक अनुपस्थिति\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} अनुपस्थितियां\",\r\n\r\n  \"Home_Menu_Button_Title\": \"मेनू\",\r\n  \"Home_Menu_Button_Description\": \"आज का भोजन\",\r\n\r\n  \"Tab_Calendar_Empty\": \"कोई घटना नहीं मिली\",\r\n  \"Tab_Calendar_Empty_Description\": \"शुरू करने के लिए एक घटना जोड़ें या अपना कैलेंडर सिंक करें।\",\r\n\r\n  \"Modal_Course_Title\": \"मेरी कक्षा\",\r\n  \"Modal_Course_StartsIn\": \"शुरू होगी\",\r\n  \"Modal_Course_StartedAgo\": \"समाप्त हुई\",\r\n  \"Modal_Course_Ongoing\": \"चल रही है\",\r\n  \"Modal_Course_Group\": \"समूह\",\r\n  \"Modal_Course_Group_Full\": \"कक्षा\",\r\n\r\n  \"Modal_Course_Details\": \"कक्षा का विवरण\",\r\n  \"Modal_Course_Teacher\": \"शिक्षक\",\r\n  \"Modal_Course_Room\": \"कमरा\",\r\n  \"Modal_Course_Duration\": \"अवधि\",\r\n\r\n  \"Modal_Course_Time\": \"कक्षा का समय\",\r\n  \"Modal_Course_Start\": \"शुरू\",\r\n  \"Modal_Course_End\": \"अंत\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"कार्य खोजें\",\r\n  \"Tasks_LeftHomeworks_Title\": \"शेष कार्य\",\r\n  \"Tasks_LeftHomeworks_Time\": \"इस सप्ताह\",\r\n  \"Tasks_Done_AllTasks\": \"सभी कार्य\",\r\n  \"Tasks_Done_CompletedTasks\": \"पूरे हो चुके हैं\",\r\n  \"Tasks_Nav_Left\": \"अभी {{count}} कार्य बाकी हैं\",\r\n  \"Tasks_Nav_One\": \"बस एक कार्य बाकी है\",\r\n  \"Tasks_Nav_Completed\": \"सब कुछ पूरा हो गया!\",\r\n  \"Tasks_Week\": \"सप्ताह\",\r\n  \"Tasks_NoTasks_Title\": \"कोई कार्य नहीं\",\r\n  \"Tasks_NoTasks_Description\": \"इस सप्ताह के लिए कोई कार्य निर्धारित नहीं है। आराम का आनंद लें!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"सप्ताह {{week}} के लिए\",\r\n  \"Tasks_NoTasks_Nav\": \"कोई कार्य नहीं\",\r\n  \"Task_Start\": \"बाकी है\",\r\n  \"Task_Complete\": \"पूरा हुआ\",\r\n  \"Task_Sorting_Title\": \"क्रमबद्ध करें\",\r\n  \"Task_OnlyShowUndone\": \"पूरे हुए कार्य\",\r\n  \"Task_Show_Title\": \"दिखाएं\",\r\n  \"Settings_General\": \"सामान्य\",\r\n\r\n  \"Latest_Grades\": \"नए अंक\",\r\n  \"Grades_Search_Placeholder\": \"कोई अंक या विषय खोजें\",\r\n\r\n  \"Grades_Avg_Methods\": \"गणना के तरीके\",\r\n  \"Grades_Avg_All_Title\": \"कुल औसत\",\r\n  \"Grades_Avg_All_Short\": \"कुल औसत\",\r\n  \"Grades_Avg_All_Pond\": \"भारित औसत\",\r\n  \"Grades_Avg_All_Pond_Short\": \"भारित औसत\",\r\n  \"Grades_Avg_All_Pond_Description\": \"सभी अंकों के भारित औसत की गणना करता है\",\r\n  \"Grades_Avg_Subject_Title\": \"विषयों का औसत\",\r\n  \"Grades_Avg_Subject_Short\": \"विषय औसत\",\r\n  \"Grades_Avg_Subject_Description\": \"विषय औसत के भारित औसत की गणना करता है\",\r\n  \"Grades_Avg_Median_Title\": \"माध्यिका (Median)\",\r\n  \"Grades_Avg_Median_Short\": \"माध्यिका\",\r\n\r\n  \"Grades_Avg_More\": \"अधिक जानें\",\r\n  \"Grades_Avg_KnowMore\": \"अधिक जानें\",\r\n  \"Grades_Avg_KnowMore_Description\": \"कुल औसत की गणना के तरीकों को समझें\",\r\n\r\n  \"Grades_SubjectInfo\": \"विषय की जानकारी\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} अंक\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"छात्र का औसत\",\r\n  \"SubjectInfo_Stats_Header\": \"सांख्यिकी\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"कक्षा का औसत\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"कक्षा का कुल औसत\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"अधिकतम औसत\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"समूह का सबसे अच्छा औसत\",\r\n  \"SubjectInfo_MinAverage_Label\": \"न्यूनतम औसत\",\r\n  \"SubjectInfo_MinAverage_Description\": \"समूह का सबसे कम औसत\",\r\n\r\n  \"Grades_Semester\": \"सेमेस्टर\",\r\n  \"Grades_Trimester\": \"तिमाही\",\r\n  \"Grades_OutPeriod\": \"अवधि के बाहर\",\r\n  \"Grades_Year\": \"वर्ष\",\r\n  \"Grades_MockExamBac\": \"मॉक परीक्षा\",\r\n  \"Grades_MockExamBrevet\": \"मॉक टेस्ट\",\r\n\r\n  \"Grades_Method_AllGrades\": \"सभी विषय\",\r\n  \"Grades_Method_Weighted\": \"भारण (Weighting)\",\r\n\r\n  \"Grades_Sort\": \"क्रमबद्ध करें\",\r\n  \"Grades_Sorting_Alphabetical\": \"वर्णमाला के अनुसार\",\r\n  \"Grades_Sorting_Averages\": \"औसत के अनुसार\",\r\n  \"Grades_Sorting_Date\": \"तारीख\",\r\n\r\n  \"Grades_Menu_SortBy\": \"क्रमबद्ध करें\",\r\n  \"Grades_Menu_AverageBy\": \"औसत निकालें\",\r\n  \"NoAverage\": \"कोई औसत नहीं\",\r\n\r\n  \"Grades_Empty_Title\": \"कोई अंक नहीं\",\r\n  \"Grades_Empty_Description\": \"इस अवधि में आपको अभी तक कोई अंक नहीं मिले हैं।\",\r\n\r\n  \"Grade_NoDescription\": \"{{subject}} का होमवर्क\",\r\n\r\n  \"Grades_Tab_Subjects\": \"विषय\",\r\n  \"Grades_Tab_Latest\": \"नए अंक\",\r\n\r\n  \"Profile_Attendance_Title\": \"उपस्थिति\",\r\n  \"Profile_Attendance_Denominator_Single\": \"अनुपस्थिति\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"अनुपस्थितियां\",\r\n\r\n  \"Profile_Discussions_Title\": \"चर्चाएं\",\r\n  \"Profile_Discussions_Denominator_Single\": \"बिना पढ़ा\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"बिना पढ़े\",\r\n\r\n  \"Profile_News_Title\": \"समाचार\",\r\n  \"Profile_News_Denominator_Single\": \"नया\",\r\n  \"Profile_News_Denominator_Plural\": \"नए\",\r\n  \"Profile_News_Open\": \"खोलें\",\r\n  \"Profile_News_Loading_Title\": \"समाचार लोड हो रहा है...\",\r\n  \"Profile_News_Author_Unknown\": \"अज्ञात लेखक\",\r\n\r\n  \"Profile_Cards_Title\": \"QR कोड और कार्ड\",\r\n\r\n  \"Modal_Grades_Title\": \"अंक का विवरण\",\r\n  \"Modal_Grades_BestGrade\": \"समूह का सबसे अच्छा अंक\",\r\n\r\n  \"Grades_Details_Title\": \"विवरण\",\r\n  \"Grades_NormalizedGrade_Title\": \"20 पर अंक\",\r\n  \"Grades_NormalizedGrade_Description\": \"20 के पैमाने पर परिवर्तित अंक का मूल्य\",\r\n  \"Grades_HighestGrade_Title\": \"उच्चतम अंक\",\r\n  \"Grades_HighestGrade_Description\": \"समूह में प्राप्त अधिकतम अंक\",\r\n  \"Grades_LowestGrade_Title\": \"न्यूनतम अंक\",\r\n  \"Grades_LowestGrade_Description\": \"समूह में प्राप्त न्यूनतम अंक\",\r\n  \"Grades_Influence_Title\": \"प्रभाव\",\r\n  \"Grades_Avg_Group_Title\": \"समूह का औसत\",\r\n  \"Grades_Coefficient\": \"गुणांक\",\r\n  \"Grades_Avg_Group_Short\": \"समूह औसत\",\r\n  \"Grades_Tab_Rank\": \"रैंकिंग\",\r\n  \"Grades_Tab_Rank_Description\": \"समूह में स्थिति\",\r\n\r\n  \"News_Search_Placeholder\": \"समाचार खोजें\",\r\n  \"News_Empty_Title\": \"कोई समाचार नहीं\",\r\n  \"News_Empty_Description\": \"आपके संस्थान में कोई समाचार नहीं मिला।\",\r\n  \"News_Search_NoResults\": \"कोई समाचार नहीं मिला\",\r\n  \"News_Search_NoResults_Description\": \"आपकी खोज के लिए कोई समाचार नहीं मिला।\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"एक कोमल और सुंदर थीम\",\r\n\r\n  \"News_Theme_Reading_Title\": \"पढ़ना\",\r\n  \"News_Theme_Reading_Description\": \"पढ़ने के लिए बनाई गई एक थीम\",\r\n\r\n  \"Attendance_Hours_Missed\": \"छूटे हुए घंटे\",\r\n  \"Attendance_Hours_Unjustified\": \"अनुचित घंटे\",\r\n  \"Attendance_Missing\": \"अनुपस्थितियां\",\r\n  \"Attendance_Delays\": \"देरी (Late)\",\r\n  \"Attendance_NoReason\": \"कोई कारण नहीं\",\r\n  \"Attendance_NoEvent_Title\": \"कोई घटना नहीं\",\r\n  \"Attendance_NoEvent_Description\": \"इस अवधि के लिए कोई अनुपस्थिति या देरी दर्ज नहीं की गई है।\",\r\n\r\n  \"Settings_Account_Title\": \"मेरा खाता\",\r\n  \"Settings_Account_Description\": \"मेरा खाता\",\r\n  \"Settings_Services_Title\": \"जुड़े हुए खाते\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"पिछला उपयोग किया गया खाता\",\r\n  \"Settings_Notifications_Title\": \"सूचनाएं\",\r\n  \"Settings_Notifications_Description\": \"अलर्ट, आवृत्ति...\",\r\n  \"Settings_Subjects_Title\": \"विषय\",\r\n  \"Settings_Subjects_Description\": \"नाम, रंग, फ़ॉन्ट...\",\r\n  \"Settings_Personalization_Title\": \"व्यक्तिगतकरण\",\r\n  \"Settings_Personalization_Description\": \"थीम, रंग...\",\r\n  \"Settings_Cards_Title\": \"कार्ड\",\r\n  \"Settings_Cards_Description\": \"कैंटीन, एक्सेस...\",\r\n  \"Settings_Accessibility_Title\": \"पहुँच (Accessibility)\",\r\n  \"Settings_Accessibility_Description\": \"डिस्प्ले, आवाज़...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"स्मार्ट सुविधाएँ\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI सुविधाएँ\",\r\n  \"Settings_MagicPlus_Enable\": \"Magic+ सक्रिय करें\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"उत्पादकता बढ़ाने के लिए आपके कार्यों के संगठन को स्वचालित रूप से अनुकूलित करता है\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"पूरी तरह से लोकल मॉडल, आपके डिवाइस के बाहर कोई डेटा ट्रांसफर नहीं होता\",\r\n  \"Settings_Donate_Title\": \"दान करें\",\r\n  \"Settings_Donate_Description\": \"प्रोजेक्ट का समर्थन करें\",\r\n  \"Settings_Telemetry_Title\": \"टेलीमेट्री और गोपनीयता\",\r\n  \"Settings_Telemetry_Description\": \"एकत्र किए गए डेटा को प्रबंधित करें\",\r\n  \"Settings_About_Title\": \"के बारे में\",\r\n  \"Settings_About_Description\": \"वर्जन\",\r\n  \"Settings_Logout_Title\": \"लॉगआउट करें\",\r\n  \"Settings_Logout_Description\": \"Papillon से इस खाते को हटाएं\",\r\n  \"Settings_Language_Title\": \"भाषा\",\r\n  \"Settings_Language_Description\": \"भाषा बदलें\",\r\n  \"Settings_Tabs_Title\": \"टैब\",\r\n  \"Settings_Tabs_Description\": \"मेनू से टैब छुपाएं\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"व्यक्तिगतकरण\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"थीम, विषय...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"विषयों को कस्टमाइज़ करें\",\r\n  \"Settings_Personalization_Accent\": \"मुख्य रंग (Accent Color)\",\r\n  \"Settings_Personalization_Accent_Description\": \"यहाँ आप जो रंग चुनेंगे वह Papillon के होम पेज पर लागू होगा।\",\r\n  \"Settings_Personalization_Theme\": \"थीम\",\r\n  \"Settings_Personalization_Icon_Title\": \"आइकन बदलें\",\r\n  \"Settings_Personalization_Icon_Description\": \"ऐप के आइकन को कस्टमाइज़ करें\",\r\n  \"Settings_Personalization_Subject_Title\": \"विषयों को कस्टमाइज़ करें\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"विषय\",\r\n  \"Settings_Personalization_Subject_Description\": \"आइकन, रंग\",\r\n  \"Settings_About_Papillion_Behind\": \"Papillon के पीछे\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon को 100% स्वयंसेवक छात्रों द्वारा बनाए रखा जाता है\",\r\n  \"Settings_About_Discord\": \"डिस्कॉर्ड सर्वर\",\r\n  \"Settings_About_Discord_Description\": \"डिस्कॉर्ड सर्वर से जुड़ें\",\r\n  \"Settings_About_Crowdin\": \"क्राउडिन प्रोजेक्ट\",\r\n  \"Settings_About_Crowdin_Description\": \"Papillon का अनुवाद करने में मदद करें\",\r\n  \"Settings_About_Github\": \"गिटहब प्रोजेक्ट\",\r\n  \"Settings_About_Github_Description\": \"गिटहब पर प्रोजेक्ट में योगदान दें\",\r\n  \"Settings_About_Issue\": \"बग की रिपोर्ट करें\",\r\n  \"Settings_About_Issue_Description\": \"मिले हुए बग की रिपोर्ट करें\",\r\n  \"Settings_About_Dependency_Version\": \"डिपेंडेंसी वर्जन\",\r\n\r\n  \"Alert_No_Technical\": \"कोई तकनीकी जानकारी उपलब्ध नहीं है।\",\r\n  \"Alert_Auth_Error\": \"प्रमाणीकरण त्रुटि\",\r\n  \"Alert_Auth_Bad_Creds\": \"आपके द्वारा दर्ज किए गए क्रेडेंशियल गलत हैं या आप अभिभावक खाते से जुड़ने का प्रयास कर रहे हैं। Papillon अभी इस प्रकार के खाते का समर्थन नहीं करता है।\",\r\n  \"Alert_Not_Supported\": \"असमर्थित सर्वर\",\r\n  \"Alert_Security_Instance_HTTP\": \"सुरक्षा कारणों से, Papillon अभी भी HTTP प्रोटोकॉल का उपयोग करने वाले सर्वर को स्वीकार नहीं करता है। हम अनुशंसा करते हैं कि आप संस्थान के प्रमुख को सूचित करें ताकि वे इस सर्वर को अपडेट कर सकें और इसकी सुरक्षा बनाए रख सकें।\",\r\n  \"Alert_NoDemo\": \"Papillon डेमो सर्वर के साथ काम करने के लिए नहीं बना है, कृपया दूसरे सर्वर का उपयोग करें।\",\r\n  \"Alert_Invalid_Instance\": \"Papillon इस PRONOTE सर्वर से जानकारी प्राप्त नहीं कर पा रहा है, क्या यह अभी भी वैध है?\",\r\n  \"Alert_No_Pos\": \"लोकेशन प्राप्त करने में असमर्थ\",\r\n  \"Alert_Connexion_Fail\": \"कनेक्शन संभव नहीं है\",\r\n\r\n  \"Feature_Limited\": \"सीमित सुविधाएँ\",\r\n  \"Feature_Soon\": \"यह जल्द ही आ रहा है!\",\r\n  \"Feature_Soon_Notification\": \"हम भविष्य के अपडेट में आपको यह सुविधा प्रदान करने के लिए कड़ी मेहनत कर रहे हैं।\",\r\n  \"Feature_Add_Card\": \"नेविगेशन बार में उपलब्ध प्रोफ़ाइल टैब से एक नया कार्ड जोड़ें\",\r\n\r\n  \"Webview_Wait\": \"थोड़ा धैर्य रखें...\",\r\n\r\n  \"Profile_QRCards\": \"QR कोड और कार्ड\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} कार्ड\",\r\n  \"Profile_Cards_Loading_History\": \"लेन-देन का इतिहास लोड हो रहा है\",\r\n  \"Profile_Cards_Loading_History_Description\": \"इसमें कुछ समय लग सकता है...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"कार्ड\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"कैंटीन, एक्सेस\",\r\n  \"Settings_Cards_Banner_Description\": \"Papillon पर अपने फोन से कहीं भी एक्सेस करने के लिए अपने कैंटीन और ट्रांसपोर्ट कार्ड जोड़ें\",\r\n  \"Settings_Cards_None_Title\": \"कोई कार्ड नहीं\",\r\n  \"Settings_Cards_Add_Button\": \"जोड़ें\",\r\n\r\n  \"Settings_Cards_None_Description\": \"अपना कैंटीन बैलेंस देखने, अपना QR कोड स्कैन करने और बहुत कुछ करने के लिए एक कार्ड जोड़ें\",\r\n  \"Settings_Subjects_None_Title\": \"कोई विषय नहीं\",\r\n  \"Settings_Subjects_None_Description\": \"विषयों को कस्टमाइज़ करने के लिए ऐप के विभिन्न टैब देखें।\",\r\n  \"Settings_Subjects_Reset_Title\": \"रीसेट करें\",\r\n  \"Settings_Subjects_Reset_Message\": \"क्या आप वाकई सभी विषयों को रीसेट करना चाहते हैं?\",\r\n  \"Settings_Subjects_Reset_Button\": \"रीसेट करें\",\r\n\r\n  \"Settings_Donator\": \"दाता\",\r\n  \"Settings_Donator_Description\": \"दाताओं की सूची देखें\",\r\n  \"Settings_App_Version\": \"ऐप वर्जन\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"QR कोड को टर्मिनल के स्कैनर की ओर करें\",\r\n  \"Profile_Cards_No_Reservation\": \"कोई आरक्षण नहीं\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"ऐसा लगता है कि आप इस दिन आरक्षण नहीं कर सकते।\",\r\n  \"Profile_Cards_History\": \"इतिहास\",\r\n  \"Magic_Important\": \"शायद महत्वपूर्ण\",\r\n\r\n  \"OnBoarding_Step\": \"चरण \",\r\n  \"OnBoarding_Step_Of\": \"में से \",\r\n\r\n  \"Consent_Advanced_Title\": \"मैं Papillon की मदद करना चाहता हूँ\",\r\n  \"Consent_Advanced_Description\": \"हम आपके उपयोग के बारे में अधिक विस्तृत जानकारी एकत्र करते हैं।\",\r\n  \"Consent_Required_Title\": \"केवल आवश्यक\",\r\n  \"Consent_Required_Description\": \"मूल रूप से, यह जानना कि किसी ने Papillon का उपयोग किया, क्या सब ठीक रहा और वह किस सेवा का उपयोग कर रहा है।\",\r\n  \"Consent_None_Title\": \"कुछ भी नहीं\",\r\n  \"Consent_None_Description\": \"हमें आपके अस्तित्व का पता भी नहीं चलेगा।\",\r\n  \"Consent_Title\": \"आप और Papillon\",\r\n  \"Consent_Intro1\": \"Papillon को बढ़ाने में मदद करने के लिए, आप कुछ उपयोग जानकारी साझा करना चुन सकते हैं।\",\r\n  \"Consent_PrivacyPolicy\": \"संदेह के मामले में, हमारी गोपनीयता नीति देखें\",\r\n  \"Consent_Refuse\": \"अस्वीकार करें\",\r\n  \"Consent_Accept\": \"स्वीकार करें\",\r\n  \"Consent_ChangeMind\": \"आप ऐप की सेटिंग्स से किसी भी समय अपना विचार बदल सकते हैं।\",\r\n  \"Consent_Arg1\": \"केवल ऐप को बेहतर बनाने के लिए उपयोग किया जाता है\",\r\n  \"Consent_Arg2\": \"गुमनाम और आपकी पहचान से जुड़ा नहीं\",\r\n  \"Consent_Arg3\": \"हमें आपके खातों तक पहुँच नहीं है\",\r\n\r\n  \"Changelog_Title\": \"अपडेट नोट्स\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"जमा करने की तारीख\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"विषय\",\r\n  \"Tasks_Sorting_Methods_Done\": \"पूरा नहीं हुआ\",\r\n  \"Tasks_ThisWeek\": \"इस सप्ताह\",\r\n\r\n  \"Task_Undone\": \"पूरा नहीं हुआ\",\r\n  \"Task_Done\": \"पूरा हुआ\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"वॉलपेपर कस्टमाइज़ करें\",\r\n  \"Modal_Profile_Title\": \"प्रोफ़ाइल कस्टमाइज़ करें\",\r\n\r\n  \"Modal_Task_Status\": \"कार्य की स्थिति\",\r\n  \"Modal_Task_Description\": \"कार्य का विवरण\",\r\n  \"Modal_Task_Attachments\": \"अटैचमेंट\",\r\n\r\n  \"Today\": \"आज\",\r\n  \"Yesterday\": \"कल\",\r\n  \"Tomorrow\": \"आने वाला कल\"\r\n}"
  },
  {
    "path": "locales/hr.json",
    "content": "{\n  \"Global_Back\": \"Natrag\",\n  \"Global_DatePrefix\": \"dana\",\n\n  \"Tab_Home\": \"Početna\",\n  \"Tab_Calendar\": \"Raspored\",\n  \"Tab_Tasks\": \"Zadaci\",\n  \"Tab_Grades\": \"Ocjene\",\n  \"Tab_Profile\": \"Profil\",\n  \"Tab_Custom_Profile\": \"Uredi moj profil\",\n  \"Button_Change_ProfilePicture\": \"Promijeni profilnu sliku\",\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Snimi fotografiju\",\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Iz galerije\",\n  \"Button_Change_ProfilePicture_FromService\": \"Preuzmi iz školskog sustava\",\n  \"Button_Change_ProfilePicture_Remove\": \"Ukloni fotografiju\",\n  \"Tab_Page\": \"Stranica\",\n  \"Tab_Settings\": \"Postavke\",\n  \"Tab_News\": \"Vijesti\",\n\n  \"ONBOARDING_MAIN_TITLE\": \"Aplikacija za upravljanje tvojim školskim životom\",\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Poveži svoje školske aplikacije kako bi pristupio ocjenama, rasporedu, zadacima i još mnogo čemu u sučelju Papillon!\",\n  \"ONBOARDING_START_BTN\": \"Započni\",\n  \"ONBOARDING_HELP_BTN\": \"Trebaš li pomoć?\",\n  \"ONBOARDING_UNIVERSITY\": \"Sveučilišna usluga\",\n  \"ONBOARDING_RESTAURANTS\": \"Usluga prehrane\",\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Odaberi svoju školsku uslugu\",\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Odaberi svoju uslugu prehrane\",\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Odaberi svoju sveučilišnu uslugu\",\n  \"ONBOARDING_LOGIN_METHOD\": \"Kako se želiš prijaviti?\",\n  \"ONBOARDING_METHOD_POSITION\": \"Koristi moju lokaciju\",\n  \"ONBOARDING_METHOD_SEARCH\": \"Pretraži grad\",\n  \"ONBOARDING_METHOD_QRCODE\": \"Imam QR kod\",\n  \"ONBOARDING_METHOD_LINK\": \"Imam URL za prijavu\",\n  \"ONBOARDING_SELECT_SCHOOL\": \"Odaberi svoju ustanovu\",\n  \"ONBOARDING_SEARCH_TITLE\": \"Unesi naziv svog grada i odaberi ustanovu\",\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Prijavi se kao i obično\",\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Prijavi se na svoj račun\",\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Odaberi poslužitelj dodijeljen računu\",\n  \"ONBOARDING_PRONOTE_PIN\": \"Unesi četveroznamenkasti kod koji si upravo stvorio u PRONOTE-u\",\n  \"ONBOARDING_LOGIN_TO\": \"Prijava na\",\n  \"ONBOARDING_SCAN_QRCODE\": \"Skeniraj QR kod svoje ustanove za povezivanje.\",\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validacija QR koda\",\n  \"ONBOARDING_QRCODE_WAIT\": \"Ovo može potrajati nekoliko trenutaka...\",\n  \"ONBOARDING_URL\": \"Unesi URL adresu svoje ustanove\",\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL tvoje PRONOTE instance\",\n  \"ONBOARDING_COLOR_TITLE\": \"Prije kraja\",\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Odaberi\",\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"boju teme\",\n  \"ONBOARDING_LOGIN_PINCODE\": \"Unesi PIN kod svog PRONOTE-a\",\n  \"Onboarding_Load_Webview_Description\": \"Učitavamo web stranicu tvoje ustanove\",\n  \"INPUT_PIN\": \"PIN kod\",\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Pretraži instancu...\",\n  \"ONBOARDING_LOADING_LOGIN\": \"Prijava u tijeku...\",\n\n  \"WAITING\": \"Čekanje\",\n  \"IZLY_SMS_SEND\": \"Upravo si primio poveznicu za prijavu, klikni na nju i slijedi korake.\",\n  \"STEP\": \"Korak\",\n  \"STEP_OUTOF\": \"od\",\n  \"INPUT_USERNAME\": \"Korisničko ime\",\n  \"INPUT_MAIL\": \"E-mail adresa\",\n  \"INPUT_MAIL_OR_USERNAME\": \"E-mail ili korisničko ime\",\n  \"INPUT_PHONE_OR_MAIL\": \"Broj telefona ili e-mail\",\n  \"INPUT_PASSWORD\": \"Lozinka\",\n  \"INPUT_PASSWORD_CODE\": \"Pristupni kod\",\n  \"INPUT_ETABID\": \"Identifikator tvoje ustanove\",\n  \"LOGIN_BTN\": \"Prijavi se\",\n  \"CONFIRM_BTN\": \"Potvrdi\",\n  \"CANCEL_BTN\": \"Odustani\",\n\n  \"Tab_New_Event\": \"Novi događaj\",\n\n  \"Tab_Calendar_Icals\": \"Upravljanje iCal-om\",\n  \"Tab_Calendar_Icals_Description\": \"Upravljaj svojim iCal URL-ovima\",\n\n  \"Tab_Calendar_Icals_Add_URL\": \"Dodaj iCal URL\",\n  \"Tab_Calendar_Icals_Manage_Title\": \"Upravljaj {{title}}\",\n  \"Tab_Calendar_Icals_Manage_Description\": \"Dodaj ili ukloni iCal URL-ove za sinkronizaciju s rasporedom.\",\n  \"Tab_Calendar_Icals_Add_Title\": \"Nedostaje naslov\",\n  \"Tab_Calendar_Icals_Add_Description\": \"Daj naziv ovom iCal URL-u kako bi ga dodao.\",\n  \"Tab_Calendar_Icals_Empty\": \"Nema dodanih iCal URL-ova\",\n\n  \"TabUnderConstruction_Title\": \"Ova kartica je u izradi.\",\n  \"TabUnderConstruction_Details\": \"Vrati se kasnije za ažuriranja.\",\n\n  \"TabDevModeNotice_Title\": \"Razvojni način\",\n  \"TabDevModeNotice_Details\": \"Puno testno okruženje za programere.\",\n\n  \"Alert_TechnicalDetails\": \"Tehnički detalji\",\n\n  \"Online_Course\": \"Online\",\n  \"Evaluated_Course\": \"Ocjenjivanje/Ispit\",\n  \"Edited_Course\": \"Izmijenjen sat\",\n  \"Canceled_Course\": \"Otkazan sat\",\n  \"No_Course_Room\": \"Nepoznata učionica\",\n  \"Event_DeleteEvent\": \"Obriši događaj\",\n  \"Event_Confirm_DeleteEvent\": \"Jesi li siguran da želiš obrisati ovaj događaj?\",\n\n  \"Course_Separator_Lunch_Default\": \"Pauza za ručak\",\n  \"Course_Separator_Lunch_Alt_1\": \"Dobar tek!\",\n  \"Course_Separator_Lunch_Alt_2\": \"Njam!\",\n\n  \"Course_Separator_Morning_Default\": \"Jutarnja pauza\",\n  \"Course_Separator_Morning_Alt_1\": \"Vrijeme za spavanje!\",\n  \"Course_Separator_Morning_Alt_2\": \"Doručak\",\n\n  \"Course_Separator_Evening_Default\": \"Popodnevna pauza\",\n  \"Course_Separator_Evening_Alt_1\": \"Vrijeme je za odmor!\",\n  \"Course_Separator_Evening_Alt_2\": \"Vrijeme za užinu!\",\n\n  \"Course_Separator_Night_Default\": \"Noćna pauza\",\n  \"Course_Separator_Night_Alt_1\": \"Vrijeme za spavanje!\",\n  \"Course_Separator_Night_Alt_2\": \"Noć je!\",\n\n  \"Context_Delete\": \"Obriši\",\n  \"Context_Cancel\": \"Odustani\",\n  \"Context_Edit\": \"Uredi\",\n  \"Context_Add\": \"Dodaj\",\n\n  \"Form_Title\": \"Naslov\",\n  \"Form_Location\": \"Lokacija\",\n  \"Form_Organizer\": \"Organizator\",\n  \"Form_Start\": \"Početak\",\n  \"Form_End\": \"Kraj\",\n\n  \"Confirm_DeleteEvent\": \"Jesi li siguran da želiš obrisati ovaj događaj?\",\n\n  \"Home_Welcome_Name\": \"Zdravo, {{name}} {{emoji}}\",\n  \"Home_Display_More\": \"Prikaži više\",\n  \"Home_Cards_Button_Description_Plurial\": \"dostupno\",\n  \"Home_Chats_Plurial\": \"razgovora\",\n  \"Home_Chats_Singular\": \"razgovor\",\n  \"Home_See_All_Tasks\": \"Vidi sve zadatke\",\n  \"Home_Welcome\": \"Pozdrav!\",\n  \"Home_Planned_None\": \"Danas nemaš više sati u rasporedu\",\n  \"Home_Planned_One\": \"Preostao ti je jedan sat danas\",\n  \"Home_Planned_Number\": \"Preostalo ti je {{number}} sati danas\",\n\n  \"Home_Widget_NextCourses\": \"Sljedeći sati\",\n  \"Home_Widget_NewGrades\": \"Nove ocjene\",\n  \"Home_Widget_NewHomeworks\": \"Zadaci za napraviti\",\n\n  \"Home_Widget_NoCourses\": \"Nema nadolazećih sati\",\n  \"Home_Widget_NoCourses_Description\": \"Nema zakazanih sati za danas.\",\n\n  \"Home_Cards_Button_Title\": \"Kartice\",\n  \"Home_Cards_Button_Description_None\": \"Nema kartica\",\n  \"Home_Cards_Button_Description_Singular\": \"Jedna kartica\",\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kartica\",\n\n  \"Home_Chats_Button_Title\": \"Poruke\",\n  \"Home_Chats_Button_Description_None\": \"Nema poruka\",\n  \"Home_Chats_Button_Description_Singular\": \"Jedna poruka\",\n  \"Home_Chats_Button_Description_Number\": \"{{number}} poruka\",\n\n  \"Home_Attendance_Title\": \"Izostanci\",\n  \"Home_Attendance_Button_Description_None\": \"Nema izostanaka\",\n  \"Home_Attendance_Button_Description_Singular\": \"Jedan izostanak\",\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} izostanaka\",\n\n  \"Home_Menu_Button_Title\": \"Meni\",\n  \"Home_Menu_Button_Description\": \"Dnevni meni\",\n\n  \"Tab_Calendar_Empty\": \"Nema pronađenih događaja\",\n  \"Tab_Calendar_Empty_Description\": \"Dodaj događaj ili sinkroniziraj raspored za početak.\",\n\n  \"Modal_Course_Title\": \"Moj sat\",\n  \"Modal_Course_StartsIn\": \"Počinje za\",\n  \"Modal_Course_StartedAgo\": \"Završilo prije\",\n  \"Modal_Course_Ongoing\": \"Traje već\",\n  \"Modal_Course_Group\": \"Grupa\",\n  \"Modal_Course_Group_Full\": \"Razred\",\n\n  \"Modal_Course_Details\": \"Detalji sata\",\n  \"Modal_Course_Teacher\": \"Nastavnik\",\n  \"Modal_Course_Room\": \"Učionica\",\n  \"Modal_Course_Duration\": \"Trajanje\",\n\n  \"Modal_Course_Time\": \"Vrijeme održavanja\",\n  \"Modal_Course_Start\": \"Početak\",\n  \"Modal_Course_End\": \"Kraj\",\n\n  \"Tasks_Search_Placeholder\": \"Pretraži zadatke\",\n  \"Tasks_LeftHomeworks_Title\": \"preostalih zadataka\",\n  \"Tasks_LeftHomeworks_Time\": \"ovaj tjedan\",\n  \"Tasks_Done_AllTasks\": \"Svi zadaci\",\n  \"Tasks_Done_CompletedTasks\": \"su dovršeni\",\n  \"Tasks_Nav_Left\": \"Još {{count}} zadatka za napraviti\",\n  \"Tasks_Nav_One\": \"Još samo jedan zadatak\",\n  \"Tasks_Nav_Completed\": \"Sve je završeno!\",\n  \"Tasks_Week\": \"Tjedan\",\n  \"Tasks_NoTasks_Title\": \"Nema zadataka\",\n  \"Tasks_NoTasks_Description\": \"Nema planiranih zadataka za ovaj tjedan. Uživaj u odmoru!\",\n  \"Tasks_NoTasks_ForWeek\": \"za tjedan {{week}}\",\n  \"Tasks_NoTasks_Nav\": \"Nema zadataka\",\n  \"Task_Start\": \"Za napraviti\",\n  \"Task_Complete\": \"Dovršeno\",\n  \"Task_Sorting_Title\": \"Sortiraj po\",\n  \"Task_OnlyShowUndone\": \"Dovršeni zadaci\",\n  \"Task_Show_Title\": \"Prikaži\",\n  \"Settings_General\": \"Općenito\",\n\n  \"Latest_Grades\": \"Nove ocjene\",\n  \"Grades_Search_Placeholder\": \"Pretraži ocjenu, predmet\",\n\n  \"Grades_Avg_Methods\": \"Metode izračuna\",\n  \"Grades_Avg_All_Title\": \"Opći prosjek\",\n  \"Grades_Avg_All_Short\": \"Opći pr.\",\n  \"Grades_Avg_All_Pond\": \"Težinski prosjek\",\n  \"Grades_Avg_All_Pond_Short\": \"Težinski pr.\",\n  \"Grades_Avg_All_Pond_Description\": \"Izračunava težinski prosjek svih ocjena\",\n  \"Grades_Avg_Subject_Title\": \"Prosjek predmeta\",\n  \"Grades_Avg_Subject_Short\": \"Pr. predmeta\",\n  \"Grades_Avg_Subject_Description\": \"Izračunava težinski prosjek prosjeka predmeta\",\n  \"Grades_Avg_Median_Title\": \"Medijan\",\n  \"Grades_Avg_Median_Short\": \"Medijan\",\n\n  \"Grades_Avg_More\": \"Saznaj više\",\n  \"Grades_Avg_KnowMore\": \"Saznaj više\",\n  \"Grades_Avg_KnowMore_Description\": \"Razumijevanje metoda izračuna općeg prosjeka\",\n\n  \"Grades_SubjectInfo\": \"Informacije o predmetu\",\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} ocjena\",\n  \"SubjectInfo_StudentAverage_Label\": \"Učenikov prosjek\",\n  \"SubjectInfo_Stats_Header\": \"Statistika\",\n  \"SubjectInfo_ClassAverage_Label\": \"Prosjek razreda\",\n  \"SubjectInfo_ClassAverage_Description\": \"Opći prosjek razreda\",\n  \"SubjectInfo_MaxAverage_Label\": \"Najviši prosjek\",\n  \"SubjectInfo_MaxAverage_Description\": \"Najbolji prosjek u grupi\",\n  \"SubjectInfo_MinAverage_Label\": \"Najniži prosjek\",\n  \"SubjectInfo_MinAverage_Description\": \"Najniži prosjek u grupi\",\n\n  \"Grades_Semester\": \"Polugodište\",\n  \"Grades_Trimester\": \"Tromjesečje\",\n  \"Grades_OutPeriod\": \"Izvan razdoblja\",\n  \"Grades_Year\": \"Godina\",\n  \"Grades_MockExamBac\": \"Probna matura\",\n  \"Grades_MockExamBrevet\": \"Probni ispit\",\n\n  \"Grades_Method_AllGrades\": \"Svi predmeti\",\n  \"Grades_Method_Weighted\": \"Ponderiranje\",\n\n  \"Grades_Sort\": \"Sortiraj\",\n  \"Grades_Sorting_Alphabetical\": \"Abecedno\",\n  \"Grades_Sorting_Averages\": \"Prosjeci\",\n  \"Grades_Sorting_Date\": \"Datum\",\n\n  \"Grades_Menu_SortBy\": \"Sortiranje po\",\n  \"Grades_Menu_AverageBy\": \"Prosjek po\",\n  \"NoAverage\": \"Nema prosjeka\",\n\n  \"Grades_Empty_Title\": \"Nema ocjena\",\n  \"Grades_Empty_Description\": \"Još nisi dobio ocjene u ovom razdoblju.\",\n\n  \"Grade_NoDescription\": \"Zadatak iz predmeta {{subject}}\",\n\n  \"Grades_Tab_Subjects\": \"Predmeti\",\n  \"Grades_Tab_Latest\": \"Nove ocjene\",\n\n  \"Profile_Attendance_Title\": \"Prisutnost\",\n  \"Profile_Attendance_Denominator_Single\": \"izostanak\",\n  \"Profile_Attendance_Denominator_Plural\": \"izostanaka\",\n\n  \"Profile_Discussions_Title\": \"Razgovori\",\n  \"Profile_Discussions_Denominator_Single\": \"nepročitano\",\n  \"Profile_Discussions_Denominator_Plural\": \"nepročitanih\",\n\n  \"Profile_News_Title\": \"Vijesti\",\n  \"Profile_News_Denominator_Single\": \"nova\",\n  \"Profile_News_Denominator_Plural\": \"nove\",\n  \"Profile_News_Open\": \"Otvori\",\n  \"Profile_News_Loading_Title\": \"Učitavanje vijesti...\",\n  \"Profile_News_Author_Unknown\": \"Nepoznat autor\",\n\n  \"Profile_Cards_Title\": \"QR kod i kartice\",\n\n  \"Modal_Grades_Title\": \"Detalj ocjene\",\n  \"Modal_Grades_BestGrade\": \"Najbolja ocjena u grupi\",\n\n  \"Grades_Details_Title\": \"Detalji\",\n  \"Grades_NormalizedGrade_Title\": \"Ocjena svedena na 20\",\n  \"Grades_NormalizedGrade_Description\": \"Vrijednost ocjene pretvorena u skalu do 20\",\n  \"Grades_HighestGrade_Title\": \"Najviša ocjena\",\n  \"Grades_HighestGrade_Description\": \"Najviša ocjena postignuta u grupi\",\n  \"Grades_LowestGrade_Title\": \"Najniža ocjena\",\n  \"Grades_LowestGrade_Description\": \"Najniža ocjena postignuta u grupi\",\n  \"Grades_Influence_Title\": \"Utjecaj\",\n  \"Grades_Avg_Group_Title\": \"Prosjek grupe\",\n  \"Grades_Coefficient\": \"Koeficijent\",\n  \"Grades_Avg_Group_Short\": \"Pr. grupe\",\n  \"Grades_Tab_Rank\": \"Rang\",\n  \"Grades_Tab_Rank_Description\": \"Pozicija u grupi\",\n\n  \"News_Search_Placeholder\": \"Pretraži vijesti\",\n  \"News_Empty_Title\": \"Nema vijesti\",\n  \"News_Empty_Description\": \"Nisu pronađene vijesti u tvojoj ustanovi.\",\n  \"News_Search_NoResults\": \"Nema pronađenih vijesti\",\n  \"News_Search_NoResults_Description\": \"Nema vijesti koje odgovaraju tvojoj pretrazi.\",\n\n  \"News_Theme_Papillon_Title\": \"Papillon\",\n  \"News_Theme_Papillon_Description\": \"Nježna i elegantna tema\",\n\n  \"News_Theme_Reading_Title\": \"Čitanje\",\n  \"News_Theme_Reading_Description\": \"Tema dizajnirana za čitanje\",\n\n  \"Attendance_Hours_Missed\": \"Propušteni sati\",\n  \"Attendance_Hours_Unjustified\": \"Neopravdani sati\",\n  \"Attendance_Missing\": \"Izostanci\",\n  \"Attendance_Delays\": \"Kašnjenja\",\n  \"Attendance_NoReason\": \"Bez razloga\",\n  \"Attendance_NoEvent_Title\": \"Nema događaja\",\n  \"Attendance_NoEvent_Description\": \"Nema zabilježenih izostanaka ili kašnjenja za ovo razdoblje.\",\n\n  \"Settings_Account_Title\": \"Moj račun\",\n  \"Settings_Account_Description\": \"Moj račun\",\n  \"Settings_Services_Title\": \"Povezani računi\",\n  \"Settings_Services_Title_LastAccountUsed\": \"Zadnji korišteni račun\",\n  \"Settings_Notifications_Title\": \"Obavijesti\",\n  \"Settings_Notifications_Description\": \"Upozorenja, učestalost...\",\n  \"Settings_Subjects_Title\": \"Predmeti\",\n  \"Settings_Subjects_Description\": \"Naziv, boja, font...\",\n  \"Settings_Personalization_Title\": \"Personalizacija\",\n  \"Settings_Personalization_Description\": \"Teme, boje...\",\n  \"Settings_Cards_Title\": \"Kartice\",\n  \"Settings_Cards_Description\": \"Kuhinja, pristupi...\",\n  \"Settings_Accessibility_Title\": \"Pristupačnost\",\n  \"Settings_Accessibility_Description\": \"Prikaz, zvuk...\",\n  \"Settings_MagicPlus_Title\": \"Magic+\",\n  \"Settings_MagicPlus_Description\": \"Pametne značajke\",\n  \"Settings_MagicPlus_Description_Card\": \"AI značajke\",\n  \"Settings_MagicPlus_Enable\": \"Omogući Magic+\",\n  \"Settings_MagicPlus_Description_Optimization\": \"Automatski optimizira organizaciju tvojih zadataka za poboljšanje produktivnosti\",\n  \"Settings_MagicPlus_ExplanationLocal\": \"Potpuno lokalni model, nikakvi podaci se ne prenose izvan tvog uređaja\",\n  \"Settings_Donate_Title\": \"Doniraj\",\n  \"Settings_Donate_Description\": \"Podrži projekt\",\n  \"Settings_Telemetry_Title\": \"Telemetrija i privatnost\",\n  \"Settings_Telemetry_Description\": \"Upravljaj prikupljenim podacima\",\n  \"Settings_About_Title\": \"O aplikaciji\",\n  \"Settings_About_Description\": \"Verzija\",\n  \"Settings_Logout_Title\": \"Odjavi se\",\n  \"Settings_Logout_Description\": \"Ukloni ovaj račun iz Papillona\",\n  \"Settings_Language_Title\": \"Jezik\",\n  \"Settings_Language_Description\": \"Promijeni jezik\",\n  \"Settings_Tabs_Title\": \"Kartice\",\n  \"Settings_Tabs_Description\": \"Sakrij kartice iz izbornika\",\n\n  \"Settings_Personalization_Title_Card\": \"Personalizacija\",\n  \"Settings_Personalization_Subtitle_Card\": \"Teme, predmeti...\",\n  \"Settings_SubjectPersonalization_Title\": \"Personaliziraj predmete\",\n  \"Settings_Personalization_Accent\": \"Boja naglaska\",\n  \"Settings_Personalization_Accent_Description\": \"Boja koju odabereš ovdje primijenit će se na početnu stranicu Papillona.\",\n  \"Settings_Personalization_Theme\": \"Tema\",\n  \"Settings_Personalization_Icon_Title\": \"Promijeni ikonu\",\n  \"Settings_Personalization_Icon_Description\": \"Personaliziraj ikonu aplikacije\",\n  \"Settings_Personalization_Subject_Title\": \"Personaliziraj predmete\",\n  \"Settings_Personalization_Subject_Title_Card\": \"Predmeti\",\n  \"Settings_Personalization_Subject_Description\": \"Ikone, boje\",\n  \"Settings_About_Papillion_Behind\": \"Iza Papillona\",\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon održavaju studenti, 100% volonteri\",\n  \"Settings_About_Discord\": \"Discord poslužitelj\",\n  \"Settings_About_Discord_Description\": \"Pridruži se Discord poslužitelju\",\n  \"Settings_About_Crowdin\": \"Crowdin projekt\",\n  \"Settings_About_Crowdin_Description\": \"Pomozi u prijevodu Papillona\",\n  \"Settings_About_Github\": \"GitHub projekt\",\n  \"Settings_About_Github_Description\": \"Doprinesi projektu na GitHubu\",\n  \"Settings_About_Issue\": \"Prijavi grešku\",\n  \"Settings_About_Issue_Description\": \"Prijavi uočenu grešku\",\n  \"Settings_About_Dependency_Version\": \"Verzija ovisnosti\",\n\n  \"Alert_No_Technical\": \"Nema dostupnih tehničkih informacija.\",\n  \"Alert_Auth_Error\": \"Pogreška pri autentifikaciji\",\n  \"Alert_Auth_Bad_Creds\": \"Podaci koje si unio su netočni ili se pokušavaš prijaviti s roditeljskim računom. Ova vrsta računa još nije podržana u Papillonu.\",\n  \"Alert_Not_Supported\": \"Instanca nije podržana\",\n  \"Alert_Security_Instance_HTTP\": \"Iz sigurnosnih razloga, Papillon ne prihvaća instance koje još koriste HTTP protokol. Preporučujemo da obavijestiš ravnatelja ustanove kako bi ažurirali instancu i sačuvali sigurnost.\",\n  \"Alert_NoDemo\": \"Papillon nije napravljen za rad s demo instancama, molimo koristi pravu instancu.\",\n  \"Alert_Invalid_Instance\": \"Papillon ne može dobiti informacije s ove PRONOTE instance, je li još uvijek valjana?\",\n  \"Alert_No_Pos\": \"Nemoguće dohvatiti lokaciju\",\n  \"Alert_Connexion_Fail\": \"Veza nije moguća\",\n\n  \"Feature_Limited\": \"Ograničene značajke\",\n  \"Feature_Soon\": \"Dolazi uskoro!\",\n  \"Feature_Soon_Notification\": \"Naporno radimo kako bismo ti omogućili ovu značajku u budućem ažuriranju.\",\n  \"Feature_Add_Card\": \"Dodaj novu karticu iz kartice Profil dostupne u navigacijskoj traci\",\n\n  \"Webview_Wait\": \"Malo strpljenja...\",\n\n  \"Profile_QRCards\": \"QR kod i kartice\",\n  \"Profile_QRCards_Subtitle\": \"{{count}} kartica\",\n  \"Profile_Cards_Loading_History\": \"Učitavanje povijesti transakcija\",\n  \"Profile_Cards_Loading_History_Description\": \"Ovo može potrajati trenutak...\",\n\n  \"Settings_Cards_Banner_Title\": \"Kartice\",\n  \"Settings_Cantineen_Subtitle_Card\": \"Kuhinja, pristup\",\n  \"Settings_Cards_Banner_Description\": \"Dodaj svoje kartice za menzu i prijevoz kako bi im pristupio bilo gdje s mobitela u Papillonu\",\n  \"Settings_Cards_None_Title\": \"Nema kartica\",\n  \"Settings_Cards_Add_Button\": \"Dodaj\",\n\n  \"Settings_Cards_None_Description\": \"Dodaj jednu za pregled stanja u menzi, skeniranje QR koda i više\",\n  \"Settings_Subjects_None_Title\": \"Nema predmeta\",\n  \"Settings_Subjects_None_Description\": \"Pregledaj različite kartice aplikacije kako bi mogao personalizirati predmete.\",\n  \"Settings_Subjects_Reset_Title\": \"Resetiraj\",\n  \"Settings_Subjects_Reset_Message\": \"Želiš li zaista resetirati sve predmete?\",\n  \"Settings_Subjects_Reset_Button\": \"Resetiraj\",\n\n  \"Settings_Donator\": \"Donatori\",\n  \"Settings_Donator_Description\": \"Vidi popis donatora\",\n  \"Settings_App_Version\": \"Verzija aplikacije\",\n\n  \"Profile_Cards_Scan_Orientation\": \"Usmjeri QR kod prema skeneru terminala\",\n  \"Profile_Cards_No_Reservation\": \"Nema rezervacije\",\n  \"Profile_Cards_No_Available_Reservation\": \"Čini se da ne možeš rezervirati za ovaj dan.\",\n  \"Profile_Cards_History\": \"Povijest\",\n  \"Magic_Important\": \"Možda važno\",\n\n  \"OnBoarding_Step\": \"Korak \",\n  \"OnBoarding_Step_Of\": \"od \",\n\n  \"Consent_Advanced_Title\": \"Želim pomoći Papillonu\",\n  \"Consent_Advanced_Description\": \"Prikupljamo detaljnije informacije o tvom korištenju.\",\n  \"Consent_Required_Title\": \"Samo ono bitno\",\n  \"Consent_Required_Description\": \"Ukratko, znati da je netko koristio Papillon, je li sve prošlo dobro i koju uslugu koristi.\",\n  \"Consent_None_Title\": \"Baš ništa\",\n  \"Consent_None_Description\": \"Nećemo uopće znati za tvoje postojanje.\",\n  \"Consent_Title\": \"Ti i Papillon\",\n  \"Consent_Intro1\": \"Kako bi pomogao Papillonu da raste, možeš odabrati dijeljenje nekih informacija o korištenju.\",\n  \"Consent_PrivacyPolicy\": \"U slučaju sumnje, pogledaj našu politiku privatnosti\",\n  \"Consent_Refuse\": \"Odbij\",\n  \"Consent_Accept\": \"Prihvati\",\n  \"Consent_ChangeMind\": \"Možeš se predomisliti u bilo kojem trenutku u postavkama aplikacije.\",\n  \"Consent_Arg1\": \"Služi isključivo za poboljšanje aplikacije\",\n  \"Consent_Arg2\": \"Anonimno i nije povezano s tvojim identitetom\",\n  \"Consent_Arg3\": \"Nemamo pristup tvojim računima\",\n\n  \"Changelog_Title\": \"Bilješke o izdanju\",\n\n  \"Tasks_Sorting_Methods_DueDate\": \"Datum predaje\",\n  \"Tasks_Sorting_Methods_Subject\": \"Predmeti\",\n  \"Tasks_Sorting_Methods_Done\": \"Nedovršeno\",\n  \"Tasks_ThisWeek\": \"Ovaj tjedan\",\n\n  \"Task_Undone\": \"Nedovršeno\",\n  \"Task_Done\": \"Dovršeno\",\n\n  \"Modal_Wallpaper_Title\": \"Personaliziraj pozadinu\",\n  \"Modal_Profile_Title\": \"Personaliziraj profil\",\n\n  \"Modal_Task_Status\": \"Status zadatka\",\n  \"Modal_Task_Description\": \"Opis zadatka\",\n  \"Modal_Task_Attachments\": \"Prilozi\",\n\n  \"Today\": \"Danas\",\n  \"Yesterday\": \"Jučer\",\n  \"Tomorrow\": \"Sutra\"\n}"
  },
  {
    "path": "locales/hu.json",
    "content": "{\r\n  \"Global_Back\": \"Vissza\",\r\n  \"Global_DatePrefix\": \"ekkor:\",\r\n\r\n  \"Tab_Home\": \"Kezdőlap\",\r\n  \"Tab_Calendar\": \"Órarend\",\r\n  \"Tab_Tasks\": \"Feladatok\",\r\n  \"Tab_Grades\": \"Jegyek\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Profil szerkesztése\",\r\n  \"Button_Change_ProfilePicture\": \"Profilkép módosítása\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Fotó készítése\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Választás a galériából\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Lekérés az iskolai rendszerből\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Fotó törlése\",\r\n  \"Tab_Page\": \"Oldal\",\r\n  \"Tab_Settings\": \"Beállítások\",\r\n  \"Tab_News\": \"Hírek\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Az app az iskolai életed kezeléséhez\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Csatlakoztasd az iskolai alkalmazásaidat, hogy elérd a jegyeidet, órarendedet, házi feladataidat és még sok mást a Papillon felületén!\",\r\n  \"ONBOARDING_START_BTN\": \"Kezdés\",\r\n  \"ONBOARDING_HELP_BTN\": \"Segítségre van szükséged?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Egyetemi szolgáltatás\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Menza szolgáltatás\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Válaszd ki az iskolai szolgáltatódat\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Válaszd ki a menza szolgáltatódat\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Válaszd ki az egyetemi szolgáltatódat\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Hogyan szeretnél bejelentkezni?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Saját pozíció használata\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Város keresése\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Van QR-kódom\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Van bejelentkezési URL-em\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Válaszd ki az intézményedet\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Add meg a városod nevét, és válaszd ki az intézményedet\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Jelentkezz be a megszokott módon\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Jelentkezz be a fiókodba\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Válaszd ki a fiókhoz tartozó hostot\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Add meg a 4 jegyű kódot, amelyet az imént hoztál létre a PRONOTE-ban\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Bejelentkezés ide:\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Szkenneld be az intézményed QR-kódját a csatlakozáshoz.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR-kód ellenőrzése\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Ez eltarthat néhány pillanatig...\",\r\n  \"ONBOARDING_URL\": \"Add meg az intézményed URL-címét\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"A PRONOTE példányod URL-je\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Mielőtt befejeznéd\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Válassz egy\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"témaszínt\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Add meg a PRONOTE PIN-kódodat\",\r\n  \"Onboarding_Load_Webview_Description\": \"Az intézményed weboldalának betöltése\",\r\n  \"INPUT_PIN\": \"PIN-kód\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Példány keresése...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Bejelentkezés folyamatban...\",\r\n\r\n  \"WAITING\": \"Várakozás\",\r\n  \"IZLY_SMS_SEND\": \"Most kaptál egy linket a bejelentkezéshez, kattints rá és kövesd a lépéseket.\",\r\n  \"STEP\": \"Lépés\",\r\n  \"STEP_OUTOF\": \"/\",\r\n  \"INPUT_USERNAME\": \"Felhasználónév\",\r\n  \"INPUT_MAIL\": \"E-mail cím\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-mail cím vagy felhasználónév\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Telefonszám vagy e-mail cím\",\r\n  \"INPUT_PASSWORD\": \"Jelszó\",\r\n  \"INPUT_PASSWORD_CODE\": \"Hozzáférési kód\",\r\n  \"INPUT_ETABID\": \"Intézményed azonosítója\",\r\n  \"LOGIN_BTN\": \"Bejelentkezés\",\r\n  \"CONFIRM_BTN\": \"Megerősítés\",\r\n  \"CANCEL_BTN\": \"Mégse\",\r\n\r\n  \"Tab_New_Event\": \"Új esemény\",\r\n\r\n  \"Tab_Calendar_Icals\": \"iCal kezelése\",\r\n  \"Tab_Calendar_Icals_Description\": \"iCal URL-ek kezelése\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"iCal URL hozzáadása\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"{{title}} kezelése\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"iCal URL-ek hozzáadása vagy törlése a naptárral való szinkronizáláshoz.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Hiányzó cím\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Adj nevet ennek az iCal URL-nek a hozzáadáshoz.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Nincs hozzáadott iCal URL\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Ez a fül fejlesztés alatt áll.\",\r\n  \"TabUnderConstruction_Details\": \"Térj vissza később a frissítésekért.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Fejlesztői mód\",\r\n  \"TabDevModeNotice_Details\": \"Teljes tesztkörnyezet fejlesztőknek.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Technikai részletek\",\r\n\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Értékelés/Dolgozat\",\r\n  \"Edited_Course\": \"Módosított óra\",\r\n  \"Canceled_Course\": \"Elmaradó óra\",\r\n  \"No_Course_Room\": \"Ismeretlen terem\",\r\n  \"Event_DeleteEvent\": \"Esemény törlése\",\r\n  \"Event_Confirm_DeleteEvent\": \"Biztosan törölni szeretnéd ezt az eseményt?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Ebédszünet\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Jó étvágyat!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Nyami!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Tízórai szünet\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Irány az ágy!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Reggeli\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Uzsonnaszünet\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Kell egy kis szünet!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Uzsonnaidő!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Esti szünet\",\r\n  \"Course_Separator_Night_Alt_1\": \"Irány az ágy!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Sötét van!\",\r\n\r\n  \"Context_Delete\": \"Törlés\",\r\n  \"Context_Cancel\": \"Mégse\",\r\n  \"Context_Edit\": \"Módosítás\",\r\n  \"Context_Add\": \"Hozzáadás\",\r\n\r\n  \"Form_Title\": \"Cím\",\r\n  \"Form_Location\": \"Helyszín\",\r\n  \"Form_Organizer\": \"Szervező\",\r\n  \"Form_Start\": \"Kezdet\",\r\n  \"Form_End\": \"Vége\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Biztosan törölni szeretnéd ezt az eseményt?\",\r\n\r\n  \"Home_Welcome_Name\": \"Szia, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Mutass többet\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"elérhető\",\r\n  \"Home_Chats_Plurial\": \"beszélgetés\",\r\n  \"Home_Chats_Singular\": \"beszélgetés\",\r\n  \"Home_See_All_Tasks\": \"Összes feladat megtekintése\",\r\n  \"Home_Welcome\": \"Szia!\",\r\n  \"Home_Planned_None\": \"Nincs több órád mára\",\r\n  \"Home_Planned_One\": \"Egy órád van még hátra ma\",\r\n  \"Home_Planned_Number\": \"{{number}} órád van még hátra ma\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Következő órák\",\r\n  \"Home_Widget_NewGrades\": \"Új jegyek\",\r\n  \"Home_Widget_NewHomeworks\": \"Teendők\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Nincs több óra\",\r\n  \"Home_Widget_NoCourses_Description\": \"Mára nincs több tervezett órád.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kártyák\",\r\n  \"Home_Cards_Button_Description_None\": \"Nincs kártya\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Egy kártya\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kártya\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Üzenetek\",\r\n  \"Home_Chats_Button_Description_None\": \"Nincs üzenet\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Egy üzenet\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} üzenet\",\r\n\r\n  \"Home_Attendance_Title\": \"Hiányzások\",\r\n  \"Home_Attendance_Button_Description_None\": \"Nincs hiányzás\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Egy hiányzás\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} hiányzás\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Menü\",\r\n  \"Home_Menu_Button_Description\": \"Mai menü\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Nincs talált esemény\",\r\n  \"Tab_Calendar_Empty_Description\": \"Adj hozzá egy eseményt, vagy szinkronizáld a naptáradat a kezdéshez.\",\r\n\r\n  \"Modal_Course_Title\": \"Az órám\",\r\n  \"Modal_Course_StartsIn\": \"Kezdés:\",\r\n  \"Modal_Course_StartedAgo\": \"Vége:\",\r\n  \"Modal_Course_Ongoing\": \"Tartama:\",\r\n  \"Modal_Course_Group\": \"Csoport\",\r\n  \"Modal_Course_Group_Full\": \"Osztály\",\r\n\r\n  \"Modal_Course_Details\": \"Óra részletei\",\r\n  \"Modal_Course_Teacher\": \"Tanár\",\r\n  \"Modal_Course_Room\": \"Terem\",\r\n  \"Modal_Course_Duration\": \"Időtartam\",\r\n\r\n  \"Modal_Course_Time\": \"Időpontok\",\r\n  \"Modal_Course_Start\": \"Kezdet\",\r\n  \"Modal_Course_End\": \"Vége\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Feladatok keresése\",\r\n  \"Tasks_LeftHomeworks_Title\": \"hátralévő feladat\",\r\n  \"Tasks_LeftHomeworks_Time\": \"ezen a héten\",\r\n  \"Tasks_Done_AllTasks\": \"Minden feladat\",\r\n  \"Tasks_Done_CompletedTasks\": \"kész\",\r\n  \"Tasks_Nav_Left\": \"Még {{count}} feladat van hátra\",\r\n  \"Tasks_Nav_One\": \"Már csak egy feladat van hátra\",\r\n  \"Tasks_Nav_Completed\": \"Minden kész!\",\r\n  \"Tasks_Week\": \"Hét\",\r\n  \"Tasks_NoTasks_Title\": \"Nincs feladat\",\r\n  \"Tasks_NoTasks_Description\": \"Nincsenek tervezett feladatok erre a hétre. Élvezd a pihenést!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"a(z) {{week}}. hétre\",\r\n  \"Tasks_NoTasks_Nav\": \"Nincs feladat\",\r\n  \"Task_Start\": \"Teendő\",\r\n  \"Task_Complete\": \"Kész\",\r\n  \"Task_Sorting_Title\": \"Rendezés:\",\r\n  \"Task_OnlyShowUndone\": \"Kész feladatok\",\r\n  \"Task_Show_Title\": \"Megjelenítés\",\r\n  \"Settings_General\": \"Általános\",\r\n\r\n  \"Latest_Grades\": \"Új jegyek\",\r\n  \"Grades_Search_Placeholder\": \"Jegy vagy tantárgy keresése\",\r\n\r\n  \"Grades_Avg_Methods\": \"Számítási módszerek\",\r\n  \"Grades_Avg_All_Title\": \"Tanulmányi átlag\",\r\n  \"Grades_Avg_All_Short\": \"Átlag\",\r\n  \"Grades_Avg_All_Pond\": \"Súlyozott átlag\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Súly. átlag\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Az összes jegy súlyozott átlagát számítja ki\",\r\n  \"Grades_Avg_Subject_Title\": \"Tantárgyi átlag\",\r\n  \"Grades_Avg_Subject_Short\": \"Tantárgyi átlag\",\r\n  \"Grades_Avg_Subject_Description\": \"A tantárgyi átlagok súlyozott átlagát számítja ki\",\r\n  \"Grades_Avg_Median_Title\": \"Medián\",\r\n  \"Grades_Avg_Median_Short\": \"Medián\",\r\n\r\n  \"Grades_Avg_More\": \"Tudj meg többet\",\r\n  \"Grades_Avg_KnowMore\": \"További információ\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Értsd meg a tanulmányi átlag számítási módszereit\",\r\n\r\n  \"Grades_SubjectInfo\": \"Tantárgy adatai\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} jegy\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Tanuló átlaga\",\r\n  \"SubjectInfo_Stats_Header\": \"Statisztikák\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Osztályátlag\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Az osztály összesített átlaga\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Legjobb átlag\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"A csoport legjobb átlaga\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Leggyengébb átlag\",\r\n  \"SubjectInfo_MinAverage_Description\": \"A csoport leggyengébb átlaga\",\r\n\r\n  \"Grades_Semester\": \"Félév\",\r\n  \"Grades_Trimester\": \"Harmadév\",\r\n  \"Grades_OutPeriod\": \"Időszakon kívüli\",\r\n  \"Grades_Year\": \"Tanév\",\r\n  \"Grades_MockExamBac\": \"Próbaérettségi\",\r\n  \"Grades_MockExamBrevet\": \"Kisérettségi\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Minden tantárgy\",\r\n  \"Grades_Method_Weighted\": \"Súlyozás\",\r\n\r\n  \"Grades_Sort\": \"Rendezés\",\r\n  \"Grades_Sorting_Alphabetical\": \"Betűrend\",\r\n  \"Grades_Sorting_Averages\": \"Átlagok\",\r\n  \"Grades_Sorting_Date\": \"Dátum\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Rendezés:\",\r\n  \"Grades_Menu_AverageBy\": \"Átlagolás:\",\r\n  \"NoAverage\": \"Nincs átlag\",\r\n\r\n  \"Grades_Empty_Title\": \"Nincsenek jegyek\",\r\n  \"Grades_Empty_Description\": \"Ebben az időszakban még nem kaptál jegyet.\",\r\n\r\n  \"Grade_NoDescription\": \"{{subject}} dolgozat\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Tantárgyak\",\r\n  \"Grades_Tab_Latest\": \"Új jegyek\",\r\n\r\n  \"Profile_Attendance_Title\": \"Mulasztások\",\r\n  \"Profile_Attendance_Denominator_Single\": \"hiányzás\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"hiányzás\",\r\n\r\n  \"Profile_Discussions_Title\": \"Beszélgetések\",\r\n  \"Profile_Discussions_Denominator_Single\": \"olvasatlan\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"olvasatlan\",\r\n\r\n  \"Profile_News_Title\": \"Hírek\",\r\n  \"Profile_News_Denominator_Single\": \"új\",\r\n  \"Profile_News_Denominator_Plural\": \"új\",\r\n  \"Profile_News_Open\": \"Megnyitás\",\r\n  \"Profile_News_Loading_Title\": \"Hírek betöltése...\",\r\n  \"Profile_News_Author_Unknown\": \"Ismeretlen szerző\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-kód és kártyák\",\r\n\r\n  \"Modal_Grades_Title\": \"Jegy részletei\",\r\n  \"Modal_Grades_BestGrade\": \"Csoport legjobb jegye\",\r\n\r\n  \"Grades_Details_Title\": \"Részletek\",\r\n  \"Grades_NormalizedGrade_Title\": \"Átszámított jegy (20-as skála)\",\r\n  \"Grades_NormalizedGrade_Description\": \"A jegy értéke 20-as skálára átszámítva\",\r\n  \"Grades_HighestGrade_Title\": \"Legjobb jegy\",\r\n  \"Grades_HighestGrade_Description\": \"A csoportban elért legjobb eredmény\",\r\n  \"Grades_LowestGrade_Title\": \"Leggyengébb jegy\",\r\n  \"Grades_LowestGrade_Description\": \"A csoportban elért leggyengébb eredmény\",\r\n  \"Grades_Influence_Title\": \"Befolyás\",\r\n  \"Grades_Avg_Group_Title\": \"Csoportátlag\",\r\n  \"Grades_Coefficient\": \"Súlyozás\",\r\n  \"Grades_Avg_Group_Short\": \"Csop. átlag\",\r\n  \"Grades_Tab_Rank\": \"Rangsor\",\r\n  \"Grades_Tab_Rank_Description\": \"Helyezés a csoportban\",\r\n\r\n  \"News_Search_Placeholder\": \"Hír keresése\",\r\n  \"News_Empty_Title\": \"Nincsenek hírek\",\r\n  \"News_Empty_Description\": \"Nem található hír az intézményedben.\",\r\n  \"News_Search_NoResults\": \"Nincs találat\",\r\n  \"News_Search_NoResults_Description\": \"A keresésedre nem érkezett találat.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Lágy és elegáns téma\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Olvasás\",\r\n  \"News_Theme_Reading_Description\": \"Olvasáshoz tervezett téma\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Igazolatlan órák\",\r\n  \"Attendance_Hours_Unjustified\": \"Igazolatlan hiányzások\",\r\n  \"Attendance_Missing\": \"Hiányzások\",\r\n  \"Attendance_Delays\": \"Késések\",\r\n  \"Attendance_NoReason\": \"Nincs megadva indok\",\r\n  \"Attendance_NoEvent_Title\": \"Nincs esemény\",\r\n  \"Attendance_NoEvent_Description\": \"Nincsenek rögzített hiányzások vagy késések ebben az időszakban.\",\r\n\r\n  \"Settings_Account_Title\": \"Fiókom\",\r\n  \"Settings_Account_Description\": \"A fiókom\",\r\n  \"Settings_Services_Title\": \"Összekapcsolt fiókok\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Legutóbb használt fiók\",\r\n  \"Settings_Notifications_Title\": \"Értesítések\",\r\n  \"Settings_Notifications_Description\": \"Riasztások, gyakoriság...\",\r\n  \"Settings_Subjects_Title\": \"Tantárgyak\",\r\n  \"Settings_Subjects_Description\": \"Név, szín, betűtípus...\",\r\n  \"Settings_Personalization_Title\": \"Személyre szabás\",\r\n  \"Settings_Personalization_Description\": \"Témák, színek...\",\r\n  \"Settings_Cards_Title\": \"Kártyák\",\r\n  \"Settings_Cards_Description\": \"Menza, belépés...\",\r\n  \"Settings_Accessibility_Title\": \"Kisegítő lehetőségek\",\r\n  \"Settings_Accessibility_Description\": \"Megjelenítés, hang...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Intelligens funkciók\",\r\n  \"Settings_MagicPlus_Description_Card\": \"MI funkciók\",\r\n  \"Settings_MagicPlus_Enable\": \"Magic+ aktiválása\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Automatikusan optimalizálja a feladataidat a hatékonyság növelése érdekében\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Teljesen helyi modell, nem kerül adat az eszközödön kívülre\",\r\n  \"Settings_Donate_Title\": \"Támogatás\",\r\n  \"Settings_Donate_Description\": \"A projekt támogatása\",\r\n  \"Settings_Telemetry_Title\": \"Telemetria és adatvédelem\",\r\n  \"Settings_Telemetry_Description\": \"Gyűjtött adatok kezelése\",\r\n  \"Settings_About_Title\": \"Névjegy\",\r\n  \"Settings_About_Description\": \"Verzió\",\r\n  \"Settings_Logout_Title\": \"Kijelentkezés\",\r\n  \"Settings_Logout_Description\": \"Fiók törlése a Papillonból\",\r\n  \"Settings_Language_Title\": \"Nyelv\",\r\n  \"Settings_Language_Description\": \"Nyelv módosítása\",\r\n  \"Settings_Tabs_Title\": \"Fülek\",\r\n  \"Settings_Tabs_Description\": \"Fülek elrejtése a menüből\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Személyre szabás\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Témák, tantárgyak...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Tantárgyak testreszabása\",\r\n  \"Settings_Personalization_Accent\": \"Kiemelő szín\",\r\n  \"Settings_Personalization_Accent_Description\": \"Az itt választott szín a Papillon kezdőoldalán fog megjelenni.\",\r\n  \"Settings_Personalization_Theme\": \"Téma\",\r\n  \"Settings_Personalization_Icon_Title\": \"Ikon módosítása\",\r\n  \"Settings_Personalization_Icon_Description\": \"Az alkalmazás ikonjának egyedivé tétele\",\r\n  \"Settings_Personalization_Subject_Title\": \"Tantárgyak testreszabása\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Tantárgyak\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikonok, színek\",\r\n  \"Settings_About_Papillion_Behind\": \"A Papillon mögött\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"A Papillont 100%-ban önkéntes diákok tartják fenn\",\r\n  \"Settings_About_Discord\": \"Discord szerver\",\r\n  \"Settings_About_Discord_Description\": \"Csatlakozz a Discord szerverhez\",\r\n  \"Settings_About_Crowdin\": \"Crowdin projekt\",\r\n  \"Settings_About_Crowdin_Description\": \"Segíts a Papillon lefordításában\",\r\n  \"Settings_About_Github\": \"GitHub projekt\",\r\n  \"Settings_About_Github_Description\": \"Segíts a projekt fejlesztésében GitHubon\",\r\n  \"Settings_About_Issue\": \"Hiba jelentése\",\r\n  \"Settings_About_Issue_Description\": \"Talált hiba bejelentése\",\r\n  \"Settings_About_Dependency_Version\": \"Függőségek verziója\",\r\n\r\n  \"Alert_No_Technical\": \"Nem áll rendelkezésre technikai információ.\",\r\n  \"Alert_Auth_Error\": \"Hitelesítési hiba\",\r\n  \"Alert_Auth_Bad_Creds\": \"A megadott adatok helytelenek, vagy szülői fiókkal próbálsz belépni. A szülői fiókokat a Papillon még nem támogatja.\",\r\n  \"Alert_Not_Supported\": \"Nem támogatott példány\",\r\n  \"Alert_Security_Instance_HTTP\": \"Biztonsági okokból a Papillon nem fogad el HTTP-t használó példányokat. Javasoljuk, hogy értesítsd az intézményvezetőt a frissítés érdekében.\",\r\n  \"Alert_NoDemo\": \"A Papillon nem demó példányokhoz készült, kérjük, használj valódi fiókot.\",\r\n  \"Alert_Invalid_Instance\": \"A Papillon nem tud információt lekérni erről a PRONOTE példányról. Biztosan érvényes még?\",\r\n  \"Alert_No_Pos\": \"Nem sikerült lekérni a pozíciót\",\r\n  \"Alert_Connexion_Fail\": \"Kapcsolódás sikertelen\",\r\n\r\n  \"Feature_Limited\": \"Korlátozott funkciók\",\r\n  \"Feature_Soon\": \"Hamarosan érkezik!\",\r\n  \"Feature_Soon_Notification\": \"Keményen dolgozunk, hogy ezt a funkciót egy jövőbeli frissítésben elérhetővé tegyük.\",\r\n  \"Feature_Add_Card\": \"Adj hozzá egy új kártyát a navigációs sáv Profil fülén keresztül\",\r\n\r\n  \"Webview_Wait\": \"Egy kis türelmet...\",\r\n\r\n  \"Profile_QRCards\": \"QR-kód és kártyák\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} kártya\",\r\n  \"Profile_Cards_Loading_History\": \"Tranzakciós előzmények betöltése\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Ez eltarthat egy ideig...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kártyák\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Menza, belépés\",\r\n  \"Settings_Cards_Banner_Description\": \"Add hozzá a menza- és bérletkártyáidat, hogy bárhonnan elérd őket a Papillonon keresztül\",\r\n  \"Settings_Cards_None_Title\": \"Nincs kártya\",\r\n  \"Settings_Cards_Add_Button\": \"Hozzáadás\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Adj hozzá egyet a menzaegyenleged megtekintéséhez, QR-kódod beolvasásához és egyebekhez\",\r\n  \"Settings_Subjects_None_Title\": \"Nincsenek tantárgyak\",\r\n  \"Settings_Subjects_None_Description\": \"Böngészd az alkalmazás füleit, hogy személyre szabhasd a tantárgyakat.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Visszaállítás\",\r\n  \"Settings_Subjects_Reset_Message\": \"Biztosan vissza szeretnéd állítani az összes tantárgyat?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Visszaállítás\",\r\n\r\n  \"Settings_Donator\": \"Támogatók\",\r\n  \"Settings_Donator_Description\": \"Támogatók listájának megtekintése\",\r\n  \"Settings_App_Version\": \"Alkalmazás verziója\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Irányítsd a QR-kódot a terminál olvasója felé\",\r\n  \"Profile_Cards_No_Reservation\": \"Nincs foglalás\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Úgy tűnik, ezen a napon nem tudsz foglalni.\",\r\n  \"Profile_Cards_History\": \"Előzmények\",\r\n  \"Magic_Important\": \"Talán fontos\",\r\n\r\n  \"OnBoarding_Step\": \"Lépés: \",\r\n  \"OnBoarding_Step_Of\": \"/ \",\r\n\r\n  \"Consent_Advanced_Title\": \"Szeretnék segíteni a Papillonnak\",\r\n  \"Consent_Advanced_Description\": \"Részletesebb információkat gyűjtünk a használatról.\",\r\n  \"Consent_Required_Title\": \"Csak a lényeg\",\r\n  \"Consent_Required_Description\": \"Alapvető információk: valaki használta az appot, sikeres volt-e, és melyik szolgáltatást használja.\",\r\n  \"Consent_None_Title\": \"Semmi\",\r\n  \"Consent_None_Description\": \"Egyáltalán nem fogunk tudni a létezésedről.\",\r\n  \"Consent_Title\": \"Te és a Papillon\",\r\n  \"Consent_Intro1\": \"Hogy segítsd a Papillon fejlődését, megoszthatsz velünk néhány használati adatot.\",\r\n  \"Consent_PrivacyPolicy\": \"Kétség esetén olvasd el az adatvédelmi nyilatkozatunkat\",\r\n  \"Consent_Refuse\": \"Elutasítás\",\r\n  \"Consent_Accept\": \"Elfogadás\",\r\n  \"Consent_ChangeMind\": \"Bármikor meggondolhatod magad a beállításokban.\",\r\n  \"Consent_Arg1\": \"Kizárólag az alkalmazás fejlesztésére szolgál\",\r\n  \"Consent_Arg2\": \"Névtelen és nem köthető a személyazonosságodhoz\",\r\n  \"Consent_Arg3\": \"Nincs hozzáférésünk a fiókjaidhoz\",\r\n\r\n  \"Changelog_Title\": \"Frissítési megjegyzések\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Határidő\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Tantárgyak\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Befejezetlen\",\r\n  \"Tasks_ThisWeek\": \"Ezen a héten\",\r\n\r\n  \"Task_Undone\": \"Befejezetlen\",\r\n  \"Task_Done\": \"Befejezve\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Háttérkép testreszabása\",\r\n  \"Modal_Profile_Title\": \"Profil testreszabása\",\r\n\r\n  \"Modal_Task_Status\": \"Feladat állapota\",\r\n  \"Modal_Task_Description\": \"Feladat leírása\",\r\n  \"Modal_Task_Attachments\": \"Csatolmányok\",\r\n\r\n  \"Today\": \"Ma\",\r\n  \"Yesterday\": \"Tegnap\",\r\n  \"Tomorrow\": \"Holnap\"\r\n}"
  },
  {
    "path": "locales/id.json",
    "content": "{\r\n  \"Global_Back\": \"Kembali\",\r\n  \"Global_DatePrefix\": \"pada\",\r\n\r\n  \"Tab_Home\": \"Beranda\",\r\n  \"Tab_Calendar\": \"Jadwal\",\r\n  \"Tab_Tasks\": \"Tugas\",\r\n  \"Tab_Grades\": \"Nilai\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Ubah profil\",\r\n  \"Button_Change_ProfilePicture\": \"Ubah foto profil\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Ambil foto\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Dari galeri\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Ambil dari sistem sekolah\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Hapus foto\",\r\n  \"Tab_Page\": \"Halaman\",\r\n  \"Tab_Settings\": \"Pengaturan\",\r\n  \"Tab_News\": \"Informasi\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Aplikasi untuk mengelola kehidupan sekolahmu\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Hubungkan aplikasi sekolahmu untuk mengakses nilai, jadwal, tugas, dan lainnya dalam antarmuka Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Mulai\",\r\n  \"ONBOARDING_HELP_BTN\": \"Butuh bantuan?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Layanan universitas\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Layanan kantin\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Pilih layanan sekolahmu\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Pilih layanan kantin\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Pilih layanan universitas\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Bagaimana kamu ingin masuk?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Gunakan lokasi saya\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Cari kota\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Saya punya kode QR\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Saya punya URL login\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Pilih instansimu\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Masukkan nama kota dan pilih instansimu\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Masuk seperti biasa\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Masuk ke akunmu\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Pilih host yang ditetapkan untuk akun\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Masukkan kode 4 digit yang baru saja kamu buat di PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Masuk ke\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Pindai kode QR sekolahmu untuk terhubung.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validasi kode QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Ini mungkin memakan waktu beberapa saat...\",\r\n  \"ONBOARDING_URL\": \"Masukkan alamat URL sekolahmu\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL instansi PRONOTE kamu\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Sebelum selesai\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Pilih sebuah\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"warna tema\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Masukkan Kode PIN PRONOTE kamu\",\r\n  \"Onboarding_Load_Webview_Description\": \"Kami sedang memuat situs sekolahmu\",\r\n  \"INPUT_PIN\": \"Kode PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Cari instansi...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Sedang menyambungkan...\",\r\n\r\n  \"WAITING\": \"Menunggu\",\r\n  \"IZLY_SMS_SEND\": \"Kamu baru saja menerima tautan untuk masuk, klik tautan tersebut dan ikuti langkah-langkahnya.\",\r\n  \"STEP\": \"Langkah\",\r\n  \"STEP_OUTOF\": \"dari\",\r\n  \"INPUT_USERNAME\": \"Nama pengguna\",\r\n  \"INPUT_MAIL\": \"Alamat email\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Email atau nama pengguna\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Nomor telepon atau email\",\r\n  \"INPUT_PASSWORD\": \"Kata sandi\",\r\n  \"INPUT_PASSWORD_CODE\": \"Kode akses\",\r\n  \"INPUT_ETABID\": \"ID sekolahmu\",\r\n  \"LOGIN_BTN\": \"Masuk\",\r\n  \"CONFIRM_BTN\": \"Konfirmasi\",\r\n  \"CANCEL_BTN\": \"Batal\",\r\n\r\n  \"Tab_New_Event\": \"Acara baru\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Kelola iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Kelola URL iCal kamu\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Tambah URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Kelola {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Tambah atau hapus URL iCal untuk sinkronisasi dengan jadwalmu.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Judul tidak ada\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Beri nama URL iCal ini untuk menambahkannya.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Belum ada URL iCal yang ditambahkan\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Tab ini sedang dalam pengembangan.\",\r\n  \"TabUnderConstruction_Details\": \"Kembali lagi nanti untuk pembaruan.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Mode Pengembang\",\r\n  \"TabDevModeNotice_Details\": \"Lingkungan pengujian lengkap untuk pengembang.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Detail teknis\",\r\n\r\n  \"Online_Course\": \"Daring\",\r\n  \"Evaluated_Course\": \"Penilaian\",\r\n  \"Edited_Course\": \"Jadwal diubah\",\r\n  \"Canceled_Course\": \"Kelas dibatalkan\",\r\n  \"No_Course_Room\": \"Ruangan tidak diketahui\",\r\n  \"Event_DeleteEvent\": \"Hapus acara\",\r\n  \"Event_Confirm_DeleteEvent\": \"Apakah kamu yakin ingin menghapus acara ini?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Istirahat siang\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Selamat makan!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Nyam!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Istirahat pagi\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Waktunya tidur!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Sarapan\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Istirahat sore\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Waktunya istirahat!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Waktunya camilan!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Istirahat malam\",\r\n  \"Course_Separator_Night_Alt_1\": \"Waktunya tidur!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Sudah malam!\",\r\n\r\n  \"Context_Delete\": \"Hapus\",\r\n  \"Context_Cancel\": \"Batal\",\r\n  \"Context_Edit\": \"Ubah\",\r\n  \"Context_Add\": \"Tambah\",\r\n\r\n  \"Form_Title\": \"Judul\",\r\n  \"Form_Location\": \"Lokasi\",\r\n  \"Form_Organizer\": \"Penyelenggara\",\r\n  \"Form_Start\": \"Mulai\",\r\n  \"Form_End\": \"Selesai\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Apakah kamu yakin ingin menghapus acara ini?\",\r\n\r\n  \"Home_Welcome_Name\": \"Halo, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Tampilkan lebih banyak\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"tersedia\",\r\n  \"Home_Chats_Plurial\": \"diskusi\",\r\n  \"Home_Chats_Singular\": \"diskusi\",\r\n  \"Home_See_All_Tasks\": \"Lihat semua tugas\",\r\n  \"Home_Welcome\": \"Halo!\",\r\n  \"Home_Planned_None\": \"Kamu tidak memiliki kelas tersisa hari ini\",\r\n  \"Home_Planned_One\": \"Kamu memiliki satu kelas tersisa hari ini\",\r\n  \"Home_Planned_Number\": \"Kamu memiliki {{number}} kelas tersisa hari ini\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Kelas berikutnya\",\r\n  \"Home_Widget_NewGrades\": \"Nilai baru\",\r\n  \"Home_Widget_NewHomeworks\": \"Tugas yang harus dikerjakan\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Tidak ada kelas mendatang\",\r\n  \"Home_Widget_NoCourses_Description\": \"Tidak ada kelas yang dijadwalkan untuk hari ini.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kartu\",\r\n  \"Home_Cards_Button_Description_None\": \"Tidak ada kartu\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Satu kartu\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kartu\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Pesan\",\r\n  \"Home_Chats_Button_Description_None\": \"Tidak ada pesan\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Satu pesan\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} pesan\",\r\n\r\n  \"Home_Attendance_Title\": \"Kehadiran\",\r\n  \"Home_Attendance_Button_Description_None\": \"Tidak ada absensi\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Satu absensi\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} absensi\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Menu\",\r\n  \"Home_Menu_Button_Description\": \"Menu hari ini\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Acara tidak ditemukan\",\r\n  \"Tab_Calendar_Empty_Description\": \"Tambah acara atau sinkronkan jadwalmu untuk memulai.\",\r\n\r\n  \"Modal_Course_Title\": \"Kelas saya\",\r\n  \"Modal_Course_StartsIn\": \"Dimulai dalam\",\r\n  \"Modal_Course_StartedAgo\": \"Berakhir sejak\",\r\n  \"Modal_Course_Ongoing\": \"Sudah berjalan\",\r\n  \"Modal_Course_Group\": \"Grup\",\r\n  \"Modal_Course_Group_Full\": \"Kelas\",\r\n\r\n  \"Modal_Course_Details\": \"Detail kelas\",\r\n  \"Modal_Course_Teacher\": \"Guru\",\r\n  \"Modal_Course_Room\": \"Ruangan\",\r\n  \"Modal_Course_Duration\": \"Durasi\",\r\n\r\n  \"Modal_Course_Time\": \"Waktu kelas\",\r\n  \"Modal_Course_Start\": \"Mulai\",\r\n  \"Modal_Course_End\": \"Selesai\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Cari tugas\",\r\n  \"Tasks_LeftHomeworks_Title\": \"tugas tersisa\",\r\n  \"Tasks_LeftHomeworks_Time\": \"minggu ini\",\r\n  \"Tasks_Done_AllTasks\": \"Semua tugas\",\r\n  \"Tasks_Done_CompletedTasks\": \"telah selesai\",\r\n  \"Tasks_Nav_Left\": \"Masih ada {{count}} tugas lagi\",\r\n  \"Tasks_Nav_One\": \"Hanya satu tugas lagi\",\r\n  \"Tasks_Nav_Completed\": \"Semua selesai!\",\r\n  \"Tasks_Week\": \"Minggu\",\r\n  \"Tasks_NoTasks_Title\": \"Tidak ada tugas\",\r\n  \"Tasks_NoTasks_Description\": \"Tidak ada tugas yang dijadwalkan untuk minggu ini. Selamat beristirahat!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"untuk minggu {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Tidak ada tugas\",\r\n  \"Task_Start\": \"Belum dikerjakan\",\r\n  \"Task_Complete\": \"Selesai\",\r\n  \"Task_Sorting_Title\": \"Urutkan berdasarkan\",\r\n  \"Task_OnlyShowUndone\": \"Tugas selesai\",\r\n  \"Task_Show_Title\": \"Tampilkan\",\r\n  \"Settings_General\": \"Umum\",\r\n\r\n  \"Latest_Grades\": \"Nilai baru\",\r\n  \"Grades_Search_Placeholder\": \"Cari nilai, mata pelajaran\",\r\n\r\n  \"Grades_Avg_Methods\": \"Metode perhitungan\",\r\n  \"Grades_Avg_All_Title\": \"Rata-rata umum\",\r\n  \"Grades_Avg_All_Short\": \"Rata-rata umum\",\r\n  \"Grades_Avg_All_Pond\": \"Rata-rata tertimbang\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Rerata tertimbang\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Menghitung rata-rata tertimbang dari semua nilai\",\r\n  \"Grades_Avg_Subject_Title\": \"Rata-rata mata pelajaran\",\r\n  \"Grades_Avg_Subject_Short\": \"Rerata mapel\",\r\n  \"Grades_Avg_Subject_Description\": \"Menghitung rata-rata tertimbang dari rata-rata mapel\",\r\n  \"Grades_Avg_Median_Title\": \"Median\",\r\n  \"Grades_Avg_Median_Short\": \"Median\",\r\n\r\n  \"Grades_Avg_More\": \"Cari tahu lebih lanjut\",\r\n  \"Grades_Avg_KnowMore\": \"Cari tahu lebih lanjut\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Memahami metode perhitungan rata-rata umum\",\r\n\r\n  \"Grades_SubjectInfo\": \"Informasi mata pelajaran\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} nilai\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Rata-rata siswa\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistik\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Rata-rata kelas\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Rata-rata umum kelas\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Rata-rata tertinggi\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Rata-rata terbaik di grup\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Rata-rata terendah\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Rata-rata terendah di grup\",\r\n\r\n  \"Grades_Semester\": \"Semester\",\r\n  \"Grades_Trimester\": \"Trimester\",\r\n  \"Grades_OutPeriod\": \"Di luar periode\",\r\n  \"Grades_Year\": \"Tahun\",\r\n  \"Grades_MockExamBac\": \"Simulasi ujian\",\r\n  \"Grades_MockExamBrevet\": \"Try Out\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Semua mapel\",\r\n  \"Grades_Method_Weighted\": \"Pembobotan\",\r\n\r\n  \"Grades_Sort\": \"Urutkan\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabetis\",\r\n  \"Grades_Sorting_Averages\": \"Rata-rata\",\r\n  \"Grades_Sorting_Date\": \"Tanggal\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Urutkan berdasarkan\",\r\n  \"Grades_Menu_AverageBy\": \"Rata-rata berdasarkan\",\r\n  \"NoAverage\": \"Tidak ada rata-rata\",\r\n\r\n  \"Grades_Empty_Title\": \"Belum ada nilai\",\r\n  \"Grades_Empty_Description\": \"Kamu belum mendapatkan nilai pada periode ini.\",\r\n\r\n  \"Grade_NoDescription\": \"Tugas {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Mata pelajaran\",\r\n  \"Grades_Tab_Latest\": \"Nilai baru\",\r\n\r\n  \"Profile_Attendance_Title\": \"Kehadiran\",\r\n  \"Profile_Attendance_Denominator_Single\": \"absen\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"absen\",\r\n\r\n  \"Profile_Discussions_Title\": \"Diskusi\",\r\n  \"Profile_Discussions_Denominator_Single\": \"belum dibaca\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"belum dibaca\",\r\n\r\n  \"Profile_News_Title\": \"Informasi\",\r\n  \"Profile_News_Denominator_Single\": \"baru\",\r\n  \"Profile_News_Denominator_Plural\": \"baru\",\r\n  \"Profile_News_Open\": \"Buka\",\r\n  \"Profile_News_Loading_Title\": \"Memuat informasi...\",\r\n  \"Profile_News_Author_Unknown\": \"Penulis tidak diketahui\",\r\n\r\n  \"Profile_Cards_Title\": \"Kode QR dan kartu\",\r\n\r\n  \"Modal_Grades_Title\": \"Detail nilai\",\r\n  \"Modal_Grades_BestGrade\": \"Nilai terbaik di grup\",\r\n\r\n  \"Grades_Details_Title\": \"Detail\",\r\n  \"Grades_NormalizedGrade_Title\": \"Nilai dalam skala 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Nilai yang dikonversi ke skala 20\",\r\n  \"Grades_HighestGrade_Title\": \"Nilai tertinggi\",\r\n  \"Grades_HighestGrade_Description\": \"Nilai maksimum yang dicapai di grup\",\r\n  \"Grades_LowestGrade_Title\": \"Nilai terendah\",\r\n  \"Grades_LowestGrade_Description\": \"Nilai minimum yang dicapai di grup\",\r\n  \"Grades_Influence_Title\": \"Pengaruh\",\r\n  \"Grades_Avg_Group_Title\": \"Rata-rata grup\",\r\n  \"Grades_Coefficient\": \"Koefisien\",\r\n  \"Grades_Avg_Group_Short\": \"Rerata grup\",\r\n  \"Grades_Tab_Rank\": \"Peringkat\",\r\n  \"Grades_Tab_Rank_Description\": \"Posisi dalam grup\",\r\n\r\n  \"News_Search_Placeholder\": \"Cari informasi\",\r\n  \"News_Empty_Title\": \"Tidak ada informasi\",\r\n  \"News_Empty_Description\": \"Tidak ditemukan informasi di instansimu.\",\r\n  \"News_Search_NoResults\": \"Informasi tidak ditemukan\",\r\n  \"News_Search_NoResults_Description\": \"Tidak ada informasi yang sesuai dengan pencarianmu.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Tema yang lembut dan elegan\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Membaca\",\r\n  \"News_Theme_Reading_Description\": \"Tema yang dirancang untuk membaca\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Jam terlewat\",\r\n  \"Attendance_Hours_Unjustified\": \"Tanpa keterangan\",\r\n  \"Attendance_Missing\": \"Absensi\",\r\n  \"Attendance_Delays\": \"Keterlambatan\",\r\n  \"Attendance_NoReason\": \"Tidak ada alasan\",\r\n  \"Attendance_NoEvent_Title\": \"Tidak ada riwayat\",\r\n  \"Attendance_NoEvent_Description\": \"Tidak ada absensi atau keterlambatan yang tercatat untuk periode ini.\",\r\n\r\n  \"Settings_Account_Title\": \"Akun saya\",\r\n  \"Settings_Account_Description\": \"Akun saya\",\r\n  \"Settings_Services_Title\": \"Akun tertaut\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Akun terakhir digunakan\",\r\n  \"Settings_Notifications_Title\": \"Notifikasi\",\r\n  \"Settings_Notifications_Description\": \"Peringatan, frekuensi...\",\r\n  \"Settings_Subjects_Title\": \"Mata pelajaran\",\r\n  \"Settings_Subjects_Description\": \"Nama, warna, font...\",\r\n  \"Settings_Personalization_Title\": \"Personalisasi\",\r\n  \"Settings_Personalization_Description\": \"Tema, warna...\",\r\n  \"Settings_Cards_Title\": \"Kartu\",\r\n  \"Settings_Cards_Description\": \"Kantin, akses...\",\r\n  \"Settings_Accessibility_Title\": \"Aksesibilitas\",\r\n  \"Settings_Accessibility_Description\": \"Tampilan, suara...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Fitur cerdas\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Fitur AI\",\r\n  \"Settings_MagicPlus_Enable\": \"Aktifkan Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Secara otomatis mengoptimalkan pengaturan tugasmu untuk meningkatkan produktivitas\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Model sepenuhnya lokal, tidak ada data yang dikirim ke luar perangkatmu\",\r\n  \"Settings_Donate_Title\": \"Donasi\",\r\n  \"Settings_Donate_Description\": \"Dukung proyek ini\",\r\n  \"Settings_Telemetry_Title\": \"Telemetri dan privasi\",\r\n  \"Settings_Telemetry_Description\": \"Kelola data yang dikumpulkan\",\r\n  \"Settings_About_Title\": \"Tentang\",\r\n  \"Settings_About_Description\": \"Versi\",\r\n  \"Settings_Logout_Title\": \"Keluar\",\r\n  \"Settings_Logout_Description\": \"Hapus akun ini dari Papillon\",\r\n  \"Settings_Language_Title\": \"Bahasa\",\r\n  \"Settings_Language_Description\": \"Ganti bahasa\",\r\n  \"Settings_Tabs_Title\": \"Tab\",\r\n  \"Settings_Tabs_Description\": \"Sembunyikan tab dari menu\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personalisasi\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Tema, mapel...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Personalisasi mapel\",\r\n  \"Settings_Personalization_Accent\": \"Warna aksen\",\r\n  \"Settings_Personalization_Accent_Description\": \"Warna yang kamu pilih di sini akan diterapkan pada halaman beranda Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Tema\",\r\n  \"Settings_Personalization_Icon_Title\": \"Ganti ikon\",\r\n  \"Settings_Personalization_Icon_Description\": \"Personalisasi ikon aplikasi\",\r\n  \"Settings_Personalization_Subject_Title\": \"Personalisasi mapel\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Mata pelajaran\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikon, warna\",\r\n  \"Settings_About_Papillion_Behind\": \"Di Balik Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon dikelola oleh mahasiswa relawan 100%\",\r\n  \"Settings_About_Discord\": \"Server Discord\",\r\n  \"Settings_About_Discord_Description\": \"Bergabung dengan server Discord\",\r\n  \"Settings_About_Crowdin\": \"Proyek Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Bantu menerjemahkan Papillon\",\r\n  \"Settings_About_Github\": \"Proyek GitHub\",\r\n  \"Settings_About_Github_Description\": \"Berkontribusi di GitHub\",\r\n  \"Settings_About_Issue\": \"Laporkan bug\",\r\n  \"Settings_About_Issue_Description\": \"Laporkan masalah yang ditemukan\",\r\n  \"Settings_About_Dependency_Version\": \"Versi dependensi\",\r\n\r\n  \"Alert_No_Technical\": \"Tidak ada informasi teknis yang tersedia.\",\r\n  \"Alert_Auth_Error\": \"Kesalahan autentikasi\",\r\n  \"Alert_Auth_Bad_Creds\": \"Kredensial yang kamu masukkan salah atau kamu mencoba masuk dengan akun orang tua. Jenis akun ini belum didukung oleh Papillon.\",\r\n  \"Alert_Not_Supported\": \"Instansi tidak didukung\",\r\n  \"Alert_Security_Instance_HTTP\": \"Demi keamanan, Papillon tidak menerima instansi yang masih menggunakan protokol HTTP. Kami menyarankanmu untuk memberi tahu kepala sekolah agar memperbarui instansi tersebut.\",\r\n  \"Alert_NoDemo\": \"Papillon tidak dibuat untuk instansi demo, silakan gunakan instansi asli.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon tidak dapat mengambil informasi dari instansi PRONOTE ini, apakah masih valid?\",\r\n  \"Alert_No_Pos\": \"Tidak dapat mengambil lokasi\",\r\n  \"Alert_Connexion_Fail\": \"Koneksi gagal\",\r\n\r\n  \"Feature_Limited\": \"Fitur terbatas\",\r\n  \"Feature_Soon\": \"Segera hadir!\",\r\n  \"Feature_Soon_Notification\": \"Kami sedang bekerja keras untuk menghadirkan fitur ini pada pembaruan mendatang.\",\r\n  \"Feature_Add_Card\": \"Tambah kartu baru dari tab Profil di bilah navigasi\",\r\n\r\n  \"Webview_Wait\": \"Mohon bersabar...\",\r\n\r\n  \"Profile_QRCards\": \"Kode QR dan kartu\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} kartu\",\r\n  \"Profile_Cards_Loading_History\": \"Memuat riwayat transaksi\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Ini mungkin memakan waktu sebentar...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kartu\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Kantin, akses\",\r\n  \"Settings_Cards_Banner_Description\": \"Tambah kartu kantin dan transportasi agar bisa diakses di mana saja melalui ponsel di Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Tidak ada kartu\",\r\n  \"Settings_Cards_Add_Button\": \"Tambah\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Tambah satu untuk melihat saldo kantin, pindai kode QR, dan lainnya\",\r\n  \"Settings_Subjects_None_Title\": \"Tidak ada mapel\",\r\n  \"Settings_Subjects_None_Description\": \"Jelajahi berbagai tab aplikasi agar bisa menyesuaikan mata pelajaran.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Atur ulang\",\r\n  \"Settings_Subjects_Reset_Message\": \"Apakah kamu yakin ingin mengatur ulang semua mata pelajaran?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Atur ulang\",\r\n\r\n  \"Settings_Donator\": \"Donatur\",\r\n  \"Settings_Donator_Description\": \"Lihat daftar donatur\",\r\n  \"Settings_App_Version\": \"Versi aplikasi\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Arahkan kode QR ke pemindai terminal\",\r\n  \"Profile_Cards_No_Reservation\": \"Tidak ada reservasi\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Sepertinya kamu tidak bisa melakukan reservasi hari ini.\",\r\n  \"Profile_Cards_History\": \"Riwayat\",\r\n  \"Magic_Important\": \"Mungkin penting\",\r\n\r\n  \"OnBoarding_Step\": \"Langkah \",\r\n  \"OnBoarding_Step_Of\": \"dari \",\r\n\r\n  \"Consent_Advanced_Title\": \"Saya ingin membantu Papillon\",\r\n  \"Consent_Advanced_Description\": \"Kami mengumpulkan informasi penggunaanmu secara lebih detail.\",\r\n  \"Consent_Required_Title\": \"Hanya yang penting\",\r\n  \"Consent_Required_Description\": \"Intinya, hanya untuk tahu seseorang menggunakan Papillon, apakah lancar, dan layanan apa yang digunakan.\",\r\n  \"Consent_None_Title\": \"Tidak sama sekali\",\r\n  \"Consent_None_Description\": \"Kami bahkan tidak akan tahu keberadaanmu.\",\r\n  \"Consent_Title\": \"Kamu dan Papillon\",\r\n  \"Consent_Intro1\": \"Untuk membantu Papillon berkembang, kamu bisa memilih untuk berbagi beberapa informasi penggunaan.\",\r\n  \"Consent_PrivacyPolicy\": \"Jika ragu, silakan baca kebijakan privasi kami\",\r\n  \"Consent_Refuse\": \"Tolak\",\r\n  \"Consent_Accept\": \"Terima\",\r\n  \"Consent_ChangeMind\": \"Kamu bisa berubah pikiran kapan saja melalui pengaturan aplikasi.\",\r\n  \"Consent_Arg1\": \"Hanya untuk meningkatkan kualitas aplikasi\",\r\n  \"Consent_Arg2\": \"Anonim & tidak tertaut dengan identitasmu\",\r\n  \"Consent_Arg3\": \"Kami tidak memiliki akses ke akunmu\",\r\n\r\n  \"Changelog_Title\": \"Catatan rilis\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Tenggat waktu\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Mata pelajaran\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Belum selesai\",\r\n  \"Tasks_ThisWeek\": \"Minggu ini\",\r\n\r\n  \"Task_Undone\": \"Belum selesai\",\r\n  \"Task_Done\": \"Selesai\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Personalisasi latar belakang\",\r\n  \"Modal_Profile_Title\": \"Personalisasi profil\",\r\n\r\n  \"Modal_Task_Status\": \"Status tugas\",\r\n  \"Modal_Task_Description\": \"Deskripsi tugas\",\r\n  \"Modal_Task_Attachments\": \"Lampiran\",\r\n\r\n  \"Today\": \"Hari ini\",\r\n  \"Yesterday\": \"Kemarin\",\r\n  \"Tomorrow\": \"Besok\"\r\n}"
  },
  {
    "path": "locales/it.json",
    "content": "{\n  \"Global_Back\": \"Indietro\",\n  \"Global_DatePrefix\": \"il\",\n\n  \"Tab_Home\": \"Home\",\n  \"Tab_Calendar\": \"Lezioni\",\n  \"Tab_Tasks\": \"Compiti\",\n  \"Tab_Grades\": \"Voti\",\n  \"Tab_Profile\": \"Profilo\",\n  \"Tab_Custom_Profile\": \"Modifica profilo\",\n  \"Button_Change_ProfilePicture\": \"Cambia foto profilo\",\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Scatta una foto\",\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Dalla galleria\",\n  \"Button_Change_ProfilePicture_FromService\": \"Recupera dal tuo registro (ENT)\",\n  \"Button_Change_ProfilePicture_Remove\": \"Rimuovi foto\",\n  \"Tab_Page\": \"Pagina\",\n  \"Tab_Settings\": \"Impostazioni\",\n  \"Tab_News\": \"Novità\",\n\n  \"ONBOARDING_MAIN_TITLE\": \"L'app per gestire la tua vita scolastica\",\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Collega le tue applicazioni scolastiche per accedere a voti, lezioni, compiti e molto altro nell'interfaccia Papillon!\",\n  \"ONBOARDING_START_BTN\": \"Inizia\",\n  \"ONBOARDING_HELP_BTN\": \"Serve aiuto?\",\n  \"ONBOARDING_UNIVERSITY\": \"Servizio universitario\",\n  \"ONBOARDING_RESTAURANTS\": \"Servizio ristorazione\",\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Seleziona il tuo servizio scolastico\",\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Seleziona il tuo servizio di ristorazione\",\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Seleziona il tuo servizio universitario\",\n  \"ONBOARDING_LOGIN_METHOD\": \"Come vuoi connetterti?\",\n  \"ONBOARDING_METHOD_POSITION\": \"Usa la mia posizione\",\n  \"ONBOARDING_METHOD_SEARCH\": \"Cerca una città\",\n  \"ONBOARDING_METHOD_QRCODE\": \"Ho un codice QR\",\n  \"ONBOARDING_METHOD_LINK\": \"Ho un URL di accesso\",\n  \"ONBOARDING_SELECT_SCHOOL\": \"Scegli il tuo istituto\",\n  \"ONBOARDING_SEARCH_TITLE\": \"Inserisci il nome della tua città e scegli l'istituto\",\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Accedi come fai di solito\",\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Accedi al tuo account\",\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Scegli l'host assegnato all'account\",\n  \"ONBOARDING_PRONOTE_PIN\": \"Inserisci il codice a 4 cifre che hai creato su PRONOTE\",\n  \"ONBOARDING_LOGIN_TO\": \"Connessione a\",\n  \"ONBOARDING_SCAN_QRCODE\": \"Scansiona il codice QR del tuo istituto per connetterti.\",\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validazione del codice QR\",\n  \"ONBOARDING_QRCODE_WAIT\": \"Potrebbe richiedere qualche istante...\",\n  \"ONBOARDING_URL\": \"Inserisci l'indirizzo URL del tuo istituto\",\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL della tua istanza PRONOTE\",\n  \"ONBOARDING_COLOR_TITLE\": \"Prima di finire\",\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Scegli un\",\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"colore del tema\",\n  \"ONBOARDING_LOGIN_PINCODE\": \"Inserisci il codice PIN del tuo PRONOTE\",\n  \"Onboarding_Load_Webview_Description\": \"Stiamo caricando il sito del tuo istituto\",\n  \"INPUT_PIN\": \"Codice PIN\",\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Cerca un'istanza...\",\n  \"ONBOARDING_LOADING_LOGIN\": \"Connessione in corso...\",\n\n  \"WAITING\": \"In attesa\",\n  \"IZLY_SMS_SEND\": \"Hai appena ricevuto un link per connetterti, cliccaci sopra e segui i passaggi.\",\n  \"STEP\": \"Passaggio\",\n  \"STEP_OUTOF\": \"di\",\n  \"INPUT_USERNAME\": \"Nome utente\",\n  \"INPUT_MAIL\": \"Indirizzo e-mail\",\n  \"INPUT_MAIL_OR_USERNAME\": \"Indirizzo e-mail o nome utente\",\n  \"INPUT_PHONE_OR_MAIL\": \"Numero di telefono o e-mail\",\n  \"INPUT_PASSWORD\": \"Password\",\n  \"INPUT_PASSWORD_CODE\": \"Codice di accesso\",\n  \"INPUT_ETABID\": \"Identificativo del tuo istituto\",\n  \"LOGIN_BTN\": \"Accedi\",\n  \"CONFIRM_BTN\": \"Conferma\",\n  \"CANCEL_BTN\": \"Annulla\",\n\n  \"Tab_New_Event\": \"Nuovo evento\",\n\n  \"Tab_Calendar_Icals\": \"Gestione iCal\",\n  \"Tab_Calendar_Icals_Description\": \"Gestisci i tuoi URL iCal\",\n\n  \"Tab_Calendar_Icals_Add_URL\": \"Aggiungi un URL iCal\",\n  \"Tab_Calendar_Icals_Manage_Title\": \"Gestisci {{title}}\",\n  \"Tab_Calendar_Icals_Manage_Description\": \"Aggiungi o rimuovi URL iCal da sincronizzare con il tuo calendario.\",\n  \"Tab_Calendar_Icals_Add_Title\": \"Titolo mancante\",\n  \"Tab_Calendar_Icals_Add_Description\": \"Assegna un nome a questo URL iCal per aggiungerlo.\",\n  \"Tab_Calendar_Icals_Empty\": \"Nessun URL iCal aggiunto\",\n\n  \"TabUnderConstruction_Title\": \"Questa scheda è in fase di sviluppo.\",\n  \"TabUnderConstruction_Details\": \"Torna più tardi per nuovi aggiornamenti.\",\n\n  \"TabDevModeNotice_Title\": \"Modalità Sviluppatore\",\n  \"TabDevModeNotice_Details\": \"Ambiente di test completo per gli sviluppatori.\",\n\n  \"Alert_TechnicalDetails\": \"Dettagli tecnici\",\n\n  \"Online_Course\": \"Online\",\n  \"Evaluated_Course\": \"Valutazione\",\n  \"Edited_Course\": \"Lezione modificata\",\n  \"Canceled_Course\": \"Lezione annullata\",\n  \"No_Course_Room\": \"Aula sconosciuta\",\n  \"Event_DeleteEvent\": \"Elimina l'evento\",\n  \"Event_Confirm_DeleteEvent\": \"Sei sicuro di voler eliminare questo evento?\",\n\n  \"Course_Separator_Lunch_Default\": \"Pausa pranzo\",\n  \"Course_Separator_Lunch_Alt_1\": \"Buon appetito!\",\n  \"Course_Separator_Lunch_Alt_2\": \"Gnam!\",\n\n  \"Course_Separator_Morning_Default\": \"Pausa mattutina\",\n  \"Course_Separator_Morning_Alt_1\": \"A nanna!\",\n  \"Course_Separator_Morning_Alt_2\": \"Colazione\",\n\n  \"Course_Separator_Evening_Default\": \"Pausa pomeridiana\",\n  \"Course_Separator_Evening_Alt_1\": \"Una pausa ci vuole!\",\n  \"Course_Separator_Evening_Alt_2\": \"Ora della merenda!\",\n\n  \"Course_Separator_Night_Default\": \"Pausa serale\",\n  \"Course_Separator_Night_Alt_1\": \"A nanna!\",\n  \"Course_Separator_Night_Alt_2\": \"È notte!\",\n\n  \"Context_Delete\": \"Elimina\",\n  \"Context_Cancel\": \"Annulla\",\n  \"Context_Edit\": \"Modifica\",\n  \"Context_Add\": \"Aggiungi\",\n\n  \"Form_Title\": \"Titolo\",\n  \"Form_Location\": \"Posizione\",\n  \"Form_Organizer\": \"Organizzatore\",\n  \"Form_Start\": \"Inizio\",\n  \"Form_End\": \"Fine\",\n\n  \"Confirm_DeleteEvent\": \"Sei sicuro di voler eliminare questo evento?\",\n\n  \"Home_Welcome_Name\": \"Ciao, {{name}} {{emoji}}\",\n  \"Home_Display_More\": \"Mostra altro\",\n  \"Home_Cards_Button_Description_Plurial\": \"disponibili\",\n  \"Home_Chats_Plurial\": \"discussioni\",\n  \"Home_Chats_Singular\": \"discussione\",\n  \"Home_See_All_Tasks\": \"Vedi tutti i compiti\",\n  \"Home_Welcome\": \"Buongiorno!\",\n  \"Home_Planned_None\": \"Non hai altre lezioni previste per oggi\",\n  \"Home_Planned_One\": \"Hai una lezione rimasta per oggi\",\n  \"Home_Planned_Number\": \"Hai {{number}} lezioni rimaste oggi\",\n\n  \"Home_Widget_NextCourses\": \"Prossime lezioni\",\n  \"Home_Widget_NewGrades\": \"Nuovi voti\",\n  \"Home_Widget_NewHomeworks\": \"Compiti da fare\",\n\n  \"Home_Widget_NoCourses\": \"Nessuna lezione in programma\",\n  \"Home_Widget_NoCourses_Description\": \"Non ci sono lezioni previste per oggi.\",\n\n  \"Home_Cards_Button_Title\": \"Tessere\",\n  \"Home_Cards_Button_Description_None\": \"Nessuna tessera\",\n  \"Home_Cards_Button_Description_Singular\": \"Una tessera\",\n  \"Home_Cards_Button_Description_Number\": \"{{number}} tessere\",\n\n  \"Home_Chats_Button_Title\": \"Messaggi\",\n  \"Home_Chats_Button_Description_None\": \"Nessun messaggio\",\n  \"Home_Chats_Button_Description_Singular\": \"Un messaggio\",\n  \"Home_Chats_Button_Description_Number\": \"{{number}} messaggi\",\n\n  \"Home_Attendance_Title\": \"Assenze\",\n  \"Home_Attendance_Button_Description_None\": \"Nessuna assenza\",\n  \"Home_Attendance_Button_Description_Singular\": \"Un'assenza\",\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} assenze\",\n\n  \"Home_Menu_Button_Title\": \"Menu\",\n  \"Home_Menu_Button_Description\": \"Menu del giorno\",\n\n  \"Tab_Calendar_Empty\": \"Nessun evento trovato\",\n  \"Tab_Calendar_Empty_Description\": \"Aggiungi un evento o sincronizza il tuo calendario per iniziare.\",\n\n  \"Modal_Course_Title\": \"La mia lezione\",\n  \"Modal_Course_StartsIn\": \"Inizia tra\",\n  \"Modal_Course_StartedAgo\": \"Terminata da\",\n  \"Modal_Course_Ongoing\": \"Iniziata da\",\n  \"Modal_Course_Group\": \"Gruppo\",\n  \"Modal_Course_Group_Full\": \"Classe\",\n\n  \"Modal_Course_Details\": \"Dettagli della lezione\",\n  \"Modal_Course_Teacher\": \"Docente\",\n  \"Modal_Course_Room\": \"Aula\",\n  \"Modal_Course_Duration\": \"Durata\",\n\n  \"Modal_Course_Time\": \"Orario della lezione\",\n  \"Modal_Course_Start\": \"Inizio\",\n  \"Modal_Course_End\": \"Fine\",\n\n  \"Tasks_Search_Placeholder\": \"Cerca compiti\",\n  \"Tasks_LeftHomeworks_Title\": \"compiti rimanenti\",\n  \"Tasks_LeftHomeworks_Time\": \"questa settimana\",\n  \"Tasks_Done_AllTasks\": \"Tutti i compiti\",\n  \"Tasks_Done_CompletedTasks\": \"sono stati completati\",\n  \"Tasks_Nav_Left\": \"Ancora {{count}} compito/i da fare\",\n  \"Tasks_Nav_One\": \"Ancora un compito da fare\",\n  \"Tasks_Nav_Completed\": \"Tutto completato!\",\n  \"Tasks_Week\": \"Settimana\",\n  \"Tasks_NoTasks_Title\": \"Nessun compito\",\n  \"Tasks_NoTasks_Description\": \"Non ci sono compiti previsti per questa settimana. Goditi il riposo!\",\n  \"Tasks_NoTasks_ForWeek\": \"per la settimana {{week}}\",\n  \"Tasks_NoTasks_Nav\": \"Nessun compito\",\n  \"Task_Start\": \"Da fare\",\n  \"Task_Complete\": \"Completato\",\n  \"Task_Sorting_Title\": \"Ordina per\",\n  \"Task_OnlyShowUndone\": \"Compiti completati\",\n  \"Task_Show_Title\": \"Visualizza\",\n  \"Settings_General\": \"Generale\",\n\n  \"Latest_Grades\": \"Nuovi voti\",\n  \"Grades_Search_Placeholder\": \"Cerca un voto, una materia\",\n\n  \"Grades_Avg_Methods\": \"Metodi di calcolo\",\n  \"Grades_Avg_All_Title\": \"Media generale\",\n  \"Grades_Avg_All_Short\": \"Media gen.\",\n  \"Grades_Avg_All_Pond\": \"Media ponderata\",\n  \"Grades_Avg_All_Pond_Short\": \"Media pond.\",\n  \"Grades_Avg_All_Pond_Description\": \"Calcola la media ponderata di tutti i voti\",\n  \"Grades_Avg_Subject_Title\": \"Media delle materie\",\n  \"Grades_Avg_Subject_Short\": \"Media mat.\",\n  \"Grades_Avg_Subject_Description\": \"Calcola la media ponderata delle medie delle materie\",\n  \"Grades_Avg_Median_Title\": \"Mediana\",\n  \"Grades_Avg_Median_Short\": \"Mediana\",\n\n  \"Grades_Avg_More\": \"Scopri di più\",\n  \"Grades_Avg_KnowMore\": \"Saperne di più\",\n  \"Grades_Avg_KnowMore_Description\": \"Comprendi i metodi di calcolo della media generale\",\n\n  \"Grades_SubjectInfo\": \"Informazioni sulla materia\",\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} voto/i\",\n  \"SubjectInfo_StudentAverage_Label\": \"Media dello studente\",\n  \"SubjectInfo_Stats_Header\": \"Statistiche\",\n  \"SubjectInfo_ClassAverage_Label\": \"Media della classe\",\n  \"SubjectInfo_ClassAverage_Description\": \"Media generale della classe\",\n  \"SubjectInfo_MaxAverage_Label\": \"Media massima\",\n  \"SubjectInfo_MaxAverage_Description\": \"Migliore media del gruppo\",\n  \"SubjectInfo_MinAverage_Label\": \"Media minima\",\n  \"SubjectInfo_MinAverage_Description\": \"Media più bassa del gruppo\",\n\n  \"Grades_Semester\": \"Semestre\",\n  \"Grades_Trimester\": \"Trimestre\",\n  \"Grades_OutPeriod\": \"Fuori periodo\",\n  \"Grades_Year\": \"Anno\",\n  \"Grades_MockExamBac\": \"Simulazione Maturità\",\n  \"Grades_MockExamBrevet\": \"Simulazione Esame\",\n\n  \"Grades_Method_AllGrades\": \"Tutte le materie\",\n  \"Grades_Method_Weighted\": \"Ponderazione\",\n\n  \"Grades_Sort\": \"Ordina\",\n  \"Grades_Sorting_Alphabetical\": \"Alfabetico\",\n  \"Grades_Sorting_Averages\": \"Medie\",\n  \"Grades_Sorting_Date\": \"Data\",\n\n  \"Grades_Menu_SortBy\": \"Ordina per\",\n  \"Grades_Menu_AverageBy\": \"Media per\",\n  \"NoAverage\": \"Nessuna media\",\n\n  \"Grades_Empty_Title\": \"Nessun voto\",\n  \"Grades_Empty_Description\": \"Non hai ancora ricevuto voti in questo periodo.\",\n\n  \"Grade_NoDescription\": \"Compito di {{subject}}\",\n\n  \"Grades_Tab_Subjects\": \"Materie\",\n  \"Grades_Tab_Latest\": \"Ultimi voti\",\n\n  \"Profile_Attendance_Title\": \"Frequenza\",\n  \"Profile_Attendance_Denominator_Single\": \"assenza\",\n  \"Profile_Attendance_Denominator_Plural\": \"assenze\",\n\n  \"Profile_Discussions_Title\": \"Discussioni\",\n  \"Profile_Discussions_Denominator_Single\": \"non letto\",\n  \"Profile_Discussions_Denominator_Plural\": \"non letti\",\n\n  \"Profile_News_Title\": \"Attualità\",\n  \"Profile_News_Denominator_Single\": \"nuova\",\n  \"Profile_News_Denominator_Plural\": \"nuove\",\n  \"Profile_News_Open\": \"Apri\",\n  \"Profile_News_Loading_Title\": \"Caricamento notizie...\",\n  \"Profile_News_Author_Unknown\": \"Autore sconosciuto\",\n\n  \"Profile_Cards_Title\": \"Codice QR e tessere\",\n\n  \"Modal_Grades_Title\": \"Dettagli del voto\",\n  \"Modal_Grades_BestGrade\": \"Miglior voto del gruppo\",\n\n  \"Grades_Details_Title\": \"Dettagli\",\n  \"Grades_NormalizedGrade_Title\": \"Voto riportato su 20\",\n  \"Grades_NormalizedGrade_Description\": \"Valore del voto convertito in scala ventesimale\",\n  \"Grades_HighestGrade_Title\": \"Voto più alto\",\n  \"Grades_HighestGrade_Description\": \"Voto massimo ottenuto nel gruppo\",\n  \"Grades_LowestGrade_Title\": \"Voto più basso\",\n  \"Grades_LowestGrade_Description\": \"Voto minimo ottenuto nel gruppo\",\n  \"Grades_Influence_Title\": \"Influenza\",\n  \"Grades_Avg_Group_Title\": \"Media del gruppo\",\n  \"Grades_Coefficient\": \"Coefficiente\",\n  \"Grades_Avg_Group_Short\": \"Media gruppo\",\n  \"Grades_Tab_Rank\": \"Classifica\",\n  \"Grades_Tab_Rank_Description\": \"Posizione nel gruppo\",\n\n  \"News_Search_Placeholder\": \"Cerca una notizia\",\n  \"News_Empty_Title\": \"Nessuna notizia\",\n  \"News_Empty_Description\": \"Non sono state trovate notizie nel tuo istituto.\",\n  \"News_Search_NoResults\": \"Nessun risultato\",\n  \"News_Search_NoResults_Description\": \"Nessuna notizia trovata per la tua ricerca.\",\n\n  \"News_Theme_Papillon_Title\": \"Papillon\",\n  \"News_Theme_Papillon_Description\": \"Un tema morbido ed elegante\",\n\n  \"News_Theme_Reading_Title\": \"Lettura\",\n  \"News_Theme_Reading_Description\": \"Un tema progettato per la lettura\",\n\n  \"Attendance_Hours_Missed\": \"Ore perse\",\n  \"Attendance_Hours_Unjustified\": \"Ore non giustificate\",\n  \"Attendance_Missing\": \"Assenze\",\n  \"Attendance_Delays\": \"Ritardi\",\n  \"Attendance_NoReason\": \"Nessuna motivazione\",\n  \"Attendance_NoEvent_Title\": \"Nessun evento\",\n  \"Attendance_NoEvent_Description\": \"Nessuna assenza o ritardo registrato per questo periodo.\",\n\n  \"Settings_Account_Title\": \"Il mio account\",\n  \"Settings_Account_Description\": \"Il mio account\",\n  \"Settings_Services_Title\": \"Account collegati\",\n  \"Settings_Services_Title_LastAccountUsed\": \"Ultimo account utilizzato\",\n  \"Settings_Notifications_Title\": \"Notifiche\",\n  \"Settings_Notifications_Description\": \"Avvisi, frequenza...\",\n  \"Settings_Subjects_Title\": \"Materie\",\n  \"Settings_Subjects_Description\": \"Nome, colore, carattere...\",\n  \"Settings_Personalization_Title\": \"Personalizzazione\",\n  \"Settings_Personalization_Description\": \"Temi, colori...\",\n  \"Settings_Cards_Title\": \"Tessere\",\n  \"Settings_Cards_Description\": \"Mensa, accessi...\",\n  \"Settings_Accessibility_Title\": \"Accessibilità\",\n  \"Settings_Accessibility_Description\": \"Visualizzazione, suono...\",\n  \"Settings_MagicPlus_Title\": \"Magic+\",\n  \"Settings_MagicPlus_Description\": \"Funzionalità intelligenti\",\n  \"Settings_MagicPlus_Description_Card\": \"Funzionalità IA\",\n  \"Settings_MagicPlus_Enable\": \"Attiva Magic+\",\n  \"Settings_MagicPlus_Description_Optimization\": \"Ottimizza automaticamente l'organizzazione dei tuoi compiti per migliorare la produttività\",\n  \"Settings_MagicPlus_ExplanationLocal\": \"Modello completamente locale, nessun dato viene trasferito all'esterno del tuo dispositivo\",\n  \"Settings_Donate_Title\": \"Fai una donazione\",\n  \"Settings_Donate_Description\": \"Sostieni il progetto\",\n  \"Settings_Telemetry_Title\": \"Telemetria e privacy\",\n  \"Settings_Telemetry_Description\": \"Gestisci i dati raccolti\",\n  \"Settings_About_Title\": \"Informazioni\",\n  \"Settings_About_Description\": \"Versione\",\n  \"Settings_Logout_Title\": \"Disconnetti\",\n  \"Settings_Logout_Description\": \"Rimuovi questo account da Papillon\",\n  \"Settings_Language_Title\": \"Lingua\",\n  \"Settings_Language_Description\": \"Cambia lingua\",\n  \"Settings_Tabs_Title\": \"Schede\",\n  \"Settings_Tabs_Description\": \"Nascondi schede dal menu\",\n\n  \"Settings_Personalization_Title_Card\": \"Personalizzazione\",\n  \"Settings_Personalization_Subtitle_Card\": \"Temi, materie...\",\n  \"Settings_SubjectPersonalization_Title\": \"Personalizza le materie\",\n  \"Settings_Personalization_Accent\": \"Colore d'accento\",\n  \"Settings_Personalization_Accent_Description\": \"Il colore scelto qui verrà applicato alla pagina iniziale di Papillon.\",\n  \"Settings_Personalization_Theme\": \"Tema\",\n  \"Settings_Personalization_Icon_Title\": \"Cambia icona\",\n  \"Settings_Personalization_Icon_Description\": \"Personalizza l'icona dell'app\",\n  \"Settings_Personalization_Subject_Title\": \"Personalizza le materie\",\n  \"Settings_Personalization_Subject_Title_Card\": \"Materie\",\n  \"Settings_Personalization_Subject_Description\": \"Icone, colori\",\n  \"Settings_About_Papillion_Behind\": \"Dietro Papillon\",\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon è gestito da studenti volontari al 100%\",\n  \"Settings_About_Discord\": \"Server Discord\",\n  \"Settings_About_Discord_Description\": \"Unisciti al server Discord\",\n  \"Settings_About_Crowdin\": \"Progetto Crowdin\",\n  \"Settings_About_Crowdin_Description\": \"Aiuta a tradurre Papillon\",\n  \"Settings_About_Github\": \"Progetto GitHub\",\n  \"Settings_About_Github_Description\": \"Contribuisci al progetto su GitHub\",\n  \"Settings_About_Issue\": \"Segnala un bug\",\n  \"Settings_About_Issue_Description\": \"Segnala un errore riscontrato\",\n  \"Settings_About_Dependency_Version\": \"Versione delle dipendenze\",\n\n  \"Alert_No_Technical\": \"Nessuna informazione tecnica disponibile.\",\n  \"Alert_Auth_Error\": \"Errore di autenticazione\",\n  \"Alert_Auth_Bad_Creds\": \"Le credenziali inserite non sono corrette o stai cercando di connetterti con un account genitore. Questo tipo di account non è ancora supportato da Papillon.\",\n  \"Alert_Not_Supported\": \"Istanza non supportata\",\n  \"Alert_Security_Instance_HTTP\": \"Per motivi di sicurezza, Papillon non accetta istanze che utilizzano ancora il protocollo HTTP. Ti consigliamo di informare il dirigente scolastico affinché aggiorni l'istanza e ne preservi la sicurezza.\",\n  \"Alert_NoDemo\": \"Papillon non è progettato per funzionare con istanze demo, per favore usa un'altra istanza.\",\n  \"Alert_Invalid_Instance\": \"Papillon non riesce a ottenere informazioni da questa istanza PRONOTE, è ancora valida?\",\n  \"Alert_No_Pos\": \"Impossibile recuperare la posizione\",\n  \"Alert_Connexion_Fail\": \"Connessione impossibile\",\n\n  \"Feature_Limited\": \"Funzionalità limitate\",\n  \"Feature_Soon\": \"In arrivo!\",\n  \"Feature_Soon_Notification\": \"Stiamo lavorando sodo per offrirti questa funzionalità in un futuro aggiornamento.\",\n  \"Feature_Add_Card\": \"Aggiungi una nuova tessera dalla scheda Profilo accessibile nella barra di navigazione\",\n\n  \"Webview_Wait\": \"Un po' di pazienza...\",\n\n  \"Profile_QRCards\": \"Codice QR e tessere\",\n  \"Profile_QRCards_Subtitle\": \"{{count}} tessera/e\",\n  \"Profile_Cards_Loading_History\": \"Caricamento cronologia transazioni\",\n  \"Profile_Cards_Loading_History_Description\": \"Potrebbe richiedere un momento...\",\n\n  \"Settings_Cards_Banner_Title\": \"Tessere\",\n  \"Settings_Cantineen_Subtitle_Card\": \"Mensa, accessi\",\n  \"Settings_Cards_Banner_Description\": \"Aggiungi le tue tessere mensa e trasporti per accedervi ovunque dal tuo telefono su Papillon\",\n  \"Settings_Cards_None_Title\": \"Nessuna tessera\",\n  \"Settings_Cards_Add_Button\": \"Aggiungi\",\n\n  \"Settings_Cards_None_Description\": \"Aggiungine una per accedere al tuo saldo mensa, scansionare il tuo codice QR e altro ancora\",\n  \"Settings_Subjects_None_Title\": \"Nessuna materia\",\n  \"Settings_Subjects_None_Description\": \"Esplora le diverse schede dell'app per poter personalizzare le materie.\",\n  \"Settings_Subjects_Reset_Title\": \"Ripristina\",\n  \"Settings_Subjects_Reset_Message\": \"Vuoi davvero ripristinare tutte le materie?\",\n  \"Settings_Subjects_Reset_Button\": \"Ripristina\",\n\n  \"Settings_Donator\": \"Donatori\",\n  \"Settings_Donator_Description\": \"Vedi la lista dei donatori\",\n  \"Settings_App_Version\": \"Versione dell'applicazione\",\n\n  \"Profile_Cards_Scan_Orientation\": \"Orienta il codice QR verso il lettore del terminale\",\n  \"Profile_Cards_No_Reservation\": \"Nessuna prenotazione\",\n  \"Profile_Cards_No_Available_Reservation\": \"Sembra che tu non possa prenotare per questo giorno.\",\n  \"Profile_Cards_History\": \"Cronologia\",\n  \"Magic_Important\": \"Potrebbe essere importante\",\n\n  \"OnBoarding_Step\": \"Passaggio \",\n  \"OnBoarding_Step_Of\": \"di \",\n\n  \"Consent_Advanced_Title\": \"Voglio aiutare Papillon\",\n  \"Consent_Advanced_Description\": \"Raccogliamo informazioni più dettagliate sul tuo utilizzo.\",\n  \"Consent_Required_Title\": \"Solo l'essenziale\",\n  \"Consent_Required_Description\": \"In breve, sapere che qualcuno ha usato Papillon, se è andata bene e quale servizio utilizza.\",\n  \"Consent_None_Title\": \"Niente di niente\",\n  \"Consent_None_Description\": \"Non sapremo nemmeno della tua esistenza.\",\n  \"Consent_Title\": \"Tu e Papillon\",\n  \"Consent_Intro1\": \"Per aiutare Papillon a crescere, puoi scegliere di condividere alcune informazioni d'uso.\",\n  \"Consent_PrivacyPolicy\": \"In caso di dubbi, consulta la nostra informativa sulla privacy\",\n  \"Consent_Refuse\": \"Rifiuta\",\n  \"Consent_Accept\": \"Accetta\",\n  \"Consent_ChangeMind\": \"Puoi cambiare idea in qualsiasi momento dalle impostazioni dell'app.\",\n  \"Consent_Arg1\": \"Serve solo a migliorare l'applicazione\",\n  \"Consent_Arg2\": \"Anonimo e non collegato alla tua identità\",\n  \"Consent_Arg3\": \"Non abbiamo accesso ai tuoi account\",\n\n  \"Changelog_Title\": \"Note di aggiornamento\",\n\n  \"Tasks_Sorting_Methods_DueDate\": \"Data di consegna\",\n  \"Tasks_Sorting_Methods_Subject\": \"Materie\",\n  \"Tasks_Sorting_Methods_Done\": \"Non completato\",\n  \"Tasks_ThisWeek\": \"Questa settimana\",\n\n  \"Task_Undone\": \"Non completato\",\n  \"Task_Done\": \"Completato\",\n\n  \"Modal_Wallpaper_Title\": \"Personalizza sfondo\",\n  \"Modal_Profile_Title\": \"Personalizza profilo\",\n\n  \"Modal_Task_Status\": \"Stato del compito\",\n  \"Modal_Task_Description\": \"Descrizione del compito\",\n  \"Modal_Task_Attachments\": \"Allegati\",\n\n  \"Today\": \"Oggi\",\n  \"Yesterday\": \"Ieri\",\n  \"Tomorrow\": \"Domani\"\n}"
  },
  {
    "path": "locales/ja.json",
    "content": "{\n  \"Global_Back\": \"戻る\",\n  \"Global_DatePrefix\": \" \",\n\n  \"Tab_Home\": \"ホーム\",\n  \"Tab_Calendar\": \"授業\",\n  \"Tab_Tasks\": \"課題\",\n  \"Tab_Grades\": \"成績\",\n  \"Tab_Profile\": \"プロフィール\",\n  \"Tab_Custom_Profile\": \"プロフィールを編集\",\n  \"Button_Change_ProfilePicture\": \"プロフィール写真を変更\",\n  \"Button_Change_ProfilePicture_TakePhoto\": \"写真を撮る\",\n  \"Button_Change_ProfilePicture_FromLibrary\": \"ライブラリから選択\",\n  \"Button_Change_ProfilePicture_FromService\": \"ENTから取得\",\n  \"Button_Change_ProfilePicture_Remove\": \"写真を削除\",\n  \"Tab_Page\": \"ページ\",\n  \"Tab_Settings\": \"設定\",\n  \"Tab_News\": \"ニュース\",\n\n  \"ONBOARDING_MAIN_TITLE\": \"学校生活を管理するためのアプリ\",\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"学校のアプリを連携して、成績、授業、宿題などをPapillonのインターフェースで確認しましょう！\",\n  \"ONBOARDING_START_BTN\": \"始める\",\n  \"ONBOARDING_HELP_BTN\": \"お困りですか？\",\n  \"ONBOARDING_UNIVERSITY\": \"大学サービス\",\n  \"ONBOARDING_RESTAURANTS\": \"食堂サービス\",\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"学校サービスを選択\",\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"食堂サービスを選択\",\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"大学サービスを選択\",\n  \"ONBOARDING_LOGIN_METHOD\": \"ログイン方法を選択してください\",\n  \"ONBOARDING_METHOD_POSITION\": \"現在地を使用する\",\n  \"ONBOARDING_METHOD_SEARCH\": \"都市を検索する\",\n  \"ONBOARDING_METHOD_QRCODE\": \"QRコードを持っている\",\n  \"ONBOARDING_METHOD_LINK\": \"接続URLを持っている\",\n  \"ONBOARDING_SELECT_SCHOOL\": \"学校を選択\",\n  \"ONBOARDING_SEARCH_TITLE\": \"都市名を入力して学校を選択してください\",\n  \"ONBOARDING_WEBVIEW_TITLE\": \"いつもの方法でログイン\",\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"アカウントにログイン\",\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"アカウントに割り当てられたホストを選択\",\n  \"ONBOARDING_PRONOTE_PIN\": \"PRONOTEで作成した4桁のコードを入力してください\",\n  \"ONBOARDING_LOGIN_TO\": \"接続先：\",\n  \"ONBOARDING_SCAN_QRCODE\": \"学校のQRコードをスキャンしてログインしてください。\",\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QRコードの検証中\",\n  \"ONBOARDING_QRCODE_WAIT\": \"これには数分かかる場合があります...\",\n  \"ONBOARDING_URL\": \"学校のURLを入力してください\",\n  \"ONBOARDING_URL_PLACEHOLDER\": \"PRONOTEインスタンスのURL\",\n  \"ONBOARDING_COLOR_TITLE\": \"最後に\",\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"テーマの\",\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"カラーを選択\",\n  \"ONBOARDING_LOGIN_PINCODE\": \"PRONOTEのPINコードを入力\",\n  \"Onboarding_Load_Webview_Description\": \"学校のサイトを読み込んでいます\",\n  \"INPUT_PIN\": \"PINコード\",\n  \"SEARCH_UNIV_PLACEHOLDER\": \"インスタンスを検索...\",\n  \"ONBOARDING_LOADING_LOGIN\": \"ログイン中...\",\n\n  \"WAITING\": \"待機中\",\n  \"IZLY_SMS_SEND\": \"ログイン用リンクが送信されました。リンクをクリックして手順に従ってください。\",\n  \"STEP\": \"ステップ\",\n  \"STEP_OUTOF\": \"/\",\n  \"INPUT_USERNAME\": \"ユーザー名\",\n  \"INPUT_MAIL\": \"メールアドレス\",\n  \"INPUT_MAIL_OR_USERNAME\": \"メールアドレスまたはユーザー名\",\n  \"INPUT_PHONE_OR_MAIL\": \"電話番号またはメールアドレス\",\n  \"INPUT_PASSWORD\": \"パスワード\",\n  \"INPUT_PASSWORD_CODE\": \"アクセスコード\",\n  \"INPUT_ETABID\": \"学校の識別子\",\n  \"LOGIN_BTN\": \"ログイン\",\n  \"CONFIRM_BTN\": \"確認\",\n  \"CANCEL_BTN\": \"キャンセル\",\n\n  \"Tab_New_Event\": \"新しいイベント\",\n\n  \"Tab_Calendar_Icals\": \"iCal管理\",\n  \"Tab_Calendar_Icals_Description\": \"iCal URLを管理する\",\n\n  \"Tab_Calendar_Icals_Add_URL\": \"iCal URLを追加\",\n  \"Tab_Calendar_Icals_Manage_Title\": \"{{title}} を管理\",\n  \"Tab_Calendar_Icals_Manage_Description\": \"カレンダーと同期するiCal URLを追加または削除します。\",\n  \"Tab_Calendar_Icals_Add_Title\": \"タイトル未入力\",\n  \"Tab_Calendar_Icals_Add_Description\": \"追加するiCal URLに名前を付けてください。\",\n  \"Tab_Calendar_Icals_Empty\": \"iCal URLが追加されていません\",\n\n  \"TabUnderConstruction_Title\": \"このタブは現在準備中です。\",\n  \"TabUnderConstruction_Details\": \"アップデートをお待ちください。\",\n\n  \"TabDevModeNotice_Title\": \"開発者モード\",\n  \"TabDevModeNotice_Details\": \"開発者向けのテスト環境です。\",\n\n  \"Alert_TechnicalDetails\": \"技術的な詳細\",\n\n  \"Online_Course\": \"オンライン\",\n  \"Evaluated_Course\": \"評価\",\n  \"Edited_Course\": \"変更された授業\",\n  \"Canceled_Course\": \"休講\",\n  \"No_Course_Room\": \"教室不明\",\n  \"Event_DeleteEvent\": \"イベントを削除\",\n  \"Event_Confirm_DeleteEvent\": \"このイベントを削除してもよろしいですか？\",\n\n  \"Course_Separator_Lunch_Default\": \"昼休み\",\n  \"Course_Separator_Lunch_Alt_1\": \"いただきます！\",\n  \"Course_Separator_Lunch_Alt_2\": \"おいしい！\",\n\n  \"Course_Separator_Morning_Default\": \"午前の休憩\",\n  \"Course_Separator_Morning_Alt_1\": \"おやすみ！\",\n  \"Course_Separator_Morning_Alt_2\": \"朝ごはん\",\n\n  \"Course_Separator_Evening_Default\": \"午後の休憩\",\n  \"Course_Separator_Evening_Alt_1\": \"休憩しましょう！\",\n  \"Course_Separator_Evening_Alt_2\": \"おやつの時間！\",\n\n  \"Course_Separator_Night_Default\": \"夜の休憩\",\n  \"Course_Separator_Night_Alt_1\": \"おやすみ！\",\n  \"Course_Separator_Night_Alt_2\": \"夜になりました！\",\n\n  \"Context_Delete\": \"削除\",\n  \"Context_Cancel\": \"キャンセル\",\n  \"Context_Edit\": \"編集\",\n  \"Context_Add\": \"追加\",\n\n  \"Form_Title\": \"タイトル\",\n  \"Form_Location\": \"場所\",\n  \"Form_Organizer\": \"主催者\",\n  \"Form_Start\": \"開始\",\n  \"Form_End\": \"終了\",\n\n  \"Confirm_DeleteEvent\": \"このイベントを削除してもよろしいですか？\",\n\n  \"Home_Welcome_Name\": \"こんにちは、{{name}} {{emoji}}\",\n  \"Home_Display_More\": \"詳細を表示\",\n  \"Home_Cards_Button_Description_Plurial\": \"利用可能\",\n  \"Home_Chats_Plurial\": \"件のメッセージ\",\n  \"Home_Chats_Singular\": \"件のメッセージ\",\n  \"Home_See_All_Tasks\": \"すべての課題を見る\",\n  \"Home_Welcome\": \"こんにちは！\",\n  \"Home_Planned_None\": \"今日の予定はすべて終了しました\",\n  \"Home_Planned_One\": \"今日はあと1つの授業があります\",\n  \"Home_Planned_Number\": \"今日はあと{{number}}つの授業があります\",\n\n  \"Home_Widget_NextCourses\": \"次の授業\",\n  \"Home_Widget_NewGrades\": \"新しい成績\",\n  \"Home_Widget_NewHomeworks\": \"やるべき課題\",\n\n  \"Home_Widget_NoCourses\": \"今後の授業はありません\",\n  \"Home_Widget_NoCourses_Description\": \"今日の予定はありません。\",\n\n  \"Home_Cards_Button_Title\": \"カード\",\n  \"Home_Cards_Button_Description_None\": \"カードなし\",\n  \"Home_Cards_Button_Description_Singular\": \"1枚のカード\",\n  \"Home_Cards_Button_Description_Number\": \"{{number}}枚のカード\",\n\n  \"Home_Chats_Button_Title\": \"メッセージ\",\n  \"Home_Chats_Button_Description_None\": \"メッセージなし\",\n  \"Home_Chats_Button_Description_Singular\": \"1件のメッセージ\",\n  \"Home_Chats_Button_Description_Number\": \"{{number}}件のメッセージ\",\n\n  \"Home_Attendance_Title\": \"欠席\",\n  \"Home_Attendance_Button_Description_None\": \"欠席なし\",\n  \"Home_Attendance_Button_Description_Singular\": \"1件の欠席\",\n  \"Home_Attendance_Button_Description_Number\": \"{{number}}件の欠席\",\n\n  \"Home_Menu_Button_Title\": \"メニュー\",\n  \"Home_Menu_Button_Description\": \"今日の献立\",\n\n  \"Tab_Calendar_Empty\": \"イベントが見つかりません\",\n  \"Tab_Calendar_Empty_Description\": \"イベントを追加するか、カレンダーを同期して始めましょう。\",\n\n  \"Modal_Course_Title\": \"授業\",\n  \"Modal_Course_StartsIn\": \"開始まであと\",\n  \"Modal_Course_StartedAgo\": \"終了から\",\n  \"Modal_Course_Ongoing\": \"開始から\",\n  \"Modal_Course_Group\": \"グループ\",\n  \"Modal_Course_Group_Full\": \"クラス\",\n\n  \"Modal_Course_Details\": \"授業の詳細\",\n  \"Modal_Course_Teacher\": \"教師\",\n  \"Modal_Course_Room\": \"教室\",\n  \"Modal_Course_Duration\": \"時間\",\n\n  \"Modal_Course_Time\": \"授業時間\",\n  \"Modal_Course_Start\": \"開始\",\n  \"Modal_Course_End\": \"終了\",\n\n  \"Tasks_Search_Placeholder\": \"課題を検索\",\n  \"Tasks_LeftHomeworks_Title\": \"残りの課題\",\n  \"Tasks_LeftHomeworks_Time\": \"今週\",\n  \"Tasks_Done_AllTasks\": \"すべての課題\",\n  \"Tasks_Done_CompletedTasks\": \"完了しました\",\n  \"Tasks_Nav_Left\": \"あと{{count}}個の課題\",\n  \"Tasks_Nav_One\": \"あと1個の課題\",\n  \"Tasks_Nav_Completed\": \"すべて完了！\",\n  \"Tasks_Week\": \"週\",\n  \"Tasks_NoTasks_Title\": \"課題なし\",\n  \"Tasks_NoTasks_Description\": \"今週の課題はありません。ゆっくり休んでください！\",\n  \"Tasks_NoTasks_ForWeek\": \"第{{week}}週\",\n  \"Tasks_NoTasks_Nav\": \"課題なし\",\n  \"Task_Start\": \"未完了\",\n  \"Task_Complete\": \"完了\",\n  \"Task_Sorting_Title\": \"並び替え\",\n  \"Task_OnlyShowUndone\": \"完了した課題\",\n  \"Task_Show_Title\": \"表示\",\n  \"Settings_General\": \"全般\",\n\n  \"Latest_Grades\": \"新しい成績\",\n  \"Grades_Search_Placeholder\": \"成績や教科を検索\",\n\n  \"Grades_Avg_Methods\": \"計算方法\",\n  \"Grades_Avg_All_Title\": \"総合平均\",\n  \"Grades_Avg_All_Short\": \"総合平均\",\n  \"Grades_Avg_All_Pond\": \"加重平均\",\n  \"Grades_Avg_All_Pond_Short\": \"加重平均\",\n  \"Grades_Avg_All_Pond_Description\": \"すべての成績の加重平均を計算します\",\n  \"Grades_Avg_Subject_Title\": \"教科平均\",\n  \"Grades_Avg_Subject_Short\": \"教科平均\",\n  \"Grades_Avg_Subject_Description\": \"教科ごとの加重平均を計算します\",\n  \"Grades_Avg_Median_Title\": \"中央値\",\n  \"Grades_Avg_Median_Short\": \"中央値\",\n\n  \"Grades_Avg_More\": \"詳しく見る\",\n  \"Grades_Avg_KnowMore\": \"詳細情報\",\n  \"Grades_Avg_KnowMore_Description\": \"総合平均の計算方法について\",\n\n  \"Grades_SubjectInfo\": \"教科情報\",\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}}個の成績\",\n  \"SubjectInfo_StudentAverage_Label\": \"自分の平均\",\n  \"SubjectInfo_Stats_Header\": \"統計\",\n  \"SubjectInfo_ClassAverage_Label\": \"クラス平均\",\n  \"SubjectInfo_ClassAverage_Description\": \"クラス全体の平均\",\n  \"SubjectInfo_MaxAverage_Label\": \"最高平均\",\n  \"SubjectInfo_MaxAverage_Description\": \"グループ内の最高点\",\n  \"SubjectInfo_MinAverage_Label\": \"最低平均\",\n  \"SubjectInfo_MinAverage_Description\": \"グループ内の最低点\",\n\n  \"Grades_Semester\": \"学期\",\n  \"Grades_Trimester\": \"期\",\n  \"Grades_OutPeriod\": \"期間外\",\n  \"Grades_Year\": \"年\",\n  \"Grades_MockExamBac\": \"Bac模擬試験\",\n  \"Grades_MockExamBrevet\": \"Brevet模擬試験\",\n\n  \"Grades_Method_AllGrades\": \"すべての教科\",\n  \"Grades_Method_Weighted\": \"重み付け\",\n\n  \"Grades_Sort\": \"並び替え\",\n  \"Grades_Sorting_Alphabetical\": \"五十音順\",\n  \"Grades_Sorting_Averages\": \"平均順\",\n  \"Grades_Sorting_Date\": \"日付順\",\n\n  \"Grades_Menu_SortBy\": \"並び替え条件\",\n  \"Grades_Menu_AverageBy\": \"平均の計算単位\",\n  \"NoAverage\": \"平均なし\",\n\n  \"Grades_Empty_Title\": \"成績なし\",\n  \"Grades_Empty_Description\": \"この期間の成績はまだ登録されていません。\",\n\n  \"Grade_NoDescription\": \"{{subject}}の課題\",\n\n  \"Grades_Tab_Subjects\": \"教科別\",\n  \"Grades_Tab_Latest\": \"最新\",\n\n  \"Profile_Attendance_Title\": \"出席状況\",\n  \"Profile_Attendance_Denominator_Single\": \"欠席\",\n  \"Profile_Attendance_Denominator_Plural\": \"欠席\",\n\n  \"Profile_Discussions_Title\": \"チャット\",\n  \"Profile_Discussions_Denominator_Single\": \"未読\",\n  \"Profile_Discussions_Denominator_Plural\": \"未読\",\n\n  \"Profile_News_Title\": \"ニュース\",\n  \"Profile_News_Denominator_Single\": \"件の新着\",\n  \"Profile_News_Denominator_Plural\": \"件の新着\",\n  \"Profile_News_Open\": \"開く\",\n  \"Profile_News_Loading_Title\": \"ニュースを読み込み中...\",\n  \"Profile_News_Author_Unknown\": \"不明な投稿者\",\n\n  \"Profile_Cards_Title\": \"QRコードとカード\",\n\n  \"Modal_Grades_Title\": \"成績の詳細\",\n  \"Modal_Grades_BestGrade\": \"グループ最高点\",\n\n  \"Grades_Details_Title\": \"詳細\",\n  \"Grades_NormalizedGrade_Title\": \"20点満点換算\",\n  \"Grades_NormalizedGrade_Description\": \"成績を20点満点に換算した値\",\n  \"Grades_HighestGrade_Title\": \"最高点\",\n  \"Grades_HighestGrade_Description\": \"グループ内の最高得点\",\n  \"Grades_LowestGrade_Title\": \"最低点\",\n  \"Grades_LowestGrade_Description\": \"グループ内の最低得点\",\n  \"Grades_Influence_Title\": \"影響度\",\n  \"Grades_Avg_Group_Title\": \"グループ平均\",\n  \"Grades_Coefficient\": \"係数\",\n  \"Grades_Avg_Group_Short\": \"グループ平均\",\n  \"Grades_Tab_Rank\": \"順位\",\n  \"Grades_Tab_Rank_Description\": \"グループ内の順位\",\n\n  \"News_Search_Placeholder\": \"ニュースを検索\",\n  \"News_Empty_Title\": \"ニュースなし\",\n  \"News_Empty_Description\": \"学校からのニュースはありません。\",\n  \"News_Search_NoResults\": \"ニュースが見つかりません\",\n  \"News_Search_NoResults_Description\": \"検索条件に一致するニュースはありません。\",\n\n  \"News_Theme_Papillon_Title\": \"Papillon\",\n  \"News_Theme_Papillon_Description\": \"優雅で落ち着いたテーマ\",\n\n  \"News_Theme_Reading_Title\": \"読書\",\n  \"News_Theme_Reading_Description\": \"読書に適したテーマ\",\n\n  \"Attendance_Hours_Missed\": \"欠席時間\",\n  \"Attendance_Hours_Unjustified\": \"無断欠席時間\",\n  \"Attendance_Missing\": \"欠席\",\n  \"Attendance_Delays\": \"遅刻\",\n  \"Attendance_NoReason\": \"理由なし\",\n  \"Attendance_NoEvent_Title\": \"記録なし\",\n  \"Attendance_NoEvent_Description\": \"この期間の欠席や遅刻はありません。\",\n\n  \"Settings_Account_Title\": \"マイアカウント\",\n  \"Settings_Account_Description\": \"アカウント情報\",\n  \"Settings_Services_Title\": \"連携アカウント\",\n  \"Settings_Services_Title_LastAccountUsed\": \"最後に使用したアカウント\",\n  \"Settings_Notifications_Title\": \"通知\",\n  \"Settings_Notifications_Description\": \"アラート、頻度など\",\n  \"Settings_Subjects_Title\": \"教科\",\n  \"Settings_Subjects_Description\": \"名前、色、フォントなど\",\n  \"Settings_Personalization_Title\": \"パーソナライズ\",\n  \"Settings_Personalization_Description\": \"テーマ、カラーなど\",\n  \"Settings_Cards_Title\": \"カード\",\n  \"Settings_Cards_Description\": \"食堂、アクセスなど\",\n  \"Settings_Accessibility_Title\": \"アクセシビリティ\",\n  \"Settings_Accessibility_Description\": \"表示、サウンドなど\",\n  \"Settings_MagicPlus_Title\": \"Magic+\",\n  \"Settings_MagicPlus_Description\": \"スマート機能\",\n  \"Settings_MagicPlus_Description_Card\": \"AI機能\",\n  \"Settings_MagicPlus_Enable\": \"Magic+を有効にする\",\n  \"Settings_MagicPlus_Description_Optimization\": \"課題の整理を自動的に最適化し、効率を高めます\",\n  \"Settings_MagicPlus_ExplanationLocal\": \"完全にローカルなモデルで、データがデバイス外に送信されることはありません\",\n  \"Settings_Donate_Title\": \"寄付する\",\n  \"Settings_Donate_Description\": \"プロジェクトを支援する\",\n  \"Settings_Telemetry_Title\": \"テレメトリとプライバシー\",\n  \"Settings_Telemetry_Description\": \"収集データの管理\",\n  \"Settings_About_Title\": \"アプリについて\",\n  \"Settings_About_Description\": \"バージョン情報\",\n  \"Settings_Logout_Title\": \"ログアウト\",\n  \"Settings_Logout_Description\": \"このアカウントをPapillonから削除\",\n  \"Settings_Language_Title\": \"言語\",\n  \"Settings_Language_Description\": \"言語を変更\",\n  \"Settings_Tabs_Title\": \"タブ\",\n  \"Settings_Tabs_Description\": \"メニューのタブを非表示にする\",\n\n  \"Settings_Personalization_Title_Card\": \"パーソナライズ\",\n  \"Settings_Personalization_Subtitle_Card\": \"テーマ、教科など\",\n  \"Settings_SubjectPersonalization_Title\": \"教科のカスタマイズ\",\n  \"Settings_Personalization_Accent\": \"アクセントカラー\",\n  \"Settings_Personalization_Accent_Description\": \"ここで選択した色は、Papillonのホーム画面に適用されます。\",\n  \"Settings_Personalization_Theme\": \"テーマ\",\n  \"Settings_Personalization_Icon_Title\": \"アイコンを変更\",\n  \"Settings_Personalization_Icon_Description\": \"アプリのアイコンをカスタマイズ\",\n  \"Settings_Personalization_Subject_Title\": \"教科のカスタマイズ\",\n  \"Settings_Personalization_Subject_Title_Card\": \"教科\",\n  \"Settings_Personalization_Subject_Description\": \"アイコン、色\",\n  \"Settings_About_Papillion_Behind\": \"Papillonの開発者\",\n  \"Settings_About_Papillion_Behind_Description\": \"Papillonは100%ボランティアの学生によって運営されています\",\n  \"Settings_About_Discord\": \"Discordサーバー\",\n  \"Settings_About_Discord_Description\": \"Discordサーバーに参加する\",\n  \"Settings_About_Crowdin\": \"Crowdinプロジェクト\",\n  \"Settings_About_Crowdin_Description\": \"Papillonの翻訳を助ける\",\n  \"Settings_About_Github\": \"GitHubプロジェクト\",\n  \"Settings_About_Github_Description\": \"GitHubでプロジェクトに貢献する\",\n  \"Settings_About_Issue\": \"バグを報告\",\n  \"Settings_About_Issue_Description\": \"発生したバグを報告する\",\n  \"Settings_About_Dependency_Version\": \"依存関係のバージョン\",\n\n  \"Alert_No_Technical\": \"技術的な情報はありません。\",\n  \"Alert_Auth_Error\": \"認証エラー\",\n  \"Alert_Auth_Bad_Creds\": \"入力された情報が正しくないか、保護者用アカウントでログインしようとしています。現在、保護者用アカウントはサポートされていません。\",\n  \"Alert_Not_Supported\": \"サポートされていないインスタンス\",\n  \"Alert_Security_Instance_HTTP\": \"セキュリティ上の理由から、HTTPを使用しているインスタンスは利用できません。管理者にインスタンスのアップデートを依頼してください。\",\n  \"Alert_NoDemo\": \"デモ用インスタンスでは利用できません。正式なインスタンスを使用してください。\",\n  \"Alert_Invalid_Instance\": \"PRONOTEインスタンスの情報を取得できません。URLが正しいか確認してください。\",\n  \"Alert_No_Pos\": \"位置情報を取得できません\",\n  \"Alert_Connexion_Fail\": \"接続できません\",\n\n  \"Feature_Limited\": \"限定機能\",\n  \"Feature_Soon\": \"近日公開予定！\",\n  \"Feature_Soon_Notification\": \"今後のアップデートでこの機能を提供できるよう取り組んでいます。\",\n  \"Feature_Add_Card\": \"プロフィールタブから新しいカードを追加してください\",\n\n  \"Webview_Wait\": \"お待ちください...\",\n\n  \"Profile_QRCards\": \"QRコードとカード\",\n  \"Profile_QRCards_Subtitle\": \"{{count}}枚のカード\",\n  \"Profile_Cards_Loading_History\": \"取引履歴を読み込み中\",\n  \"Profile_Cards_Loading_History_Description\": \"少々お待ちください...\",\n\n  \"Settings_Cards_Banner_Title\": \"カード\",\n  \"Settings_Cantineen_Subtitle_Card\": \"食堂、アクセス\",\n  \"Settings_Cards_Banner_Description\": \"食堂や交通機関のカードを追加して、Papillonからいつでもアクセスできるようにしましょう\",\n  \"Settings_Cards_None_Title\": \"カードなし\",\n  \"Settings_Cards_Add_Button\": \"追加\",\n\n  \"Settings_Cards_None_Description\": \"カードを追加して、食堂の残高確認やQRコードのスキャンを利用しましょう\",\n  \"Settings_Subjects_None_Title\": \"教科なし\",\n  \"Settings_Subjects_None_Description\": \"アプリの各タブを閲覧して、教科をカスタマイズできるようにしましょう。\",\n  \"Settings_Subjects_Reset_Title\": \"リセット\",\n  \"Settings_Subjects_Reset_Message\": \"すべての教科設定をリセットしてもよろしいですか？\",\n  \"Settings_Subjects_Reset_Button\": \"リセット\",\n\n  \"Settings_Donator\": \"寄付者\",\n  \"Settings_Donator_Description\": \"寄付者リストを見る\",\n  \"Settings_App_Version\": \"アプリのバージョン\",\n\n  \"Profile_Cards_Scan_Orientation\": \"QRコードを端末のスキャナーにかざしてください\",\n  \"Profile_Cards_No_Reservation\": \"予約なし\",\n  \"Profile_Cards_No_Available_Reservation\": \"本日は予約できないようです。\",\n  \"Profile_Cards_History\": \"履歴\",\n  \"Magic_Important\": \"重要かもしれません\",\n\n  \"OnBoarding_Step\": \"ステップ \",\n  \"OnBoarding_Step_Of\": \" / \",\n\n  \"Consent_Advanced_Title\": \"Papillonを支援したい\",\n  \"Consent_Advanced_Description\": \"アプリの使用状況に関する詳細な情報を収集します。\",\n  \"Consent_Required_Title\": \"最小限の情報のみ\",\n  \"Consent_Required_Description\": \"Papillonの使用有無、エラーの有無、利用サービスのみを把握します。\",\n  \"Consent_None_Title\": \"情報を送信しない\",\n  \"Consent_None_Description\": \"使用状況に関する情報は一切送信されません。\",\n  \"Consent_Title\": \"あなたとPapillon\",\n  \"Consent_Intro1\": \"Papillonの成長を助けるために、使用状況の一部を共有することができます。\",\n  \"Consent_PrivacyPolicy\": \"不明な点がある場合は、プライバシーポリシーをご確認ください\",\n  \"Consent_Refuse\": \"拒否する\",\n  \"Consent_Accept\": \"同意する\",\n  \"Consent_ChangeMind\": \"設定からいつでも変更可能です。\",\n  \"Consent_Arg1\": \"アプリの改善のみに使用されます\",\n  \"Consent_Arg2\": \"匿名であり、個人とは結びつきません\",\n  \"Consent_Arg3\": \"アカウント情報にはアクセスしません\",\n\n  \"Changelog_Title\": \"更新履歴\",\n\n  \"Tasks_Sorting_Methods_DueDate\": \"期限順\",\n  \"Tasks_Sorting_Methods_Subject\": \"教科順\",\n  \"Tasks_Sorting_Methods_Done\": \"未完了順\",\n  \"Tasks_ThisWeek\": \"今週\",\n\n  \"Task_Undone\": \"未完了\",\n  \"Task_Done\": \"完了\",\n\n  \"Modal_Wallpaper_Title\": \"壁紙をカスタマイズ\",\n  \"Modal_Profile_Title\": \"プロフィールをカスタマイズ\",\n\n  \"Modal_Task_Status\": \"課題の状態\",\n  \"Modal_Task_Description\": \"課題の内容\",\n  \"Modal_Task_Attachments\": \"添付ファイル\",\n\n  \"Today\": \"今日\",\n  \"Yesterday\": \"昨日\",\n  \"Tomorrow\": \"明日\"\n}"
  },
  {
    "path": "locales/ko.json",
    "content": "{\r\n  \"Global_Back\": \"뒤로\",\r\n  \"Global_DatePrefix\": \"\",\r\n\r\n  \"Tab_Home\": \"홈\",\r\n  \"Tab_Calendar\": \"수업\",\r\n  \"Tab_Tasks\": \"할 일\",\r\n  \"Tab_Grades\": \"성적\",\r\n  \"Tab_Profile\": \"프로필\",\r\n  \"Tab_Custom_Profile\": \"프로필 수정\",\r\n  \"Button_Change_ProfilePicture\": \"프로필 사진 변경\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"사진 찍기\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"라이브러리에서 선택\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"학교 정보 시스템(ENT)에서 가져오기\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"사진 삭제\",\r\n  \"Tab_Page\": \"페이지\",\r\n  \"Tab_Settings\": \"설정\",\r\n  \"Tab_News\": \"뉴스\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"당신의 학교 생활을 관리하는 앱\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"학교 앱을 연결하여 Papillon 인터페이스에서 성적, 수업, 숙제 등을 확인해 보세요!\",\r\n  \"ONBOARDING_START_BTN\": \"시작하기\",\r\n  \"ONBOARDING_HELP_BTN\": \"도움이 필요하신가요?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"대학 서비스\",\r\n  \"ONBOARDING_RESTAURANTS\": \"급식 서비스\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"학교 서비스를 선택하세요\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"급식 서비스를 선택하세요\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"대학 서비스를 선택하세요\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"어떻게 로그인하시겠어요?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"내 위치 사용\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"도시 검색\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"QR 코드가 있습니다\",\r\n  \"ONBOARDING_METHOD_LINK\": \"접속 URL이 있습니다\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"학교를 선택하세요\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"도시 이름을 입력하고 학교를 선택하세요\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"평소처럼 로그인하세요\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"계정에 로그인하세요\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"계정에 할당된 호스트를 선택하세요\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"PRONOTE에서 생성한 4자리 코드를 입력하세요\",\r\n  \"ONBOARDING_LOGIN_TO\": \"다음 서비스에 연결 중:\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"학교의 QR 코드를 스캔하여 로그인하세요.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR 코드 확인 중\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"잠시만 기다려 주세요...\",\r\n  \"ONBOARDING_URL\": \"학교의 URL 주소를 입력하세요\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"PRONOTE 인스턴스 URL\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"마지막 단계\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"테마\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"색상 선택\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"PRONOTE PIN 코드를 입력하세요\",\r\n  \"Onboarding_Load_Webview_Description\": \"학교 사이트를 불러오고 있습니다\",\r\n  \"INPUT_PIN\": \"PIN 코드\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"인스턴스 검색...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"로그인 중...\",\r\n\r\n  \"WAITING\": \"대기 중\",\r\n  \"IZLY_SMS_SEND\": \"로그인 링크가 전송되었습니다. 링크를 클릭하여 단계를 따르세요.\",\r\n  \"STEP\": \"단계\",\r\n  \"STEP_OUTOF\": \"/\",\r\n  \"INPUT_USERNAME\": \"사용자 이름\",\r\n  \"INPUT_MAIL\": \"이메일 주소\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"이메일 또는 사용자 이름\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"전화번호 또는 이메일\",\r\n  \"INPUT_PASSWORD\": \"비밀번호\",\r\n  \"INPUT_PASSWORD_CODE\": \"액세스 코드\",\r\n  \"INPUT_ETABID\": \"학교 식별 번호\",\r\n  \"LOGIN_BTN\": \"로그인\",\r\n  \"CONFIRM_BTN\": \"확인\",\r\n  \"CANCEL_BTN\": \"취소\",\r\n\r\n  \"Tab_New_Event\": \"새 이벤트\",\r\n\r\n  \"Tab_Calendar_Icals\": \"iCal 관리\",\r\n  \"Tab_Calendar_Icals_Description\": \"iCal URL 관리\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"iCal URL 추가\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"{{title}} 관리\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"캘린더와 동기화할 iCal URL을 추가하거나 삭제합니다.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"제목 없음\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"추가할 iCal URL의 이름을 입력하세요.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"추가된 iCal URL이 없습니다\",\r\n\r\n  \"TabUnderConstruction_Title\": \"이 탭은 현재 제작 중입니다.\",\r\n  \"TabUnderConstruction_Details\": \"나중에 다시 확인해 주세요.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"개발자 모드\",\r\n  \"TabDevModeNotice_Details\": \"개발자를 위한 테스트 환경입니다.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"기술 세부 정보\",\r\n\r\n  \"Online_Course\": \"온라인\",\r\n  \"Evaluated_Course\": \"평가\",\r\n  \"Edited_Course\": \"수업 변경됨\",\r\n  \"Canceled_Course\": \"수업 취소됨\",\r\n  \"No_Course_Room\": \"강의실 알 수 없음\",\r\n  \"Event_DeleteEvent\": \"이벤트 삭제\",\r\n  \"Event_Confirm_DeleteEvent\": \"이 이벤트를 삭제하시겠습니까?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"점심 시간\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"맛있게 드세요!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"냠냠!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"오전 휴식\",\r\n  \"Course_Separator_Morning_Alt_1\": \"잠깐 쉬어 가요!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"아침 식사\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"오후 휴식\",\r\n  \"Course_Separator_Evening_Alt_1\": \"잠시 휴식!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"간식 시간!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"밤 휴식\",\r\n  \"Course_Separator_Night_Alt_1\": \"꿈나라로!\",\r\n  \"Course_Separator_Night_Alt_2\": \"밤이 깊었네요!\",\r\n\r\n  \"Context_Delete\": \"삭제\",\r\n  \"Context_Cancel\": \"취소\",\r\n  \"Context_Edit\": \"수정\",\r\n  \"Context_Add\": \"추가\",\r\n\r\n  \"Form_Title\": \"제목\",\r\n  \"Form_Location\": \"장소\",\r\n  \"Form_Organizer\": \"주최자\",\r\n  \"Form_Start\": \"시작\",\r\n  \"Form_End\": \"종료\",\r\n\r\n  \"Confirm_DeleteEvent\": \"이 이벤트를 삭제하시겠습니까?\",\r\n\r\n  \"Home_Welcome_Name\": \"안녕하세요, {{name}}님 {{emoji}}\",\r\n  \"Home_Display_More\": \"더 보기\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"사용 가능\",\r\n  \"Home_Chats_Plurial\": \"대화\",\r\n  \"Home_Chats_Singular\": \"대화\",\r\n  \"Home_See_All_Tasks\": \"모든 할 일 보기\",\r\n  \"Home_Welcome\": \"안녕하세요!\",\r\n  \"Home_Planned_None\": \"오늘은 남은 수업이 없습니다\",\r\n  \"Home_Planned_One\": \"오늘은 수업이 1개 남았습니다\",\r\n  \"Home_Planned_Number\": \"오늘은 수업이 {{number}}개 남았습니다\",\r\n\r\n  \"Home_Widget_NextCourses\": \"다음 수업\",\r\n  \"Home_Widget_NewGrades\": \"새 성적\",\r\n  \"Home_Widget_NewHomeworks\": \"할 일\",\r\n\r\n  \"Home_Widget_NoCourses\": \"예정된 수업 없음\",\r\n  \"Home_Widget_NoCourses_Description\": \"오늘 예정된 수업이 없습니다.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"카드\",\r\n  \"Home_Cards_Button_Description_None\": \"카드 없음\",\r\n  \"Home_Cards_Button_Description_Singular\": \"카드 1장\",\r\n  \"Home_Cards_Button_Description_Number\": \"카드 {{number}}장\",\r\n\r\n  \"Home_Chats_Button_Title\": \"메시지\",\r\n  \"Home_Chats_Button_Description_None\": \"메시지 없음\",\r\n  \"Home_Chats_Button_Description_Singular\": \"메시지 1개\",\r\n  \"Home_Chats_Button_Description_Number\": \"메시지 {{number}}개\",\r\n\r\n  \"Home_Attendance_Title\": \"출결\",\r\n  \"Home_Attendance_Button_Description_None\": \"결석 없음\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"결석 1회\",\r\n  \"Home_Attendance_Button_Description_Number\": \"결석 {{number}}회\",\r\n\r\n  \"Home_Menu_Button_Title\": \"메뉴\",\r\n  \"Home_Menu_Button_Description\": \"오늘의 식단\",\r\n\r\n  \"Tab_Calendar_Empty\": \"이벤트를 찾을 수 없음\",\r\n  \"Tab_Calendar_Empty_Description\": \"시작하려면 이벤트를 추가하거나 캘린더를 동기화하세요.\",\r\n\r\n  \"Modal_Course_Title\": \"내 수업\",\r\n  \"Modal_Course_StartsIn\": \"시작까지\",\r\n  \"Modal_Course_StartedAgo\": \"종료됨:\",\r\n  \"Modal_Course_Ongoing\": \"진행 중:\",\r\n  \"Modal_Course_Group\": \"그룹\",\r\n  \"Modal_Course_Group_Full\": \"반/클래스\",\r\n\r\n  \"Modal_Course_Details\": \"수업 세부 정보\",\r\n  \"Modal_Course_Teacher\": \"선생님\",\r\n  \"Modal_Course_Room\": \"강의실\",\r\n  \"Modal_Course_Duration\": \"수업 시간\",\r\n\r\n  \"Modal_Course_Time\": \"수업 시간 정보\",\r\n  \"Modal_Course_Start\": \"시작\",\r\n  \"Modal_Course_End\": \"종료\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"할 일 검색\",\r\n  \"Tasks_LeftHomeworks_Title\": \"남은 할 일\",\r\n  \"Tasks_LeftHomeworks_Time\": \"이번 주\",\r\n  \"Tasks_Done_AllTasks\": \"모든 할 일을\",\r\n  \"Tasks_Done_CompletedTasks\": \"완료했습니다\",\r\n  \"Tasks_Nav_Left\": \"할 일이 {{count}}개 더 남았습니다\",\r\n  \"Tasks_Nav_One\": \"할 일이 1개 더 남았습니다\",\r\n  \"Tasks_Nav_Completed\": \"모두 완료했습니다!\",\r\n  \"Tasks_Week\": \"주\",\r\n  \"Tasks_NoTasks_Title\": \"할 일 없음\",\r\n  \"Tasks_NoTasks_Description\": \"이번 주에 예정된 할 일이 없습니다. 푹 쉬세요!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"{{week}}주차\",\r\n  \"Tasks_NoTasks_Nav\": \"할 일 없음\",\r\n  \"Task_Start\": \"할 일\",\r\n  \"Task_Complete\": \"완료\",\r\n  \"Task_Sorting_Title\": \"정렬 기준\",\r\n  \"Task_OnlyShowUndone\": \"완료된 할 일\",\r\n  \"Task_Show_Title\": \"표시\",\r\n  \"Settings_General\": \"일반\",\r\n\r\n  \"Latest_Grades\": \"새 성적\",\r\n  \"Grades_Search_Placeholder\": \"성적, 과목 검색\",\r\n\r\n  \"Grades_Avg_Methods\": \"계산 방법\",\r\n  \"Grades_Avg_All_Title\": \"전체 평균\",\r\n  \"Grades_Avg_All_Short\": \"전체 평균\",\r\n  \"Grades_Avg_All_Pond\": \"가중 평균\",\r\n  \"Grades_Avg_All_Pond_Short\": \"가중 평균\",\r\n  \"Grades_Avg_All_Pond_Description\": \"모든 성적의 가중 평균을 계산합니다\",\r\n  \"Grades_Avg_Subject_Title\": \"과목별 평균\",\r\n  \"Grades_Avg_Subject_Short\": \"과목 평균\",\r\n  \"Grades_Avg_Subject_Description\": \"과목별 평균의 가중 평균을 계산합니다\",\r\n  \"Grades_Avg_Median_Title\": \"중앙값\",\r\n  \"Grades_Avg_Median_Short\": \"중앙값\",\r\n\r\n  \"Grades_Avg_More\": \"더 알아보기\",\r\n  \"Grades_Avg_KnowMore\": \"더 알아보기\",\r\n  \"Grades_Avg_KnowMore_Description\": \"전체 평균 계산 방법 이해하기\",\r\n\r\n  \"Grades_SubjectInfo\": \"과목 정보\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"성적 {{number}}개\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"학생 평균\",\r\n  \"SubjectInfo_Stats_Header\": \"통계\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"반 평균\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"반 전체 평균\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"최고 평균\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"그룹 내 최고 평균\",\r\n  \"SubjectInfo_MinAverage_Label\": \"최저 평균\",\r\n  \"SubjectInfo_MinAverage_Description\": \"그룹 내 최저 평균\",\r\n\r\n  \"Grades_Semester\": \"학기\",\r\n  \"Grades_Trimester\": \"분기\",\r\n  \"Grades_OutPeriod\": \"기간 외\",\r\n  \"Grades_Year\": \"학년도\",\r\n  \"Grades_MockExamBac\": \"모의 바칼로레아\",\r\n  \"Grades_MockExamBrevet\": \"모의 브르베\",\r\n\r\n  \"Grades_Method_AllGrades\": \"모든 과목\",\r\n  \"Grades_Method_Weighted\": \"가중치\",\r\n\r\n  \"Grades_Sort\": \"정렬\",\r\n  \"Grades_Sorting_Alphabetical\": \"가나다순\",\r\n  \"Grades_Sorting_Averages\": \"평균순\",\r\n  \"Grades_Sorting_Date\": \"날짜순\",\r\n\r\n  \"Grades_Menu_SortBy\": \"정렬 기준:\",\r\n  \"Grades_Menu_AverageBy\": \"평균 기준:\",\r\n  \"NoAverage\": \"평균 없음\",\r\n\r\n  \"Grades_Empty_Title\": \"성적 없음\",\r\n  \"Grades_Empty_Description\": \"이 기간에 등록된 성적이 없습니다.\",\r\n\r\n  \"Grade_NoDescription\": \"{{subject}} 과제\",\r\n\r\n  \"Grades_Tab_Subjects\": \"과목별\",\r\n  \"Grades_Tab_Latest\": \"최신 성적\",\r\n\r\n  \"Profile_Attendance_Title\": \"출결 상황\",\r\n  \"Profile_Attendance_Denominator_Single\": \"결석\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"결석\",\r\n\r\n  \"Profile_Discussions_Title\": \"메시지함\",\r\n  \"Profile_Discussions_Denominator_Single\": \"안 읽음\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"안 읽음\",\r\n\r\n  \"Profile_News_Title\": \"뉴스\",\r\n  \"Profile_News_Denominator_Single\": \"새 뉴스\",\r\n  \"Profile_News_Denominator_Plural\": \"새 뉴스\",\r\n  \"Profile_News_Open\": \"열기\",\r\n  \"Profile_News_Loading_Title\": \"뉴스 불러오는 중...\",\r\n  \"Profile_News_Author_Unknown\": \"작성자 알 수 없음\",\r\n\r\n  \"Profile_Cards_Title\": \"QR 코드 및 카드\",\r\n\r\n  \"Modal_Grades_Title\": \"성적 상세 정보\",\r\n  \"Modal_Grades_BestGrade\": \"그룹 내 최고점\",\r\n\r\n  \"Grades_Details_Title\": \"상세 정보\",\r\n  \"Grades_NormalizedGrade_Title\": \"20점 만점 환산\",\r\n  \"Grades_NormalizedGrade_Description\": \"성적을 20점 만점 기준으로 변환한 값\",\r\n  \"Grades_HighestGrade_Title\": \"최고 점수\",\r\n  \"Grades_HighestGrade_Description\": \"그룹 내 최고 점수\",\r\n  \"Grades_LowestGrade_Title\": \"최저 점수\",\r\n  \"Grades_LowestGrade_Description\": \"그룹 내 최저 점수\",\r\n  \"Grades_Influence_Title\": \"영향력\",\r\n  \"Grades_Avg_Group_Title\": \"그룹 평균\",\r\n  \"Grades_Coefficient\": \"계수\",\r\n  \"Grades_Avg_Group_Short\": \"그룹 평균\",\r\n  \"Grades_Tab_Rank\": \"순위\",\r\n  \"Grades_Tab_Rank_Description\": \"그룹 내 순위\",\r\n\r\n  \"News_Search_Placeholder\": \"뉴스 검색\",\r\n  \"News_Empty_Title\": \"뉴스 없음\",\r\n  \"News_Empty_Description\": \"학교에서 찾은 뉴스가 없습니다.\",\r\n  \"News_Search_NoResults\": \"결과 없음\",\r\n  \"News_Search_NoResults_Description\": \"검색어와 일치하는 뉴스가 없습니다.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"부드럽고 우아한 테마\",\r\n\r\n  \"News_Theme_Reading_Title\": \"읽기\",\r\n  \"News_Theme_Reading_Description\": \"읽기에 최적화된 테마\",\r\n\r\n  \"Attendance_Hours_Missed\": \"결석 시간\",\r\n  \"Attendance_Hours_Unjustified\": \"무단 결석 시간\",\r\n  \"Attendance_Missing\": \"결석\",\r\n  \"Attendance_Delays\": \"지각\",\r\n  \"Attendance_NoReason\": \"사유 없음\",\r\n  \"Attendance_NoEvent_Title\": \"내역 없음\",\r\n  \"Attendance_NoEvent_Description\": \"이 기간에 등록된 결석이나 지각 내역이 없습니다.\",\r\n\r\n  \"Settings_Account_Title\": \"내 계정\",\r\n  \"Settings_Account_Description\": \"계정 정보 관리\",\r\n  \"Settings_Services_Title\": \"연결된 계정\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"마지막으로 사용한 계정\",\r\n  \"Settings_Notifications_Title\": \"알림\",\r\n  \"Settings_Notifications_Description\": \"알림 설정, 빈도 등\",\r\n  \"Settings_Subjects_Title\": \"과목\",\r\n  \"Settings_Subjects_Description\": \"이름, 색상, 글꼴 등\",\r\n  \"Settings_Personalization_Title\": \"개인화\",\r\n  \"Settings_Personalization_Description\": \"테마, 색상 등\",\r\n  \"Settings_Cards_Title\": \"카드\",\r\n  \"Settings_Cards_Description\": \"급식, 출입 등\",\r\n  \"Settings_Accessibility_Title\": \"접근성\",\r\n  \"Settings_Accessibility_Description\": \"화면 표시, 소리 등\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"스마트 기능\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI 기능\",\r\n  \"Settings_MagicPlus_Enable\": \"Magic+ 활성화\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"생산성 향상을 위해 할 일 목록을 자동으로 최적화합니다\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"완전 로컬 모델로, 데이터가 기기 외부로 전송되지 않습니다\",\r\n  \"Settings_Donate_Title\": \"후원하기\",\r\n  \"Settings_Donate_Description\": \"프로젝트 지원하기\",\r\n  \"Settings_Telemetry_Title\": \"텔레메트리 및 개인정보\",\r\n  \"Settings_Telemetry_Description\": \"수집된 데이터 관리\",\r\n  \"Settings_About_Title\": \"정보\",\r\n  \"Settings_About_Description\": \"버전 정보\",\r\n  \"Settings_Logout_Title\": \"로그아웃\",\r\n  \"Settings_Logout_Description\": \"Papillon에서 이 계정 삭제\",\r\n  \"Settings_Language_Title\": \"언어\",\r\n  \"Settings_Language_Description\": \"언어 변경\",\r\n  \"Settings_Tabs_Title\": \"탭\",\r\n  \"Settings_Tabs_Description\": \"메뉴에서 탭 숨기기\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"개인화\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"테마, 과목 등\",\r\n  \"Settings_SubjectPersonalization_Title\": \"과목 개인화\",\r\n  \"Settings_Personalization_Accent\": \"강조 색상\",\r\n  \"Settings_Personalization_Accent_Description\": \"여기서 선택한 색상이 Papillon 홈 화면에 적용됩니다.\",\r\n  \"Settings_Personalization_Theme\": \"테마\",\r\n  \"Settings_Personalization_Icon_Title\": \"아이콘 변경\",\r\n  \"Settings_Personalization_Icon_Description\": \"앱 아이콘 개인화\",\r\n  \"Settings_Personalization_Subject_Title\": \"과목 개인화\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"과목\",\r\n  \"Settings_Personalization_Subject_Description\": \"아이콘, 색상\",\r\n  \"Settings_About_Papillion_Behind\": \"Papillon을 만드는 사람들\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon은 100% 자원봉사 학생들에 의해 운영됩니다\",\r\n  \"Settings_About_Discord\": \"Discord 서버\",\r\n  \"Settings_About_Discord_Description\": \"Discord 서버 참여하기\",\r\n  \"Settings_About_Crowdin\": \"Crowdin 프로젝트\",\r\n  \"Settings_About_Crowdin_Description\": \"Papillon 번역 돕기\",\r\n  \"Settings_About_Github\": \"GitHub 프로젝트\",\r\n  \"Settings_About_Github_Description\": \"GitHub 프로젝트에 기여하기\",\r\n  \"Settings_About_Issue\": \"버그 제보\",\r\n  \"Settings_About_Issue_Description\": \"발견한 버그 제보하기\",\r\n  \"Settings_About_Dependency_Version\": \"라이브러리 버전\",\r\n\r\n  \"Alert_No_Technical\": \"기술 정보가 없습니다.\",\r\n  \"Alert_Auth_Error\": \"인증 오류\",\r\n  \"Alert_Auth_Bad_Creds\": \"입력한 정보가 올바르지 않거나 학부모 계정으로 로그인을 시도 중입니다. 현재 Papillon에서는 학부모 계정을 지원하지 않습니다.\",\r\n  \"Alert_Not_Supported\": \"지원되지 않는 인스턴스\",\r\n  \"Alert_Security_Instance_HTTP\": \"보안상의 이유로 Papillon은 HTTP 프로토콜을 사용하는 인스턴스를 허용하지 않습니다. 보안을 위해 학교 관리자에게 업데이트를 요청하는 것을 권장합니다.\",\r\n  \"Alert_NoDemo\": \"Papillon은 데모 인스턴스에서 작동하지 않습니다. 실제 학교 인스턴스를 사용해 주세요.\",\r\n  \"Alert_Invalid_Instance\": \"PRONOTE 인스턴스 정보를 가져올 수 없습니다. 유효한 주소인지 확인해 주세요.\",\r\n  \"Alert_No_Pos\": \"위치 정보를 가져올 수 없습니다\",\r\n  \"Alert_Connexion_Fail\": \"연결 실패\",\r\n\r\n  \"Feature_Limited\": \"제한된 기능\",\r\n  \"Feature_Soon\": \"곧 출시됩니다!\",\r\n  \"Feature_Soon_Notification\": \"추후 업데이트에서 이 기능을 제공하기 위해 노력하고 있습니다.\",\r\n  \"Feature_Add_Card\": \"내비게이션 바의 프로필 탭에서 새 카드를 추가하세요\",\r\n\r\n  \"Webview_Wait\": \"잠시만 기다려 주세요...\",\r\n\r\n  \"Profile_QRCards\": \"QR 코드 및 카드\",\r\n  \"Profile_QRCards_Subtitle\": \"카드 {{count}}장\",\r\n  \"Profile_Cards_Loading_History\": \"거래 내역 불러오는 중\",\r\n  \"Profile_Cards_Loading_History_Description\": \"시간이 조금 걸릴 수 있습니다...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"카드\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"급식, 출입\",\r\n  \"Settings_Cards_Banner_Description\": \"급식 및 교통 카드를 추가하여 Papillon에서 언제든 확인하세요\",\r\n  \"Settings_Cards_None_Title\": \"카드 없음\",\r\n  \"Settings_Cards_Add_Button\": \"추가\",\r\n\r\n  \"Settings_Cards_None_Description\": \"카드를 추가하여 급식 잔액 확인, QR 코드 스캔 등을 이용해 보세요\",\r\n  \"Settings_Subjects_None_Title\": \"과목 없음\",\r\n  \"Settings_Subjects_None_Description\": \"과목을 개인화하려면 앱의 각 탭을 확인해 보세요.\",\r\n  \"Settings_Subjects_Reset_Title\": \"초기화\",\r\n  \"Settings_Subjects_Reset_Message\": \"정말로 모든 과목 설정을 초기화하시겠습니까?\",\r\n  \"Settings_Subjects_Reset_Button\": \"초기화\",\r\n\r\n  \"Settings_Donator\": \"후원자\",\r\n  \"Settings_Donator_Description\": \"후원자 명단 보기\",\r\n  \"Settings_App_Version\": \"앱 버전\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"QR 코드를 단말기 스캐너에 갖다 대세요\",\r\n  \"Profile_Cards_No_Reservation\": \"예약 없음\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"현재 예약할 수 있는 내역이 없습니다.\",\r\n  \"Profile_Cards_History\": \"내역\",\r\n  \"Magic_Important\": \"중요할 수도 있음\",\r\n\r\n  \"OnBoarding_Step\": \"단계 \",\r\n  \"OnBoarding_Step_Of\": \"/\",\r\n\r\n  \"Consent_Advanced_Title\": \"Papillon을 돕고 싶어요\",\r\n  \"Consent_Advanced_Description\": \"앱 사용에 대한 상세 정보를 수집합니다.\",\r\n  \"Consent_Required_Title\": \"필수 정보만\",\r\n  \"Consent_Required_Description\": \"앱 사용 여부, 오류 발생 여부, 사용 서비스 정도만 파악합니다.\",\r\n  \"Consent_None_Title\": \"수집하지 않음\",\r\n  \"Consent_None_Description\": \"당신의 사용 여부를 전혀 알 수 없게 됩니다.\",\r\n  \"Consent_Title\": \"나와 Papillon\",\r\n  \"Consent_Intro1\": \"Papillon의 성장을 돕기 위해 일부 사용 정보를 공유할 수 있습니다.\",\r\n  \"Consent_PrivacyPolicy\": \"궁금한 점은 개인정보 처리방침을 확인해 주세요\",\r\n  \"Consent_Refuse\": \"거절\",\r\n  \"Consent_Accept\": \"수락\",\r\n  \"Consent_ChangeMind\": \"앱 설정에서 언제든지 변경할 수 있습니다.\",\r\n  \"Consent_Arg1\": \"앱 개선 목적으로만 사용됩니다\",\r\n  \"Consent_Arg2\": \"익명이며 개인 정보와 연결되지 않습니다\",\r\n  \"Consent_Arg3\": \"귀하의 계정에 접근하지 않습니다\",\r\n\r\n  \"Changelog_Title\": \"업데이트 소식\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"마감일순\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"과목순\",\r\n  \"Tasks_Sorting_Methods_Done\": \"미완료순\",\r\n  \"Tasks_ThisWeek\": \"이번 주\",\r\n\r\n  \"Task_Undone\": \"미완료\",\r\n  \"Task_Done\": \"완료\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"배경화면 개인화\",\r\n  \"Modal_Profile_Title\": \"프로필 개인화\",\r\n\r\n  \"Modal_Task_Status\": \"과제 상태\",\r\n  \"Modal_Task_Description\": \"과제 설명\",\r\n  \"Modal_Task_Attachments\": \"첨부 파일\",\r\n\r\n  \"Today\": \"오늘\",\r\n  \"Yesterday\": \"어제\",\r\n  \"Tomorrow\": \"내일\"\r\n}"
  },
  {
    "path": "locales/ms.json",
    "content": "{\r\n  \"Global_Back\": \"Kembali\",\r\n  \"Global_DatePrefix\": \"pada\",\r\n\r\n  \"Tab_Home\": \"Utama\",\r\n  \"Tab_Calendar\": \"Kursus\",\r\n  \"Tab_Tasks\": \"Tugasan\",\r\n  \"Tab_Grades\": \"Gred\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Ubah profil\",\r\n  \"Button_Change_ProfilePicture\": \"Tukar gambar profil\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Ambil gambar\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Daripada galeri\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Ambil daripada portal sekolah (ENT)\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Padam gambar\",\r\n  \"Tab_Page\": \"Halaman\",\r\n  \"Tab_Settings\": \"Tetapan\",\r\n  \"Tab_News\": \"Berita\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Aplikasi untuk menguruskan kehidupan sekolahmu\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Sambungkan aplikasi sekolahmu untuk mengakses gred, kursus, tugasan dan banyak lagi dalam antara muka Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Mula\",\r\n  \"ONBOARDING_HELP_BTN\": \"Perlu bantuan?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Perkhidmatan universiti\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Perkhidmatan kantin\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Pilih perkhidmatan sekolahmu\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Pilih perkhidmatan kantin\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Pilih perkhidmatan universiti\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Bagaimanakah kamu mahu log masuk?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Gunakan lokasi saya\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Cari bandar\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Saya mempunyai kod QR\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Saya mempunyai URL log masuk\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Pilih institusi kamu\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Masukkan nama bandar dan pilih institusi kamu\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Log masuk seperti biasa\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Log masuk ke akaun kamu\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Pilih hos yang ditetapkan untuk akaun\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Masukkan kod 4 digit yang baru kamu cipta di PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Log masuk ke\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Imbas kod QR sekolahmu untuk menyambung.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Pengesahan kod QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Ini mungkin mengambil masa seketika...\",\r\n  \"ONBOARDING_URL\": \"Masukkan alamat URL sekolahmu\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL bagi instans PRONOTE kamu\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Sebelum selesai\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Pilih satu\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"warna tema\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Masukkan Kod PIN PRONOTE kamu\",\r\n  \"Onboarding_Load_Webview_Description\": \"Kami sedang memuatkan laman web sekolahmu\",\r\n  \"INPUT_PIN\": \"Kod PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Cari instans...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Sedang log masuk...\",\r\n\r\n  \"WAITING\": \"Menunggu\",\r\n  \"IZLY_SMS_SEND\": \"Kamu baru sahaja menerima pautan untuk log masuk, klik pada pautan tersebut dan ikuti langkah-langkahnya.\",\r\n  \"STEP\": \"Langkah\",\r\n  \"STEP_OUTOF\": \"daripada\",\r\n  \"INPUT_USERNAME\": \"Nama pengguna\",\r\n  \"INPUT_MAIL\": \"Alamat e-mel\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Alamat e-mel atau nama pengguna\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Nombor telefon atau e-mel\",\r\n  \"INPUT_PASSWORD\": \"Kata laluan\",\r\n  \"INPUT_PASSWORD_CODE\": \"Kod akses\",\r\n  \"INPUT_ETABID\": \"ID sekolah kamu\",\r\n  \"LOGIN_BTN\": \"Log masuk\",\r\n  \"CONFIRM_BTN\": \"Sahkan\",\r\n  \"CANCEL_BTN\": \"Batal\",\r\n\r\n  \"Tab_New_Event\": \"Acara baharu\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Pengurusan iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Uruskan URL iCal kamu\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Tambah URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Urus {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Tambah atau padam URL iCal untuk disinkronkan dengan kalendar kamu.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Tajuk hilang\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Berikan nama pada URL iCal ini untuk menambahnya.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Tiada URL iCal ditambah\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Tab ini sedang dalam pembinaan.\",\r\n  \"TabUnderConstruction_Details\": \"Sila kembali nanti untuk kemas kini.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Mod Pembangunan\",\r\n  \"TabDevModeNotice_Details\": \"Persekitaran ujian lengkap untuk pembangun.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Butiran teknikal\",\r\n\r\n  \"Online_Course\": \"Atas talian\",\r\n  \"Evaluated_Course\": \"Penilaian\",\r\n  \"Edited_Course\": \"Kursus diubah\",\r\n  \"Canceled_Course\": \"Kursus dibatalkan\",\r\n  \"No_Course_Room\": \"Bilik tidak diketahui\",\r\n  \"Event_DeleteEvent\": \"Padam acara\",\r\n  \"Event_Confirm_DeleteEvent\": \"Adakah kamu pasti mahu memadam acara ini?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Waktu makan tengah hari\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Selamat menjamu selera!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Sedapnya!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Waktu rehat pagi\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Masa untuk tidur!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Sarapan pagi\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Waktu rehat petang\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Perlu berehat sebentar!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Waktu minum petang!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Waktu rehat malam\",\r\n  \"Course_Separator_Night_Alt_1\": \"Masa untuk tidur!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Hari sudah malam!\",\r\n\r\n  \"Context_Delete\": \"Padam\",\r\n  \"Context_Cancel\": \"Batal\",\r\n  \"Context_Edit\": \"Ubah\",\r\n  \"Context_Add\": \"Tambah\",\r\n\r\n  \"Form_Title\": \"Tajuk\",\r\n  \"Form_Location\": \"Lokasi\",\r\n  \"Form_Organizer\": \"Penganjur\",\r\n  \"Form_Start\": \"Mula\",\r\n  \"Form_End\": \"Tamat\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Adakah kamu pasti mahu memadam acara ini?\",\r\n\r\n  \"Home_Welcome_Name\": \"Helo, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Tunjukkan lagi\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"tersedia\",\r\n  \"Home_Chats_Plurial\": \"perbincangan\",\r\n  \"Home_Chats_Singular\": \"perbincangan\",\r\n  \"Home_See_All_Tasks\": \"Lihat semua tugasan\",\r\n  \"Home_Welcome\": \"Helo!\",\r\n  \"Home_Planned_None\": \"Kamu tiada baki kursus untuk hari ini\",\r\n  \"Home_Planned_One\": \"Kamu mempunyai satu baki kursus hari ini\",\r\n  \"Home_Planned_Number\": \"Kamu mempunyai {{number}} baki kursus hari ini\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Kursus seterusnya\",\r\n  \"Home_Widget_NewGrades\": \"Gred baharu\",\r\n  \"Home_Widget_NewHomeworks\": \"Tugasan perlu dilakukan\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Tiada kursus akan datang\",\r\n  \"Home_Widget_NoCourses_Description\": \"Tiada kursus dirancang untuk hari ini.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kad\",\r\n  \"Home_Cards_Button_Description_None\": \"Tiada kad\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Satu kad\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kad\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Mesej\",\r\n  \"Home_Chats_Button_Description_None\": \"Tiada mesej\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Satu mesej\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} mesej\",\r\n\r\n  \"Home_Attendance_Title\": \"Kehadiran\",\r\n  \"Home_Attendance_Button_Description_None\": \"Tiada ketidakhadiran\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Satu ketidakhadiran\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} ketidakhadiran\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Menu\",\r\n  \"Home_Menu_Button_Description\": \"Menu hari ini\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Tiada acara ditemui\",\r\n  \"Tab_Calendar_Empty_Description\": \"Tambah acara atau sinkronkan kalendar kamu untuk bermula.\",\r\n\r\n  \"Modal_Course_Title\": \"Kursus saya\",\r\n  \"Modal_Course_StartsIn\": \"Bermula dalam\",\r\n  \"Modal_Course_StartedAgo\": \"Tamat sejak\",\r\n  \"Modal_Course_Ongoing\": \"Sedang berjalan selama\",\r\n  \"Modal_Course_Group\": \"Kumpulan\",\r\n  \"Modal_Course_Group_Full\": \"Kelas\",\r\n\r\n  \"Modal_Course_Details\": \"Butiran kursus\",\r\n  \"Modal_Course_Teacher\": \"Guru\",\r\n  \"Modal_Course_Room\": \"Bilik\",\r\n  \"Modal_Course_Duration\": \"Tempoh\",\r\n\r\n  \"Modal_Course_Time\": \"Waktu kursus\",\r\n  \"Modal_Course_Start\": \"Mula\",\r\n  \"Modal_Course_End\": \"Tamat\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Cari tugasan\",\r\n  \"Tasks_LeftHomeworks_Title\": \"tugasan berbaki\",\r\n  \"Tasks_LeftHomeworks_Time\": \"minggu ini\",\r\n  \"Tasks_Done_AllTasks\": \"Semua tugasan\",\r\n  \"Tasks_Done_CompletedTasks\": \"telah disiapkan\",\r\n  \"Tasks_Nav_Left\": \"Lagi {{count}} tugasan perlu dilakukan\",\r\n  \"Tasks_Nav_One\": \"Hanya satu tugasan lagi\",\r\n  \"Tasks_Nav_Completed\": \"Semua telah selesai!\",\r\n  \"Tasks_Week\": \"Minggu\",\r\n  \"Tasks_NoTasks_Title\": \"Tiada tugasan\",\r\n  \"Tasks_NoTasks_Description\": \"Tiada tugasan dirancang untuk minggu ini. Nikmatilah waktu rehat kamu!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"untuk minggu {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Tiada tugasan\",\r\n  \"Task_Start\": \"Perlu dilakukan\",\r\n  \"Task_Complete\": \"Selesai\",\r\n  \"Task_Sorting_Title\": \"Isih mengikut\",\r\n  \"Task_OnlyShowUndone\": \"Tugasan selesai\",\r\n  \"Task_Show_Title\": \"Tunjukkan\",\r\n  \"Settings_General\": \"Umum\",\r\n\r\n  \"Latest_Grades\": \"Gred baharu\",\r\n  \"Grades_Search_Placeholder\": \"Cari gred, mata pelajaran\",\r\n\r\n  \"Grades_Avg_Methods\": \"Kaedah pengiraan\",\r\n  \"Grades_Avg_All_Title\": \"Purata keseluruhan\",\r\n  \"Grades_Avg_All_Short\": \"Purata kes.\",\r\n  \"Grades_Avg_All_Pond\": \"Purata wajar\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Purata wajar\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Mengira purata wajar bagi semua gred\",\r\n  \"Grades_Avg_Subject_Title\": \"Purata mata pelajaran\",\r\n  \"Grades_Avg_Subject_Short\": \"Purata subjek\",\r\n  \"Grades_Avg_Subject_Description\": \"Mengira purata wajar bagi purata mata pelajaran\",\r\n  \"Grades_Avg_Median_Title\": \"Median\",\r\n  \"Grades_Avg_Median_Short\": \"Median\",\r\n\r\n  \"Grades_Avg_More\": \"Ketahui lebih lanjut\",\r\n  \"Grades_Avg_KnowMore\": \"Ketahui lebih lanjut\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Fahami kaedah pengiraan purata keseluruhan\",\r\n\r\n  \"Grades_SubjectInfo\": \"Maklumat mata pelajaran\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} gred\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Purata pelajar\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistik\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Purata kelas\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Purata keseluruhan kelas\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Purata maksimum\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Purata terbaik dalam kumpulan\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Purata minimum\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Purata terendah dalam kumpulan\",\r\n\r\n  \"Grades_Semester\": \"Semester\",\r\n  \"Grades_Trimester\": \"Trimester\",\r\n  \"Grades_OutPeriod\": \"Luar tempoh\",\r\n  \"Grades_Year\": \"Tahun\",\r\n  \"Grades_MockExamBac\": \"Peperiksaan percubaan\",\r\n  \"Grades_MockExamBrevet\": \"Ujian percubaan\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Semua mata pelajaran\",\r\n  \"Grades_Method_Weighted\": \"Pemberat\",\r\n\r\n  \"Grades_Sort\": \"Isih\",\r\n  \"Grades_Sorting_Alphabetical\": \"Abjad\",\r\n  \"Grades_Sorting_Averages\": \"Purata\",\r\n  \"Grades_Sorting_Date\": \"Tarikh\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Isih mengikut\",\r\n  \"Grades_Menu_AverageBy\": \"Purata mengikut\",\r\n  \"NoAverage\": \"Tiada purata\",\r\n\r\n  \"Grades_Empty_Title\": \"Tiada gred\",\r\n  \"Grades_Empty_Description\": \"Kamu belum diberikan gred untuk tempoh ini.\",\r\n\r\n  \"Grade_NoDescription\": \"Tugasan {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Mata pelajaran\",\r\n  \"Grades_Tab_Latest\": \"Gred baharu\",\r\n\r\n  \"Profile_Attendance_Title\": \"Kehadiran\",\r\n  \"Profile_Attendance_Denominator_Single\": \"ketidakhadiran\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"ketidakhadiran\",\r\n\r\n  \"Profile_Discussions_Title\": \"Perbincangan\",\r\n  \"Profile_Discussions_Denominator_Single\": \"belum dibaca\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"belum dibaca\",\r\n\r\n  \"Profile_News_Title\": \"Berita\",\r\n  \"Profile_News_Denominator_Single\": \"baharu\",\r\n  \"Profile_News_Denominator_Plural\": \"baharu\",\r\n  \"Profile_News_Open\": \"Buka\",\r\n  \"Profile_News_Loading_Title\": \"Memuatkan berita...\",\r\n  \"Profile_News_Author_Unknown\": \"Penulis tidak diketahui\",\r\n\r\n  \"Profile_Cards_Title\": \"Kod QR dan kad\",\r\n\r\n  \"Modal_Grades_Title\": \"Butiran gred\",\r\n  \"Modal_Grades_BestGrade\": \"Gred terbaik dalam kumpulan\",\r\n\r\n  \"Grades_Details_Title\": \"Butiran\",\r\n  \"Grades_NormalizedGrade_Title\": \"Gred ditukar kepada 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Nilai gred ditukarkan kepada skala 20\",\r\n  \"Grades_HighestGrade_Title\": \"Gred tertinggi\",\r\n  \"Grades_HighestGrade_Description\": \"Gred maksimum yang diperoleh dalam kumpulan\",\r\n  \"Grades_LowestGrade_Title\": \"Gred terendah\",\r\n  \"Grades_LowestGrade_Description\": \"Gred minimum yang diperoleh dalam kumpulan\",\r\n  \"Grades_Influence_Title\": \"Pengaruh\",\r\n  \"Grades_Avg_Group_Title\": \"Purata kumpulan\",\r\n  \"Grades_Coefficient\": \"Pekali\",\r\n  \"Grades_Avg_Group_Short\": \"Purata kump.\",\r\n  \"Grades_Tab_Rank\": \"Kedudukan\",\r\n  \"Grades_Tab_Rank_Description\": \"Kedudukan dalam kumpulan\",\r\n\r\n  \"News_Search_Placeholder\": \"Cari berita\",\r\n  \"News_Empty_Title\": \"Tiada berita\",\r\n  \"News_Empty_Description\": \"Tiada berita ditemui dalam institusi kamu.\",\r\n  \"News_Search_NoResults\": \"Tiada berita ditemui\",\r\n  \"News_Search_NoResults_Description\": \"Tiada berita ditemui untuk carian kamu.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Tema yang lembut dan elegan\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Pembacaan\",\r\n  \"News_Theme_Reading_Description\": \"Tema yang direka untuk pembacaan\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Jam terlepas\",\r\n  \"Attendance_Hours_Unjustified\": \"Jam tanpa sebab\",\r\n  \"Attendance_Missing\": \"Ketidakhadiran\",\r\n  \"Attendance_Delays\": \"Kelewatan\",\r\n  \"Attendance_NoReason\": \"Tiada sebab\",\r\n  \"Attendance_NoEvent_Title\": \"Tiada acara\",\r\n  \"Attendance_NoEvent_Description\": \"Tiada ketidakhadiran atau kelewatan direkodkan untuk tempoh ini.\",\r\n\r\n  \"Settings_Account_Title\": \"Akaun saya\",\r\n  \"Settings_Account_Description\": \"Akaun saya\",\r\n  \"Settings_Services_Title\": \"Akaun dipautkan\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Akaun terakhir digunakan\",\r\n  \"Settings_Notifications_Title\": \"Pemberitahuan\",\r\n  \"Settings_Notifications_Description\": \"Amaran, kekerapan...\",\r\n  \"Settings_Subjects_Title\": \"Mata pelajaran\",\r\n  \"Settings_Subjects_Description\": \"Nama, warna, fon...\",\r\n  \"Settings_Personalization_Title\": \"Penyesuaian\",\r\n  \"Settings_Personalization_Description\": \"Tema, warna...\",\r\n  \"Settings_Cards_Title\": \"Kad\",\r\n  \"Settings_Cards_Description\": \"Kantin, akses...\",\r\n  \"Settings_Accessibility_Title\": \"Kebolehcapaian\",\r\n  \"Settings_Accessibility_Description\": \"Paparan, bunyi...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Ciri pintar\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Ciri AI\",\r\n  \"Settings_MagicPlus_Enable\": \"Aktifkan Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Mengoptimumkan penyusunan tugasan kamu secara automatik untuk meningkatkan produktiviti\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Model tempatan sepenuhnya, tiada data dihantar keluar daripada peranti kamu\",\r\n  \"Settings_Donate_Title\": \"Derma\",\r\n  \"Settings_Donate_Description\": \"Sokong projek ini\",\r\n  \"Settings_Telemetry_Title\": \"Telemetri dan privasi\",\r\n  \"Settings_Telemetry_Description\": \"Urus data yang dikumpul\",\r\n  \"Settings_About_Title\": \"Tentang\",\r\n  \"Settings_About_Description\": \"Versi\",\r\n  \"Settings_Logout_Title\": \"Log keluar\",\r\n  \"Settings_Logout_Description\": \"Padam akaun ini daripada Papillon\",\r\n  \"Settings_Language_Title\": \"Bahasa\",\r\n  \"Settings_Language_Description\": \"Tukar bahasa\",\r\n  \"Settings_Tabs_Title\": \"Tab\",\r\n  \"Settings_Tabs_Description\": \"Sembunyikan tab daripada menu\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Penyesuaian\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Tema, subjek...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Suaikan mata pelajaran\",\r\n  \"Settings_Personalization_Accent\": \"Warna penyerlah\",\r\n  \"Settings_Personalization_Accent_Description\": \"Warna yang kamu pilih di sini akan digunakan pada halaman utama Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Tema\",\r\n  \"Settings_Personalization_Icon_Title\": \"Tukar ikon\",\r\n  \"Settings_Personalization_Icon_Description\": \"Suaikan ikon aplikasi\",\r\n  \"Settings_Personalization_Subject_Title\": \"Suaikan mata pelajaran\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Mata pelajaran\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikon, warna\",\r\n  \"Settings_About_Papillion_Behind\": \"Di Sebalik Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon diselenggarakan oleh pelajar sukarelawan 100%\",\r\n  \"Settings_About_Discord\": \"Pelayan Discord\",\r\n  \"Settings_About_Discord_Description\": \"Sertai pelayan Discord\",\r\n  \"Settings_About_Crowdin\": \"Projek Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Bantu terjemahkan Papillon\",\r\n  \"Settings_About_Github\": \"Projek GitHub\",\r\n  \"Settings_About_Github_Description\": \"Sumbang kepada projek di GitHub\",\r\n  \"Settings_About_Issue\": \"Laporkan pepijat\",\r\n  \"Settings_About_Issue_Description\": \"Laporkan pepijat yang ditemui\",\r\n  \"Settings_About_Dependency_Version\": \"Versi kebergantungan\",\r\n\r\n  \"Alert_No_Technical\": \"Tiada maklumat teknikal tersedia.\",\r\n  \"Alert_Auth_Error\": \"Ralat pengesahan\",\r\n  \"Alert_Auth_Bad_Creds\": \"Maklumat log masuk yang kamu masukkan adalah salah atau kamu cuba log masuk dengan akaun penjaga. Jenis akaun ini belum disokong oleh Papillon.\",\r\n  \"Alert_Not_Supported\": \"Instans tidak disokong\",\r\n  \"Alert_Security_Instance_HTTP\": \"Atas sebab keselamatan, Papillon tidak menerima instans yang masih menggunakan protokol HTTP. Kami mengesyorkan kamu memaklumkan ketua institusi supaya mereka mengemas kini instans tersebut.\",\r\n  \"Alert_NoDemo\": \"Papillon tidak dibina untuk berfungsi dengan instans demo, sila gunakan akaun sebenar.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon tidak dapat mengambil maklumat daripada instans PRONOTE ini, adakah ia masih sah?\",\r\n  \"Alert_No_Pos\": \"Tidak dapat mengambil lokasi\",\r\n  \"Alert_Connexion_Fail\": \"Sambungan tidak berjaya\",\r\n\r\n  \"Feature_Limited\": \"Ciri terhad\",\r\n  \"Feature_Soon\": \"Akan datang!\",\r\n  \"Feature_Soon_Notification\": \"Kami sedang bertungkus-lumus untuk memberikan ciri ini dalam kemas kini akan datang.\",\r\n  \"Feature_Add_Card\": \"Tambah kad baharu daripada tab Profil di bar navigasi\",\r\n\r\n  \"Webview_Wait\": \"Sila bersabar...\",\r\n\r\n  \"Profile_QRCards\": \"Kod QR dan kad\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} kad\",\r\n  \"Profile_Cards_Loading_History\": \"Memuatkan sejarah transaksi\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Ini mungkin mengambil masa seketika...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kad\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Kantin, akses\",\r\n  \"Settings_Cards_Banner_Description\": \"Tambah kad kantin dan pengangkutan kamu untuk mengaksesnya di mana sahaja melalui telefon dalam Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Tiada kad\",\r\n  \"Settings_Cards_Add_Button\": \"Tambah\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Tambah satu untuk melihat baki kantin, imbas kod QR dan banyak lagi\",\r\n  \"Settings_Subjects_None_Title\": \"Tiada mata pelajaran\",\r\n  \"Settings_Subjects_None_Description\": \"Terokai pelbagai tab aplikasi supaya kamu boleh menyesuaikan mata pelajaran.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Tetap semula\",\r\n  \"Settings_Subjects_Reset_Message\": \"Adakah kamu benar-benar mahu menetapkan semula semua mata pelajaran?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Tetap semula\",\r\n\r\n  \"Settings_Donator\": \"Penderma\",\r\n  \"Settings_Donator_Description\": \"Lihat senarai penderma\",\r\n  \"Settings_App_Version\": \"Versi aplikasi\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Halakan kod QR ke arah pengimbas terminal\",\r\n  \"Profile_Cards_No_Reservation\": \"Tiada tempahan\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Nampaknya kamu tidak boleh membuat tempahan untuk hari ini.\",\r\n  \"Profile_Cards_History\": \"Sejarah\",\r\n  \"Magic_Important\": \"Mungkin penting\",\r\n\r\n  \"OnBoarding_Step\": \"Langkah \",\r\n  \"OnBoarding_Step_Of\": \"daripada \",\r\n\r\n  \"Consent_Advanced_Title\": \"Saya mahu membantu Papillon\",\r\n  \"Consent_Advanced_Description\": \"Kami mengumpul maklumat penggunaan kamu dengan lebih terperinci.\",\r\n  \"Consent_Required_Title\": \"Hanya yang penting\",\r\n  \"Consent_Required_Description\": \"Secara ringkasnya, mengetahui seseorang menggunakan Papillon, adakah ia berjalan lancar dan perkhidmatan mana yang digunakan.\",\r\n  \"Consent_None_Title\": \"Tiada apa-apa langsung\",\r\n  \"Consent_None_Description\": \"Kami tidak akan tahu kewujudan kamu sama sekali.\",\r\n  \"Consent_Title\": \"Kamu dan Papillon\",\r\n  \"Consent_Intro1\": \"Untuk membantu Papillon berkembang, kamu boleh memilih untuk berkongsi beberapa maklumat penggunaan.\",\r\n  \"Consent_PrivacyPolicy\": \"Jika ragu-ragu, sila rujuk dasar privasi kami\",\r\n  \"Consent_Refuse\": \"Tolak\",\r\n  \"Consent_Accept\": \"Terima\",\r\n  \"Consent_ChangeMind\": \"Kamu boleh mengubah fikiran pada bila-bila masa melalui tetapan aplikasi.\",\r\n  \"Consent_Arg1\": \"Hanya digunakan untuk menambah baik aplikasi\",\r\n  \"Consent_Arg2\": \"Tanpa nama & tidak dikaitkan dengan identiti kamu\",\r\n  \"Consent_Arg3\": \"Kami tidak mempunyai akses ke akaun kamu\",\r\n\r\n  \"Changelog_Title\": \"Nota kemas kini\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Tarikh hantar\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Mata pelajaran\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Belum selesai\",\r\n  \"Tasks_ThisWeek\": \"Minggu ini\",\r\n\r\n  \"Task_Undone\": \"Belum selesai\",\r\n  \"Task_Done\": \"Selesai\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Suaikan kertas dinding\",\r\n  \"Modal_Profile_Title\": \"Suaikan profil\",\r\n\r\n  \"Modal_Task_Status\": \"Status tugasan\",\r\n  \"Modal_Task_Description\": \"Penerangan tugasan\",\r\n  \"Modal_Task_Attachments\": \"Lampiran\",\r\n\r\n  \"Today\": \"Hari ini\",\r\n  \"Yesterday\": \"Semalam\",\r\n  \"Tomorrow\": \"Esok\"\r\n}"
  },
  {
    "path": "locales/nl.json",
    "content": "{\r\n  \"Global_Back\": \"Terug\",\r\n  \"Global_DatePrefix\": \"op\",\r\n\r\n  \"Tab_Home\": \"Home\",\r\n  \"Tab_Calendar\": \"Lessen\",\r\n  \"Tab_Tasks\": \"Taken\",\r\n  \"Tab_Grades\": \"Cijfers\",\r\n  \"Tab_Profile\": \"Profiel\",\r\n  \"Tab_Custom_Profile\": \"Profiel bewerken\",\r\n  \"Button_Change_ProfilePicture\": \"Profielfoto wijzigen\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Foto maken\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Uit bibliotheek\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Ophalen via je school\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Foto verwijderen\",\r\n  \"Tab_Page\": \"Pagina\",\r\n  \"Tab_Settings\": \"Instellingen\",\r\n  \"Tab_News\": \"Nieuws\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Dé app om je schoolleven te beheren\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Verbind je schoolapps om toegang te krijgen tot je cijfers, lessen, huiswerk en meer in de Papillon-interface!\",\r\n  \"ONBOARDING_START_BTN\": \"Beginnen\",\r\n  \"ONBOARDING_HELP_BTN\": \"Hulp nodig?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Universiteitsdienst\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Cateringdienst\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Selecteer je schooldienst\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Selecteer je cateringdienst\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Selecteer je universiteitsdienst\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Hoe wil je inloggen?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Gebruik mijn locatie\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Zoek een stad\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Ik heb een QR-code\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Ik heb een inlog-URL\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Kies je school\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Voer de naam van je stad in en kies je school\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Log in zoals je gewend bent\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Log in op je account\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Kies de host voor dit account\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Voer de 4-cijferige code in die je zojuist op PRONOTE hebt aangemaakt\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Verbinden met\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Scan de QR-code van je school om in te loggen.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR-code controleren\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Dit kan even duren...\",\r\n  \"ONBOARDING_URL\": \"Voer de URL van je school in\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL van je PRONOTE-omgeving\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Voordat we afronden\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Kies een\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"themakleur\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Voer je PRONOTE pincode in\",\r\n  \"Onboarding_Load_Webview_Description\": \"We laden de website van je school\",\r\n  \"INPUT_PIN\": \"Pincode\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Zoek een omgeving...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Inloggen...\",\r\n\r\n  \"WAITING\": \"Wachten\",\r\n  \"IZLY_SMS_SEND\": \"Je hebt zojuist een link ontvangen om in te loggen, klik erop en volg de stappen.\",\r\n  \"STEP\": \"Stap\",\r\n  \"STEP_OUTOF\": \"van\",\r\n  \"INPUT_USERNAME\": \"Gebruikersnaam\",\r\n  \"INPUT_MAIL\": \"E-mailadres\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-mailadres of gebruikersnaam\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Telefoonnummer of e-mailadres\",\r\n  \"INPUT_PASSWORD\": \"Wachtwoord\",\r\n  \"INPUT_PASSWORD_CODE\": \"Toegangscode\",\r\n  \"INPUT_ETABID\": \"School-ID\",\r\n  \"LOGIN_BTN\": \"Inloggen\",\r\n  \"CONFIRM_BTN\": \"Bevestigen\",\r\n  \"CANCEL_BTN\": \"Annuleren\",\r\n\r\n  \"Tab_New_Event\": \"Nieuwe afspraak\",\r\n\r\n  \"Tab_Calendar_Icals\": \"iCal-beheer\",\r\n  \"Tab_Calendar_Icals_Description\": \"Beheer je iCal-URL's\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"iCal-URL toevoegen\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"{{title}} beheren\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"iCal-URL's toevoegen of verwijderen om te synchroniseren met je agenda.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Titel ontbreekt\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Geef deze iCal-URL een naam om hem toe te voegen.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Geen iCal-URL's toegevoegd\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Dit tabblad is nog in ontwikkeling.\",\r\n  \"TabUnderConstruction_Details\": \"Kom later terug voor updates.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Ontwikkelaarsmodus\",\r\n  \"TabDevModeNotice_Details\": \"Volledige testomgeving voor ontwikkelaars.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Technische details\",\r\n\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Beoordeling\",\r\n  \"Edited_Course\": \"Gewijzigde les\",\r\n  \"Canceled_Course\": \"Les uitgevallen\",\r\n  \"No_Course_Room\": \"Lokaal onbekend\",\r\n  \"Event_DeleteEvent\": \"Verwijder afspraak\",\r\n  \"Event_Confirm_DeleteEvent\": \"Weet je zeker dat je deze afspraak wilt verwijderen?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Lunchpauze\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Eet smakelijk!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Mjam!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Ochtendpauze\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Tijd om te slapen!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Ontbijttijd\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Middagpauze\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Tijd voor een pauze!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Tijd voor een tussendoortje!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Avondpauze\",\r\n  \"Course_Separator_Night_Alt_1\": \"Slaap lekker!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Het is nacht!\",\r\n\r\n  \"Context_Delete\": \"Verwijderen\",\r\n  \"Context_Cancel\": \"Annuleren\",\r\n  \"Context_Edit\": \"Bewerken\",\r\n  \"Context_Add\": \"Toevoegen\",\r\n\r\n  \"Form_Title\": \"Titel\",\r\n  \"Form_Location\": \"Locatie\",\r\n  \"Form_Organizer\": \"Organisator\",\r\n  \"Form_Start\": \"Begin\",\r\n  \"Form_End\": \"Einde\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Weet je zeker dat je deze afspraak wilt verwijderen?\",\r\n\r\n  \"Home_Welcome_Name\": \"Hallo, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Toon meer\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"beschikbaar\",\r\n  \"Home_Chats_Plurial\": \"gesprekken\",\r\n  \"Home_Chats_Singular\": \"gesprek\",\r\n  \"Home_See_All_Tasks\": \"Bekijk alle taken\",\r\n  \"Home_Welcome\": \"Hallo!\",\r\n  \"Home_Planned_None\": \"Je hebt geen lessen meer gepland voor vandaag\",\r\n  \"Home_Planned_One\": \"Je hebt nog één les vandaag\",\r\n  \"Home_Planned_Number\": \"Je hebt nog {{number}} lessen vandaag\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Volgende lessen\",\r\n  \"Home_Widget_NewGrades\": \"Nieuwe cijfers\",\r\n  \"Home_Widget_NewHomeworks\": \"Taken te doen\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Geen lessen gepland\",\r\n  \"Home_Widget_NoCourses_Description\": \"Er zijn geen lessen gepland voor vandaag.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kaarten\",\r\n  \"Home_Cards_Button_Description_None\": \"Geen kaarten\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Eén kaart\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kaarten\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Berichten\",\r\n  \"Home_Chats_Button_Description_None\": \"Geen berichten\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Eén bericht\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} berichten\",\r\n\r\n  \"Home_Attendance_Title\": \"Afwezigheid\",\r\n  \"Home_Attendance_Button_Description_None\": \"Niet afwezig\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Eén afwezigheid\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} afwezigheden\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Menu\",\r\n  \"Home_Menu_Button_Description\": \"Menu van de dag\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Geen afspraken gevonden\",\r\n  \"Tab_Calendar_Empty_Description\": \"Voeg een afspraak toe of synchroniseer je agenda om te beginnen.\",\r\n\r\n  \"Modal_Course_Title\": \"Mijn les\",\r\n  \"Modal_Course_StartsIn\": \"Begint over\",\r\n  \"Modal_Course_StartedAgo\": \"Geëindigd sinds\",\r\n  \"Modal_Course_Ongoing\": \"Begonnen sinds\",\r\n  \"Modal_Course_Group\": \"Groep\",\r\n  \"Modal_Course_Group_Full\": \"Klas\",\r\n\r\n  \"Modal_Course_Details\": \"Lesdetails\",\r\n  \"Modal_Course_Teacher\": \"Docent\",\r\n  \"Modal_Course_Room\": \"Lokaal\",\r\n  \"Modal_Course_Duration\": \"Duur\",\r\n\r\n  \"Modal_Course_Time\": \"Lestijden\",\r\n  \"Modal_Course_Start\": \"Begin\",\r\n  \"Modal_Course_End\": \"Einde\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Zoek taken\",\r\n  \"Tasks_LeftHomeworks_Title\": \"resterende taken\",\r\n  \"Tasks_LeftHomeworks_Time\": \"deze week\",\r\n  \"Tasks_Done_AllTasks\": \"Alle taken\",\r\n  \"Tasks_Done_CompletedTasks\": \"zijn voltooid\",\r\n  \"Tasks_Nav_Left\": \"Nog {{count}} taken te doen\",\r\n  \"Tasks_Nav_One\": \"Nog maar één taak te doen\",\r\n  \"Tasks_Nav_Completed\": \"Alles is af!\",\r\n  \"Tasks_Week\": \"Week\",\r\n  \"Tasks_NoTasks_Title\": \"Geen taken\",\r\n  \"Tasks_NoTasks_Description\": \"Er zijn geen taken voor deze week. Geniet van je rust!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"voor week {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Geen taken\",\r\n  \"Task_Start\": \"To do\",\r\n  \"Task_Complete\": \"Voltooid\",\r\n  \"Task_Sorting_Title\": \"Sorteren op\",\r\n  \"Task_OnlyShowUndone\": \"Voltooide taken\",\r\n  \"Task_Show_Title\": \"Weergeven\",\r\n  \"Settings_General\": \"Algemeen\",\r\n\r\n  \"Latest_Grades\": \"Nieuwe cijfers\",\r\n  \"Grades_Search_Placeholder\": \"Zoek een cijfer of vak\",\r\n\r\n  \"Grades_Avg_Methods\": \"Berekeningsmethoden\",\r\n  \"Grades_Avg_All_Title\": \"Algemeen gemiddelde\",\r\n  \"Grades_Avg_All_Short\": \"Gemiddelde\",\r\n  \"Grades_Avg_All_Pond\": \"Gewogen gemiddelde\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Gew. gem.\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Berekent het gewogen gemiddelde van alle cijfers\",\r\n  \"Grades_Avg_Subject_Title\": \"Gemiddelde per vak\",\r\n  \"Grades_Avg_Subject_Short\": \"Vakgemiddelde\",\r\n  \"Grades_Avg_Subject_Description\": \"Berekent het gemiddelde op basis van vakgemiddelden\",\r\n  \"Grades_Avg_Median_Title\": \"Mediaan\",\r\n  \"Grades_Avg_Median_Short\": \"Mediaan\",\r\n\r\n  \"Grades_Avg_More\": \"Meer informatie\",\r\n  \"Grades_Avg_KnowMore\": \"Meer informatie\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Begrijp hoe het gemiddelde wordt berekend\",\r\n\r\n  \"Grades_SubjectInfo\": \"Vakinformatie\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} cijfer(s)\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Gemiddelde leerling\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistieken\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Klassengemiddelde\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Gemiddelde van de hele klas\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Hoogste gemiddelde\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Beste gemiddelde in de groep\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Laagste gemiddelde\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Laagste gemiddelde in de groep\",\r\n\r\n  \"Grades_Semester\": \"Semester\",\r\n  \"Grades_Trimester\": \"Trimester\",\r\n  \"Grades_OutPeriod\": \"Buiten periode\",\r\n  \"Grades_Year\": \"Jaar\",\r\n  \"Grades_MockExamBac\": \"Proefexamen\",\r\n  \"Grades_MockExamBrevet\": \"Proefexamen\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Alle vakken\",\r\n  \"Grades_Method_Weighted\": \"Weging\",\r\n\r\n  \"Grades_Sort\": \"Sorteren\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabetisch\",\r\n  \"Grades_Sorting_Averages\": \"Gemiddelden\",\r\n  \"Grades_Sorting_Date\": \"Datum\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Sorteren op\",\r\n  \"Grades_Menu_AverageBy\": \"Gemiddelde per\",\r\n  \"NoAverage\": \"Geen gemiddelde\",\r\n\r\n  \"Grades_Empty_Title\": \"Geen cijfers\",\r\n  \"Grades_Empty_Description\": \"Je hebt nog geen cijfers gekregen in deze periode.\",\r\n\r\n  \"Grade_NoDescription\": \"Opdracht voor {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Vakken\",\r\n  \"Grades_Tab_Latest\": \"Nieuwe cijfers\",\r\n\r\n  \"Profile_Attendance_Title\": \"Aanwezigheid\",\r\n  \"Profile_Attendance_Denominator_Single\": \"afwezigheid\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"afwezigheden\",\r\n\r\n  \"Profile_Discussions_Title\": \"Berichten\",\r\n  \"Profile_Discussions_Denominator_Single\": \"ongelezen\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"ongelezen\",\r\n\r\n  \"Profile_News_Title\": \"Nieuws\",\r\n  \"Profile_News_Denominator_Single\": \"nieuw\",\r\n  \"Profile_News_Denominator_Plural\": \"nieuwe\",\r\n  \"Profile_News_Open\": \"Openen\",\r\n  \"Profile_News_Loading_Title\": \"Nieuws laden...\",\r\n  \"Profile_News_Author_Unknown\": \"Onbekende auteur\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-code en kaarten\",\r\n\r\n  \"Modal_Grades_Title\": \"Cijferdetails\",\r\n  \"Modal_Grades_BestGrade\": \"Hoogste cijfer in de groep\",\r\n\r\n  \"Grades_Details_Title\": \"Details\",\r\n  \"Grades_NormalizedGrade_Title\": \"Cijfer op schaal van 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Cijferwaarde omgerekend naar een schaal van 20\",\r\n  \"Grades_HighestGrade_Title\": \"Hoogste cijfer\",\r\n  \"Grades_HighestGrade_Description\": \"Hoogste cijfer behaald in de groep\",\r\n  \"Grades_LowestGrade_Title\": \"Laagste cijfer\",\r\n  \"Grades_LowestGrade_Description\": \"Laagste cijfer behaald in de groep\",\r\n  \"Grades_Influence_Title\": \"Invloed\",\r\n  \"Grades_Avg_Group_Title\": \"Groepsgemiddelde\",\r\n  \"Grades_Coefficient\": \"Weging\",\r\n  \"Grades_Avg_Group_Short\": \"Groepsgem.\",\r\n  \"Grades_Tab_Rank\": \"Rangschikking\",\r\n  \"Grades_Tab_Rank_Description\": \"Positie in de groep\",\r\n\r\n  \"News_Search_Placeholder\": \"Zoek nieuws\",\r\n  \"News_Empty_Title\": \"Geen nieuws\",\r\n  \"News_Empty_Description\": \"Er is geen nieuws gevonden voor jouw school.\",\r\n  \"News_Search_NoResults\": \"Geen nieuws gevonden\",\r\n  \"News_Search_NoResults_Description\": \"Geen nieuws gevonden voor jouw zoekopdracht.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Een zacht en elegant thema\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Lezen\",\r\n  \"News_Theme_Reading_Description\": \"Een thema ontworpen om te lezen\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Gemiste uren\",\r\n  \"Attendance_Hours_Unjustified\": \"Ongeoorloofde uren\",\r\n  \"Attendance_Missing\": \"Afwezigheden\",\r\n  \"Attendance_Delays\": \"Te laat\",\r\n  \"Attendance_NoReason\": \"Geen reden\",\r\n  \"Attendance_NoEvent_Title\": \"Geen gebeurtenissen\",\r\n  \"Attendance_NoEvent_Description\": \"Geen afwezigheid of te laat meldingen voor deze periode.\",\r\n\r\n  \"Settings_Account_Title\": \"Mijn account\",\r\n  \"Settings_Account_Description\": \"Mijn account\",\r\n  \"Settings_Services_Title\": \"Gekoppelde accounts\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Laatst gebruikte account\",\r\n  \"Settings_Notifications_Title\": \"Meldingen\",\r\n  \"Settings_Notifications_Description\": \"Waarschuwingen, frequentie...\",\r\n  \"Settings_Subjects_Title\": \"Vakken\",\r\n  \"Settings_Subjects_Description\": \"Naam, kleur, lettertype...\",\r\n  \"Settings_Personalization_Title\": \"Personalisatie\",\r\n  \"Settings_Personalization_Description\": \"Thema's, kleuren...\",\r\n  \"Settings_Cards_Title\": \"Kaarten\",\r\n  \"Settings_Cards_Description\": \"Kantine, toegang...\",\r\n  \"Settings_Accessibility_Title\": \"Toegankelijkheid\",\r\n  \"Settings_Accessibility_Description\": \"Weergave, geluid...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Slimme functies\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI functies\",\r\n  \"Settings_MagicPlus_Enable\": \"Magic+ activeren\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimaliseert automatisch je takenlijst om je productiviteit te verhogen\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Volledig lokaal model, er worden geen gegevens buiten je apparaat verstuurd\",\r\n  \"Settings_Donate_Title\": \"Doneren\",\r\n  \"Settings_Donate_Description\": \"Steun het project\",\r\n  \"Settings_Telemetry_Title\": \"Telemetrie en privacy\",\r\n  \"Settings_Telemetry_Description\": \"Beheer verzamelde gegevens\",\r\n  \"Settings_About_Title\": \"Over\",\r\n  \"Settings_About_Description\": \"Versie\",\r\n  \"Settings_Logout_Title\": \"Uitloggen\",\r\n  \"Settings_Logout_Description\": \"Verwijder dit account uit Papillon\",\r\n  \"Settings_Language_Title\": \"Taal\",\r\n  \"Settings_Language_Description\": \"Taal wijzigen\",\r\n  \"Settings_Tabs_Title\": \"Tabbladen\",\r\n  \"Settings_Tabs_Description\": \"Tabbladen in het menu verbergen\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personnalisatie\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Thema's, vakken...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Vakken aanpassen\",\r\n  \"Settings_Personalization_Accent\": \"Accentkleur\",\r\n  \"Settings_Personalization_Accent_Description\": \"De kleur die je hier kiest wordt toegepast op de startpagina van Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Thema\",\r\n  \"Settings_Personalization_Icon_Title\": \"Icoon wijzigen\",\r\n  \"Settings_Personalization_Icon_Description\": \"Pas het app-icoon aan\",\r\n  \"Settings_Personalization_Subject_Title\": \"Vakken aanpassen\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Vakken\",\r\n  \"Settings_Personalization_Subject_Description\": \"Iconen, kleuren\",\r\n  \"Settings_About_Papillion_Behind\": \"Achter Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon wordt onderhouden door 100% vrijwillige studenten\",\r\n  \"Settings_About_Discord\": \"Discord-server\",\r\n  \"Settings_About_Discord_Description\": \"Word lid van de Discord-server\",\r\n  \"Settings_About_Crowdin\": \"Crowdin-project\",\r\n  \"Settings_About_Crowdin_Description\": \"Help Papillon te vertalen\",\r\n  \"Settings_About_Github\": \"GitHub-project\",\r\n  \"Settings_About_Github_Description\": \"Draag bij aan het project op GitHub\",\r\n  \"Settings_About_Issue\": \"Bug melden\",\r\n  \"Settings_About_Issue_Description\": \"Meld een probleem dat je bent tegengekomen\",\r\n  \"Settings_About_Dependency_Version\": \"Versie van afhankelijkheden\",\r\n\r\n  \"Alert_No_Technical\": \"Geen technische informatie beschikbaar.\",\r\n  \"Alert_Auth_Error\": \"Authenticatiefout\",\r\n  \"Alert_Auth_Bad_Creds\": \"De inloggegevens die je hebt ingevoerd zijn onjuist of je probeert in te loggen met een ouderaccount. Dit type account wordt nog niet ondersteund door Papillon.\",\r\n  \"Alert_Not_Supported\": \"Omgeving niet ondersteund\",\r\n  \"Alert_Security_Instance_HTTP\": \"Om veiligheidsredenen accepteert Papillon geen omgevingen die nog het HTTP-protocol gebruiken. We raden je aan de schoolleider te informeren zodat zij de omgeving kunnen updaten.\",\r\n  \"Alert_NoDemo\": \"Papillon werkt niet met demo-omgevingen, gebruik een echte schoolomgeving.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon kan geen informatie ophalen van deze PRONOTE-omgeving, is deze nog geldig?\",\r\n  \"Alert_No_Pos\": \"Kan locatie niet ophalen\",\r\n  \"Alert_Connexion_Fail\": \"Verbinding mislukt\",\r\n\r\n  \"Feature_Limited\": \"Beperkte functies\",\r\n  \"Feature_Soon\": \"Binnenkort beschikbaar!\",\r\n  \"Feature_Soon_Notification\": \"We werken hard om deze functie beschikbaar te maken in een toekomstige update.\",\r\n  \"Feature_Add_Card\": \"Voeg een nieuwe kaart toe via het tabblad Profiel in de navigatiebalk\",\r\n\r\n  \"Webview_Wait\": \"Even geduld a.u.b...\",\r\n\r\n  \"Profile_QRCards\": \"QR-code en kaarten\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} kaarten\",\r\n  \"Profile_Cards_Loading_History\": \"Transactiegeschiedenis laden\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Dit kan even duren...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kaarten\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Kantine, toegang\",\r\n  \"Settings_Cards_Banner_Description\": \"Voeg je kantine- en vervoerskaarten toe voor snelle toegang op je telefoon via Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Geen kaarten\",\r\n  \"Settings_Cards_Add_Button\": \"Toevoegen\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Voeg een kaart toe om je saldo te bekijken, je QR-code te scannen en meer\",\r\n  \"Settings_Subjects_None_Title\": \"Geen vakken\",\r\n  \"Settings_Subjects_None_Description\": \"Navigeer door de app om vakken aan te kunnen passen.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Resetten\",\r\n  \"Settings_Subjects_Reset_Message\": \"Weet je zeker dat je alle vakken wilt resetten?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Resetten\",\r\n\r\n  \"Settings_Donator\": \"Donateurs\",\r\n  \"Settings_Donator_Description\": \"Bekijk de lijst met donateurs\",\r\n  \"Settings_App_Version\": \"App-versie\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Richt de QR-code op de scanner\",\r\n  \"Profile_Cards_No_Reservation\": \"Geen reservering\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Het lijkt erop dat je voor vandaag niet kunt reserveren.\",\r\n  \"Profile_Cards_History\": \"Geschiedenis\",\r\n  \"Magic_Important\": \"Misschien belangrijk\",\r\n\r\n  \"OnBoarding_Step\": \"Stap \",\r\n  \"OnBoarding_Step_Of\": \"van \",\r\n\r\n  \"Consent_Advanced_Title\": \"Ik wil Papillon helpen\",\r\n  \"Consent_Advanced_Description\": \"We verzamelen gedetailleerde informatie over je gebruik.\",\r\n  \"Consent_Required_Title\": \"Alleen het noodzakelijke\",\r\n  \"Consent_Required_Description\": \"Kortom, weten dat iemand Papillon gebruikt, of het goed werkt en welke dienst wordt gebruikt.\",\r\n  \"Consent_None_Title\": \"Helemaal niets\",\r\n  \"Consent_None_Description\": \"We weten niet eens dat je bestaat.\",\r\n  \"Consent_Title\": \"Jij en Papillon\",\r\n  \"Consent_Intro1\": \"Om Papillon te helpen groeien, kun je ervoor kiezen om gebruiksgegevens te delen.\",\r\n  \"Consent_PrivacyPolicy\": \"Raadpleeg ons privacybeleid bij twijfel\",\r\n  \"Consent_Refuse\": \"Weigeren\",\r\n  \"Consent_Accept\": \"Accepteren\",\r\n  \"Consent_ChangeMind\": \"Je kunt je keuze op elk moment wijzigen via de instellingen.\",\r\n  \"Consent_Arg1\": \"Alleen om de app te verbeteren\",\r\n  \"Consent_Arg2\": \"Anoniem en niet gekoppeld aan je identiteit\",\r\n  \"Consent_Arg3\": \"We hebben geen toegang tot je accounts\",\r\n\r\n  \"Changelog_Title\": \"Release-opmerkingen\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Inleverdatum\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Vakken\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Niet voltooid\",\r\n  \"Tasks_ThisWeek\": \"Deze week\",\r\n\r\n  \"Task_Undone\": \"Niet voltooid\",\r\n  \"Task_Done\": \"Voltooid\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Achtergrond aanpassen\",\r\n  \"Modal_Profile_Title\": \"Profiel aanpassen\",\r\n\r\n  \"Modal_Task_Status\": \"Taakstatus\",\r\n  \"Modal_Task_Description\": \"Taakbeschrijving\",\r\n  \"Modal_Task_Attachments\": \"Bijlagen\",\r\n\r\n  \"Today\": \"Vandaag\",\r\n  \"Yesterday\": \"Gisteren\",\r\n  \"Tomorrow\": \"Morgen\"\r\n}"
  },
  {
    "path": "locales/no.json",
    "content": "{\r\n  \"Global_Back\": \"Tilbake\",\r\n  \"Global_DatePrefix\": \"den\",\r\n\r\n  \"Tab_Home\": \"Hjem\",\r\n  \"Tab_Calendar\": \"Timeplan\",\r\n  \"Tab_Tasks\": \"Oppgaver\",\r\n  \"Tab_Grades\": \"Karakterer\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Rediger profil\",\r\n  \"Button_Change_ProfilePicture\": \"Endre profilbilde\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Ta et bilde\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Fra bildebibliotek\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Hent fra skolesystemet\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Fjern bilde\",\r\n  \"Tab_Page\": \"Side\",\r\n  \"Tab_Settings\": \"Innstillinger\",\r\n  \"Tab_News\": \"Nyheter\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Appen for å styre skolehverdagen din\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Koble til skoleappene dine for å få tilgang til karakterer, timeplan, lekser og mye mer i Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Kom i gang\",\r\n  \"ONBOARDING_HELP_BTN\": \"Trenger du hjelp?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Universitetstjeneste\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Kantineordning\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Velg din skoletjeneste\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Velg din kantineordning\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Velg din universitetstjeneste\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Hvordan vil du logge inn?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Bruk min posisjon\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Søk etter by\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Jeg har en QR-kode\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Jeg har en påloggings-URL\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Velg skolen din\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Skriv inn navnet på byen og velg skolen din\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Logg inn slik du pleier\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Logg inn på kontoen din\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Velg verten tilknyttet kontoen\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Oppgi den 4-sifrede koden du nettopp opprettet i PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Kobler til\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Skann skolens QR-kode for å koble til.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validerer QR-kode\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Dette kan ta et øyeblikk...\",\r\n  \"ONBOARDING_URL\": \"Oppgi skolens URL-adresse\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL til din PRONOTE-instans\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Før vi er ferdige\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Velg en\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"temafarge\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Skriv inn PIN-koden for PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"Vi laster skolens nettside\",\r\n  \"INPUT_PIN\": \"PIN-kode\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Søk etter instans...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Logger inn...\",\r\n\r\n  \"WAITING\": \"Venter\",\r\n  \"IZLY_SMS_SEND\": \"Du har nettopp mottatt en lenke for å logge inn. Klikk på den og følg stegene.\",\r\n  \"STEP\": \"Steg\",\r\n  \"STEP_OUTOF\": \"av\",\r\n  \"INPUT_USERNAME\": \"Brukernavn\",\r\n  \"INPUT_MAIL\": \"E-postadresse\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-post eller brukernavn\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Telefonnummer eller e-post\",\r\n  \"INPUT_PASSWORD\": \"Passord\",\r\n  \"INPUT_PASSWORD_CODE\": \"Tilgangskode\",\r\n  \"INPUT_ETABID\": \"Skolens ID\",\r\n  \"LOGIN_BTN\": \"Logg inn\",\r\n  \"CONFIRM_BTN\": \"Bekreft\",\r\n  \"CANCEL_BTN\": \"Avbryt\",\r\n\r\n  \"Tab_New_Event\": \"Ny hendelse\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Administrer iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Administrer dine iCal-URL-er\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Legg til iCal-URL\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Administrer {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Legg til eller slett iCal-URL-er for å synkronisere med timeplanen din.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Tittel mangler\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Gi denne iCal-URL-en et navn for å legge den til.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Ingen iCal-URL-er lagt til\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Denne fanen er under utvikling.\",\r\n  \"TabUnderConstruction_Details\": \"Kom tilbake senere for oppdateringer.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Utviklermodus\",\r\n  \"TabDevModeNotice_Details\": \"Komplett testmiljø for utviklere.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Tekniske detaljer\",\r\n\r\n  \"Online_Course\": \"Digitalt\",\r\n  \"Evaluated_Course\": \"Vurdering/Prøve\",\r\n  \"Edited_Course\": \"Endret time\",\r\n  \"Canceled_Course\": \"Avlyst time\",\r\n  \"No_Course_Room\": \"Ukjent rom\",\r\n  \"Event_DeleteEvent\": \"Slett hendelse\",\r\n  \"Event_Confirm_DeleteEvent\": \"Er du sikker på at du vil slette denne hendelsen?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Matpause\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Vel bekomme!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Nam nam!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Friminutt\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Tid for å sove!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Frokost\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Ettermiddagspause\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Tid for en pause!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Mellommåltid!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Kveldspause\",\r\n  \"Course_Separator_Night_Alt_1\": \"Tid for å sove!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Det er natt!\",\r\n\r\n  \"Context_Delete\": \"Slett\",\r\n  \"Context_Cancel\": \"Avbryt\",\r\n  \"Context_Edit\": \"Endre\",\r\n  \"Context_Add\": \"Legg til\",\r\n\r\n  \"Form_Title\": \"Tittel\",\r\n  \"Form_Location\": \"Sted\",\r\n  \"Form_Organizer\": \"Arrangør\",\r\n  \"Form_Start\": \"Start\",\r\n  \"Form_End\": \"Slutt\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Er du sikker på at du vil slette denne hendelsen?\",\r\n\r\n  \"Home_Welcome_Name\": \"Hei, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Vis mer\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"tilgjengelige\",\r\n  \"Home_Chats_Plurial\": \"samtaler\",\r\n  \"Home_Chats_Singular\": \"samtale\",\r\n  \"Home_See_All_Tasks\": \"Se alle oppgaver\",\r\n  \"Home_Welcome\": \"Hei!\",\r\n  \"Home_Planned_None\": \"Du har ingen flere planlagte timer i dag\",\r\n  \"Home_Planned_One\": \"Du har én time igjen i dag\",\r\n  \"Home_Planned_Number\": \"Du har {{number}} timer igjen i dag\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Neste timer\",\r\n  \"Home_Widget_NewGrades\": \"Nye karakterer\",\r\n  \"Home_Widget_NewHomeworks\": \"Oppgaver som skal gjøres\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Ingen kommende timer\",\r\n  \"Home_Widget_NoCourses_Description\": \"Det er ingen planlagte timer for i dag.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kort\",\r\n  \"Home_Cards_Button_Description_None\": \"Ingen kort\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Ett kort\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kort\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Meldinger\",\r\n  \"Home_Chats_Button_Description_None\": \"Ingen meldinger\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Én melding\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} meldinger\",\r\n\r\n  \"Home_Attendance_Title\": \"Fravær\",\r\n  \"Home_Attendance_Button_Description_None\": \"Ingen fravær\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Ett fravær\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} fravær\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Meny\",\r\n  \"Home_Menu_Button_Description\": \"Dagens meny\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Ingen hendelser funnet\",\r\n  \"Tab_Calendar_Empty_Description\": \"Legg til en hendelse eller synkroniser timeplanen din for å komme i gang.\",\r\n\r\n  \"Modal_Course_Title\": \"Min time\",\r\n  \"Modal_Course_StartsIn\": \"Starter om\",\r\n  \"Modal_Course_StartedAgo\": \"Sluttet for\",\r\n  \"Modal_Course_Ongoing\": \"Pågått i\",\r\n  \"Modal_Course_Group\": \"Gruppe\",\r\n  \"Modal_Course_Group_Full\": \"Klasse\",\r\n\r\n  \"Modal_Course_Details\": \"Timedetaljer\",\r\n  \"Modal_Course_Teacher\": \"Lærer\",\r\n  \"Modal_Course_Room\": \"Rom\",\r\n  \"Modal_Course_Duration\": \"Varighet\",\r\n\r\n  \"Modal_Course_Time\": \"Klokkeslett\",\r\n  \"Modal_Course_Start\": \"Start\",\r\n  \"Modal_Course_End\": \"Slutt\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Søk etter oppgaver\",\r\n  \"Tasks_LeftHomeworks_Title\": \"gjenstående oppgaver\",\r\n  \"Tasks_LeftHomeworks_Time\": \"denne uken\",\r\n  \"Tasks_Done_AllTasks\": \"Alle oppgaver\",\r\n  \"Tasks_Done_CompletedTasks\": \"er fullført\",\r\n  \"Tasks_Nav_Left\": \"{{count}} oppgaver igjen å gjøre\",\r\n  \"Tasks_Nav_One\": \"Bare én oppgave igjen\",\r\n  \"Tasks_Nav_Completed\": \"Alt er ferdig!\",\r\n  \"Tasks_Week\": \"Uke\",\r\n  \"Tasks_NoTasks_Title\": \"Ingen oppgaver\",\r\n  \"Tasks_NoTasks_Description\": \"Det er ingen planlagte oppgaver denne uken. Nyt fritiden!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"for uke {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Ingen oppgaver\",\r\n  \"Task_Start\": \"Gjøremål\",\r\n  \"Task_Complete\": \"Ferdig\",\r\n  \"Task_Sorting_Title\": \"Sorter etter\",\r\n  \"Task_OnlyShowUndone\": \"Ferdige oppgaver\",\r\n  \"Task_Show_Title\": \"Vis\",\r\n  \"Settings_General\": \"Generelt\",\r\n\r\n  \"Latest_Grades\": \"Nye karakterer\",\r\n  \"Grades_Search_Placeholder\": \"Søk etter en karakter eller et fag\",\r\n\r\n  \"Grades_Avg_Methods\": \"Beregningsmetoder\",\r\n  \"Grades_Avg_All_Title\": \"Samlet gjennomsnitt\",\r\n  \"Grades_Avg_All_Short\": \"Snitt\",\r\n  \"Grades_Avg_All_Pond\": \"Vektet gjennomsnitt\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Vektet snitt\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Beregner det vektede gjennomsnittet av alle karakterer\",\r\n  \"Grades_Avg_Subject_Title\": \"Gjennomsnitt per fag\",\r\n  \"Grades_Avg_Subject_Short\": \"Fagsnitt\",\r\n  \"Grades_Avg_Subject_Description\": \"Beregner vektet gjennomsnitt av fagsnittene\",\r\n  \"Grades_Avg_Median_Title\": \"Median\",\r\n  \"Grades_Avg_Median_Short\": \"Median\",\r\n\r\n  \"Grades_Avg_More\": \"Lær mer\",\r\n  \"Grades_Avg_KnowMore\": \"Lær mer\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Forstå metodene for beregning av gjennomsnittskarakter\",\r\n\r\n  \"Grades_SubjectInfo\": \"Informasjon om faget\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} karakter(er)\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Elevens snitt\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistikk\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Klassens snitt\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Samlet gjennomsnitt for klassen\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Høyeste snitt\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Beste gjennomsnitt i gruppen\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Laveste snitt\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Laveste gjennomsnitt i gruppen\",\r\n\r\n  \"Grades_Semester\": \"Termin\",\r\n  \"Grades_Trimester\": \"Trimester\",\r\n  \"Grades_OutPeriod\": \"Utenfor termin\",\r\n  \"Grades_Year\": \"År\",\r\n  \"Grades_MockExamBac\": \"Tentamen\",\r\n  \"Grades_MockExamBrevet\": \"Prøveeksamen\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Alle fag\",\r\n  \"Grades_Method_Weighted\": \"Vekting\",\r\n\r\n  \"Grades_Sort\": \"Sorter\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabetisk\",\r\n  \"Grades_Sorting_Averages\": \"Gjennomsnitt\",\r\n  \"Grades_Sorting_Date\": \"Dato\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Sortering etter\",\r\n  \"Grades_Menu_AverageBy\": \"Snitt etter\",\r\n  \"NoAverage\": \"Inget snitt\",\r\n\r\n  \"Grades_Empty_Title\": \"Ingen karakterer\",\r\n  \"Grades_Empty_Description\": \"Du har ikke fått noen karakterer i denne perioden ennå.\",\r\n\r\n  \"Grade_NoDescription\": \"Oppgave i {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Fag\",\r\n  \"Grades_Tab_Latest\": \"Nye karakterer\",\r\n\r\n  \"Profile_Attendance_Title\": \"Oppmøte\",\r\n  \"Profile_Attendance_Denominator_Single\": \"fravær\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"fravær\",\r\n\r\n  \"Profile_Discussions_Title\": \"Diskusjoner\",\r\n  \"Profile_Discussions_Denominator_Single\": \"ulest\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"uleste\",\r\n\r\n  \"Profile_News_Title\": \"Nyheter\",\r\n  \"Profile_News_Denominator_Single\": \"ny\",\r\n  \"Profile_News_Denominator_Plural\": \"nye\",\r\n  \"Profile_News_Open\": \"Åpne\",\r\n  \"Profile_News_Loading_Title\": \"Laster nyheter...\",\r\n  \"Profile_News_Author_Unknown\": \"Ukjent forfatter\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-kode og kort\",\r\n\r\n  \"Modal_Grades_Title\": \"Karakterdetaljer\",\r\n  \"Modal_Grades_BestGrade\": \"Beste karakter i gruppen\",\r\n\r\n  \"Grades_Details_Title\": \"Detaljer\",\r\n  \"Grades_NormalizedGrade_Title\": \"Karakter omregnet til 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Karakterverdien konvertert til en skala på 20\",\r\n  \"Grades_HighestGrade_Title\": \"Høyeste karakter\",\r\n  \"Grades_HighestGrade_Description\": \"Maksimal karakter oppnådd i gruppen\",\r\n  \"Grades_LowestGrade_Title\": \"Laveste karakter\",\r\n  \"Grades_LowestGrade_Description\": \"Laveste karakter oppnådd i gruppen\",\r\n  \"Grades_Influence_Title\": \"Påvirkning\",\r\n  \"Grades_Avg_Group_Title\": \"Gruppens snitt\",\r\n  \"Grades_Coefficient\": \"Koeffisient\",\r\n  \"Grades_Avg_Group_Short\": \"Gruppesnitt\",\r\n  \"Grades_Tab_Rank\": \"Rangering\",\r\n  \"Grades_Tab_Rank_Description\": \"Posisjon i gruppen\",\r\n\r\n  \"News_Search_Placeholder\": \"Søk etter nyhet\",\r\n  \"News_Empty_Title\": \"Ingen nyheter\",\r\n  \"News_Empty_Description\": \"Ingen nyheter funnet for skolen din.\",\r\n  \"News_Search_NoResults\": \"Ingen nyheter funnet\",\r\n  \"News_Search_NoResults_Description\": \"Ingen nyheter samsvarte med søket ditt.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Et mykt og elegant tema\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Lesing\",\r\n  \"News_Theme_Reading_Description\": \"Et tema designet for lesing\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Tapte timer\",\r\n  \"Attendance_Hours_Unjustified\": \"Ugyldig fravær\",\r\n  \"Attendance_Missing\": \"Fravær\",\r\n  \"Attendance_Delays\": \"Forsinkelser\",\r\n  \"Attendance_NoReason\": \"Ingen grunn oppgitt\",\r\n  \"Attendance_NoEvent_Title\": \"Ingen hendelser\",\r\n  \"Attendance_NoEvent_Description\": \"Ingen fravær eller forsinkelser registrert for denne perioden.\",\r\n\r\n  \"Settings_Account_Title\": \"Min konto\",\r\n  \"Settings_Account_Description\": \"Min konto\",\r\n  \"Settings_Services_Title\": \"Tilknyttede kontoer\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Sist brukte konto\",\r\n  \"Settings_Notifications_Title\": \"Varslinger\",\r\n  \"Settings_Notifications_Description\": \"Varsler, frekvens...\",\r\n  \"Settings_Subjects_Title\": \"Fag\",\r\n  \"Settings_Subjects_Description\": \"Navn, farge, skrifttype...\",\r\n  \"Settings_Personalization_Title\": \"Personlig tilpasning\",\r\n  \"Settings_Personalization_Description\": \"Temaer, farger...\",\r\n  \"Settings_Cards_Title\": \"Kort\",\r\n  \"Settings_Cards_Description\": \"Kantine, tilgang...\",\r\n  \"Settings_Accessibility_Title\": \"Tilgjengelighet\",\r\n  \"Settings_Accessibility_Description\": \"Skjerm, lyd...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Smarte funksjoner\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI-funksjoner\",\r\n  \"Settings_MagicPlus_Enable\": \"Aktiver Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimaliserer automatisk organiseringen av oppgavene dine for å forbedre produktiviteten\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Helt lokal modell, ingen data sendes ut av enheten din\",\r\n  \"Settings_Donate_Title\": \"Doner\",\r\n  \"Settings_Donate_Description\": \"Støtt prosjektet\",\r\n  \"Settings_Telemetry_Title\": \"Telemetri og personvern\",\r\n  \"Settings_Telemetry_Description\": \"Administrer innsamlede data\",\r\n  \"Settings_About_Title\": \"Om appen\",\r\n  \"Settings_About_Description\": \"Versjon\",\r\n  \"Settings_Logout_Title\": \"Logg ut\",\r\n  \"Settings_Logout_Description\": \"Fjern denne kontoen fra Papillon\",\r\n  \"Settings_Language_Title\": \"Språk\",\r\n  \"Settings_Language_Description\": \"Bytt språk\",\r\n  \"Settings_Tabs_Title\": \"Faner\",\r\n  \"Settings_Tabs_Description\": \"Skjul faner fra menyen\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personlig tilpasning\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Temaer, fag...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Tilpass fag\",\r\n  \"Settings_Personalization_Accent\": \"Uthevingsfarge\",\r\n  \"Settings_Personalization_Accent_Description\": \"Fargen du velger her vil bli brukt på Papillons startside.\",\r\n  \"Settings_Personalization_Theme\": \"Tema\",\r\n  \"Settings_Personalization_Icon_Title\": \"Bytt ikon\",\r\n  \"Settings_Personalization_Icon_Description\": \"Tilpass appens ikon\",\r\n  \"Settings_Personalization_Subject_Title\": \"Tilpass fag\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Fag\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikoner, farger\",\r\n  \"Settings_About_Papillion_Behind\": \"Bak Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon vedlikeholdes av 100 % frivillige studenter\",\r\n  \"Settings_About_Discord\": \"Discord-server\",\r\n  \"Settings_About_Discord_Description\": \"Bli med i Discord-serveren\",\r\n  \"Settings_About_Crowdin\": \"Crowdin-prosjekt\",\r\n  \"Settings_About_Crowdin_Description\": \"Hjelp til med å oversette Papillon\",\r\n  \"Settings_About_Github\": \"GitHub-prosjekt\",\r\n  \"Settings_About_Github_Description\": \"Bidra til prosjektet på GitHub\",\r\n  \"Settings_About_Issue\": \"Rapporter en feil\",\r\n  \"Settings_About_Issue_Description\": \"Rapporter et problem du har oppdaget\",\r\n  \"Settings_About_Dependency_Version\": \"Versjon av avhengigheter\",\r\n\r\n  \"Alert_No_Technical\": \"Ingen teknisk informasjon tilgjengelig.\",\r\n  \"Alert_Auth_Error\": \"Godkjenningsfeil\",\r\n  \"Alert_Auth_Bad_Creds\": \"Opplysningene du skrev inn er feil, eller du prøver å logge inn med en foreldrekonto. Denne kontotypen støttes ikke av Papillon ennå.\",\r\n  \"Alert_Not_Supported\": \"Instansen støttes ikke\",\r\n  \"Alert_Security_Instance_HTTP\": \"Av sikkerhetsgrunner godtar ikke Papillon instanser som fortsatt bruker HTTP-protokollen. Vi anbefaler at du informerer skoleledelsen slik at de kan oppdatere instansen.\",\r\n  \"Alert_NoDemo\": \"Papillon er ikke bygget for å fungere med demo-instanser, vennligst bruk en ekte konto.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon kan ikke hente informasjon fra denne PRONOTE-instansen, er den fortsatt gyldig?\",\r\n  \"Alert_No_Pos\": \"Kunne ikke hente posisjon\",\r\n  \"Alert_Connexion_Fail\": \"Tilkobling ikke mulig\",\r\n\r\n  \"Feature_Limited\": \"Begrensede funksjoner\",\r\n  \"Feature_Soon\": \"Det kommer snart!\",\r\n  \"Feature_Soon_Notification\": \"Vi jobber hardt for å tilby deg denne funksjonen i en fremtidig oppdatering.\",\r\n  \"Feature_Add_Card\": \"Legg til et nytt kort fra Profil-fanen i navigasjonslinjen\",\r\n\r\n  \"Webview_Wait\": \"Litt tålmodighet...\",\r\n\r\n  \"Profile_QRCards\": \"QR-kode og kort\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} kort\",\r\n  \"Profile_Cards_Loading_History\": \"Laster transaksjonshistorikk\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Dette kan ta et øyeblikk...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kort\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Kantine, tilgang\",\r\n  \"Settings_Cards_Banner_Description\": \"Legg til kantinekortene og reisekortene dine for å få tilgang til dem overalt fra telefonen din i Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Ingen kort\",\r\n  \"Settings_Cards_Add_Button\": \"Legg til\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Legg til ett for å se kantinesaldoen din, skanne QR-koden din og mer\",\r\n  \"Settings_Subjects_None_Title\": \"Ingen fag\",\r\n  \"Settings_Subjects_None_Description\": \"Bla gjennom appens ulike faner for å kunne tilpasse fagene.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Nullstill\",\r\n  \"Settings_Subjects_Reset_Message\": \"Vil du virkelig nullstille alle fag?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Nullstill\",\r\n\r\n  \"Settings_Donator\": \"Donorer\",\r\n  \"Settings_Donator_Description\": \"Se listen over donorer\",\r\n  \"Settings_App_Version\": \"App-versjon\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Rett QR-koden mot terminalens skanner\",\r\n  \"Profile_Cards_No_Reservation\": \"Ingen reservasjon\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Det ser ut til at du ikke kan reservere denne dagen.\",\r\n  \"Profile_Cards_History\": \"Historikk\",\r\n  \"Magic_Important\": \"Kan være viktig\",\r\n\r\n  \"OnBoarding_Step\": \"Steg \",\r\n  \"OnBoarding_Step_Of\": \"av \",\r\n\r\n  \"Consent_Advanced_Title\": \"Jeg vil hjelpe Papillon\",\r\n  \"Consent_Advanced_Description\": \"Vi samler inn mer detaljert informasjon om din bruk.\",\r\n  \"Consent_Required_Title\": \"Kun det nødvendige\",\r\n  \"Consent_Required_Description\": \"Kort sagt: Vite at noen brukte Papillon, om det gikk bra og hvilken tjeneste som brukes.\",\r\n  \"Consent_None_Title\": \"Ingenting i det hele tatt\",\r\n  \"Consent_None_Description\": \"Vi vil ikke engang vite at du eksisterer.\",\r\n  \"Consent_Title\": \"Du og Papillon\",\r\n  \"Consent_Intro1\": \"For å hjelpe Papillon med å vokse, kan du velge å dele viss bruksinformasjon.\",\r\n  \"Consent_PrivacyPolicy\": \"Hvis du er usikker, les vår personvernerklæring\",\r\n  \"Consent_Refuse\": \"Avslå\",\r\n  \"Consent_Accept\": \"Godta\",\r\n  \"Consent_ChangeMind\": \"Du kan endre mening når som helst i appens innstillinger.\",\r\n  \"Consent_Arg1\": \"Brukes kun til å forbedre appen\",\r\n  \"Consent_Arg2\": \"Anonymt og ikke knyttet til din identitet\",\r\n  \"Consent_Arg3\": \"Vi har ikke tilgang til dine kontoer\",\r\n\r\n  \"Changelog_Title\": \"Versjonsnyheter\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Innleveringsfrist\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Fag\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Ikke ferdig\",\r\n  \"Tasks_ThisWeek\": \"Denne uken\",\r\n\r\n  \"Task_Undone\": \"Ikke ferdig\",\r\n  \"Task_Done\": \"Ferdig\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Tilpass bakgrunn\",\r\n  \"Modal_Profile_Title\": \"Tilpass profil\",\r\n\r\n  \"Modal_Task_Status\": \"Oppgavestatus\",\r\n  \"Modal_Task_Description\": \"Oppgavebeskrivelse\",\r\n  \"Modal_Task_Attachments\": \"Vedlegg\",\r\n\r\n  \"Today\": \"I dag\",\r\n  \"Yesterday\": \"I går\",\r\n  \"Tomorrow\": \"I morgen\"\r\n}"
  },
  {
    "path": "locales/pl.json",
    "content": "{\r\n  \"Global_Back\": \"Powrót\",\r\n  \"Global_DatePrefix\": \" \",\r\n\r\n  \"Tab_Home\": \"Start\",\r\n  \"Tab_Calendar\": \"Lekcje\",\r\n  \"Tab_Tasks\": \"Zadania\",\r\n  \"Tab_Grades\": \"Oceny\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Edytuj mój profil\",\r\n  \"Button_Change_ProfilePicture\": \"Zmień zdjęcie profilowe\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Zrób zdjęcie\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Z biblioteki zdjęć\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Pobierz z systemu szkolnego\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Usuń zdjęcie\",\r\n  \"Tab_Page\": \"Strona\",\r\n  \"Tab_Settings\": \"Ustawienia\",\r\n  \"Tab_News\": \"Aktualności\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Aplikacja do zarządzania Twoim życiem szkolnym\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Połącz swoje aplikacje szkolne, aby uzyskać dostęp do ocen, lekcji, zadań domowych i wielu innych funkcji w interfejsie Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Zacznij\",\r\n  \"ONBOARDING_HELP_BTN\": \"Potrzebujesz pomocy?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Serwis uniwersytecki\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Serwis gastronomiczny\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Wybierz swój serwis szkolny\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Wybierz swój serwis gastronomiczny\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Wybierz swój serwis uniwersytecki\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Jak chcesz się zalogować?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Użyj mojej lokalizacji\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Wyszukaj miasto\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Mam kod QR\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Mam adres URL logowania\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Wybierz swoją szkołę\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Wpisz nazwę miasta i wybierz swoją szkołę\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Zaloguj się tak, jak zwykle\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Zaloguj się na swoje konto\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Wybierz hosta przypisanego do konta\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Wpisz 4-cyfrowy kod, który właśnie utworzyłeś w PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Logowanie do\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Zeskanuj kod QR swojej szkoły, aby się połączyć.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Weryfikacja kodu QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"To może zająć chwilę...\",\r\n  \"ONBOARDING_URL\": \"Podaj adres URL swojej szkoły\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"Adres URL Twojej instancji PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Zanim skończysz\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Wybierz\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"kolor motywu\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Wpisz kod PIN do swojego PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"Ładujemy stronę Twojej szkoły\",\r\n  \"INPUT_PIN\": \"Kod PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Szukaj instancji...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Logowanie w toku...\",\r\n\r\n  \"WAITING\": \"Oczekiwanie\",\r\n  \"IZLY_SMS_SEND\": \"Właśnie otrzymałeś link do logowania, kliknij go i postępuj zgodnie z instrukcjami.\",\r\n  \"STEP\": \"Krok\",\r\n  \"STEP_OUTOF\": \"z\",\r\n  \"INPUT_USERNAME\": \"Nazwa użytkownika\",\r\n  \"INPUT_MAIL\": \"Adres e-mail\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Adres e-mail lub nazwa użytkownika\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Numer telefonu lub adres e-mail\",\r\n  \"INPUT_PASSWORD\": \"Hasło\",\r\n  \"INPUT_PASSWORD_CODE\": \"Kod dostępu\",\r\n  \"INPUT_ETABID\": \"Identyfikator Twojej szkoły\",\r\n  \"LOGIN_BTN\": \"Zaloguj się\",\r\n  \"CONFIRM_BTN\": \"Potwierdź\",\r\n  \"CANCEL_BTN\": \"Anuluj\",\r\n\r\n  \"Tab_New_Event\": \"Nowe wydarzenie\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Zarządzanie iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Zarządzaj swoimi adresami URL iCal\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Dodaj adres URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Zarządzaj {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Dodaj lub usuń adresy URL iCal, aby zsynchronizować je z kalendarzem.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Brak tytułu\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Nadaj nazwę temu adresowi URL iCal, aby go dodać.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Nie dodano żadnych adresów URL iCal\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Ta karta jest w przygotowaniu.\",\r\n  \"TabUnderConstruction_Details\": \"Wróć później, aby sprawdzić aktualizacje.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Tryb Deweloperski\",\r\n  \"TabDevModeNotice_Details\": \"Pełne środowisko testowe dla programistów.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Szczegóły techniczne\",\r\n\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Ocena / Sprawdzian\",\r\n  \"Edited_Course\": \"Lekcja zmieniona\",\r\n  \"Canceled_Course\": \"Lekcja odwołana\",\r\n  \"No_Course_Room\": \"Sala nieznana\",\r\n  \"Event_DeleteEvent\": \"Usuń wydarzenie\",\r\n  \"Event_Confirm_DeleteEvent\": \"Czy na pewno chcesz usunąć to wydarzenie?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Przerwa obiadowa\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Smacznego!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Mniam!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Przerwa poranna\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Czas na spanko!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Śniadanie\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Przerwa popołudniowa\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Czas na przerwę!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Czas na podwieczorek!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Przerwa nocna\",\r\n  \"Course_Separator_Night_Alt_1\": \"Czas na spanko!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Jest noc!\",\r\n\r\n  \"Context_Delete\": \"Usuń\",\r\n  \"Context_Cancel\": \"Anuluj\",\r\n  \"Context_Edit\": \"Edytuj\",\r\n  \"Context_Add\": \"Dodaj\",\r\n\r\n  \"Form_Title\": \"Tytuł\",\r\n  \"Form_Location\": \"Lokalizacja\",\r\n  \"Form_Organizer\": \"Organizator\",\r\n  \"Form_Start\": \"Początek\",\r\n  \"Form_End\": \"Koniec\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Czy na pewno chcesz usunąć to wydarzenie?\",\r\n\r\n  \"Home_Welcome_Name\": \"Cześć, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Pokaż więcej\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"dostępne\",\r\n  \"Home_Chats_Plurial\": \"rozmowy\",\r\n  \"Home_Chats_Singular\": \"rozmowa\",\r\n  \"Home_See_All_Tasks\": \"Zobacz wszystkie zadania\",\r\n  \"Home_Welcome\": \"Dzień dobry!\",\r\n  \"Home_Planned_None\": \"Nie masz więcej zaplanowanych lekcji na dziś\",\r\n  \"Home_Planned_One\": \"Została Ci dzisiaj jedna lekcja\",\r\n  \"Home_Planned_Number\": \"Zostało Ci dzisiaj {{number}} lekcji\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Następne lekcje\",\r\n  \"Home_Widget_NewGrades\": \"Nowe oceny\",\r\n  \"Home_Widget_NewHomeworks\": \"Zadania do zrobienia\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Brak nadchodzących lekcji\",\r\n  \"Home_Widget_NoCourses_Description\": \"Nie ma zaplanowanych lekcji na dziś.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Karty\",\r\n  \"Home_Cards_Button_Description_None\": \"Brak kart\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Jedna karta\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} karty/kart\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Wiadomości\",\r\n  \"Home_Chats_Button_Description_None\": \"Brak wiadomości\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Jedna wiadomość\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} wiadomości\",\r\n\r\n  \"Home_Attendance_Title\": \"Nieobecności\",\r\n  \"Home_Attendance_Button_Description_None\": \"Brak nieobecności\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Jedna nieobecność\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} nieobecności\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Menu\",\r\n  \"Home_Menu_Button_Description\": \"Menu na dziś\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Nie znaleziono wydarzeń\",\r\n  \"Tab_Calendar_Empty_Description\": \"Dodaj wydarzenie lub zsynchronizuj kalendarz, aby zacząć.\",\r\n\r\n  \"Modal_Course_Title\": \"Moja lekcja\",\r\n  \"Modal_Course_StartsIn\": \"Zaczyna się za\",\r\n  \"Modal_Course_StartedAgo\": \"Zakończono\",\r\n  \"Modal_Course_Ongoing\": \"Trwa od\",\r\n  \"Modal_Course_Group\": \"Grupa\",\r\n  \"Modal_Course_Group_Full\": \"Klasa\",\r\n\r\n  \"Modal_Course_Details\": \"Szczegóły lekcji\",\r\n  \"Modal_Course_Teacher\": \"Nauczyciel\",\r\n  \"Modal_Course_Room\": \"Sala\",\r\n  \"Modal_Course_Duration\": \"Czas trwania\",\r\n\r\n  \"Modal_Course_Time\": \"Godziny lekcji\",\r\n  \"Modal_Course_Start\": \"Początek\",\r\n  \"Modal_Course_End\": \"Koniec\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Szukaj zadań\",\r\n  \"Tasks_LeftHomeworks_Title\": \"pozostałe zadania\",\r\n  \"Tasks_LeftHomeworks_Time\": \"w tym tygodniu\",\r\n  \"Tasks_Done_AllTasks\": \"Wszystkie zadania\",\r\n  \"Tasks_Done_CompletedTasks\": \"zostały ukończone\",\r\n  \"Tasks_Nav_Left\": \"Jeszcze {{count}} zadania do zrobienia\",\r\n  \"Tasks_Nav_One\": \"Tylko jedno zadanie do zrobienia\",\r\n  \"Tasks_Nav_Completed\": \"Wszystko gotowe!\",\r\n  \"Tasks_Week\": \"Tydzień\",\r\n  \"Tasks_NoTasks_Title\": \"Brak zadań\",\r\n  \"Tasks_NoTasks_Description\": \"Nie ma zaplanowanych zadań na ten tydzień. Odpocznij!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"na tydzień {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Brak zadań\",\r\n  \"Task_Start\": \"Do zrobienia\",\r\n  \"Task_Complete\": \"Ukończone\",\r\n  \"Task_Sorting_Title\": \"Sortuj według\",\r\n  \"Task_OnlyShowUndone\": \"Zadania ukończone\",\r\n  \"Task_Show_Title\": \"Pokaż\",\r\n  \"Settings_General\": \"Ogólne\",\r\n\r\n  \"Latest_Grades\": \"Nowe oceny\",\r\n  \"Grades_Search_Placeholder\": \"Szukaj oceny, przedmiotu\",\r\n\r\n  \"Grades_Avg_Methods\": \"Metody obliczeń\",\r\n  \"Grades_Avg_All_Title\": \"Średnia ogólna\",\r\n  \"Grades_Avg_All_Short\": \"Śr. ogólna\",\r\n  \"Grades_Avg_All_Pond\": \"Średnia ważona\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Śr. ważona\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Oblicza średnią ważoną wszystkich ocen\",\r\n  \"Grades_Avg_Subject_Title\": \"Średnia z przedmiotów\",\r\n  \"Grades_Avg_Subject_Short\": \"Śr. przedmiotowa\",\r\n  \"Grades_Avg_Subject_Description\": \"Oblicza średnią ważoną ze średnich przedmiotowych\",\r\n  \"Grades_Avg_Median_Title\": \"Mediana\",\r\n  \"Grades_Avg_Median_Short\": \"Mediana\",\r\n\r\n  \"Grades_Avg_More\": \"Dowiedz się więcej\",\r\n  \"Grades_Avg_KnowMore\": \"Dowiedz się więcej\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Zrozum metody obliczania średniej ogólnej\",\r\n\r\n  \"Grades_SubjectInfo\": \"Informacje o przedmiocie\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} ocen(y)\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Średnia ucznia\",\r\n  \"SubjectInfo_Stats_Header\": \"Statystyki\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Średnia klasy\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Ogólna średnia klasy\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Najwyższa średnia\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Najlepsza średnia w grupie\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Najniższa średnia\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Najniższa średnia w grupie\",\r\n\r\n  \"Grades_Semester\": \"Semestr\",\r\n  \"Grades_Trimester\": \"Trymestr\",\r\n  \"Grades_OutPeriod\": \"Poza okresem\",\r\n  \"Grades_Year\": \"Rok\",\r\n  \"Grades_MockExamBac\": \"Próbna matura\",\r\n  \"Grades_MockExamBrevet\": \"Próbny egzamin ósmoklasisty\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Wszystkie przedmioty\",\r\n  \"Grades_Method_Weighted\": \"Waga\",\r\n\r\n  \"Grades_Sort\": \"Sortuj\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabetycznie\",\r\n  \"Grades_Sorting_Averages\": \"Średnie\",\r\n  \"Grades_Sorting_Date\": \"Data\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Sortowanie według\",\r\n  \"Grades_Menu_AverageBy\": \"Średnia według\",\r\n  \"NoAverage\": \"Brak średniej\",\r\n\r\n  \"Grades_Empty_Title\": \"Brak ocen\",\r\n  \"Grades_Empty_Description\": \"Nie otrzymałeś jeszcze żadnej oceny w tym okresie.\",\r\n\r\n  \"Grade_NoDescription\": \"Zadanie z przedmiotu {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Przedmioty\",\r\n  \"Grades_Tab_Latest\": \"Nowe oceny\",\r\n\r\n  \"Profile_Attendance_Title\": \"Frekwencja\",\r\n  \"Profile_Attendance_Denominator_Single\": \"nieobecność\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"nieobecności\",\r\n\r\n  \"Profile_Discussions_Title\": \"Wiadomości\",\r\n  \"Profile_Discussions_Denominator_Single\": \"nieprzeczytane\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"nieprzeczytane\",\r\n\r\n  \"Profile_News_Title\": \"Aktualności\",\r\n  \"Profile_News_Denominator_Single\": \"nowa\",\r\n  \"Profile_News_Denominator_Plural\": \"nowe\",\r\n  \"Profile_News_Open\": \"Otwórz\",\r\n  \"Profile_News_Loading_Title\": \"Ładowanie aktualności...\",\r\n  \"Profile_News_Author_Unknown\": \"Nieznany autor\",\r\n\r\n  \"Profile_Cards_Title\": \"Kod QR i karty\",\r\n\r\n  \"Modal_Grades_Title\": \"Szczegóły oceny\",\r\n  \"Modal_Grades_BestGrade\": \"Najlepsza ocena w grupie\",\r\n\r\n  \"Grades_Details_Title\": \"Szczegóły\",\r\n  \"Grades_NormalizedGrade_Title\": \"Ocena w skali 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Wartość oceny przeliczona na skalę 20\",\r\n  \"Grades_HighestGrade_Title\": \"Najwyższa ocena\",\r\n  \"Grades_HighestGrade_Description\": \"Maksymalna ocena uzyskana w grupie\",\r\n  \"Grades_LowestGrade_Title\": \"Najniższa ocena\",\r\n  \"Grades_LowestGrade_Description\": \"Minimalna ocena uzyskana w grupie\",\r\n  \"Grades_Influence_Title\": \"Wpływ\",\r\n  \"Grades_Avg_Group_Title\": \"Średnia grupy\",\r\n  \"Grades_Coefficient\": \"Współczynnik (Waga)\",\r\n  \"Grades_Avg_Group_Short\": \"Śr. grupy\",\r\n  \"Grades_Tab_Rank\": \"Ranking\",\r\n  \"Grades_Tab_Rank_Description\": \"Pozycja w grupie\",\r\n\r\n  \"News_Search_Placeholder\": \"Szukaj aktualności\",\r\n  \"News_Empty_Title\": \"Brak aktualności\",\r\n  \"News_Empty_Description\": \"Nie znaleziono aktualności w Twojej szkole.\",\r\n  \"News_Search_NoResults\": \"Nie znaleziono aktualności\",\r\n  \"News_Search_NoResults_Description\": \"Nie znaleziono aktualności dla Twojego wyszukiwania.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Miękki i elegancki motyw\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Czytanie\",\r\n  \"News_Theme_Reading_Description\": \"Motyw zaprojektowany do czytania\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Opuszczone godziny\",\r\n  \"Attendance_Hours_Unjustified\": \"Nieusprawiedliwione godziny\",\r\n  \"Attendance_Missing\": \"Nieobecności\",\r\n  \"Attendance_Delays\": \"Spóźnienia\",\r\n  \"Attendance_NoReason\": \"Brak powodu\",\r\n  \"Attendance_NoEvent_Title\": \"Brak zdarzeń\",\r\n  \"Attendance_NoEvent_Description\": \"Brak zarejestrowanych nieobecności lub spóźnień w tym okresie.\",\r\n\r\n  \"Settings_Account_Title\": \"Moje konto\",\r\n  \"Settings_Account_Description\": \"Zarządzanie kontem\",\r\n  \"Settings_Services_Title\": \"Połączone konta\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Ostatnio używane konto\",\r\n  \"Settings_Notifications_Title\": \"Powiadomienia\",\r\n  \"Settings_Notifications_Description\": \"Alerty, częstotliwość...\",\r\n  \"Settings_Subjects_Title\": \"Przedmioty\",\r\n  \"Settings_Subjects_Description\": \"Nazwa, kolor, czcionka...\",\r\n  \"Settings_Personalization_Title\": \"Personalizacja\",\r\n  \"Settings_Personalization_Description\": \"Motywy, kolory...\",\r\n  \"Settings_Cards_Title\": \"Karty\",\r\n  \"Settings_Cards_Description\": \"Stołówka, dostęp...\",\r\n  \"Settings_Accessibility_Title\": \"Dostępność\",\r\n  \"Settings_Accessibility_Description\": \"Wyświetlanie, dźwięk...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Inteligentne funkcje\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Funkcje AI\",\r\n  \"Settings_MagicPlus_Enable\": \"Włącz Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Automatycznie optymalizuje organizację zadań, aby poprawić wydajność\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Model całkowicie lokalny, żadne dane nie są przesyłane poza Twoje urządzenie\",\r\n  \"Settings_Donate_Title\": \"Przekaż darowiznę\",\r\n  \"Settings_Donate_Description\": \"Wesprzyj projekt\",\r\n  \"Settings_Telemetry_Title\": \"Telemetria i prywatność\",\r\n  \"Settings_Telemetry_Description\": \"Zarządzaj zbieranymi danymi\",\r\n  \"Settings_About_Title\": \"O aplikacji\",\r\n  \"Settings_About_Description\": \"Wersja\",\r\n  \"Settings_Logout_Title\": \"Wyloguj się\",\r\n  \"Settings_Logout_Description\": \"Usuń to konto z Papillon\",\r\n  \"Settings_Language_Title\": \"Język\",\r\n  \"Settings_Language_Description\": \"Zmień język\",\r\n  \"Settings_Tabs_Title\": \"Karty\",\r\n  \"Settings_Tabs_Description\": \"Ukryj karty z menu\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personalizacja\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Motywy, przedmioty...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Personalizuj przedmioty\",\r\n  \"Settings_Personalization_Accent\": \"Kolor akcentu\",\r\n  \"Settings_Personalization_Accent_Description\": \"Wybrany tutaj kolor zostanie zastosowany na stronie głównej Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Motyw\",\r\n  \"Settings_Personalization_Icon_Title\": \"Zmień ikonę\",\r\n  \"Settings_Personalization_Icon_Description\": \"Spersonalizuj ikonę aplikacji\",\r\n  \"Settings_Personalization_Subject_Title\": \"Personalizuj przedmioty\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Przedmioty\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikony, kolory\",\r\n  \"Settings_About_Papillion_Behind\": \"Kto stoi za Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon jest utrzymywany przez 100% wolontariuszy-studentów\",\r\n  \"Settings_About_Discord\": \"Serwer Discord\",\r\n  \"Settings_About_Discord_Description\": \"Dołącz do serwera Discord\",\r\n  \"Settings_About_Crowdin\": \"Projekt Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Pomóż w tłumaczeniu Papillon\",\r\n  \"Settings_About_Github\": \"Projekt GitHub\",\r\n  \"Settings_About_Github_Description\": \"Wnieś wkład do projektu na GitHub\",\r\n  \"Settings_About_Issue\": \"Zgłoś błąd\",\r\n  \"Settings_About_Issue_Description\": \"Zgłoś napotkany błąd\",\r\n  \"Settings_About_Dependency_Version\": \"Wersja zależności\",\r\n\r\n  \"Alert_No_Technical\": \"Brak dostępnych informacji technicznych.\",\r\n  \"Alert_Auth_Error\": \"Błąd uwierzytelniania\",\r\n  \"Alert_Auth_Bad_Creds\": \"Wprowadzone dane są nieprawidłowe lub próbujesz zalogować się za pomocą konta rodzica. Ten typ konta nie jest jeszcze obsługiwany przez Papillon.\",\r\n  \"Alert_Not_Supported\": \"Instancja nieobsługiwana\",\r\n  \"Alert_Security_Instance_HTTP\": \"Ze względów bezpieczeństwa Papillon nie akceptuje instancji nadal korzystających z protokołu HTTP. Zalecamy poinformowanie dyrektora szkoły, aby zaktualizował instancję w celu zapewnienia bezpieczeństwa.\",\r\n  \"Alert_NoDemo\": \"Papillon nie jest przeznaczony do pracy z instancjami demonstracyjnymi, proszę użyć innej instancji.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon nie może pobrać informacji z tej instancji PRONOTE, czy jest ona nadal ważna?\",\r\n  \"Alert_No_Pos\": \"Nie można pobrać lokalizacji\",\r\n  \"Alert_Connexion_Fail\": \"Połączenie niemożliwe\",\r\n\r\n  \"Feature_Limited\": \"Ograniczone funkcje\",\r\n  \"Feature_Soon\": \"Już wkrótce!\",\r\n  \"Feature_Soon_Notification\": \"Ciężko pracujemy, aby udostępnić tę funkcję w przyszłej aktualizacji.\",\r\n  \"Feature_Add_Card\": \"Dodaj nową kartę z karty Profil dostępnej na pasku nawigacyjnym\",\r\n\r\n  \"Webview_Wait\": \"Chwila cierpliwości...\",\r\n\r\n  \"Profile_QRCards\": \"Kod QR i karty\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} karty/kart\",\r\n  \"Profile_Cards_Loading_History\": \"Ładowanie historii transakcji\",\r\n  \"Profile_Cards_Loading_History_Description\": \"To może chwilę potrwać...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Karty\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Stołówka, dostęp\",\r\n  \"Settings_Cards_Banner_Description\": \"Dodaj swoje karty stołówkowe i transportowe, aby mieć do nich dostęp w dowolnym miejscu z telefonu w Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Brak kart\",\r\n  \"Settings_Cards_Add_Button\": \"Dodaj\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Dodaj kartę, aby sprawdzić saldo stołówki, zeskanować kod QR i wiele więcej\",\r\n  \"Settings_Subjects_None_Title\": \"Brak przedmiotów\",\r\n  \"Settings_Subjects_None_Description\": \"Przejrzyj różne karty aplikacji, aby móc spersonalizować przedmioty.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Resetuj\",\r\n  \"Settings_Subjects_Reset_Message\": \"Czy na pewno chcesz zresetować wszystkie przedmioty?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Resetuj\",\r\n\r\n  \"Settings_Donator\": \"Darczyńcy\",\r\n  \"Settings_Donator_Description\": \"Zobacz listę darczyńców\",\r\n  \"Settings_App_Version\": \"Wersja aplikacji\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Skieruj kod QR w stronę skanera w terminalu\",\r\n  \"Profile_Cards_No_Reservation\": \"Brak rezerwacji\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Wygląda na to, że nie możesz dokonać rezerwacji w tym dniu.\",\r\n  \"Profile_Cards_History\": \"Historia\",\r\n  \"Magic_Important\": \"Może być ważne\",\r\n\r\n  \"OnBoarding_Step\": \"Krok \",\r\n  \"OnBoarding_Step_Of\": \"z \",\r\n\r\n  \"Consent_Advanced_Title\": \"Chcę pomóc Papillon\",\r\n  \"Consent_Advanced_Description\": \"Zbieramy bardziej szczegółowe informacje o Twoim użytkowaniu.\",\r\n  \"Consent_Required_Title\": \"Tylko to, co niezbędne\",\r\n  \"Consent_Required_Description\": \"W skrócie: wiedzieć, że ktoś korzystał z Papillon, czy wszystko poszło dobrze i z jakiego serwisu korzysta.\",\r\n  \"Consent_None_Title\": \"Zupełnie nic\",\r\n  \"Consent_None_Description\": \"Nawet nie będziemy wiedzieć o Twoim istnieniu.\",\r\n  \"Consent_Title\": \"Ty i Papillon\",\r\n  \"Consent_Intro1\": \"Aby pomóc Papillon rosnąć, możesz zdecydować się na udostępnienie kilku informacji o użytkowaniu.\",\r\n  \"Consent_PrivacyPolicy\": \"W razie wątpliwości zapoznaj się z naszą polityką prywatności\",\r\n  \"Consent_Refuse\": \"Odmów\",\r\n  \"Consent_Accept\": \"Akceptuj\",\r\n  \"Consent_ChangeMind\": \"Możesz zmienić zdanie w dowolnym momencie w ustawieniach aplikacji.\",\r\n  \"Consent_Arg1\": \"Służy wyłącznie do ulepszania aplikacji\",\r\n  \"Consent_Arg2\": \"Anonimowe i niepowiązane z Twoją tożsamością\",\r\n  \"Consent_Arg3\": \"Nie mamy dostępu do Twoich kont\",\r\n\r\n  \"Changelog_Title\": \"Informacje o wydaniu\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Termin oddania\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Przedmioty\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Nieukończone\",\r\n  \"Tasks_ThisWeek\": \"W tym tygodniu\",\r\n\r\n  \"Task_Undone\": \"Nieukończone\",\r\n  \"Task_Done\": \"Ukończone\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Spersonalizuj tapetę\",\r\n  \"Modal_Profile_Title\": \"Spersonalizuj profil\",\r\n\r\n  \"Modal_Task_Status\": \"Status zadania\",\r\n  \"Modal_Task_Description\": \"Opis zadania\",\r\n  \"Modal_Task_Attachments\": \"Załączniki\",\r\n\r\n  \"Today\": \"Dzisiaj\",\r\n  \"Yesterday\": \"Wczoraj\",\r\n  \"Tomorrow\": \"Jutro\"\r\n}"
  },
  {
    "path": "locales/pt.json",
    "content": "{\n  \"Global_Back\": \"Voltar\",\n  \"Global_DatePrefix\": \"a\",\n  \"Tab_Home\": \"Início\",\n  \"Tab_Calendar\": \"Disciplinas\",\n  \"Tab_Tasks\": \"Tarefas\",\n  \"Tab_Grades\": \"Notas\",\n  \"Tab_Profile\": \"Perfil\",\n  \"Tab_Custom_Profile\": \"Modificar o meu perfil\",\n  \"Button_Change_ProfilePicture\": \"Mudar a foto de perfil\",\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Tirar uma foto\",\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Da fototeca\",\n  \"Button_Change_ProfilePicture_FromService\": \"Recuperar do seu ENT\",\n  \"Button_Change_ProfilePicture_Remove\": \"Excluir a foto\",\n  \"Tab_Page\": \"Página\",\n  \"Tab_Settings\": \"Parâmetros\",\n  \"Tab_News\": \"Notícias\",\n  \"ONBOARDING_MAIN_TITLE\": \"O aplicativo para gerir a sua vida escolar\",\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Conecte os seus aplicativos escolares para acessar as suas notas, aulas, trabalhos e muito mais na ‘interface’ Papillon!\",\n  \"ONBOARDING_START_BTN\": \"Começar\",\n  \"ONBOARDING_HELP_BTN\": \"Precisa de ajuda?\",\n  \"ONBOARDING_UNIVERSITY\": \"Serviço universitário\",\n  \"ONBOARDING_RESTAURANTS\": \"Serviço de restauração\",\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Selecione o seu serviço escolar\",\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Selecione o seu serviço de restauração\",\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Selecione o seu serviço universitário\",\n  \"ONBOARDING_LOGIN_METHOD\": \"Como deseja se conectar?\",\n  \"ONBOARDING_METHOD_POSITION\": \"Usar a minha localização\",\n  \"ONBOARDING_METHOD_SEARCH\": \"Procurar uma cidade\",\n  \"ONBOARDING_METHOD_QRCODE\": \"Eu tenho um QR Code\",\n  \"ONBOARDING_METHOD_LINK\": \"Eu tenho um URL de conexão\",\n  \"ONBOARDING_SELECT_SCHOOL\": \"Escolha a sua instituição\",\n  \"ONBOARDING_SEARCH_TITLE\": \"Digite o nome da sua cidade e escolha a sua instituição\",\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Conecte-se como de costume\",\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Conecte-se à sua conta\",\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Escolha o anfitrião atribuído à conta\",\n  \"ONBOARDING_PRONOTE_PIN\": \"Indique o código de 4 dígitos que acabou de criar no PRONOTE\",\n  \"ONBOARDING_LOGIN_TO\": \"Conexão a\",\n  \"ONBOARDING_SCAN_QRCODE\": \"Saneie o QR Code da sua instituição para se conectar.\",\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validação do QR Code\",\n  \"ONBOARDING_QRCODE_WAIT\": \"Isso pode levar alguns instantes...\",\n  \"ONBOARDING_URL\": \"Indique o endereço URL da sua instituição\",\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL da sua instância PRONOTE\",\n  \"ONBOARDING_COLOR_TITLE\": \"Antes de terminar\",\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Escolha uma\",\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"cor do tema\",\n  \"ONBOARDING_LOGIN_PINCODE\": \"Digite o Código PIN do seu PRONOTE\",\n  \"Onboarding_Load_Webview_Description\": \"Estamos a carregar o sítio da sua instituição\",\n  \"INPUT_PIN\": \"Código PIN\",\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Procurar uma instância...\",\n  \"ONBOARDING_LOADING_LOGIN\": \"Conexão em andamento...\",\n  \"WAITING\": \"Aguardando\",\n  \"IZLY_SMS_SEND\": \"Acaba de receber uma ligação para se conectar, clique nele e siga as etapas.\",\n  \"STEP\": \"Etapa\",\n  \"STEP_OUTOF\": \"de\",\n  \"INPUT_USERNAME\": \"Nome de utilizador\",\n  \"INPUT_MAIL\": \"Endereço de correio eletrónico\",\n  \"INPUT_MAIL_OR_USERNAME\": \"Endereço de correio eletrónico ou nome de utilizador\",\n  \"INPUT_PHONE_OR_MAIL\": \"Número de telefone ou endereço de correio eletrónico\",\n  \"INPUT_PASSWORD\": \"Senha\",\n  \"INPUT_PASSWORD_CODE\": \"Código de acesso\",\n  \"INPUT_ETABID\": \"Identificador da sua instituição\",\n  \"LOGIN_BTN\": \"Conectar-se\",\n  \"CONFIRM_BTN\": \"Confirmar\",\n  \"CANCEL_BTN\": \"Cancelar\",\n  \"Tab_New_Event\": \"Novo evento\",\n  \"Tab_Calendar_Icals\": \"Gestão de iCal\",\n  \"Tab_Calendar_Icals_Description\": \"Gerir a seu URL iCal\",\n  \"Tab_Calendar_Icals_Add_URL\": \"Adicionar um URL iCal\",\n  \"Tab_Calendar_Icals_Manage_Title\": \"Gerir {{title}}\",\n  \"Tab_Calendar_Icals_Manage_Description\": \"Adicionar ou remover URL iCal para sincronizar com o seu calendário.\",\n  \"Tab_Calendar_Icals_Add_Title\": \"Título ausente\",\n  \"Tab_Calendar_Icals_Add_Description\": \"Dê um nome a este URL iCal para adicioná-la.\",\n  \"Tab_Calendar_Icals_Empty\": \"Nenhum URL iCal adicionada\",\n  \"TabUnderConstruction_Title\": \"Esta aba está em construção.\",\n  \"TabUnderConstruction_Details\": \"Volte mais tarde para atualizações.\",\n  \"TabDevModeNotice_Title\": \"Modo de Desenvolvimento\",\n  \"TabDevModeNotice_Details\": \"Ambiente de teste completo para programadores.\",\n  \"Alert_TechnicalDetails\": \"Detalhes técnicos\",\n  \"Online_Course\": \"Em Linha\",\n  \"Evaluated_Course\": \"Avaliação\",\n  \"Edited_Course\": \"Curso editado\",\n  \"Canceled_Course\": \"Classe cancelada\",\n  \"No_Course_Room\": \"Sala desconhecida\",\n  \"Event_DeleteEvent\": \"Eliminar evento\",\n  \"Event_Confirm_DeleteEvent\": \"Tem certeza que gostaria de eliminar este evento?\",\n  \"Course_Separator_Lunch_Default\": \"Pausa para o almoço\",\n  \"Course_Separator_Lunch_Alt_1\": \"Bom Apetite!\",\n  \"Course_Separator_Lunch_Alt_2\": \"Hum!\",\n  \"Course_Separator_Morning_Default\": \"Pausa matinal\",\n  \"Course_Separator_Morning_Alt_1\": \"Hora de dormir!\",\n  \"Course_Separator_Morning_Alt_2\": \"Pequeno-almoço\",\n  \"Course_Separator_Evening_Default\": \"Pausa da tarde\",\n  \"Course_Separator_Evening_Alt_1\": \"Uma pausa é necessária!\",\n  \"Course_Separator_Evening_Alt_2\": \"Hora do lanche!\",\n  \"Course_Separator_Night_Default\": \"Pausa da noite\",\n  \"Course_Separator_Night_Alt_1\": \"Hora de dormir!\",\n  \"Course_Separator_Night_Alt_2\": \"Chegou a noite!\",\n  \"Context_Delete\": \"Apagar\",\n  \"Context_Cancel\": \"Cancelar\",\n  \"Context_Edit\": \"Editar\",\n  \"Context_Add\": \"Adicionar\",\n  \"Form_Title\": \"Título\",\n  \"Form_Location\": \"Localização\",\n  \"Form_Organizer\": \"Organizador\",\n  \"Form_Start\": \"Início\",\n  \"Form_End\": \"Fim\",\n  \"Confirm_DeleteEvent\": \"Tem certeza de que deseja excluir este evento?\",\n  \"Home_Welcome_Name\": \"Olá, {{name}} {{emoji}}\",\n  \"Home_Cards_Button_Description_Plurial\": \"disponíveis\",\n  \"Home_Chats_Plurial\": \"discussões\",\n  \"Home_Chats_Singular\": \"discussão\",\n  \"Home_See_All_Tasks\": \"Ver todas as tarefas\",\n  \"Home_Welcome\": \"Olá!\",\n  \"Home_Planned_None\": \"Tu n'as aucun cours restant de prévu aujourd'hui\",\n  \"Home_Planned_One\": \"Tu as un cours restant aujourd'hui\",\n  \"Home_Planned_Number\": \"Tu as {{number}} cours restants aujourd'hui\",\n  \"Home_Widget_NextCourses\": \"Prochains cours\",\n  \"Home_Widget_NewGrades\": \"Nouvelles notes\",\n  \"Home_Widget_NewHomeworks\": \"Tâches à faire\",\n  \"Home_Widget_NoCourses\": \"Aucun cours à venir\",\n  \"Home_Widget_NoCourses_Description\": \"Il n'y a pas de cours prévus pour aujourd'hui.\",\n  \"Home_Cards_Button_Title\": \"Cartes\",\n  \"Home_Cards_Button_Description_None\": \"Aucune carte\",\n  \"Home_Cards_Button_Description_Singular\": \"Une carte\",\n  \"Home_Cards_Button_Description_Number\": \"{{number}} cartes\",\n  \"Home_Chats_Button_Title\": \"Messages\",\n  \"Home_Chats_Button_Description_None\": \"Aucun message\",\n  \"Home_Chats_Button_Description_Singular\": \"Un message\",\n  \"Home_Chats_Button_Description_Number\": \"{{number}} messages\",\n  \"Home_Attendance_Title\": \"Absences\",\n  \"Home_Attendance_Button_Description_None\": \"Aucune absence\",\n  \"Home_Attendance_Button_Description_Singular\": \"Une absence\",\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} absences\",\n  \"Home_Menu_Button_Title\": \"Menu\",\n  \"Home_Menu_Button_Description\": \"Menu du jour\",\n  \"Tab_Calendar_Empty\": \"Aucun événement trouvé\",\n  \"Tab_Calendar_Empty_Description\": \"Ajoute un événement ou synchronise ton calendrier pour commencer.\",\n  \"Modal_Course_Title\": \"Mon cours\",\n  \"Modal_Course_StartsIn\": \"Commence dans\",\n  \"Modal_Course_StartedAgo\": \"Terminé il y a\",\n  \"Modal_Course_Ongoing\": \"Commencé depuis\",\n  \"Modal_Course_Group\": \"Grupo\",\n  \"Modal_Course_Group_Full\": \"Classe\",\n  \"Modal_Course_Details\": \"Détails du cours\",\n  \"Modal_Course_Teacher\": \"Professor\",\n  \"Modal_Course_Room\": \"Salle\",\n  \"Modal_Course_Duration\": \"Durée\",\n  \"Modal_Course_Time\": \"Horaires du cours\",\n  \"Modal_Course_Start\": \"Début\",\n  \"Modal_Course_End\": \"Fin\",\n  \"Tasks_Search_Placeholder\": \"Rechercher des tâches\",\n  \"Tasks_LeftHomeworks_Title\": \"tâches restantes\",\n  \"Tasks_LeftHomeworks_Time\": \"cette semaine\",\n  \"Tasks_Done_AllTasks\": \"Toutes les tâches\",\n  \"Tasks_Done_CompletedTasks\": \"ont été complétées\",\n  \"Tasks_Nav_Left\": \"Encore {{count}} tâche(s) à faire\",\n  \"Tasks_Nav_One\": \"Plus qu'une tâche à faire\",\n  \"Tasks_Nav_Completed\": \"Tout est terminé !\",\n  \"Tasks_Week\": \"Semaine\",\n  \"Tasks_NoTasks_Title\": \"Aucune tâche\",\n  \"Tasks_NoTasks_Description\": \"Il n'y a pas de tâches prévues pour cette semaine. Profite-en pour te reposer !\",\n  \"Tasks_NoTasks_ForWeek\": \"pour la semaine {{week}}\",\n  \"Tasks_NoTasks_Nav\": \"Aucune tâche\",\n  \"Task_Start\": \"À faire\",\n  \"Task_Complete\": \"Terminé\",\n  \"Task_Sorting_Title\": \"Trier par\",\n  \"Task_OnlyShowUndone\": \"Tâches terminées\",\n  \"Task_Show_Title\": \"Afficher\",\n  \"Settings_General\": \"Général\",\n  \"Latest_Grades\": \"Nouvelles notes\",\n  \"Grades_Search_Placeholder\": \"Rechercher une note, une matière\",\n  \"Grades_Avg_Methods\": \"Méthodes de calcul\",\n  \"Grades_Avg_All_Title\": \"Moyenne générale\",\n  \"Grades_Avg_All_Short\": \"Moy. générale\",\n  \"Grades_Avg_All_Pond\": \"Moyenne pondérée\",\n  \"Grades_Avg_All_Pond_Short\": \"Moy. pondérée\",\n  \"Grades_Avg_All_Pond_Description\": \"Calcule la moyenne pondérée de toutes les notes\",\n  \"Grades_Avg_Subject_Title\": \"Moyenne des matières\",\n  \"Grades_Avg_Subject_Short\": \"Moy. matières\",\n  \"Grades_Avg_Subject_Description\": \"Calcule la moyenne pondérée des moyennes de matières\",\n  \"Grades_Avg_Median_Title\": \"Médiane\",\n  \"Grades_Avg_Median_Short\": \"Médiane\",\n  \"Grades_Avg_More\": \"En savoir plus\",\n  \"Grades_Avg_KnowMore\": \"En savoir plus\",\n  \"Grades_Avg_KnowMore_Description\": \"Comprendre les méthodes de calcul de la moyenne générale\",\n  \"Grades_SubjectInfo\": \"Informations sur la matière\",\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} note(s)\",\n  \"SubjectInfo_StudentAverage_Label\": \"Moyenne de l'élève\",\n  \"SubjectInfo_Stats_Header\": \"Statistiques\",\n  \"SubjectInfo_ClassAverage_Label\": \"Moyenne de classe\",\n  \"SubjectInfo_ClassAverage_Description\": \"Moyenne générale de la classe\",\n  \"SubjectInfo_MaxAverage_Label\": \"Moyenne maximale\",\n  \"SubjectInfo_MaxAverage_Description\": \"Meilleure moyenne du groupe\",\n  \"SubjectInfo_MinAverage_Label\": \"Moyenne minimale\",\n  \"SubjectInfo_MinAverage_Description\": \"Moyenne la plus faible du groupe\",\n  \"Grades_Semester\": \"Semestre\",\n  \"Grades_Trimester\": \"Trimestre\",\n  \"Grades_OutPeriod\": \"Hors période\",\n  \"Grades_Year\": \"Année\",\n  \"Grades_MockExamBac\": \"Bac blanc\",\n  \"Grades_MockExamBrevet\": \"Brevet blanc\",\n  \"Grades_Method_AllGrades\": \"Toutes les matières\",\n  \"Grades_Method_Weighted\": \"Pondération\",\n  \"Grades_Sort\": \"Trier\",\n  \"Grades_Sorting_Alphabetical\": \"Alphabétique\",\n  \"Grades_Sorting_Averages\": \"Moyennes\",\n  \"Grades_Sorting_Date\": \"Date\",\n  \"Grades_Menu_SortBy\": \"Tri par\",\n  \"Grades_Menu_AverageBy\": \"Moyenne par\",\n  \"NoAverage\": \"Aucune moyenne\",\n  \"Grades_Empty_Title\": \"Aucune note\",\n  \"Grades_Empty_Description\": \"Tu n'as pas encore été noté sur cette période.\",\n  \"Grade_NoDescription\": \"Devoir de {{subject}}\",\n  \"Grades_Tab_Subjects\": \"Matières\",\n  \"Grades_Tab_Latest\": \"Nouvelles notes\",\n  \"Profile_Attendance_Title\": \"Assiduité\",\n  \"Profile_Attendance_Denominator_Single\": \"absence\",\n  \"Profile_Attendance_Denominator_Plural\": \"absences\",\n  \"Profile_Discussions_Title\": \"Discussions\",\n  \"Profile_Discussions_Denominator_Single\": \"non lu\",\n  \"Profile_Discussions_Denominator_Plural\": \"non lus\",\n  \"Profile_News_Title\": \"Actualités\",\n  \"Profile_News_Denominator_Single\": \"nouveau\",\n  \"Profile_News_Denominator_Plural\": \"nouvelles\",\n  \"Profile_News_Open\": \"Ouvrir\",\n  \"Profile_News_Loading_Title\": \"Chargement des actualités...\",\n  \"Profile_News_Author_Unknown\": \"Auteur inconnu\",\n  \"Profile_Cards_Title\": \"QR-Code et cartes\",\n  \"Modal_Grades_Title\": \"Détail de la note\",\n  \"Modal_Grades_BestGrade\": \"Meilleure note du groupe\",\n  \"Grades_Details_Title\": \"Détails\",\n  \"Grades_NormalizedGrade_Title\": \"Note ramenée sur 20\",\n  \"Grades_NormalizedGrade_Description\": \"Valeur de la note convertie sur une échelle de 20\",\n  \"Grades_HighestGrade_Title\": \"Note la plus haute\",\n  \"Grades_HighestGrade_Description\": \"Note maximale obtenue dans le groupe\",\n  \"Grades_LowestGrade_Title\": \"Note la plus basse\",\n  \"Grades_LowestGrade_Description\": \"Note minimale obtenue dans le groupe\",\n  \"Grades_Influence_Title\": \"Influence\",\n  \"Grades_Avg_Group_Title\": \"Moyenne du groupe\",\n  \"Grades_Coefficient\": \"Coefficient\",\n  \"Grades_Avg_Group_Short\": \"Moy. groupe\",\n  \"Grades_Tab_Rank\": \"Classement\",\n  \"Grades_Tab_Rank_Description\": \"Position dans le groupe\",\n  \"News_Search_Placeholder\": \"Rechercher une actualité\",\n  \"News_Empty_Title\": \"Aucune actualité\",\n  \"News_Empty_Description\": \"Il n'y a pas d'actualités trouvées dans ton établissement.\",\n  \"News_Search_NoResults\": \"Aucune actualité trouvée\",\n  \"News_Search_NoResults_Description\": \"Aucune actualité trouvée pour votre recherche.\",\n  \"News_Theme_Papillon_Title\": \"Papillon\",\n  \"News_Theme_Papillon_Description\": \"Un thème doux et élégant\",\n  \"News_Theme_Reading_Title\": \"Lecture\",\n  \"News_Theme_Reading_Description\": \"Un thème conçu pour la lecture\",\n  \"Attendance_Hours_Missed\": \"Heures manquées\",\n  \"Attendance_Hours_Unjustified\": \"Heures injustifiées\",\n  \"Attendance_Missing\": \"Absences\",\n  \"Attendance_Delays\": \"Retards\",\n  \"Attendance_NoReason\": \"Aucune raison\",\n  \"Attendance_NoEvent_Title\": \"Aucun événement\",\n  \"Attendance_NoEvent_Description\": \"Pas d'absences ou de retards enregistrés pour cette période.\",\n  \"Settings_Account_Title\": \"Mon compte\",\n  \"Settings_Account_Description\": \"Mon compte\",\n  \"Settings_Services_Title\": \"Comptes liés\",\n  \"Settings_Services_Title_LastAccountUsed\": \"Dernier compte utilisé\",\n  \"Settings_Notifications_Title\": \"Notifications\",\n  \"Settings_Notifications_Description\": \"Alertes, fréquence...\",\n  \"Settings_Subjects_Title\": \"Matières\",\n  \"Settings_Subjects_Description\": \"Nom, couleur, police...\",\n  \"Settings_Personalization_Title\": \"Personnalisation\",\n  \"Settings_Personalization_Description\": \"Thèmes, couleurs...\",\n  \"Settings_Cards_Title\": \"Cartes\",\n  \"Settings_Cards_Description\": \"Cantine, accès...\",\n  \"Settings_Accessibility_Title\": \"Accessibilité\",\n  \"Settings_Accessibility_Description\": \"Affichage, son...\",\n  \"Settings_MagicPlus_Title\": \"Magic+\",\n  \"Settings_MagicPlus_Description\": \"Fonctionnalités intelligentes\",\n  \"Settings_MagicPlus_Description_Card\": \"Fonctionnalités IA\",\n  \"Settings_MagicPlus_Enable\": \"Activer Magic+\",\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimise automatiquement l’organisation de tes tâches pour améliorer ta productivité\",\n  \"Settings_MagicPlus_ExplanationLocal\": \"Modèle entièrement local, aucune donnée n’est transférée en dehors de ton appareil\",\n  \"Settings_Donate_Title\": \"Faire un don\",\n  \"Settings_Donate_Description\": \"Soutenir le projet\",\n  \"Settings_Telemetry_Title\": \"Télémétrie et vie privée\",\n  \"Settings_Telemetry_Description\": \"Gérer les données collectées\",\n  \"Settings_About_Title\": \"À propos\",\n  \"Settings_About_Description\": \"Version\",\n  \"Settings_Logout_Title\": \"Se déconnecter\",\n  \"Settings_Logout_Description\": \"Supprimer ce compte de Papillon\",\n  \"Settings_Language_Title\": \"Langue\",\n  \"Settings_Language_Description\": \"Changer la langue\",\n  \"Settings_Personalization_Title_Card\": \"Personnalisation\",\n  \"Settings_Personalization_Subtitle_Card\": \"Thèmes, matières...\",\n  \"Settings_SubjectPersonalization_Title\": \"Personnaliser les matières\",\n  \"Settings_Personalization_Accent\": \"Couleur d'accentuation\",\n  \"Settings_Personalization_Accent_Description\": \"La couleur que tu choisis ici s'appliquera sur la page d'accueil de Papillon.\",\n  \"Settings_Personalization_Theme\": \"Thème\",\n  \"Settings_Personalization_Icon_Title\": \"Changer l’icône\",\n  \"Settings_Personalization_Icon_Description\": \"Personnalise l’icône de l’application\",\n  \"Settings_Personalization_Subject_Title\": \"Personnaliser les matières\",\n  \"Settings_Personalization_Subject_Description\": \"Icônes, couleurs\",\n  \"Settings_About_Papillion_Behind\": \"Derrière Papillon\",\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon est maintenu par des étudiants 100% bénévoles\",\n  \"Settings_About_Discord\": \"Serveur Discord\",\n  \"Settings_About_Discord_Description\": \"Rejoindre le serveur Discord\",\n  \"Settings_About_Github\": \"Projet GitHub\",\n  \"Settings_About_Github_Description\": \"Contribuer au projet sur GitHub\",\n  \"Settings_About_Dependency_Version\": \"Version des dépendances\",\n  \"Alert_No_Technical\": \"Aucune information technique disponible.\",\n  \"Alert_Auth_Error\": \"Erreur d'authentification\",\n  \"Alert_Auth_Bad_Creds\": \"Les identifiants que tu as saisis sont incorrects ou tu essaies de te connecter avec un compte parent. Ce type de compte n’est pas encore pris en charge par Papillon.\",\n  \"Alert_Not_Supported\": \"Instance non supportée\",\n  \"Alert_Security_Instance_HTTP\": \"Pour des raisons de sécurité, Papillon n'accepte pas les instances utilisant encore le protocole HTTP. Nous te recommandons d’informer le chef d’établissement afin qu’il procède à la mise à jour de cette instance et préserve ainsi sa sécurité.\",\n  \"Alert_NoDemo\": \"Papillon n'est pas fait pour fonctionner avec des instances de démonstration, merci d'utiliser une autre instance.\",\n  \"Alert_Invalid_Instance\": \"Papillon n'arrive pas à obtenir les informations de cette instance PRONOTE, est-elle encore valide ?\",\n  \"Alert_No_Pos\": \"Impossible de récupérer la position\",\n  \"Alert_Connexion_Fail\": \"Connexion impossible\",\n  \"Feature_Limited\": \"Fonctionnalités limitées\",\n  \"Feature_Soon\": \"Ça arrive bientôt !\",\n  \"Feature_Soon_Notification\": \"Nous travaillons dur pour vous offrir cette fonctionnalité dans une future mise à jour.\",\n  \"Feature_Add_Card\": \"Ajoute une nouvelle carte depuis l’onglet Profil accessible dans la barre de navigation\",\n  \"Webview_Wait\": \"Un peu de patience...\",\n  \"Profile_QRCards\": \"QR-Code et cartes\",\n  \"Settings_Cards_Banner_Title\": \"Cartes\",\n  \"Settings_Cantineen_Subtitle_Card\": \"Cantine, accès\",\n  \"Settings_Cards_Banner_Description\": \"Ajoute tes cartes de cantine et de transport pour y accéder n'importe où depuis ton téléphone sur Papillon\",\n  \"Settings_Cards_None_Title\": \"Aucune carte\",\n  \"Settings_Cards_Add_Button\": \"Ajouter\",\n  \"Settings_Cards_None_Description\": \"Ajoute en-une pour accéder à ton solde de cantine, scanner ton QR-Code et plus encore\",\n  \"Settings_Subjects_None_Title\": \"Aucune matière\",\n  \"Settings_Subjects_None_Description\": \"Parcours les différents onglets de l'application afin de pouvoir customiser les matières.\",\n  \"Settings_Donator\": \"Donateurs\",\n  \"Settings_Donator_Description\": \"Voir la liste des donateurs\",\n  \"Settings_App_Version\": \"Version de l'application\",\n  \"Profile_Cards_Scan_Orientation\": \"Oriente le QR-Code vers le scanner de la borne\",\n  \"Profile_Cards_No_Reservation\": \"Aucune réservation\",\n  \"Profile_Cards_No_Available_Reservation\": \"Il semblerait que tu ne puisses pas réserver ce jour.\",\n  \"Profile_Cards_History\": \"Historique\",\n  \"Magic_Important\": \"Peut-être important\",\n  \"OnBoarding_Step\": \"Étape \",\n  \"OnBoarding_Step_Of\": \"sur \",\n  \"Consent_Advanced_Title\": \"Je veux aider Papillon\",\n  \"Consent_Advanced_Description\": \"On récolte plus d’informations détaillées sur ton utilisation.\",\n  \"Consent_Required_Title\": \"Juste l'essentiel\",\n  \"Consent_Required_Description\": \"En gros, savoir que quelqu’un a utilisé Papillon, si ça s’est bien passé et quel service il utilise.\",\n  \"Consent_None_Title\": \"Rien du tout\",\n  \"Consent_None_Description\": \"On ne sera même pas au courant de ton existence.\",\n  \"Consent_Title\": \"Toi et Papillon\",\n  \"Consent_Intro1\": \"Pour aider à faire grandir Papillon, tu peux choisir de partager quelques infos d’usage.\",\n  \"Consent_PrivacyPolicy\": \"En cas de doute, consultez notre politique de confidentialité\",\n  \"Consent_Refuse\": \"Refuser\",\n  \"Consent_Accept\": \"Accepter\",\n  \"Consent_ChangeMind\": \"Vous pouvez changer d’avis à tout moment depuis les paramètres de l’appli.\",\n  \"Consent_Arg1\": \"Sert uniquement à améliorer l’application\",\n  \"Consent_Arg2\": \"Anonyme & sans lien avec ton identité\",\n  \"Consent_Arg3\": \"On n'a pas accès à tes comptes\",\n  \"Changelog_Title\": \"Notes de mise à jour\",\n  \"Tasks_Sorting_Methods_DueDate\": \"Date de rendu\",\n  \"Tasks_Sorting_Methods_Subject\": \"Matières\",\n  \"Tasks_Sorting_Methods_Done\": \"Non terminé\",\n  \"Tasks_ThisWeek\": \"Cette semaine\",\n  \"Task_Undone\": \"Non terminé\",\n  \"Task_Done\": \"Terminé\",\n  \"Modal_Wallpaper_Title\": \"Personnaliser le fond d'écran\",\n  \"Modal_Profile_Title\": \"Personnaliser le profil\",\n  \"Modal_Task_Status\": \"État du devoir\",\n  \"Modal_Task_Description\": \"Description du devoir\",\n  \"Modal_Task_Attachments\": \"Pièces jointes\",\n  \"Today\": \"Aujourd'hui\",\n  \"Yesterday\": \"Hier\",\n  \"Tomorrow\": \"Demain\"\n}\n"
  },
  {
    "path": "locales/ro.json",
    "content": "{\r\n  \"Global_Back\": \"Înapoi\",\r\n  \"Global_DatePrefix\": \"pe\",\r\n\r\n  \"Tab_Home\": \"Acasă\",\r\n  \"Tab_Calendar\": \"Lecții\",\r\n  \"Tab_Tasks\": \"Teme\",\r\n  \"Tab_Grades\": \"Note\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Modifică profilul\",\r\n  \"Button_Change_ProfilePicture\": \"Schimbă fotografia de profil\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Fă o poză\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Din galerie\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Recuperează din contul școlar\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Șterge fotografia\",\r\n  \"Tab_Page\": \"Pagină\",\r\n  \"Tab_Settings\": \"Setări\",\r\n  \"Tab_News\": \"Noutăți\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Aplicația care îți gestionează viața școlară\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Conectează aplicațiile tale școlare pentru a accesa notele, cursurile, temele și multe altele în interfața Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Începe\",\r\n  \"ONBOARDING_HELP_BTN\": \"Ai nevoie de ajutor?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Serviciu universitar\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Serviciu de cantină\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Selectează serviciul tău școlar\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Selectează serviciul de cantină\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Selectează serviciul universitar\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Cum dorești să te conectezi?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Folosește locația mea\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Caută un oraș\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Am un cod QR\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Am un URL de conectare\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Alege instituția ta\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Introdu numele orașului și alege instituția\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Conectează-te cum obișnuiești\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Conectează-te la contul tău\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Alege serverul alocat contului\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Introdu codul de 4 cifre pe care tocmai l-ai creat pe PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Conectare la\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Scanează codul QR al instituției tale pentru a te conecta.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validarea codului QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Acest lucru poate dura câteva clipe...\",\r\n  \"ONBOARDING_URL\": \"Introdu adresa URL a instituției tale\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL-ul instanței tale PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Înainte de a termina\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Alege o\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"culoare pentru temă\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Introdu codul PIN de la PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"Încărcăm site-ul instituției tale\",\r\n  \"INPUT_PIN\": \"Cod PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Caută o instanță...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Conectare în curs...\",\r\n\r\n  \"WAITING\": \"În așteptare\",\r\n  \"IZLY_SMS_SEND\": \"Tocmai ai primit un link de conectare, apasă pe el și urmează pașii.\",\r\n  \"STEP\": \"Pasul\",\r\n  \"STEP_OUTOF\": \"din\",\r\n  \"INPUT_USERNAME\": \"Nume de utilizator\",\r\n  \"INPUT_MAIL\": \"Adresă de e-mail\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Adresă de e-mail sau nume de utilizator\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Număr de telefon sau adresă de e-mail\",\r\n  \"INPUT_PASSWORD\": \"Parolă\",\r\n  \"INPUT_PASSWORD_CODE\": \"Cod de acces\",\r\n  \"INPUT_ETABID\": \"Identificatorul instituției\",\r\n  \"LOGIN_BTN\": \"Conectare\",\r\n  \"CONFIRM_BTN\": \"Confirmă\",\r\n  \"CANCEL_BTN\": \"Anulează\",\r\n\r\n  \"Tab_New_Event\": \"Eveniment nou\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Gestionare iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Gestionează URL-urile tale iCal\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Adaugă un URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Gestionează {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Adaugă sau șterge URL-uri iCal pentru a le sincroniza cu calendarul tău.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Titlu lipsă\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Dă-i un nume acestui URL iCal pentru a-l adăuga.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Niciun URL iCal adăugat\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Această secțiune este în construcție.\",\r\n  \"TabUnderConstruction_Details\": \"Revino mai târziu pentru actualizări.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Mod Dezvoltator\",\r\n  \"TabDevModeNotice_Details\": \"Mediu de testare complet pentru dezvoltatori.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Detalii tehnice\",\r\n\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Evaluare\",\r\n  \"Edited_Course\": \"Curs modificat\",\r\n  \"Canceled_Course\": \"Curs anulat\",\r\n  \"No_Course_Room\": \"Sală necunoscută\",\r\n  \"Event_DeleteEvent\": \"Șterge evenimentul\",\r\n  \"Event_Confirm_DeleteEvent\": \"Ești sigur că vrei să ștergi acest eveniment?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Pauză de prânz\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Poftă bună!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Miam!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Pauză de dimineață\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Somn ușor!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Micul dejun\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Pauză de după-amiază\",\r\n  \"Course_Separator_Evening_Alt_1\": \"O pauză e necesară!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Ora gustării!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Pauză de seară\",\r\n  \"Course_Separator_Night_Alt_1\": \"Somn ușor!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Este noapte!\",\r\n\r\n  \"Context_Delete\": \"Șterge\",\r\n  \"Context_Cancel\": \"Anulează\",\r\n  \"Context_Edit\": \"Modifică\",\r\n  \"Context_Add\": \"Adaugă\",\r\n\r\n  \"Form_Title\": \"Titlu\",\r\n  \"Form_Location\": \"Locație\",\r\n  \"Form_Organizer\": \"Organizator\",\r\n  \"Form_Start\": \"Început\",\r\n  \"Form_End\": \"Sfârșit\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Ești sigur că vrei să ștergi acest eveniment?\",\r\n\r\n  \"Home_Welcome_Name\": \"Bună, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Afișează mai mult\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"disponibile\",\r\n  \"Home_Chats_Plurial\": \"discuții\",\r\n  \"Home_Chats_Singular\": \"discuție\",\r\n  \"Home_See_All_Tasks\": \"Vezi toate temele\",\r\n  \"Home_Welcome\": \"Bună!\",\r\n  \"Home_Planned_None\": \"Nu mai ai nicio lecție programată pentru azi\",\r\n  \"Home_Planned_One\": \"Mai ai o lecție azi\",\r\n  \"Home_Planned_Number\": \"Mai ai {{number}} lecții azi\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Următoarele lecții\",\r\n  \"Home_Widget_NewGrades\": \"Note noi\",\r\n  \"Home_Widget_NewHomeworks\": \"Teme de făcut\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Nicio lecție următoare\",\r\n  \"Home_Widget_NoCourses_Description\": \"Nu sunt lecții programate pentru astăzi.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Carduri\",\r\n  \"Home_Cards_Button_Description_None\": \"Niciun card\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Un card\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} carduri\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Mesaje\",\r\n  \"Home_Chats_Button_Description_None\": \"Niciun mesaj\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Un mesaj\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} mesaje\",\r\n\r\n  \"Home_Attendance_Title\": \"Absențe\",\r\n  \"Home_Attendance_Button_Description_None\": \"Nicio absență\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"O absență\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} absențe\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Meniu\",\r\n  \"Home_Menu_Button_Description\": \"Meniul zilei\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Niciun eveniment găsit\",\r\n  \"Tab_Calendar_Empty_Description\": \"Adaugă un eveniment sau sincronizează calendarul pentru a începe.\",\r\n\r\n  \"Modal_Course_Title\": \"Cursul meu\",\r\n  \"Modal_Course_StartsIn\": \"Începe în\",\r\n  \"Modal_Course_StartedAgo\": \"Terminat acum\",\r\n  \"Modal_Course_Ongoing\": \"Început de\",\r\n  \"Modal_Course_Group\": \"Grup\",\r\n  \"Modal_Course_Group_Full\": \"Clasă\",\r\n\r\n  \"Modal_Course_Details\": \"Detalii curs\",\r\n  \"Modal_Course_Teacher\": \"Profesor\",\r\n  \"Modal_Course_Room\": \"Sală\",\r\n  \"Modal_Course_Duration\": \"Durată\",\r\n\r\n  \"Modal_Course_Time\": \"Orar curs\",\r\n  \"Modal_Course_Start\": \"Început\",\r\n  \"Modal_Course_End\": \"Sfârșit\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Caută teme\",\r\n  \"Tasks_LeftHomeworks_Title\": \"teme rămase\",\r\n  \"Tasks_LeftHomeworks_Time\": \"săptămâna aceasta\",\r\n  \"Tasks_Done_AllTasks\": \"Toate temele\",\r\n  \"Tasks_Done_CompletedTasks\": \"au fost terminate\",\r\n  \"Tasks_Nav_Left\": \"Mai ai {{count}} teme de făcut\",\r\n  \"Tasks_Nav_One\": \"Mai ai o singură temă de făcut\",\r\n  \"Tasks_Nav_Completed\": \"Totul este gata!\",\r\n  \"Tasks_Week\": \"Săptămână\",\r\n  \"Tasks_NoTasks_Title\": \"Nicio temă\",\r\n  \"Tasks_NoTasks_Description\": \"Nu sunt teme programate pentru săptămâna aceasta. Bucură-te de odihnă!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"pentru săptămâna {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Nicio temă\",\r\n  \"Task_Start\": \"De făcut\",\r\n  \"Task_Complete\": \"Finalizat\",\r\n  \"Task_Sorting_Title\": \"Sortează după\",\r\n  \"Task_OnlyShowUndone\": \"Teme finalizate\",\r\n  \"Task_Show_Title\": \"Afișează\",\r\n  \"Settings_General\": \"General\",\r\n\r\n  \"Latest_Grades\": \"Note noi\",\r\n  \"Grades_Search_Placeholder\": \"Caută o notă, o materie\",\r\n\r\n  \"Grades_Avg_Methods\": \"Metode de calcul\",\r\n  \"Grades_Avg_All_Title\": \"Media generală\",\r\n  \"Grades_Avg_All_Short\": \"Med. generală\",\r\n  \"Grades_Avg_All_Pond\": \"Medie ponderată\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Med. ponderată\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Calculează media ponderată a tuturor notelor\",\r\n  \"Grades_Avg_Subject_Title\": \"Media materiilor\",\r\n  \"Grades_Avg_Subject_Short\": \"Med. materii\",\r\n  \"Grades_Avg_Subject_Description\": \"Calculează media ponderată a mediilor pe materie\",\r\n  \"Grades_Avg_Median_Title\": \"Mediană\",\r\n  \"Grades_Avg_Median_Short\": \"Mediană\",\r\n\r\n  \"Grades_Avg_More\": \"Află mai multe\",\r\n  \"Grades_Avg_KnowMore\": \"Află mai multe\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Înțelege metodele de calcul ale mediei generale\",\r\n\r\n  \"Grades_SubjectInfo\": \"Informații despre materie\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} note\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Media elevului\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistici\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Media clasei\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Media generală a clasei\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Media maximă\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Cea mai bună medie din grup\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Media minimă\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Cea mai mică medie din grup\",\r\n\r\n  \"Grades_Semester\": \"Semestru\",\r\n  \"Grades_Trimester\": \"Trimestru\",\r\n  \"Grades_OutPeriod\": \"În afara perioadei\",\r\n  \"Grades_Year\": \"An\",\r\n  \"Grades_MockExamBac\": \"Simulare Bac\",\r\n  \"Grades_MockExamBrevet\": \"Simulare Evaluare Națională\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Toate materiile\",\r\n  \"Grades_Method_Weighted\": \"Pondere\",\r\n\r\n  \"Grades_Sort\": \"Sortează\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabetic\",\r\n  \"Grades_Sorting_Averages\": \"Medii\",\r\n  \"Grades_Sorting_Date\": \"Dată\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Sortează după\",\r\n  \"Grades_Menu_AverageBy\": \"Media după\",\r\n  \"NoAverage\": \"Nicio medie\",\r\n\r\n  \"Grades_Empty_Title\": \"Nicio notă\",\r\n  \"Grades_Empty_Description\": \"Nu ai fost încă notat în această perioadă.\",\r\n\r\n  \"Grade_NoDescription\": \"Temă la {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Materii\",\r\n  \"Grades_Tab_Latest\": \"Note noi\",\r\n\r\n  \"Profile_Attendance_Title\": \"Prezență\",\r\n  \"Profile_Attendance_Denominator_Single\": \"absență\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"absențe\",\r\n\r\n  \"Profile_Discussions_Title\": \"Discuții\",\r\n  \"Profile_Discussions_Denominator_Single\": \"necitit\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"necitite\",\r\n\r\n  \"Profile_News_Title\": \"Noutăți\",\r\n  \"Profile_News_Denominator_Single\": \"nouă\",\r\n  \"Profile_News_Denominator_Plural\": \"noi\",\r\n  \"Profile_News_Open\": \"Deschide\",\r\n  \"Profile_News_Loading_Title\": \"Se încarcă noutățile...\",\r\n  \"Profile_News_Author_Unknown\": \"Autor necunoscut\",\r\n\r\n  \"Profile_Cards_Title\": \"Cod QR și carduri\",\r\n\r\n  \"Modal_Grades_Title\": \"Detaliul notei\",\r\n  \"Modal_Grades_BestGrade\": \"Cea mai bună notă din grup\",\r\n\r\n  \"Grades_Details_Title\": \"Detalii\",\r\n  \"Grades_NormalizedGrade_Title\": \"Notă raportată la 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Valoarea notei convertită pe o scară de 20\",\r\n  \"Grades_HighestGrade_Title\": \"Cea mai mare notă\",\r\n  \"Grades_HighestGrade_Description\": \"Nota maximă obținută în grup\",\r\n  \"Grades_LowestGrade_Title\": \"Cea mai mică notă\",\r\n  \"Grades_LowestGrade_Description\": \"Nota minimă obținută în grup\",\r\n  \"Grades_Influence_Title\": \"Influență\",\r\n  \"Grades_Avg_Group_Title\": \"Media grupului\",\r\n  \"Grades_Coefficient\": \"Coeficient\",\r\n  \"Grades_Avg_Group_Short\": \"Med. grup\",\r\n  \"Grades_Tab_Rank\": \"Clasament\",\r\n  \"Grades_Tab_Rank_Description\": \"Poziția în grup\",\r\n\r\n  \"News_Search_Placeholder\": \"Caută o noutate\",\r\n  \"News_Empty_Title\": \"Nicio noutate\",\r\n  \"News_Empty_Description\": \"Nu au fost găsite noutăți în instituția ta.\",\r\n  \"News_Search_NoResults\": \"Nicio noutate găsită\",\r\n  \"News_Search_NoResults_Description\": \"Nu a fost găsită noutatea căutată.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"O temă caldă și elegantă\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Lectură\",\r\n  \"News_Theme_Reading_Description\": \"O temă concepută pentru citit\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Ore pierdute\",\r\n  \"Attendance_Hours_Unjustified\": \"Ore nemotivate\",\r\n  \"Attendance_Missing\": \"Absențe\",\r\n  \"Attendance_Delays\": \"Întârzieri\",\r\n  \"Attendance_NoReason\": \"Fără motiv\",\r\n  \"Attendance_NoEvent_Title\": \"Niciun eveniment\",\r\n  \"Attendance_NoEvent_Description\": \"Nicio absență sau întârziere înregistrată pentru această perioadă.\",\r\n\r\n  \"Settings_Account_Title\": \"Contul meu\",\r\n  \"Settings_Account_Description\": \"Contul meu\",\r\n  \"Settings_Services_Title\": \"Conturi conectate\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Ultimul cont utilizat\",\r\n  \"Settings_Notifications_Title\": \"Notificări\",\r\n  \"Settings_Notifications_Description\": \"Alte, frecvență...\",\r\n  \"Settings_Subjects_Title\": \"Materii\",\r\n  \"Settings_Subjects_Description\": \"Nume, culoare, font...\",\r\n  \"Settings_Personalization_Title\": \"Personalizare\",\r\n  \"Settings_Personalization_Description\": \"Teme, culori...\",\r\n  \"Settings_Cards_Title\": \"Carduri\",\r\n  \"Settings_Cards_Description\": \"Cantină, acces...\",\r\n  \"Settings_Accessibility_Title\": \"Accesibilitate\",\r\n  \"Settings_Accessibility_Description\": \"Afișare, sunet...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Funcții inteligente\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Funcții IA\",\r\n  \"Settings_MagicPlus_Enable\": \"Activează Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimizează automat organizarea temelor tale pentru a-ți îmbunătăți productivitatea\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Model complet local, nicio dată nu este transferată în afara dispozitivului tău\",\r\n  \"Settings_Donate_Title\": \"Fă o donație\",\r\n  \"Settings_Donate_Description\": \"Susține proiectul\",\r\n  \"Settings_Telemetry_Title\": \"Telemetrie și confidențialitate\",\r\n  \"Settings_Telemetry_Description\": \"Gestionează datele colectate\",\r\n  \"Settings_About_Title\": \"Despre\",\r\n  \"Settings_About_Description\": \"Versiune\",\r\n  \"Settings_Logout_Title\": \"Deconectare\",\r\n  \"Settings_Logout_Description\": \"Șterge acest cont din Papillon\",\r\n  \"Settings_Language_Title\": \"Limbă\",\r\n  \"Settings_Language_Description\": \"Schimbă limba\",\r\n  \"Settings_Tabs_Title\": \"Tab-uri\",\r\n  \"Settings_Tabs_Description\": \"Ascunde tab-urile din meniu\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personalizare\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Teme, materii...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Personalizează materiile\",\r\n  \"Settings_Personalization_Accent\": \"Culoare de accent\",\r\n  \"Settings_Personalization_Accent_Description\": \"Culoarea pe care o alegi aici se va aplica pe pagina principală Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Temă\",\r\n  \"Settings_Personalization_Icon_Title\": \"Schimbă iconița\",\r\n  \"Settings_Personalization_Icon_Description\": \"Personalizează iconița aplicației\",\r\n  \"Settings_Personalization_Subject_Title\": \"Personalizează materiile\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Materii\",\r\n  \"Settings_Personalization_Subject_Description\": \"Iconițe, culori\",\r\n  \"Settings_About_Papillion_Behind\": \"În spatele Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon este menținut de studenți 100% voluntari\",\r\n  \"Settings_About_Discord\": \"Server Discord\",\r\n  \"Settings_About_Discord_Description\": \"Alătură-te serverului Discord\",\r\n  \"Settings_About_Crowdin\": \"Proiect Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Ajută la traducerea Papillon\",\r\n  \"Settings_About_Github\": \"Proiect GitHub\",\r\n  \"Settings_About_Github_Description\": \"Contribuie la proiect pe GitHub\",\r\n  \"Settings_About_Issue\": \"Semnalează un bug\",\r\n  \"Settings_About_Issue_Description\": \"Raportează un bug întâlnit\",\r\n  \"Settings_About_Dependency_Version\": \"Versiunea dependențelor\",\r\n\r\n  \"Alert_No_Technical\": \"Nicio informație tehnică disponibilă.\",\r\n  \"Alert_Auth_Error\": \"Eroare de autentificare\",\r\n  \"Alert_Auth_Bad_Creds\": \"Datele introduse sunt incorecte sau încerci să te conectezi cu un cont de părinte. Acest tip de cont nu este încă suportat de Papillon.\",\r\n  \"Alert_Not_Supported\": \"Instanță nesuportată\",\r\n  \"Alert_Security_Instance_HTTP\": \"Din motive de securitate, Papillon nu acceptă instanțele care utilizează protocolul HTTP. Recomandăm să informezi conducerea instituției pentru a actualiza instanța.\",\r\n  \"Alert_NoDemo\": \"Papillon nu este făcut să funcționeze cu instanțe demo, te rugăm să folosești o instanță reală.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon nu reușește să obțină informațiile de la această instanță PRONOTE, mai este validă?\",\r\n  \"Alert_No_Pos\": \"Imposibil de recuperat locația\",\r\n  \"Alert_Connexion_Fail\": \"Conexiune imposibilă\",\r\n\r\n  \"Feature_Limited\": \"Funcționalități limitate\",\r\n  \"Feature_Soon\": \"Vine curând!\",\r\n  \"Feature_Soon_Notification\": \"Lucrăm din greu pentru a-ți oferi această funcționalitate într-o actualizare viitoare.\",\r\n  \"Feature_Add_Card\": \"Adaugă un card nou din tab-ul Profil accesibil în bara de navigare\",\r\n\r\n  \"Webview_Wait\": \"Puțină răbdare...\",\r\n\r\n  \"Profile_QRCards\": \"Cod QR și carduri\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} card(uri)\",\r\n  \"Profile_Cards_Loading_History\": \"Se încarcă istoricul tranzacțiilor\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Acest lucru poate dura un moment...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Carduri\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Cantină, acces\",\r\n  \"Settings_Cards_Banner_Description\": \"Adaugă cardurile tale de cantină și transport pentru a le accesa oriunde de pe telefon prin Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Niciun card\",\r\n  \"Settings_Cards_Add_Button\": \"Adaugă\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Adaugă unul pentru a accesa soldul de la cantină, a scana codul QR și altele\",\r\n  \"Settings_Subjects_None_Title\": \"Nicio materie\",\r\n  \"Settings_Subjects_None_Description\": \"Răsfoiește diferitele tab-uri ale aplicației pentru a putea personaliza materiile.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Resetează\",\r\n  \"Settings_Subjects_Reset_Message\": \"Vrei sigur să resetezi toate materiile?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Resetează\",\r\n\r\n  \"Settings_Donator\": \"Donatori\",\r\n  \"Settings_Donator_Description\": \"Vezi lista donatorilor\",\r\n  \"Settings_App_Version\": \"Versiunea aplicației\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Orientează codul QR către scaner\",\r\n  \"Profile_Cards_No_Reservation\": \"Nicio rezervare\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Se pare că nu poți rezerva în această zi.\",\r\n  \"Profile_Cards_History\": \"Istoric\",\r\n  \"Magic_Important\": \"Poate fi important\",\r\n\r\n  \"OnBoarding_Step\": \"Pasul \",\r\n  \"OnBoarding_Step_Of\": \"din \",\r\n\r\n  \"Consent_Advanced_Title\": \"Vreau să ajut Papillon\",\r\n  \"Consent_Advanced_Description\": \"Colectăm informații mai detaliate despre utilizarea ta.\",\r\n  \"Consent_Required_Title\": \"Doar esențialul\",\r\n  \"Consent_Required_Description\": \"Pe scurt, să știm că cineva folosește Papillon, dacă totul a mers bine și ce serviciu folosește.\",\r\n  \"Consent_None_Title\": \"Nimic\",\r\n  \"Consent_None_Description\": \"Nu vom ști nici măcar de existența ta.\",\r\n  \"Consent_Title\": \"Tu și Papillon\",\r\n  \"Consent_Intro1\": \"Pentru a ajuta Papillon să crească, poți alege să partajezi câteva informații de utilizare.\",\r\n  \"Consent_PrivacyPolicy\": \"În caz de dubiu, consultă politica noastră de confidențialitate\",\r\n  \"Consent_Refuse\": \"Refuză\",\r\n  \"Consent_Accept\": \"Acceptă\",\r\n  \"Consent_ChangeMind\": \"Poți să te răzgândești oricând din setările aplicației.\",\r\n  \"Consent_Arg1\": \"Servește doar la îmbunătățirea aplicației\",\r\n  \"Consent_Arg2\": \"Anonim și fără legătură cu identitatea ta\",\r\n  \"Consent_Arg3\": \"Nu avem acces la conturile tale\",\r\n\r\n  \"Changelog_Title\": \"Note de actualizare\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Data predării\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Materii\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Neterminată\",\r\n  \"Tasks_ThisWeek\": \"Săptămâna aceasta\",\r\n\r\n  \"Task_Undone\": \"Neterminată\",\r\n  \"Task_Done\": \"Terminată\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Personalizează fundalul\",\r\n  \"Modal_Profile_Title\": \"Personalizează profilul\",\r\n\r\n  \"Modal_Task_Status\": \"Starea temei\",\r\n  \"Modal_Task_Description\": \"Descrierea temei\",\r\n  \"Modal_Task_Attachments\": \"Atașamente\",\r\n\r\n  \"Today\": \"Astăzi\",\r\n  \"Yesterday\": \"Ieri\",\r\n  \"Tomorrow\": \"Mâine\"\r\n}"
  },
  {
    "path": "locales/ru.json",
    "content": "{\n  \"Global_Back\": \"Назад\",\n  \"Global_DatePrefix\": \"Он\",\n\n  \"Tab_Home\": \"Главная\",\n  \"Tab_Calendar\": \"Уроки\",\n  \"Tab_Tasks\": \"Задания\",\n  \"Tab_Grades\": \"Оценки\",\n  \"Tab_Profile\": \"Профиль\",\n  \"Tab_Custom_Profile\": \"Редактировать профиль\",\n  \"Button_Change_ProfilePicture\": \"Изменить фото профиля\",\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Сделать фото\",\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Из медиатеки\",\n  \"Button_Change_ProfilePicture_FromService\": \"Загрузить из школьного аккаунта\",\n  \"Button_Change_ProfilePicture_Remove\": \"Удалить фото\",\n  \"Tab_Page\": \"Страница\",\n  \"Tab_Settings\": \"Настройки\",\n  \"Tab_News\": \"Новости\",\n\n  \"ONBOARDING_MAIN_TITLE\": \"Приложение для управления твоей школьной жизнью\",\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Подключи свои школьные сервисы, чтобы получить доступ к оценкам, расписанию, заданиям и многому другому в интерфейсе Papillon!\",\n  \"ONBOARDING_START_BTN\": \"Начать\",\n  \"ONBOARDING_HELP_BTN\": \"Нужна помощь?\",\n  \"ONBOARDING_UNIVERSITY\": \"Университетский сервис\",\n  \"ONBOARDING_RESTAURANTS\": \"Сервис питания\",\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Выбери свой школьный сервис\",\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Выбери свой сервис питания\",\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Выбери свой университетский сервис\",\n  \"ONBOARDING_LOGIN_METHOD\": \"Как ты хочешь войти?\",\n  \"ONBOARDING_METHOD_POSITION\": \"Использовать моё местоположение\",\n  \"ONBOARDING_METHOD_SEARCH\": \"Найти город\",\n  \"ONBOARDING_METHOD_QRCODE\": \"У меня есть QR-код\",\n  \"ONBOARDING_METHOD_LINK\": \"У меня есть ссылка для входа\",\n  \"ONBOARDING_SELECT_SCHOOL\": \"Выбери своё учебное заведение\",\n  \"ONBOARDING_SEARCH_TITLE\": \"Введи название города и выбери школу\",\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Войди как обычно\",\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Войди в свой аккаунт\",\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Выбери хост, привязанный к аккаунту\",\n  \"ONBOARDING_PRONOTE_PIN\": \"Введи 4-значный код, который ты создал в PRONOTE\",\n  \"ONBOARDING_LOGIN_TO\": \"Подключение к\",\n  \"ONBOARDING_SCAN_QRCODE\": \"Отсканируй QR-код своей школы, чтобы войти.\",\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Проверка QR-кода\",\n  \"ONBOARDING_QRCODE_WAIT\": \"Это может занять несколько секунд...\",\n  \"ONBOARDING_URL\": \"Введи URL-адрес твоей школы\",\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL твоего инстанса PRONOTE\",\n  \"ONBOARDING_COLOR_TITLE\": \"Перед тем как закончить\",\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Выбери\",\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"цвет темы\",\n  \"ONBOARDING_LOGIN_PINCODE\": \"Введи PIN-код твоего PRONOTE\",\n  \"Onboarding_Load_Webview_Description\": \"Загружаем сайт твоей школы\",\n  \"INPUT_PIN\": \"PIN-код\",\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Поиск инстанса...\",\n  \"ONBOARDING_LOADING_LOGIN\": \"Вход в систему...\",\n\n  \"WAITING\": \"Ожидание\",\n  \"IZLY_SMS_SEND\": \"Тебе пришла ссылка для входа. Нажми на неё и следуй инструкциям.\",\n  \"STEP\": \"Шаг\",\n  \"STEP_OUTOF\": \"из\",\n  \"INPUT_USERNAME\": \"Имя пользователя\",\n  \"INPUT_MAIL\": \"Электронная почта\",\n  \"INPUT_MAIL_OR_USERNAME\": \"Электронная почта или имя пользователя\",\n  \"INPUT_PHONE_OR_MAIL\": \"Номер телефона или эл. почта\",\n  \"INPUT_PASSWORD\": \"Пароль\",\n  \"INPUT_PASSWORD_CODE\": \"Код доступа\",\n  \"INPUT_ETABID\": \"Идентификатор школы\",\n  \"LOGIN_BTN\": \"Войти\",\n  \"CONFIRM_BTN\": \"Подтвердить\",\n  \"CANCEL_BTN\": \"Отмена\",\n\n  \"Tab_New_Event\": \"Новое событие\",\n\n  \"Tab_Calendar_Icals\": \"Управление iCal\",\n  \"Tab_Calendar_Icals_Description\": \"Управление твоими ссылками iCal\",\n\n  \"Tab_Calendar_Icals_Add_URL\": \"Добавить ссылку iCal\",\n  \"Tab_Calendar_Icals_Manage_Title\": \"Управление {{title}}\",\n  \"Tab_Calendar_Icals_Manage_Description\": \"Добавь или удали ссылки iCal для синхронизации с календарем.\",\n  \"Tab_Calendar_Icals_Add_Title\": \"Отсутствует название\",\n  \"Tab_Calendar_Icals_Add_Description\": \"Дай название этой ссылке iCal, чтобы добавить её.\",\n  \"Tab_Calendar_Icals_Empty\": \"Ссылки iCal не добавлены\",\n\n  \"TabUnderConstruction_Title\": \"Эта вкладка в разработке.\",\n  \"TabUnderConstruction_Details\": \"Загляни сюда позже.\",\n\n  \"TabDevModeNotice_Title\": \"Режим разработчика\",\n  \"TabDevModeNotice_Details\": \"Тестовая среда для разработчиков.\",\n\n  \"Alert_TechnicalDetails\": \"Технические подробности\",\n\n  \"Online_Course\": \"Онлайн\",\n  \"Evaluated_Course\": \"Оценка\",\n  \"Edited_Course\": \"Урок изменен\",\n  \"Canceled_Course\": \"Урок отменен\",\n  \"No_Course_Room\": \"Кабинет неизвестен\",\n  \"Event_DeleteEvent\": \"Удалить событие\",\n  \"Event_Confirm_DeleteEvent\": \"Ты уверен, что хочешь удалить это событие?\",\n\n  \"Course_Separator_Lunch_Default\": \"Обеденный перерыв\",\n  \"Course_Separator_Lunch_Alt_1\": \"Приятного аппетита!\",\n  \"Course_Separator_Lunch_Alt_2\": \"Ням-ням!\",\n\n  \"Course_Separator_Morning_Default\": \"Утренний перерыв\",\n  \"Course_Separator_Morning_Alt_1\": \"Пора баиньки!\",\n  \"Course_Separator_Morning_Alt_2\": \"Завтрак\",\n\n  \"Course_Separator_Evening_Default\": \"Дневной перерыв\",\n  \"Course_Separator_Evening_Alt_1\": \"Нужен перерыв!\",\n  \"Course_Separator_Evening_Alt_2\": \"Время полдника!\",\n\n  \"Course_Separator_Night_Default\": \"Вечерний перерыв\",\n  \"Course_Separator_Night_Alt_1\": \"Пора баиньки!\",\n  \"Course_Separator_Night_Alt_2\": \"Уже ночь!\",\n\n  \"Context_Delete\": \"Удалить\",\n  \"Context_Cancel\": \"Отмена\",\n  \"Context_Edit\": \"Изменить\",\n  \"Context_Add\": \"Добавить\",\n\n  \"Form_Title\": \"Заголовок\",\n  \"Form_Location\": \"Местоположение\",\n  \"Form_Organizer\": \"Организатор\",\n  \"Form_Start\": \"Начало\",\n  \"Form_End\": \"Конец\",\n\n  \"Confirm_DeleteEvent\": \"Ты уверен, что хочешь удалить это событие?\",\n\n  \"Home_Welcome_Name\": \"Привет, {{name}} {{emoji}}\",\n  \"Home_Display_More\": \"Показать больше\",\n  \"Home_Cards_Button_Description_Plurial\": \"доступно\",\n  \"Home_Chats_Plurial\": \"диалогов\",\n  \"Home_Chats_Singular\": \"диалог\",\n  \"Home_See_All_Tasks\": \"Все задания\",\n  \"Home_Welcome\": \"Привет!\",\n  \"Home_Planned_None\": \"На сегодня уроков больше нет\",\n  \"Home_Planned_One\": \"Остался один урок сегодня\",\n  \"Home_Planned_Number\": \"Осталось уроков сегодня: {{number}}\",\n\n  \"Home_Widget_NextCourses\": \"Следующие уроки\",\n  \"Home_Widget_NewGrades\": \"Новые оценки\",\n  \"Home_Widget_NewHomeworks\": \"Нужно сделать\",\n\n  \"Home_Widget_NoCourses\": \"Нет ближайших уроков\",\n  \"Home_Widget_NoCourses_Description\": \"На сегодня уроков не запланировано.\",\n\n  \"Home_Cards_Button_Title\": \"Карты\",\n  \"Home_Cards_Button_Description_None\": \"Нет карт\",\n  \"Home_Cards_Button_Description_Singular\": \"Одна карта\",\n  \"Home_Cards_Button_Description_Number\": \"Карт: {{number}}\",\n\n  \"Home_Chats_Button_Title\": \"Сообщения\",\n  \"Home_Chats_Button_Description_None\": \"Нет сообщений\",\n  \"Home_Chats_Button_Description_Singular\": \"Одно сообщение\",\n  \"Home_Chats_Button_Description_Number\": \"Сообщений: {{number}}\",\n\n  \"Home_Attendance_Title\": \"Пропуски\",\n  \"Home_Attendance_Button_Description_None\": \"Нет пропусков\",\n  \"Home_Attendance_Button_Description_Singular\": \"Один пропуск\",\n  \"Home_Attendance_Button_Description_Number\": \"Пропусков: {{number}}\",\n\n  \"Home_Menu_Button_Title\": \"Меню\",\n  \"Home_Menu_Button_Description\": \"Меню на сегодня\",\n\n  \"Tab_Calendar_Empty\": \"Событий не найдено\",\n  \"Tab_Calendar_Empty_Description\": \"Добавь событие или синхронизируй календарь, чтобы начать.\",\n\n  \"Modal_Course_Title\": \"Мой урок\",\n  \"Modal_Course_StartsIn\": \"Начнется через\",\n  \"Modal_Course_StartedAgo\": \"Завершился\",\n  \"Modal_Course_Ongoing\": \"Идет уже\",\n  \"Modal_Course_Group\": \"Группа\",\n  \"Modal_Course_Group_Full\": \"Класс\",\n\n  \"Modal_Course_Details\": \"Детали урока\",\n  \"Modal_Course_Teacher\": \"Учитель\",\n  \"Modal_Course_Room\": \"Кабинет\",\n  \"Modal_Course_Duration\": \"Длительность\",\n\n  \"Modal_Course_Time\": \"Расписание урока\",\n  \"Modal_Course_Start\": \"Начало\",\n  \"Modal_Course_End\": \"Конец\",\n\n  \"Tasks_Search_Placeholder\": \"Поиск заданий\",\n  \"Tasks_LeftHomeworks_Title\": \"осталось заданий\",\n  \"Tasks_LeftHomeworks_Time\": \"на этой неделе\",\n  \"Tasks_Done_AllTasks\": \"Все задания\",\n  \"Tasks_Done_CompletedTasks\": \"выполнены\",\n  \"Tasks_Nav_Left\": \"Осталось {{count}} зад.\",\n  \"Tasks_Nav_One\": \"Осталось 1 задание\",\n  \"Tasks_Nav_Completed\": \"Все готово!\",\n  \"Tasks_Week\": \"Неделя\",\n  \"Tasks_NoTasks_Title\": \"Заданий нет\",\n  \"Tasks_NoTasks_Description\": \"На эту неделю заданий нет. Можно отдохнуть!\",\n  \"Tasks_NoTasks_ForWeek\": \"на неделю {{week}}\",\n  \"Tasks_NoTasks_Nav\": \"Нет заданий\",\n  \"Task_Start\": \"Сделать\",\n  \"Task_Complete\": \"Выполнено\",\n  \"Task_Sorting_Title\": \"Сортировать по\",\n  \"Task_OnlyShowUndone\": \"Завершенные задания\",\n  \"Task_Show_Title\": \"Показать\",\n  \"Settings_General\": \"Общие\",\n\n  \"Latest_Grades\": \"Новые оценки\",\n  \"Grades_Search_Placeholder\": \"Поиск оценки или предмета\",\n\n  \"Grades_Avg_Methods\": \"Методы расчета\",\n  \"Grades_Avg_All_Title\": \"Общий средний балл\",\n  \"Grades_Avg_All_Short\": \"Общий балл\",\n  \"Grades_Avg_All_Pond\": \"Взвешенный средний балл\",\n  \"Grades_Avg_All_Pond_Short\": \"Взвеш. балл\",\n  \"Grades_Avg_All_Pond_Description\": \"Рассчитывает взвешенное среднее всех оценок\",\n  \"Grades_Avg_Subject_Title\": \"Среднее по предметам\",\n  \"Grades_Avg_Subject_Short\": \"Сред. по предм.\",\n  \"Grades_Avg_Subject_Description\": \"Рассчитывает среднее значение средних баллов по предметам\",\n  \"Grades_Avg_Median_Title\": \"Медиана\",\n  \"Grades_Avg_Median_Short\": \"Медиана\",\n\n  \"Grades_Avg_More\": \"Узнать больше\",\n  \"Grades_Avg_KnowMore\": \"Подробнее\",\n  \"Grades_Avg_KnowMore_Description\": \"Как рассчитывается общий средний балл\",\n\n  \"Grades_SubjectInfo\": \"Информация о предмете\",\n  \"Grades_SubjectInfo_NbGrades\": \"Оценок: {{number}}\",\n  \"SubjectInfo_StudentAverage_Label\": \"Средний балл ученика\",\n  \"SubjectInfo_Stats_Header\": \"Статистика\",\n  \"SubjectInfo_ClassAverage_Label\": \"Средний балл класса\",\n  \"SubjectInfo_ClassAverage_Description\": \"Общий средний балл всего класса\",\n  \"SubjectInfo_MaxAverage_Label\": \"Максимальный балл\",\n  \"SubjectInfo_MaxAverage_Description\": \"Лучший балл в группе\",\n  \"SubjectInfo_MinAverage_Label\": \"Минимальный балл\",\n  \"SubjectInfo_MinAverage_Description\": \"Самый низкий балл в группе\",\n\n  \"Grades_Semester\": \"Семестр\",\n  \"Grades_Trimester\": \"Триместр\",\n  \"Grades_OutPeriod\": \"Вне периода\",\n  \"Grades_Year\": \"Год\",\n  \"Grades_MockExamBac\": \"Пробный экзамен (Bac)\",\n  \"Grades_MockExamBrevet\": \"Пробный экзамен (Brevet)\",\n\n  \"Grades_Method_AllGrades\": \"Все предметы\",\n  \"Grades_Method_Weighted\": \"Весовой коэффициент\",\n\n  \"Grades_Sort\": \"Сортировка\",\n  \"Grades_Sorting_Alphabetical\": \"По алфавиту\",\n  \"Grades_Sorting_Averages\": \"По баллам\",\n  \"Grades_Sorting_Date\": \"По дате\",\n\n  \"Grades_Menu_SortBy\": \"Сортировка по\",\n  \"Grades_Menu_AverageBy\": \"Среднее по\",\n  \"NoAverage\": \"Нет среднего балла\",\n\n  \"Grades_Empty_Title\": \"Нет оценок\",\n  \"Grades_Empty_Description\": \"У тебя пока нет оценок за этот период.\",\n\n  \"Grade_NoDescription\": \"Задание по предмету {{subject}}\",\n\n  \"Grades_Tab_Subjects\": \"Предметы\",\n  \"Grades_Tab_Latest\": \"Новые оценки\",\n\n  \"Profile_Attendance_Title\": \"Посещаемость\",\n  \"Profile_Attendance_Denominator_Single\": \"пропуск\",\n  \"Profile_Attendance_Denominator_Plural\": \"пропуска/ов\",\n\n  \"Profile_Discussions_Title\": \"Обсуждения\",\n  \"Profile_Discussions_Denominator_Single\": \"непрочитанное\",\n  \"Profile_Discussions_Denominator_Plural\": \"непрочитанных\",\n\n  \"Profile_News_Title\": \"Новости\",\n  \"Profile_News_Denominator_Single\": \"новая\",\n  \"Profile_News_Denominator_Plural\": \"новых\",\n  \"Profile_News_Open\": \"Открыть\",\n  \"Profile_News_Loading_Title\": \"Загрузка новостей...\",\n  \"Profile_News_Author_Unknown\": \"Автор неизвестен\",\n\n  \"Profile_Cards_Title\": \"QR-коды и карты\",\n\n  \"Modal_Grades_Title\": \"Детали оценки\",\n  \"Modal_Grades_BestGrade\": \"Лучшая оценка в группе\",\n\n  \"Grades_Details_Title\": \"Подробности\",\n  \"Grades_NormalizedGrade_Title\": \"Оценка по 20-балльной шкале\",\n  \"Grades_NormalizedGrade_Description\": \"Значение оценки, приведенное к шкале 20\",\n  \"Grades_HighestGrade_Title\": \"Высшая оценка\",\n  \"Grades_HighestGrade_Description\": \"Максимальная оценка в группе\",\n  \"Grades_LowestGrade_Title\": \"Низшая оценка\",\n  \"Grades_LowestGrade_Description\": \"Минимальная оценка в группе\",\n  \"Grades_Influence_Title\": \"Влияние\",\n  \"Grades_Avg_Group_Title\": \"Средний балл группы\",\n  \"Grades_Coefficient\": \"Коэффициент\",\n  \"Grades_Avg_Group_Short\": \"Сред. группы\",\n  \"Grades_Tab_Rank\": \"Рейтинг\",\n  \"Grades_Tab_Rank_Description\": \"Место в группе\",\n\n  \"News_Search_Placeholder\": \"Поиск новостей\",\n  \"News_Empty_Title\": \"Новостей нет\",\n  \"News_Empty_Description\": \"В твоем учебном заведении новостей не найдено.\",\n  \"News_Search_NoResults\": \"Новости не найдены\",\n  \"News_Search_NoResults_Description\": \"По твоему запросу ничего не найдено.\",\n\n  \"News_Theme_Papillon_Title\": \"Papillon\",\n  \"News_Theme_Papillon_Description\": \"Мягкая и элегантная тема\",\n\n  \"News_Theme_Reading_Title\": \"Чтение\",\n  \"News_Theme_Reading_Description\": \"Тема, созданная для комфортного чтения\",\n\n  \"Attendance_Hours_Missed\": \"Пропущено часов\",\n  \"Attendance_Hours_Unjustified\": \"Неуважительных часов\",\n  \"Attendance_Missing\": \"Пропуски\",\n  \"Attendance_Delays\": \"Опоздания\",\n  \"Attendance_NoReason\": \"Без причины\",\n  \"Attendance_NoEvent_Title\": \"Нет событий\",\n  \"Attendance_NoEvent_Description\": \"За этот период пропусков и опозданий не найдено.\",\n\n  \"Settings_Account_Title\": \"Мой аккаунт\",\n  \"Settings_Account_Description\": \"Мой аккаунт\",\n  \"Settings_Services_Title\": \"Связанные аккаунты\",\n  \"Settings_Services_Title_LastAccountUsed\": \"Последний аккаунт\",\n  \"Settings_Notifications_Title\": \"Уведомления\",\n  \"Settings_Notifications_Description\": \"Оповещения, частота...\",\n  \"Settings_Subjects_Title\": \"Предметы\",\n  \"Settings_Subjects_Description\": \"Название, цвет, шрифт...\",\n  \"Settings_Personalization_Title\": \"Персонализация\",\n  \"Settings_Personalization_Description\": \"Темы, цвета...\",\n  \"Settings_Cards_Title\": \"Карты\",\n  \"Settings_Cards_Description\": \"Столовая, пропуск...\",\n  \"Settings_Accessibility_Title\": \"Доступность\",\n  \"Settings_Accessibility_Description\": \"Экран, звук...\",\n  \"Settings_MagicPlus_Title\": \"Magic+\",\n  \"Settings_MagicPlus_Description\": \"Умные функции\",\n  \"Settings_MagicPlus_Description_Card\": \"Функции ИИ\",\n  \"Settings_MagicPlus_Enable\": \"Включить Magic+\",\n  \"Settings_MagicPlus_Description_Optimization\": \"Автоматически оптимизирует список дел для повышения продуктивности\",\n  \"Settings_MagicPlus_ExplanationLocal\": \"Полностью локальная модель, данные не покидают устройство\",\n  \"Settings_Donate_Title\": \"Поддержать проект\",\n  \"Settings_Donate_Description\": \"Сделать пожертвование\",\n  \"Settings_Telemetry_Title\": \"Телеметрия и конфиденциальность\",\n  \"Settings_Telemetry_Description\": \"Управление сбором данных\",\n  \"Settings_About_Title\": \"О приложении\",\n  \"Settings_About_Description\": \"Версия\",\n  \"Settings_Logout_Title\": \"Выйти\",\n  \"Settings_Logout_Description\": \"Удалить этот аккаунт из Papillon\",\n  \"Settings_Language_Title\": \"Язык\",\n  \"Settings_Language_Description\": \"Изменить язык\",\n  \"Settings_Tabs_Title\": \"Вкладки\",\n  \"Settings_Tabs_Description\": \"Скрыть вкладки меню\",\n\n  \"Settings_Personalization_Title_Card\": \"Персонализация\",\n  \"Settings_Personalization_Subtitle_Card\": \"Темы, предметы...\",\n  \"Settings_SubjectPersonalization_Title\": \"Настроить предметы\",\n  \"Settings_Personalization_Accent\": \"Акцентный цвет\",\n  \"Settings_Personalization_Accent_Description\": \"Этот цвет будет использоваться на главной странице Papillon.\",\n  \"Settings_Personalization_Theme\": \"Тема\",\n  \"Settings_Personalization_Icon_Title\": \"Сменить иконку\",\n  \"Settings_Personalization_Icon_Description\": \"Настроить иконку приложения\",\n  \"Settings_Personalization_Subject_Title\": \"Настроить предметы\",\n  \"Settings_Personalization_Subject_Title_Card\": \"Предметы\",\n  \"Settings_Personalization_Subject_Description\": \"Иконки, цвета\",\n  \"Settings_About_Papillion_Behind\": \"Кто создал Papillon\",\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon поддерживается студентами-волонтёрами\",\n  \"Settings_About_Discord\": \"Сервер Discord\",\n  \"Settings_About_Discord_Description\": \"Присоединиться к Discord\",\n  \"Settings_About_Crowdin\": \"Проект Crowdin\",\n  \"Settings_About_Crowdin_Description\": \"Помочь с переводом\",\n  \"Settings_About_Github\": \"Проект GitHub\",\n  \"Settings_About_Github_Description\": \"Внести вклад на GitHub\",\n  \"Settings_About_Issue\": \"Сообщить об ошибке\",\n  \"Settings_About_Issue_Description\": \"Сообщить о найденном баге\",\n  \"Settings_About_Dependency_Version\": \"Версия зависимостей\",\n\n  \"Alert_No_Technical\": \"Техническая информация недоступна.\",\n  \"Alert_Auth_Error\": \"Ошибка аутентификации\",\n  \"Alert_Auth_Bad_Creds\": \"Введенные данные неверны или ты пытаешься войти через родительский аккаунт. Родительские аккаунты пока не поддерживаются в Papillon.\",\n  \"Alert_Not_Supported\": \"Инстанс не поддерживается\",\n  \"Alert_Security_Instance_HTTP\": \"Из соображений безопасности Papillon не работает с инстансами, использующими протокол HTTP. Рекомендуем сообщить администрации школы о необходимости обновления.\",\n  \"Alert_NoDemo\": \"Papillon не работает с демо-версиями, пожалуйста, используй реальный инстанс.\",\n  \"Alert_Invalid_Instance\": \"Papillon не может получить данные от этого инстанса PRONOTE. Он всё еще работает?\",\n  \"Alert_No_Pos\": \"Не удалось определить местоположение\",\n  \"Alert_Connexion_Fail\": \"Ошибка подключения\",\n\n  \"Feature_Limited\": \"Ограниченные функции\",\n  \"Feature_Soon\": \"Скоро появится!\",\n  \"Feature_Soon_Notification\": \"Мы работаем над тем, чтобы добавить эту функцию в ближайших обновлениях.\",\n  \"Feature_Add_Card\": \"Добавь новую карту во вкладке Профиль\",\n\n  \"Webview_Wait\": \"Немного терпения...\",\n\n  \"Profile_QRCards\": \"QR-коды и карты\",\n  \"Profile_QRCards_Subtitle\": \"Карт: {{count}}\",\n  \"Profile_Cards_Loading_History\": \"Загрузка истории транзакций\",\n  \"Profile_Cards_Loading_History_Description\": \"Это может занять некоторое время...\",\n\n  \"Settings_Cards_Banner_Title\": \"Карты\",\n  \"Settings_Cantineen_Subtitle_Card\": \"Столовая, доступ\",\n  \"Settings_Cards_Banner_Description\": \"Добавь карты столовой или транспорта, чтобы они всегда были под рукой в Papillon\",\n  \"Settings_Cards_None_Title\": \"Нет карт\",\n  \"Settings_Cards_Add_Button\": \"Добавить\",\n\n  \"Settings_Cards_None_Description\": \"Добавь карту, чтобы проверять баланс столовой, сканировать QR-код и многое другое\",\n  \"Settings_Subjects_None_Title\": \"Нет предметов\",\n  \"Settings_Subjects_None_Description\": \"Просмотри вкладки приложения, чтобы настроить предметы.\",\n  \"Settings_Subjects_Reset_Title\": \"Сбросить\",\n  \"Settings_Subjects_Reset_Message\": \"Ты действительно хочешь сбросить настройки всех предметов?\",\n  \"Settings_Subjects_Reset_Button\": \"Сбросить\",\n\n  \"Settings_Donator\": \"Донатеры\",\n  \"Settings_Donator_Description\": \"Список тех, кто поддержал проект\",\n  \"Settings_App_Version\": \"Версия приложения\",\n\n  \"Profile_Cards_Scan_Orientation\": \"Направь QR-код на сканер терминала\",\n  \"Profile_Cards_No_Reservation\": \"Нет бронирований\",\n  \"Profile_Cards_No_Available_Reservation\": \"Похоже, на этот день бронирование невозможно.\",\n  \"Profile_Cards_History\": \"История\",\n  \"Magic_Important\": \"Возможно, это важно\",\n\n  \"OnBoarding_Step\": \"Шаг \",\n  \"OnBoarding_Step_Of\": \" из \",\n\n  \"Consent_Advanced_Title\": \"Я хочу помочь Papillon\",\n  \"Consent_Advanced_Description\": \"Мы собираем подробную информацию о том, как ты пользуешься приложением.\",\n  \"Consent_Required_Title\": \"Только самое важное\",\n  \"Consent_Required_Description\": \"Мы будем знать, что кто-то пользуется Papillon, всё ли работает и какой сервис выбран.\",\n  \"Consent_None_Title\": \"Ничего не отправлять\",\n  \"Consent_None_Description\": \"Мы даже не будем знать о твоём существовании.\",\n  \"Consent_Title\": \"Ты и Papillon\",\n  \"Consent_Intro1\": \"Чтобы помочь Papillon расти, ты можешь делиться данными об использовании.\",\n  \"Consent_PrivacyPolicy\": \"Если есть сомнения, ознакомься с нашей политикой конфиденциальности\",\n  \"Consent_Refuse\": \"Отклонить\",\n  \"Consent_Accept\": \"Принять\",\n  \"Consent_ChangeMind\": \"Ты можешь изменить решение в любой момент в настройках.\",\n  \"Consent_Arg1\": \"Используется только для улучшения приложения\",\n  \"Consent_Arg2\": \"Анонимно и не связано с твоей личностью\",\n  \"Consent_Arg3\": \"У нас нет доступа к твоим аккаунтам\",\n\n  \"Changelog_Title\": \"Что нового\",\n\n  \"Tasks_Sorting_Methods_DueDate\": \"Дата сдачи\",\n  \"Tasks_Sorting_Methods_Subject\": \"Предметы\",\n  \"Tasks_Sorting_Methods_Done\": \"Не выполнено\",\n  \"Tasks_ThisWeek\": \"На этой неделе\",\n\n  \"Task_Undone\": \"Не выполнено\",\n  \"Task_Done\": \"Выполнено\",\n\n  \"Modal_Wallpaper_Title\": \"Настроить обои\",\n  \"Modal_Profile_Title\": \"Настроить профиль\",\n\n  \"Modal_Task_Status\": \"Статус задания\",\n  \"Modal_Task_Description\": \"Описание задания\",\n  \"Modal_Task_Attachments\": \"Вложения\",\n\n  \"Today\": \"Сегодня\",\n  \"Yesterday\": \"Вчера\",\n  \"Tomorrow\": \"Завтра\"\n}"
  },
  {
    "path": "locales/sk.json",
    "content": "{\r\n  \"Global_Back\": \"Späť\",\r\n  \"Global_DatePrefix\": \"dňa\",\r\n\r\n  \"Tab_Home\": \"Domov\",\r\n  \"Tab_Calendar\": \"Rozvrh\",\r\n  \"Tab_Tasks\": \"Úlohy\",\r\n  \"Tab_Grades\": \"Známky\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Upraviť môj profil\",\r\n  \"Button_Change_ProfilePicture\": \"Zmeniť profilovú fotku\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Odfotiť\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Z galérie\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Načítať zo školského systému (ENT)\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Odstrániť fotku\",\r\n  \"Tab_Page\": \"Stránka\",\r\n  \"Tab_Settings\": \"Nastavenia\",\r\n  \"Tab_News\": \"Novinky\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Aplikácia na správu tvojho školského života\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Prepoj svoje školské aplikácie a získaj prístup k známkam, rozvrhu, úlohám a mnohému ďalšiemu v rozhraní Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Začať\",\r\n  \"ONBOARDING_HELP_BTN\": \"Potrebuješ pomoc?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Univerzitné služby\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Stravovacie služby\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Vyber svoju školskú službu\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Vyber svoju stravovaciu službu\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Vyber svoju univerzitnú službu\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Ako sa chceš prihlásiť?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Použiť moju polohu\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Hľadať mesto\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Mám QR kód\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Mám prihlasovaciu URL\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Vyber svoju školu\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Zadaj názov mesta a vyber svoju školu\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Prihlás sa tak, ako si zvyknutý\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Prihlás sa do svojho účtu\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Vyber hostiteľa priradeného k účtu\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Zadaj 4-miestny kód, ktorý si práve vytvoril v PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Prihlasovanie k\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Naskenuj QR kód svojej školy pre pripojenie.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Overovanie QR kódu\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Môže to chvíľu trvať...\",\r\n  \"ONBOARDING_URL\": \"Zadaj URL adresu svojej školy\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL tvojej inštancie PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Pred dokončením\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Vyber si\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"farbu témy\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Zadaj PIN kód zo svojho PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"Načítavame stránku tvojej školy\",\r\n  \"INPUT_PIN\": \"PIN kód\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Hľadať inštanciu...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Prihlasovanie...\",\r\n\r\n  \"WAITING\": \"Čakajte\",\r\n  \"IZLY_SMS_SEND\": \"Práve si dostal odkaz na prihlásenie, klikni naho a postupuj podľa krokov.\",\r\n  \"STEP\": \"Krok\",\r\n  \"STEP_OUTOF\": \"z\",\r\n  \"INPUT_USERNAME\": \"Používateľské meno\",\r\n  \"INPUT_MAIL\": \"E-mailová adresa\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-mail alebo používateľské meno\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Telefónne číslo alebo e-mail\",\r\n  \"INPUT_PASSWORD\": \"Heslo\",\r\n  \"INPUT_PASSWORD_CODE\": \"Prístupový kód\",\r\n  \"INPUT_ETABID\": \"Identifikátor tvojej školy\",\r\n  \"LOGIN_BTN\": \"Prihlásiť sa\",\r\n  \"CONFIRM_BTN\": \"Potvrdiť\",\r\n  \"CANCEL_BTN\": \"Zrušiť\",\r\n\r\n  \"Tab_New_Event\": \"Nová udalosť\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Správa iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Spravuj svoje iCal URL adresy\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Pridať iCal URL\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Spravovať {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Pridaj alebo odstráň iCal URL pre synchronizáciu s tvojím rozvrhom.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Chýba názov\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Pomenuj túto iCal URL pre jej pridanie.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Žiadne pridané iCal URL\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Táto karta sa pripravuje.\",\r\n  \"TabUnderConstruction_Details\": \"Vráť sa neskôr pre aktualizácie.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Vývojársky režim\",\r\n  \"TabDevModeNotice_Details\": \"Kompletné testovacie prostredie pre vývojárov.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Technické detaily\",\r\n\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Hodnotenie/Test\",\r\n  \"Edited_Course\": \"Zmenená lekcia\",\r\n  \"Canceled_Course\": \"Zrušená lekcia\",\r\n  \"No_Course_Room\": \"Neznáma učebňa\",\r\n  \"Event_DeleteEvent\": \"Odstrániť udalosť\",\r\n  \"Event_Confirm_DeleteEvent\": \"Naozaj chceš odstrániť túto udalosť?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Obedná prestávka\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Dobrú chuť!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Mňam!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Dopoludňajšia prestávka\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Šup do hajan!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Raňajky\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Popoludňajšia prestávka\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Čas na pauzu!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Čas na olovrant!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Večerná prestávka\",\r\n  \"Course_Separator_Night_Alt_1\": \"Šup do hajan!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Už je noc!\",\r\n\r\n  \"Context_Delete\": \"Odstrániť\",\r\n  \"Context_Cancel\": \"Zrušiť\",\r\n  \"Context_Edit\": \"Upraviť\",\r\n  \"Context_Add\": \"Pridať\",\r\n\r\n  \"Form_Title\": \"Názov\",\r\n  \"Form_Location\": \"Umiestnenie\",\r\n  \"Form_Organizer\": \"Organizátor\",\r\n  \"Form_Start\": \"Začiatok\",\r\n  \"Form_End\": \"Koniec\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Naozaj chceš odstrániť túto udalosť?\",\r\n\r\n  \"Home_Welcome_Name\": \"Ahoj, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Zobraziť viac\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"k dispozícii\",\r\n  \"Home_Chats_Plurial\": \"diskusií\",\r\n  \"Home_Chats_Singular\": \"diskusia\",\r\n  \"Home_See_All_Tasks\": \"Zobraziť všetky úlohy\",\r\n  \"Home_Welcome\": \"Dobrý deň!\",\r\n  \"Home_Planned_None\": \"Dnes už nemáš žiadne ďalšie lekcie\",\r\n  \"Home_Planned_One\": \"Dnes ti zostáva jedna lekcia\",\r\n  \"Home_Planned_Number\": \"Dnes ti zostáva {{number}} lekcií\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Nasledujúce lekcie\",\r\n  \"Home_Widget_NewGrades\": \"Nové známky\",\r\n  \"Home_Widget_NewHomeworks\": \"Úlohy na vypracovanie\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Žiadne nadchádzajúce lekcie\",\r\n  \"Home_Widget_NoCourses_Description\": \"Na dnes nie sú naplánované žiadne lekcie.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Karty\",\r\n  \"Home_Cards_Button_Description_None\": \"Žiadna karta\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Jedna karta\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kariet\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Správy\",\r\n  \"Home_Chats_Button_Description_None\": \"Žiadna správa\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Jedna správa\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} správ\",\r\n\r\n  \"Home_Attendance_Title\": \"Absencie\",\r\n  \"Home_Attendance_Button_Description_None\": \"Žiadna absencia\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Jedna absencia\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} absencií\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Menu\",\r\n  \"Home_Menu_Button_Description\": \"Dnešný jedálny lístok\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Nenašli sa žiadne udalosti\",\r\n  \"Tab_Calendar_Empty_Description\": \"Pridaj udalosť alebo synchronizuj svoj rozvrh, aby si mohol začať.\",\r\n\r\n  \"Modal_Course_Title\": \"Moja lekcia\",\r\n  \"Modal_Course_StartsIn\": \"Začína o\",\r\n  \"Modal_Course_StartedAgo\": \"Skončilo pred\",\r\n  \"Modal_Course_Ongoing\": \"Prebieha už\",\r\n  \"Modal_Course_Group\": \"Skupina\",\r\n  \"Modal_Course_Group_Full\": \"Trieda\",\r\n\r\n  \"Modal_Course_Details\": \"Detaily lekcie\",\r\n  \"Modal_Course_Teacher\": \"Vyučujúci\",\r\n  \"Modal_Course_Room\": \"Učebňa\",\r\n  \"Modal_Course_Duration\": \"Dĺžka\",\r\n\r\n  \"Modal_Course_Time\": \"Čas lekcie\",\r\n  \"Modal_Course_Start\": \"Začiatok\",\r\n  \"Modal_Course_End\": \"Koniec\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Hľadať úlohy\",\r\n  \"Tasks_LeftHomeworks_Title\": \"zostávajúce úlohy\",\r\n  \"Tasks_LeftHomeworks_Time\": \"tento týždeň\",\r\n  \"Tasks_Done_AllTasks\": \"Všetky úlohy\",\r\n  \"Tasks_Done_CompletedTasks\": \"boli splnené\",\r\n  \"Tasks_Nav_Left\": \"Zostáva {{count}} úloh(y)\",\r\n  \"Tasks_Nav_One\": \"Zostáva posledná úloha\",\r\n  \"Tasks_Nav_Completed\": \"Všetko hotové!\",\r\n  \"Tasks_Week\": \"Týždeň\",\r\n  \"Tasks_NoTasks_Title\": \"Žiadne úlohy\",\r\n  \"Tasks_NoTasks_Description\": \"Na tento týždeň nie sú naplánované žiadne úlohy. Uži si oddych!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"pre týždeň {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Žiadne úlohy\",\r\n  \"Task_Start\": \"Úlohy\",\r\n  \"Task_Complete\": \"Hotovo\",\r\n  \"Task_Sorting_Title\": \"Zoradiť podľa\",\r\n  \"Task_OnlyShowUndone\": \"Hotové úlohy\",\r\n  \"Task_Show_Title\": \"Zobraziť\",\r\n  \"Settings_General\": \"Všeobecné\",\r\n\r\n  \"Latest_Grades\": \"Nové známky\",\r\n  \"Grades_Search_Placeholder\": \"Hľadať známku, predmet\",\r\n\r\n  \"Grades_Avg_Methods\": \"Metódy výpočtu\",\r\n  \"Grades_Avg_All_Title\": \"Celkový priemer\",\r\n  \"Grades_Avg_All_Short\": \"Celk. priemer\",\r\n  \"Grades_Avg_All_Pond\": \"Vážený priemer\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Váž. priemer\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Vypočíta vážený priemer všetkých známok\",\r\n  \"Grades_Avg_Subject_Title\": \"Priemer predmetov\",\r\n  \"Grades_Avg_Subject_Short\": \"Priemer predm.\",\r\n  \"Grades_Avg_Subject_Description\": \"Vypočíta vážený priemer z priemerov jednotlivých predmetov\",\r\n  \"Grades_Avg_Median_Title\": \"Medián\",\r\n  \"Grades_Avg_Median_Short\": \"Medián\",\r\n\r\n  \"Grades_Avg_More\": \"Zistiť viac\",\r\n  \"Grades_Avg_KnowMore\": \"Zistiť viac\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Pochopte metódy výpočtu celkového priemeru\",\r\n\r\n  \"Grades_SubjectInfo\": \"Informácie o predmete\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} známka/y\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Priemer žiaka\",\r\n  \"SubjectInfo_Stats_Header\": \"Štatistiky\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Priemer triedy\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Celkový priemer triedy\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Maximálny priemer\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Najlepší priemer v skupine\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Minimálny priemer\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Najslabší priemer v skupine\",\r\n\r\n  \"Grades_Semester\": \"Pololetie\",\r\n  \"Grades_Trimester\": \"Trimestrer\",\r\n  \"Grades_OutPeriod\": \"Mimo obdobia\",\r\n  \"Grades_Year\": \"Rok\",\r\n  \"Grades_MockExamBac\": \"Maturita nanečisto\",\r\n  \"Grades_MockExamBrevet\": \"Skúšky nanečisto\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Všetky predmety\",\r\n  \"Grades_Method_Weighted\": \"Váha (Koeficient)\",\r\n\r\n  \"Grades_Sort\": \"Zoradiť\",\r\n  \"Grades_Sorting_Alphabetical\": \"Abecedne\",\r\n  \"Grades_Sorting_Averages\": \"Podľa priemeru\",\r\n  \"Grades_Sorting_Date\": \"Podľa dátumu\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Zoradiť podľa\",\r\n  \"Grades_Menu_AverageBy\": \"Priemer podľa\",\r\n  \"NoAverage\": \"Žiadny priemer\",\r\n\r\n  \"Grades_Empty_Title\": \"Žiadne známky\",\r\n  \"Grades_Empty_Description\": \"V tomto období si zatiaľ nebol hodnotený.\",\r\n\r\n  \"Grade_NoDescription\": \"Úloha z predmetu {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Predmety\",\r\n  \"Grades_Tab_Latest\": \"Nové známky\",\r\n\r\n  \"Profile_Attendance_Title\": \"Dochádzka\",\r\n  \"Profile_Attendance_Denominator_Single\": \"absencia\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"absencií\",\r\n\r\n  \"Profile_Discussions_Title\": \"Diskusie\",\r\n  \"Profile_Discussions_Denominator_Single\": \"neprečítané\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"neprečítaných\",\r\n\r\n  \"Profile_News_Title\": \"Novinky\",\r\n  \"Profile_News_Denominator_Single\": \"nová\",\r\n  \"Profile_News_Denominator_Plural\": \"nové\",\r\n  \"Profile_News_Open\": \"Otvoriť\",\r\n  \"Profile_News_Loading_Title\": \"Načítavanie noviniek...\",\r\n  \"Profile_News_Author_Unknown\": \"Neznámy autor\",\r\n\r\n  \"Profile_Cards_Title\": \"QR kód a karty\",\r\n\r\n  \"Modal_Grades_Title\": \"Detail známky\",\r\n  \"Modal_Grades_BestGrade\": \"Najlepšia známka v skupine\",\r\n\r\n  \"Grades_Details_Title\": \"Detaily\",\r\n  \"Grades_NormalizedGrade_Title\": \"Známka v prepočte na 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Hodnota známky prevedená na stupnicu 20\",\r\n  \"Grades_HighestGrade_Title\": \"Najvyššia známka\",\r\n  \"Grades_HighestGrade_Description\": \"Maximálna známka dosiahnutá v skupine\",\r\n  \"Grades_LowestGrade_Title\": \"Najnižšia známka\",\r\n  \"Grades_LowestGrade_Description\": \"Minimálna známka dosiahnutá v skupine\",\r\n  \"Grades_Influence_Title\": \"Vplyv\",\r\n  \"Grades_Avg_Group_Title\": \"Priemer skupiny\",\r\n  \"Grades_Coefficient\": \"Váha (Koeficient)\",\r\n  \"Grades_Avg_Group_Short\": \"Priemer sk.\",\r\n  \"Grades_Tab_Rank\": \"Poradie\",\r\n  \"Grades_Tab_Rank_Description\": \"Pozícia v skupine\",\r\n\r\n  \"News_Search_Placeholder\": \"Hľadať novinku\",\r\n  \"News_Empty_Title\": \"Žiadne novinky\",\r\n  \"News_Empty_Description\": \"Vo tvojej škole sa nenašli žiadne novinky.\",\r\n  \"News_Search_NoResults\": \"Žiadna novinka sa nenašla\",\r\n  \"News_Search_NoResults_Description\": \"Pre tvoje vyhľadávanie sa nenašli žiadne výsledky.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Jemný a elegantný motív\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Čítanie\",\r\n  \"News_Theme_Reading_Description\": \"Motív navrhnutý pre pohodlné čítanie\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Vymeškané hodiny\",\r\n  \"Attendance_Hours_Unjustified\": \"Neospravedlnené hodiny\",\r\n  \"Attendance_Missing\": \"Absencie\",\r\n  \"Attendance_Delays\": \"Meškania\",\r\n  \"Attendance_NoReason\": \"Bez dôvodu\",\r\n  \"Attendance_NoEvent_Title\": \"Žiadna udalosť\",\r\n  \"Attendance_NoEvent_Description\": \"Pre toto obdobie nie sú zaznamenané žiadne absencie ani meškania.\",\r\n\r\n  \"Settings_Account_Title\": \"Môj účet\",\r\n  \"Settings_Account_Description\": \"Môj účet\",\r\n  \"Settings_Services_Title\": \"Prepojené účty\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Naposledy použitý účet\",\r\n  \"Settings_Notifications_Title\": \"Oznámenia\",\r\n  \"Settings_Notifications_Description\": \"Upozornenia, frekvencia...\",\r\n  \"Settings_Subjects_Title\": \"Predmety\",\r\n  \"Settings_Subjects_Description\": \"Názov, farba, písmo...\",\r\n  \"Settings_Personalization_Title\": \"Personalizácia\",\r\n  \"Settings_Personalization_Description\": \"Motívy, farby...\",\r\n  \"Settings_Cards_Title\": \"Karty\",\r\n  \"Settings_Cards_Description\": \"Jedáleň, prístup...\",\r\n  \"Settings_Accessibility_Title\": \"Prístupnosť\",\r\n  \"Settings_Accessibility_Description\": \"Zobrazenie, zvuk...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Inteligentné funkcie\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI funkcie\",\r\n  \"Settings_MagicPlus_Enable\": \"Aktivovať Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Automaticky optimalizuje organizáciu tvojich úloh pre zvýšenie produktivity\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Úplne lokálny model, žiadne dáta neopúšťajú tvoje zariadenie\",\r\n  \"Settings_Donate_Title\": \"Podporiť nás\",\r\n  \"Settings_Donate_Description\": \"Podpor projekt\",\r\n  \"Settings_Telemetry_Title\": \"Telemetria a súkromie\",\r\n  \"Settings_Telemetry_Description\": \"Správa zbieraných dát\",\r\n  \"Settings_About_Title\": \"O aplikácii\",\r\n  \"Settings_About_Description\": \"Verzia\",\r\n  \"Settings_Logout_Title\": \"Odhlásiť sa\",\r\n  \"Settings_Logout_Description\": \"Odstrániť tento účet z Papillonu\",\r\n  \"Settings_Language_Title\": \"Jazyk\",\r\n  \"Settings_Language_Description\": \"Zmeniť jazyk\",\r\n  \"Settings_Tabs_Title\": \"Karty\",\r\n  \"Settings_Tabs_Description\": \"Skryť karty z menu\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personalizácia\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Motívy, predmety...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Personalizovať predmety\",\r\n  \"Settings_Personalization_Accent\": \"Farba zvýraznenia\",\r\n  \"Settings_Personalization_Accent_Description\": \"Farba, ktorú tu vyberieš, sa použije na domovskej stránke Papillonu.\",\r\n  \"Settings_Personalization_Theme\": \"Motív\",\r\n  \"Settings_Personalization_Icon_Title\": \"Zmeniť ikonu\",\r\n  \"Settings_Personalization_Icon_Description\": \"Uprav si ikonu aplikácie\",\r\n  \"Settings_Personalization_Subject_Title\": \"Personalizovať predmety\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Predmety\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikony, farby\",\r\n  \"Settings_About_Papillion_Behind\": \"Kto stojí za Papillonom\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon spravujú 100% dobrovoľní študenti\",\r\n  \"Settings_About_Discord\": \"Discord server\",\r\n  \"Settings_About_Discord_Description\": \"Pripoj sa na náš Discord\",\r\n  \"Settings_About_Crowdin\": \"Projekt Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Pomôž s prekladom Papillonu\",\r\n  \"Settings_About_Github\": \"Projekt GitHub\",\r\n  \"Settings_About_Github_Description\": \"Prispej k projektu na GitHubu\",\r\n  \"Settings_About_Issue\": \"Nahlásiť chybu\",\r\n  \"Settings_About_Issue_Description\": \"Nahlásiť nájdenú chybu\",\r\n  \"Settings_About_Dependency_Version\": \"Verzia závislostí\",\r\n\r\n  \"Alert_No_Technical\": \"Nie sú k dispozícii žiadne technické informácie.\",\r\n  \"Alert_Auth_Error\": \"Chyba autentifikácie\",\r\n  \"Alert_Auth_Bad_Creds\": \"Zadané údaje sú nesprávne alebo sa pokúšaš prihlásiť rodičovským účtom. Tento typ účtu zatiaľ nie je v Papillone podporovaný.\",\r\n  \"Alert_Not_Supported\": \"Inštancia nie je podporovaná\",\r\n  \"Alert_Security_Instance_HTTP\": \"Z bezpečnostných dôvodov Papillon neprijíma inštancie využívajúce protokol HTTP. Odporúčame informovať vedenie školy, aby inštanciu aktualizovalo.\",\r\n  \"Alert_NoDemo\": \"Papillon nie je určený na prácu s demo inštanciami, použi prosím reálnu inštanciu.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon nemôže získať informácie z tejto inštancie PRONOTE, je stále platná?\",\r\n  \"Alert_No_Pos\": \"Nepodarilo sa získať polohu\",\r\n  \"Alert_Connexion_Fail\": \"Pripojenie zlyhalo\",\r\n\r\n  \"Feature_Limited\": \"Obmedzené funkcie\",\r\n  \"Feature_Soon\": \"Už čoskoro!\",\r\n  \"Feature_Soon_Notification\": \"Tvrdo pracujeme na tom, aby sme ti túto funkciu ponúkli v budúcej aktualizácii.\",\r\n  \"Feature_Add_Card\": \"Pridaj novú kartu v záložke Profil v navigačnom paneli\",\r\n\r\n  \"Webview_Wait\": \"Chvíľku strpenia...\",\r\n\r\n  \"Profile_QRCards\": \"QR kód a karty\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} karta/y\",\r\n  \"Profile_Cards_Loading_History\": \"Načítavanie histórie transakcií\",\r\n  \"Profile_Cards_Loading_History_Description\": \"To môže chvíľku trvať...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Karty\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Jedáleň, prístup\",\r\n  \"Settings_Cards_Banner_Description\": \"Pridaj svoje karty na obedy a dopravu, aby si k nim mal prístup kdekoľvek zo svojho telefónu v Papillone\",\r\n  \"Settings_Cards_None_Title\": \"Žiadne karty\",\r\n  \"Settings_Cards_Add_Button\": \"Pridať\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Pridaj kartu pre sledovanie zostatku v jedálni, skenovanie QR kódu a ďalšie\",\r\n  \"Settings_Subjects_None_Title\": \"Žiadne predmety\",\r\n  \"Settings_Subjects_None_Description\": \"Prechádzaj rôzne karty aplikácie, aby bolo možné predmety prispôsobiť.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Resetovať\",\r\n  \"Settings_Subjects_Reset_Message\": \"Naozaj chceš resetovať nastavenia všetkých predmetov?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Resetovať\",\r\n\r\n  \"Settings_Donator\": \"Darcovia\",\r\n  \"Settings_Donator_Description\": \"Zobraziť zoznam darcov\",\r\n  \"Settings_App_Version\": \"Verzia aplikácie\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Namier QR kód na čítačku terminálu\",\r\n  \"Profile_Cards_No_Reservation\": \"Žiadna rezervácia\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Vyzerá to, že na tento deň nemôžeš rezervovať.\",\r\n  \"Profile_Cards_History\": \"História\",\r\n  \"Magic_Important\": \"Možno dôležité\",\r\n\r\n  \"OnBoarding_Step\": \"Krok \",\r\n  \"OnBoarding_Step_Of\": \"z \",\r\n\r\n  \"Consent_Advanced_Title\": \"Chcem pomôcť Papillonu\",\r\n  \"Consent_Advanced_Description\": \"Zbierame podrobnejšie informácie o tvojom používaní.\",\r\n  \"Consent_Required_Title\": \"Len to podstatné\",\r\n  \"Consent_Required_Description\": \"Stručne povedané: vedieť, že niekto použil Papillon, či všetko prebehlo v poriadku a akú službu používa.\",\r\n  \"Consent_None_Title\": \"Vôbec nič\",\r\n  \"Consent_None_Description\": \"Nebudeme o tvojej existencii vôbec vedieť.\",\r\n  \"Consent_Title\": \"Ty a Papillon\",\r\n  \"Consent_Intro1\": \"Aby si pomohol Papillonu rásť, môžeš sa rozhodnúť zdieľať niektoré informácie o používaní.\",\r\n  \"Consent_PrivacyPolicy\": \"V prípade pochybností si prečítaj naše zásady ochrany osobných údajov\",\r\n  \"Consent_Refuse\": \"Odmietnuť\",\r\n  \"Consent_Accept\": \"Prijať\",\r\n  \"Consent_ChangeMind\": \"Svoje rozhodnutie môžeš kedykoľvek zmeniť v nastaveniach aplikácie.\",\r\n  \"Consent_Arg1\": \"Slúži výhradne na zlepšovanie aplikácie\",\r\n  \"Consent_Arg2\": \"Anonymné a nespojené s tvojou identitou\",\r\n  \"Consent_Arg3\": \"Nemáme prístup k tvojim účtom\",\r\n\r\n  \"Changelog_Title\": \"Poznámky k vydaniu\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Dátum odovzdania\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Predmety\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Nedokončené\",\r\n  \"Tasks_ThisWeek\": \"Tento týždeň\",\r\n\r\n  \"Task_Undone\": \"Nedokončené\",\r\n  \"Task_Done\": \"Hotovo\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Upraviť tapetu\",\r\n  \"Modal_Profile_Title\": \"Upraviť profil\",\r\n\r\n  \"Modal_Task_Status\": \"Stav úlohy\",\r\n  \"Modal_Task_Description\": \"Popis úlohy\",\r\n  \"Modal_Task_Attachments\": \"Prílohy\",\r\n\r\n  \"Today\": \"Dnes\",\r\n  \"Yesterday\": \"Včera\",\r\n  \"Tomorrow\": \"Zajtra\"\r\n}"
  },
  {
    "path": "locales/sq.json",
    "content": "{\r\n  \"Global_Back\": \"Kthehu\",\r\n  \"Global_DatePrefix\": \"më\",\r\n\r\n  \"Tab_Home\": \"Ballina\",\r\n  \"Tab_Calendar\": \"Mësimet\",\r\n  \"Tab_Tasks\": \"Detyrat\",\r\n  \"Tab_Grades\": \"Notat\",\r\n  \"Tab_Profile\": \"Profili\",\r\n  \"Tab_Custom_Profile\": \"Ndrysho profilin\",\r\n  \"Button_Change_ProfilePicture\": \"Ndrysho foton e profilit\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Bëj një foto\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Nga galeria\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Merre nga portali shkollor\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Fshij foton\",\r\n  \"Tab_Page\": \"Faqja\",\r\n  \"Tab_Settings\": \"Cilësimet\",\r\n  \"Tab_News\": \"Lajmet\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Aplikacioni për të menaxhuar jetën tënde shkollore\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Lidh aplikacionet e shkollës sate për të parë notat, mësimet, detyrat dhe shumë më tepër në ndërfaqen Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Fillo\",\r\n  \"ONBOARDING_HELP_BTN\": \"Ke nevojë për ndihmë?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Shërbimi universitar\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Shërbimi i mensës\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Zgjidh shërbimin tënd shkollor\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Zgjidh shërbimin tënd të mensës\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Zgjidh shërbimin tënd universitar\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Si dëshiron të identifikohesh?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Përdor vendndodhjen time\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Kërko një qytet\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Kam një kod QR\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Kam një URL identifikimi\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Zgjidh institucionin tënd\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Shkruaj emrin e qytetit dhe zgjidh shkollën tënde\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Identifikohu siç bën zakonisht\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Hyr në llogarinë tënde\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Zgjidh serverin e caktuar për llogarinë\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Vendos kodin me 4 shifra që sapo krijove në PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Lidhja me\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Skeno kodin QR të shkollës sate për t'u lidhur.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validimi i kodit QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Kjo mund të marrë pak kohë...\",\r\n  \"ONBOARDING_URL\": \"Jep adresën URL të shkollës sate\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL e serverit tënd PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Para se të përfundosh\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Zgjidh një\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"ngjyrë për temën\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Vendos kodin PIN të PRONOTE-s sate\",\r\n  \"Onboarding_Load_Webview_Description\": \"Po ngarkojmë faqen e shkollës sate\",\r\n  \"INPUT_PIN\": \"Kodi PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Kërko një server...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Duke u lidhur...\",\r\n\r\n  \"WAITING\": \"Në pritje\",\r\n  \"IZLY_SMS_SEND\": \"Sapo ke marrë një link për t'u identifikuar, kliko mbi të dhe ndiq hapat.\",\r\n  \"STEP\": \"Hapi\",\r\n  \"STEP_OUTOF\": \"nga\",\r\n  \"INPUT_USERNAME\": \"Emri i përdoruesit\",\r\n  \"INPUT_MAIL\": \"Adresa e-mail\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-mail ose emri i përdoruesit\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Numri i telefonit ose e-mail\",\r\n  \"INPUT_PASSWORD\": \"Fjalëkalimi\",\r\n  \"INPUT_PASSWORD_CODE\": \"Kodi i aksesit\",\r\n  \"INPUT_ETABID\": \"Identifikuesi i shkollës sate\",\r\n  \"LOGIN_BTN\": \"Identifikohu\",\r\n  \"CONFIRM_BTN\": \"Konfirmo\",\r\n  \"CANCEL_BTN\": \"Anulo\",\r\n\r\n  \"Tab_New_Event\": \"Ngjarje e re\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Menaxhimi i iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Menaxho URL-të e tua iCal\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Shto një URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Menaxho {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Shto ose fshij URL iCal për t'i sinkronizuar me kalendarin tënd.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Titulli mungon\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Jepi një emër kësaj URL-je iCal për ta shtuar.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Nuk u shtua asnjë URL iCal\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Kjo skedë është në ndërtim e sipër.\",\r\n  \"TabUnderConstruction_Details\": \"Rikthehu më vonë për përditësime.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Modaliteti i Zhvillimit\",\r\n  \"TabDevModeNotice_Details\": \"Mjedis testimi i plotë për zhvilluesit.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Detaje teknike\",\r\n\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Vlerësim\",\r\n  \"Edited_Course\": \"Mësim i ndryshuar\",\r\n  \"Canceled_Course\": \"Mësim i anuluar\",\r\n  \"No_Course_Room\": \"Salla e panjohur\",\r\n  \"Event_DeleteEvent\": \"Fshij ngjarjen\",\r\n  \"Event_Confirm_DeleteEvent\": \"Je i sigurt që dëshiron ta fshish këtë ngjarje?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Pushimi i drekës\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Ju bëftë mirë!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Miam!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Pushimi i mëngjesit\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Kohë për gjumë!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Mëngjesi\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Pushimi i pasdites\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Duhet një pushim!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Koha për ushqim të lehtë!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Pushimi i mbrëmjes\",\r\n  \"Course_Separator_Night_Alt_1\": \"Natën e mirë!\",\r\n  \"Course_Separator_Night_Alt_2\": \"U bë natë!\",\r\n\r\n  \"Context_Delete\": \"Fshij\",\r\n  \"Context_Cancel\": \"Anulo\",\r\n  \"Context_Edit\": \"Modifiko\",\r\n  \"Context_Add\": \"Shto\",\r\n\r\n  \"Form_Title\": \"Titulli\",\r\n  \"Form_Location\": \"Vendndodhja\",\r\n  \"Form_Organizer\": \"Organizatori\",\r\n  \"Form_Start\": \"Fillimi\",\r\n  \"Form_End\": \"Fundi\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Je i sigurt që dëshiron ta fshish këtë ngjarje?\",\r\n\r\n  \"Home_Welcome_Name\": \"Përshëndetje, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Shfaq më shumë\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"të disponueshme\",\r\n  \"Home_Chats_Plurial\": \"biseda\",\r\n  \"Home_Chats_Singular\": \"bisedë\",\r\n  \"Home_See_All_Tasks\": \"Shih të gjitha detyrat\",\r\n  \"Home_Welcome\": \"Përshëndetje!\",\r\n  \"Home_Planned_None\": \"Nuk ke asnjë mësim tjetër të planifikuar për sot\",\r\n  \"Home_Planned_One\": \"Ke edhe një mësim sot\",\r\n  \"Home_Planned_Number\": \"Ke edhe {{number}} mësime sot\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Mësimet e ardhshme\",\r\n  \"Home_Widget_NewGrades\": \"Nota të reja\",\r\n  \"Home_Widget_NewHomeworks\": \"Detyra për t'u bërë\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Asnjë mësim i afërt\",\r\n  \"Home_Widget_NoCourses_Description\": \"Nuk ka mësime të planifikuara për sot.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kartat\",\r\n  \"Home_Cards_Button_Description_None\": \"Asnjë kartë\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Një kartë\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} karta\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Mesazhet\",\r\n  \"Home_Chats_Button_Description_None\": \"Asnjë mesazh\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Një mesazh\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} mesazhe\",\r\n\r\n  \"Home_Attendance_Title\": \"Mungesat\",\r\n  \"Home_Attendance_Button_Description_None\": \"Asnjë mungesë\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Një mungesë\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} mungesa\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Menuja\",\r\n  \"Home_Menu_Button_Description\": \"Menuja e ditës\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Nuk u gjet asnjë ngjarje\",\r\n  \"Tab_Calendar_Empty_Description\": \"Shto një ngjarje ose sinkronizo kalendarin tënd për të filluar.\",\r\n\r\n  \"Modal_Course_Title\": \"Mësimi im\",\r\n  \"Modal_Course_StartsIn\": \"Fillon pas\",\r\n  \"Modal_Course_StartedAgo\": \"Përfunduar para\",\r\n  \"Modal_Course_Ongoing\": \"Ka filluar prej\",\r\n  \"Modal_Course_Group\": \"Grupi\",\r\n  \"Modal_Course_Group_Full\": \"Klasa\",\r\n\r\n  \"Modal_Course_Details\": \"Detajet e mësimit\",\r\n  \"Modal_Course_Teacher\": \"Mësuesi\",\r\n  \"Modal_Course_Room\": \"Salla\",\r\n  \"Modal_Course_Duration\": \"Kohëzgjatja\",\r\n\r\n  \"Modal_Course_Time\": \"Orari i mësimit\",\r\n  \"Modal_Course_Start\": \"Fillimi\",\r\n  \"Modal_Course_End\": \"Fundi\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Kërko detyra\",\r\n  \"Tasks_LeftHomeworks_Title\": \"detyra të mbetura\",\r\n  \"Tasks_LeftHomeworks_Time\": \"këtë javë\",\r\n  \"Tasks_Done_AllTasks\": \"Të gjitha detyrat\",\r\n  \"Tasks_Done_CompletedTasks\": \"janë përfunduar\",\r\n  \"Tasks_Nav_Left\": \"Edhe {{count}} detyrë/a për t'u bërë\",\r\n  \"Tasks_Nav_One\": \"Edhe një detyrë për t'u bërë\",\r\n  \"Tasks_Nav_Completed\": \"Çdo gjë ka përfunduar!\",\r\n  \"Tasks_Week\": \"Java\",\r\n  \"Tasks_NoTasks_Title\": \"Asnjë detyrë\",\r\n  \"Tasks_NoTasks_Description\": \"Nuk ka detyra të planifikuara për këtë javë. Shfrytëzoje kohën për të pushuar!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"për javën {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Asnjë detyrë\",\r\n  \"Task_Start\": \"Për t'u bërë\",\r\n  \"Task_Complete\": \"Përfunduar\",\r\n  \"Task_Sorting_Title\": \"Rendit sipas\",\r\n  \"Task_OnlyShowUndone\": \"Detyrat e përfunduara\",\r\n  \"Task_Show_Title\": \"Shfaq\",\r\n  \"Settings_General\": \"Të përgjithshme\",\r\n\r\n  \"Latest_Grades\": \"Nota të reja\",\r\n  \"Grades_Search_Placeholder\": \"Kërko një notë, një lëndë\",\r\n\r\n  \"Grades_Avg_Methods\": \"Metodat e llogaritjes\",\r\n  \"Grades_Avg_All_Title\": \"Mesatarja e përgjithshme\",\r\n  \"Grades_Avg_All_Short\": \"Mes. e përgjithshme\",\r\n  \"Grades_Avg_All_Pond\": \"Mesatarja e ponderuar\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Mes. e ponderuar\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Llogarit mesataren e ponderuar të të gjitha notave\",\r\n  \"Grades_Avg_Subject_Title\": \"Mesatarja e lëndëve\",\r\n  \"Grades_Avg_Subject_Short\": \"Mes. e lëndëve\",\r\n  \"Grades_Avg_Subject_Description\": \"Llogarit mesataren e ponderuar të mesatareve të lëndëve\",\r\n  \"Grades_Avg_Median_Title\": \"Mediana\",\r\n  \"Grades_Avg_Median_Short\": \"Mediana\",\r\n\r\n  \"Grades_Avg_More\": \"Mëso më shumë\",\r\n  \"Grades_Avg_KnowMore\": \"Mëso më shumë\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Kupto metodat e llogaritjes së mesatares së përgjithshme\",\r\n\r\n  \"Grades_SubjectInfo\": \"Informacione mbi lëndën\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} notë/a\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Mesatarja e nxënësit\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistikat\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Mesatarja e klasës\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Mesatarja e përgjithshme e klasës\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Mesatarja maksimale\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Mesatarja më e mirë e grupit\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Mesatarja minimale\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Mesatarja më e ulët e grupit\",\r\n\r\n  \"Grades_Semester\": \"Semestri\",\r\n  \"Grades_Trimester\": \"Tremujori\",\r\n  \"Grades_OutPeriod\": \"Jashtë periudhës\",\r\n  \"Grades_Year\": \"Viti\",\r\n  \"Grades_MockExamBac\": \"Provim prove\",\r\n  \"Grades_MockExamBrevet\": \"Mini-provim prove\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Të gjitha lëndët\",\r\n  \"Grades_Method_Weighted\": \"Ponderimi\",\r\n\r\n  \"Grades_Sort\": \"Rendit\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabetike\",\r\n  \"Grades_Sorting_Averages\": \"Mesataret\",\r\n  \"Grades_Sorting_Date\": \"Data\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Rendit sipas\",\r\n  \"Grades_Menu_AverageBy\": \"Mesatarja sipas\",\r\n  \"NoAverage\": \"Asnjë mesatare\",\r\n\r\n  \"Grades_Empty_Title\": \"Asnjë notë\",\r\n  \"Grades_Empty_Description\": \"Nuk je vlerësuar ende gjatë kësaj periudhe.\",\r\n\r\n  \"Grade_NoDescription\": \"Detyrë në {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Lëndët\",\r\n  \"Grades_Tab_Latest\": \"Nota të reja\",\r\n\r\n  \"Profile_Attendance_Title\": \"Pjesëmarrja\",\r\n  \"Profile_Attendance_Denominator_Single\": \"mungesë\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"mungesa\",\r\n\r\n  \"Profile_Discussions_Title\": \"Diskutimet\",\r\n  \"Profile_Discussions_Denominator_Single\": \"i palexuar\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"të palexuar\",\r\n\r\n  \"Profile_News_Title\": \"Lajmet\",\r\n  \"Profile_News_Denominator_Single\": \"i ri\",\r\n  \"Profile_News_Denominator_Plural\": \"të reja\",\r\n  \"Profile_News_Open\": \"Hap\",\r\n  \"Profile_News_Loading_Title\": \"Duke ngarkuar lajmet...\",\r\n  \"Profile_News_Author_Unknown\": \"Autor i panjohur\",\r\n\r\n  \"Profile_Cards_Title\": \"Kodi QR dhe kartat\",\r\n\r\n  \"Modal_Grades_Title\": \"Detajet e notës\",\r\n  \"Modal_Grades_BestGrade\": \"Nota më e mirë e grupit\",\r\n\r\n  \"Grades_Details_Title\": \"Detajet\",\r\n  \"Grades_NormalizedGrade_Title\": \"Nota në shkallën 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Vlera e notës e konvertuar në një shkallë prej 20\",\r\n  \"Grades_HighestGrade_Title\": \"Nota më e lartë\",\r\n  \"Grades_HighestGrade_Description\": \"Nota maksimale e arritur në grup\",\r\n  \"Grades_LowestGrade_Title\": \"Nota më e ulët\",\r\n  \"Grades_LowestGrade_Description\": \"Nota minimale e arritur në grup\",\r\n  \"Grades_Influence_Title\": \"Ndikimi\",\r\n  \"Grades_Avg_Group_Title\": \"Mesatarja e grupit\",\r\n  \"Grades_Coefficient\": \"Koeficienti\",\r\n  \"Grades_Avg_Group_Short\": \"Mes. e grupit\",\r\n  \"Grades_Tab_Rank\": \"Renditja\",\r\n  \"Grades_Tab_Rank_Description\": \"Pozicioni në grup\",\r\n\r\n  \"News_Search_Placeholder\": \"Kërko një lajm\",\r\n  \"News_Empty_Title\": \"Asnjë lajm\",\r\n  \"News_Empty_Description\": \"Nuk u gjet asnjë lajm në institucionin tënd.\",\r\n  \"News_Search_NoResults\": \"Asnjë lajm nuk u gjet\",\r\n  \"News_Search_NoResults_Description\": \"Nuk u gjet asnjë lajm për kërkimin tënd.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Një temë e butë dhe elegante\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Leximi\",\r\n  \"News_Theme_Reading_Description\": \"Një temë e krijuar për lexim\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Orë të humbura\",\r\n  \"Attendance_Hours_Unjustified\": \"Orë të pajustifikuara\",\r\n  \"Attendance_Missing\": \"Mungesat\",\r\n  \"Attendance_Delays\": \"Vonesat\",\r\n  \"Attendance_NoReason\": \"Asnjë arsye\",\r\n  \"Attendance_NoEvent_Title\": \"Asnjë ngjarje\",\r\n  \"Attendance_NoEvent_Description\": \"Nuk ka mungesa apo vonesa të regjistruara për këtë periudhë.\",\r\n\r\n  \"Settings_Account_Title\": \"Llogaria ime\",\r\n  \"Settings_Account_Description\": \"Llogaria ime\",\r\n  \"Settings_Services_Title\": \"Llogaritë e lidhura\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Llogaria e fundit e përdorur\",\r\n  \"Settings_Notifications_Title\": \"Njoftimet\",\r\n  \"Settings_Notifications_Description\": \"Sinjalizimet, frekuenca...\",\r\n  \"Settings_Subjects_Title\": \"Lëndët\",\r\n  \"Settings_Subjects_Description\": \"Emri, ngjyra, shkrimi...\",\r\n  \"Settings_Personalization_Title\": \"Personalizimi\",\r\n  \"Settings_Personalization_Description\": \"Temat, ngjyrat...\",\r\n  \"Settings_Cards_Title\": \"Kartat\",\r\n  \"Settings_Cards_Description\": \"Mensa, aksesi...\",\r\n  \"Settings_Accessibility_Title\": \"Aksesueshmëria\",\r\n  \"Settings_Accessibility_Description\": \"Pamja, zëri...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Funksionalitete inteligjente\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Funksionalitete IA\",\r\n  \"Settings_MagicPlus_Enable\": \"Aktivizo Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimizon automatikisht organizimin e detyrave të tua për të përmirësuar produktivitetin\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Model tërësisht lokal, asnjë e dhënë nuk transferohet jashtë pajisjes sate\",\r\n  \"Settings_Donate_Title\": \"Bëj një donacion\",\r\n  \"Settings_Donate_Description\": \"Mbështet projektin\",\r\n  \"Settings_Telemetry_Title\": \"Telemetria dhe privatësia\",\r\n  \"Settings_Telemetry_Description\": \"Menaxho të dhënat e mbledhura\",\r\n  \"Settings_About_Title\": \"Rreth nesh\",\r\n  \"Settings_About_Description\": \"Versioni\",\r\n  \"Settings_Logout_Title\": \"Shkyçu\",\r\n  \"Settings_Logout_Description\": \"Fshij këtë llogari nga Papillon\",\r\n  \"Settings_Language_Title\": \"Gjuha\",\r\n  \"Settings_Language_Description\": \"Ndrysho gjuhën\",\r\n  \"Settings_Tabs_Title\": \"Skedat\",\r\n  \"Settings_Tabs_Description\": \"Fshih skeda nga menuja\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personalizimi\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Temat, lëndët...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Personalizo lëndët\",\r\n  \"Settings_Personalization_Accent\": \"Ngjyra e theksit\",\r\n  \"Settings_Personalization_Accent_Description\": \"Ngjyra që zgjedh këtu do të aplikohet në faqen ballore të Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Tema\",\r\n  \"Settings_Personalization_Icon_Title\": \"Ndrysho ikonën\",\r\n  \"Settings_Personalization_Icon_Description\": \"Personalizo ikonën e aplikacionit\",\r\n  \"Settings_Personalization_Subject_Title\": \"Personalizo lëndët\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Lëndët\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikonat, ngjyrat\",\r\n  \"Settings_About_Papillion_Behind\": \"Prapa Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon mirëmbahet nga studentë 100% vullnetarë\",\r\n  \"Settings_About_Discord\": \"Serveri Discord\",\r\n  \"Settings_About_Discord_Description\": \"Bashkohu me serverin tonë në Discord\",\r\n  \"Settings_About_Crowdin\": \"Projekti Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Ndihmo në përkthimin e Papillon\",\r\n  \"Settings_About_Github\": \"Projekti GitHub\",\r\n  \"Settings_About_Github_Description\": \"Kontribuo në projekt në GitHub\",\r\n  \"Settings_About_Issue\": \"Raporto një gabim\",\r\n  \"Settings_About_Issue_Description\": \"Raporto një problem të hasur\",\r\n  \"Settings_About_Dependency_Version\": \"Versioni i varësive\",\r\n\r\n  \"Alert_No_Technical\": \"Asnjë informacion teknik i disponueshëm.\",\r\n  \"Alert_Auth_Error\": \"Gabim në autentifikim\",\r\n  \"Alert_Auth_Bad_Creds\": \"Kredencialet që ke vendosur janë të pasakta ose po përpiqesh të lidhesh me një llogari prindi. Ky lloj llogarie nuk mbështetet ende nga Papillon.\",\r\n  \"Alert_Not_Supported\": \"Serveri nuk mbështetet\",\r\n  \"Alert_Security_Instance_HTTP\": \"Për arsye sigurie, Papillon nuk pranon serverë që përdorin ende protokollin HTTP. Të rekomandojmë të informosh drejtorin e institucionit që të përditësojë këtë server dhe të ruajë kështu sigurinë e tij.\",\r\n  \"Alert_NoDemo\": \"Papillon nuk është krijuar për të punuar me serverë demo, ju lutem përdorni një server tjetër.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon nuk arrin të marrë informacionet nga ky server PRONOTE, a është ai ende i vlefshëm?\",\r\n  \"Alert_No_Pos\": \"E pamundur të merret vendndodhja\",\r\n  \"Alert_Connexion_Fail\": \"Lidhja e pamundur\",\r\n\r\n  \"Feature_Limited\": \"Funksionalitete të kufizuara\",\r\n  \"Feature_Soon\": \"Vjen së shpejti!\",\r\n  \"Feature_Soon_Notification\": \"Po punojmë fort për t'ju ofruar këtë funksionalitet në një përditësim të ardhshëm.\",\r\n  \"Feature_Add_Card\": \"Shto një kartë të re nga skeda Profili e aksesueshme në shiritin e navigimit\",\r\n\r\n  \"Webview_Wait\": \"Pak durim...\",\r\n\r\n  \"Profile_QRCards\": \"Kodi QR dhe kartat\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} karta\",\r\n  \"Profile_Cards_Loading_History\": \"Duke ngarkuar historikun e transaksioneve\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Kjo mund të marrë një moment...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kartat\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Mensa, aksesi\",\r\n  \"Settings_Cards_Banner_Description\": \"Shto kartat e tua të mensës dhe transportit për t'i aksesuar kudo nga telefoni yt në Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Asnjë kartë\",\r\n  \"Settings_Cards_Add_Button\": \"Shto\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Shto një të tillë për të parë balancën e mensës, për të skenuar kodin tënd QR e shumë të tjera\",\r\n  \"Settings_Subjects_None_Title\": \"Asnjë lëndë\",\r\n  \"Settings_Subjects_None_Description\": \"Shfleto skedat e ndryshme të aplikacionit që të mund të personalizosh lëndët.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Rivendos\",\r\n  \"Settings_Subjects_Reset_Message\": \"Dëshiron vërtet t'i rivendosësh të gjitha lëndët?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Rivendos\",\r\n\r\n  \"Settings_Donator\": \"Donatorët\",\r\n  \"Settings_Donator_Description\": \"Shih listën e donatorëve\",\r\n  \"Settings_App_Version\": \"Versioni i aplikacionit\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Drejto kodin QR drejt skenerit të terminalit\",\r\n  \"Profile_Cards_No_Reservation\": \"Asnjë rezervim\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Duket se nuk mund të rezervosh në këtë ditë.\",\r\n  \"Profile_Cards_History\": \"Historiku\",\r\n  \"Magic_Important\": \"Mund të jetë e rëndësishme\",\r\n\r\n  \"OnBoarding_Step\": \"Hapi \",\r\n  \"OnBoarding_Step_Of\": \"nga \",\r\n\r\n  \"Consent_Advanced_Title\": \"Dua të ndihmoj Papillon\",\r\n  \"Consent_Advanced_Description\": \"Mbledhim informacione më të detajuara mbi përdorimin tënd.\",\r\n  \"Consent_Required_Title\": \"Vetëm thelbësorja\",\r\n  \"Consent_Required_Description\": \"Shkurtimisht, të dimë që dikush ka përdorur Papillon, nëse çdo gjë ka shkuar mirë dhe cilin shërbim përdor.\",\r\n  \"Consent_None_Title\": \"Asgjë fare\",\r\n  \"Consent_None_Description\": \"Ne nuk do të jemi në dijeni as për ekzistencën tënde.\",\r\n  \"Consent_Title\": \"Ti dhe Papillon\",\r\n  \"Consent_Intro1\": \"Për të ndihmuar në rritjen e Papillon, mund të zgjedhësh të ndash disa informacione përdorimi.\",\r\n  \"Consent_PrivacyPolicy\": \"Në rast dyshimi, konsultoni politikën tonë të privatësisë\",\r\n  \"Consent_Refuse\": \"Refuzo\",\r\n  \"Consent_Accept\": \"Prano\",\r\n  \"Consent_ChangeMind\": \"Mund të ndryshosh mendje në çdo kohë nga cilësimet e aplikacionit.\",\r\n  \"Consent_Arg1\": \"Shërben vetëm për të përmirësuar aplikacionin\",\r\n  \"Consent_Arg2\": \"Anonim & pa lidhje me identitetin tënd\",\r\n  \"Consent_Arg3\": \"Ne nuk kemi akses në llogaritë e tua\",\r\n\r\n  \"Changelog_Title\": \"Shënimet e përditësimit\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Data e dorëzimit\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Lëndët\",\r\n  \"Tasks_Sorting_Methods_Done\": \"I papërfunduar\",\r\n  \"Tasks_ThisWeek\": \"Këtë javë\",\r\n\r\n  \"Task_Undone\": \"I papërfunduar\",\r\n  \"Task_Done\": \"Përfunduar\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Personalizo sfondin\",\r\n  \"Modal_Profile_Title\": \"Personalizo profilin\",\r\n\r\n  \"Modal_Task_Status\": \"Gjendja e detyrës\",\r\n  \"Modal_Task_Description\": \"Përshkrimi i detyrës\",\r\n  \"Modal_Task_Attachments\": \"Bashkëngjitjet\",\r\n\r\n  \"Today\": \"Sot\",\r\n  \"Yesterday\": \"Dje\",\r\n  \"Tomorrow\": \"Nesër\"\r\n}"
  },
  {
    "path": "locales/sv.json",
    "content": "{\r\n  \"Global_Back\": \"Bakåt\",\r\n  \"Global_DatePrefix\": \"den\",\r\n\r\n  \"Tab_Home\": \"Hem\",\r\n  \"Tab_Calendar\": \"Lektioner\",\r\n  \"Tab_Tasks\": \"Uppgifter\",\r\n  \"Tab_Grades\": \"Betyg\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Redigera profil\",\r\n  \"Button_Change_ProfilePicture\": \"Ändra profilbild\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Ta ett foto\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Från biblioteket\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Hämta från skolsystemet\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Ta bort foto\",\r\n  \"Tab_Page\": \"Sida\",\r\n  \"Tab_Settings\": \"Inställningar\",\r\n  \"Tab_News\": \"Nyheter\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Appen för att hantera ditt skolliv\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Anslut dina skolappar för att se betyg, lektioner, läxor och mycket mer i Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Börja\",\r\n  \"ONBOARDING_HELP_BTN\": \"Behöver du hjälp?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Universitetstjänst\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Mataffär/Matsal\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Välj din skoltjänst\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Välj din mattjänst\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Välj din universitetstjänst\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Hur vill du logga in?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Använd min position\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Sök efter stad\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Jag har en QR-kod\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Jag har en inloggnings-URL\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Välj din skola\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Ange din stad och välj din skola\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Logga in som vanligt\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Logga in på ditt konto\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Välj värd för kontot\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Ange den 4-siffriga koden du precis skapade i PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Loggar in på\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Skanna skolans QR-kod för att ansluta.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Validerar QR-kod\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Detta kan ta några ögonblick...\",\r\n  \"ONBOARDING_URL\": \"Ange din skolas URL-adress\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL till din PRONOTE-instans\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Innan du är klar\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Välj en\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"temafärg\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Ange din PIN-kod för PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"Vi laddar din skolas webbplats\",\r\n  \"INPUT_PIN\": \"PIN-kod\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Sök instans...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Loggar in...\",\r\n\r\n  \"WAITING\": \"Väntar\",\r\n  \"IZLY_SMS_SEND\": \"Du har fått en länk för att logga in, klicka på den och följ stegen.\",\r\n  \"STEP\": \"Steg\",\r\n  \"STEP_OUTOF\": \"av\",\r\n  \"INPUT_USERNAME\": \"Användarnamn\",\r\n  \"INPUT_MAIL\": \"E-postadress\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-post eller användarnamn\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Telefonnummer eller e-post\",\r\n  \"INPUT_PASSWORD\": \"Lösenord\",\r\n  \"INPUT_PASSWORD_CODE\": \"Åtkomstkod\",\r\n  \"INPUT_ETABID\": \"Skolans ID\",\r\n  \"LOGIN_BTN\": \"Logga in\",\r\n  \"CONFIRM_BTN\": \"Bekräfta\",\r\n  \"CANCEL_BTN\": \"Avbryt\",\r\n\r\n  \"Tab_New_Event\": \"Ny händelse\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Hantera iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Hantera dina iCal-URL:er\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Lägg till iCal-URL\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Hantera {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Lägg till eller ta bort iCal-URL:er för att synka med ditt schema.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Titel saknas\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Ge denna iCal-URL ett namn för att lägga till den.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Inga iCal-URL:er tillagda\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Denna flik är under konstruktion.\",\r\n  \"TabUnderConstruction_Details\": \"Kom tillbaka senare för uppdateringar.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Utvecklarläge\",\r\n  \"TabDevModeNotice_Details\": \"Komplett testmiljö för utvecklare.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Tekniska detaljer\",\r\n\r\n  \"Online_Course\": \"Online\",\r\n  \"Evaluated_Course\": \"Examination/Prov\",\r\n  \"Edited_Course\": \"Ändrad lektion\",\r\n  \"Canceled_Course\": \"Inställd lektion\",\r\n  \"No_Course_Room\": \"Okänd sal\",\r\n  \"Event_DeleteEvent\": \"Ta bort händelse\",\r\n  \"Event_Confirm_DeleteEvent\": \"Är du säker på att du vill ta bort denna händelse?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Lunchrast\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Smaklig måltid!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Mums!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Förmiddagsrast\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Dags att sova!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Frukost\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Eftermiddagsrast\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Dags för en paus!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Mellanmål!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Kvällsrast\",\r\n  \"Course_Separator_Night_Alt_1\": \"Dags att sova!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Det är natt!\",\r\n\r\n  \"Context_Delete\": \"Ta bort\",\r\n  \"Context_Cancel\": \"Avbryt\",\r\n  \"Context_Edit\": \"Ändra\",\r\n  \"Context_Add\": \"Lägg till\",\r\n\r\n  \"Form_Title\": \"Titel\",\r\n  \"Form_Location\": \"Plats\",\r\n  \"Form_Organizer\": \"Organisatör\",\r\n  \"Form_Start\": \"Start\",\r\n  \"Form_End\": \"Slut\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Är du säker på att du vill ta bort denna händelse?\",\r\n\r\n  \"Home_Welcome_Name\": \"Hej, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Visa mer\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"tillgängliga\",\r\n  \"Home_Chats_Plurial\": \"diskussioner\",\r\n  \"Home_Chats_Singular\": \"diskussion\",\r\n  \"Home_See_All_Tasks\": \"Visa alla uppgifter\",\r\n  \"Home_Welcome\": \"Hej!\",\r\n  \"Home_Planned_None\": \"Du har inga fler lektioner planerade idag\",\r\n  \"Home_Planned_One\": \"Du har en lektion kvar idag\",\r\n  \"Home_Planned_Number\": \"Du har {{number}} lektioner kvar idag\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Nästa lektioner\",\r\n  \"Home_Widget_NewGrades\": \"Nya betyg\",\r\n  \"Home_Widget_NewHomeworks\": \"Uppgifter att göra\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Inga kommande lektioner\",\r\n  \"Home_Widget_NoCourses_Description\": \"Inga lektioner planerade för idag.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kort\",\r\n  \"Home_Cards_Button_Description_None\": \"Inga kort\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Ett kort\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kort\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Meddelanden\",\r\n  \"Home_Chats_Button_Description_None\": \"Inga meddelanden\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Ett meddelande\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} meddelanden\",\r\n\r\n  \"Home_Attendance_Title\": \"Frånvaro\",\r\n  \"Home_Attendance_Button_Description_None\": \"Ingen frånvaro\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"En frånvaro\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} frånvarotillfällen\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Meny\",\r\n  \"Home_Menu_Button_Description\": \"Dagens meny\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Inga händelser hittades\",\r\n  \"Tab_Calendar_Empty_Description\": \"Lägg till en händelse eller synka ditt schema för att börja.\",\r\n\r\n  \"Modal_Course_Title\": \"Min lektion\",\r\n  \"Modal_Course_StartsIn\": \"Börjar om\",\r\n  \"Modal_Course_StartedAgo\": \"Slutade för\",\r\n  \"Modal_Course_Ongoing\": \"Pågått i\",\r\n  \"Modal_Course_Group\": \"Grupp\",\r\n  \"Modal_Course_Group_Full\": \"Klass\",\r\n\r\n  \"Modal_Course_Details\": \"Lektionsdetaljer\",\r\n  \"Modal_Course_Teacher\": \"Lärare\",\r\n  \"Modal_Course_Room\": \"Sal\",\r\n  \"Modal_Course_Duration\": \"Längd\",\r\n\r\n  \"Modal_Course_Time\": \"Lektionstid\",\r\n  \"Modal_Course_Start\": \"Start\",\r\n  \"Modal_Course_End\": \"Slut\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Sök uppgifter\",\r\n  \"Tasks_LeftHomeworks_Title\": \"återstående uppgifter\",\r\n  \"Tasks_LeftHomeworks_Time\": \"denna vecka\",\r\n  \"Tasks_Done_AllTasks\": \"Alla uppgifter\",\r\n  \"Tasks_Done_CompletedTasks\": \"är klara\",\r\n  \"Tasks_Nav_Left\": \"{{count}} uppgift(er) kvar att göra\",\r\n  \"Tasks_Nav_One\": \"Bara en uppgift kvar\",\r\n  \"Tasks_Nav_Completed\": \"Allt är klart!\",\r\n  \"Tasks_Week\": \"Vecka\",\r\n  \"Tasks_NoTasks_Title\": \"Inga uppgifter\",\r\n  \"Tasks_NoTasks_Description\": \"Inga uppgifter planerade för denna vecka. Passa på att vila!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"för vecka {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Inga uppgifter\",\r\n  \"Task_Start\": \"Att göra\",\r\n  \"Task_Complete\": \"Klar\",\r\n  \"Task_Sorting_Title\": \"Sortera efter\",\r\n  \"Task_OnlyShowUndone\": \"Färdiga uppgifter\",\r\n  \"Task_Show_Title\": \"Visa\",\r\n  \"Settings_General\": \"Allmänt\",\r\n\r\n  \"Latest_Grades\": \"Nya betyg\",\r\n  \"Grades_Search_Placeholder\": \"Sök betyg eller ämne\",\r\n\r\n  \"Grades_Avg_Methods\": \"Beräkningsmetoder\",\r\n  \"Grades_Avg_All_Title\": \"Genomsnittsbetyg\",\r\n  \"Grades_Avg_All_Short\": \"Snitt\",\r\n  \"Grades_Avg_All_Pond\": \"Viktat medelvärde\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Viktat snitt\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Beräknar det viktade medelvärdet för alla betyg\",\r\n  \"Grades_Avg_Subject_Title\": \"Ämnesgenomsnitt\",\r\n  \"Grades_Avg_Subject_Short\": \"Ämnessnitt\",\r\n  \"Grades_Avg_Subject_Description\": \"Beräknar det viktade medelvärdet av ämnenas snitt\",\r\n  \"Grades_Avg_Median_Title\": \"Median\",\r\n  \"Grades_Avg_Median_Short\": \"Median\",\r\n\r\n  \"Grades_Avg_More\": \"Läs mer\",\r\n  \"Grades_Avg_KnowMore\": \"Läs mer\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Förstå metoderna för beräkning av genomsnittsbetyg\",\r\n\r\n  \"Grades_SubjectInfo\": \"Information om ämnet\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} betyg\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Elevens snitt\",\r\n  \"SubjectInfo_Stats_Header\": \"Statistik\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Klassens snitt\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Genomsnittsbetyg för hela klassen\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Högsta snitt\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Bästa snittet i gruppen\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Lägsta snitt\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Lägsta snittet i gruppen\",\r\n\r\n  \"Grades_Semester\": \"Termin\",\r\n  \"Grades_Trimester\": \"Trimester\",\r\n  \"Grades_OutPeriod\": \"Utanför period\",\r\n  \"Grades_Year\": \"År\",\r\n  \"Grades_MockExamBac\": \"Prov (Studentexamen)\",\r\n  \"Grades_MockExamBrevet\": \"Prov\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Alla ämnen\",\r\n  \"Grades_Method_Weighted\": \"Viktning\",\r\n\r\n  \"Grades_Sort\": \"Sortera\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabetisk\",\r\n  \"Grades_Sorting_Averages\": \"Snitt\",\r\n  \"Grades_Sorting_Date\": \"Datum\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Sortera efter\",\r\n  \"Grades_Menu_AverageBy\": \"Snitt efter\",\r\n  \"NoAverage\": \"Inget snitt\",\r\n\r\n  \"Grades_Empty_Title\": \"Inga betyg\",\r\n  \"Grades_Empty_Description\": \"Du har inte fått några betyg under denna period än.\",\r\n\r\n  \"Grade_NoDescription\": \"Uppgift i {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Ämnen\",\r\n  \"Grades_Tab_Latest\": \"Nya betyg\",\r\n\r\n  \"Profile_Attendance_Title\": \"Närvaro\",\r\n  \"Profile_Attendance_Denominator_Single\": \"frånvaro\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"frånvarotillfällen\",\r\n\r\n  \"Profile_Discussions_Title\": \"Diskussioner\",\r\n  \"Profile_Discussions_Denominator_Single\": \"oläst\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"olästa\",\r\n\r\n  \"Profile_News_Title\": \"Nyheter\",\r\n  \"Profile_News_Denominator_Single\": \"ny\",\r\n  \"Profile_News_Denominator_Plural\": \"nya\",\r\n  \"Profile_News_Open\": \"Öppna\",\r\n  \"Profile_News_Loading_Title\": \"Laddar nyheter...\",\r\n  \"Profile_News_Author_Unknown\": \"Okänd författare\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-kod och kort\",\r\n\r\n  \"Modal_Grades_Title\": \"Betygsdetaljer\",\r\n  \"Modal_Grades_BestGrade\": \"Bästa betyg i gruppen\",\r\n\r\n  \"Grades_Details_Title\": \"Detaljer\",\r\n  \"Grades_NormalizedGrade_Title\": \"Betyg omräknat till 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Betygets värde konverterat till en skala på 20\",\r\n  \"Grades_HighestGrade_Title\": \"Högsta betyg\",\r\n  \"Grades_HighestGrade_Description\": \"Maximalt betyg som uppnåtts i gruppen\",\r\n  \"Grades_LowestGrade_Title\": \"Lägsta betyg\",\r\n  \"Grades_LowestGrade_Description\": \"Lägsta betyg som uppnåtts i gruppen\",\r\n  \"Grades_Influence_Title\": \"Inverkan\",\r\n  \"Grades_Avg_Group_Title\": \"Gruppens snitt\",\r\n  \"Grades_Coefficient\": \"Koefficient\",\r\n  \"Grades_Avg_Group_Short\": \"Gruppsnitt\",\r\n  \"Grades_Tab_Rank\": \"Ranking\",\r\n  \"Grades_Tab_Rank_Description\": \"Position i gruppen\",\r\n\r\n  \"News_Search_Placeholder\": \"Sök nyhet\",\r\n  \"News_Empty_Title\": \"Inga nyheter\",\r\n  \"News_Empty_Description\": \"Inga nyheter hittades för din skola.\",\r\n  \"News_Search_NoResults\": \"Inga nyheter hittades\",\r\n  \"News_Search_NoResults_Description\": \"Inga nyheter matchade din sökning.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Ett mjukt och elegant tema\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Läsning\",\r\n  \"News_Theme_Reading_Description\": \"Ett tema designat för läsning\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Missade timmar\",\r\n  \"Attendance_Hours_Unjustified\": \"Oanmäld frånvaro\",\r\n  \"Attendance_Missing\": \"Frånvaro\",\r\n  \"Attendance_Delays\": \"Sena ankomster\",\r\n  \"Attendance_NoReason\": \"Ingen anledning angiven\",\r\n  \"Attendance_NoEvent_Title\": \"Inga händelser\",\r\n  \"Attendance_NoEvent_Description\": \"Ingen frånvaro eller sena ankomster registrerade för denna period.\",\r\n\r\n  \"Settings_Account_Title\": \"Mitt konto\",\r\n  \"Settings_Account_Description\": \"Mitt konto\",\r\n  \"Settings_Services_Title\": \"Kopplade konton\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Senast använda konto\",\r\n  \"Settings_Notifications_Title\": \"Notiser\",\r\n  \"Settings_Notifications_Description\": \"Varningar, frekvens...\",\r\n  \"Settings_Subjects_Title\": \"Ämnen\",\r\n  \"Settings_Subjects_Description\": \"Namn, färg, typsnitt...\",\r\n  \"Settings_Personalization_Title\": \"Personlig anpassning\",\r\n  \"Settings_Personalization_Description\": \"Teman, färger...\",\r\n  \"Settings_Cards_Title\": \"Kort\",\r\n  \"Settings_Cards_Description\": \"Matsal, tillträde...\",\r\n  \"Settings_Accessibility_Title\": \"Tillgänglighet\",\r\n  \"Settings_Accessibility_Description\": \"Visning, ljud...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Smarta funktioner\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI-funktioner\",\r\n  \"Settings_MagicPlus_Enable\": \"Aktivera Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Optimerar automatiskt organiseringen av dina uppgifter för att förbättra produktiviteten\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Helt lokal modell, ingen data skickas utanför din enhet\",\r\n  \"Settings_Donate_Title\": \"Donera\",\r\n  \"Settings_Donate_Description\": \"Stöd projektet\",\r\n  \"Settings_Telemetry_Title\": \"Telemetri och integritet\",\r\n  \"Settings_Telemetry_Description\": \"Hantera insamlad data\",\r\n  \"Settings_About_Title\": \"Om appen\",\r\n  \"Settings_About_Description\": \"Version\",\r\n  \"Settings_Logout_Title\": \"Logga ut\",\r\n  \"Settings_Logout_Description\": \"Ta bort detta konto från Papillon\",\r\n  \"Settings_Language_Title\": \"Språk\",\r\n  \"Settings_Language_Description\": \"Byt språk\",\r\n  \"Settings_Tabs_Title\": \"Flikar\",\r\n  \"Settings_Tabs_Description\": \"Dölj flikar från menyn\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Personlig anpassning\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Teman, ämnen...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Anpassa ämnen\",\r\n  \"Settings_Personalization_Accent\": \"Accentfärg\",\r\n  \"Settings_Personalization_Accent_Description\": \"Färgen du väljer här kommer att användas på Papillons startsida.\",\r\n  \"Settings_Personalization_Theme\": \"Tema\",\r\n  \"Settings_Personalization_Icon_Title\": \"Byt ikon\",\r\n  \"Settings_Personalization_Icon_Description\": \"Anpassa appens ikon\",\r\n  \"Settings_Personalization_Subject_Title\": \"Anpassa ämnen\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Ämnen\",\r\n  \"Settings_Personalization_Subject_Description\": \"Ikoner, färger\",\r\n  \"Settings_About_Papillion_Behind\": \"Bakom Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon underhålls av 100 % frivilliga studenter\",\r\n  \"Settings_About_Discord\": \"Discord-server\",\r\n  \"Settings_About_Discord_Description\": \"Gå med i Discord-servern\",\r\n  \"Settings_About_Crowdin\": \"Crowdin-projekt\",\r\n  \"Settings_About_Crowdin_Description\": \"Hjälp till att översätta Papillon\",\r\n  \"Settings_About_Github\": \"GitHub-projekt\",\r\n  \"Settings_About_Github_Description\": \"Bidra till projektet på GitHub\",\r\n  \"Settings_About_Issue\": \"Rapportera en bugg\",\r\n  \"Settings_About_Issue_Description\": \"Rapportera ett problem du stött på\",\r\n  \"Settings_About_Dependency_Version\": \"Version av beroenden\",\r\n\r\n  \"Alert_No_Technical\": \"Ingen teknisk information tillgänglig.\",\r\n  \"Alert_Auth_Error\": \"Autentiseringsfel\",\r\n  \"Alert_Auth_Bad_Creds\": \"Uppgifterna du angav är felaktiga eller så försöker du logga in med ett föräldrakonto. Denna typ av konto stöds inte av Papillon än.\",\r\n  \"Alert_Not_Supported\": \"Instansen stöds inte\",\r\n  \"Alert_Security_Instance_HTTP\": \"Av säkerhetsskäl accepterar Papillon inte instanser som fortfarande använder HTTP-protokollet. Vi rekommenderar att du informerar skolledningen så att de kan uppdatera instansen för att bevara säkerheten.\",\r\n  \"Alert_NoDemo\": \"Papillon är inte byggd för att fungera med demoinstanser, vänligen använd en riktig instans.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon kan inte hämta information från denna PRONOTE-instans, är den fortfarande giltig?\",\r\n  \"Alert_No_Pos\": \"Kunde inte hämta position\",\r\n  \"Alert_Connexion_Fail\": \"Anslutning misslyckades\",\r\n\r\n  \"Feature_Limited\": \"Begränsade funktioner\",\r\n  \"Feature_Soon\": \"Det kommer snart!\",\r\n  \"Feature_Soon_Notification\": \"Vi jobbar hårt för att erbjuda dig denna funktion i en framtida uppdatering.\",\r\n  \"Feature_Add_Card\": \"Lägg till ett nytt kort från fliken Profil i navigeringsfältet\",\r\n\r\n  \"Webview_Wait\": \"Lite tålamod...\",\r\n\r\n  \"Profile_QRCards\": \"QR-kod och kort\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} kort\",\r\n  \"Profile_Cards_Loading_History\": \"Laddar transaktionshistorik\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Detta kan ta en stund...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kort\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Matsal, tillträde\",\r\n  \"Settings_Cards_Banner_Description\": \"Lägg till dina matkort och resekort för att komma åt dem överallt från din telefon i Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Inga kort\",\r\n  \"Settings_Cards_Add_Button\": \"Lägg till\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Lägg till ett för att se ditt saldo i matsalen, skanna din QR-kod och mer\",\r\n  \"Settings_Subjects_None_Title\": \"Inga ämnen\",\r\n  \"Settings_Subjects_None_Description\": \"Bläddra i appens olika flikar för att kunna anpassa ämnena.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Återställ\",\r\n  \"Settings_Subjects_Reset_Message\": \"Vill du verkligen återställa alla ämnen?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Återställ\",\r\n\r\n  \"Settings_Donator\": \"Donatorer\",\r\n  \"Settings_Donator_Description\": \"Visa listan över donatorer\",\r\n  \"Settings_App_Version\": \"App-version\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Rikta QR-koden mot skannern\",\r\n  \"Profile_Cards_No_Reservation\": \"Ingen bokning\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Det verkar som att du inte kan boka denna dag.\",\r\n  \"Profile_Cards_History\": \"Historik\",\r\n  \"Magic_Important\": \"Kan vara viktigt\",\r\n\r\n  \"OnBoarding_Step\": \"Steg \",\r\n  \"OnBoarding_Step_Of\": \"av \",\r\n\r\n  \"Consent_Advanced_Title\": \"Jag vill hjälpa Papillon\",\r\n  \"Consent_Advanced_Description\": \"Vi samlar in mer detaljerad information om din användning.\",\r\n  \"Consent_Required_Title\": \"Endast det nödvändiga\",\r\n  \"Consent_Required_Description\": \"Kort sagt, veta att någon använde Papillon, om det gick bra och vilken tjänst som används.\",\r\n  \"Consent_None_Title\": \"Ingenting alls\",\r\n  \"Consent_None_Description\": \"Vi kommer inte ens veta att du finns.\",\r\n  \"Consent_Title\": \"Du och Papillon\",\r\n  \"Consent_Intro1\": \"För att hjälpa Papillon att växa kan du välja att dela viss användningsinformation.\",\r\n  \"Consent_PrivacyPolicy\": \"Om du är osäker, läs vår integritetspolicy\",\r\n  \"Consent_Refuse\": \"Neka\",\r\n  \"Consent_Accept\": \"Acceptera\",\r\n  \"Consent_ChangeMind\": \"Du kan ändra dig när som helst i appens inställningar.\",\r\n  \"Consent_Arg1\": \"Används endast för att förbättra appen\",\r\n  \"Consent_Arg2\": \"Anonymt och inte kopplat till din identitet\",\r\n  \"Consent_Arg3\": \"Vi har inte tillgång till dina konton\",\r\n\r\n  \"Changelog_Title\": \"Versionsnyheter\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Inlämningsdatum\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Ämnen\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Inte klar\",\r\n  \"Tasks_ThisWeek\": \"Denna vecka\",\r\n\r\n  \"Task_Undone\": \"Inte klar\",\r\n  \"Task_Done\": \"Klar\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Anpassa bakgrundsbild\",\r\n  \"Modal_Profile_Title\": \"Anpassa profil\",\r\n\r\n  \"Modal_Task_Status\": \"Uppgiftsstatus\",\r\n  \"Modal_Task_Description\": \"Beskrivning av uppgift\",\r\n  \"Modal_Task_Attachments\": \"Bilagor\",\r\n\r\n  \"Today\": \"Idag\",\r\n  \"Yesterday\": \"Igår\",\r\n  \"Tomorrow\": \"Imorgon\"\r\n}"
  },
  {
    "path": "locales/sw.json",
    "content": "{\r\n  \"Global_Back\": \"Rudi\",\r\n  \"Global_DatePrefix\": \"tarehe\",\r\n\r\n  \"Tab_Home\": \"Mwanzo\",\r\n  \"Tab_Calendar\": \"Ratiba\",\r\n  \"Tab_Tasks\": \"Kazi\",\r\n  \"Tab_Grades\": \"Alama\",\r\n  \"Tab_Profile\": \"Wasifu\",\r\n  \"Tab_Custom_Profile\": \"Badilisha wasifu wangu\",\r\n  \"Button_Change_ProfilePicture\": \"Badilisha picha ya wasifu\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Piga picha\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Kutoka kwenye maktaba\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Chukua kutoka mfumo wa shule (ENT)\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Futa picha\",\r\n  \"Tab_Page\": \"Ukurasa\",\r\n  \"Tab_Settings\": \"Mipangilio\",\r\n  \"Tab_News\": \"Habari\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Programu ya kudhibiti maisha yako ya shule\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Unganisha programu zako za shule ili uone alama, ratiba, kazi za nyumbani na mengine mengi kwenye kiolesura cha Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Anza\",\r\n  \"ONBOARDING_HELP_BTN\": \"Unahitaji msaada?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Huduma ya chuo kikuu\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Huduma ya chakula\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Chagua huduma yako ya shule\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Chagua huduma yako ya chakula\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Chagua huduma yako ya chuo kikuu\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Ungependa kuingia vipi?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Tumia eneo langu\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Tafuta mji\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Nina namba ya QR\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Nina URL ya kuingia\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Chagua shule yako\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Ingiza jina la mji wako na uchague shule yako\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Ingia kama ulivyozoea\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Ingia kwenye akaunti yako\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Chagua seva iliyopangiwa akaunti hii\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Ingiza msimbo wa tarakimu 4 ulioutengeneza kwenye PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Kuunganisha na\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Skeni namba ya QR ya shule yako ili kuunganishwa.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Uthibitishaji wa namba ya QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Hii inaweza kuchukua muda kidogo...\",\r\n  \"ONBOARDING_URL\": \"Weka anwani ya URL ya shule yako\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL ya mfumo wako wa PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Kabla ya kumaliza\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Chagua\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"rangi ya mandhari\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Weka msimbo wa PIN wa PRONOTE yako\",\r\n  \"Onboarding_Load_Webview_Description\": \"Tunapakia tovuti ya shule yako\",\r\n  \"INPUT_PIN\": \"Msimbo wa PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Tafuta mfumo...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Inaunganisha...\",\r\n\r\n  \"WAITING\": \"Subiri\",\r\n  \"IZLY_SMS_SEND\": \"Umepokea kiungo cha kuingia, bofya na ufuate hatua husika.\",\r\n  \"STEP\": \"Hatua\",\r\n  \"STEP_OUTOF\": \"kati ya\",\r\n  \"INPUT_USERNAME\": \"Jina la mtumiaji\",\r\n  \"INPUT_MAIL\": \"Barua pepe\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Barua pepe au jina la mtumiaji\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Namba ya simu au barua pepe\",\r\n  \"INPUT_PASSWORD\": \"Nenosiri\",\r\n  \"INPUT_PASSWORD_CODE\": \"Msimbo wa kuingia\",\r\n  \"INPUT_ETABID\": \"Utambulisho wa shule yako\",\r\n  \"LOGIN_BTN\": \"Ingia\",\r\n  \"CONFIRM_BTN\": \"Thibitisha\",\r\n  \"CANCEL_BTN\": \"Ghairi\",\r\n\r\n  \"Tab_New_Event\": \"Tukio jipya\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Udhibiti wa iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Simamia URL zako za iCal\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Ongeza URL ya iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Simamia {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Ongeza au futa URL za iCal ili kusawazisha na kalenda yako.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Kichwa kinakosekana\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Ipe jina URL hii ya iCal ili kuiongeza.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Hakuna URL ya iCal iliyoongezwa\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Tabu hii bado inatengenezwa.\",\r\n  \"TabUnderConstruction_Details\": \"Rudi baadaye kwa ajili ya sasisho.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Hali ya Uendelezaji\",\r\n  \"TabDevModeNotice_Details\": \"Mazingira kamili ya majaribio kwa waendelezaji.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Maelezo ya kiufundi\",\r\n\r\n  \"Online_Course\": \"Mtandaoni\",\r\n  \"Evaluated_Course\": \"Tathmini\",\r\n  \"Edited_Course\": \"Somo lililobadilishwa\",\r\n  \"Canceled_Course\": \"Somo lililofutwa\",\r\n  \"No_Course_Room\": \"Chumba hakijulikani\",\r\n  \"Event_DeleteEvent\": \"Futa tukio\",\r\n  \"Event_Confirm_DeleteEvent\": \"Una uhakika unataka kufuta tukio hili?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Mapumziko ya mchana\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Chakula chema!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Kitamu!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Mapumziko ya asubuhi\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Muda wa kulala!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Kifungua kinywa\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Mapumziko ya alasiri\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Pumzika kidogo!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Muda wa vitafunio!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Mapumziko ya usiku\",\r\n  \"Course_Separator_Night_Alt_1\": \"Muda wa kulala!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Ni usiku sasa!\",\r\n\r\n  \"Context_Delete\": \"Futa\",\r\n  \"Context_Cancel\": \"Ghairi\",\r\n  \"Context_Edit\": \"Hariri\",\r\n  \"Context_Add\": \"Ongeza\",\r\n\r\n  \"Form_Title\": \"Kichwa\",\r\n  \"Form_Location\": \"Mahali\",\r\n  \"Form_Organizer\": \"Mwandaaji\",\r\n  \"Form_Start\": \"Mwanzo\",\r\n  \"Form_End\": \"Mwisho\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Una uhakika unataka kufuta tukio hili?\",\r\n\r\n  \"Home_Welcome_Name\": \"Habari, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Onyesha zaidi\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"zinapatikana\",\r\n  \"Home_Chats_Plurial\": \"mazungumzo\",\r\n  \"Home_Chats_Singular\": \"mazungumzo\",\r\n  \"Home_See_All_Tasks\": \"Ona kazi zote\",\r\n  \"Home_Welcome\": \"Habari!\",\r\n  \"Home_Planned_None\": \"Huna masomo yoyote yaliyobaki leo\",\r\n  \"Home_Planned_One\": \"Una somo moja lililobaki leo\",\r\n  \"Home_Planned_Number\": \"Una masomo {{number}} yaliyobaki leo\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Masomo yanayofuata\",\r\n  \"Home_Widget_NewGrades\": \"Alama mpya\",\r\n  \"Home_Widget_NewHomeworks\": \"Kazi za kufanya\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Hakuna masomo yajayo\",\r\n  \"Home_Widget_NoCourses_Description\": \"Hakuna masomo yaliyopangwa kwa leo.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kadi\",\r\n  \"Home_Cards_Button_Description_None\": \"Hakuna kadi\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Kadi moja\",\r\n  \"Home_Cards_Button_Description_Number\": \"Kadi {{number}}\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Ujumbe\",\r\n  \"Home_Chats_Button_Description_None\": \"Hakuna ujumbe\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Ujumbe mmoja\",\r\n  \"Home_Chats_Button_Description_Number\": \"Ujumbe {{number}}\",\r\n\r\n  \"Home_Attendance_Title\": \"Utoro\",\r\n  \"Home_Attendance_Button_Description_None\": \"Hakuna utoro\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Utoro mara moja\",\r\n  \"Home_Attendance_Button_Description_Number\": \"Utoro mara {{number}}\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Mlo\",\r\n  \"Home_Menu_Button_Description\": \"Mlo wa leo\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Hakuna tukio lililopatikana\",\r\n  \"Tab_Calendar_Empty_Description\": \"Ongeza tukio au sawazisha kalenda yako ili kuanza.\",\r\n\r\n  \"Modal_Course_Title\": \"Somo langu\",\r\n  \"Modal_Course_StartsIn\": \"Inaanza baada ya\",\r\n  \"Modal_Course_StartedAgo\": \"Imeisha tangu\",\r\n  \"Modal_Course_Ongoing\": \"Imeanza tangu\",\r\n  \"Modal_Course_Group\": \"Kikundi\",\r\n  \"Modal_Course_Group_Full\": \"Darasa\",\r\n\r\n  \"Modal_Course_Details\": \"Maelezo ya somo\",\r\n  \"Modal_Course_Teacher\": \"Mwalimu\",\r\n  \"Modal_Course_Room\": \"Chumba\",\r\n  \"Modal_Course_Duration\": \"Muda\",\r\n\r\n  \"Modal_Course_Time\": \"Saa za somo\",\r\n  \"Modal_Course_Start\": \"Mwanzo\",\r\n  \"Modal_Course_End\": \"Mwisho\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Tafuta kazi\",\r\n  \"Tasks_LeftHomeworks_Title\": \"kazi zilizobaki\",\r\n  \"Tasks_LeftHomeworks_Time\": \"wiki hii\",\r\n  \"Tasks_Done_AllTasks\": \"Kazi zote\",\r\n  \"Tasks_Done_CompletedTasks\": \"zimekamilika\",\r\n  \"Tasks_Nav_Left\": \"Bado kuna kazi {{count}} za kufanya\",\r\n  \"Tasks_Nav_One\": \"Imebaki kazi moja tu\",\r\n  \"Tasks_Nav_Completed\": \"Kila kitu kimeisha!\",\r\n  \"Tasks_Week\": \"Wiki\",\r\n  \"Tasks_NoTasks_Title\": \"Hakuna kazi\",\r\n  \"Tasks_NoTasks_Description\": \"Hakuna kazi zilizopangwa kwa wiki hii. Furahia mapumziko!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"kwa wiki {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Hakuna kazi\",\r\n  \"Task_Start\": \"Zilizobaki\",\r\n  \"Task_Complete\": \"Zilizokamilika\",\r\n  \"Task_Sorting_Title\": \"Panga kwa\",\r\n  \"Task_OnlyShowUndone\": \"Kazi zilizokamilika\",\r\n  \"Task_Show_Title\": \"Onyesha\",\r\n  \"Settings_General\": \"Jumla\",\r\n\r\n  \"Latest_Grades\": \"Alama mpya\",\r\n  \"Grades_Search_Placeholder\": \"Tafuta alama, somo\",\r\n\r\n  \"Grades_Avg_Methods\": \"Mbinu za hesabu\",\r\n  \"Grades_Avg_All_Title\": \"Wastani wa jumla\",\r\n  \"Grades_Avg_All_Short\": \"Wastani jumla\",\r\n  \"Grades_Avg_All_Pond\": \"Wastani wa uzito\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Wastani uzito\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Hukokotoa wastani wa uzito wa alama zote\",\r\n  \"Grades_Avg_Subject_Title\": \"Wastani wa masomo\",\r\n  \"Grades_Avg_Subject_Short\": \"Wastani masomo\",\r\n  \"Grades_Avg_Subject_Description\": \"Hukokotoa wastani wa uzito wa wastani wa kila somo\",\r\n  \"Grades_Avg_Median_Title\": \"Katikati (Median)\",\r\n  \"Grades_Avg_Median_Short\": \"Median\",\r\n\r\n  \"Grades_Avg_More\": \"Jifunze zaidi\",\r\n  \"Grades_Avg_KnowMore\": \"Jifunze zaidi\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Elewa mbinu za kukokotoa wastani wa jumla\",\r\n\r\n  \"Grades_SubjectInfo\": \"Habari za somo\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"Alama {{number}}\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Wastani wa mwanafunzi\",\r\n  \"SubjectInfo_Stats_Header\": \"Takwimu\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Wastani wa darasa\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Wastani wa jumla wa darasa\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Wastani wa juu\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Wastani bora zaidi katika kikundi\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Wastani wa chini\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Wastani dhaifu zaidi katika kikundi\",\r\n\r\n  \"Grades_Semester\": \"Muhula\",\r\n  \"Grades_Trimester\": \"Awamu\",\r\n  \"Grades_OutPeriod\": \"Nje ya muda\",\r\n  \"Grades_Year\": \"Mwaka\",\r\n  \"Grades_MockExamBac\": \"Mtihani wa majaribio\",\r\n  \"Grades_MockExamBrevet\": \"Mtihani wa majaribio ya cheti\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Masomo yote\",\r\n  \"Grades_Method_Weighted\": \"Uzito\",\r\n\r\n  \"Grades_Sort\": \"Panga\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabeti\",\r\n  \"Grades_Sorting_Averages\": \"Wastani\",\r\n  \"Grades_Sorting_Date\": \"Tarehe\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Panga kwa\",\r\n  \"Grades_Menu_AverageBy\": \"Wastani kwa\",\r\n  \"NoAverage\": \"Hakuna wastani\",\r\n\r\n  \"Grades_Empty_Title\": \"Hakuna alama\",\r\n  \"Grades_Empty_Description\": \"Bado hujawekewa alama yoyote kwa kipindi hiki.\",\r\n\r\n  \"Grade_NoDescription\": \"Kazi ya {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Masomo\",\r\n  \"Grades_Tab_Latest\": \"Alama mpya\",\r\n\r\n  \"Profile_Attendance_Title\": \"Mahudhurio\",\r\n  \"Profile_Attendance_Denominator_Single\": \"utoro\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"utoro\",\r\n\r\n  \"Profile_Discussions_Title\": \"Mazungumzo\",\r\n  \"Profile_Discussions_Denominator_Single\": \"haujasomwa\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"haijasomwa\",\r\n\r\n  \"Profile_News_Title\": \"Habari\",\r\n  \"Profile_News_Denominator_Single\": \"mpya\",\r\n  \"Profile_News_Denominator_Plural\": \"mpya\",\r\n  \"Profile_News_Open\": \"Fungua\",\r\n  \"Profile_News_Loading_Title\": \"Inapakia habari...\",\r\n  \"Profile_News_Author_Unknown\": \"Mwandishi asiyejulikana\",\r\n\r\n  \"Profile_Cards_Title\": \"Namba ya QR na kadi\",\r\n\r\n  \"Modal_Grades_Title\": \"Maelezo ya alama\",\r\n  \"Modal_Grades_BestGrade\": \"Alama bora zaidi ya kikundi\",\r\n\r\n  \"Grades_Details_Title\": \"Maelezo\",\r\n  \"Grades_NormalizedGrade_Title\": \"Alama kati ya 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Thamani ya alama iliyobadilishwa kwenda kipimo cha 20\",\r\n  \"Grades_HighestGrade_Title\": \"Alama ya juu zaidi\",\r\n  \"Grades_HighestGrade_Description\": \"Alama ya juu kabisa iliyopatikana kwenye kikundi\",\r\n  \"Grades_LowestGrade_Title\": \"Alama ya chini zaidi\",\r\n  \"Grades_LowestGrade_Description\": \"Alama ya chini kabisa iliyopatikana kwenye kikundi\",\r\n  \"Grades_Influence_Title\": \"Ushawishi\",\r\n  \"Grades_Avg_Group_Title\": \"Wastani wa kikundi\",\r\n  \"Grades_Coefficient\": \"Kipengele (Coefficient)\",\r\n  \"Grades_Avg_Group_Short\": \"Wastani kundi\",\r\n  \"Grades_Tab_Rank\": \"Nafasi\",\r\n  \"Grades_Tab_Rank_Description\": \"Nafasi yako kwenye kikundi\",\r\n\r\n  \"News_Search_Placeholder\": \"Tafuta habari\",\r\n  \"News_Empty_Title\": \"Hakuna habari\",\r\n  \"News_Empty_Description\": \"Hakuna habari zilizopatikana kwenye shule yako.\",\r\n  \"News_Search_NoResults\": \"Hakuna habari iliyopatikana\",\r\n  \"News_Search_NoResults_Description\": \"Hakuna habari iliyopatikana kulingana na utafutaji wako.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Mandhari laini na ya kifahari\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Usomaji\",\r\n  \"News_Theme_Reading_Description\": \"Mandhari yaliyoundwa kwa ajili ya usomaji\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Saa zilizopotea\",\r\n  \"Attendance_Hours_Unjustified\": \"Saa zisizohalalishwa\",\r\n  \"Attendance_Missing\": \"Utoro\",\r\n  \"Attendance_Delays\": \"Kuchelewa\",\r\n  \"Attendance_NoReason\": \"Hakuna sababu\",\r\n  \"Attendance_NoEvent_Title\": \"Hakuna tukio\",\r\n  \"Attendance_NoEvent_Description\": \"Hakuna utoro au kuchelewa kulikorekodiwa kwa kipindi hiki.\",\r\n\r\n  \"Settings_Account_Title\": \"Akaunti yangu\",\r\n  \"Settings_Account_Description\": \"Akaunti yangu\",\r\n  \"Settings_Services_Title\": \"Akaunti zilizounganishwa\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Akaunti ya mwisho kutumika\",\r\n  \"Settings_Notifications_Title\": \"Arifa\",\r\n  \"Settings_Notifications_Description\": \"Tahadhari, masafa...\",\r\n  \"Settings_Subjects_Title\": \"Masomo\",\r\n  \"Settings_Subjects_Description\": \"Jina, rangi, fonti...\",\r\n  \"Settings_Personalization_Title\": \"Ubinafsishaji\",\r\n  \"Settings_Personalization_Description\": \"Mandhari, rangi...\",\r\n  \"Settings_Cards_Title\": \"Kadi\",\r\n  \"Settings_Cards_Description\": \"Kantini, ufikiaji...\",\r\n  \"Settings_Accessibility_Title\": \"Ufikivu\",\r\n  \"Settings_Accessibility_Description\": \"Muonekano, sauti...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Vipengele mahiri\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Vipengele vya AI\",\r\n  \"Settings_MagicPlus_Enable\": \"Washa Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Huboresha moja kwa moja mpangilio wa kazi zako ili kuongeza tija\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Mfumo wa ndani kabisa, hakuna data inayotoka nje ya kifaa chako\",\r\n  \"Settings_Donate_Title\": \"Changia\",\r\n  \"Settings_Donate_Description\": \"Saidia mradi huu\",\r\n  \"Settings_Telemetry_Title\": \"Takwimu na faragha\",\r\n  \"Settings_Telemetry_Description\": \"Simamia data zinazokusanywa\",\r\n  \"Settings_About_Title\": \"Kuhusu\",\r\n  \"Settings_About_Description\": \"Toleo\",\r\n  \"Settings_Logout_Title\": \"Ondoka\",\r\n  \"Settings_Logout_Description\": \"Futa akaunti hii kutoka Papillon\",\r\n  \"Settings_Language_Title\": \"Lugha\",\r\n  \"Settings_Language_Description\": \"Badilisha lugha\",\r\n  \"Settings_Tabs_Title\": \"Tabu\",\r\n  \"Settings_Tabs_Description\": \"Ficha tabu kwenye mlo\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Ubinafsishaji\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Mandhari, masomo...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Binafsisha masomo\",\r\n  \"Settings_Personalization_Accent\": \"Rangi ya msisitizo\",\r\n  \"Settings_Personalization_Accent_Description\": \"Rangi unayochagua hapa itatumika kwenye ukurasa wa mwanzo wa Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Mandhari\",\r\n  \"Settings_Personalization_Icon_Title\": \"Badilisha aikoni\",\r\n  \"Settings_Personalization_Icon_Description\": \"Binafsisha aikoni ya programu\",\r\n  \"Settings_Personalization_Subject_Title\": \"Binafsisha masomo\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Masomo\",\r\n  \"Settings_Personalization_Subject_Description\": \"Aikoni, rangi\",\r\n  \"Settings_About_Papillion_Behind\": \"Nyuma ya Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon inasimamiwa na wanafunzi wa kujitolea 100%\",\r\n  \"Settings_About_Discord\": \"Seva ya Discord\",\r\n  \"Settings_About_Discord_Description\": \"Jiunge na seva ya Discord\",\r\n  \"Settings_About_Crowdin\": \"Mradi wa Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Saidia kutafsiri Papillon\",\r\n  \"Settings_About_Github\": \"Mradi wa GitHub\",\r\n  \"Settings_About_Github_Description\": \"Changia kwenye mradi huu GitHub\",\r\n  \"Settings_About_Issue\": \"Ripoti hitilafu\",\r\n  \"Settings_About_Issue_Description\": \"Ripoti hitilafu uliyoipata\",\r\n  \"Settings_About_Dependency_Version\": \"Toleo la vitegemezi\",\r\n\r\n  \"Alert_No_Technical\": \"Hakuna habari za kiufundi zinazopatikana.\",\r\n  \"Alert_Auth_Error\": \"Hitilafu ya uthibitishaji\",\r\n  \"Alert_Auth_Bad_Creds\": \"Maelezo uliyoweka si sahihi au unajaribu kuingia na akaunti ya mzazi. Aina hii ya akaunti bado haitumiki na Papillon.\",\r\n  \"Alert_Not_Supported\": \"Mfumo hautumiki\",\r\n  \"Alert_Security_Instance_HTTP\": \"Kwa sababu za usalama, Papillon haikubali mifumo inayotumia itifaki ya HTTP. Tunapendekeza umjulishe mkuu wa shule ili asasishe mfumo huu.\",\r\n  \"Alert_NoDemo\": \"Papillon haijatengenezwa kufanya kazi na mifumo ya majaribio (demo), tafadhali tumia mfumo halisi.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon haiwezi kupata habari kutoka kwa mfumo huu wa PRONOTE, je bado ni halali?\",\r\n  \"Alert_No_Pos\": \"Haiwezekani kupata eneo\",\r\n  \"Alert_Connexion_Fail\": \"Uunganishaji umeshindikana\",\r\n\r\n  \"Feature_Limited\": \"Vipengele vilivyo na kikomo\",\r\n  \"Feature_Soon\": \"Inakuja hivi karibuni!\",\r\n  \"Feature_Soon_Notification\": \"Tunafanya kazi kwa bidii ili kukuletea kipengele hiki katika sasisho lijalo.\",\r\n  \"Feature_Add_Card\": \"Ongeza kadi mpya kutoka kwenye tabu ya Wasifu inayopatikana kwenye upau wa urambazaji\",\r\n\r\n  \"Webview_Wait\": \"Subiri kidogo...\",\r\n\r\n  \"Profile_QRCards\": \"Namba ya QR na kadi\",\r\n  \"Profile_QRCards_Subtitle\": \"Kadi {{count}}\",\r\n  \"Profile_Cards_Loading_History\": \"Inapakia historia ya miamala\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Hii inaweza kuchukua muda...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kadi\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Kantini, ufikiaji\",\r\n  \"Settings_Cards_Banner_Description\": \"Ongeza kadi zako za kantini na usafiri ili kuzitumia popote kutoka kwenye simu yako kupitia Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Hakuna kadi\",\r\n  \"Settings_Cards_Add_Button\": \"Ongeza\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Ongeza kadi ili kuona salio la kantini, skeni namba ya QR na mengineyo\",\r\n  \"Settings_Subjects_None_Title\": \"Hakuna masomo\",\r\n  \"Settings_Subjects_None_Description\": \"Vinjari tabu mbalimbali za programu ili uweze kubinafsisha masomo.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Weka upya\",\r\n  \"Settings_Subjects_Reset_Message\": \"Je, kweli unataka kuweka upya masomo yote?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Weka upya\",\r\n\r\n  \"Settings_Donator\": \"Wafadhili\",\r\n  \"Settings_Donator_Description\": \"Ona orodha ya wafadhili\",\r\n  \"Settings_App_Version\": \"Toleo la programu\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Elekeza namba ya QR kwenye skana ya mashine\",\r\n  \"Profile_Cards_No_Reservation\": \"Hakuna hifadhi\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Inaonekana huwezi kuhifadhi kwa siku hii.\",\r\n  \"Profile_Cards_History\": \"Historia\",\r\n  \"Magic_Important\": \"Inaweza kuwa muhimu\",\r\n\r\n  \"OnBoarding_Step\": \"Hatua ya \",\r\n  \"OnBoarding_Step_Of\": \"kati ya \",\r\n\r\n  \"Consent_Advanced_Title\": \"Nataka kusaidia Papillon\",\r\n  \"Consent_Advanced_Description\": \"Tunakusanya habari za kina zaidi kuhusu matumizi yako.\",\r\n  \"Consent_Required_Title\": \"Muhimu tu\",\r\n  \"Consent_Required_Description\": \"Kwa kifupi, kujua kuwa kuna mtu alitumia Papillon, kama ilienda vizuri na huduma gani anatumia.\",\r\n  \"Consent_None_Title\": \"Hakuna kabisa\",\r\n  \"Consent_None_Description\": \"Hata hatutajua kama upo.\",\r\n  \"Consent_Title\": \"Wewe na Papillon\",\r\n  \"Consent_Intro1\": \"Ili kusaidia Papillon kukua, unaweza kuchagua kushiriki baadhi ya habari za matumizi.\",\r\n  \"Consent_PrivacyPolicy\": \"Ikiwa una shaka, soma sera yetu ya faragha\",\r\n  \"Consent_Refuse\": \"Kataa\",\r\n  \"Consent_Accept\": \"Kubali\",\r\n  \"Consent_ChangeMind\": \"Unaweza kubadilisha mawazo yako wakati wowote kutoka kwenye mipangilio ya programu.\",\r\n  \"Consent_Arg1\": \"Hutumika tu kuboresha programu\",\r\n  \"Consent_Arg2\": \"Haitaji jina lako wala kuhusishwa na utambulisho wako\",\r\n  \"Consent_Arg3\": \"Hatuna ufikiaji wa akaunti zako\",\r\n\r\n  \"Changelog_Title\": \"Maelezo ya sasisho\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Tarehe ya kuwasilisha\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Masomo\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Zisizokamilika\",\r\n  \"Tasks_ThisWeek\": \"Wiki hii\",\r\n\r\n  \"Task_Undone\": \"Haikukamilika\",\r\n  \"Task_Done\": \"Imekamilika\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Binafsisha mandhari ya nyuma\",\r\n  \"Modal_Profile_Title\": \"Binafsisha wasifu\",\r\n\r\n  \"Modal_Task_Status\": \"Hali ya kazi\",\r\n  \"Modal_Task_Description\": \"Maelezo ya kazi\",\r\n  \"Modal_Task_Attachments\": \"Viambatisho\",\r\n\r\n  \"Today\": \"Leo\",\r\n  \"Yesterday\": \"Jana\",\r\n  \"Tomorrow\": \"Kesho\"\r\n}"
  },
  {
    "path": "locales/th.json",
    "content": "{\r\n  \"Global_Back\": \"ย้อนกลับ\",\r\n  \"Global_DatePrefix\": \"เมื่อวันที่\",\r\n\r\n  \"Tab_Home\": \"หน้าแรก\",\r\n  \"Tab_Calendar\": \"ตารางเรียน\",\r\n  \"Tab_Tasks\": \"งาน\",\r\n  \"Tab_Grades\": \"เกรด\",\r\n  \"Tab_Profile\": \"โปรไฟล์\",\r\n  \"Tab_Custom_Profile\": \"แก้ไขโปรไฟล์\",\r\n  \"Button_Change_ProfilePicture\": \"เปลี่ยนรูปโปรไฟล์\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"ถ่ายรูป\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"เลือกจากคลังภาพ\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"ดึงข้อมูลจากระบบโรงเรียน\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"ลบรูปภาพ\",\r\n  \"Tab_Page\": \"หน้า\",\r\n  \"Tab_Settings\": \"การตั้งค่า\",\r\n  \"Tab_News\": \"ข่าวสาร\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"แอปสำหรับจัดการชีวิตในโรงเรียนของคุณ\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"เชื่อมต่อแอปการศึกษาของคุณเพื่อเข้าถึงเกรด ตารางเรียน การบ้าน และอื่นๆ อีกมากมายใน Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"เริ่มต้นใช้งาน\",\r\n  \"ONBOARDING_HELP_BTN\": \"ต้องการความช่วยเหลือ?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"บริการระดับมหาวิทยาลัย\",\r\n  \"ONBOARDING_RESTAURANTS\": \"บริการโรงอาหาร\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"เลือกบริการโรงเรียนของคุณ\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"เลือกบริการโรงอาหาร\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"เลือกบริการมหาวิทยาลัย\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"คุณต้องการเข้าสู่ระบบอย่างไร?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"ใช้ตำแหน่งของฉัน\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"ค้นหาเมือง\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"ฉันมีคิวอาร์โค้ด\",\r\n  \"ONBOARDING_METHOD_LINK\": \"ฉันมี URL สำหรับเข้าสู่ระบบ\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"เลือกสถานศึกษาของคุณ\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"ระบุชื่อเมืองและเลือกสถานศึกษาของคุณ\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"เข้าสู่ระบบตามวิธีปกติของคุณ\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"เข้าสู่ระบบบัญชีของคุณ\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"เลือกโฮสต์ที่กำหนดให้กับบัญชี\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"ระบุรหัส 4 หลักที่คุณเพิ่งสร้างใน PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"เชื่อมต่อกับ\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"สแกนคิวอาร์โค้ดของสถานศึกษาเพื่อเชื่อมต่อ\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"กำลังตรวจสอบคิวอาร์โค้ด\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"รอสักครู่...\",\r\n  \"ONBOARDING_URL\": \"ระบุที่อยู่ URL ของสถานศึกษา\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL ของระบบ PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"ก่อนจะเสร็จสิ้น\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"เลือก\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"สีของธีม\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"ใส่รหัส PIN ของ PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"กำลังโหลดหน้าเว็บสถานศึกษาของคุณ\",\r\n  \"INPUT_PIN\": \"รหัส PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"ค้นหาเซิร์ฟเวอร์...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"กำลังเข้าสู่ระบบ...\",\r\n\r\n  \"WAITING\": \"กรุณารอสักครู่\",\r\n  \"IZLY_SMS_SEND\": \"คุณได้รับลิงก์สำหรับเข้าสู่ระบบแล้ว กรุณาคลิกและทำตามขั้นตอน\",\r\n  \"STEP\": \"ขั้นตอนที่\",\r\n  \"STEP_OUTOF\": \"จาก\",\r\n  \"INPUT_USERNAME\": \"ชื่อผู้ใช้\",\r\n  \"INPUT_MAIL\": \"อีเมล\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"อีเมลหรือชื่อผู้ใช้\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"เบอร์โทรศัพท์หรืออีเมล\",\r\n  \"INPUT_PASSWORD\": \"รหัสผ่าน\",\r\n  \"INPUT_PASSWORD_CODE\": \"รหัสเข้าใช้งาน\",\r\n  \"INPUT_ETABID\": \"รหัสประจำสถานศึกษา\",\r\n  \"LOGIN_BTN\": \"เข้าสู่ระบบ\",\r\n  \"CONFIRM_BTN\": \"ยืนยัน\",\r\n  \"CANCEL_BTN\": \"ยกเลิก\",\r\n\r\n  \"Tab_New_Event\": \"กิจกรรมใหม่\",\r\n\r\n  \"Tab_Calendar_Icals\": \"จัดการ iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"จัดการ URL ของ iCal ของคุณ\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"เพิ่ม URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"จัดการ {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"เพิ่มหรือลบ URL iCal เพื่อซิงค์กับปฏิทินของคุณ\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"ยังไม่ได้ระบุชื่อ\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"ตั้งชื่อให้ URL iCal นี้เพื่อบันทึก\",\r\n  \"Tab_Calendar_Icals_Empty\": \"ยังไม่มีการเพิ่ม URL iCal\",\r\n\r\n  \"TabUnderConstruction_Title\": \"ส่วนนี้กำลังอยู่ระหว่างการพัฒนา\",\r\n  \"TabUnderConstruction_Details\": \"กลับมาตรวจสอบการอัปเดตในภายหลัง\",\r\n\r\n  \"TabDevModeNotice_Title\": \"โหมดนักพัฒนา\",\r\n  \"TabDevModeNotice_Details\": \"สภาพแวดล้อมทดสอบเต็มรูปแบบสำหรับนักพัฒนา\",\r\n\r\n  \"Alert_TechnicalDetails\": \"รายละเอียดทางเทคนิค\",\r\n\r\n  \"Online_Course\": \"ออนไลน์\",\r\n  \"Evaluated_Course\": \"การสอบ/ประเมิน\",\r\n  \"Edited_Course\": \"แก้ไขเวลาเรียน\",\r\n  \"Canceled_Course\": \"ยกเลิกคลาส\",\r\n  \"No_Course_Room\": \"ไม่ระบุห้องเรียน\",\r\n  \"Event_DeleteEvent\": \"ลบกิจกรรม\",\r\n  \"Event_Confirm_DeleteEvent\": \"คุณแน่ใจหรือไม่ว่าต้องการลบกิจกรรมนี้?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"พักเที่ยง\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"ทานให้อร่อยนะ!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"ง่ำๆ!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"พักเช้า\",\r\n  \"Course_Separator_Morning_Alt_1\": \"ไปนอนกัน!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"อาหารเช้า\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"พักบ่าย\",\r\n  \"Course_Separator_Evening_Alt_1\": \"ได้เวลาพักแล้ว!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"เวลาของว่าง!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"พักดึก\",\r\n  \"Course_Separator_Night_Alt_1\": \"ฝันดีนะ!\",\r\n  \"Course_Separator_Night_Alt_2\": \"ดึกแล้ว!\",\r\n\r\n  \"Context_Delete\": \"ลบ\",\r\n  \"Context_Cancel\": \"ยกเลิก\",\r\n  \"Context_Edit\": \"แก้ไข\",\r\n  \"Context_Add\": \"เพิ่ม\",\r\n\r\n  \"Form_Title\": \"ชื่อเรื่อง\",\r\n  \"Form_Location\": \"สถานที่\",\r\n  \"Form_Organizer\": \"ผู้จัดงาน\",\r\n  \"Form_Start\": \"เริ่ม\",\r\n  \"Form_End\": \"สิ้นสุด\",\r\n\r\n  \"Confirm_DeleteEvent\": \"คุณแน่ใจหรือไม่ว่าต้องการลบกิจกรรมนี้?\",\r\n\r\n  \"Home_Welcome_Name\": \"สวัสดี {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"แสดงเพิ่มเติม\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"รายการ\",\r\n  \"Home_Chats_Plurial\": \"การสนทนา\",\r\n  \"Home_Chats_Singular\": \"การสนทนา\",\r\n  \"Home_See_All_Tasks\": \"ดูงานทั้งหมด\",\r\n  \"Home_Welcome\": \"สวัสดี!\",\r\n  \"Home_Planned_None\": \"วันนี้ไม่มีเรียนแล้ว\",\r\n  \"Home_Planned_One\": \"วันนี้เหลืออีก 1 คาบ\",\r\n  \"Home_Planned_Number\": \"วันนี้เหลืออีก {{number}} คาบ\",\r\n\r\n  \"Home_Widget_NextCourses\": \"คาบเรียนถัดไป\",\r\n  \"Home_Widget_NewGrades\": \"เกรดใหม่\",\r\n  \"Home_Widget_NewHomeworks\": \"งานที่ต้องทำ\",\r\n\r\n  \"Home_Widget_NoCourses\": \"ไม่มีเรียนเร็วๆ นี้\",\r\n  \"Home_Widget_NoCourses_Description\": \"ไม่มีตารางเรียนสำหรับวันนี้\",\r\n\r\n  \"Home_Cards_Button_Title\": \"บัตร\",\r\n  \"Home_Cards_Button_Description_None\": \"ไม่มีบัตร\",\r\n  \"Home_Cards_Button_Description_Singular\": \"บัตร 1 ใบ\",\r\n  \"Home_Cards_Button_Description_Number\": \"บัตร {{number}} ใบ\",\r\n\r\n  \"Home_Chats_Button_Title\": \"ข้อความ\",\r\n  \"Home_Chats_Button_Description_None\": \"ไม่มีข้อความ\",\r\n  \"Home_Chats_Button_Description_Singular\": \"ข้อความ 1 รายการ\",\r\n  \"Home_Chats_Button_Description_Number\": \"ข้อความ {{number}} รายการ\",\r\n\r\n  \"Home_Attendance_Title\": \"การเข้าเรียน\",\r\n  \"Home_Attendance_Button_Description_None\": \"ไม่มีการขาดเรียน\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"ขาดเรียน 1 ครั้ง\",\r\n  \"Home_Attendance_Button_Description_Number\": \"ขาดเรียน {{number}} ครั้ง\",\r\n\r\n  \"Home_Menu_Button_Title\": \"เมนูอาหาร\",\r\n  \"Home_Menu_Button_Description\": \"รายการอาหารวันนี้\",\r\n\r\n  \"Tab_Calendar_Empty\": \"ไม่พบกิจกรรม\",\r\n  \"Tab_Calendar_Empty_Description\": \"เพิ่มกิจกรรมหรือซิงค์ปฏิทินเพื่อเริ่มต้น\",\r\n\r\n  \"Modal_Course_Title\": \"วิชาเรียนของฉัน\",\r\n  \"Modal_Course_StartsIn\": \"เริ่มในอีก\",\r\n  \"Modal_Course_StartedAgo\": \"จบไปแล้วเมื่อ\",\r\n  \"Modal_Course_Ongoing\": \"เริ่มมาแล้ว\",\r\n  \"Modal_Course_Group\": \"กลุ่ม\",\r\n  \"Modal_Course_Group_Full\": \"ชั้นเรียน\",\r\n\r\n  \"Modal_Course_Details\": \"รายละเอียดวิชา\",\r\n  \"Modal_Course_Teacher\": \"อาจารย์ผู้สอน\",\r\n  \"Modal_Course_Room\": \"ห้องเรียน\",\r\n  \"Modal_Course_Duration\": \"ระยะเวลา\",\r\n\r\n  \"Modal_Course_Time\": \"เวลาเรียน\",\r\n  \"Modal_Course_Start\": \"เริ่ม\",\r\n  \"Modal_Course_End\": \"สิ้นสุด\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"ค้นหางาน\",\r\n  \"Tasks_LeftHomeworks_Title\": \"งานที่เหลือ\",\r\n  \"Tasks_LeftHomeworks_Time\": \"ในสัปดาห์นี้\",\r\n  \"Tasks_Done_AllTasks\": \"งานทั้งหมด\",\r\n  \"Tasks_Done_CompletedTasks\": \"เสร็จสิ้นแล้ว\",\r\n  \"Tasks_Nav_Left\": \"เหลืองานอีก {{count}} อย่าง\",\r\n  \"Tasks_Nav_One\": \"เหลืออีกแค่งานเดียว\",\r\n  \"Tasks_Nav_Completed\": \"เสร็จสิ้นทั้งหมดแล้ว!\",\r\n  \"Tasks_Week\": \"สัปดาห์\",\r\n  \"Tasks_NoTasks_Title\": \"ไม่มีงาน\",\r\n  \"Tasks_NoTasks_Description\": \"ไม่มีงานที่ได้รับมอบหมายในสัปดาห์นี้ พักผ่อนให้เต็มที่นะ!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"สำหรับสัปดาห์ที่ {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"ไม่มีงาน\",\r\n  \"Task_Start\": \"งานที่ต้องทำ\",\r\n  \"Task_Complete\": \"เสร็จสิ้น\",\r\n  \"Task_Sorting_Title\": \"จัดเรียงตาม\",\r\n  \"Task_OnlyShowUndone\": \"งานที่เสร็จแล้ว\",\r\n  \"Task_Show_Title\": \"แสดง\",\r\n  \"Settings_General\": \"ทั่วไป\",\r\n\r\n  \"Latest_Grades\": \"เกรดใหม่\",\r\n  \"Grades_Search_Placeholder\": \"ค้นหาคะแนนหรือวิชา\",\r\n\r\n  \"Grades_Avg_Methods\": \"วิธีการคำนวณ\",\r\n  \"Grades_Avg_All_Title\": \"เกรดเฉลี่ยรวม\",\r\n  \"Grades_Avg_All_Short\": \"เกรดรวม\",\r\n  \"Grades_Avg_All_Pond\": \"เกรดเฉลี่ยถ่วงน้ำหนัก\",\r\n  \"Grades_Avg_All_Pond_Short\": \"เกรดถ่วงน้ำหนัก\",\r\n  \"Grades_Avg_All_Pond_Description\": \"คำนวณเกรดเฉลี่ยถ่วงน้ำหนักจากคะแนนทั้งหมด\",\r\n  \"Grades_Avg_Subject_Title\": \"เกรดเฉลี่ยรายวิชา\",\r\n  \"Grades_Avg_Subject_Short\": \"เฉลี่ยวิชา\",\r\n  \"Grades_Avg_Subject_Description\": \"คำนวณเกรดเฉลี่ยถ่วงน้ำหนักจากค่าเฉลี่ยของแต่ละวิชา\",\r\n  \"Grades_Avg_Median_Title\": \"มัธยฐาน\",\r\n  \"Grades_Avg_Median_Short\": \"มัธยฐาน\",\r\n\r\n  \"Grades_Avg_More\": \"ดูเพิ่มเติม\",\r\n  \"Grades_Avg_KnowMore\": \"เรียนรู้เพิ่มเติม\",\r\n  \"Grades_Avg_KnowMore_Description\": \"ทำความเข้าใจวิธีการคำนวณเกรดเฉลี่ย\",\r\n\r\n  \"Grades_SubjectInfo\": \"ข้อมูลวิชา\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"คะแนน {{number}} รายการ\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"คะแนนเฉลี่ยของนักเรียน\",\r\n  \"SubjectInfo_Stats_Header\": \"สถิติ\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"คะแนนเฉลี่ยห้อง\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"เกรดเฉลี่ยรวมของทั้งห้อง\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"คะแนนเฉลี่ยสูงสุด\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"คะแนนที่ดีที่สุดในกลุ่ม\",\r\n  \"SubjectInfo_MinAverage_Label\": \"คะแนนเฉลี่ยต่ำสุด\",\r\n  \"SubjectInfo_MinAverage_Description\": \"คะแนนที่ต่ำที่สุดในกลุ่ม\",\r\n\r\n  \"Grades_Semester\": \"ภาคเรียน\",\r\n  \"Grades_Trimester\": \"ไตรมาส\",\r\n  \"Grades_OutPeriod\": \"นอกช่วงเวลา\",\r\n  \"Grades_Year\": \"ปีการศึกษา\",\r\n  \"Grades_MockExamBac\": \"สอบจำลอง\",\r\n  \"Grades_MockExamBrevet\": \"สอบจำลอง\",\r\n\r\n  \"Grades_Method_AllGrades\": \"ทุกวิชา\",\r\n  \"Grades_Method_Weighted\": \"น้ำหนัก/หน่วยกิต\",\r\n\r\n  \"Grades_Sort\": \"จัดเรียง\",\r\n  \"Grades_Sorting_Alphabetical\": \"ตามตัวอักษร\",\r\n  \"Grades_Sorting_Averages\": \"ตามเกรดเฉลี่ย\",\r\n  \"Grades_Sorting_Date\": \"ตามวันที่\",\r\n\r\n  \"Grades_Menu_SortBy\": \"จัดเรียงตาม\",\r\n  \"Grades_Menu_AverageBy\": \"เฉลี่ยตาม\",\r\n  \"NoAverage\": \"ไม่มีเกรดเฉลี่ย\",\r\n\r\n  \"Grades_Empty_Title\": \"ยังไม่มีคะแนน\",\r\n  \"Grades_Empty_Description\": \"คุณยังไม่ได้รับคะแนนในช่วงเวลานี้\",\r\n\r\n  \"Grade_NoDescription\": \"งานมอบหมายวิชา {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"รายวิชา\",\r\n  \"Grades_Tab_Latest\": \"เกรดใหม่\",\r\n\r\n  \"Profile_Attendance_Title\": \"การเช็คชื่อ\",\r\n  \"Profile_Attendance_Denominator_Single\": \"การขาดเรียน\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"การขาดเรียน\",\r\n\r\n  \"Profile_Discussions_Title\": \"แชท\",\r\n  \"Profile_Discussions_Denominator_Single\": \"ยังไม่ได้อ่าน\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"ยังไม่ได้อ่าน\",\r\n\r\n  \"Profile_News_Title\": \"ข่าวประกาศ\",\r\n  \"Profile_News_Denominator_Single\": \"ข่าวใหม่\",\r\n  \"Profile_News_Denominator_Plural\": \"ข่าวใหม่\",\r\n  \"Profile_News_Open\": \"เปิด\",\r\n  \"Profile_News_Loading_Title\": \"กำลังโหลดข่าว...\",\r\n  \"Profile_News_Author_Unknown\": \"ไม่ระบุผู้เขียน\",\r\n\r\n  \"Profile_Cards_Title\": \"คิวอาร์โค้ดและบัตร\",\r\n\r\n  \"Modal_Grades_Title\": \"รายละเอียดคะแนน\",\r\n  \"Modal_Grades_BestGrade\": \"คะแนนสูงสุดในกลุ่ม\",\r\n\r\n  \"Grades_Details_Title\": \"รายละเอียด\",\r\n  \"Grades_NormalizedGrade_Title\": \"คะแนนฐาน 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"ค่าคะแนนที่แปลงเป็นมาตราส่วน 20\",\r\n  \"Grades_HighestGrade_Title\": \"คะแนนสูงสุด\",\r\n  \"Grades_HighestGrade_Description\": \"คะแนนสูงสุดที่ทำได้ในกลุ่ม\",\r\n  \"Grades_LowestGrade_Title\": \"คะแนนต่ำสุด\",\r\n  \"Grades_LowestGrade_Description\": \"คะแนนต่ำสุดที่ทำได้ในกลุ่ม\",\r\n  \"Grades_Influence_Title\": \"ผลกระทบ\",\r\n  \"Grades_Avg_Group_Title\": \"คะแนนเฉลี่ยกลุ่ม\",\r\n  \"Grades_Coefficient\": \"น้ำหนัก\",\r\n  \"Grades_Avg_Group_Short\": \"เฉลี่ยกลุ่ม\",\r\n  \"Grades_Tab_Rank\": \"อันดับ\",\r\n  \"Grades_Tab_Rank_Description\": \"ตำแหน่งในกลุ่ม\",\r\n\r\n  \"News_Search_Placeholder\": \"ค้นหาข่าวสาร\",\r\n  \"News_Empty_Title\": \"ไม่มีข่าวสาร\",\r\n  \"News_Empty_Description\": \"ไม่พบข่าวสารในสถานศึกษาของคุณ\",\r\n  \"News_Search_NoResults\": \"ไม่พบข่าวสาร\",\r\n  \"News_Search_NoResults_Description\": \"ไม่พบข่าวสารที่คุณกำลังค้นหา\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"ธีมที่นุ่มนวลและหรูหรา\",\r\n\r\n  \"News_Theme_Reading_Title\": \"โหมดอ่าน\",\r\n  \"News_Theme_Reading_Description\": \"ธีมที่ออกแบบมาเพื่อการอ่านโดยเฉพาะ\",\r\n\r\n  \"Attendance_Hours_Missed\": \"ชั่วโมงที่ขาด\",\r\n  \"Attendance_Hours_Unjustified\": \"ชั่วโมงที่ไม่ได้รับการรับรอง\",\r\n  \"Attendance_Missing\": \"การขาดเรียน\",\r\n  \"Attendance_Delays\": \"การมาสาย\",\r\n  \"Attendance_NoReason\": \"ไม่ระบุเหตุผล\",\r\n  \"Attendance_NoEvent_Title\": \"ไม่มีรายการ\",\r\n  \"Attendance_NoEvent_Description\": \"ไม่มีประวัติการขาดหรือมาสายในช่วงเวลานี้\",\r\n\r\n  \"Settings_Account_Title\": \"บัญชีของฉัน\",\r\n  \"Settings_Account_Description\": \"จัดการบัญชี\",\r\n  \"Settings_Services_Title\": \"บัญชีที่เชื่อมต่อ\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"บัญชีที่ใช้ล่าสุด\",\r\n  \"Settings_Notifications_Title\": \"การแจ้งเตือน\",\r\n  \"Settings_Notifications_Description\": \"การแจ้งเตือน ความถี่...\",\r\n  \"Settings_Subjects_Title\": \"วิชา\",\r\n  \"Settings_Subjects_Description\": \"ชื่อ สี ฟอนต์...\",\r\n  \"Settings_Personalization_Title\": \"การปรับแต่ง\",\r\n  \"Settings_Personalization_Description\": \"ธีม สี...\",\r\n  \"Settings_Cards_Title\": \"บัตร\",\r\n  \"Settings_Cards_Description\": \"โรงอาหาร การเข้าถึง...\",\r\n  \"Settings_Accessibility_Title\": \"การเข้าถึง\",\r\n  \"Settings_Accessibility_Description\": \"การแสดงผล เสียง...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"ฟีเจอร์อัจฉริยะ\",\r\n  \"Settings_MagicPlus_Description_Card\": \"ฟีเจอร์ AI\",\r\n  \"Settings_MagicPlus_Enable\": \"เปิดใช้งาน Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"ปรับปรุงการจัดระเบียบงานโดยอัตโนมัติเพื่อเพิ่มประสิทธิภาพการเรียน\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"โมเดลทำงานในเครื่อง 100% ข้อมูลของคุณจะไม่ถูกส่งออกจากอุปกรณ์\",\r\n  \"Settings_Donate_Title\": \"บริจาค\",\r\n  \"Settings_Donate_Description\": \"สนับสนุนโครงการนี้\",\r\n  \"Settings_Telemetry_Title\": \"ข้อมูลการใช้งานและความเป็นส่วนตัว\",\r\n  \"Settings_Telemetry_Description\": \"จัดการข้อมูลที่ถูกจัดเก็บ\",\r\n  \"Settings_About_Title\": \"เกี่ยวกับ\",\r\n  \"Settings_About_Description\": \"เวอร์ชัน\",\r\n  \"Settings_Logout_Title\": \"ออกจากระบบ\",\r\n  \"Settings_Logout_Description\": \"ลบบัญชีนี้ออกจาก Papillon\",\r\n  \"Settings_Language_Title\": \"ภาษา\",\r\n  \"Settings_Language_Description\": \"เปลี่ยนภาษา\",\r\n  \"Settings_Tabs_Title\": \"แท็บ\",\r\n  \"Settings_Tabs_Description\": \"ซ่อนแท็บจากเมนู\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"การปรับแต่ง\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"ธีม วิชา...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"ปรับแต่งรายวิชา\",\r\n  \"Settings_Personalization_Accent\": \"สีเน้น\",\r\n  \"Settings_Personalization_Accent_Description\": \"สีที่คุณเลือกจะถูกใช้ในหน้าหลักของ Papillon\",\r\n  \"Settings_Personalization_Theme\": \"ธีม\",\r\n  \"Settings_Personalization_Icon_Title\": \"เปลี่ยนไอคอน\",\r\n  \"Settings_Personalization_Icon_Description\": \"ปรับแต่งไอคอนของแอป\",\r\n  \"Settings_Personalization_Subject_Title\": \"ปรับแต่งรายวิชา\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"วิชา\",\r\n  \"Settings_Personalization_Subject_Description\": \"ไอคอน สี\",\r\n  \"Settings_About_Papillion_Behind\": \"เบื้องหลัง Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon ดูแลโดยนักศึกษาอาสาสมัคร 100%\",\r\n  \"Settings_About_Discord\": \"เซิร์ฟเวอร์ Discord\",\r\n  \"Settings_About_Discord_Description\": \"เข้าร่วมเซิร์ฟเวอร์ Discord\",\r\n  \"Settings_About_Crowdin\": \"โครงการ Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"ช่วยแปล Papillon\",\r\n  \"Settings_About_Github\": \"โครงการ GitHub\",\r\n  \"Settings_About_Github_Description\": \"ร่วมพัฒนาโครงการบน GitHub\",\r\n  \"Settings_About_Issue\": \"รายงานปัญหา\",\r\n  \"Settings_About_Issue_Description\": \"แจ้งบั๊กที่พบ\",\r\n  \"Settings_About_Dependency_Version\": \"เวอร์ชันของซอฟต์แวร์สนับสนุน\",\r\n\r\n  \"Alert_No_Technical\": \"ไม่มีข้อมูลทางเทคนิค\",\r\n  \"Alert_Auth_Error\": \"การยืนยันตัวตนผิดพลาด\",\r\n  \"Alert_Auth_Bad_Creds\": \"ข้อมูลประจำตัวที่คุณป้อนไม่ถูกต้อง หรือคุณกำลังพยายามเชื่อมต่อด้วยบัญชีผู้ปกครอง ซึ่ง Papillon ยังไม่รองรับบัญชีประเภทนี้\",\r\n  \"Alert_Not_Supported\": \"ไม่รองรับเซิร์ฟเวอร์นี้\",\r\n  \"Alert_Security_Instance_HTTP\": \"เพื่อความปลอดภัย Papillon ไม่รองรับเซิร์ฟเวอร์ที่ใช้โปรโตคอล HTTP เราแนะนำให้แจ้งผู้ดูแลสถานศึกษาเพื่ออัปเดตระบบ\",\r\n  \"Alert_NoDemo\": \"Papillon ไม่รองรับเซิร์ฟเวอร์ทดลอง (Demo) กรุณาใช้บัญชีจริง\",\r\n  \"Alert_Invalid_Instance\": \"Papillon ไม่สามารถเข้าถึงข้อมูลของระบบ PRONOTE นี้ได้ ระบบยังใช้งานได้อยู่หรือไม่?\",\r\n  \"Alert_No_Pos\": \"ไม่สามารถระบุตำแหน่งที่ตั้งได้\",\r\n  \"Alert_Connexion_Fail\": \"การเชื่อมต่อล้มเหลว\",\r\n\r\n  \"Feature_Limited\": \"ฟีเจอร์จำกัด\",\r\n  \"Feature_Soon\": \"เร็วๆ นี้!\",\r\n  \"Feature_Soon_Notification\": \"เรากำลังพัฒนาอย่างหนักเพื่อมอบฟีเจอร์นี้ให้คุณในการอัปเดตครั้งถัดไป\",\r\n  \"Feature_Add_Card\": \"เพิ่มบัตรใหม่จากแท็บโปรไฟล์ในแถบนำทาง\",\r\n\r\n  \"Webview_Wait\": \"กรุณารอสักครู่...\",\r\n\r\n  \"Profile_QRCards\": \"คิวอาร์โค้ดและบัตร\",\r\n  \"Profile_QRCards_Subtitle\": \"บัตร {{count}} ใบ\",\r\n  \"Profile_Cards_Loading_History\": \"กำลังโหลดประวัติการใช้งาน\",\r\n  \"Profile_Cards_Loading_History_Description\": \"อาจใช้เวลาสักครู่...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"บัตร\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"โรงอาหาร การเข้าถึง\",\r\n  \"Settings_Cards_Banner_Description\": \"เพิ่มบัตรโรงอาหารและบัตรเดินทางของคุณเพื่อให้เข้าถึงได้ทุกที่จากโทรศัพท์ใน Papillon\",\r\n  \"Settings_Cards_None_Title\": \"ไม่มีบัตร\",\r\n  \"Settings_Cards_Add_Button\": \"เพิ่ม\",\r\n\r\n  \"Settings_Cards_None_Description\": \"เพิ่มบัตรเพื่อดูยอดเงินโรงอาหาร สแกนคิวอาร์โค้ด และอื่นๆ\",\r\n  \"Settings_Subjects_None_Title\": \"ไม่มีวิชา\",\r\n  \"Settings_Subjects_None_Description\": \"สำรวจแท็บต่างๆ ของแอปเพื่อให้สามารถปรับแต่งรายวิชาได้\",\r\n  \"Settings_Subjects_Reset_Title\": \"รีเซ็ต\",\r\n  \"Settings_Subjects_Reset_Message\": \"คุณต้องการรีเซ็ตวิชาทั้งหมดใช่หรือไม่?\",\r\n  \"Settings_Subjects_Reset_Button\": \"รีเซ็ต\",\r\n\r\n  \"Settings_Donator\": \"ผู้สนับสนุน\",\r\n  \"Settings_Donator_Description\": \"ดูรายชื่อผู้สนับสนุน\",\r\n  \"Settings_App_Version\": \"เวอร์ชันของแอป\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"หันคิวอาร์โค้ดไปทางเครื่องสแกน\",\r\n  \"Profile_Cards_No_Reservation\": \"ไม่มีการจอง\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"ดูเหมือนว่าคุณจะไม่สามารถจองในวันนี้ได้\",\r\n  \"Profile_Cards_History\": \"ประวัติ\",\r\n  \"Magic_Important\": \"อาจจะสำคัญ\",\r\n\r\n  \"OnBoarding_Step\": \"ขั้นตอนที่ \",\r\n  \"OnBoarding_Step_Of\": \"จาก \",\r\n\r\n  \"Consent_Advanced_Title\": \"ฉันต้องการช่วย Papillon\",\r\n  \"Consent_Advanced_Description\": \"เราจะรวบรวมข้อมูลการใช้งานอย่างละเอียดมากขึ้นเพื่อนำไปปรับปรุง\",\r\n  \"Consent_Required_Title\": \"เฉพาะสิ่งที่จำเป็น\",\r\n  \"Consent_Required_Description\": \"เพื่อให้ทราบว่ามีการใช้งานแอป ระบบทำงานปกติหรือไม่ และใช้บริการใด\",\r\n  \"Consent_None_Title\": \"ไม่ส่งข้อมูลใดๆ\",\r\n  \"Consent_None_Description\": \"เราจะไม่ทราบถึงการมีอยู่ของคุณเลย\",\r\n  \"Consent_Title\": \"คุณและ Papillon\",\r\n  \"Consent_Intro1\": \"เพื่อช่วยให้ Papillon เติบโต คุณสามารถเลือกแชร์ข้อมูลการใช้งานบางส่วนได้\",\r\n  \"Consent_PrivacyPolicy\": \"หากมีข้อสงสัย โปรดอ่านนโยบายความเป็นส่วนตัวของเรา\",\r\n  \"Consent_Refuse\": \"ปฏิเสธ\",\r\n  \"Consent_Accept\": \"ยอมรับ\",\r\n  \"Consent_ChangeMind\": \"คุณสามารถเปลี่ยนใจได้ทุกเมื่อในการตั้งค่าของแอป\",\r\n  \"Consent_Arg1\": \"ใช้เพื่อพัฒนาแอปพลิเคชันเท่านั้น\",\r\n  \"Consent_Arg2\": \"ไม่ระบุตัวตนและไม่เชื่อมโยงกับข้อมูลส่วนตัวของคุณ\",\r\n  \"Consent_Arg3\": \"เราไม่สามารถเข้าถึงบัญชีของคุณได้\",\r\n\r\n  \"Changelog_Title\": \"บันทึกการเปลี่ยนแปลง\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"วันครบกำหนด\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"วิชา\",\r\n  \"Tasks_Sorting_Methods_Done\": \"ยังไม่เสร็จ\",\r\n  \"Tasks_ThisWeek\": \"สัปดาห์นี้\",\r\n\r\n  \"Task_Undone\": \"ยังไม่เสร็จ\",\r\n  \"Task_Done\": \"เสร็จแล้ว\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"ปรับแต่งภาพพื้นหลัง\",\r\n  \"Modal_Profile_Title\": \"ปรับแต่งโปรไฟล์\",\r\n\r\n  \"Modal_Task_Status\": \"สถานะงาน\",\r\n  \"Modal_Task_Description\": \"คำอธิบายงาน\",\r\n  \"Modal_Task_Attachments\": \"ไฟล์แนบ\",\r\n\r\n  \"Today\": \"วันนี้\",\r\n  \"Yesterday\": \"เมื่อวาน\",\r\n  \"Tomorrow\": \"พรุ่งนี้\"\r\n}"
  },
  {
    "path": "locales/tr.json",
    "content": "{\r\n  \"Global_Back\": \"Geri\",\r\n  \"Global_DatePrefix\": \"O\",\r\n\r\n  \"Tab_Home\": \"Ana Sayfa\",\r\n  \"Tab_Calendar\": \"Dersler\",\r\n  \"Tab_Tasks\": \"Ödevler\",\r\n  \"Tab_Grades\": \"Notlar\",\r\n  \"Tab_Profile\": \"Profil\",\r\n  \"Tab_Custom_Profile\": \"Profilimi düzenle\",\r\n  \"Button_Change_ProfilePicture\": \"Profil fotoğrafını değiştir\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Fotoğraf çek\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Kütüphaneden seç\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Okul sisteminden (ENT) getir\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Fotoğrafı kaldır\",\r\n  \"Tab_Page\": \"Sayfa\",\r\n  \"Tab_Settings\": \"Ayarlar\",\r\n  \"Tab_News\": \"Haberler\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Okul hayatını yöneten uygulama\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Notlarına, derslerine, ödevlerine ve çok daha fazlasına Papillon arayüzünden erişmek için okul uygulamalarını bağla!\",\r\n  \"ONBOARDING_START_BTN\": \"Başla\",\r\n  \"ONBOARDING_HELP_BTN\": \"Yardım mı lazım?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Üniversite servisi\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Yemekhane servisi\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Okul servisini seç\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Yemekhane servisini seç\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Üniversite servisini seç\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Nasıl bağlanmak istersin?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Konumumu kullan\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Şehir ara\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"QR kodum var\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Bağlantı URL'im var\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Okulunu seç\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Şehrinin adını gir ve okulunu seç\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Alışık olduğun şekilde giriş yap\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Hesabına giriş yap\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Hesaba atanan sunucuyu seç\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"PRONOTE üzerinde oluşturduğun 4 haneli kodu gir\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Bağlanılıyor:\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Bağlanmak için okulunun QR kodunu tara.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR kod doğrulanıyor\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Bu işlem birkaç dakika sürebilir...\",\r\n  \"ONBOARDING_URL\": \"Okulunun URL adresini gir\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"PRONOTE sunucunun URL'si\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Bitirmeden önce\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Bir\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"tema rengi seç\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"PRONOTE PIN kodunu gir\",\r\n  \"Onboarding_Load_Webview_Description\": \"Okulunun web sitesi yükleniyor\",\r\n  \"INPUT_PIN\": \"PIN Kodu\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Sunucu ara...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Giriş yapılıyor...\",\r\n\r\n  \"WAITING\": \"Bekleniyor\",\r\n  \"IZLY_SMS_SEND\": \"Giriş yapmak için bir bağlantı aldın, üzerine tıkla ve adımları takip et.\",\r\n  \"STEP\": \"Adım\",\r\n  \"STEP_OUTOF\": \"/\",\r\n  \"INPUT_USERNAME\": \"Kullanıcı adı\",\r\n  \"INPUT_MAIL\": \"E-posta adresi\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"E-posta veya kullanıcı adı\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Telefon numarası veya e-posta\",\r\n  \"INPUT_PASSWORD\": \"Şifre\",\r\n  \"INPUT_PASSWORD_CODE\": \"Erişim kodu\",\r\n  \"INPUT_ETABID\": \"Okul kimlik numarası\",\r\n  \"LOGIN_BTN\": \"Giriş yap\",\r\n  \"CONFIRM_BTN\": \"Onayla\",\r\n  \"CANCEL_BTN\": \"İptal\",\r\n\r\n  \"Tab_New_Event\": \"Yeni etkinlik\",\r\n\r\n  \"Tab_Calendar_Icals\": \"iCal Yönetimi\",\r\n  \"Tab_Calendar_Icals_Description\": \"iCal URL'lerini yönet\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"iCal URL'si ekle\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"{{title}} Yönetimi\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Takviminle senkronize edilecek iCal URL'lerini ekle veya sil.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Başlık eksik\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Bu iCal URL'sini eklemek için bir isim ver.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Eklenmiş iCal URL'si yok\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Bu sekme yapım aşamasında.\",\r\n  \"TabUnderConstruction_Details\": \"Güncellemeler için daha sonra tekrar gel.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Geliştirici Modu\",\r\n  \"TabDevModeNotice_Details\": \"Geliştiriciler için tam test ortamı.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Teknik detaylar\",\r\n\r\n  \"Online_Course\": \"Çevrimiçi\",\r\n  \"Evaluated_Course\": \"Değerlendirme\",\r\n  \"Edited_Course\": \"Ders değiştirildi\",\r\n  \"Canceled_Course\": \"Ders iptal edildi\",\r\n  \"No_Course_Room\": \"Sınıf bilinmiyor\",\r\n  \"Event_DeleteEvent\": \"Etkinliği sil\",\r\n  \"Event_Confirm_DeleteEvent\": \"Bu etkinliği silmek istediğinden emin misin?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Öğle arası\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Afiyet olsun!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Nefis!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Sabah arası\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Uyku vakti!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Kahvaltı\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Öğleden sonra arası\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Mola zamanı!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Atıştırmalık saati!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Gece arası\",\r\n  \"Course_Separator_Night_Alt_1\": \"Uyku vakti!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Hava karardı!\",\r\n\r\n  \"Context_Delete\": \"Sil\",\r\n  \"Context_Cancel\": \"İptal\",\r\n  \"Context_Edit\": \"Düzenle\",\r\n  \"Context_Add\": \"Ekle\",\r\n\r\n  \"Form_Title\": \"Başlık\",\r\n  \"Form_Location\": \"Konum\",\r\n  \"Form_Organizer\": \"Düzenleyen\",\r\n  \"Form_Start\": \"Başlangıç\",\r\n  \"Form_End\": \"Bitiş\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Bu etkinliği silmek istediğinden emin misin?\",\r\n\r\n  \"Home_Welcome_Name\": \"Merhaba, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Daha fazla göster\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"mevcut\",\r\n  \"Home_Chats_Plurial\": \"mesaj\",\r\n  \"Home_Chats_Singular\": \"mesaj\",\r\n  \"Home_See_All_Tasks\": \"Tüm ödevleri gör\",\r\n  \"Home_Welcome\": \"Merhaba!\",\r\n  \"Home_Planned_None\": \"Bugün için kalan dersin yok\",\r\n  \"Home_Planned_One\": \"Bugün için kalan 1 dersin var\",\r\n  \"Home_Planned_Number\": \"Bugün için kalan {{number}} dersin var\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Sıradaki dersler\",\r\n  \"Home_Widget_NewGrades\": \"Yeni notlar\",\r\n  \"Home_Widget_NewHomeworks\": \"Yapılacak ödevler\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Gelecek ders yok\",\r\n  \"Home_Widget_NoCourses_Description\": \"Bugün için planlanmış ders bulunmuyor.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Kartlar\",\r\n  \"Home_Cards_Button_Description_None\": \"Kart yok\",\r\n  \"Home_Cards_Button_Description_Singular\": \"1 kart\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} kart\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Mesajlar\",\r\n  \"Home_Chats_Button_Description_None\": \"Mesaj yok\",\r\n  \"Home_Chats_Button_Description_Singular\": \"1 mesaj\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} mesaj\",\r\n\r\n  \"Home_Attendance_Title\": \"Devamsızlık\",\r\n  \"Home_Attendance_Button_Description_None\": \"Devamsızlık yok\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"1 devamsızlık\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} devamsızlık\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Menü\",\r\n  \"Home_Menu_Button_Description\": \"Günün menüsü\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Etkinlik bulunamadı\",\r\n  \"Tab_Calendar_Empty_Description\": \"Başlamak için bir etkinlik ekle veya takvimini senkronize et.\",\r\n\r\n  \"Modal_Course_Title\": \"Dersim\",\r\n  \"Modal_Course_StartsIn\": \"Başlamasına kalan süre\",\r\n  \"Modal_Course_StartedAgo\": \"Bitişinden beri\",\r\n  \"Modal_Course_Ongoing\": \"Başlangıcından beri\",\r\n  \"Modal_Course_Group\": \"Grup\",\r\n  \"Modal_Course_Group_Full\": \"Sınıf\",\r\n\r\n  \"Modal_Course_Details\": \"Ders detayları\",\r\n  \"Modal_Course_Teacher\": \"Öğretmen\",\r\n  \"Modal_Course_Room\": \"Sınıf / Oda\",\r\n  \"Modal_Course_Duration\": \"Süre\",\r\n\r\n  \"Modal_Course_Time\": \"Ders saatleri\",\r\n  \"Modal_Course_Start\": \"Başlangıç\",\r\n  \"Modal_Course_End\": \"Bitiş\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Ödev ara\",\r\n  \"Tasks_LeftHomeworks_Title\": \"kalan ödev\",\r\n  \"Tasks_LeftHomeworks_Time\": \"bu hafta\",\r\n  \"Tasks_Done_AllTasks\": \"Tüm ödevler\",\r\n  \"Tasks_Done_CompletedTasks\": \"tamamlandı\",\r\n  \"Tasks_Nav_Left\": \"Yapılacak {{count}} ödev daha var\",\r\n  \"Tasks_Nav_One\": \"Yapılacak sadece 1 ödev kaldı\",\r\n  \"Tasks_Nav_Completed\": \"Her şey bitti!\",\r\n  \"Tasks_Week\": \"Hafta\",\r\n  \"Tasks_NoTasks_Title\": \"Ödev yok\",\r\n  \"Tasks_NoTasks_Description\": \"Bu hafta için ödevin yok. Dinlenmenin tadını çıkar!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"{{week}}. hafta için\",\r\n  \"Tasks_NoTasks_Nav\": \"Ödev yok\",\r\n  \"Task_Start\": \"Yapılacak\",\r\n  \"Task_Complete\": \"Tamamlandı\",\r\n  \"Task_Sorting_Title\": \"Sırala\",\r\n  \"Task_OnlyShowUndone\": \"Tamamlanan ödevler\",\r\n  \"Task_Show_Title\": \"Göster\",\r\n  \"Settings_General\": \"Genel\",\r\n\r\n  \"Latest_Grades\": \"Yeni notlar\",\r\n  \"Grades_Search_Placeholder\": \"Bir not veya ders ara\",\r\n\r\n  \"Grades_Avg_Methods\": \"Hesaplama yöntemleri\",\r\n  \"Grades_Avg_All_Title\": \"Genel ortalama\",\r\n  \"Grades_Avg_All_Short\": \"Gen. ortalama\",\r\n  \"Grades_Avg_All_Pond\": \"Ağırlıklı ortalama\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Ağır. ortalama\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Tüm notların ağırlıklı ortalamasını hesaplar\",\r\n  \"Grades_Avg_Subject_Title\": \"Ders ortalaması\",\r\n  \"Grades_Avg_Subject_Short\": \"Ders ort.\",\r\n  \"Grades_Avg_Subject_Description\": \"Ders ortalamalarının ağırlıklı ortalamasını hesaplar\",\r\n  \"Grades_Avg_Median_Title\": \"Medyan\",\r\n  \"Grades_Avg_Median_Short\": \"Medyan\",\r\n\r\n  \"Grades_Avg_More\": \"Daha fazla bilgi\",\r\n  \"Grades_Avg_KnowMore\": \"Daha fazla bilgi\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Genel ortalama hesaplama yöntemlerini anla\",\r\n\r\n  \"Grades_SubjectInfo\": \"Ders bilgileri\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} not\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Öğrenci ortalaması\",\r\n  \"SubjectInfo_Stats_Header\": \"İstatistikler\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Sınıf ortalaması\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Sınıfın genel ortalaması\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"En yüksek ortalama\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Grubun en iyi ortalaması\",\r\n  \"SubjectInfo_MinAverage_Label\": \"En düşük ortalama\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Grubun en düşük ortalaması\",\r\n\r\n  \"Grades_Semester\": \"Dönem\",\r\n  \"Grades_Trimester\": \"Trimester\",\r\n  \"Grades_OutPeriod\": \"Dönem dışı\",\r\n  \"Grades_Year\": \"Yıl\",\r\n  \"Grades_MockExamBac\": \"Deneme sınavı (Bac)\",\r\n  \"Grades_MockExamBrevet\": \"Deneme sınavı (Brevet)\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Tüm dersler\",\r\n  \"Grades_Method_Weighted\": \"Ağırlıklandırma\",\r\n\r\n  \"Grades_Sort\": \"Sırala\",\r\n  \"Grades_Sorting_Alphabetical\": \"Alfabetik\",\r\n  \"Grades_Sorting_Averages\": \"Ortalamalar\",\r\n  \"Grades_Sorting_Date\": \"Tarih\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Sıralama ölçütü\",\r\n  \"Grades_Menu_AverageBy\": \"Ortalama ölçütü\",\r\n  \"NoAverage\": \"Ortalama yok\",\r\n\r\n  \"Grades_Empty_Title\": \"Not yok\",\r\n  \"Grades_Empty_Description\": \"Bu dönem için henüz notun girilmemiş.\",\r\n\r\n  \"Grade_NoDescription\": \"{{subject}} ödevi\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Dersler\",\r\n  \"Grades_Tab_Latest\": \"Yeni notlar\",\r\n\r\n  \"Profile_Attendance_Title\": \"Devamsızlık\",\r\n  \"Profile_Attendance_Denominator_Single\": \"devamsızlık\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"devamsızlık\",\r\n\r\n  \"Profile_Discussions_Title\": \"Mesajlaşmalar\",\r\n  \"Profile_Discussions_Denominator_Single\": \"okunmamış\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"okunmamış\",\r\n\r\n  \"Profile_News_Title\": \"Haberler\",\r\n  \"Profile_News_Denominator_Single\": \"yeni\",\r\n  \"Profile_News_Denominator_Plural\": \"yeni\",\r\n  \"Profile_News_Open\": \"Aç\",\r\n  \"Profile_News_Loading_Title\": \"Haberler yükleniyor...\",\r\n  \"Profile_News_Author_Unknown\": \"Bilinmeyen yazar\",\r\n\r\n  \"Profile_Cards_Title\": \"QR Kod ve Kartlar\",\r\n\r\n  \"Modal_Grades_Title\": \"Not detayları\",\r\n  \"Modal_Grades_BestGrade\": \"Grubun en iyi notu\",\r\n\r\n  \"Grades_Details_Title\": \"Detaylar\",\r\n  \"Grades_NormalizedGrade_Title\": \"20 üzerinden not\",\r\n  \"Grades_NormalizedGrade_Description\": \"Notun 20'lik sisteme dönüştürülmüş değeri\",\r\n  \"Grades_HighestGrade_Title\": \"En yüksek not\",\r\n  \"Grades_HighestGrade_Description\": \"Grupta alınan en yüksek not\",\r\n  \"Grades_LowestGrade_Title\": \"En düşük not\",\r\n  \"Grades_LowestGrade_Description\": \"Grupta alınan en düşük not\",\r\n  \"Grades_Influence_Title\": \"Etki\",\r\n  \"Grades_Avg_Group_Title\": \"Grup ortalaması\",\r\n  \"Grades_Coefficient\": \"Katsayı\",\r\n  \"Grades_Avg_Group_Short\": \"Grup ort.\",\r\n  \"Grades_Tab_Rank\": \"Sıralama\",\r\n  \"Grades_Tab_Rank_Description\": \"Gruptaki konumun\",\r\n\r\n  \"News_Search_Placeholder\": \"Haber ara\",\r\n  \"News_Empty_Title\": \"Haber yok\",\r\n  \"News_Empty_Description\": \"Okulunda herhangi bir haber bulunamadı.\",\r\n  \"News_Search_NoResults\": \"Haber bulunamadı\",\r\n  \"News_Search_NoResults_Description\": \"Aramanızla eşleşen haber bulunamadı.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Yumuşak ve şık bir tema\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Okuma\",\r\n  \"News_Theme_Reading_Description\": \"Okuma için tasarlanmış bir tema\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Kaçırılan saatler\",\r\n  \"Attendance_Hours_Unjustified\": \"Özürsüz saatler\",\r\n  \"Attendance_Missing\": \"Devamsızlıklar\",\r\n  \"Attendance_Delays\": \"Gecikmeler\",\r\n  \"Attendance_NoReason\": \"Neden belirtilmemiş\",\r\n  \"Attendance_NoEvent_Title\": \"Olay yok\",\r\n  \"Attendance_NoEvent_Description\": \"Bu dönem için kaydedilmiş devamsızlık veya gecikme yok.\",\r\n\r\n  \"Settings_Account_Title\": \"Hesabım\",\r\n  \"Settings_Account_Description\": \"Hesabım\",\r\n  \"Settings_Services_Title\": \"Bağlı hesaplar\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Son kullanılan hesap\",\r\n  \"Settings_Notifications_Title\": \"Bildirimler\",\r\n  \"Settings_Notifications_Description\": \"Uyarılar, sıklık...\",\r\n  \"Settings_Subjects_Title\": \"Dersler\",\r\n  \"Settings_Subjects_Description\": \"İsim, renk, yazı tipi...\",\r\n  \"Settings_Personalization_Title\": \"Kişiselleştirme\",\r\n  \"Settings_Personalization_Description\": \"Temalar, renkler...\",\r\n  \"Settings_Cards_Title\": \"Kartlar\",\r\n  \"Settings_Cards_Description\": \"Yemekhane, erişim...\",\r\n  \"Settings_Accessibility_Title\": \"Erişilebilirlik\",\r\n  \"Settings_Accessibility_Description\": \"Görünüm, ses...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Akıllı özellikler\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Yapay Zeka özellikleri\",\r\n  \"Settings_MagicPlus_Enable\": \"Magic+'ı Aktifleştir\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Üretkenliğini artırmak için ödev organizasyonunu otomatik olarak optimize eder\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Tamamen yerel model; verilerin cihazın dışına çıkmaz\",\r\n  \"Settings_Donate_Title\": \"Bağış yap\",\r\n  \"Settings_Donate_Description\": \"Projeyi destekle\",\r\n  \"Settings_Telemetry_Title\": \"Telemetri ve Gizlilik\",\r\n  \"Settings_Telemetry_Description\": \"Toplanan verileri yönet\",\r\n  \"Settings_About_Title\": \"Hakkında\",\r\n  \"Settings_About_Description\": \"Versiyon\",\r\n  \"Settings_Logout_Title\": \"Çıkış yap\",\r\n  \"Settings_Logout_Description\": \"Bu hesabı Papillon'dan kaldır\",\r\n  \"Settings_Language_Title\": \"Dil\",\r\n  \"Settings_Language_Description\": \"Dili değiştir\",\r\n  \"Settings_Tabs_Title\": \"Sekmeler\",\r\n  \"Settings_Tabs_Description\": \"Menüden sekmeleri gizle\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Kişiselleştirme\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Temalar, dersler...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Dersleri kişiselleştir\",\r\n  \"Settings_Personalization_Accent\": \"Vurgu rengi\",\r\n  \"Settings_Personalization_Accent_Description\": \"Burada seçtiğin renk Papillon ana sayfasında uygulanacaktır.\",\r\n  \"Settings_Personalization_Theme\": \"Tema\",\r\n  \"Settings_Personalization_Icon_Title\": \"İkonu değiştir\",\r\n  \"Settings_Personalization_Icon_Description\": \"Uygulama ikonunu kişiselleştir\",\r\n  \"Settings_Personalization_Subject_Title\": \"Dersleri kişiselleştir\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Dersler\",\r\n  \"Settings_Personalization_Subject_Description\": \"İkonlar, renkler\",\r\n  \"Settings_About_Papillion_Behind\": \"Papillon'un arkasında\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon, %100 gönüllü öğrenciler tarafından sürdürülmektedir\",\r\n  \"Settings_About_Discord\": \"Discord sunucusu\",\r\n  \"Settings_About_Discord_Description\": \"Discord sunucusuna katıl\",\r\n  \"Settings_About_Crowdin\": \"Crowdin projesi\",\r\n  \"Settings_About_Crowdin_Description\": \"Papillon'u çevirmeye yardım et\",\r\n  \"Settings_About_Github\": \"GitHub projesi\",\r\n  \"Settings_About_Github_Description\": \"GitHub'da projeye katkıda bulun\",\r\n  \"Settings_About_Issue\": \"Hata bildir\",\r\n  \"Settings_About_Issue_Description\": \"Karşılaştığın bir hatayı raporla\",\r\n  \"Settings_About_Dependency_Version\": \"Bağımlılık versiyonları\",\r\n\r\n  \"Alert_No_Technical\": \"Teknik bilgi mevcut değil.\",\r\n  \"Alert_Auth_Error\": \"Kimlik doğrulama hatası\",\r\n  \"Alert_Auth_Bad_Creds\": \"Girdiğin bilgiler yanlış veya bir veli hesabıyla bağlanmaya çalışıyorsun. Veli hesapları henüz Papillon tarafından desteklenmiyor.\",\r\n  \"Alert_Not_Supported\": \"Desteklenmeyen sunucu\",\r\n  \"Alert_Security_Instance_HTTP\": \"Güvenlik nedenleriyle Papillon, HTTP protokolünü kullanan sunucuları kabul etmez. Güvenliği sağlamak için okul yöneticine sunucuyu güncellemesini önermeni tavsiye ederiz.\",\r\n  \"Alert_NoDemo\": \"Papillon demo sunucularla çalışmak üzere tasarlanmamıştır, lütfen başka bir sunucu kullan.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon bu PRONOTE sunucusundan bilgi alamıyor, sunucu hala geçerli mi?\",\r\n  \"Alert_No_Pos\": \"Konum alınamadı\",\r\n  \"Alert_Connexion_Fail\": \"Bağlantı başarısız\",\r\n\r\n  \"Feature_Limited\": \"Sınırlı özellikler\",\r\n  \"Feature_Soon\": \"Yakında geliyor!\",\r\n  \"Feature_Soon_Notification\": \"Bu özelliği gelecekteki bir güncellemede sunmak için çok çalışıyoruz.\",\r\n  \"Feature_Add_Card\": \"Gezinti çubuğundaki Profil sekmesinden yeni bir kart ekle\",\r\n\r\n  \"Webview_Wait\": \"Biraz sabır...\",\r\n\r\n  \"Profile_QRCards\": \"QR Kod ve Kartlar\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} kart\",\r\n  \"Profile_Cards_Loading_History\": \"İşlem geçmişi yükleniyor\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Bu biraz zaman alabilir...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Kartlar\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Yemekhane, erişim\",\r\n  \"Settings_Cards_Banner_Description\": \"Yemekhane ve ulaşım kartlarını ekle, Papillon üzerinden telefonunla her yerden eriş\",\r\n  \"Settings_Cards_None_Title\": \"Kart yok\",\r\n  \"Settings_Cards_Add_Button\": \"Ekle\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Yemekhane bakiyeni görmek, QR kodunu taratmak ve daha fazlası için bir kart ekle\",\r\n  \"Settings_Subjects_None_Title\": \"Ders yok\",\r\n  \"Settings_Subjects_None_Description\": \"Dersleri özelleştirmek için uygulamanın farklı sekmelerine göz at.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Sıfırla\",\r\n  \"Settings_Subjects_Reset_Message\": \"Tüm ders ayarlarını sıfırlamak istediğinden emin misin?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Sıfırla\",\r\n\r\n  \"Settings_Donator\": \"Bağışçılar\",\r\n  \"Settings_Donator_Description\": \"Bağışçı listesini gör\",\r\n  \"Settings_App_Version\": \"Uygulama versiyonu\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"QR kodunu okuyucuya doğru tut\",\r\n  \"Profile_Cards_No_Reservation\": \"Rezervasyon yok\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Görünüşe göre bugün rezervasyon yapamazsın.\",\r\n  \"Profile_Cards_History\": \"Geçmiş\",\r\n  \"Magic_Important\": \"Önemli olabilir\",\r\n\r\n  \"OnBoarding_Step\": \"Adım \",\r\n  \"OnBoarding_Step_Of\": \"/ \",\r\n\r\n  \"Consent_Advanced_Title\": \"Papillon'a yardım etmek istiyorum\",\r\n  \"Consent_Advanced_Description\": \"Kullanımın hakkında daha detaylı bilgi topluyoruz.\",\r\n  \"Consent_Required_Title\": \"Sadece temel bilgiler\",\r\n  \"Consent_Required_Description\": \"Özetle; birinin Papillon kullandığını, her şeyin yolunda gidip gitmediğini ve hangi servisi kullandığını bilmek.\",\r\n  \"Consent_None_Title\": \"Hiçbir şey\",\r\n  \"Consent_None_Description\": \"Varlığından haberimiz bile olmayacak.\",\r\n  \"Consent_Title\": \"Sen ve Papillon\",\r\n  \"Consent_Intro1\": \"Papillon'un büyümesine yardımcı olmak için bazı kullanım bilgilerini paylaşmayı seçebilirsin.\",\r\n  \"Consent_PrivacyPolicy\": \"Şüpheniz varsa gizlilik politikamıza göz atın\",\r\n  \"Consent_Refuse\": \"Reddet\",\r\n  \"Consent_Accept\": \"Kabul et\",\r\n  \"Consent_ChangeMind\": \"Uygulama ayarlarından istediğin zaman fikrini değiştirebilirsin.\",\r\n  \"Consent_Arg1\": \"Yalnızca uygulamayı geliştirmek için kullanılır\",\r\n  \"Consent_Arg2\": \"Anonimdir ve kimliğinle ilişkilendirilmez\",\r\n  \"Consent_Arg3\": \"Hesaplarına erişimimiz yoktur\",\r\n\r\n  \"Changelog_Title\": \"Güncelleme notları\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Teslim tarihi\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Dersler\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Tamamlanmamış\",\r\n  \"Tasks_ThisWeek\": \"Bu hafta\",\r\n\r\n  \"Task_Undone\": \"Tamamlanmamış\",\r\n  \"Task_Done\": \"Tamamlandı\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Duvar kağıdını kişiselleştir\",\r\n  \"Modal_Profile_Title\": \"Profili kişiselleştir\",\r\n\r\n  \"Modal_Task_Status\": \"Ödev durumu\",\r\n  \"Modal_Task_Description\": \"Ödev açıklaması\",\r\n  \"Modal_Task_Attachments\": \"Ekler\",\r\n\r\n  \"Today\": \"Bugün\",\r\n  \"Yesterday\": \"Dün\",\r\n  \"Tomorrow\": \"Yarın\"\r\n}"
  },
  {
    "path": "locales/uk.json",
    "content": "{\r\n  \"Global_Back\": \"Назад\",\r\n  \"Global_DatePrefix\": \" \",\r\n\r\n  \"Tab_Home\": \"Головна\",\r\n  \"Tab_Calendar\": \"Уроки\",\r\n  \"Tab_Tasks\": \"Завдання\",\r\n  \"Tab_Grades\": \"Оцінки\",\r\n  \"Tab_Profile\": \"Профіль\",\r\n  \"Tab_Custom_Profile\": \"Редагувати профіль\",\r\n  \"Button_Change_ProfilePicture\": \"Змінити фото профілю\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Зробити фото\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"З галереї\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Отримати зі шкільної системи\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Видалити фото\",\r\n  \"Tab_Page\": \"Сторінка\",\r\n  \"Tab_Settings\": \"Налаштування\",\r\n  \"Tab_News\": \"Новини\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Додаток для управління твоїм шкільним життям\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Підключи свої шкільні сервіси, щоб отримати доступ до оцінок, розкладу, завдань та багато іншого в інтерфейсі Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Почати\",\r\n  \"ONBOARDING_HELP_BTN\": \"Потрібна допомога?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Університетський сервіс\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Сервіс харчування\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Обери свій шкільний сервіс\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Обери свій сервіс харчування\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Обери свій університетський сервіс\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Як ти хочеш увійти?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Використати моє місцезнаходження\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Пошук за містом\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"У мене є QR-код\",\r\n  \"ONBOARDING_METHOD_LINK\": \"У мене є посилання для входу\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Обери свій заклад\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Введи назву міста та обери свій заклад\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Увійди як зазвичай\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Увійди у свій акаунт\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Обери хост, закріплений за акаунтом\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Введи 4-значний код, який ти щойно створив у PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Підключення до\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Відскануй QR-код свого закладу, щоб увійти.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Перевірка QR-коду\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Це може зайняти кілька секунд...\",\r\n  \"ONBOARDING_URL\": \"Вкажи URL-адресу свого закладу\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL твого інстансу PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Перед завершенням\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Обери\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"колір теми\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Введи PIN-код твого PRONOTE\",\r\n  \"Onboarding_Load_Webview_Description\": \"Ми завантажуємо сайт твого закладу\",\r\n  \"INPUT_PIN\": \"PIN-код\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Пошук інстансу...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Вхід у систему...\",\r\n\r\n  \"WAITING\": \"Очікування\",\r\n  \"IZLY_SMS_SEND\": \"Ти щойно отримав посилання для входу, натисни на нього та виконай кроки.\",\r\n  \"STEP\": \"Крок\",\r\n  \"STEP_OUTOF\": \"із\",\r\n  \"INPUT_USERNAME\": \"Ім'я користувача\",\r\n  \"INPUT_MAIL\": \"Електронна пошта\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Електронна пошта або ім'я користувача\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Номер телефону або електронна пошта\",\r\n  \"INPUT_PASSWORD\": \"Пароль\",\r\n  \"INPUT_PASSWORD_CODE\": \"Код доступу\",\r\n  \"INPUT_ETABID\": \"Ідентифікатор твого закладу\",\r\n  \"LOGIN_BTN\": \"Увійти\",\r\n  \"CONFIRM_BTN\": \"Підтвердити\",\r\n  \"CANCEL_BTN\": \"Скасувати\",\r\n\r\n  \"Tab_New_Event\": \"Нова подія\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Управління iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Керування твоїми URL iCal\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Додати URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Керувати {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Додати або видалити URL iCal для синхронізації з твоїм календарем.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Відсутня назва\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Дай назву цьому URL iCal, щоб додати його.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Не додано жодного URL iCal\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Ця вкладка ще в розробці.\",\r\n  \"TabUnderConstruction_Details\": \"Зазирни сюди пізніше за оновленнями.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Режим розробника\",\r\n  \"TabDevModeNotice_Details\": \"Повне тестове середовище для розробників.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Технічні деталі\",\r\n\r\n  \"Online_Course\": \"Онлайн\",\r\n  \"Evaluated_Course\": \"Оцінювання\",\r\n  \"Edited_Course\": \"Урок змінено\",\r\n  \"Canceled_Course\": \"Урок скасовано\",\r\n  \"No_Course_Room\": \"Кабінет невідомий\",\r\n  \"Event_DeleteEvent\": \"Видалити подію\",\r\n  \"Event_Confirm_DeleteEvent\": \"Ти впевнений, що хочеш видалити цю подію?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Обідня перерва\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Смачного!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Ням-ням!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Ранкова перерва\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Час подрімати!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Сніданок\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Денна перерва\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Потрібна перерва!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Час підкріпитися!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Вечірня перерва\",\r\n  \"Course_Separator_Night_Alt_1\": \"Час подрімати!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Вже ніч!\",\r\n\r\n  \"Context_Delete\": \"Видалити\",\r\n  \"Context_Cancel\": \"Скасувати\",\r\n  \"Context_Edit\": \"Редагувати\",\r\n  \"Context_Add\": \"Додати\",\r\n\r\n  \"Form_Title\": \"Заголовок\",\r\n  \"Form_Location\": \"Місце\",\r\n  \"Form_Organizer\": \"Організатор\",\r\n  \"Form_Start\": \"Початок\",\r\n  \"Form_End\": \"Кінець\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Ти впевнений, що хочеш видалити цю подію?\",\r\n\r\n  \"Home_Welcome_Name\": \"Привіт, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Показати більше\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"доступно\",\r\n  \"Home_Chats_Plurial\": \"діалогів\",\r\n  \"Home_Chats_Singular\": \"діалог\",\r\n  \"Home_See_All_Tasks\": \"Усі завдання\",\r\n  \"Home_Welcome\": \"Вітаю!\",\r\n  \"Home_Planned_None\": \"На сьогодні уроків більше немає\",\r\n  \"Home_Planned_One\": \"Сьогодні залишився один урок\",\r\n  \"Home_Planned_Number\": \"Сьогодні залишилося {{number}} уроків\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Наступні уроки\",\r\n  \"Home_Widget_NewGrades\": \"Нові оцінки\",\r\n  \"Home_Widget_NewHomeworks\": \"Треба зробити\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Немає найближчих уроків\",\r\n  \"Home_Widget_NoCourses_Description\": \"На сьогодні уроків не заплановано.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Картки\",\r\n  \"Home_Cards_Button_Description_None\": \"Немає карток\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Одна картка\",\r\n  \"Home_Cards_Button_Description_Number\": \"Карток: {{number}}\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Повідомлення\",\r\n  \"Home_Chats_Button_Description_None\": \"Немає повідомлень\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Одне повідомлення\",\r\n  \"Home_Chats_Button_Description_Number\": \"Повідомлень: {{number}}\",\r\n\r\n  \"Home_Attendance_Title\": \"Відвідуваність\",\r\n  \"Home_Attendance_Button_Description_None\": \"Немає пропусків\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Один пропуск\",\r\n  \"Home_Attendance_Button_Description_Number\": \"Пропусків: {{number}}\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Меню\",\r\n  \"Home_Menu_Button_Description\": \"Меню на сьогодні\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Подій не знайдено\",\r\n  \"Tab_Calendar_Empty_Description\": \"Додай подію або синхронізуй календар, щоб почати.\",\r\n\r\n  \"Modal_Course_Title\": \"Мій урок\",\r\n  \"Modal_Course_StartsIn\": \"Почнеться через\",\r\n  \"Modal_Course_StartedAgo\": \"Завершився\",\r\n  \"Modal_Course_Ongoing\": \"Триває вже\",\r\n  \"Modal_Course_Group\": \"Група\",\r\n  \"Modal_Course_Group_Full\": \"Клас\",\r\n\r\n  \"Modal_Course_Details\": \"Деталі уроку\",\r\n  \"Modal_Course_Teacher\": \"Вчитель\",\r\n  \"Modal_Course_Room\": \"Кабінет\",\r\n  \"Modal_Course_Duration\": \"Тривалість\",\r\n\r\n  \"Modal_Course_Time\": \"Розклад уроку\",\r\n  \"Modal_Course_Start\": \"Початок\",\r\n  \"Modal_Course_End\": \"Кінець\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Пошук завдань\",\r\n  \"Tasks_LeftHomeworks_Title\": \"завдань залишилося\",\r\n  \"Tasks_LeftHomeworks_Time\": \"цього тижня\",\r\n  \"Tasks_Done_AllTasks\": \"Усі завдання\",\r\n  \"Tasks_Done_CompletedTasks\": \"було виконано\",\r\n  \"Tasks_Nav_Left\": \"Залишилося {{count}} завд.\",\r\n  \"Tasks_Nav_One\": \"Залишилося лише одне завдання\",\r\n  \"Tasks_Nav_Completed\": \"Все виконано!\",\r\n  \"Tasks_Week\": \"Тиждень\",\r\n  \"Tasks_NoTasks_Title\": \"Завдань немає\",\r\n  \"Tasks_NoTasks_Description\": \"На цей тиждень завдань немає. Відпочивай!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"на тиждень {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Завдань немає\",\r\n  \"Task_Start\": \"Зробити\",\r\n  \"Task_Complete\": \"Виконано\",\r\n  \"Task_Sorting_Title\": \"Сортувати за\",\r\n  \"Task_OnlyShowUndone\": \"Виконані завдання\",\r\n  \"Task_Show_Title\": \"Показати\",\r\n  \"Settings_General\": \"Загальні\",\r\n\r\n  \"Latest_Grades\": \"Нові оцінки\",\r\n  \"Grades_Search_Placeholder\": \"Пошук оцінки або предмета\",\r\n\r\n  \"Grades_Avg_Methods\": \"Методи розрахунку\",\r\n  \"Grades_Avg_All_Title\": \"Загальний середній бал\",\r\n  \"Grades_Avg_All_Short\": \"Сер. бал\",\r\n  \"Grades_Avg_All_Pond\": \"Зважений середній бал\",\r\n  \"Grades_Avg_All_Pond_Short\": \"Зваж. сер. бал\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Розраховує зважений середній бал усіх оцінок\",\r\n  \"Grades_Avg_Subject_Title\": \"Середній бал по предметах\",\r\n  \"Grades_Avg_Subject_Short\": \"Сер. за предм.\",\r\n  \"Grades_Avg_Subject_Description\": \"Розраховує середнє значення середніх балів по предметах\",\r\n  \"Grades_Avg_Median_Title\": \"Медіана\",\r\n  \"Grades_Avg_Median_Short\": \"Медіана\",\r\n\r\n  \"Grades_Avg_More\": \"Дізнатися більше\",\r\n  \"Grades_Avg_KnowMore\": \"Дізнатися більше\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Як розраховується загальний середній бал\",\r\n\r\n  \"Grades_SubjectInfo\": \"Інформація про предмет\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"Оцінок: {{number}}\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Середній бал учня\",\r\n  \"SubjectInfo_Stats_Header\": \"Статистика\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Середній бал класу\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Загальний середній бал класу\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Максимальний бал\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Найкращий бал у групі\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Мінімальний бал\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Найнижчий бал у групі\",\r\n\r\n  \"Grades_Semester\": \"Семестр\",\r\n  \"Grades_Trimester\": \"Триместр\",\r\n  \"Grades_OutPeriod\": \"Поза періодом\",\r\n  \"Grades_Year\": \"Рік\",\r\n  \"Grades_MockExamBac\": \"Пробний іспит (Bac)\",\r\n  \"Grades_MockExamBrevet\": \"Пробний іспит (Brevet)\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Усі предмети\",\r\n  \"Grades_Method_Weighted\": \"Коефіцієнт (Вага)\",\r\n\r\n  \"Grades_Sort\": \"Сортувати\",\r\n  \"Grades_Sorting_Alphabetical\": \"За алфавітом\",\r\n  \"Grades_Sorting_Averages\": \"За балом\",\r\n  \"Grades_Sorting_Date\": \"За датою\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Сортування за\",\r\n  \"Grades_Menu_AverageBy\": \"Середнє за\",\r\n  \"NoAverage\": \"Немає середнього бала\",\r\n\r\n  \"Grades_Empty_Title\": \"Немає оцінок\",\r\n  \"Grades_Empty_Description\": \"У тебе ще немає оцінок за цей період.\",\r\n\r\n  \"Grade_NoDescription\": \"Завдання з предмета {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Предмети\",\r\n  \"Grades_Tab_Latest\": \"Нові оцінки\",\r\n\r\n  \"Profile_Attendance_Title\": \"Відвідуваність\",\r\n  \"Profile_Attendance_Denominator_Single\": \"пропуск\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"пропуски/ів\",\r\n\r\n  \"Profile_Discussions_Title\": \"Обговорення\",\r\n  \"Profile_Discussions_Denominator_Single\": \"непрочитане\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"непрочитаних\",\r\n\r\n  \"Profile_News_Title\": \"Новини\",\r\n  \"Profile_News_Denominator_Single\": \"нова\",\r\n  \"Profile_News_Denominator_Plural\": \"нових\",\r\n  \"Profile_News_Open\": \"Відкрити\",\r\n  \"Profile_News_Loading_Title\": \"Завантаження новин...\",\r\n  \"Profile_News_Author_Unknown\": \"Автор невідомий\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-код та картки\",\r\n\r\n  \"Modal_Grades_Title\": \"Деталі оцінки\",\r\n  \"Modal_Grades_BestGrade\": \"Найкраща оцінка в групі\",\r\n\r\n  \"Grades_Details_Title\": \"Деталі\",\r\n  \"Grades_NormalizedGrade_Title\": \"Оцінка за 20-бальною шкалою\",\r\n  \"Grades_NormalizedGrade_Description\": \"Значення оцінки, приведене до шкали 20\",\r\n  \"Grades_HighestGrade_Title\": \"Найвища оцінка\",\r\n  \"Grades_HighestGrade_Description\": \"Максимальна оцінка в групі\",\r\n  \"Grades_LowestGrade_Title\": \"Найнижча оцінка\",\r\n  \"Grades_LowestGrade_Description\": \"Мінімальна оцінка в групі\",\r\n  \"Grades_Influence_Title\": \"Вплив\",\r\n  \"Grades_Avg_Group_Title\": \"Середній бал групи\",\r\n  \"Grades_Coefficient\": \"Коефіцієнт\",\r\n  \"Grades_Avg_Group_Short\": \"Сер. групи\",\r\n  \"Grades_Tab_Rank\": \"Рейтинг\",\r\n  \"Grades_Tab_Rank_Description\": \"Місце в групі\",\r\n\r\n  \"News_Search_Placeholder\": \"Пошук новини\",\r\n  \"News_Empty_Title\": \"Новин немає\",\r\n  \"News_Empty_Description\": \"У твоєму закладі новин не знайдено.\",\r\n  \"News_Search_NoResults\": \"Новин не знайдено\",\r\n  \"News_Search_NoResults_Description\": \"За твоїм запитом нічого не знайдено.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"М'яка та елегантна тема\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Читання\",\r\n  \"News_Theme_Reading_Description\": \"Тема, створена для читання\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Пропущено годин\",\r\n  \"Attendance_Hours_Unjustified\": \"Неповажних годин\",\r\n  \"Attendance_Missing\": \"Пропуски\",\r\n  \"Attendance_Delays\": \"Запізнення\",\r\n  \"Attendance_NoReason\": \"Без причини\",\r\n  \"Attendance_NoEvent_Title\": \"Немає подій\",\r\n  \"Attendance_NoEvent_Description\": \"За цей період пропусків або запізнень не зафіксовано.\",\r\n\r\n  \"Settings_Account_Title\": \"Мій акаунт\",\r\n  \"Settings_Account_Description\": \"Мій акаунт\",\r\n  \"Settings_Services_Title\": \"Підключені сервіси\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Останній акаунт\",\r\n  \"Settings_Notifications_Title\": \"Сповіщення\",\r\n  \"Settings_Notifications_Description\": \"Попередження, частота...\",\r\n  \"Settings_Subjects_Title\": \"Предмети\",\r\n  \"Settings_Subjects_Description\": \"Назва, колір, шрифт...\",\r\n  \"Settings_Personalization_Title\": \"Персоналізація\",\r\n  \"Settings_Personalization_Description\": \"Теми, кольори...\",\r\n  \"Settings_Cards_Title\": \"Картки\",\r\n  \"Settings_Cards_Description\": \"Їдальня, доступ...\",\r\n  \"Settings_Accessibility_Title\": \"Доступність\",\r\n  \"Settings_Accessibility_Description\": \"Екран, звук...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Розумні функції\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Функції ШІ\",\r\n  \"Settings_MagicPlus_Enable\": \"Увімкнути Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Автоматично оптимізує список завдань для підвищення продуктивності\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Повністю локальна модель, дані не виходять за межі пристрою\",\r\n  \"Settings_Donate_Title\": \"Підтримати проєкт\",\r\n  \"Settings_Donate_Description\": \"Зробити внесок\",\r\n  \"Settings_Telemetry_Title\": \"Телеметрія та приватність\",\r\n  \"Settings_Telemetry_Description\": \"Керування збором даних\",\r\n  \"Settings_About_Title\": \"Про додаток\",\r\n  \"Settings_About_Description\": \"Версія\",\r\n  \"Settings_Logout_Title\": \"Вийти\",\r\n  \"Settings_Logout_Description\": \"Видалити цей акаунт із Papillon\",\r\n  \"Settings_Language_Title\": \"Мова\",\r\n  \"Settings_Language_Description\": \"Змінити мову\",\r\n  \"Settings_Tabs_Title\": \"Вкладки\",\r\n  \"Settings_Tabs_Description\": \"Приховати вкладки меню\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Персоналізація\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Теми, предмети...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Налаштувати предмети\",\r\n  \"Settings_Personalization_Accent\": \"Акцентний колір\",\r\n  \"Settings_Personalization_Accent_Description\": \"Цей колір буде використано на головній сторінці Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Тема\",\r\n  \"Settings_Personalization_Icon_Title\": \"Змінити іконку\",\r\n  \"Settings_Personalization_Icon_Description\": \"Налаштувати іконку додатка\",\r\n  \"Settings_Personalization_Subject_Title\": \"Налаштувати предмети\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Предмети\",\r\n  \"Settings_Personalization_Subject_Description\": \"Іконки, кольори\",\r\n  \"Settings_About_Papillion_Behind\": \"Хто створив Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon підтримується студентами-волонтерами\",\r\n  \"Settings_About_Discord\": \"Сервер Discord\",\r\n  \"Settings_About_Discord_Description\": \"Приєднатися до Discord\",\r\n  \"Settings_About_Crowdin\": \"Проєкт Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Допомогти з перекладом\",\r\n  \"Settings_About_Github\": \"Проєкт GitHub\",\r\n  \"Settings_About_Github_Description\": \"Зробити внесок на GitHub\",\r\n  \"Settings_About_Issue\": \"Повідомити про помилку\",\r\n  \"Settings_About_Issue_Description\": \"Повідомити про знайдений баг\",\r\n  \"Settings_About_Dependency_Version\": \"Версія залежностей\",\r\n\r\n  \"Alert_No_Technical\": \"Технічна інформація відсутня.\",\r\n  \"Alert_Auth_Error\": \"Помилка автентифікації\",\r\n  \"Alert_Auth_Bad_Creds\": \"Введені дані невірні або ти намагаєшся увійти через батьківський акаунт. Наразі Papillon не підтримує цей тип акаунтів.\",\r\n  \"Alert_Not_Supported\": \"Інстанс не підтримується\",\r\n  \"Alert_Security_Instance_HTTP\": \"З міркувань безпеки Papillon не працює з інстансами, що використовують протокол HTTP. Радимо повідомити адміністрацію закладу про необхідність оновлення.\",\r\n  \"Alert_NoDemo\": \"Papillon не призначений для роботи з демо-версіями, будь ласка, використовуй реальний інстанс.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon не може отримати дані від цього інстансу PRONOTE. Чи він ще працює?\",\r\n  \"Alert_No_Pos\": \"Не вдалося визначити місцезнаходження\",\r\n  \"Alert_Connexion_Fail\": \"Помилка підключення\",\r\n\r\n  \"Feature_Limited\": \"Обмежені функції\",\r\n  \"Feature_Soon\": \"Скоро з'явиться!\",\r\n  \"Feature_Soon_Notification\": \"Ми працюємо над тим, щоб додати цю функцію в майбутніх оновленнях.\",\r\n  \"Feature_Add_Card\": \"Додай нову картку у вкладці Профіль\",\r\n\r\n  \"Webview_Wait\": \"Трішки терпіння...\",\r\n\r\n  \"Profile_QRCards\": \"QR-код та картки\",\r\n  \"Profile_QRCards_Subtitle\": \"Карток: {{count}}\",\r\n  \"Profile_Cards_Loading_History\": \"Завантаження історії транзакцій\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Це може зайняти деякий час...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Картки\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Їдальня, доступ\",\r\n  \"Settings_Cards_Banner_Description\": \"Додай свої картки їдальні або транспорту, щоб вони завжди були під рукою в Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Немає карток\",\r\n  \"Settings_Cards_Add_Button\": \"Додати\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Додай картку, щоб перевіряти баланс їдальні, сканувати QR-код та інше\",\r\n  \"Settings_Subjects_None_Title\": \"Немає предметів\",\r\n  \"Settings_Subjects_None_Description\": \"Переглянь вкладки додатка, щоб налаштувати предмети.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Скинути\",\r\n  \"Settings_Subjects_Reset_Message\": \"Ти справді хочеш скинути налаштування всіх предметів?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Скинути\",\r\n\r\n  \"Settings_Donator\": \"Донатори\",\r\n  \"Settings_Donator_Description\": \"Список тих, хто підтримав проєкт\",\r\n  \"Settings_App_Version\": \"Версія додатка\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Направ QR-код на сканер термінала\",\r\n  \"Profile_Cards_No_Reservation\": \"Немає бронювань\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Схоже, на цей день бронювання неможливе.\",\r\n  \"Profile_Cards_History\": \"Історія\",\r\n  \"Magic_Important\": \"Можливо, це важливо\",\r\n\r\n  \"OnBoarding_Step\": \"Крок \",\r\n  \"OnBoarding_Step_Of\": \" із \",\r\n\r\n  \"Consent_Advanced_Title\": \"Я хочу допомогти Papillon\",\r\n  \"Consent_Advanced_Description\": \"Ми збираємо детальну інформацію про те, як ти користуєшся додатком.\",\r\n  \"Consent_Required_Title\": \"Тільки найважливіше\",\r\n  \"Consent_Required_Description\": \"Коротко: знати, що хтось користується Papillon, чи все працює та який сервіс обрано.\",\r\n  \"Consent_None_Title\": \"Нічого не надсилати\",\r\n  \"Consent_None_Description\": \"Ми навіть не будемо знати про твоє існування.\",\r\n  \"Consent_Title\": \"Ти і Papillon\",\r\n  \"Consent_Intro1\": \"Щоб допомогти Papillon рости, ти можеш ділитися даними про використання.\",\r\n  \"Consent_PrivacyPolicy\": \"Якщо є сумніви, ознайомся з нашою політикою конфіденційності\",\r\n  \"Consent_Refuse\": \"Відхилити\",\r\n  \"Consent_Accept\": \"Прийняти\",\r\n  \"Consent_ChangeMind\": \"Ти можеш змінити рішення в будь-який момент у налаштуваннях.\",\r\n  \"Consent_Arg1\": \"Використовується тільки для покращення додатка\",\r\n  \"Consent_Arg2\": \"Анонімно та не пов'язано з твоєю особистістю\",\r\n  \"Consent_Arg3\": \"Ми не маємо доступу до твоїх акаунтів\",\r\n\r\n  \"Changelog_Title\": \"Що нового\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Дата здачі\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Предмети\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Не виконано\",\r\n  \"Tasks_ThisWeek\": \"Цього тижня\",\r\n\r\n  \"Task_Undone\": \"Не виконано\",\r\n  \"Task_Done\": \"Виконано\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Налаштувати шпалери\",\r\n  \"Modal_Profile_Title\": \"Налаштувати профіль\",\r\n\r\n  \"Modal_Task_Status\": \"Статус завдання\",\r\n  \"Modal_Task_Description\": \"Опис завдання\",\r\n  \"Modal_Task_Attachments\": \"Вкладення\",\r\n\r\n  \"Today\": \"Сьогодні\",\r\n  \"Yesterday\": \"Вчора\",\r\n  \"Tomorrow\": \"Завтра\"\r\n}"
  },
  {
    "path": "locales/ur.json",
    "content": "{\r\n  \"Global_Back\": \"واپسی\",\r\n  \"Global_DatePrefix\": \"کو\",\r\n\r\n  \"Tab_Home\": \"ہوم\",\r\n  \"Tab_Calendar\": \"کورسز\",\r\n  \"Tab_Tasks\": \"کام\",\r\n  \"Tab_Grades\": \"نمبر\",\r\n  \"Tab_Profile\": \"پروفائل\",\r\n  \"Tab_Custom_Profile\": \"میری پروفائل میں ترمیم کریں\",\r\n  \"Button_Change_ProfilePicture\": \"پروفائل تصویر تبدیل کریں\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"تصویر کھینچیں\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"لائبریری سے\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"اپنے اسکول سسٹم سے حاصل کریں\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"تصویر ہٹائیں\",\r\n  \"Tab_Page\": \"صفحہ\",\r\n  \"Tab_Settings\": \"ترتیبات\",\r\n  \"Tab_News\": \"خبریں\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"آپ کی اسکولی زندگی کو سنبھالنے والی ایپ\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"اپنے گریڈز، کورسز، ہوم ورک اور بہت کچھ دیکھنے کے لیے اپنی اسکولی ایپس کو پیپیلون (Papillon) سے جوڑیں!\",\r\n  \"ONBOARDING_START_BTN\": \"شروع کریں\",\r\n  \"ONBOARDING_HELP_BTN\": \"مدد چاہیے؟\",\r\n  \"ONBOARDING_UNIVERSITY\": \"یونیورسٹی سروس\",\r\n  \"ONBOARDING_RESTAURANTS\": \"کینٹین سروس\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"اپنی اسکول سروس منتخب کریں\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"اپنی کینٹین سروس منتخب کریں\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"اپنی یونیورسٹی سروس منتخب کریں\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"آپ کیسے لاگ ان کرنا چاہتے ہیں؟\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"میری لوکیشن استعمال کریں\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"شہر تلاش کریں\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"میرے پاس QR-Code ہے\",\r\n  \"ONBOARDING_METHOD_LINK\": \"میرے پاس لاگ ان URL ہے\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"اپنا تعلیمی ادارہ منتخب کریں\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"اپنے شہر کا نام لکھیں اور اسکول منتخب کریں\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"عام طریقے سے لاگ ان کریں\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"اپنے اکاؤنٹ میں لاگ ان کریں\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"اکاؤنٹ کے لیے ہوسٹ منتخب کریں\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"وہ 4 ہندسوں کا کوڈ درج کریں جو آپ نے ابھی PRONOTE پر بنایا ہے\",\r\n  \"ONBOARDING_LOGIN_TO\": \"لاگ ان ہو رہا ہے:\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"منسلک ہونے کے لیے اپنے اسکول کا QR-Code اسکین کریں۔\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"QR-Code کی تصدیق کی جا رہی ہے\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"اس میں کچھ لمحات لگ سکتے ہیں...\",\r\n  \"ONBOARDING_URL\": \"اپنے اسکول کا URL درج کریں\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"آپ کے PRONOTE سرور کا URL\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"ختم کرنے سے پہلے\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"تھیم کا ایک\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"رنگ منتخب کریں\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"اپنے PRONOTE کا PIN کوڈ درج کریں\",\r\n  \"Onboarding_Load_Webview_Description\": \"ہم آپ کے اسکول کی ویب سائٹ لوڈ کر رہے ہیں\",\r\n  \"INPUT_PIN\": \"PIN کوڈ\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"سرور تلاش کریں...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"لاگ ان ہو رہا ہے...\",\r\n\r\n  \"WAITING\": \"انتظار کریں\",\r\n  \"IZLY_SMS_SEND\": \"آپ کو ابھی لاگ ان کا لنک ملا ہے، اس پر کلک کریں اور مراحل پر عمل کریں۔\",\r\n  \"STEP\": \"مرحلہ\",\r\n  \"STEP_OUTOF\": \"میں سے\",\r\n  \"INPUT_USERNAME\": \"صارف کا نام (Username)\",\r\n  \"INPUT_MAIL\": \"ای میل ایڈریس\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"ای میل یا صارف کا نام\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"فون نمبر یا ای میل\",\r\n  \"INPUT_PASSWORD\": \"پاس ورڈ\",\r\n  \"INPUT_PASSWORD_CODE\": \"رسائی کوڈ\",\r\n  \"INPUT_ETABID\": \"آپ کے اسکول کی ID\",\r\n  \"LOGIN_BTN\": \"لاگ ان\",\r\n  \"CONFIRM_BTN\": \"تصدیق کریں\",\r\n  \"CANCEL_BTN\": \"منسوخ کریں\",\r\n\r\n  \"Tab_New_Event\": \"نیا ایونٹ\",\r\n\r\n  \"Tab_Calendar_Icals\": \"iCal کا انتظام\",\r\n  \"Tab_Calendar_Icals_Description\": \"اپنے iCal لنکس کا انتظام کریں\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"نیا iCal URL شامل کریں\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"{{title}} کا انتظام\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"کیلنڈر کے ساتھ سنک کرنے کے لیے iCal لنکس شامل کریں یا حذف کریں۔\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"عنوان غائب ہے\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"شامل کرنے کے لیے اس iCal لنک کو ایک نام دیں۔\",\r\n  \"Tab_Calendar_Icals_Empty\": \"کوئی iCal لنک شامل نہیں کیا گیا\",\r\n\r\n  \"TabUnderConstruction_Title\": \"یہ ٹیب ابھی زیرِ تعمیر ہے۔\",\r\n  \"TabUnderConstruction_Details\": \"اپ ڈیٹس کے لیے بعد میں دوبارہ دیکھیں۔\",\r\n\r\n  \"TabDevModeNotice_Title\": \"ڈیولپر موڈ\",\r\n  \"TabDevModeNotice_Details\": \"ڈیولپرز کے لیے مکمل ٹیسٹنگ ماحول۔\",\r\n\r\n  \"Alert_TechnicalDetails\": \"تکنیکی تفصیلات\",\r\n\r\n  \"Online_Course\": \"آن لائن\",\r\n  \"Evaluated_Course\": \"ٹیسٹ / امتحان\",\r\n  \"Edited_Course\": \"تبدیل شدہ کلاس\",\r\n  \"Canceled_Course\": \"منسوخ شدہ کلاس\",\r\n  \"No_Course_Room\": \"کمرہ نامعلوم\",\r\n  \"Event_DeleteEvent\": \"ایونٹ حذف کریں\",\r\n  \"Event_Confirm_DeleteEvent\": \"کیا آپ واقعی اس ایونٹ کو حذف کرنا چاہتے ہیں؟\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"دوپہر کا وقفہ\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"کھانا مبارک ہو!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"مزیدار!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"صبح کا وقفہ\",\r\n  \"Course_Separator_Morning_Alt_1\": \"سونے کا وقت!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"ناشتہ\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"سہ پہر کا وقفہ\",\r\n  \"Course_Separator_Evening_Alt_1\": \"بریک تو بنتا ہے!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"چائے کا وقت!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"رات کا وقفہ\",\r\n  \"Course_Separator_Night_Alt_1\": \"سونے کا وقت!\",\r\n  \"Course_Separator_Night_Alt_2\": \"رات ہو گئی ہے!\",\r\n\r\n  \"Context_Delete\": \"حذف کریں\",\r\n  \"Context_Cancel\": \"منسوخ کریں\",\r\n  \"Context_Edit\": \"ترمیم کریں\",\r\n  \"Context_Add\": \"شامل کریں\",\r\n\r\n  \"Form_Title\": \"عنوان\",\r\n  \"Form_Location\": \"مقام\",\r\n  \"Form_Organizer\": \"منتظم\",\r\n  \"Form_Start\": \"آغاز\",\r\n  \"Form_End\": \"اختتام\",\r\n\r\n  \"Confirm_DeleteEvent\": \"کیا آپ واقعی اس ایونٹ کو حذف کرنا چاہتے ہیں؟\",\r\n\r\n  \"Home_Welcome_Name\": \"ہیلو، {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"مزید دکھائیں\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"دستیاب\",\r\n  \"Home_Chats_Plurial\": \"گفتگو\",\r\n  \"Home_Chats_Singular\": \"گفتگو\",\r\n  \"Home_See_All_Tasks\": \"تمام کام دیکھیں\",\r\n  \"Home_Welcome\": \"خوش آمدید!\",\r\n  \"Home_Planned_None\": \"آج آپ کی مزید کوئی کلاس نہیں ہے\",\r\n  \"Home_Planned_One\": \"آج آپ کی ایک کلاس باقی ہے\",\r\n  \"Home_Planned_Number\": \"آج آپ کی مزید {{number}} کلاسز باقی ہیں\",\r\n\r\n  \"Home_Widget_NextCourses\": \"اگلی کلاسز\",\r\n  \"Home_Widget_NewGrades\": \"نئے نمبر\",\r\n  \"Home_Widget_NewHomeworks\": \"کرنے والے کام\",\r\n\r\n  \"Home_Widget_NoCourses\": \"کوئی آنے والی کلاس نہیں\",\r\n  \"Home_Widget_NoCourses_Description\": \"آج کے لیے کوئی کلاس مقرر نہیں ہے۔\",\r\n\r\n  \"Home_Cards_Button_Title\": \"کارڈز\",\r\n  \"Home_Cards_Button_Description_None\": \"کوئی کارڈ نہیں\",\r\n  \"Home_Cards_Button_Description_Singular\": \"ایک کارڈ\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} کارڈز\",\r\n\r\n  \"Home_Chats_Button_Title\": \"پیغامات\",\r\n  \"Home_Chats_Button_Description_None\": \"کوئی پیغام نہیں\",\r\n  \"Home_Chats_Button_Description_Singular\": \"ایک پیغام\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} پیغامات\",\r\n\r\n  \"Home_Attendance_Title\": \"غیر حاضری\",\r\n  \"Home_Attendance_Button_Description_None\": \"کوئی غیر حاضری نہیں\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"ایک غیر حاضری\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} غیر حاضریاں\",\r\n\r\n  \"Home_Menu_Button_Title\": \"مینو\",\r\n  \"Home_Menu_Button_Description\": \"آج کا کھانا\",\r\n\r\n  \"Tab_Calendar_Empty\": \"کوئی ایونٹ نہیں ملا\",\r\n  \"Tab_Calendar_Empty_Description\": \"شروع کرنے کے لیے ایونٹ شامل کریں یا کیلنڈر سنک کریں۔\",\r\n\r\n  \"Modal_Course_Title\": \"میری کلاس\",\r\n  \"Modal_Course_StartsIn\": \"شروع ہو گی\",\r\n  \"Modal_Course_StartedAgo\": \"ختم ہوئی\",\r\n  \"Modal_Course_Ongoing\": \"جاری ہے\",\r\n  \"Modal_Course_Group\": \"گروپ\",\r\n  \"Modal_Course_Group_Full\": \"کلاس\",\r\n\r\n  \"Modal_Course_Details\": \"کلاس کی تفصیلات\",\r\n  \"Modal_Course_Teacher\": \"استاد\",\r\n  \"Modal_Course_Room\": \"کمرہ\",\r\n  \"Modal_Course_Duration\": \"دورانیہ\",\r\n\r\n  \"Modal_Course_Time\": \"کلاس کے اوقات\",\r\n  \"Modal_Course_Start\": \"آغاز\",\r\n  \"Modal_Course_End\": \"اختتام\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"کام تلاش کریں\",\r\n  \"Tasks_LeftHomeworks_Title\": \"کام باقی ہیں\",\r\n  \"Tasks_LeftHomeworks_Time\": \"اس ہفتے\",\r\n  \"Tasks_Done_AllTasks\": \"تمام کام\",\r\n  \"Tasks_Done_CompletedTasks\": \"مکمل ہو چکے ہیں\",\r\n  \"Tasks_Nav_Left\": \"ابھی {{count}} کام باقی ہیں\",\r\n  \"Tasks_Nav_One\": \"صرف ایک کام باقی ہے\",\r\n  \"Tasks_Nav_Completed\": \"سب مکمل ہو گیا!\",\r\n  \"Tasks_Week\": \"ہفتہ\",\r\n  \"Tasks_NoTasks_Title\": \"کوئی کام نہیں\",\r\n  \"Tasks_NoTasks_Description\": \"اس ہفتے کے لیے کوئی کام مقرر نہیں ہے۔ آرام کریں!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"ہفتہ {{week}} کے لیے\",\r\n  \"Tasks_NoTasks_Nav\": \"کوئی کام نہیں\",\r\n  \"Task_Start\": \"باقی ہے\",\r\n  \"Task_Complete\": \"مکمل\",\r\n  \"Task_Sorting_Title\": \"ترتیب دیں\",\r\n  \"Task_OnlyShowUndone\": \"مکمل کام\",\r\n  \"Task_Show_Title\": \"دکھائیں\",\r\n  \"Settings_General\": \"عمومی\",\r\n\r\n  \"Latest_Grades\": \"نئے نمبر\",\r\n  \"Grades_Search_Placeholder\": \"نمبر یا مضمون تلاش کریں\",\r\n\r\n  \"Grades_Avg_Methods\": \"حساب کے طریقے\",\r\n  \"Grades_Avg_All_Title\": \"کل اوسط\",\r\n  \"Grades_Avg_All_Short\": \"کل اوسط\",\r\n  \"Grades_Avg_All_Pond\": \"وزنی اوسط\",\r\n  \"Grades_Avg_All_Pond_Short\": \"وزنی اوسط\",\r\n  \"Grades_Avg_All_Pond_Description\": \"تمام نمبروں کی وزنی اوسط نکالتا ہے\",\r\n  \"Grades_Avg_Subject_Title\": \"مضمون کی اوسط\",\r\n  \"Grades_Avg_Subject_Short\": \"مضمون اوسط\",\r\n  \"Grades_Avg_Subject_Description\": \"مضمون کی اوسطوں کی وزنی اوسط نکالتا ہے\",\r\n  \"Grades_Avg_Median_Title\": \"میڈین (Median)\",\r\n  \"Grades_Avg_Median_Short\": \"میڈین\",\r\n\r\n  \"Grades_Avg_More\": \"مزید جانیں\",\r\n  \"Grades_Avg_KnowMore\": \"مزید معلومات\",\r\n  \"Grades_Avg_KnowMore_Description\": \"کل اوسط نکالنے کے طریقے سمجھیں\",\r\n\r\n  \"Grades_SubjectInfo\": \"مضمون کی معلومات\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} نمبر\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"طالب علم کی اوسط\",\r\n  \"SubjectInfo_Stats_Header\": \"شماریات\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"کلاس کی اوسط\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"پوری کلاس کی کل اوسط\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"زیادہ سے زیادہ اوسط\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"گروپ کی بہترین اوسط\",\r\n  \"SubjectInfo_MinAverage_Label\": \"کم سے کم اوسط\",\r\n  \"SubjectInfo_MinAverage_Description\": \"گروپ کی سب سے کم اوسط\",\r\n\r\n  \"Grades_Semester\": \"سمسٹر\",\r\n  \"Grades_Trimester\": \"سہ ماہی\",\r\n  \"Grades_OutPeriod\": \"مدت سے باہر\",\r\n  \"Grades_Year\": \"سال\",\r\n  \"Grades_MockExamBac\": \"فرضی امتحان\",\r\n  \"Grades_MockExamBrevet\": \"فرضی ٹیسٹ\",\r\n\r\n  \"Grades_Method_AllGrades\": \"تمام مضامین\",\r\n  \"Grades_Method_Weighted\": \"ویٹیج\",\r\n\r\n  \"Grades_Sort\": \"ترتیب دیں\",\r\n  \"Grades_Sorting_Alphabetical\": \"حروفِ تہجی کے لحاظ سے\",\r\n  \"Grades_Sorting_Averages\": \"اوسط کے لحاظ سے\",\r\n  \"Grades_Sorting_Date\": \"تاریخ\",\r\n\r\n  \"Grades_Menu_SortBy\": \"ترتیب دیں\",\r\n  \"Grades_Menu_AverageBy\": \"اوسط نکالیں\",\r\n  \"NoAverage\": \"کوئی اوسط نہیں\",\r\n\r\n  \"Grades_Empty_Title\": \"کوئی نمبر نہیں\",\r\n  \"Grades_Empty_Description\": \"آپ کو اس مدت میں ابھی تک کوئی نمبر نہیں ملے ہیں۔\",\r\n\r\n  \"Grade_NoDescription\": \"{{subject}} کا ہوم ورک\",\r\n\r\n  \"Grades_Tab_Subjects\": \"مضامین\",\r\n  \"Grades_Tab_Latest\": \"نئے نمبر\",\r\n\r\n  \"Profile_Attendance_Title\": \"حاضری\",\r\n  \"Profile_Attendance_Denominator_Single\": \"غیر حاضری\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"غیر حاضریاں\",\r\n\r\n  \"Profile_Discussions_Title\": \"گفتگو\",\r\n  \"Profile_Discussions_Denominator_Single\": \"ان پڑھا\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"ان پڑھے\",\r\n\r\n  \"Profile_News_Title\": \"خبریں\",\r\n  \"Profile_News_Denominator_Single\": \"نیا\",\r\n  \"Profile_News_Denominator_Plural\": \"نئے\",\r\n  \"Profile_News_Open\": \"کھولیں\",\r\n  \"Profile_News_Loading_Title\": \"خبریں لوڈ ہو رہی ہیں...\",\r\n  \"Profile_News_Author_Unknown\": \"نامعلوم مصنف\",\r\n\r\n  \"Profile_Cards_Title\": \"QR-Code اور کارڈز\",\r\n\r\n  \"Modal_Grades_Title\": \"نمبر کی تفصیل\",\r\n  \"Modal_Grades_BestGrade\": \"گروپ کا بہترین نمبر\",\r\n\r\n  \"Grades_Details_Title\": \"تفصیلات\",\r\n  \"Grades_NormalizedGrade_Title\": \"20 میں سے نمبر\",\r\n  \"Grades_NormalizedGrade_Description\": \"20 کے پیمانے پر بدلا ہوا نمبر\",\r\n  \"Grades_HighestGrade_Title\": \"سب سے زیادہ نمبر\",\r\n  \"Grades_HighestGrade_Description\": \"گروپ میں حاصل کردہ زیادہ سے زیادہ نمبر\",\r\n  \"Grades_LowestGrade_Title\": \"کم سے کم نمبر\",\r\n  \"Grades_LowestGrade_Description\": \"گروپ میں حاصل کردہ کم سے کم نمبر\",\r\n  \"Grades_Influence_Title\": \"اثر\",\r\n  \"Grades_Avg_Group_Title\": \"گروپ کی اوسط\",\r\n  \"Grades_Coefficient\": \"کوفیشینٹ\",\r\n  \"Grades_Avg_Group_Short\": \"گروپ اوسط\",\r\n  \"Grades_Tab_Rank\": \"رینک\",\r\n  \"Grades_Tab_Rank_Description\": \"گروپ میں پوزیشن\",\r\n\r\n  \"News_Search_Placeholder\": \"خبر تلاش کریں\",\r\n  \"News_Empty_Title\": \"کوئی خبر نہیں\",\r\n  \"News_Empty_Description\": \"آپ کے ادارے میں کوئی خبر نہیں ملی۔\",\r\n  \"News_Search_NoResults\": \"کوئی خبر نہیں ملی\",\r\n  \"News_Search_NoResults_Description\": \"آپ کی تلاش کے مطابق کوئی خبر نہیں ملی۔\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"پیپیلون\",\r\n  \"News_Theme_Papillon_Description\": \"ایک نرم اور خوبصورت تھیم\",\r\n\r\n  \"News_Theme_Reading_Title\": \"مطالعہ\",\r\n  \"News_Theme_Reading_Description\": \"مطالعہ کے لیے ڈیزائن کی گئی تھیم\",\r\n\r\n  \"Attendance_Hours_Missed\": \"چھوٹے ہوئے گھنٹے\",\r\n  \"Attendance_Hours_Unjustified\": \"بغیر عذر کے گھنٹے\",\r\n  \"Attendance_Missing\": \"غیر حاضریاں\",\r\n  \"Attendance_Delays\": \"تاخیر\",\r\n  \"Attendance_NoReason\": \"کوئی وجہ نہیں\",\r\n  \"Attendance_NoEvent_Title\": \"کوئی ریکارڈ نہیں\",\r\n  \"Attendance_NoEvent_Description\": \"اس مدت کے لیے کوئی غیر حاضری یا تاخیر ریکارڈ نہیں کی گئی۔\",\r\n\r\n  \"Settings_Account_Title\": \"میرا اکاؤنٹ\",\r\n  \"Settings_Account_Description\": \"میرا اکاؤنٹ\",\r\n  \"Settings_Services_Title\": \"منسلک اکاؤنٹس\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"آخری استعمال شدہ اکاؤنٹ\",\r\n  \"Settings_Notifications_Title\": \"نوٹیفیکیشن\",\r\n  \"Settings_Notifications_Description\": \"الرٹس، فریکوئنسی...\",\r\n  \"Settings_Subjects_Title\": \"مضامین\",\r\n  \"Settings_Subjects_Description\": \"نام، رنگ، فونٹ...\",\r\n  \"Settings_Personalization_Title\": \"ذاتی بنانا\",\r\n  \"Settings_Personalization_Description\": \"تھیمز، رنگ...\",\r\n  \"Settings_Cards_Title\": \"کارڈز\",\r\n  \"Settings_Cards_Description\": \"کینٹین، رسائی...\",\r\n  \"Settings_Accessibility_Title\": \"رسائی\",\r\n  \"Settings_Accessibility_Description\": \"ڈسپلے، آواز...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"ذہین فیچرز\",\r\n  \"Settings_MagicPlus_Description_Card\": \"AI فیچرز\",\r\n  \"Settings_MagicPlus_Enable\": \"Magic+ فعال کریں\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"کارکردگی بڑھانے کے لیے آپ کے کاموں کو خود بخود ترتیب دیتا ہے\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"مکمل طور پر مقامی ماڈل، کوئی ڈیٹا آپ کے آلے سے باہر نہیں جاتا\",\r\n  \"Settings_Donate_Title\": \"عطیہ کریں\",\r\n  \"Settings_Donate_Description\": \"پروجیکٹ کی حمایت کریں\",\r\n  \"Settings_Telemetry_Title\": \"ٹیلی میٹری اور پرائیویسی\",\r\n  \"Settings_Telemetry_Description\": \"جمع کردہ ڈیٹا کا انتظام کریں\",\r\n  \"Settings_About_Title\": \"ایپ کے بارے میں\",\r\n  \"Settings_About_Description\": \"ورژن\",\r\n  \"Settings_Logout_Title\": \"لاگ آؤٹ\",\r\n  \"Settings_Logout_Description\": \"اس اکاؤنٹ کو پیپیلون سے ہٹائیں\",\r\n  \"Settings_Language_Title\": \"زبان\",\r\n  \"Settings_Language_Description\": \"زبان تبدیل کریں\",\r\n  \"Settings_Tabs_Title\": \"ٹیبز\",\r\n  \"Settings_Tabs_Description\": \"مینو سے ٹیبز چھپائیں\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"ذاتی بنانا\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"تھیمز، مضامین...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"مضامین کو حسبِ ضرورت بنائیں\",\r\n  \"Settings_Personalization_Accent\": \"نمایاں رنگ\",\r\n  \"Settings_Personalization_Accent_Description\": \"جو رنگ آپ یہاں منتخب کریں گے وہ پیپیلون کے ہوم پیج پر لاگو ہوگا۔\",\r\n  \"Settings_Personalization_Theme\": \"تھیم\",\r\n  \"Settings_Personalization_Icon_Title\": \"آئیکن تبدیل کریں\",\r\n  \"Settings_Personalization_Icon_Description\": \"ایپ آئیکن کو حسبِ ضرورت بنائیں\",\r\n  \"Settings_Personalization_Subject_Title\": \"مضامین کو حسبِ ضرورت بنائیں\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"مضامین\",\r\n  \"Settings_Personalization_Subject_Description\": \"آئیکنز، رنگ\",\r\n  \"Settings_About_Papillion_Behind\": \"پیپیلون کے پیچھے\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"پیپیلون 100% رضاکار طلباء کے ذریعے چلایا جاتا ہے\",\r\n  \"Settings_About_Discord\": \"ڈسکارڈ سرور\",\r\n  \"Settings_About_Discord_Description\": \"ڈسکارڈ سرور میں شامل ہوں\",\r\n  \"Settings_About_Crowdin\": \"کراؤڈن پروجیکٹ\",\r\n  \"Settings_About_Crowdin_Description\": \"پیپیلون کے ترجمے میں مدد کریں\",\r\n  \"Settings_About_Github\": \"گٹ ہب پروجیکٹ\",\r\n  \"Settings_About_Github_Description\": \"گٹ ہب پر حصہ ڈالیں\",\r\n  \"Settings_About_Issue\": \"بگ کی اطلاع دیں\",\r\n  \"Settings_About_Issue_Description\": \"سامنے آنے والے مسئلے کی اطلاع دیں\",\r\n  \"Settings_About_Dependency_Version\": \"لائبریری کے ورژن\",\r\n\r\n  \"Alert_No_Technical\": \"کوئی تکنیکی معلومات دستیاب نہیں ہے۔\",\r\n  \"Alert_Auth_Error\": \"لاگ ان کی خرابی\",\r\n  \"Alert_Auth_Bad_Creds\": \"آپ کی درج کردہ معلومات غلط ہیں یا آپ والدین کے اکاؤنٹ سے لاگ ان کرنے کی کوشش کر رہے ہیں۔ پیپیلون ابھی اس قسم کے اکاؤنٹ کو سپورٹ نہیں کرتا۔\",\r\n  \"Alert_Not_Supported\": \"سرور سپورٹڈ نہیں ہے\",\r\n  \"Alert_Security_Instance_HTTP\": \"سیکیورٹی وجوہات کی بنا پر، پیپیلون HTTP پروٹوکول استعمال کرنے والے سرورز قبول نہیں کرتا۔ ہم مشورہ دیتے ہیں کہ آپ اسکول کے سربراہ کو مطلع کریں تاکہ وہ اسے اپ ڈیٹ کر سکیں۔\",\r\n  \"Alert_NoDemo\": \"پیپیلون ڈیمو سرورز کے ساتھ کام کرنے کے لیے نہیں ہے، براہ کرم اصلی سرور استعمال کریں۔\",\r\n  \"Alert_Invalid_Instance\": \"پیپیلون اس PRONOTE سرور سے معلومات حاصل نہیں کر پا رہا، کیا یہ اب بھی درست ہے؟\",\r\n  \"Alert_No_Pos\": \"لوکیشن حاصل کرنے میں ناکامی\",\r\n  \"Alert_Connexion_Fail\": \"کنکشن ممکن نہیں\",\r\n\r\n  \"Feature_Limited\": \"محدود فیچرز\",\r\n  \"Feature_Soon\": \"یہ جلد آرہا ہے!\",\r\n  \"Feature_Soon_Notification\": \"ہم مستقبل کی اپ ڈیٹ میں یہ فیچر فراہم کرنے کے لیے سخت محنت کر رہے ہیں۔\",\r\n  \"Feature_Add_Card\": \"نیویگیشن بار میں موجود پروفائل ٹیب سے نیا کارڈ شامل کریں\",\r\n\r\n  \"Webview_Wait\": \"تھوڑا صبر کریں...\",\r\n\r\n  \"Profile_QRCards\": \"QR-Code اور کارڈز\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} کارڈز\",\r\n  \"Profile_Cards_Loading_History\": \"لین دین کی ہسٹری لوڈ ہو رہی ہے\",\r\n  \"Profile_Cards_Loading_History_Description\": \"اس میں کچھ وقت لگ سکتا ہے...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"کارڈز\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"کینٹین، رسائی\",\r\n  \"Settings_Cards_Banner_Description\": \"پیپیلون پر اپنے فون سے کہیں بھی رسائی کے لیے اپنے کینٹین اور ٹرانسپورٹ کارڈ شامل کریں\",\r\n  \"Settings_Cards_None_Title\": \"کوئی کارڈ نہیں\",\r\n  \"Settings_Cards_Add_Button\": \"شامل کریں\",\r\n\r\n  \"Settings_Cards_None_Description\": \"کینٹین بیلنس دیکھنے، اپنا QR-Code اسکین کرنے اور مزید کے لیے کارڈ شامل کریں\",\r\n  \"Settings_Subjects_None_Title\": \"کوئی مضمون نہیں\",\r\n  \"Settings_Subjects_None_Description\": \"مضامین کو حسبِ ضرورت بنانے کے لیے ایپ کے مختلف ٹیبز دیکھیں۔\",\r\n  \"Settings_Subjects_Reset_Title\": \"ری سیٹ کریں\",\r\n  \"Settings_Subjects_Reset_Message\": \"کیا آپ واقعی تمام مضامین کو ری سیٹ کرنا چاہتے ہیں؟\",\r\n  \"Settings_Subjects_Reset_Button\": \"ری سیٹ کریں\",\r\n\r\n  \"Settings_Donator\": \"عطیہ دہندگان\",\r\n  \"Settings_Donator_Description\": \"عطیہ دہندگان کی فہرست دیکھیں\",\r\n  \"Settings_App_Version\": \"ایپ ورژن\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"QR-Code کو ٹرمینل کے اسکینر کی طرف کریں\",\r\n  \"Profile_Cards_No_Reservation\": \"کوئی بکنگ نہیں\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"ایسا لگتا ہے کہ آپ اس دن بکنگ نہیں کر سکتے۔\",\r\n  \"Profile_Cards_History\": \"ہسٹری\",\r\n  \"Magic_Important\": \"شاید اہم ہو\",\r\n\r\n  \"OnBoarding_Step\": \"مرحلہ \",\r\n  \"OnBoarding_Step_Of\": \"میں سے \",\r\n\r\n  \"Consent_Advanced_Title\": \"میں پیپیلون کی مدد کرنا چاہتا ہوں\",\r\n  \"Consent_Advanced_Description\": \"ہم آپ کے استعمال کے بارے میں مزید تفصیلی معلومات جمع کرتے ہیں۔\",\r\n  \"Consent_Required_Title\": \"صرف ضروری\",\r\n  \"Consent_Required_Description\": \"مختصراً یہ جاننا کہ کسی نے پیپیلون استعمال کیا، کیا سب ٹھیک رہا اور وہ کون سی سروس استعمال کر رہا ہے۔\",\r\n  \"Consent_None_Title\": \"کچھ بھی نہیں\",\r\n  \"Consent_None_Description\": \"ہمیں آپ کے ہونے کا پتہ بھی نہیں چلے گا۔\",\r\n  \"Consent_Title\": \"آپ اور پیپیلون\",\r\n  \"Consent_Intro1\": \"پیپیلون کو بڑھنے میں مدد کے لیے، آپ استعمال کی کچھ معلومات شیئر کرنے کا انتخاب کر سکتے ہیں۔\",\r\n  \"Consent_PrivacyPolicy\": \"شک کی صورت میں، ہماری پرائیویسی پالیسی دیکھیں\",\r\n  \"Consent_Refuse\": \"انکار کریں\",\r\n  \"Consent_Accept\": \"قبول کریں\",\r\n  \"Consent_ChangeMind\": \"آپ کسی بھی وقت ایپ کی ترتیبات سے اپنا ارادہ بدل سکتے ہیں۔\",\r\n  \"Consent_Arg1\": \"صرف ایپ کو بہتر بنانے کے لیے استعمال کیا جاتا ہے\",\r\n  \"Consent_Arg2\": \"گمنام اور آپ کی شناخت سے منسلک نہیں\",\r\n  \"Consent_Arg3\": \"ہمیں آپ کے اکاؤنٹس تک رسائی نہیں ہے\",\r\n\r\n  \"Changelog_Title\": \"اپ ڈیٹ نوٹس\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"جمع کرانے کی تاریخ\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"مضامین\",\r\n  \"Tasks_Sorting_Methods_Done\": \"نامکمل\",\r\n  \"Tasks_ThisWeek\": \"اس ہفتے\",\r\n\r\n  \"Task_Undone\": \"نامکمل\",\r\n  \"Task_Done\": \"مکمل\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"وال پیپر تبدیل کریں\",\r\n  \"Modal_Profile_Title\": \"پروفائل تبدیل کریں\",\r\n\r\n  \"Modal_Task_Status\": \"کام کی صورتحال\",\r\n  \"Modal_Task_Description\": \"کام کی تفصیل\",\r\n  \"Modal_Task_Attachments\": \"منسلکات\",\r\n\r\n  \"Today\": \"آج\",\r\n  \"Yesterday\": \"کل (گزشتہ)\",\r\n  \"Tomorrow\": \"کل (آئندہ)\"\r\n}"
  },
  {
    "path": "locales/vi.json",
    "content": "{\r\n  \"Global_Back\": \"Quay lại\",\r\n  \"Global_DatePrefix\": \"vào\",\r\n\r\n  \"Tab_Home\": \"Trang chủ\",\r\n  \"Tab_Calendar\": \"Lịch học\",\r\n  \"Tab_Tasks\": \"Bài tập\",\r\n  \"Tab_Grades\": \"Điểm số\",\r\n  \"Tab_Profile\": \"Cá nhân\",\r\n  \"Tab_Custom_Profile\": \"Chỉnh sửa hồ sơ\",\r\n  \"Button_Change_ProfilePicture\": \"Thay đổi ảnh đại diện\",\r\n  \"Button_Change_ProfilePicture_TakePhoto\": \"Chụp ảnh mới\",\r\n  \"Button_Change_ProfilePicture_FromLibrary\": \"Chọn từ thư viện\",\r\n  \"Button_Change_ProfilePicture_FromService\": \"Lấy từ hệ thống trường học\",\r\n  \"Button_Change_ProfilePicture_Remove\": \"Xóa ảnh\",\r\n  \"Tab_Page\": \"Trang\",\r\n  \"Tab_Settings\": \"Cài đặt\",\r\n  \"Tab_News\": \"Tin tức\",\r\n\r\n  \"ONBOARDING_MAIN_TITLE\": \"Ứng dụng quản lý đời sống học đường của bạn\",\r\n  \"ONBOARDING_MAIN_DESCRIPTION\": \"Kết nối các ứng dụng trường học để xem điểm, lịch học, bài tập và nhiều hơn thế nữa ngay trên giao diện Papillon!\",\r\n  \"ONBOARDING_START_BTN\": \"Bắt đầu\",\r\n  \"ONBOARDING_HELP_BTN\": \"Cần trợ giúp?\",\r\n  \"ONBOARDING_UNIVERSITY\": \"Dịch vụ đại học\",\r\n  \"ONBOARDING_RESTAURANTS\": \"Dịch vụ ăn uống\",\r\n  \"ONBOARDING_SELECT_SCHOOLSERVICE\": \"Chọn dịch vụ trường học của bạn\",\r\n  \"ONBOARDING_SELECT_RESTAURANTSERVICE\": \"Chọn dịch vụ ăn uống\",\r\n  \"ONBOARDING_SELECT_UNIVERSITIESERVICE\": \"Chọn dịch vụ đại học\",\r\n  \"ONBOARDING_LOGIN_METHOD\": \"Bạn muốn đăng nhập bằng cách nào?\",\r\n  \"ONBOARDING_METHOD_POSITION\": \"Sử dụng vị trí của tôi\",\r\n  \"ONBOARDING_METHOD_SEARCH\": \"Tìm kiếm theo thành phố\",\r\n  \"ONBOARDING_METHOD_QRCODE\": \"Tôi có mã QR\",\r\n  \"ONBOARDING_METHOD_LINK\": \"Tôi có URL đăng nhập\",\r\n  \"ONBOARDING_SELECT_SCHOOL\": \"Chọn trường của bạn\",\r\n  \"ONBOARDING_SEARCH_TITLE\": \"Nhập tên thành phố và chọn trường của bạn\",\r\n  \"ONBOARDING_WEBVIEW_TITLE\": \"Đăng nhập như thói quen của bạn\",\r\n  \"ONBOARDING_LOGIN_CREDENTIALS\": \"Đăng nhập vào tài khoản\",\r\n  \"ONBOARDING_TURBOSELF_SELECTHOST\": \"Chọn máy chủ được chỉ định cho tài khoản\",\r\n  \"ONBOARDING_PRONOTE_PIN\": \"Nhập mã 4 chữ số bạn vừa tạo trên PRONOTE\",\r\n  \"ONBOARDING_LOGIN_TO\": \"Kết nối với\",\r\n  \"ONBOARDING_SCAN_QRCODE\": \"Quét mã QR của trường bạn để đăng nhập.\",\r\n  \"ONBOARDING_QRCODE_VALIDATION\": \"Xác thực mã QR\",\r\n  \"ONBOARDING_QRCODE_WAIT\": \"Vui lòng chờ trong giây lát...\",\r\n  \"ONBOARDING_URL\": \"Nhập địa chỉ URL của trường bạn\",\r\n  \"ONBOARDING_URL_PLACEHOLDER\": \"URL của máy chủ PRONOTE\",\r\n  \"ONBOARDING_COLOR_TITLE\": \"Trước khi hoàn tất\",\r\n  \"ONBOARDING_COLOR_FIRST_LINE_DESCRIPTION\": \"Chọn một\",\r\n  \"ONBOARDING_COLOR_SECOND_LINE_DESCRIPTION\": \"màu chủ đề\",\r\n  \"ONBOARDING_LOGIN_PINCODE\": \"Nhập mã PIN PRONOTE của bạn\",\r\n  \"Onboarding_Load_Webview_Description\": \"Chúng tôi đang tải trang web của trường bạn\",\r\n  \"INPUT_PIN\": \"Mã PIN\",\r\n  \"SEARCH_UNIV_PLACEHOLDER\": \"Tìm kiếm máy chủ...\",\r\n  \"ONBOARDING_LOADING_LOGIN\": \"Đang kết nối...\",\r\n\r\n  \"WAITING\": \"Đang chờ\",\r\n  \"IZLY_SMS_SEND\": \"Bạn vừa nhận được một liên kết đăng nhập, hãy nhấn vào đó và làm theo các bước.\",\r\n  \"STEP\": \"Bước\",\r\n  \"STEP_OUTOF\": \"trên\",\r\n  \"INPUT_USERNAME\": \"Tên đăng nhập\",\r\n  \"INPUT_MAIL\": \"Địa chỉ e-mail\",\r\n  \"INPUT_MAIL_OR_USERNAME\": \"Email hoặc tên đăng nhập\",\r\n  \"INPUT_PHONE_OR_MAIL\": \"Số điện thoại hoặc email\",\r\n  \"INPUT_PASSWORD\": \"Mật khẩu\",\r\n  \"INPUT_PASSWORD_CODE\": \"Mã truy cập\",\r\n  \"INPUT_ETABID\": \"Mã định danh trường học\",\r\n  \"LOGIN_BTN\": \"Đăng nhập\",\r\n  \"CONFIRM_BTN\": \"Xác nhận\",\r\n  \"CANCEL_BTN\": \"Hủy bỏ\",\r\n\r\n  \"Tab_New_Event\": \"Sự kiện mới\",\r\n\r\n  \"Tab_Calendar_Icals\": \"Quản lý iCal\",\r\n  \"Tab_Calendar_Icals_Description\": \"Quản lý các URL iCal của bạn\",\r\n\r\n  \"Tab_Calendar_Icals_Add_URL\": \"Thêm URL iCal\",\r\n  \"Tab_Calendar_Icals_Manage_Title\": \"Quản lý {{title}}\",\r\n  \"Tab_Calendar_Icals_Manage_Description\": \"Thêm hoặc xóa các URL iCal để đồng bộ hóa với lịch của bạn.\",\r\n  \"Tab_Calendar_Icals_Add_Title\": \"Thiếu tiêu đề\",\r\n  \"Tab_Calendar_Icals_Add_Description\": \"Đặt tên cho URL iCal này để thêm vào.\",\r\n  \"Tab_Calendar_Icals_Empty\": \"Chưa có URL iCal nào được thêm\",\r\n\r\n  \"TabUnderConstruction_Title\": \"Tab này đang được phát triển.\",\r\n  \"TabUnderConstruction_Details\": \"Vui lòng quay lại sau để cập nhật.\",\r\n\r\n  \"TabDevModeNotice_Title\": \"Chế độ Nhà phát triển\",\r\n  \"TabDevModeNotice_Details\": \"Môi trường thử nghiệm đầy đủ dành cho nhà phát triển.\",\r\n\r\n  \"Alert_TechnicalDetails\": \"Chi tiết kỹ thuật\",\r\n\r\n  \"Online_Course\": \"Trực tuyến\",\r\n  \"Evaluated_Course\": \"Kiểm tra/Đánh giá\",\r\n  \"Edited_Course\": \"Lịch học đã thay đổi\",\r\n  \"Canceled_Course\": \"Tiết học bị hủy\",\r\n  \"No_Course_Room\": \"Chưa rõ phòng học\",\r\n  \"Event_DeleteEvent\": \"Xóa sự kiện\",\r\n  \"Event_Confirm_DeleteEvent\": \"Bạn có chắc chắn muốn xóa sự kiện này không?\",\r\n\r\n  \"Course_Separator_Lunch_Default\": \"Nghỉ trưa\",\r\n  \"Course_Separator_Lunch_Alt_1\": \"Chúc ngon miệng!\",\r\n  \"Course_Separator_Lunch_Alt_2\": \"Măm măm!\",\r\n\r\n  \"Course_Separator_Morning_Default\": \"Nghỉ giải lao sáng\",\r\n  \"Course_Separator_Morning_Alt_1\": \"Đi ngủ thôi!\",\r\n  \"Course_Separator_Morning_Alt_2\": \"Bữa sáng\",\r\n\r\n  \"Course_Separator_Evening_Default\": \"Nghỉ giải lao chiều\",\r\n  \"Course_Separator_Evening_Alt_1\": \"Đến lúc nghỉ ngơi rồi!\",\r\n  \"Course_Separator_Evening_Alt_2\": \"Giờ ăn nhẹ!\",\r\n\r\n  \"Course_Separator_Night_Default\": \"Nghỉ tối\",\r\n  \"Course_Separator_Night_Alt_1\": \"Đi ngủ thôi!\",\r\n  \"Course_Separator_Night_Alt_2\": \"Trời đã tối rồi!\",\r\n\r\n  \"Context_Delete\": \"Xóa\",\r\n  \"Context_Cancel\": \"Hủy\",\r\n  \"Context_Edit\": \"Chỉnh sửa\",\r\n  \"Context_Add\": \"Thêm\",\r\n\r\n  \"Form_Title\": \"Tiêu đề\",\r\n  \"Form_Location\": \"Địa điểm\",\r\n  \"Form_Organizer\": \"Người tổ chức\",\r\n  \"Form_Start\": \"Bắt đầu\",\r\n  \"Form_End\": \"Kết thúc\",\r\n\r\n  \"Confirm_DeleteEvent\": \"Bạn có chắc chắn muốn xóa sự kiện này không?\",\r\n\r\n  \"Home_Welcome_Name\": \"Chào bạn, {{name}} {{emoji}}\",\r\n  \"Home_Display_More\": \"Hiển thị thêm\",\r\n  \"Home_Cards_Button_Description_Plurial\": \"sẵn có\",\r\n  \"Home_Chats_Plurial\": \"cuộc hội thoại\",\r\n  \"Home_Chats_Singular\": \"cuộc hội thoại\",\r\n  \"Home_See_All_Tasks\": \"Xem tất cả bài tập\",\r\n  \"Home_Welcome\": \"Xin chào!\",\r\n  \"Home_Planned_None\": \"Bạn không còn tiết học nào trong hôm nay\",\r\n  \"Home_Planned_One\": \"Bạn còn một tiết học trong hôm nay\",\r\n  \"Home_Planned_Number\": \"Bạn còn {{number}} tiết học trong hôm nay\",\r\n\r\n  \"Home_Widget_NextCourses\": \"Tiết học sắp tới\",\r\n  \"Home_Widget_NewGrades\": \"Điểm mới\",\r\n  \"Home_Widget_NewHomeworks\": \"Bài tập cần làm\",\r\n\r\n  \"Home_Widget_NoCourses\": \"Không có tiết học nào\",\r\n  \"Home_Widget_NoCourses_Description\": \"Không có lịch học nào được lên kế hoạch cho hôm nay.\",\r\n\r\n  \"Home_Cards_Button_Title\": \"Thẻ\",\r\n  \"Home_Cards_Button_Description_None\": \"Không có thẻ\",\r\n  \"Home_Cards_Button_Description_Singular\": \"Một thẻ\",\r\n  \"Home_Cards_Button_Description_Number\": \"{{number}} thẻ\",\r\n\r\n  \"Home_Chats_Button_Title\": \"Tin nhắn\",\r\n  \"Home_Chats_Button_Description_None\": \"Không có tin nhắn\",\r\n  \"Home_Chats_Button_Description_Singular\": \"Một tin nhắn\",\r\n  \"Home_Chats_Button_Description_Number\": \"{{number}} tin nhắn\",\r\n\r\n  \"Home_Attendance_Title\": \"Chuyên cần\",\r\n  \"Home_Attendance_Button_Description_None\": \"Không có vắng mặt\",\r\n  \"Home_Attendance_Button_Description_Singular\": \"Một lần vắng mặt\",\r\n  \"Home_Attendance_Button_Description_Number\": \"{{number}} lần vắng mặt\",\r\n\r\n  \"Home_Menu_Button_Title\": \"Thực đơn\",\r\n  \"Home_Menu_Button_Description\": \"Thực đơn hôm nay\",\r\n\r\n  \"Tab_Calendar_Empty\": \"Không tìm thấy sự kiện\",\r\n  \"Tab_Calendar_Empty_Description\": \"Thêm sự kiện hoặc đồng bộ lịch của bạn để bắt đầu.\",\r\n\r\n  \"Modal_Course_Title\": \"Tiết học của tôi\",\r\n  \"Modal_Course_StartsIn\": \"Bắt đầu sau\",\r\n  \"Modal_Course_StartedAgo\": \"Đã kết thúc cách đây\",\r\n  \"Modal_Course_Ongoing\": \"Đã bắt đầu được\",\r\n  \"Modal_Course_Group\": \"Nhóm\",\r\n  \"Modal_Course_Group_Full\": \"Lớp\",\r\n\r\n  \"Modal_Course_Details\": \"Chi tiết tiết học\",\r\n  \"Modal_Course_Teacher\": \"Giáo viên\",\r\n  \"Modal_Course_Room\": \"Phòng học\",\r\n  \"Modal_Course_Duration\": \"Thời lượng\",\r\n\r\n  \"Modal_Course_Time\": \"Thời gian học\",\r\n  \"Modal_Course_Start\": \"Bắt đầu\",\r\n  \"Modal_Course_End\": \"Kết thúc\",\r\n\r\n  \"Tasks_Search_Placeholder\": \"Tìm kiếm bài tập\",\r\n  \"Tasks_LeftHomeworks_Title\": \"bài tập còn lại\",\r\n  \"Tasks_LeftHomeworks_Time\": \"trong tuần này\",\r\n  \"Tasks_Done_AllTasks\": \"Tất cả bài tập\",\r\n  \"Tasks_Done_CompletedTasks\": \"đã được hoàn thành\",\r\n  \"Tasks_Nav_Left\": \"Còn {{count}} bài tập cần làm\",\r\n  \"Tasks_Nav_One\": \"Chỉ còn một bài tập nữa thôi\",\r\n  \"Tasks_Nav_Completed\": \"Đã hoàn thành tất cả!\",\r\n  \"Tasks_Week\": \"Tuần\",\r\n  \"Tasks_NoTasks_Title\": \"Không có bài tập\",\r\n  \"Tasks_NoTasks_Description\": \"Không có bài tập nào cho tuần này. Hãy tranh thủ nghỉ ngơi nhé!\",\r\n  \"Tasks_NoTasks_ForWeek\": \"cho tuần {{week}}\",\r\n  \"Tasks_NoTasks_Nav\": \"Không có bài tập\",\r\n  \"Task_Start\": \"Cần làm\",\r\n  \"Task_Complete\": \"Đã xong\",\r\n  \"Task_Sorting_Title\": \"Sắp xếp theo\",\r\n  \"Task_OnlyShowUndone\": \"Bài tập đã xong\",\r\n  \"Task_Show_Title\": \"Hiển thị\",\r\n  \"Settings_General\": \"Chung\",\r\n\r\n  \"Latest_Grades\": \"Điểm mới\",\r\n  \"Grades_Search_Placeholder\": \"Tìm kiếm điểm, môn học\",\r\n\r\n  \"Grades_Avg_Methods\": \"Phương pháp tính\",\r\n  \"Grades_Avg_All_Title\": \"Điểm trung bình chung\",\r\n  \"Grades_Avg_All_Short\": \"ĐTB chung\",\r\n  \"Grades_Avg_All_Pond\": \"Điểm trung bình hệ số\",\r\n  \"Grades_Avg_All_Pond_Short\": \"ĐTB hệ số\",\r\n  \"Grades_Avg_All_Pond_Description\": \"Tính điểm trung bình dựa trên hệ số của tất cả các cột điểm\",\r\n  \"Grades_Avg_Subject_Title\": \"Điểm trung bình môn\",\r\n  \"Grades_Avg_Subject_Short\": \"ĐTB môn\",\r\n  \"Grades_Avg_Subject_Description\": \"Tính trung bình dựa trên điểm trung bình của từng môn học\",\r\n  \"Grades_Avg_Median_Title\": \"Số trung vị\",\r\n  \"Grades_Avg_Median_Short\": \"Trung vị\",\r\n\r\n  \"Grades_Avg_More\": \"Xem thêm\",\r\n  \"Grades_Avg_KnowMore\": \"Tìm hiểu thêm\",\r\n  \"Grades_Avg_KnowMore_Description\": \"Tìm hiểu về các phương pháp tính điểm trung bình chung\",\r\n\r\n  \"Grades_SubjectInfo\": \"Thông tin môn học\",\r\n  \"Grades_SubjectInfo_NbGrades\": \"{{number}} đầu điểm\",\r\n  \"SubjectInfo_StudentAverage_Label\": \"Trung bình của học sinh\",\r\n  \"SubjectInfo_Stats_Header\": \"Thống kê\",\r\n  \"SubjectInfo_ClassAverage_Label\": \"Trung bình lớp\",\r\n  \"SubjectInfo_ClassAverage_Description\": \"Điểm trung bình chung của cả lớp\",\r\n  \"SubjectInfo_MaxAverage_Label\": \"Điểm cao nhất\",\r\n  \"SubjectInfo_MaxAverage_Description\": \"Điểm trung bình tốt nhất trong nhóm\",\r\n  \"SubjectInfo_MinAverage_Label\": \"Điểm thấp nhất\",\r\n  \"SubjectInfo_MinAverage_Description\": \"Điểm trung bình thấp nhất trong nhóm\",\r\n\r\n  \"Grades_Semester\": \"Học kỳ\",\r\n  \"Grades_Trimester\": \"Quý\",\r\n  \"Grades_OutPeriod\": \"Ngoài giai đoạn\",\r\n  \"Grades_Year\": \"Năm học\",\r\n  \"Grades_MockExamBac\": \"Thi thử tốt nghiệp\",\r\n  \"Grades_MockExamBrevet\": \"Thi thử chuyển cấp\",\r\n\r\n  \"Grades_Method_AllGrades\": \"Tất cả môn học\",\r\n  \"Grades_Method_Weighted\": \"Trọng số (Hệ số)\",\r\n\r\n  \"Grades_Sort\": \"Sắp xếp\",\r\n  \"Grades_Sorting_Alphabetical\": \"Theo bảng chữ cái\",\r\n  \"Grades_Sorting_Averages\": \"Theo điểm số\",\r\n  \"Grades_Sorting_Date\": \"Theo ngày\",\r\n\r\n  \"Grades_Menu_SortBy\": \"Sắp xếp theo\",\r\n  \"Grades_Menu_AverageBy\": \"Trung bình theo\",\r\n  \"NoAverage\": \"Không có điểm trung bình\",\r\n\r\n  \"Grades_Empty_Title\": \"Chưa có điểm\",\r\n  \"Grades_Empty_Description\": \"Bạn chưa có điểm số nào trong giai đoạn này.\",\r\n\r\n  \"Grade_NoDescription\": \"Bài tập môn {{subject}}\",\r\n\r\n  \"Grades_Tab_Subjects\": \"Môn học\",\r\n  \"Grades_Tab_Latest\": \"Điểm mới\",\r\n\r\n  \"Profile_Attendance_Title\": \"Chuyên cần\",\r\n  \"Profile_Attendance_Denominator_Single\": \"lần vắng\",\r\n  \"Profile_Attendance_Denominator_Plural\": \"lần vắng\",\r\n\r\n  \"Profile_Discussions_Title\": \"Trao đổi\",\r\n  \"Profile_Discussions_Denominator_Single\": \"chưa đọc\",\r\n  \"Profile_Discussions_Denominator_Plural\": \"chưa đọc\",\r\n\r\n  \"Profile_News_Title\": \"Tin tức\",\r\n  \"Profile_News_Denominator_Single\": \"mới\",\r\n  \"Profile_News_Denominator_Plural\": \"mới\",\r\n  \"Profile_News_Open\": \"Mở\",\r\n  \"Profile_News_Loading_Title\": \"Đang tải tin tức...\",\r\n  \"Profile_News_Author_Unknown\": \"Tác giả ẩn danh\",\r\n\r\n  \"Profile_Cards_Title\": \"Mã QR và thẻ\",\r\n\r\n  \"Modal_Grades_Title\": \"Chi tiết điểm số\",\r\n  \"Modal_Grades_BestGrade\": \"Điểm cao nhất nhóm\",\r\n\r\n  \"Grades_Details_Title\": \"Chi tiết\",\r\n  \"Grades_NormalizedGrade_Title\": \"Quy đổi thang điểm 20\",\r\n  \"Grades_NormalizedGrade_Description\": \"Giá trị điểm số được chuyển đổi sang thang điểm 20\",\r\n  \"Grades_HighestGrade_Title\": \"Điểm cao nhất\",\r\n  \"Grades_HighestGrade_Description\": \"Điểm số cao nhất đạt được trong nhóm\",\r\n  \"Grades_LowestGrade_Title\": \"Điểm thấp nhất\",\r\n  \"Grades_LowestGrade_Description\": \"Điểm số thấp nhất trong nhóm\",\r\n  \"Grades_Influence_Title\": \"Ảnh hưởng\",\r\n  \"Grades_Avg_Group_Title\": \"Trung bình nhóm\",\r\n  \"Grades_Coefficient\": \"Hệ số\",\r\n  \"Grades_Avg_Group_Short\": \"TB nhóm\",\r\n  \"Grades_Tab_Rank\": \"Xếp hạng\",\r\n  \"Grades_Tab_Rank_Description\": \"Vị trí trong nhóm\",\r\n\r\n  \"News_Search_Placeholder\": \"Tìm kiếm tin tức\",\r\n  \"News_Empty_Title\": \"Không có tin tức\",\r\n  \"News_Empty_Description\": \"Không tìm thấy tin tức nào từ trường học của bạn.\",\r\n  \"News_Search_NoResults\": \"Không tìm thấy kết quả\",\r\n  \"News_Search_NoResults_Description\": \"Không có tin tức nào phù hợp với tìm kiếm của bạn.\",\r\n\r\n  \"News_Theme_Papillon_Title\": \"Papillon\",\r\n  \"News_Theme_Papillon_Description\": \"Một chủ đề nhẹ nhàng và tinh tế\",\r\n\r\n  \"News_Theme_Reading_Title\": \"Đọc sách\",\r\n  \"News_Theme_Reading_Description\": \"Chủ đề được thiết kế tối ưu cho việc đọc\",\r\n\r\n  \"Attendance_Hours_Missed\": \"Số giờ đã nghỉ\",\r\n  \"Attendance_Hours_Unjustified\": \"Số giờ nghỉ không lý do\",\r\n  \"Attendance_Missing\": \"Vắng mặt\",\r\n  \"Attendance_Delays\": \"Đi muộn\",\r\n  \"Attendance_NoReason\": \"Không có lý do\",\r\n  \"Attendance_NoEvent_Title\": \"Không có sự kiện\",\r\n  \"Attendance_NoEvent_Description\": \"Không có ghi nhận vắng mặt hay đi muộn trong giai đoạn này.\",\r\n\r\n  \"Settings_Account_Title\": \"Tài khoản của tôi\",\r\n  \"Settings_Account_Description\": \"Thông tin cá nhân\",\r\n  \"Settings_Services_Title\": \"Tài khoản liên kết\",\r\n  \"Settings_Services_Title_LastAccountUsed\": \"Tài khoản dùng gần nhất\",\r\n  \"Settings_Notifications_Title\": \"Thông báo\",\r\n  \"Settings_Notifications_Description\": \"Cảnh báo, tần suất...\",\r\n  \"Settings_Subjects_Title\": \"Môn học\",\r\n  \"Settings_Subjects_Description\": \"Tên, màu sắc, phông chữ...\",\r\n  \"Settings_Personalization_Title\": \"Cá nhân hóa\",\r\n  \"Settings_Personalization_Description\": \"Chủ đề, màu sắc...\",\r\n  \"Settings_Cards_Title\": \"Thẻ\",\r\n  \"Settings_Cards_Description\": \"Căng-tin, thẻ ra vào...\",\r\n  \"Settings_Accessibility_Title\": \"Hỗ trợ tiếp cận\",\r\n  \"Settings_Accessibility_Description\": \"Hiển thị, âm thanh...\",\r\n  \"Settings_MagicPlus_Title\": \"Magic+\",\r\n  \"Settings_MagicPlus_Description\": \"Tính năng thông minh\",\r\n  \"Settings_MagicPlus_Description_Card\": \"Tính năng AI\",\r\n  \"Settings_MagicPlus_Enable\": \"Kích hoạt Magic+\",\r\n  \"Settings_MagicPlus_Description_Optimization\": \"Tự động tối ưu hóa việc sắp xếp bài tập để cải thiện năng suất học tập\",\r\n  \"Settings_MagicPlus_ExplanationLocal\": \"Mô hình chạy hoàn toàn trên máy, không dữ liệu nào được gửi ra ngoài thiết bị\",\r\n  \"Settings_Donate_Title\": \"Ủng hộ dự án\",\r\n  \"Settings_Donate_Description\": \"Hỗ trợ chúng tôi duy trì dự án\",\r\n  \"Settings_Telemetry_Title\": \"Dữ liệu và quyền riêng tư\",\r\n  \"Settings_Telemetry_Description\": \"Quản lý dữ liệu được thu thập\",\r\n  \"Settings_About_Title\": \"Giới thiệu\",\r\n  \"Settings_About_Description\": \"Phiên bản\",\r\n  \"Settings_Logout_Title\": \"Đăng xuất\",\r\n  \"Settings_Logout_Description\": \"Xóa tài khoản này khỏi Papillon\",\r\n  \"Settings_Language_Title\": \"Ngôn ngữ\",\r\n  \"Settings_Language_Description\": \"Thay đổi ngôn ngữ\",\r\n  \"Settings_Tabs_Title\": \"Các tab\",\r\n  \"Settings_Tabs_Description\": \"Ẩn các tab khỏi menu\",\r\n\r\n  \"Settings_Personalization_Title_Card\": \"Cá nhân hóa\",\r\n  \"Settings_Personalization_Subtitle_Card\": \"Chủ đề, môn học...\",\r\n  \"Settings_SubjectPersonalization_Title\": \"Tùy chỉnh môn học\",\r\n  \"Settings_Personalization_Accent\": \"Màu nhấn\",\r\n  \"Settings_Personalization_Accent_Description\": \"Màu sắc bạn chọn sẽ được áp dụng cho trang chủ Papillon.\",\r\n  \"Settings_Personalization_Theme\": \"Chủ đề\",\r\n  \"Settings_Personalization_Icon_Title\": \"Đổi biểu tượng\",\r\n  \"Settings_Personalization_Icon_Description\": \"Tùy chỉnh biểu tượng ứng dụng\",\r\n  \"Settings_Personalization_Subject_Title\": \"Tùy chỉnh môn học\",\r\n  \"Settings_Personalization_Subject_Title_Card\": \"Môn học\",\r\n  \"Settings_Personalization_Subject_Description\": \"Biểu tượng, màu sắc\",\r\n  \"Settings_About_Papillion_Behind\": \"Đội ngũ Papillon\",\r\n  \"Settings_About_Papillion_Behind_Description\": \"Papillon được duy trì bởi các bạn học sinh sinh viên tình nguyện 100%\",\r\n  \"Settings_About_Discord\": \"Máy chủ Discord\",\r\n  \"Settings_About_Discord_Description\": \"Tham gia cộng đồng Discord\",\r\n  \"Settings_About_Crowdin\": \"Dự án Crowdin\",\r\n  \"Settings_About_Crowdin_Description\": \"Hỗ trợ dịch thuật cho Papillon\",\r\n  \"Settings_About_Github\": \"Dự án GitHub\",\r\n  \"Settings_About_Github_Description\": \"Đóng góp cho dự án trên GitHub\",\r\n  \"Settings_About_Issue\": \"Báo lỗi\",\r\n  \"Settings_About_Issue_Description\": \"Báo cáo lỗi bạn gặp phải\",\r\n  \"Settings_About_Dependency_Version\": \"Phiên bản thư viện\",\r\n\r\n  \"Alert_No_Technical\": \"Không có thông tin kỹ thuật.\",\r\n  \"Alert_Auth_Error\": \"Lỗi xác thực\",\r\n  \"Alert_Auth_Bad_Creds\": \"Thông tin bạn nhập không chính xác hoặc bạn đang dùng tài khoản phụ huynh. Papillon hiện chưa hỗ trợ loại tài khoản này.\",\r\n  \"Alert_Not_Supported\": \"Máy chủ không được hỗ trợ\",\r\n  \"Alert_Security_Instance_HTTP\": \"Vì lý do bảo mật, Papillon không chấp nhận các máy chủ dùng giao thức HTTP. Bạn nên báo với quản lý trường học để cập nhật lên HTTPS.\",\r\n  \"Alert_NoDemo\": \"Papillon không hỗ trợ các máy chủ dùng thử (demo), vui lòng dùng máy chủ chính thức.\",\r\n  \"Alert_Invalid_Instance\": \"Papillon không thể lấy thông tin từ máy chủ PRONOTE này, nó còn hoạt động không?\",\r\n  \"Alert_No_Pos\": \"Không thể lấy vị trí của bạn\",\r\n  \"Alert_Connexion_Fail\": \"Không thể kết nối\",\r\n\r\n  \"Feature_Limited\": \"Tính năng hạn chế\",\r\n  \"Feature_Soon\": \"Sắp ra mắt!\",\r\n  \"Feature_Soon_Notification\": \"Chúng tôi đang nỗ lực để mang tính năng này đến bạn trong bản cập nhật tới.\",\r\n  \"Feature_Add_Card\": \"Thêm thẻ mới từ tab Cá nhân trên thanh điều hướng\",\r\n\r\n  \"Webview_Wait\": \"Vui lòng chờ một chút...\",\r\n\r\n  \"Profile_QRCards\": \"Mã QR và thẻ\",\r\n  \"Profile_QRCards_Subtitle\": \"{{count}} thẻ\",\r\n  \"Profile_Cards_Loading_History\": \"Đang tải lịch sử giao dịch\",\r\n  \"Profile_Cards_Loading_History_Description\": \"Việc này có thể mất một lúc...\",\r\n\r\n  \"Settings_Cards_Banner_Title\": \"Thẻ\",\r\n  \"Settings_Cantineen_Subtitle_Card\": \"Căng-tin, ra vào\",\r\n  \"Settings_Cards_Banner_Description\": \"Thêm thẻ căng-tin hoặc thẻ xe của bạn để dùng ngay trên điện thoại qua Papillon\",\r\n  \"Settings_Cards_None_Title\": \"Không có thẻ\",\r\n  \"Settings_Cards_Add_Button\": \"Thêm\",\r\n\r\n  \"Settings_Cards_None_Description\": \"Thêm thẻ để xem số dư căng-tin, quét mã QR và nhiều hơn nữa\",\r\n  \"Settings_Subjects_None_Title\": \"Không có môn học\",\r\n  \"Settings_Subjects_None_Description\": \"Duyệt qua các tab khác của ứng dụng để có thể tùy chỉnh môn học.\",\r\n  \"Settings_Subjects_Reset_Title\": \"Đặt lại\",\r\n  \"Settings_Subjects_Reset_Message\": \"Bạn có thực sự muốn đặt lại tất cả môn học không?\",\r\n  \"Settings_Subjects_Reset_Button\": \"Đặt lại\",\r\n\r\n  \"Settings_Donator\": \"Người ủng hộ\",\r\n  \"Settings_Donator_Description\": \"Xem danh sách những người ủng hộ\",\r\n  \"Settings_App_Version\": \"Phiên bản ứng dụng\",\r\n\r\n  \"Profile_Cards_Scan_Orientation\": \"Hướng mã QR về phía máy quét của trạm\",\r\n  \"Profile_Cards_No_Reservation\": \"Không có lịch đặt\",\r\n  \"Profile_Cards_No_Available_Reservation\": \"Có vẻ như bạn không thể đặt lịch vào ngày này.\",\r\n  \"Profile_Cards_History\": \"Lịch sử\",\r\n  \"Magic_Important\": \"Có thể quan trọng\",\r\n\r\n  \"OnBoarding_Step\": \"Bước \",\r\n  \"OnBoarding_Step_Of\": \"trên \",\r\n\r\n  \"Consent_Advanced_Title\": \"Tôi muốn giúp Papillon\",\r\n  \"Consent_Advanced_Description\": \"Chúng tôi thu thập thông tin chi tiết hơn về cách bạn sử dụng ứng dụng.\",\r\n  \"Consent_Required_Title\": \"Chỉ những thông tin thiết yếu\",\r\n  \"Consent_Required_Description\": \"Tóm lại là để biết có người đang dùng Papillon, ứng dụng hoạt động ổn không và bạn đang dùng dịch vụ nào.\",\r\n  \"Consent_None_Title\": \"Không gì cả\",\r\n  \"Consent_None_Description\": \"Chúng tôi sẽ không hề biết đến sự tồn tại của bạn trên hệ thống.\",\r\n  \"Consent_Title\": \"Bạn và Papillon\",\r\n  \"Consent_Intro1\": \"Để giúp Papillon phát triển, bạn có thể chọn chia sẻ một số thông tin sử dụng.\",\r\n  \"Consent_PrivacyPolicy\": \"Nếu có thắc mắc, hãy xem chính sách bảo mật của chúng tôi\",\r\n  \"Consent_Refuse\": \"Từ chối\",\r\n  \"Consent_Accept\": \"Chấp nhận\",\r\n  \"Consent_ChangeMind\": \"Bạn có thể thay đổi quyết định bất cứ lúc nào trong phần cài đặt ứng dụng.\",\r\n  \"Consent_Arg1\": \"Chỉ dùng để cải thiện ứng dụng\",\r\n  \"Consent_Arg2\": \"Ẩn danh và không liên kết với danh tính của bạn\",\r\n  \"Consent_Arg3\": \"Chúng tôi không có quyền truy cập vào tài khoản của bạn\",\r\n\r\n  \"Changelog_Title\": \"Nhật ký thay đổi\",\r\n\r\n  \"Tasks_Sorting_Methods_DueDate\": \"Ngày hạn chót\",\r\n  \"Tasks_Sorting_Methods_Subject\": \"Môn học\",\r\n  \"Tasks_Sorting_Methods_Done\": \"Chưa hoàn thành\",\r\n  \"Tasks_ThisWeek\": \"Tuần này\",\r\n\r\n  \"Task_Undone\": \"Chưa hoàn thành\",\r\n  \"Task_Done\": \"Đã hoàn thành\",\r\n\r\n  \"Modal_Wallpaper_Title\": \"Tùy chỉnh hình nền\",\r\n  \"Modal_Profile_Title\": \"Tùy chỉnh hồ sơ\",\r\n\r\n  \"Modal_Task_Status\": \"Trạng thái bài tập\",\r\n  \"Modal_Task_Description\": \"Mô tả bài tập\",\r\n  \"Modal_Task_Attachments\": \"Tệp đính kèm\",\r\n\r\n  \"Today\": \"Hôm nay\",\r\n  \"Yesterday\": \"Hôm qua\",\r\n  \"Tomorrow\": \"Ngày mai\"\r\n}"
  },
  {
    "path": "metro.config.js",
    "content": "/* eslint-disable @typescript-eslint/no-require-imports */\n/* eslint-disable no-undef */\n// Learn more https://docs.expo.io/guides/customizing-metro\n\nconst { getDefaultConfig } = require(\"expo/metro-config\");\n\n/** @type {import('expo/metro-config').MetroConfig} */\nconst config = getDefaultConfig(__dirname);\n\nconfig.resolver.assetExts.push(\"tflite\", \"json\", \"txt\");\n\nmodule.exports = config;\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"papillon\",\n  \"main\": \"expo-router/entry\",\n  \"version\": \"8.4.1\",\n  \"scripts\": {\n    \"start\": \"expo start\",\n    \"android\": \"expo run:android\",\n    \"ios\": \"expo run:ios\",\n    \"web\": \"expo start --web\",\n    \"test\": \"jest --watchAll\",\n    \"lint\": \"eslint --fix\",\n    \"format\": \"prettier --write .\",\n    \"format:check\": \"prettier --check .\",\n    \"postinstall\": \"patch-package\"\n  },\n  \"jest\": {\n    \"preset\": \"jest-expo\"\n  },\n  \"dependencies\": {\n    \"@aramir/react-native-barcode\": \"^1.0.2\",\n    \"@babel/plugin-proposal-decorators\": \"^7.28.0\",\n    \"@blockshub/blocksdirecte\": \"^0.0.8-alpha\",\n    \"@bottom-tabs/react-navigation\": \"^0.11.2\",\n    \"@callstack/liquid-glass\": \"^0.4.3\",\n    \"@eslint/js\": \"^9.39.1\",\n    \"@expo/metro-config\": \"~55.0.9\",\n    \"@expo/ngrok\": \"^4.1.3\",\n    \"@expo/ui\": \"~55.0.8\",\n    \"@expo/vector-icons\": \"^15.0.2\",\n    \"@getpapillon/papicons\": \"^0.2.1\",\n    \"@legendapp/list\": \"^2.0.15\",\n    \"@nozbe/watermelondb\": \"^0.28.0\",\n    \"@react-native-community/datetimepicker\": \"8.6.0\",\n    \"@react-native-masked-view/masked-view\": \"^0.3.2\",\n    \"@react-native-menu/menu\": \"^2.0.0\",\n    \"@react-navigation/elements\": \"^2.9.2\",\n    \"@react-navigation/native\": \"^7.1.8\",\n    \"@react-navigation/native-stack\": \"^7.3.16\",\n    \"@sbaiahmed1/react-native-blur\": \"^4.2.1\",\n    \"@shopify/flash-list\": \"2.0.2\",\n    \"@shopify/react-native-skia\": \"2.4.18\",\n    \"@types/uuid\": \"^10.0.0\",\n    \"alise-api\": \"^0.2.5\",\n    \"appscho\": \"file:./stubs/appscho\",\n    \"buffer\": \"^6.0.3\",\n    \"countly-sdk-react-native-bridge\": \"^25.4.1\",\n    \"date-fns\": \"^4.1.0\",\n    \"eslint-plugin-react\": \"^7.37.5\",\n    \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n    \"esup-multi.js\": \"^1.0.4\",\n    \"expo\": \"~55.0.0\",\n    \"expo-asset\": \"~55.0.12\",\n    \"expo-audio\": \"~55.0.11\",\n    \"expo-battery\": \"~55.0.11\",\n    \"expo-blur\": \"~55.0.12\",\n    \"expo-build-properties\": \"~55.0.11\",\n    \"expo-camera\": \"~55.0.13\",\n    \"expo-crypto\": \"~55.0.12\",\n    \"expo-dev-client\": \"~55.0.22\",\n    \"expo-device\": \"~55.0.12\",\n    \"expo-fetcher\": \"^0.9.1\",\n    \"expo-file-system\": \"~55.0.14\",\n    \"expo-font\": \"~55.0.6\",\n    \"expo-haptics\": \"~55.0.11\",\n    \"expo-image-picker\": \"~55.0.16\",\n    \"expo-linear-gradient\": \"~55.0.11\",\n    \"expo-linking\": \"~55.0.11\",\n    \"expo-localization\": \"~55.0.11\",\n    \"expo-location\": \"~55.1.6\",\n    \"expo-network\": \"~55.0.11\",\n    \"expo-notifications\": \"~55.0.16\",\n    \"expo-router\": \"~55.0.10\",\n    \"expo-secure-store\": \"~55.0.11\",\n    \"expo-splash-screen\": \"~55.0.15\",\n    \"expo-status-bar\": \"~55.0.5\",\n    \"expo-system-ui\": \"~55.0.13\",\n    \"expo-video\": \"~55.0.13\",\n    \"expo-web-browser\": \"~55.0.12\",\n    \"ezly\": \"^1.4.3\",\n    \"fflate\": \"^0.8.2\",\n    \"i18next\": \"^25.7.2\",\n    \"ical.js\": \"^2.2.1\",\n    \"lottie-react-native\": \"^7.3.4\",\n    \"lucide-react-native\": \"^0.511.0\",\n    \"patch-package\": \"^8.0.1\",\n    \"pawnote\": \"^1.6.2\",\n    \"react\": \"19.2.0\",\n    \"react-dom\": \"19.2.0\",\n    \"react-i18next\": \"^15.7.4\",\n    \"react-native\": \"0.83.4\",\n    \"react-native-bottom-tabs\": \"^1.1.0\",\n    \"react-native-dynamic-theme\": \"^0.3.4\",\n    \"react-native-edge-to-edge\": \"1.6.0\",\n    \"react-native-fast-tflite\": \"^1.6.1\",\n    \"react-native-gesture-handler\": \"~2.30.0\",\n    \"react-native-graph\": \"^1.1.0\",\n    \"react-native-htmlview\": \"^0.17.0\",\n    \"react-native-linear-gradient\": \"^2.8.3\",\n    \"react-native-mmkv\": \"^3.3.3\",\n    \"react-native-qrcode-svg\": \"^6.3.15\",\n    \"react-native-reanimated\": \"4.2.1\",\n    \"react-native-safe-area-context\": \"~5.6.0\",\n    \"react-native-screen-transitions\": \"^2.0.3\",\n    \"react-native-screens\": \"~4.23.0\",\n    \"react-native-svg\": \"15.15.3\",\n    \"react-native-web\": \"^0.21.2\",\n    \"react-native-webview\": \"13.16.0\",\n    \"react-native-worklets\": \"0.7.2\",\n    \"skolengojs\": \"^1.1.10\",\n    \"turboself-api\": \"^2.1.9\",\n    \"typescript-eslint\": \"^8.49.0\",\n    \"zustand\": \"^5.0.9\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.28.5\",\n    \"@types/react\": \"~19.2.10\",\n    \"eslint-config-prettier\": \"^10.1.8\",\n    \"eslint-plugin-prettier\": \"^5.5.4\",\n    \"eslint-plugin-unused-imports\": \"^4.3.0\",\n    \"jest\": \"^29.7.0\",\n    \"jest-expo\": \"~55.0.13\",\n    \"prettier\": \"^3.7.4\",\n    \"react-test-renderer\": \"19.0.0\",\n    \"typescript\": \"~5.9.3\"\n  },\n  \"private\": true,\n  \"reanimated\": {\n    \"staticFeatureFlags\": {\n      \"ANDROID_SYNCHRONOUSLY_UPDATE_UI_PROPS\": true,\n      \"IOS_SYNCHRONOUSLY_UPDATE_UI_PROPS\": true,\n      \"USE_COMMIT_HOOK_ONLY_FOR_REACT_COMMITS\": true\n    }\n  }\n}\n"
  },
  {
    "path": "patches/countly-sdk-react-native-bridge+25.4.0.patch",
    "content": "diff --git a/node_modules/countly-sdk-react-native-bridge/lib/configuration_interfaces/countly_config_limits.js b/node_modules/countly-sdk-react-native-bridge/lib/configuration_interfaces/countly_config_limits.js\nindex ed410a8..8faf712 100644\n--- a/node_modules/countly-sdk-react-native-bridge/lib/configuration_interfaces/countly_config_limits.js\n+++ b/node_modules/countly-sdk-react-native-bridge/lib/configuration_interfaces/countly_config_limits.js\n@@ -8,12 +8,12 @@\n // You can chain multiple configurations.\n class CountlyConfigSDKInternalLimits {\n     constructor() {\n-        _maxKeyLength = 0;\n-        _maxValueSize = 0;\n-        _maxSegmentationValues = 0;\n-        _maxBreadcrumbCount = 0;\n-        _maxStackTraceLinesPerThread = 0;\n-        _maxStackTraceLineLength = 0;\n+        this._maxKeyLength = 0;\n+        this._maxValueSize = 0;\n+        this._maxSegmentationValues = 0;\n+        this._maxBreadcrumbCount = 0;\n+        this._maxStackTraceLinesPerThread = 0;\n+        this._maxStackTraceLineLength = 0;\n     }\n \n     // getters\n"
  },
  {
    "path": "patches/react-native-fast-tflite+1.6.1.patch",
    "content": "diff --git a/node_modules/react-native-fast-tflite/android/CMakeLists.txt b/node_modules/react-native-fast-tflite/android/CMakeLists.txt\nindex 100468c..e43cc1f 100644\n--- a/node_modules/react-native-fast-tflite/android/CMakeLists.txt\n+++ b/node_modules/react-native-fast-tflite/android/CMakeLists.txt\n@@ -36,6 +36,12 @@ add_library(\n   src/main/cpp/Tflite.cpp\n )\n \n+target_link_options(${PACKAGE_NAME}\n+    PRIVATE\n+    \"-Wl,-z,max-page-size=16384\"\n+    \"-Wl,-z,common-page-size=16384\"\n+)\n+\n # Specifies a path to native header files.\n target_include_directories(\n   ${PACKAGE_NAME}\n@@ -43,6 +49,7 @@ target_include_directories(\n   \"../cpp\"\n   \"src/main/cpp\"\n   \"src/main/cpp/lib/litert/headers\"\n+  \"src/main/cpp/lib/litert/headers/tflite\"\n   \"${NODE_MODULES_DIR}/react-native/ReactCommon\"\n   \"${NODE_MODULES_DIR}/react-native/ReactCommon/callinvoker\"\n   \"${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/jni/react/turbomodule\" # <-- CallInvokerHolder JNI wrapper\ndiff --git a/node_modules/react-native-fast-tflite/android/build.gradle b/node_modules/react-native-fast-tflite/android/build.gradle\nindex 0083618..3aa1edb 100644\n--- a/node_modules/react-native-fast-tflite/android/build.gradle\n+++ b/node_modules/react-native-fast-tflite/android/build.gradle\n@@ -1,4 +1,5 @@\n import java.nio.file.Paths\n+import org.gradle.api.file.RelativePath\n \n buildscript {\n   repositories {\n@@ -126,25 +127,44 @@ dependencies {\n   implementation \"com.facebook.react:react-native:+\"\n \n   // Tensorflow Lite .aar (includes C API via prefabs)\n-  implementation \"com.google.ai.edge.litert:litert:1.0.1\"\n-  extractSO(\"com.google.ai.edge.litert:litert:1.0.1\")\n-  extractHeaders(\"com.google.ai.edge.litert:litert:1.0.1\")\n+  implementation \"com.google.ai.edge.litert:litert:1.4.0\"\n+  extractSO(\"com.google.ai.edge.litert:litert:1.4.0\")\n+  extractHeaders(\"com.google.ai.edge.litert:litert:1.4.0\")\n \n   // Tensorflow Lite GPU delegate\n-  implementation \"com.google.ai.edge.litert:litert-gpu:1.0.1\"\n-  extractSO(\"com.google.ai.edge.litert:litert-gpu:1.0.1\")\n-  extractHeaders(\"com.google.ai.edge.litert:litert-gpu:1.0.1\")\n+  implementation \"com.google.ai.edge.litert:litert-gpu:1.4.0\"\n+  extractSO(\"com.google.ai.edge.litert:litert-gpu:1.4.0\")\n+  extractHeaders(\"com.google.ai.edge.litert:litert-gpu:1.4.0\")\n+}\n+\n+task cleanEmptyDirectories(type: Delete) {\n+  delete 'src/main/cpp/lib/headers'\n+  delete 'src/main/cpp/lib/res'\n }\n \n task extractAARHeaders {\n+  finalizedBy cleanEmptyDirectories\n   doLast {\n-    configurations.extractHeaders.files.each {\n-      def file = it.absoluteFile\n-      def packageName = file.name.tokenize('-')[0]\n+    configurations.extractHeaders.files.each { aarFile ->\n+      def packageName = aarFile.name.tokenize('-')[0]\n       copy {\n-        from zipTree(file)\n-        into \"src/main/cpp/lib/$packageName/\"\n+        from zipTree(aarFile)\n+        into \"src/main/cpp/lib/\"\n         include \"**/*.h\"\n+        eachFile { fileCopyDetails ->\n+          if (fileCopyDetails.name.endsWith(\".h\")) {\n+            def originalRelativePath = fileCopyDetails.relativePath.toString()\n+            if (originalRelativePath.startsWith(\"headers/external/org_tensorflow/tensorflow/\")) {\n+              def newRelativePath = packageName + \"/headers/\" + originalRelativePath.substring(\"headers/external/org_tensorflow/\".length())\n+              fileCopyDetails.relativePath = new RelativePath(true, newRelativePath.split('/'))\n+            } else {\n+              def newRelativePath = packageName + \"/\" + originalRelativePath\n+              fileCopyDetails.relativePath = new RelativePath(true, newRelativePath.split('/'))\n+            }\n+          } else {\n+            exclude fileCopyDetails.name\n+          }\n+        }\n       }\n     }\n   }\ndiff --git a/node_modules/react-native-fast-tflite/android/gradle.properties b/node_modules/react-native-fast-tflite/android/gradle.properties\nindex 42a799a..46a02f8 100644\n--- a/node_modules/react-native-fast-tflite/android/gradle.properties\n+++ b/node_modules/react-native-fast-tflite/android/gradle.properties\n@@ -1,5 +1,5 @@\n-Tflite_kotlinVersion=1.7.0\n-Tflite_minSdkVersion=21\n-Tflite_targetSdkVersion=31\n-Tflite_compileSdkVersion=31\n-Tflite_ndkversion=21.4.7075529\n+Tflite_kotlinVersion=2.1.10\n+Tflite_minSdkVersion=26\n+Tflite_targetSdkVersion=36\n+Tflite_compileSdkVersion=36\n+Tflite_ndkversion=27.1.12297006\ndiff --git a/node_modules/react-native-fast-tflite/cpp/TensorHelpers.cpp b/node_modules/react-native-fast-tflite/cpp/TensorHelpers.cpp\nindex 10446ca..6456e6b 100644\n--- a/node_modules/react-native-fast-tflite/cpp/TensorHelpers.cpp\n+++ b/node_modules/react-native-fast-tflite/cpp/TensorHelpers.cpp\n@@ -9,7 +9,7 @@\n #include \"TensorHelpers.h\"\n \n #ifdef ANDROID\n-#include <tensorflow/lite/c/c_api.h>\n+#include <tflite/c/c_api.h>\n #else\n #include <TensorFlowLiteC/TensorFlowLiteC.h>\n #endif\ndiff --git a/node_modules/react-native-fast-tflite/cpp/TensorHelpers.h b/node_modules/react-native-fast-tflite/cpp/TensorHelpers.h\nindex fac1c11..22ba35b 100644\n--- a/node_modules/react-native-fast-tflite/cpp/TensorHelpers.h\n+++ b/node_modules/react-native-fast-tflite/cpp/TensorHelpers.h\n@@ -12,7 +12,7 @@\n #include <jsi/jsi.h>\n \n #ifdef ANDROID\n-#include <tensorflow/lite/c/c_api.h>\n+#include <tflite/c/c_api.h>\n #else\n #include <TensorFlowLiteC/TensorFlowLiteC.h>\n #endif\ndiff --git a/node_modules/react-native-fast-tflite/cpp/TensorflowPlugin.cpp b/node_modules/react-native-fast-tflite/cpp/TensorflowPlugin.cpp\nindex 36e1887..4993607 100644\n--- a/node_modules/react-native-fast-tflite/cpp/TensorflowPlugin.cpp\n+++ b/node_modules/react-native-fast-tflite/cpp/TensorflowPlugin.cpp\n@@ -18,9 +18,9 @@\n #include <thread>\n \n #ifdef ANDROID\n-#include <tensorflow/lite/c/c_api.h>\n-#include <tensorflow/lite/delegates/gpu/delegate.h>\n-#include <tensorflow/lite/delegates/nnapi/nnapi_delegate_c_api.h>\n+#include <tflite/c/c_api.h>\n+#include <tflite/delegates/gpu/delegate.h>\n+#include <tflite/delegates/nnapi/nnapi_delegate_c_api.h>\n #else\n #include <TensorFlowLiteC/TensorFlowLiteC.h>\n \ndiff --git a/node_modules/react-native-fast-tflite/cpp/TensorflowPlugin.h b/node_modules/react-native-fast-tflite/cpp/TensorflowPlugin.h\nindex 0da4822..9266d17 100644\n--- a/node_modules/react-native-fast-tflite/cpp/TensorflowPlugin.h\n+++ b/node_modules/react-native-fast-tflite/cpp/TensorflowPlugin.h\n@@ -16,7 +16,7 @@\n \n #ifdef ANDROID\n #include <ReactCommon/CallInvoker.h>\n-#include <tensorflow/lite/c/c_api.h>\n+#include <tflite/c/c_api.h>\n #else\n #include <React-callinvoker/ReactCommon/CallInvoker.h>\n #include <TensorFlowLiteC/TensorFlowLiteC.h>"
  },
  {
    "path": "scripts/generateEmojiList.sh",
    "content": "#!/bin/bash\n\nUNICODE_EMOJI_DATA=$(curl https://unicode.org/Public/emoji/latest/emoji-test.txt);\nIS_FIRST_GROUP=0;\n\nget_icon() {\n  case \"$1\" in\n    smileys_and_emotion) echo \"Emoji\" ;;\n    people_and_body) echo \"Accessibility\" ;;\n    component) echo \"Code\" ;;\n    animals_and_nature) echo \"Butterfly\" ;;\n    food_and_drink) echo \"Cutlery\" ;;\n    travel_and_places) echo \"Bus\" ;;\n    activities) echo \"Palette\" ;;\n    objects) echo \"Archive\" ;;\n    symbols) echo \"Grid\" ;;\n    flags) echo \"MapPin\" ;;\n    *) echo \"\" ;;\n  esac\n}\n\necho 'export const UnicodeEmojis = {'\n\nwhile IFS= read -r line; do\n  if [[ \"$line\" == \"# group: \"* ]]; then\n    GROUP=${line##*: }\n    FORMATED_GROUP_NAME=$(echo \"$GROUP\" \\\n      | tr '[:upper:]' '[:lower:]' \\\n      | sed 's/&/and/g; s/[^a-z0-9]/_/g; s/__*/_/g; s/^_//; s/_$//')\n    ICON=$(get_icon \"$FORMATED_GROUP_NAME\")\n\n    if [ \"$IS_FIRST_GROUP\" -eq 1 ]; then\n      echo -e ']\\n\\t},'\n    fi\n\n    echo -ne \"\\t$FORMATED_GROUP_NAME: { \\n\\t\\ticon: \\\"$ICON\\\",\\n\\t\\temojis: [\"\n\n    IS_FIRST_GROUP=1\n  fi\n\n  if [[ \"$line\" == *\"; fully-qualified\"* ]]; then\n    EMOJI_LINE=(\"$line\")\n    EMOJI_HEX=${EMOJI_LINE[0]};\n    echo -n \"0x$EMOJI_HEX, \"\n  fi\ndone <<< \"$UNICODE_EMOJI_DATA\"\n\necho -e ']\\n\\t}\\n};';"
  },
  {
    "path": "services/alise/balance.ts",
    "content": "import { Client } from \"alise-api\";\n\nimport { detectMealPrice } from \"@/utils/restaurant/detect-price\";\n\nimport { Balance } from \"../shared/balance\";\n\nexport async function fetchAliseBalance(session: Client, accountId: string): Promise<Balance[]> {\n  try {\n    const account = await session.getInformations();\n    \n    if (!account) {\n      console.warn(\"No account information available\");\n      return [];\n    }\n    \n    let mealPrice = 0;\n    let lunchRemaining = 0;\n    \n    try {\n      const history = await session.getFinancialHistory();\n      if (history && Array.isArray(history)) {\n        const mappedHistory = history.map(event => ({\n          date: event.date,\n          label: event.label,\n          currency: \"€\",\n          amount: event.amount * 100,\n          createdByAccount: accountId\n        }));\n        \n        const detectedPrice = detectMealPrice(mappedHistory);\n        \n        if (detectedPrice && detectedPrice > 0) {\n          mealPrice = detectedPrice;\n          lunchRemaining = Math.floor((account.balance * 100) / mealPrice);\n        } else {\n          mealPrice = 0;\n          lunchRemaining = 0;\n        }\n      }\n    } catch (error) {\n      console.warn(\"Error while detecting meal prices:\", error);\n    }\n    \n    return [{\n      amount: account.balance * 100,\n      currency: \"€\",\n      lunchRemaining: lunchRemaining,\n      lunchPrice: mealPrice,\n      label: \"Solde\",\n      createdByAccount: accountId\n    }];\n  } catch (error) {\n    console.error(\"Error retrieving Alise balance:\", error);\n    return [];\n  }\n}\n"
  },
  {
    "path": "services/alise/history.ts",
    "content": "import { Client } from \"alise-api\";\nimport { CanteenHistoryItem } from \"../shared/canteen\";\n\nexport async function fetchAliseHistory(session: Client, accountId: string): Promise<CanteenHistoryItem[]> {\n  try {\n    const history = await session.getFinancialHistory();\n    \n    if (!history || !Array.isArray(history)) {\n      console.warn(\"No financial history available or invalid format\");\n      return [];\n    }\n    \n    const mappedHistory = history.map(event => ({\n      date: event.date || new Date(),\n      label: event.label || \"Transaction sans libellé\",\n      currency: \"€\",\n      amount: (event.amount || 0) * 100,\n      createdByAccount: accountId\n    }));\n    \n    const uniqueHistory = mappedHistory.filter((item, index, array) => {\n      return array.findIndex(other => {\n        const itemDay = new Date(item.date.getFullYear(), item.date.getMonth(), item.date.getDate());\n        const otherDay = new Date(other.date.getFullYear(), other.date.getMonth(), other.date.getDate());\n        const sameDay = itemDay.getTime() === otherDay.getTime();\n        \n        const sameAmount = other.amount === item.amount;\n        \n        return sameDay && sameAmount;\n      }) === index;\n    });\n    \n    return uniqueHistory.sort((a, b) => b.date.getTime() - a.date.getTime());\n    \n  } catch (error) {\n    console.error(\"Error while retrieving Alise history:\", error);\n    return [];\n  }\n}\n"
  },
  {
    "path": "services/alise/index.ts",
    "content": "import { Client } from \"alise-api\";\nimport { Auth, Services } from \"@/stores/account/types\";\nimport { error } from \"@/utils/logger/logger\";\nimport { Balance } from \"../shared/balance\";\nimport { CanteenHistoryItem } from \"../shared/canteen\";\nimport { Capabilities, SchoolServicePlugin } from \"../shared/types\";\nimport { fetchAliseBalance } from \"./balance\";\nimport { fetchAliseHistory } from \"./history\";\nimport { refreshAliseAccount } from \"./refresh\";\n\nexport class Alise implements SchoolServicePlugin {\n  displayName = \"Alise\";\n  service = Services.ALISE;\n  capabilities: Capabilities[] = [\n    Capabilities.REFRESH,\n    Capabilities.CANTEEN_BALANCE,\n    Capabilities.CANTEEN_HISTORY\n  ];\n  session: any = undefined;\n  authData: Auth = {};\n  accountId: string;\n  tokenExpiration?: Date;\n\n  constructor(accountId: string) {\n    this.accountId = accountId;\n  }\n\n  checkTokenValidty = () => true;\n\n  async refreshAccount(credentials: Auth): Promise<Alise> {\n    try {\n      const refresh = await refreshAliseAccount(this.accountId, credentials);\n      this.authData = refresh.auth;\n      this.session = refresh.session;\n      return this;\n    } catch (refreshError) {\n      error(\"Failed to refresh Alise account\", \"Alise.refreshAccount\");\n    }\n  }\n\n  async getCanteenBalances(): Promise<Balance[]> {\n    if (!this.session) {\n      error(\"Session is not valid\", \"Alise.getCanteenBalances\");\n    }\n    try {\n      return await fetchAliseBalance(this.session, this.accountId);\n    } catch (err) {\n      error(\"Failed to fetch canteen balances\", \"Alise.getCanteenBalances\");\n    }\n  }\n\n  async getCanteenTransactionsHistory(): Promise<CanteenHistoryItem[]> {\n    if (!this.session) {\n      error(\"Session is not valid\", \"Alise.getCanteenTransactionsHistory\");\n    }\n    try {\n      return await fetchAliseHistory(this.session, this.accountId);\n    } catch (err) {\n      error(\"Failed to fetch canteen history\", \"Alise.getCanteenTransactionsHistory\");\n    }\n  }\n\n\n}\n"
  },
  {
    "path": "services/alise/refresh.ts",
    "content": "import { authenticateWithCredentials, Client } from \"alise-api\";\nimport { Auth } from \"@/stores/account/types\";\n\nexport async function refreshAliseAccount(accountId: string, credentials: Auth): Promise<{auth: Auth, session: Client}> {\n  try {\n    const username = String(credentials.additionals?.[\"username\"] ?? \"\");\n    const password = String(credentials.additionals?.[\"password\"] ?? \"\");\n    const site = String(credentials.additionals?.[\"site\"] ?? \"\");\n    \n    if (!username || !password || !site) {\n      throw new Error(\"Identifiants manquants pour l'authentification Alise\");\n    }\n    \n    const session = await authenticateWithCredentials(username, password, site);\n    \n    if (!session) {\n      throw new Error(\"Échec de l'authentification Alise - session invalide\");\n    }\n    \n    if (!session.account) {\n      throw new Error(\"Authentification Alise réussie mais données de compte manquantes\");\n    }\n    \n    return { auth: credentials, session };\n  } catch (error) {\n    console.error(\"Erreur lors du refresh du compte Alise:\", error);\n    const errorMessage = error instanceof Error ? error.message : String(error);\n    throw new Error(`Échec du refresh Alise: ${errorMessage}`);\n  }\n}\n"
  },
  {
    "path": "services/appscho/index.ts",
    "content": "import { Capabilities, SchoolServicePlugin } from \"@/services/shared/types\";\nimport { Auth, Services } from \"@/stores/account/types\";\nimport { User } from \"appscho\";\nimport { refreshAppSchoAccount } from \"./refresh\";\nimport { error } from \"@/utils/logger/logger\";\nimport { CourseDay } from \"@/services/shared/timetable\";\nimport { fetchAppschoTimetable } from \"@/services/appscho/timetable\";\nimport { News } from \"@/services/shared/news\";\nimport { fetchAppschoNews } from \"@/services/appscho/news\";\n\nexport class Appscho implements SchoolServicePlugin {\n  displayName = \"AppScho\";\n  service = Services.APPSCHO;\n  capabilities: Capabilities[] = [Capabilities.REFRESH, Capabilities.TIMETABLE, Capabilities.NEWS];\n  session: User | undefined;\n  authData: Auth = {};\n\n  constructor(public accountId: string) {}\n\n  async refreshAccount(credentials: Auth): Promise<Appscho> {\n    try {\n      const refresh = await refreshAppSchoAccount(this.accountId, credentials);\n      \n      this.authData = refresh.auth;\n      this.session = refresh.session;\n      \n      return this;\n    } catch (refreshError) {\n      error(`Failed to refresh AppScho account: ${refreshError}`, \"Appscho.refreshAccount\");\n      throw refreshError;\n    }\n  }\n\n  async getWeeklyTimetable(weekNumber: number, date: Date, forceRefresh?: boolean): Promise<CourseDay[]> {\n    if (this.session) {\n      const instanceId = String(this.authData.additionals?.[\"instanceId\"]);\n      return fetchAppschoTimetable(this.session, this.accountId, weekNumber, instanceId, forceRefresh);\n    }\n\n    error(\"Session is not valid\", \"Appscho.getWeeklyTimetable\");\n  }\n\n  async getNews(): Promise<News[]> {\n\n    if (this.session) {\n      const instanceId = String(this.authData.additionals?.[\"instanceId\"]);\n      return fetchAppschoNews(this.session, this.accountId, instanceId);\n    }\n\n    error(\"Session is not valid\", \"Appscho.getNews\");\n  }\n}"
  },
  {
    "path": "services/appscho/news.ts",
    "content": "import { getNewsFeed, User, NewsFeed, INSTANCES } from \"appscho\";\nimport { News } from \"@/services/shared/news\";\nimport { AttachmentType } from \"@/services/shared/attachment\";\n\nexport async function fetchAppschoNews(_session: User, accountId: string, instanceId: string): Promise<News[]> {\n  const newsItems = await getNewsFeed(instanceId) as NewsFeed[];\n  \n  return newsItems.map(item => {\n    const attachments = [];\n    \n    if (item.picture) {\n      attachments.push({\n        type: AttachmentType.FILE,\n        name: \"Image\",\n        url: item.picture,\n        createdByAccount: accountId,\n      });\n    }\n\n    if (item.url) {\n      attachments.push({\n        type: AttachmentType.LINK,\n        name: \"Lien vers l'article\",\n        url: item.url,\n        createdByAccount: accountId,\n      });\n    }\n    return {\n      id: item.url,\n      title: item.title,\n      createdAt: new Date(item.start.replace(\" +0000\", \"\").replace(\" \", \"T\") + \"Z\"),\n      acknowledged: false,\n      attachments: attachments.filter(attachment => attachment.url),\n      content: item.content,\n      author: INSTANCES.find(inst => inst.id === instanceId)?.name ?? \"Auteur inconnu\",\n      category: item.type,\n      createdByAccount: accountId,\n    };\n  }).sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n}"
  },
  {
    "path": "services/appscho/refresh.ts",
    "content": "import { Auth } from \"@/stores/account/types\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { loginWithCredentials, refreshOAuthTokenWithUser, User } from \"appscho\";\n\nexport async function refreshAppSchoAccount(\n  accountId: string,\n  credentials: Auth\n): Promise<{ auth: Auth; session: User }> {\n  throw new Error(\"AppScho service is currently unavailable\");\n  const additionals = credentials.additionals || {};\n  const instanceId = additionals[\"instanceId\"];\n  const refreshToken = additionals[\"refreshToken\"];\n  const username = additionals[\"username\"];\n  const password = additionals[\"password\"];\n\n  if (!instanceId) {\n    throw new Error(\"instanceId is required\");\n  }\n\n  let session: User;\n  const authData: Auth = { additionals: { instanceId } };\n\n  try {\n    if (refreshToken) {\n      session = await refreshOAuthTokenWithUser(String(instanceId), String(refreshToken));\n      authData.additionals!.refreshToken = refreshToken;\n    } else if (username && password) {\n      session = await loginWithCredentials(String(instanceId), String(username), String(password));\n      authData.additionals!.username = username;\n      authData.additionals!.password = password;\n    } else {\n      throw new Error(\"No refresh method available - missing both refresh token and credentials\");\n    }\n  } catch (error) {\n    throw new Error(\n      `Failed to refresh AppScho session: ${error}`\n    );\n  }\n\n  useAccountStore.getState().updateServiceAuthData(accountId, authData);\n\n  return { auth: authData, session };\n}\n"
  },
  {
    "path": "services/appscho/timetable.ts",
    "content": "import { User, getPlanning, Lesson } from \"appscho\";\nimport { getDateRangeOfWeek } from \"@/database/useHomework\";\nimport { Course, CourseDay, CourseType } from \"../shared/timetable\";\nimport { parseADEDescription } from \"../local/parsers/ade-parser\";\n\nfunction parseAppschoDate(dateStr: string): Date {\n  if (!dateStr) return new Date(NaN);\n  return new Date(dateStr.replace(\" \", \"T\").replace(\" +0000\", \"Z\"));\n}\n\nexport async function fetchAppschoTimetable(\n  session: User,\n  accountId: string,\n  weekNumber: number,\n  instanceId: string,\n  _forceRefresh?: boolean\n): Promise<CourseDay[]> {\n  const { start, end } = getDateRangeOfWeek(weekNumber);\n  try {\n    const planning = await getPlanning(instanceId, session.token);\n    if(!planning || planning.length === 0) {\n      Error('Une erreur est survenue lors de la récupération de l\\'emploi du temps. Veuillez réessayer ultérieurement.');\n    }\n    const weekEvents = planning.filter((lesson: Lesson) => {\n      const lessonDate = parseAppschoDate(lesson.dtstart);\n      return lessonDate >= start && lessonDate <= end;\n    });\n    const eventsByDate = new Map<string, Lesson[]>();\n    weekEvents.forEach((lesson: Lesson) => {\n      const lessonDate = parseAppschoDate(lesson.dtstart);\n      const dateKey = lessonDate.toISOString().split('T')[0];\n      const existing = eventsByDate.get(dateKey) || [];\n      existing.push(lesson);\n      eventsByDate.set(dateKey, existing);\n    });\n    const result: CourseDay[] = [];\n    for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {\n      const dateKey = d.toISOString().split('T')[0];\n      const dayEvents = eventsByDate.get(dateKey) || [];\n      result.push({\n        date: new Date(d),\n        courses: mapAppschoCourses(dayEvents, accountId)\n      });\n    }\n    return result;\n  } catch (error) {\n    throw new Error(`Failed to fetch AppScho timetable: ${error}`);\n  }\n}\n\n\n\nfunction mapAppschoCourses(lessons: Lesson[], accountId: string): Course[] {\n  return lessons\n    .map((lesson) => {\n      const parsed = parseADEDescription(lesson.description || '');\n      const group = parsed?.groups?.join(', ') || parsed?.group || undefined;\n      const teacher = parsed?.teacher || undefined;\n      const courseType = parsed?.type;\n\n      let subjectName = lesson.summary || \"Cours\";\n      if (courseType && !subjectName.includes(courseType)) {\n        subjectName = `${subjectName} (${courseType})`;\n      }\n\n      return {\n        subject: subjectName,\n        id: lesson.uid || `${lesson.dtstart}-${lesson.summary}`,\n        type: CourseType.LESSON,\n        from: parseAppschoDate(lesson.dtstart),\n        to: parseAppschoDate(lesson.dtend),\n        additionalInfo: lesson.description,\n        room: lesson.locations && lesson.locations.length > 0 ? lesson.locations.join(\", \") : lesson.location,\n        teacher,\n        group,\n        backgroundColor: \"#1E3035\",\n        status: undefined,\n        createdByAccount: accountId,\n      };\n    })\n    .sort((a, b) => a.from.getTime() - b.from.getTime());\n}"
  },
  {
    "path": "services/ard/balance.ts",
    "content": "import { Auth } from \"@/stores/account/types\";\nimport { Balance } from \"../shared/balance\";\n// import { Client } from \"pawrd\";\n\nexport async function fetchArdBalance(\n  session: Client,\n  accountId: string,\n  auth: Auth\n): Promise<Balance[]> {\n  return [];\n  const lunchPrice = Number(auth.additionals?.[\"mealPrice\"] ?? 0)\n  const payments = await session.getOnlinePayments();\n\n  return payments.walletData.map(wallet => ({\n    amount: wallet.walletAmount ?? 0,\n    currency: \"€\",\n    lunchRemaining: 0,\n    lunchPrice,\n    label: wallet.walletName ?? \"Solde\",\n    createdByAccount: accountId,\n  }));\n}\n"
  },
  {
    "path": "services/ard/history.ts",
    "content": "// import { Client } from \"pawrd\";\nimport { CanteenHistoryItem } from \"../shared/canteen\";\nimport { error } from \"@/utils/logger/logger\";\n\nexport async function fetchARDHistory(\n  session: Client,\n  accountId: string\n): Promise<CanteenHistoryItem[]> {\n  return [];\n  const uid = await session.getOnlinePayments().then((payments) => payments.user.uid);\n  if (!uid) {\n    error(\"An error occured during UID retrieving\")\n  }\n\n  let [financialHistory, ordersHistory, consumptionsHistory] = await Promise.all([\n    session.getFinancialHistory(uid),\n    session.getOrdersHistory(uid),\n    session.getConsumptionsHistory(uid)\n  ]);\n\n  return [\n    ...financialHistory.map(item => ({\n        date: new Date(item.operationDate * 1000),\n        label: item.operationName,\n        currency: \"€\",\n        amount: ((item.credit ?? 0) - (item.debit ?? 0)),\n        createdByAccount: accountId\n    })),\n    ...ordersHistory.map(item => ({\n        date: new Date(item.orderDate * 1000),\n        label: \"Transaction n°\" + item.orderReference.toString(),\n        currency: \"€\",\n        amount: item.amount,\n        createdByAccount: accountId\n    })),\n    ...consumptionsHistory.map(item => ({\n        date: new Date(item.consumptionDate * 1000),\n        label: item.consumptionDescription,\n        currency: \"€\",\n        amount: -item.amount,\n        createdByAccount: accountId\n    }))\n  ]\n}\n"
  },
  {
    "path": "services/ard/index.ts",
    "content": "import { Auth, Services } from \"@/stores/account/types\";\nimport { Capabilities, SchoolServicePlugin } from \"../shared/types\";\n// import { Client } from \"pawrd\";\nimport { refreshArdAccount } from \"./refresh\";\nimport { Balance } from \"../shared/balance\";\nimport { error } from \"@/utils/logger/logger\";\nimport { fetchArdBalance } from \"./balance\";\nimport { CanteenHistoryItem } from \"../shared/canteen\";\nimport { fetchARDHistory } from \"./history\";\n\nexport class ARD implements SchoolServicePlugin {\n  displayName = \"ARD\";\n  service = Services.ARD;\n  capabilities: Capabilities[] = [Capabilities.REFRESH];\n  session: Client | undefined = undefined;\n  authData: Auth = {};\n\n  constructor(public accountId: string) {}\n\n  private async initCapabilities() {\n  return [];\n    setTimeout(() => {\n      this.capabilities.push(Capabilities.CANTEEN_BALANCE, Capabilities.CANTEEN_HISTORY)\n    }, 3000)\n  }\n\n  async refreshAccount(credentials: Auth): Promise<ARD> {\n  return [];\n    const refresh = await refreshArdAccount(this.accountId, credentials);\n    this.authData = refresh.auth;\n    this.session = refresh.session;\n    this.initCapabilities()\n    return this;\n  }\n\n  async getCanteenBalances(): Promise<Balance[]> {\n  return [];\n    if (this.session) {\n      return fetchArdBalance(this.session, this.accountId, this.authData);\n    }\n\t\t\n    error(\"Session is not valid\", \"ARD.getCanteenBalances\");\n  }\n\n  async getCanteenTransactionsHistory(): Promise<CanteenHistoryItem[]> {\n  return [];\n    if (this.session) {\n      return fetchARDHistory(this.session, this.accountId)\n    }\n\n    error(\"Session is not valid\", \"ARD.getCanteenTransactionsHistory\")\n  }\n}\n"
  },
  {
    "path": "services/ard/refresh.ts",
    "content": "// import { Authenticator, Client } from \"pawrd\";\n\nimport { Auth } from \"@/stores/account/types\";\n\nexport async function refreshArdAccount(\n  accountId: string,\n  credentials: Auth,\n  retryCount: number = 0\n): Promise<{ auth: Auth; session: Client }> {\n  throw new Error(\"ARD service is currently unavailable\");\n  try {\n    const username = String(credentials.additionals?.[\"username\"] ?? \"\");\n    const password = String(credentials.additionals?.[\"password\"] ?? \"\");\n    const schoolId = String(credentials.additionals?.[\"schoolId\"] ??\"\");\n\n    const authenticator = new Authenticator();\n    const client = await authenticator.fromCredentials(schoolId, username, password);\n    \n    return { auth: credentials, session: client };\n  } catch (error) {\n    if (retryCount < 3) {\n      await new Promise(resolve => setTimeout(resolve, 1000));\n      return refreshArdAccount(accountId, credentials, retryCount + 1);\n    }\n    throw error;\n  }\n}\n"
  },
  {
    "path": "services/ecoledirecte/attendance.ts",
    "content": "import { Client, SchoolLifeAttendanceItem,SchoolLifeAttendanceItemType, SchoolLifeConductItem } from \"@blockshub/blocksdirecte\";\n\nimport { error, warn } from \"@/utils/logger/logger\";\n\nimport { Absence, Attendance, Delay, Punishment } from \"../shared/attendance\";\nimport { durationToMinutes } from \"../skolengo/attendance\";\n\nexport async function fetchEDAttendance(session: Client, accountId: string): Promise<Attendance> {\n  try {\n    const attendance = await session.schoollife.getSchoolLife()\n    const punishments = mapEcoleDirectePunishments(attendance.sanctionsEncouragements, accountId);\n    const absences = mapEcoleDirecteAbsences(attendance.absencesRetards, accountId);\n    const delays = mapEcoleDirecteDelays(attendance.absencesRetards, accountId);\n    return {\n      absences: absences,\n      punishments,\n      delays,\n      observations: [],\n      createdByAccount: accountId\n    }\n  } catch (error) {\n    warn(String(error))\n    return {\n      absences: [],\n      punishments: [],\n      delays: [],\n      observations: [],\n      createdByAccount: accountId\n    }\n  }\n}\n\nfunction mapEcoleDirecteAbsences(data: SchoolLifeAttendanceItem[], accountId: string): Absence[] {\n  return data\n    .filter(item => item.typeElement === SchoolLifeAttendanceItemType.ABSENCE)\n    .map(item => {\n      const { start, end } = mapStringToDates(item.displayDate);\n      return {\n        id: String(item.id),\n        from: start,\n        to: end,\n        reason: item.motif,\n        justified: item.justifie,\n        timeMissed: durationToMinutes(start.getTime(), end.getTime()),\n        createdByAccount: accountId\n      };\n    });\n}\n\nfunction mapEcoleDirecteDelays(data: SchoolLifeAttendanceItem[], accountId: string): Delay[] {\n  return data\n    .filter(item => item.typeElement === SchoolLifeAttendanceItemType.DELAY)\n    .map(item => {\n      const { start, end } = mapStringToDates(item.displayDate);\n      return {\n        id: String(item.id),\n        givenAt: new Date(item.date),\n        reason: item.motif,\n        justified: item.justifie,\n        duration: durationToMinutes(start.getTime(), end.getTime()),\n        createdByAccount: accountId\n      };\n    });\n}\n\nfunction mapEcoleDirectePunishments(data: SchoolLifeConductItem[], accountId: string): Punishment[] {\n  return data.map(item => ({\n    id: String(item.id),\n    givenAt: new Date(item.dateDeroulement),\n    givenBy: [item.auteur.prenom, item.auteur.nom].join(\" \"),\n    exclusion: false,\n    duringLesson: false,\n    homework: {\n      text: item.aFaire,\n      documents: []\n    },\n    reason: {\n      text: item.motif,\n      circumstances: item.commentaire,\n      documents: []\n    },\n    nature: \"\",\n    duration: mapStringToDuration(item.displayDate) ?? 0,\n    createdByAccount: accountId\n  }))\n}\n\nfunction mapStringToDates(str: string): { start: Date, end: Date } {\n  const months: Record<string, number> = {\n    \"janvier\": 1,\n    \"février\": 2,\n    \"mars\": 3,\n    \"avril\": 4,\n    \"mai\": 5,\n    \"juin\": 6,\n    \"juillet\": 7,\n    \"août\": 8,\n    \"septembre\": 9,\n    \"octobre\": 10,\n    \"novembre\": 11,\n    \"décembre\": 12\n  };\n\n  if (str.includes(\"du\")) {\n    const splittedStr = str.split(\" \");\n\n    const duIndex = splittedStr.indexOf(\"du\");\n    const auIndex = splittedStr.indexOf(\"au\");\n\n    if (duIndex !== -1 && auIndex !== -1) {\n      const dayStart = parseInt(splittedStr[duIndex + 2]);\n      const monthStart = months[splittedStr[duIndex + 3]] ?? 0;\n      const yearStart = parseInt(splittedStr[duIndex + 4]);\n\n      const dayEnd = parseInt(splittedStr[auIndex + 2]);\n      const monthEnd = months[splittedStr[auIndex + 3]] ?? 0;\n      const yearEnd = parseInt(splittedStr[auIndex + 4]);\n\n      const startDate = new Date(yearStart, monthStart - 1, dayStart);\n      const endDate = new Date(yearEnd, monthEnd - 1, dayEnd);\n\n      return {\n        start: startDate,\n        end: endDate\n      }\n    }\n  }\n\n  if (str.includes(\"le\")) {\n    const parts = str.split(\"à\");\n    let startDate: string;\n    let endDate: string;\n\n    if (!str.includes(\":\")) {\n      startDate = `${parts[0].replace(\"le\", \"\").trim()} de 00:00`;\n      endDate = `${parts[0].split(\"de\")[0].replace(\"le\", \"\").trim()} de 23:59`;\n    } else {\n      startDate = parts[0].replace(\"le\", \"\").trim();\n      endDate = `${parts[0].split(\"de\")[0].replace(\"le\", \"\").trim()} de ${parts[1].trim()}`;\n    }\n\n    const start = new Date(startDate);\n    const end = new Date(endDate);\n    return { start, end }\n  }\n\n  throw error(\"Invalid Display Date\", \"mapStringToDates\");\n}\n\nfunction mapStringToDuration(str: string): number | undefined {\n  const months: Record<string, number> = {\n    \"janvier\": 1,\n    \"février\": 2,\n    \"mars\": 3,\n    \"avril\": 4,\n    \"mai\": 5,\n    \"juin\": 6,\n    \"juillet\": 7,\n    \"août\": 8,\n    \"septembre\": 9,\n    \"octobre\": 10,\n    \"novembre\": 11,\n    \"décembre\": 12\n  };\n\n  if (str.includes(\"du\")) {\n    const splittedStr = str.split(\" \");\n\n    const duIndex = splittedStr.indexOf(\"du\");\n    const auIndex = splittedStr.indexOf(\"au\");\n\n    if (duIndex !== -1 && auIndex !== -1) {\n      const dayStart = parseInt(splittedStr[duIndex + 2]);\n      const monthStart = months[splittedStr[duIndex + 3]] ?? 0;\n      const yearStart = parseInt(splittedStr[duIndex + 4]);\n\n      const dayEnd = parseInt(splittedStr[auIndex + 2]);\n      const monthEnd = months[splittedStr[auIndex + 3]] ?? 0;\n      const yearEnd = parseInt(splittedStr[auIndex + 4]);\n\n      const startDate = new Date(yearStart, monthStart - 1, dayStart);\n      const endDate = new Date(yearEnd, monthEnd - 1, dayEnd);\n\n      const durationMs = endDate.getTime() - startDate.getTime();\n      const durationDays = Math.floor(durationMs / (1000 * 60 * 60 * 24)) + 1;\n      return durationDays;\n    }\n  }\n\n  throw error(\"Invalid Display Date\", \"mapStringToDuration\");\n}"
  },
  {
    "path": "services/ecoledirecte/balance.ts",
    "content": "import { Session } from \"pawdirecte\";\n\nimport { Balance } from \"@/services/shared/balance\";\n\ninterface EDBalanceElement {\n  couleurPastille: string;\n  date: string;\n  infoComp: string;\n  lettrage: string;\n  libelle: string;\n  montant: number;\n}\n\ninterface EDBalanceResponse {\n  code: number;\n  token: string;\n  host: string;\n  data: {\n    comptes: Array<{\n      avenir: Array<any>,\n      codeCompte: string,\n      disponible: boolean,\n      ecritures: Array<EDBalanceElement>,\n      id: number,\n      idEleve: number,\n      idServiceClasse: number,\n      isPMPayable: boolean,\n      libelle: string,\n      libelleCompte: string,\n      montantModifiable: boolean,\n      montantVersement: number,\n      quantiteModifiable: boolean,\n      solde: number,\n      typeCompte: string,\n    }>,\n    parametrage: {\n      paiementSoldeCrediteur: boolean,\n      porteMonnaie: boolean,\n    }\n  }\n}\n\nexport async function fetchEDBalances(session: Session): Promise<Balance[]> {\n  const f = await fetch(\"https://api.ecoledirecte.com/v3/comptes/detail.awp?verbe=get&v=7.0.1\", {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/x-www-form-urlencoded\",\n      \"User-Agent\": \"Android EDMOBILE v7.0.1\",\n      \"X-Token\": session.token!,\n    },\n    body: 'data={}'\n  });\n  const json: EDBalanceResponse = await f.json();\n\n  return json.data.comptes.map(compte => ({\n    amount: compte.solde * 100,\n    currency: \"€\",\n    lunchRemaining: 0,\n    lunchPrice: 0,\n    label: compte.libelleCompte,\n  })) as Balance[];\n}"
  },
  {
    "path": "services/ecoledirecte/chat.ts",
    "content": "import { Account, readMessage, Session, studentReceivedMessages } from \"pawdirecte\";\n\nimport { warn } from \"@/utils/logger/logger\";\n\nimport { AttachmentType } from \"../shared/attachment\";\nimport { Chat, Message } from \"../shared/chat\";\n\nexport async function fetchEDChats(session: Session, account: Account, accountId: string): Promise<Chat[]> {\n  try {\n    const chats = await studentReceivedMessages(session, account);\n    return chats.chats.map(chat => ({\n      id: String(chat.id),\n      subject: chat.subject,\n      createdByAccount: accountId,\n      creator: chat.sender,\n      date: chat.date\n    }))\n  } catch (error) {\n    warn(String(error))\n    return []\n  }\n}\n\nconst cleanMessage = (message: string) => {\n  return message.replace(/>\\s+/g, \">\").replace(/&nbsp;/g, \" \");\n};\n\nexport async function fetchEDChatMessage(session: Session, account: Account, accountId: string, chat: Chat): Promise<Message[]> {\n  const message = await readMessage(session, account, Number(chat.id))\n  return [{\n    id: String(message.id),\n    content: cleanMessage(message.content),\n    author: message.sender,\n    date: message.date,\n    subject: message.subject,\n    attachments: message.files.map(attachment => ({\n      type: AttachmentType.FILE,\n      name: attachment.name,\n      url: String(attachment.id),\n      createdByAccount: accountId\n    }))\n  }]\n}\n\n"
  },
  {
    "path": "services/ecoledirecte/grades.ts",
    "content": "\nimport { Client } from \"@blockshub/blocksdirecte\";\n\nimport { getSubjectAverage } from \"@/utils/grades/algorithms/subject\";\nimport { warn } from \"@/utils/logger/logger\";\n\nimport { Grade, GradeScore, Period, PeriodGrades, Subject } from \"../shared/grade\";\n\nexport async function fetchEDGradePeriods(session: Client, accountId: string): Promise<Period[]> {\n  try {\n    const overview = await session.marks.getMark()\n    return overview.periodes.map(period => ({\n      name: period.periode,\n      id: period.codePeriode,\n      start: new Date(period.dateDebut),\n      end: new Date(period.dateFin),\n      createdByAccount: accountId\n    }))\n  } catch {\n    return []\n  }\n}\n\nexport async function fetchEDGrades(session: Client, accountId: string, period: Period): Promise<PeriodGrades> {\n  try {\n    const overview = await session.marks.getMark()\n    const periodReport = overview.periodes.find(item => item.idPeriode === period.id)\n    const grades = overview.notes.filter(grade => grade.codePeriode === period.id)\n    \n    if (!overview || !periodReport) {\n      warn(\"Invalid grades data structure or period not found\")\n      return {\n        createdByAccount: accountId,\n        classAverage: { value: 16.66, disabled: true },\n        studentOverall: { value: 16.66, disabled: true },\n        subjects: []\n      }\n    }\n    \n    const subjects: Record<string, Subject> = {}\n    const allMappedGrades: Grade[] = grades.map(g => ({\n      id: String(g.id),\n      subjectId: g.codeMatiere,\n      subjectName: g.libelleMatiere,\n      description: g.commentaire,\n      givenAt: new Date(g.date),\n      subjectFile: undefined,\n      correctionFile: undefined,\n      bonus: false,\n      optional: g.nonSignificatif,\n      outOf: parseGradeValue(g.noteSur),\n      coefficient: Number(g.coef),\n      studentScore: parseGradeValue(g.valeur),\n      averageScore: parseGradeValue(g.moyenneClasse),\n      minScore: parseGradeValue(g.minClasse),\n      maxScore: parseGradeValue(g.maxClasse),\n      createdByAccount: accountId\n    }))\n    \n    for (const subject of periodReport.ensembleMatieres.disciplines) {\n      const parsedAverage = parseGradeValue(subject.moyenne)\n      const grades = allMappedGrades.filter(grade => grade.subjectId === subject.codeMatiere)\n      subjects[subject.codeMatiere] = {\n        id: subject.codeMatiere,\n        name: subject.discipline,\n        studentAverage: parsedAverage.status === \"Inconnu\" ? { value: getSubjectAverage(grades) } : parsedAverage,\n        classAverage: parseGradeValue(subject.moyenneClasse),\n        maximum: parseGradeValue(subject.moyenneMax),\n        minimum: parseGradeValue(subject.moyenneMin),\n        outOf: { value: 20 },\n        grades\n      }\n    }\n\n    const average = grades.length > 0 \n      ? grades.reduce((sum, grade) => sum + Number(grade.valeur), 0) / grades.length \n      : 0;\n    const subjectValues = Object.values(subjects);\n    const classAverage = subjectValues.length > 0 \n      ? subjectValues.reduce((sum, subject) => sum + subject.classAverage.value, 0) / subjectValues.length \n      : 0;\n\n    return {\n      studentOverall: { value: average },\n      classAverage: { value: classAverage },\n      subjects: Object.values(subjects).filter(subject => subject.grades?.length),\n      createdByAccount: accountId\n    }\n  } catch (error) {\n    warn(String(error))\n    return {\n      createdByAccount: accountId,\n      classAverage: { value: 16.66, disabled: true },\n      studentOverall: { value: 16.66, disabled: true },\n      subjects: []\n    }\n  }\n}\n\nfunction parseGradeValue(value: string): GradeScore {\n  const score = parseFloat(value.replace(',', '.'));\n  if (typeof score === 'number' && !isNaN(score)) {\n    return { value: score };\n  }\n  return { value: NaN, disabled: true, status: \"Inconnu\" };\n}"
  },
  {
    "path": "services/ecoledirecte/homework.ts",
    "content": "\nimport { Client } from \"@blockshub/blocksdirecte\";\n\nimport { Homework } from \"../shared/homework\";\n\nexport async function fetchEDHomeworks(\n  session: Client,\n  accountId: string,\n  weekNumber: number\n): Promise<Homework[]> {\n  const weekdays = weekNumberToDaysList(weekNumber);\n  const response: Homework[] = [];\n  for (const date of weekdays) {\n    const formattedDate = formatDate(date);\n\n    const { matieres } = await session.homework.getHomeworksForDate(formattedDate);\n\n    for (const subject of matieres) {\n      const homework = subject.aFaire\n      response.push({\n        attachments: [],\n        content: homework?.contenu ?? \"\",\n        isDone: homework?.effectue ?? false,\n        dueDate: date,\n        id: String(homework?.idDevoir),\n        subject: subject.matiere.length > 0 ? subject.matiere : subject.entityLibelle,\n        evaluation: false,\n        custom: false,\n        createdByAccount: accountId\n      });\n    }\n  }\n\n  return response\n}\n\nexport async function setEDHomeworkAsDone(session: Client, homework: Homework, state?: boolean): Promise<Homework> {\n  const finalState = state ?? !homework.isDone\n  const homeworkId = Number(homework.id)\n  \n  if (finalState) {\n    await session.homework.markHomeworkAsDone(homeworkId)\n  } else {\n    await session.homework.markHomeworkAsUndone(homeworkId)\n  }\n  return {\n    ...homework,\n    isDone: finalState\n  }\n}\n\nimport { addDays,format,startOfISOWeek } from \"date-fns\";\n\nexport const weekNumberToDaysList = (weekNumber: number, year?: number): Date[] => {\n  const currentYear = year || new Date().getFullYear();\n  \n  // Trouver le premier jour ISO de l'année (lundi de la semaine 1)\n  const jan4 = new Date(currentYear, 0, 4); \n  const firstWeekStart = startOfISOWeek(jan4);\n  \n  // Calculer le lundi de la semaine demandée\n  const weekStart = new Date(firstWeekStart);\n  weekStart.setDate(firstWeekStart.getDate() + (weekNumber - 1) * 7);\n\n  // Construire la liste des jours\n  return Array.from({ length: 7 }, (_, i) => addDays(weekStart, i));\n};\n\nexport const formatDate = (date: Date): string => {\n  return format(date, \"yyyy-MM-dd\");\n};"
  },
  {
    "path": "services/ecoledirecte/index.ts",
    "content": "import { Client } from \"@blockshub/blocksdirecte\";\n\nimport { Auth, Services } from \"@/stores/account/types\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport { Attendance } from \"../shared/attendance\";\nimport { Period, PeriodGrades } from \"../shared/grade\";\nimport { Homework } from \"../shared/homework\";\nimport { News } from \"../shared/news\";\nimport { CourseDay } from \"../shared/timetable\";\nimport { Capabilities, SchoolServicePlugin } from \"../shared/types\";\nimport { fetchEDAttendance } from \"./attendance\";\nimport { fetchEDGradePeriods, fetchEDGrades } from \"./grades\";\nimport { fetchEDHomeworks, setEDHomeworkAsDone } from \"./homework\";\nimport { fetchEDNews } from \"./news\";\nimport { refreshEDAccount } from \"./refresh\";\nimport { fetchEDTimetable } from \"./timetable\";\n\nexport class EcoleDirecte implements SchoolServicePlugin {\n  displayName = \"EcoleDirecte\";\n  service = Services.ECOLEDIRECTE;\n  capabilities: Capabilities[] = [\n    Capabilities.REFRESH, \n    Capabilities.NEWS, \n    Capabilities.ATTENDANCE, \n    Capabilities.GRADES,\n    Capabilities.HOMEWORK,\n    Capabilities.TIMETABLE\n  ];\n  session: Client | undefined;\n  authData: Auth = {};\n\n  constructor(public accountId: string) {}\n\n  async refreshAccount(credentials: Auth): Promise<EcoleDirecte> {\n    const refresh = (await refreshEDAccount(this.accountId, credentials))\n\n    this.authData = refresh.auth\n    this.session = refresh.account\n\n    return this;\n  }\n\n  async getHomeworks(weekNumber: number): Promise<Homework[]> {\n    if (this.session) {\n      return fetchEDHomeworks(this.session, this.accountId, weekNumber);\n    }\n\n    throw error(\"Session or account is not valid\", \"EcoleDirecte.getHomeworks\")\n  }\n\n  async getNews(): Promise<News[]> {\n    if (this.session) {\n      return fetchEDNews(this.session, this.accountId);\n    }\n\n    throw error(\"Session or account is not valid\", \"EcoleDirecte.getNews\");\n  }\n\n  async getGradesForPeriod(period: Period): Promise<PeriodGrades> {\n    if (this.session) {\n      return fetchEDGrades(this.session, this.accountId, period)\n    }\n\t\t\n    throw error(\"Session or account is not valid\", \"EcoleDirecte.getGradesForPeriod\");\n  }\n\n  async getGradesPeriods(): Promise<Period[]> {\n    if (this.session) {\n      return fetchEDGradePeriods(this.session, this.accountId)\n    }\n\t\t\n    throw error(\"Session or account is not valid\", \"EcoleDirecte.getGradesPeriods\");\n  }\n\n  async getAttendanceForPeriod(): Promise<Attendance> {\n    if (this.session) {\n      return fetchEDAttendance(this.session, this.accountId);\n    }\n\n    throw error(\"Session or account is not valid\", \"EcoleDirecte.getAttendanceForPeriod\");\n  }\n\n  async getWeeklyTimetable(weekNumber: number, date: Date): Promise<CourseDay[]> {\n    if (this.session) {\n      return fetchEDTimetable(this.session, this.accountId, weekNumber)\n    }\n\n    throw error(\"Session or account is not valid\", \"EcoleDirecte.getWeeklyTimetable\")\n  }\n\n  async setHomeworkCompletion(homework: Homework, state?: boolean): Promise<Homework> {\n    if (this.session) {\n      return setEDHomeworkAsDone(this.session, homework, state)\n    }\n\n    throw error(\"Session or account is not valid\", \"EcoleDirecte.setHomeworkCompletion\");\n  }\n}"
  },
  {
    "path": "services/ecoledirecte/news.ts",
    "content": "import { Client } from \"@blockshub/blocksdirecte\";\n\nimport { warn } from \"@/utils/logger/logger\";\n\nimport { News } from \"../shared/news\";\n\nexport async function fetchEDNews(session: Client, accountId: string): Promise<News[]> {\n  try {\n    const news = (await session.timeline.getPublicTimeline()).postits\n    return news.map(item => ({\n      id: String(item.id),\n      createdAt: new Date(item.dateCreation),\n      createdByAccount: accountId,\n      acknowledged: true,\n      attachments: [],\n      content: item.contenu,\n      author: [item.auteur.prenom, item.auteur.nom].join(\" \"),\n      category: \"Actualités\"\n    }))\n  } catch (error) {\n    warn(String(error))\n    return []\n  }\n}"
  },
  {
    "path": "services/ecoledirecte/qrcode.ts",
    "content": "import { QRCode, QRType } from \"@/services/shared/canteen\";\nimport { Account } from \"pawdirecte\";\n\nexport function fetchEDQRCode(account: Account): QRCode {\n  for (const module of account.modules) {\n    if (module.code === \"CANTINE_BARCODE\" && module.enable) {\n      return {\n        type: QRType.QRCode,\n        data: module.params.numeroBadge,\n        createdByAccount: String(account.id)\n      }\n    }\n  }\n\n  return {\n    type: QRType.QRCode,\n    data: \"\",\n    createdByAccount: String(account.id)\n  }\n}"
  },
  {
    "path": "services/ecoledirecte/refresh.ts",
    "content": "import { Client } from \"@blockshub/blocksdirecte\";\n\nimport { useAccountStore } from \"@/stores/account\";\nimport { Auth } from \"@/stores/account/types\";\n\nexport async function refreshEDAccount(accountId: string, credentials: Auth): Promise<{auth: Auth, account: Client }> {\n  const client = new Client();\n  await client.auth.refreshToken(\n    credentials.additionals![\"username\"] as string,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    \"E\" as any,\n    credentials.additionals![\"token\"]  as string,\n    undefined,\n    undefined,\n    credentials.additionals![\"deviceUUID\"]  as string\n  )\n\n  client.auth.setAccount(0);\n  const account = client.auth.getAccount()\n\n  const auth: Auth = {\n    additionals: {\n      \"username\": credentials.additionals![\"username\"],\n      \"token\": account.accessToken,\n      \"deviceUUID\": credentials.additionals![\"deviceUUID\"]\n    }\n  }\n  \n  useAccountStore.getState().updateServiceAuthData(accountId, auth);\n\n  return {\n    auth,\n    account: client\n  }\n}"
  },
  {
    "path": "services/ecoledirecte/timetable.ts",
    "content": "import { Client, TimetableCourse, TimetableCourseType } from \"@blockshub/blocksdirecte\";\n\nimport { getDateRangeOfWeek } from \"@/database/useHomework\";\nimport { warn } from \"@/utils/logger/logger\";\n\nimport { Course, CourseDay, CourseStatus, CourseType } from \"../shared/timetable\";\n\nexport async function fetchEDTimetable(session: Client, accountId: string, weekNumber: number): Promise<CourseDay[]> {\n  try {\n    const { start, end } = getDateRangeOfWeek(weekNumber);\n\n    const timetable = (await session.timetable.getTimetableBetweenDates(start, end, false)).filter(course => course.codeMatiere !== \"\");\n    const mappedCourses = mapEcoleDirecteCourses(timetable, accountId);\n    const dayMap: Record<string, Course[]> = {};\n\n    for (const course of mappedCourses) {\n      const dayKey = course.from.toISOString().split(\"T\")[0];\n      dayMap[dayKey] = dayMap[dayKey] || [];\n      dayMap[dayKey].push(course);\n    }\n\n    for (const day in dayMap) {\n      dayMap[day].sort((a, b) => a.from.getTime() - b.from.getTime());\n    }\n\n    return Object.entries(dayMap).map(([day, courses]) => ({\n      date: new Date(day),\n      courses\n    }));\n  } catch(error) {\n    warn(String(error))\n    return []\n  }\n}\n\nfunction mapEcoleDirecteCourses(data: TimetableCourse[], accountId: string): Course[] {\n  return data.map(item => ({\n    createdByAccount: accountId,\n    subject: item.matiere,\n    id: String(item.id),\n    type: mapCourseKind(item.typeCours),\n    from: new Date(item.start_date),\n    to: new Date(item.end_date),\n    additionalInfo: item.text,\n    room: item.salle,\n    teacher: item.prof,\n    backgroundColor: item.color,\n    status: item.isAnnule ? CourseStatus.CANCELED : undefined\n  }))\n}\n\nfunction mapCourseKind(kind: TimetableCourseType): CourseType {\n  switch (kind) {\n  case TimetableCourseType.PERMANENCY:\n    return CourseType.ACTIVITY\n  default:\n    return CourseType.LESSON\n  }\n}"
  },
  {
    "path": "services/errors/AuthenticationError.ts",
    "content": "import { ServiceAccount } from \"@/stores/account/types\";\n\nexport class AuthenticationError extends Error {\n  public service: ServiceAccount\n\n  constructor(message: string, service: ServiceAccount){\n    super(message)\n    this.service = service\n  }\n}"
  },
  {
    "path": "services/izly/balances.ts",
    "content": "import { balance, Identification, TransactionGroup, operations } from \"ezly\";\nimport { Balance } from \"../shared/balance\";\n\nexport async function fetchIzlyBalances(accountId: string, session: Identification): Promise<Balance[]> {\n  const fetchedBalance = await balance(session);\n  const payments = await operations(session, TransactionGroup.Payments)\n  \n  const paysFullPrice = payments.filter((payment) => payment.amount === 3.30).length > 4;\n\n  const mealPrice = (paysFullPrice ? 3.30 : 1) * 100;\n  const remainingMeal = Math.floor(fetchedBalance.value / (mealPrice));\n  \n  return [\n    {\n      amount: fetchedBalance.value * 100,\n      currency: \"€\",\n      lunchRemaining: remainingMeal,\n      lunchPrice: mealPrice,\n      label: \"Self\",\n      createdByAccount: accountId\n    },\n    ...(fetchedBalance.cashValue > 0\n      ? [{\n          amount: fetchedBalance.cashValue * 100,\n          currency: \"€\",\n          lunchRemaining: remainingMeal,\n          lunchPrice: mealPrice,\n          label: \"Cash\",\n          createdByAccount: accountId\n        }]\n      : [])\n  ];\n}\n"
  },
  {
    "path": "services/izly/history.ts",
    "content": "import { Identification, TransactionGroup, operations } from \"ezly\";\nimport { CanteenHistoryItem } from \"../shared/canteen\";\n\nexport async function fetchIzlyHistory(accountId: string, session: Identification): Promise<CanteenHistoryItem[]> {\n  const payments = await operations(session, TransactionGroup.Payments)\n  const topups = await operations(session, TransactionGroup.TopUp)\n  const transfers = await operations(session, TransactionGroup.BankAccountTransfer)\n\n  const allTransactions = [\n    ...payments.map(item => ({\n      date: item.date,\n      label: \"Paiement\",\n      currency: \"€\",\n      amount: (item.isCredit ? item.amount : -item.amount) * 100,\n      createdByAccount: accountId\n    })),\n    ...topups.map(item => ({\n      date: item.date,\n      label: \"Rechargement\",\n      currency: \"€\",\n      amount: (item.isCredit ? item.amount : -item.amount) * 100,\n      createdByAccount: accountId\n    })),\n    ...transfers.map(item => ({\n      date: item.date,\n      label: \"Transfert\",\n      currency: \"€\",\n      amount: (item.isCredit ? item.amount : -item.amount) * 100,\n      createdByAccount: accountId\n    }))\n  ];\n\n  return allTransactions.sort((a, b) => b.date.getTime() - a.date.getTime());\n}"
  },
  {
    "path": "services/izly/index.ts",
    "content": "import { Auth, Services } from \"@/stores/account/types\";\nimport { Capabilities, SchoolServicePlugin } from \"../shared/types\";\nimport { refreshIzlyAccount } from \"./refresh\";\nimport { Identification } from \"ezly\";\nimport { Balance } from \"../shared/balance\";\nimport { fetchIzlyBalances } from \"./balances\";\nimport { error } from \"@/utils/logger/logger\";\nimport { CanteenHistoryItem, QRCode } from \"../shared/canteen\";\nimport { fetchIzlyHistory } from \"./history\";\nimport { fetchIzlyQRCode } from \"./qrcode\";\n\nexport class Izly implements SchoolServicePlugin {\n  displayName = \"Izly\";\n  service = Services.IZLY;\n  capabilities: Capabilities[] = [Capabilities.REFRESH, Capabilities.CANTEEN_BALANCE, Capabilities.CANTEEN_HISTORY, Capabilities.CANTEEN_QRCODE];\n  session: Identification | undefined;\n  authData: Auth = {};\n\n  constructor(public accountId: string) {}\n\n  async refreshAccount(credentials: Auth): Promise<Izly> {\n    const refresh = await refreshIzlyAccount(this.accountId, credentials)\n\n    this.authData = refresh.auth;\n    this.session = refresh.session;\n\n    return this;\n  }\n\n  async getCanteenBalances(): Promise<Balance[]> {\n    if (this.session) {\n      return fetchIzlyBalances(this.accountId, this.session)\n    }\n\n    error(\"Session is not valid\", \"Izly.getCanteenBalances\")\n  }\n\n  async getCanteenTransactionsHistory(): Promise<CanteenHistoryItem[]> {\n    if (this.session) {\n      return fetchIzlyHistory(this.accountId, this.session);\n    }\n\n    error(\"Session is not valid\", \"Izly.getCanteenTransactionsHistory\")\n  }\n\n  async getCanteenQRCodes(): Promise<QRCode> {\n    if (this.session) {\n      return fetchIzlyQRCode(this.accountId, this.session)\n    }\n\n    error(\"Session is not valid\", \"Izly.getCanteenQRCodes\")\n  }\n}"
  },
  {
    "path": "services/izly/qrcode.ts",
    "content": "import { Identification, qrPay } from \"ezly\";\nimport { QRCode, QRType } from \"../shared/canteen\";\n\nexport function fetchIzlyQRCode(accountId: string, session: Identification): QRCode {\n  const qr = qrPay(session);\n  return {\n    type: QRType.QRCode,\n    data: qr,\n    createdByAccount: accountId\n  }\n}"
  },
  {
    "path": "services/izly/refresh.ts",
    "content": "import { Auth } from \"@/stores/account/types\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { Identification, refresh } from \"ezly\";\n\nexport async function refreshIzlyAccount(accountId: string, credentials: Auth): Promise<{ auth: Auth; session: Identification }> {\n  const session = credentials.session as Identification;\n  const secret = String(credentials.additionals?.[\"secret\"]);\n\n  await refresh(session, secret);\n\n  const authData: Auth = {\n    session,\n    additionals: {\n      secret,\n    },\n  };\n\n  const store = useAccountStore.getState();\n  store.updateServiceAuthData(accountId, authData);\n\n  return {\n    auth: authData,\n    session\n  };\n}"
  },
  {
    "path": "services/lannion/attendance.ts",
    "content": "import { Absence, Attendance } from \"@/services/shared/attendance\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport { LannionAPI, LannionClient } from \"./module\";\nimport { LannionReleve } from \"./module/types\";\n\nexport async function fetchLannionAttendance(session: LannionClient, accountId: string, period: string): Promise<Attendance> {\n  try {\n    if (!session) {\n      error(\"Session is not valid\", \"fetchLannionAttendance\");\n      throw new Error(\"Session is not valid\");\n    }\n\n    const api = new LannionAPI(session);\n    const releveResult = await api.getReleveEtudiant(period);\n    \n    if (!releveResult.success || !releveResult.data) {\n      return {\n        delays: [],\n        absences: [],\n        punishments: [],\n        observations: [],\n        createdByAccount: accountId\n      };\n    }\n\n    const releve = releveResult.data as unknown as LannionReleve;\n    const absences = processAbsences(releve, accountId);\n\n    return {\n      delays: [],\n      absences,\n      punishments: [],\n      observations: [],\n      createdByAccount: accountId\n    };\n  } catch (e: unknown) {\n    const errorMessage = e instanceof Error ? e.message : String(e);\n    error(`[Lannion] Error in fetchLannionAttendance: ${errorMessage}`, 'fetchLannionAttendance');\n    error(\"Failed to get attendance for period\", \"fetchLannionAttendance\");\n    return {\n      delays: [],\n      absences: [],\n      punishments: [],\n      observations: [],\n      createdByAccount: accountId\n    };\n  }\n}\n\nfunction processAbsences(releve: LannionReleve, accountId: string): Absence[] {\n  const absences: Absence[] = [];\n  if (!releve.absences) {\n    return absences;\n  }\n\n  for (const [dateKey, dayAbsences] of Object.entries(releve.absences)) {\n    if (Array.isArray(dayAbsences)) {\n      for (const absence of dayAbsences) {\n        const from = new Date(dateKey);\n        const to = new Date(absence.dateFin || dateKey);\n        \n        if (absence.debut) {\n          from.setHours(Math.floor(absence.debut), (absence.debut % 1) * 60);\n        }\n        if (absence.fin) {\n          to.setHours(Math.floor(absence.fin), (absence.fin % 1) * 60);\n        }\n\n        absences.push({\n          id: absence.idAbs?.toString() || `${dateKey}-${absence.debut}`,\n          from,\n          to,\n          reason: absence.matiereComplet || undefined,\n          timeMissed: ((absence.fin || 0) - (absence.debut || 0)) || 0,\n          justified: absence.justifie || false,\n          createdByAccount: accountId\n        });\n      }\n    }\n  }\n  return absences;\n}\n"
  },
  {
    "path": "services/lannion/grades.ts",
    "content": "import { Grade, Period, PeriodGrades, Score,Subject } from \"@/services/shared/grade\";\nimport PapillonWeightedAvg from \"@/utils/grades/algorithms/weighted\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport { LannionAPI, LannionClient } from \"./module\";\nimport { LannionNote,LannionReleve, LannionRessource } from \"./module/types\";\n\nfunction safeParseFloat(value: string | null | undefined): number {\n  if (typeof value !== 'string') {\n    if (typeof value === 'number') {\n      return parseFloat(String(value));\n    }\n    return 0;\n  }\n  const parsed = parseFloat(value);\n  return isNaN(parsed) ? 0 : parsed;\n}\n\nfunction createScore(value: number, disabled: boolean = false, outOf?: number): Score {\n  return {\n    value,\n    disabled,\n    ...(outOf !== undefined && { outOf }),\n  };\n}\n\nfunction getGradeScore(note: LannionNote | undefined, key: 'value' | 'moy' | 'min' | 'max'): Score {\n  const valueString = note?.[key];\n  const value = safeParseFloat(valueString);\n  const isValidValue = (value !== 0 || valueString === \"0\");\n\n  if (isValidValue) {\n    return { value, status: \"\", disabled: false };\n  }\n\n  return { value: 0, status: \"N.not\", disabled: true };\n}\n\nfunction getSubjectAverageScore(ressource: LannionRessource, key: 'value' | 'moy' | 'min' | 'max'): Score {\n  const valueString = ressource.moyenne?.[key];\n  const value = safeParseFloat(valueString);\n  return createScore(value);\n}\n\nfunction getSubjectRankScore(ressource: LannionRessource): Score | undefined {\n  const rank = safeParseFloat(ressource.moyenne?.rang);\n  const total = safeParseFloat(ressource.moyenne?.total);\n\n  if (rank === 0 && total === 0) {\n    return undefined;\n  }\n\n  return createScore(rank, false, total);\n}\n\nfunction createEvaluationGrade(\n  ressource: LannionRessource,\n  evaluation: NonNullable<LannionRessource['evaluations']>[number],\n  subjectId: string,\n  subjectName: string,\n  accountId: string,\n): Grade {\n  const baseId = evaluation.id?.toString() || `${subjectId}-${evaluation.description || \"evaluation\"}`;\n  const coefficient = safeParseFloat(evaluation.coef);\n\n  return {\n    id: `${subjectId}-${baseId}`,\n    subjectId,\n    subjectName,\n    description: evaluation.description || \"\",\n    givenAt: new Date(evaluation.date || Date.now()),\n    outOf: createScore(20),\n    coefficient,\n    studentScore: getGradeScore(evaluation.note, 'value'),\n    averageScore: getGradeScore(evaluation.note, 'moy'),\n    minScore: getGradeScore(evaluation.note, 'min'),\n    maxScore: getGradeScore(evaluation.note, 'max'),\n    createdByAccount: accountId\n  };\n}\n\nfunction processRessourceGrades(ressource: LannionRessource, subjectId: string, subjectName: string, accountId: string): Grade[] {\n  if (!Array.isArray(ressource.evaluations) || ressource.evaluations.length === 0) {\n    return [];\n  }\n\n  return ressource.evaluations.map((evaluation) =>\n    createEvaluationGrade(ressource, evaluation, subjectId, subjectName, accountId)\n  );\n}\n\nfunction processUEGrades(ressource: LannionRessource, subjectId: string, subjectName: string, accountId: string, releveData: LannionReleve['relevé']): Grade[] {\n  const allSubjects = [];\n  const releve = releveData || {};\n\n  const keys = ['ressources', 'saes'] as const;\n\n  for (const key of keys) {\n    const items = ressource[key];\n    const releveItems = releve[key] || {};\n    if (typeof items === 'object' && items !== null) {\n      for (const [subKey, item] of Object.entries(items)) {\n        if (typeof item === 'object' && item !== null && 'moyenne' in item && 'coef' in item) {\n          const releveTitle = typeof releveItems === 'object' && releveItems !== null && releveItems[subKey] ? releveItems[subKey].titre : 'Inconnu';\n          allSubjects.push({\n            ...item,\n            name: `${subKey} - ${releveTitle}`,\n          });\n        }\n      }\n    }\n  }\n\n  return allSubjects.map((subject) => ({\n    id: subject.id || `${subjectId}-${subject.name}`,\n    description: subject.name,\n    studentScore: createScore(safeParseFloat(subject.moyenne)),\n    coefficient: safeParseFloat(subject.coef),\n    outOf: createScore(20),\n    subjectId: subjectId,\n    subjectName: subjectName,\n    createdByAccount: accountId\n  }));\n}\n\nfunction processSubjectData(\n  subjectKey: string,\n  subjectData: unknown,\n  accountId: string,\n  type: 'ressource' | 'sae' | 'ue',\n  releveData?: LannionReleve['relevé'],\n): Subject | null {\n  const ressource = subjectData as LannionRessource;\n\n  if (typeof subjectData !== 'object' || subjectData === null || !('titre' in ressource) || !('id' in ressource)) {\n    return null;\n  }\n\n  const isUE = type === 'ue';\n\n  if (!isUE && (!Array.isArray(ressource.evaluations) || ressource.evaluations.length === 0)) {\n    return null;\n  }\n\n  const fallbackKey = subjectKey.trim() !== \"\" ? subjectKey : \"Autre\";\n  let subjectName = String(ressource.titre || fallbackKey);\n  if (type === 'sae') {\n    subjectName = `${fallbackKey} - ${subjectName}`;\n  } else if (type === 'ue') {\n    subjectName = `${fallbackKey} - ${subjectName}`;\n  }\n\n  const subjectId = ressource.id?.toString() || fallbackKey;\n  let grades: Grade[] = [];\n\n  if (isUE) {\n    grades = processUEGrades(ressource, subjectId, subjectName, accountId, releveData);\n  } else {\n    grades = processRessourceGrades(ressource, subjectId, subjectName, accountId);\n  }\n\n  const avgSourceKey = isUE ? 'value' : 'studentScore';\n  const moySourceKey = isUE ? 'moy' : 'averageScore';\n  const minSourceKey = isUE ? 'min' : 'minScore';\n  const maxSourceKey = isUE ? 'max' : 'maxScore';\n\n  const studentAverage = isUE ? getSubjectAverageScore(ressource, avgSourceKey) : createScore(PapillonWeightedAvg(grades, avgSourceKey));\n  const classAverage = isUE ? getSubjectAverageScore(ressource, moySourceKey) : createScore(PapillonWeightedAvg(grades, moySourceKey));\n  const minimum = isUE ? getSubjectAverageScore(ressource, minSourceKey) : createScore(PapillonWeightedAvg(grades, minSourceKey));\n  const maximum = isUE ? getSubjectAverageScore(ressource, maxSourceKey) : createScore(PapillonWeightedAvg(grades, maxSourceKey));\n\n  return {\n    id: subjectId,\n    name: subjectName,\n    studentAverage,\n    classAverage,\n    minimum,\n    maximum,\n    outOf: createScore(20),\n    rank: isUE ? getSubjectRankScore(ressource) : undefined,\n    grades,\n  };\n}\n\nexport async function fetchLannionGrades(session: LannionClient, accountId: string, period: Period): Promise<PeriodGrades> {\n  const defaultGrades: PeriodGrades = {\n    studentOverall: createScore(0),\n    classAverage: createScore(0),\n    rank: createScore(0),\n    subjects: [],\n    modules: [],\n    createdByAccount: accountId\n  };\n\n  try {\n    if (!session || !period.id) {\n      error(\"Session or Period ID is not valid\", \"fetchLannionGrades\");\n      // Use the default grades instead of throwing if we want to prevent returning invalid data\n      return defaultGrades; \n    }\n\n    const api = new LannionAPI(session);\n    const releveResult = await api.getReleveEtudiant(period.id);\n\n    if (!releveResult.success || !releveResult.data) {\n      error(`API returned unsuccessful result or no data for period ${period.id}`, \"fetchLannionGrades\");\n      return defaultGrades;\n    }\n\n    const releve = releveResult.data as LannionReleve;\n    const releveData = releve.relevé;\n\n    if (typeof releveData !== 'object' || releveData === null) {\n      error(\"Relevé data is missing or invalid from the API response structure.\", \"fetchLannionGrades\");\n      return defaultGrades;\n    }\n\n    const studentOverallValue = safeParseFloat(releveData.semestre?.notes?.value);\n    const classAverageValue = safeParseFloat(releveData.semestre?.notes?.moy);\n\n    const rankStudentValue = safeParseFloat(releveData.semestre?.rang?.value);\n    const rankClassValue = safeParseFloat(releveData.semestre?.rang?.total);\n    const rankEnabled = rankStudentValue !== 0;\n\n    const subjects: Subject[] = [];\n    const modules: Subject[] = [];\n\n    const processCategory = (data: typeof releveData.ressources, type: 'ressource' | 'sae' | 'ue') => {\n      if (typeof data === 'object' && data !== null) {\n        for (const [key, itemData] of Object.entries(data)) {\n          const subject = processSubjectData(key, itemData, accountId, type, releveData);\n          if (subject) {\n            (type === 'ue' ? modules : subjects).push(subject);\n          }\n        }\n      }\n    };\n\n    processCategory(releveData.ressources, 'ressource');\n    processCategory(releveData.saes, 'sae');\n    processCategory(releveData.ues, 'ue');\n\n    return {\n      studentOverall: createScore(studentOverallValue),\n      classAverage: createScore(classAverageValue),\n      rank: createScore(rankStudentValue, !rankEnabled, rankClassValue),\n      subjects,\n      modules,\n      createdByAccount: accountId,\n      features: {\n        \"scodoc-ues\": releveData.ues\n      }\n    };\n\n  } catch (e: unknown) {\n    const errorMessage = e instanceof Error ? e.message : String(e);\n    error(`[Lannion] Critical Error in fetchLannionGrades: ${errorMessage}`, 'fetchLannionGrades');\n    return defaultGrades;\n  }\n}"
  },
  {
    "path": "services/lannion/index.ts",
    "content": "import { Attendance } from \"@/services/shared/attendance\";\nimport { Period, PeriodGrades } from \"@/services/shared/grade\";\nimport { Capabilities, SchoolServicePlugin } from \"@/services/shared/types\";\nimport { Auth, Services } from \"@/stores/account/types\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport { fetchLannionAttendance } from \"./attendance\";\nimport { fetchLannionGrades } from \"./grades\";\nimport { authenticateWithCredentials, LannionAPI, LannionClient } from \"./module\";\nimport { LannionSemestre } from \"./module/types\";\n\nexport class Lannion implements SchoolServicePlugin {\n  displayName = \"Lannion\";\n  service = Services.LANNION;\n  capabilities: Capabilities[] = [Capabilities.REFRESH, Capabilities.GRADES, Capabilities.ATTENDANCE];\n  session: LannionClient | undefined;\n  authData: Auth = {};\n  \n  private periods: Period[] = [];\n\n  constructor(public accountId: string) {}\n\n  async refreshAccount(credentials: Auth): Promise<Lannion> {\n    try {\n      const username = credentials.additionals?.username as string;\n      const password = credentials.additionals?.password as string;\n\n      if (!username || !password) {\n        throw new Error(\"Missing credentials for Lannion refresh\");\n      }\n\n      const client = await authenticateWithCredentials(username, password);\n      this.session = client;\n      this.authData = credentials;\n\n      const api = new LannionAPI(this.session);\n      const result = await api.getSemestres();\n\n      if (result.success && result.data) {\n        this.periods = result.data.map((semestre: LannionSemestre) => {\n          let id = semestre.formsemestre_id;\n          if (!id) {\n            if (semestre.semestre_id) {\n              id = semestre.semestre_id;\n            } else if (semestre.id && !isNaN(Number(semestre.id))) {\n              id = Number(semestre.id);\n            } else if (typeof semestre.id === 'string' && semestre.id.startsWith('Semestre')) {\n              const match = semestre.id.match(/Semestre\\s+(\\d+)/);\n              if (match) {\n                id = Number(match[1]);\n              } else {\n                id = semestre.id as unknown as number;\n              }\n            } else {\n              id = semestre.id as unknown as number;\n            }\n          }\n\n          console.log(semestre);\n\n          const startYear = semestre.annee_scolaire.split(\"/\")[0];\n          const endYear = semestre.annee_scolaire.split(\"/\")[1];\n\n          const partOfYear = Number(semestre.semestre_id) % 2;\n\n          const estimatedDateDebut = new Date(\"2021-01-30\");\n          \n          estimatedDateDebut.setFullYear(Number(startYear));\n          estimatedDateDebut.setMonth(8);\n\n          const estimatedDateFin = new Date(\"2021-01-30\");\n          estimatedDateFin.setFullYear(Number(endYear));\n          estimatedDateFin.setMonth(0);\n\n          if(partOfYear == 0) {\n            estimatedDateDebut.setFullYear(Number(endYear));\n            estimatedDateDebut.setMonth(0);\n            estimatedDateFin.setFullYear(Number(endYear));\n            estimatedDateFin.setMonth(6);\n          }\n\n          return {\n            id: id!.toString(),\n            name: `Semestre ${semestre.semestre_id}`,\n            start: estimatedDateDebut,\n            end: estimatedDateFin,\n            createdByAccount: this.accountId,\n          };\n        });\n      }\n\n      return this;\n    } catch (e: unknown) {\n      const errorMessage = e instanceof Error ? e.message : String(e);\n      error(`Failed to refresh Lannion account: ${errorMessage}`, \"Lannion.refreshAccount\");\n      throw e;\n    }\n  }\n\n  async getSemestres() {\n    if (!this.session) {\n      error(\"Session is not valid\", \"Lannion.getSemestres\");\n      throw new Error(\"Session is not valid\");\n    }\n    const api = new LannionAPI(this.session);\n    return api.getSemestres();\n  }\n\n  async getInitialData() {\n    if (!this.session) {\n      error(\"Session is not valid\", \"Lannion.getInitialData\");\n      throw new Error(\"Session is not valid\");\n    }\n    const api = new LannionAPI(this.session);\n    return api.getInitialData();\n  }\n\n  async getAllReleves() {\n    if (!this.session) {\n      error(\"Session is not valid\", \"Lannion.getAllReleves\");\n      throw new Error(\"Session is not valid\");\n    }\n    const api = new LannionAPI(this.session);\n    return api.getAllReleves();\n  }\n\n  async getGradesPeriods(): Promise<Period[]> {\n    return this.periods;\n  }\n\n  async getGradesForPeriod(period: Period): Promise<PeriodGrades> {\n    if (!this.session) {\n      error(\"Session is not valid\", \"Lannion.getGradesForPeriod\");\n      throw new Error(\"Session is not valid\");\n    }\n    return fetchLannionGrades(this.session, this.accountId, period);\n  }\n\n  async getAttendancePeriods(): Promise<Period[]> {\n    return this.getGradesPeriods();\n  }\n\n  async getAttendanceForPeriod(period: string): Promise<Attendance> {\n    if (!this.session) {\n      error(\"Session is not valid\", \"Lannion.getAttendanceForPeriod\");\n      throw new Error(\"Session is not valid\");\n    }\n    return fetchLannionAttendance(this.session, this.accountId, period);\n  }\n}\n"
  },
  {
    "path": "services/lannion/module/api.ts",
    "content": "import { fetch } from 'expo-fetcher';\n\nimport { error } from '@/utils/logger/logger';\n\nimport { LannionClient } from './client';\nimport { ApiResponse, InitialData,Releve, Semestre } from './types';\n\nconst SERVICE_URL = 'https://notes9.iutlan.univ-rennes1.fr/services/data.php';\n\nexport class LannionAPI {\n  constructor(private client: LannionClient) {}\n\n  private async request<T>(query: string, params?: Record<string, string>): Promise<ApiResponse<T>> {\n    let url = `${SERVICE_URL}?q=${encodeURIComponent(query)}`;\n    if (params) {\n      Object.entries(params).forEach(([key, value]) => {\n        url += `&${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n      });\n    }\n\n    const session = this.client.getSession();\n    const headers: Record<string, string> = {};\n    if (session.phpSessionId && session.phpSessionId !== 'unknown') {\n      headers['Cookie'] = `PHPSESSID=${session.phpSessionId}`;\n    }\n    try {\n      const response = await fetch(url, {\n        method: 'GET',\n        headers: headers,\n      });\n\n      if (response.status !== 200) {\n        const errorText = await response.text();\n        error(`[LannionAPI] Error response body: ${errorText || '<empty body>'}`, 'LannionAPI.request');\n        return {\n          success: false,\n          error: `API request failed: ${response.status}`,\n        };\n      }\n\n      const text = await response.text();\n      try {\n        const data = JSON.parse(text);\n        if (data && typeof data === 'object' && data.redirect) {\n          return {\n            success: false,\n            error: `Session not valid, API returned redirect: ${data.redirect}`,\n          };\n        }\n        return { success: true, data };\n      } catch (e) {\n        const err = e as Error;\n        return {\n          success: false,\n          error: `Failed to parse response: ${err.message}`,\n        };\n      }\n    } catch (e) {\n      const err = e as Error;\n      return {\n        success: false,\n        error: `Request failed: ${err.message}`,\n      };\n    }\n  }\n\n  async getInitialData(): Promise<ApiResponse<InitialData>> {\n    return this.request('dataPremièreConnexion');\n  }\n\n  async getSemestres(): Promise<ApiResponse<Semestre[]>> {\n    const result = await this.getInitialData();\n    if (!result.success || !result.data) {\n      return { success: false, error: result.error };\n    }\n    return { success: true, data: result.data.semestres };\n  }\n\n  async getReleveEtudiant(semestreId: string | number): Promise<ApiResponse<Releve>> {\n    return this.request('relevéEtudiant', { semestre: semestreId.toString() });\n  }\n\n  async getAllReleves(): Promise<ApiResponse<Releve[]>> {\n    const semestresResult = await this.getSemestres();\n    if (!semestresResult.success || !semestresResult.data) {\n      return { success: false, error: semestresResult.error || 'Failed to get semestres' };\n    }\n\n    const semestres = semestresResult.data;\n    const releves: Releve[] = [];\n\n    for (const semestre of semestres) {\n      let id = semestre.formsemestre_id;\n      if (!id) {\n        if (semestre.semestre_id) {\n          id = semestre.semestre_id;\n        } else if (semestre.id && !isNaN(Number(semestre.id))) {\n          id = semestre.id as number;\n        } else if (typeof semestre.id === 'string' && semestre.id.startsWith('Semestre')) {\n          const match = semestre.id.match(/Semestre\\s+(\\d+)/);\n          if (match) {\n            id = parseInt(match[1], 10);\n          } else {\n            id = semestre.id as unknown as number;\n          }\n        } else {\n          id = semestre.id as unknown as number;\n        }\n      }\n      \n      if (id) {\n        const releveResult = await this.getReleveEtudiant(id);\n        if (releveResult.success && releveResult.data) {\n          releves.push(releveResult.data);\n        }\n      }\n    }\n\n    return { success: true, data: releves };\n  }\n}\n"
  },
  {
    "path": "services/lannion/module/client.ts",
    "content": "import { fetch } from 'expo-fetcher';\n\nimport { log, warn } from '@/utils/logger/logger';\n\nimport { LannionSession } from './types';\n\nconst CAS_CONFIG = {\n  CAS_LOGIN_URL: 'https://sso-cas.univ-rennes.fr/login',\n  SERVICE_URL: 'https://notes9.iutlan.univ-rennes1.fr/services/data.php',\n  DO_AUTH_URL: 'https://notes9.iutlan.univ-rennes1.fr/services/doAuth.php',\n  COOKIE_NAME: 'PHPSESSID',\n};\n\nexport class LannionClient {\n  private phpSessionId: string | null = null;\n\n  constructor() { /* empty */ }\n\n  async authenticate(username: string, password: string): Promise<void> {\n    \n    const loginUrl = `${CAS_CONFIG.CAS_LOGIN_URL}?service=${encodeURIComponent(CAS_CONFIG.DO_AUTH_URL)}`;\n    \n    const loginPageResponse = await fetch(loginUrl, {\n      method: 'GET',\n    });\n\n    if (loginPageResponse.status !== 200) {\n      throw new Error(`Failed to load CAS login page: ${loginPageResponse.status}`);\n    }\n\n    const loginPageHtml = await loginPageResponse.text();\n    const execution = this.extractExecutionToken(loginPageHtml);\n\n    const formData = new URLSearchParams();\n    formData.append('username', username);\n    formData.append('password', password);\n    formData.append('execution', execution);\n    formData.append('_eventId', 'submit');\n    formData.append('geolocation', '');\n\n    const loginResponse = await fetch(loginUrl, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      body: formData.toString(),\n      redirect: 'manual',\n    });\n\n\n    // eslint-disable-next-line no-useless-assignment\n    let redirectUrl: string | null = null;\n\n    if (loginResponse.status >= 300 && loginResponse.status < 400) {\n      redirectUrl = loginResponse.headers.get('location');\n      log(`[LannionClient] Redirect URL found: ${redirectUrl}`);\n    } else {\n      const body = await loginResponse.text();\n      if (body.includes('name=\"username\"') || body.includes('type=\"password\"')) {\n        throw new Error('Invalid credentials');\n      }\n      throw new Error(`Unexpected response status: ${loginResponse.status}`);\n    }\n\n    if (!redirectUrl) {\n      throw new Error('No redirect URL found after login');\n    }\n\n    const authResponse = await fetch(redirectUrl, {\n      method: 'GET',\n      redirect: 'manual',\n    });\n\n\n    const setCookie = authResponse.headers.get('set-cookie');\n    if (setCookie) {\n      const match = setCookie.match(/PHPSESSID=([^;]+)/);\n      if (match) {\n        this.phpSessionId = match[1];\n      } else {\n        log('[LannionClient] PHPSESSID not found in Set-Cookie header');\n      }\n    } else {\n      log('[LannionClient] No Set-Cookie header in auth response');\n    }\n    \n    if (!this.phpSessionId) {\n      warn('[LannionClient] Warning: Session ID is null after authentication flow');\n      throw new Error('Failed to extract session ID');\n    }\n    log('[LannionClient] Authentication successful');\n  }\n\n  private extractExecutionToken(html: string): string {\n    const match = html.match(/name=\"execution\"\\s+value=\"([^\"]+)\"/);\n    if (!match) {\n      throw new Error('Could not extract execution token from login page');\n    }\n    return match[1];\n  }\n\n  getSession(): LannionSession {\n    return {\n      phpSessionId: this.phpSessionId || 'unknown',\n      createdAt: new Date(),\n    };\n  }\n\n  setSession(phpSessionId: string) {\n    this.phpSessionId = phpSessionId;\n  }\n\n  async validateSession(): Promise<{ isValid: boolean; error?: string }> {\n    if (!this.phpSessionId) {return { isValid: false, error: 'No session ID' };}\n    return { isValid: true };\n  }\n\n  async clearSessionAndCookies() {\n    this.phpSessionId = null;\n  }\n}\n\nexport async function authenticateWithCredentials(username: string, password: string) {\n  const client = new LannionClient();\n  await client.authenticate(username, password);\n  return client;\n}\n"
  },
  {
    "path": "services/lannion/module/index.ts",
    "content": "export * from './api';\nexport * from './client';\nexport * from './types';\n"
  },
  {
    "path": "services/lannion/module/types.ts",
    "content": "export interface LannionSession {\n  phpSessionId: string;\n  createdAt: Date;\n}\n\nexport interface ECTS {\n  [key: string]: undefined;\n}\n\nexport interface Groupe {\n  partition_id: number;\n  group_name: string;\n  numero: number;\n  id: number;\n  edt_id: string | null;\n  partition: {\n    id: number;\n    bul_show_rank: boolean;\n    groups_editable: boolean;\n    partition_name: string;\n    formsemestre_id: number;\n    numero: number;\n    show_in_lists: boolean;\n    partition_id: number;\n  };\n}\n\nexport interface AbsencesSemestre {\n  injustifie: number;\n  total: number;\n  metrique: string;\n}\n\nexport interface Decision {\n  code: string;\n  etat: string;\n  date: string;\n}\n\nexport interface DecisionUE {\n  ue_id: number;\n  numero: number;\n  acronyme: string;\n  titre: string;\n  code: string;\n  ects: number;\n}\n\nexport interface AutorisationInscription {\n  semestre_id: number;\n}\n\n// Interfaces for API responses\nexport interface LannionSemestre {\n  formsemestre_id?: number;\n  semestre_id?: number;\n  id?: number | string;\n  annee_scolaire?: string;\n  date_debut?: string;\n  date_fin?: string;\n}\n\nexport interface LannionReleve {\n  relevé: {\n    semestre?: {\n      notes?: {\n        value?: string;\n        moy?: string;\n      }\n    };\n    ues?: Record<string, LannionUE>;\n    ressources?: Record<string, LannionRessource>;\n    saes?: Record<string, LannionSAE>;\n  };\n  absences?: Record<string, LannionAbsence[]>;\n}\n\nexport interface LannionUE {\n  id?: number;\n  titre?: string;\n  moyenne?: {\n    value?: string;\n    moy?: string;\n    min?: string;\n    max?: string;\n  };\n  ressources?: Record<string, unknown>;\n  saes?: Record<string, unknown>;\n}\n\nexport interface LannionRessource {\n  titre?: string;\n  evaluations?: LannionEvaluation[];\n}\n\nexport interface LannionSAE {\n  titre?: string;\n  evaluations?: LannionEvaluation[];\n}\n\nexport interface LannionEvaluation {\n  id?: number;\n  description?: string;\n  date?: string;\n  coef?: string;\n  note?: {\n    value?: string;\n    moy?: string;\n    min?: string;\n    max?: string;\n  };\n}\n\nexport interface LannionAbsence {\n  idAbs?: number;\n  dateFin?: string;\n  debut?: number;\n  fin?: number;\n  matiereComplet?: string;\n  justifie?: boolean;\n}\n\nexport interface Competence {\n  id_orebut: string;\n  titre: string;\n  titre_long: string;\n  couleur: string;\n  numero: number;\n}\n\nexport interface Niveau {\n  libelle: string;\n  annee: string;\n  ordre: number;\n  competence: Competence;\n}\n\nexport interface DecisionRCUE {\n  code: string;\n  niveau: Niveau;\n}\n\nexport interface DecisionAnnee {\n  annee_scolaire: number;\n  date: string;\n  code: string;\n  ordre: number;\n}\n\nexport interface NotesSemestre {\n  value: string;\n  min: string;\n  moy: string;\n  max: string;\n}\n\nexport interface Rang {\n  value: string;\n  total: number;\n  groupes: Record<string, undefined>;\n}\n\nexport interface SemestreInfo {\n  etapes: string[];\n  date_debut: string;\n  date_fin: string;\n  annee_universitaire: string;\n  numero: number;\n  inscription: string;\n  groupes: Groupe[];\n  absences: AbsencesSemestre;\n  ECTS: ECTS;\n  diplomation: string;\n  situation: string;\n  diplome_dut120: boolean;\n  diplome_dut120_descr: string;\n  decision: Decision;\n  decision_ue: DecisionUE[];\n  autorisation_inscription: AutorisationInscription[];\n  decision_rcue: DecisionRCUE[];\n  descr_decisions_rcue: string;\n  descr_decisions_rcue_list?: string[];\n  descr_decisions_niveaux: string;\n  decision_annee: DecisionAnnee | null;\n  notes: NotesSemestre;\n  rang: Rang;\n}\n\nexport interface Semestre {\n  semestre_id: number;\n  annee_scolaire: string;\n  formsemestre_id: number;\n  id?: string | number;\n  date_debut?: string;\n  date_fin?: string;\n}\n\nexport interface Releve {\n  semestre: SemestreInfo;\n  ressources: Record<string, undefined>;\n  saes: Record<string, undefined>;\n}\n\nexport interface Etudiant {\n  boursier: boolean;\n  civilite_etat_civil: string | null;\n  civilite: string;\n  code_ine: string;\n  code_nip: string;\n  date_naissance: string;\n  dept_acronym: string;\n  dept_id: number;\n  dept_naissance: string;\n  email: string;\n  emailperso: string;\n  etat_civil: string;\n  etudid: number;\n  lieu_naissance: string;\n  nationalite: string;\n  nom: string;\n  nomprenom: string;\n  prenom_etat_civil: string | null;\n  prenom: string;\n  fiche_url: string;\n  photo_url: string;\n  codepostaldomicile: string;\n  paysdomicile: string;\n  telephonemobile: string;\n  typeadresse: string;\n  id: number;\n  domicile: string;\n  villedomicile: string;\n  telephone: string;\n  fax: string;\n  description: string;\n}\n\nexport interface Formation {\n  id: number;\n  acronyme: string;\n  titre_officiel: string;\n  titre: string;\n}\n\nexport interface InitialData {\n  etudiant: Etudiant;\n  formation: Formation;\n  semestres: Semestre[];\n}\n\nexport interface ApiResponse<T> {\n  success: boolean;\n  data?: T;\n  error?: string;\n}\n"
  },
  {
    "path": "services/local/event-converter.ts",
    "content": "import { Course as SharedCourse, CourseType } from '@/services/shared/timetable';\n\nimport { ICalEvent } from './ical';\nimport { parseADEDescription } from './parsers/ade-parser';\nimport { isHyperplanningDescription,parseHyperplanningDescription } from './parsers/hyperplanning-parser';\nimport { parseUR1Ical } from './parsers/schools/univrennes1_parser';\n\ninterface ConversionContext {\n  icalId: string;\n  icalTitle: string;\n  isADE: boolean;\n  isHyperplanning: boolean;\n  intelligentParsing: boolean;\n  isSchool: boolean;\n  schoolName?: string;\n}\n\nexport interface ParsedEventData {\n  summary?: string;\n  type: string;\n  teacher: string;\n  group: string;\n  courseType?: string;\n}\n\nconst DEFAULT_EVENT_DATA: ParsedEventData = {\n  type: 'Activité',\n  teacher: 'Inconnu',\n  group: 'Inconnu'\n};\n\nconst SCHOOL_PARSERS = {\n  \"UNIVRENNES1\": parseUR1Ical\n}\n\nfunction parseEventData(event: ICalEvent, isADE: boolean, isHyperplanning: boolean, intelligentParsing: boolean, isSchool: boolean, schoolName?: string): ParsedEventData {\n  if (!intelligentParsing) {\n    return DEFAULT_EVENT_DATA;\n  }\n\n  if (isSchool && schoolName) {\n    const parser = SCHOOL_PARSERS[schoolName];\n    if (parser) {\n      const parsed = parser(event);\n      if (parsed) {\n        return {\n          summary: parsed.summary || DEFAULT_EVENT_DATA.summary,\n          type: parsed.type || DEFAULT_EVENT_DATA.type,\n          teacher: parsed.teacher || event.organizer || DEFAULT_EVENT_DATA.teacher,\n          group: parsed.group || DEFAULT_EVENT_DATA.group,\n          courseType: parsed.courseType || DEFAULT_EVENT_DATA.courseType\n        };\n      }\n    }\n  }\n\n  if (isHyperplanning || isHyperplanningDescription(event.description || '')) {\n    const parsed = parseHyperplanningDescription(event.description || '');\n    if (parsed) {\n      return {\n        type: parsed.type || DEFAULT_EVENT_DATA.type,\n        teacher: parsed.teacher || event.organizer || DEFAULT_EVENT_DATA.teacher,\n        group: parsed.group || DEFAULT_EVENT_DATA.group\n      };\n    }\n  }\n\n  if (isADE) {\n    const parsed = parseADEDescription(event.description || '');\n    if (parsed) {\n      return {\n        type: parsed.type || DEFAULT_EVENT_DATA.type,\n        teacher: parsed.teacher || event.organizer || DEFAULT_EVENT_DATA.teacher,\n        group: parsed.groups?.join(',') || parsed.group || DEFAULT_EVENT_DATA.group\n      };\n    }\n  }\n\n  return DEFAULT_EVENT_DATA;\n}\n\nfunction calculateEventEndTime(event: ICalEvent): Date {\n  if (event.dtend) {\n    return event.dtend;\n  }\n\n  const startTime = event.dtstart || new Date();\n  return new Date(startTime.getTime() + 60 * 60 * 1000);\n}\n\nexport function convertICalEventToSharedCourse(\n  event: ICalEvent,\n  context: ConversionContext\n): SharedCourse {\n  const { summary, type, teacher, group, courseType } = parseEventData(\n    event,\n    context.isADE,\n    context.isHyperplanning,\n    context.intelligentParsing,\n    context.isSchool,\n    context.schoolName\n  );\n\n  console.log(summary)\n\n  return {\n    id: event.uid,\n    subject: summary || event.summary || 'Événement',\n    type: CourseType.ACTIVITY,\n    from: event.dtstart || new Date(),\n    to: calculateEventEndTime(event),\n    additionalInfo: type !== DEFAULT_EVENT_DATA.type ? type : event.description,\n    room: event.location,\n    teacher,\n    group,\n    backgroundColor: '#4CAF50',\n    status: undefined,\n    customStatus: courseType || context.icalTitle,\n    url: '',\n    createdByAccount: `ical_${context.icalId}`\n  };\n}\n\nexport function convertMultipleEvents(\n  events: ICalEvent[],\n  context: ConversionContext\n): SharedCourse[] {\n  return events.map(event => convertICalEventToSharedCourse(event, context));\n}"
  },
  {
    "path": "services/local/event-filter.ts",
    "content": "import { ICalEvent } from './ical';\n\nexport function filterEventsByDateRange(\n  events: ICalEvent[],\n  startDate: Date,\n  endDate: Date\n): ICalEvent[] {\n  return events.filter(event => {\n    if (!event.dtstart) {\n      return false;\n    }\n\n    const eventStart = new Date(event.dtstart);\n    return eventStart >= startDate && eventStart <= endDate;\n  });\n}\n\nexport function filterEventsByWeek(events: ICalEvent[], weekStart: Date, weekEnd: Date): ICalEvent[] {\n  return filterEventsByDateRange(events, weekStart, weekEnd);\n}"
  },
  {
    "path": "services/local/ical-database.ts",
    "content": "import { getDatabaseInstance } from '@/database/DatabaseProvider';\nimport Ical from '@/database/models/Ical';\nimport { enhanceADEUrl } from './parsers/ade-parser';\nimport { isADEProvider } from './ical-utils';\n\nexport async function getAllIcals(): Promise<Ical[]> {\n  const database = getDatabaseInstance();\n  return await database.get<Ical>('icals').query().fetch();\n}\n\nexport async function updateIcalUrl(ical: Ical, newUrl: string): Promise<void> {\n  const database = getDatabaseInstance();\n  await database.write(async () => {\n    await ical.update((ical: any) => {\n      ical.url = newUrl;\n    });\n  });\n}\n\nexport async function updateIcalProvider(ical: Ical, provider: string): Promise<void> {\n  const database = getDatabaseInstance();\n  await database.write(async () => {\n    await ical.update((ical: any) => {\n      ical.provider = provider;\n    });\n  });\n}\n\nexport async function enhanceIcalIfNeeded(ical: Ical): Promise<void> {\n  if (isADEProvider(ical.provider) && !ical.url.includes('firstDate') && !ical.url.includes('lastDate')) {\n    const enhancedUrl = enhanceADEUrl(ical.url);\n    await updateIcalUrl(ical, enhancedUrl);\n  }\n}\n\nexport async function updateProviderIfUnknown(ical: Ical, detectedProvider: string): Promise<void> {\n  if (!ical.provider || ical.provider === 'unknown') {\n    await updateIcalProvider(ical, detectedProvider);\n  }\n}"
  },
  {
    "path": "services/local/ical-utils.ts",
    "content": "const SCHOOL_LIST = [\n  {\n    domain: \"planning.univ-rennes1.fr\",\n    name: \"UNIVRENNES1\"\n  }\n];\n\nexport function isValidUrl(url: string): boolean {\n  try {\n    new URL(url);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nexport function normalizeUrl(url: string): string {\n  if (url.startsWith('http://')) {\n    return url.replace('http://', 'https://');\n  }\n  return url;\n}\n\nexport function detectProvider(prodId?: string, url?: string): { isADE: boolean; isHyperplanning: boolean; provider: string, isSchool: boolean, schoolName?: string } {\n  const provider = prodId || url || 'unknown';\n  const isADE = Boolean(prodId?.toUpperCase().includes('ADE'));\n  const isHyperplanning = Boolean(prodId?.toUpperCase().includes('HYPERPLANNING'));\n\n  const school = SCHOOL_LIST.find((school) => url?.includes(school.domain));\n  const isSchool = Boolean(school);\n\n  return { isADE, isHyperplanning, provider, isSchool, schoolName: school?.name };\n}\n\nexport function isADEProvider(provider?: string): boolean {\n  return Boolean(provider?.toUpperCase().includes('ADE'));\n}\n\nexport function isHyperplanningProvider(provider?: string): boolean {\n  return Boolean(provider?.toUpperCase().includes('HYPERPLANNING'));\n}"
  },
  {
    "path": "services/local/ical.ts",
    "content": "import { Course as SharedCourse } from '@/services/shared/timetable';\n\nimport { convertMultipleEvents } from './event-converter';\nimport { filterEventsByWeek } from './event-filter';\nimport { getAllIcals, updateProviderIfUnknown } from './ical-database';\nimport { detectProvider } from './ical-utils';\nimport { parseICalString } from './parsers/ical-event-parser';\n\nexport interface ICalEvent {\n  uid: string;\n  summary?: string;\n  description?: string;\n  dtstart?: Date;\n  dtend?: Date;\n  location?: string;\n  allday?: boolean;\n  organizer?: string;\n}\n\nexport interface ParsedICalData {\n  events: ICalEvent[];\n  calendarName?: string;\n  isADE: boolean;\n  isHyperplanning: boolean;\n  provider?: string;\n  url?: string;\n  isSchool?: boolean;\n  schoolName?: string;\n}\n\nexport async function fetchAndParseICal(url: string): Promise<ParsedICalData> {\n  try {\n    const response = await fetch(url);\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n\n    const icalString = await response.text();\n    const { events, metadata } = parseICalString(icalString);\n    const { isADE, isHyperplanning, provider, isSchool, schoolName } = detectProvider(metadata.prodId, url);\n    return {\n      events,\n      calendarName: metadata.calendarName,\n      isADE,\n      isHyperplanning,\n      provider,\n      url,\n      isSchool,\n      schoolName\n    };\n  } catch (error) {\n    console.error('Error fetching or parsing iCal:', error);\n    throw error;\n  }\n}\n\nasync function processIcalData(ical: any): Promise<{ parsedData: ParsedICalData; shouldUpdateIcal: boolean }> {\n  const parsedData = await fetchAndParseICal(ical.url);\n  let shouldUpdateIcal = false;\n\n  if (!ical.provider || ical.provider === 'unknown') {\n    await updateProviderIfUnknown(ical, parsedData.provider || 'unknown');\n    shouldUpdateIcal = true;\n  }\n\n  return { parsedData, shouldUpdateIcal };\n}\n\nexport async function getICalEventsForWeek(weekStart: Date, weekEnd: Date): Promise<SharedCourse[]> {\n  const icals = await getAllIcals();\n  const allEvents: SharedCourse[] = [];\n\n  for (const ical of icals) {\n    try {\n      const { parsedData } = await processIcalData(ical);\n      const weekEvents = filterEventsByWeek(parsedData.events, weekStart, weekEnd);\n      const convertedEvents = convertMultipleEvents(weekEvents, {\n        icalId: ical.id,\n        icalTitle: ical.title,\n        isADE: parsedData.isADE,\n        isHyperplanning: parsedData.isHyperplanning,\n        intelligentParsing: (ical as any).intelligentParsing || false,\n        isSchool: parsedData.isSchool,\n        schoolName: parsedData.schoolName\n      });\n\n      allEvents.push(...convertedEvents);\n    } catch (error) {\n      console.error(`Error processing iCal ${ical.title}:`, error);\n    }\n  }\n\n  return allEvents;\n}\n\n"
  },
  {
    "path": "services/local/parsers/ade-parser.ts",
    "content": "interface ParsedDescription {\n  type: string | null;\n  group: string | null;\n  groups?: string[];\n  teacher: string | null;\n}\n\nexport function parseADEDescription(\n  description: string\n): ParsedDescription | null {\n  const lines = description\n    .replace(/^DESCRIPTION:\\s*/, \"\")\n    .replace(/\\([^)]*\\)/g, \"\")\n    .split(\"\\n\")\n    .map(line => line.trim())\n    .filter(line => line !== \"\");\n\n  if (lines.length === 0) {\n    return null;\n  }\n\n  const extractValue = (line: string | undefined): string | null => {\n    if (!line) return null;\n    const trimmed = line.trim();\n    return trimmed === \"\" ? null : trimmed;\n  };\n\n  const isGroupPattern = (line: string): boolean => {\n    const trimmed = line.trim().toUpperCase();\n    return (\n      /^(TP|TD|CM|COURS|GROUPE)\\s*[0-9]*[A-ZÀ-ÖØ-Ý]*$/i.test(trimmed) ||\n      /^GROUPE\\s+[A-Z0-9À-ÖØ-Ý]+$/i.test(trimmed) ||\n      /^[A-Z]{2,3}\\d*$/i.test(trimmed) ||\n      /^[A-Z]\\d*$/i.test(trimmed)\n    );\n  };\n\n  const isTeacherName = (line: string): boolean => {\n    const trimmed = line.trim().toUpperCase();\n    return /^[A-ZÀ-ÖØ-Ý]+(?:-[A-ZÀ-ÖØ-Ý]+)?(?:\\s+[A-ZÀ-ÖØ-Ý]+(?:-[A-ZÀ-ÖØ-Ý]+)?)+$/.test(trimmed);\n  };\n\n  const allLinesAreGroups = lines.length > 1 && lines.every(isGroupPattern);\n  if (allLinesAreGroups) {\n    return {\n      type: null,\n      group: null,\n      groups: lines,\n      teacher: null,\n    };\n  }\n\n  switch (lines.length) {\n    case 1:\n      return {\n        type: null,\n        group: extractValue(lines[0]),\n        teacher: null,\n      };\n\n    case 2:\n      const firstLine = lines[0];\n      const secondLine = lines[1];\n\n      if (isTeacherName(secondLine)) {\n        return {\n          type: null,\n          group: extractValue(firstLine),\n          teacher: extractValue(secondLine),\n        };\n      }\n\n      return {\n        type: extractValue(firstLine),\n        group: extractValue(secondLine),\n        teacher: null,\n      };\n\n    case 3:\n      return {\n        type: extractValue(lines[0]),\n        group: extractValue(lines[2]),\n        teacher: extractValue(lines[1]),\n      };\n\n    default:\n      return {\n        type: extractValue(lines[0]),\n        group: extractValue(lines[1]),\n        teacher: extractValue(lines[2]),\n      };\n  }\n}\n\nexport function enhanceADEUrl(url: string): string {\n  if (!url.includes(\"firstDate\") && !url.includes(\"lastDate\")) {\n    const urlIcal = url.replace(\n      /&nbWeeks=[0-9]+/,\n      \"&firstDate=2000-01-01&lastDate=2038-01-01\"\n    );\n\n    try {\n      new URL(urlIcal);\n      return urlIcal;\n    } catch {\n      return url;\n    }\n  }\n  return url;\n}\n"
  },
  {
    "path": "services/local/parsers/hyperplanning-parser.ts",
    "content": "interface ParsedDescription {\n  type: string | null;\n  group: string | null;\n  groups?: string[];\n  teacher: string | null;\n  room?: string | null;\n  content?: string | null;\n}\n\nexport function parseHyperplanningDescription(description: string): ParsedDescription | null {\n  if (!description) return null;\n\n  // Clean the description from HTML tags and DESCRIPTION prefix\n  const cleanedDescription = description\n    .replace(/^DESCRIPTION;LANGUAGE=fr:/, '')\n    .replace(/<[^>]*>/g, '') // Remove HTML tags\n    .replace(/&nbsp;/g, ' ') // Replace &nbsp; with space\n    .replace(/\\\\n/g, '\\n') // Convert literal \\n to actual newlines\n    .trim();\n\n  const lines = cleanedDescription.split('\\n').filter(line => line.trim() !== '');\n\n  let type: string | null = null;\n  let teacher: string | null = null;\n  let group: string | null = null;\n  let room: string | null = null;\n  let content: string | null = null;\n\n  for (const line of lines) {\n    const trimmedLine = line.trim();\n\n    // Extract subject/type\n    if (trimmedLine.startsWith('Matière :')) {\n      type = trimmedLine.replace('Matière :', '').trim();\n    }\n\n    // Extract teacher\n    else if (trimmedLine.startsWith('Enseignant :')) {\n      teacher = trimmedLine.replace('Enseignant :', '').trim();\n    }\n\n    // Extract promotion/group\n    else if (trimmedLine.startsWith('Promotion :')) {\n      group = trimmedLine.replace('Promotion :', '').trim();\n    }\n\n    // Extract room\n    else if (trimmedLine.startsWith('Salle :')) {\n      room = trimmedLine.replace('Salle :', '').trim();\n    }\n\n    // Extract pedagogical content\n    else if (trimmedLine.startsWith('Contenu pédagogique')) {\n      // Find content after this line\n      const contentIndex = lines.findIndex(l => l.trim().startsWith('Contenu pédagogique'));\n      if (contentIndex !== -1 && contentIndex + 1 < lines.length) {\n        // Join remaining lines as content, cleaned up\n        content = lines\n          .slice(contentIndex + 1)\n          .join(' ')\n          .replace(/Travail sur le projet trimestriel : élaboration/g, '')\n          .replace(/font-weight:bold/g, '')\n          .replace(/font-family:[^;]+;/g, '')\n          .replace(/font-size:[^;]+;/g, '')\n          .trim();\n      }\n    }\n  }\n\n  // If no structured data found, try to extract basic info\n  if (!type && !teacher && !group) {\n    // Fallback: try to find any recognizable patterns\n    const subjectMatch = cleanedDescription.match(/Matière\\s*:\\s*([^\\n]+)/i);\n    const teacherMatch = cleanedDescription.match(/Enseignant\\s*:\\s*([^\\n]+)/i);\n    const groupMatch = cleanedDescription.match(/Promotion\\s*:\\s*([^\\n]+)/i);\n\n    if (subjectMatch) type = subjectMatch[1].trim();\n    if (teacherMatch) teacher = teacherMatch[1].trim();\n    if (groupMatch) group = groupMatch[1].trim();\n  }\n\n  return {\n    type: type || 'Cours',\n    teacher: teacher || 'Inconnu',\n    group: group || 'Inconnu',\n    room: room || undefined,\n    content: content || undefined\n  };\n}\n\nexport function isHyperplanningDescription(description: string): boolean {\n  if (!description) return false;\n\n  return description.includes('Matière :') ||\n         description.includes('Enseignant :') ||\n         description.includes('Promotion :') ||\n         description.includes('DESCRIPTION;LANGUAGE=fr:');\n}"
  },
  {
    "path": "services/local/parsers/ical-event-parser.ts",
    "content": "import ICAL from 'ical.js';\nimport { generateId } from '@/utils/generateId';\nimport { ICalEvent } from '../ical';\n\nexport interface ParsedCalendarMetadata {\n  prodId?: string;\n  calendarName?: string;\n}\n\nexport function parseCalendarMetadata(comp: ICAL.Component): ParsedCalendarMetadata {\n  return {\n    prodId: comp.getFirstPropertyValue('prodid')?.toString(),\n    calendarName: (comp.getFirstPropertyValue('x-wr-calname') || comp.getFirstPropertyValue('name'))?.toString()\n  };\n}\n\nexport function parseICalEvents(comp: ICAL.Component): ICalEvent[] {\n  const events: ICalEvent[] = [];\n  const vevents = comp.getAllSubcomponents('vevent');\n\n  for (const vevent of vevents) {\n    const event = new ICAL.Event(vevent);\n\n    events.push({\n      uid: event.uid || generateId(event.summary + event.startDate?.toString()),\n      summary: event.summary,\n      description: event.description,\n      dtstart: event.startDate?.toJSDate(),\n      dtend: event.endDate?.toJSDate(),\n      location: event.location,\n      allday: event.startDate?.isDate || false,\n      organizer: event.organizer?.toString()\n    });\n  }\n\n  return events;\n}\n\nexport function parseICalString(icalString: string): { events: ICalEvent[]; metadata: ParsedCalendarMetadata } {\n  const jcalData = ICAL.parse(icalString);\n  const comp = new ICAL.Component(jcalData);\n\n  return {\n    events: parseICalEvents(comp),\n    metadata: parseCalendarMetadata(comp)\n  };\n}"
  },
  {
    "path": "services/local/parsers/schools/univrennes1_parser.ts",
    "content": "import { ParsedEventData } from \"../../event-converter\";\nimport { ICalEvent } from \"../../ical\";\nimport { parseADEDescription } from \"../ade-parser\";\n\nconst typesDescription = {\n  \"TD\": \"Travail dirigé\",\n  \"TP\": \"Travail pratique\",\n  \"CM\": \"Cours magistral\",\n  \"DS\": \"Devoir surveillé\",\n  \"ALT\": \"Alt\",\n  \"SUIVI\": \"Suivi\"\n}\n\nfunction parseCourseLabel(label) {\n  const clean = label.replace(/^LOG\\s+/, '').trim();\n  const tokens = clean.split(/\\s+/);\n  \n  const types = ['TD', 'TP', 'CM', 'DS', 'SUIVI', 'ALT'];\n  \n  const typeIndex = tokens.findIndex(t => types.includes(t.toUpperCase()));\n\n  const identifier = tokens[0];\n\n  if (typeIndex === -1) {\n    return {\n      name: identifier,\n      identifier: identifier,\n      type: \"N/A\",\n      group: tokens.slice(1).join(' ')\n    };\n  }\n\n  let type = tokens[typeIndex];\n  let offset = 1;\n\n  if (type.toUpperCase() === 'SUIVI' && tokens[typeIndex + 1]?.toUpperCase() === 'ALT') {\n    type = \"Suivi Alt\";\n    offset = 2;\n  }\n\n  const nameParts = tokens.slice(1, typeIndex);\n  const name = nameParts.length > 0 ? nameParts.join(' ') : identifier;\n\n  return {\n    name: name,\n    identifier: identifier,\n    type: type,\n    group: tokens.slice(typeIndex + offset).join(' ')\n  };\n}\n\nexport function parseUR1Ical(\n  event: ICalEvent\n): ParsedEventData | null {\n  const ADEDescription = parseADEDescription(event.description || '');\n  if(!ADEDescription) {\n    return null;\n  }\n\n  const parsedLabel = parseCourseLabel(event.summary || null);\n\n  const newSummary = parsedLabel?.name;\n\n  return {\n    ...ADEDescription,\n    summary: newSummary,\n    group: parsedLabel?.group,\n    courseType: parsedLabel?.type ? parsedLabel.type in typesDescription ? typesDescription[parsedLabel.type] : parsedLabel.type : null\n  };\n}"
  },
  {
    "path": "services/multi/index.ts",
    "content": "import { Multi as EsupMulti } from \"esup-multi.js\";\n\nimport { Auth, Services } from \"@/stores/account/types\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport { News } from \"../shared/news\";\nimport { CourseDay } from \"../shared/timetable\";\nimport { Capabilities, SchoolServicePlugin } from \"../shared/types\";\nimport { fetchMultiNews } from \"./news\";\nimport { refreshMultiSession } from \"./refresh\";\nimport { fetchMultiTimetable } from \"./timetable\";\n\nexport class Multi implements SchoolServicePlugin {\n  displayName = \"Multi\";\n  service = Services.MULTI;\n  capabilities: Capabilities[] = [\n    Capabilities.REFRESH,\n    Capabilities.NEWS,\n    Capabilities.TIMETABLE,\n  ];\n  session: EsupMulti | undefined = undefined;\n  authData: Auth = {};\n\n  constructor(public accountId: string) {}\n\n  async refreshAccount(credentials: Auth): Promise<Multi> {\n    const refresh = await refreshMultiSession(this.accountId, credentials);\n\n    this.authData = refresh.auth;\n    this.session = refresh.session;\n\n    return this;\n  }\n\n  async getNews(): Promise<News[]> {\n    if (this.session) {\n      return fetchMultiNews(this.session, this.accountId);\n    }\n    error(\"Session is not valid\", \"Multi.getNews\");\n  }\n\n  async getWeeklyTimetable(weekNumber: number, date: Date): Promise<CourseDay[]> {\n    if (this.session) {\n      return fetchMultiTimetable(this.session, this.accountId, weekNumber);\n    }\n    error(\"Session is not valid\", \"Multi.getWeeklyTimetable\");\n  }\n}\n"
  },
  {
    "path": "services/multi/news.ts",
    "content": "import { Multi } from \"esup-multi.js\";\nimport { t } from \"i18next\";\n\nimport { AttachmentType } from \"../shared/attachment\";\nimport { News } from \"../shared/news\";\n\nexport async function fetchMultiNews(\n  session: Multi,\n  accountId: string\n): Promise<News[]> {\n  const news = await session.getActualities();\n  return news.map(item => ({\n    id: item.title,\n    title: item.title,\n    createdAt: new Date(item.pubDate),\n    acknowledged: true,\n    content: item.content,\n    author: t(\"Profile_News_Author_Unknown\"),\n    category: \"Actualités\",\n    attachments: [\n      {\n        type: AttachmentType.LINK,\n        name: item.link ?? \"\",\n        url: item.link ?? \"\",\n        createdByAccount: accountId,\n      },\n    ].filter(attachment => attachment.name && attachment.url),\n    ref: item,\n    createdByAccount: accountId,\n  }));\n}\n"
  },
  {
    "path": "services/multi/refresh.ts",
    "content": "import { authWithRefreshToken, Multi } from \"esup-multi.js\";\n\nimport { useAccountStore } from \"@/stores/account\";\nimport { Auth } from \"@/stores/account/types\";\nimport { error } from \"@/utils/logger/logger\";\n\nexport async function refreshMultiSession(\n  accountId: string,\n  credentials: Auth\n): Promise<{ auth: Auth; session: Multi }> {\n  if (!credentials.refreshToken) {\n    error(\"Unable to find refreshToken\", \"refreshMultiSession\");\n  }\n\n  const instanceUrl = credentials.additionals?.[\"instanceUrl\"] as string;\n  const session = await authWithRefreshToken(instanceUrl, {\n    refreshAuthToken: credentials.refreshToken,\n  });\n\n  const authData: Auth = {\n    accessToken: credentials.accessToken,\n    refreshToken: credentials.refreshToken,\n    additionals: {\n      instanceUrl: instanceUrl,\n    },\n  };\n\n  useAccountStore.getState().updateServiceAuthData(accountId, authData);\n\n  return { auth: authData, session };\n}\n"
  },
  {
    "path": "services/multi/timetable.ts",
    "content": "import { EventResponse, Multi } from \"esup-multi.js\";\n\nimport { getDateRangeOfWeek } from \"@/database/useHomework\";\n\nimport {\n  Course,\n  CourseDay,\n  CourseStatus,\n  CourseType,\n} from \"../shared/timetable\";\n\nexport async function fetchMultiTimetable(\n  session: Multi,\n  accountId: string,\n  weekNumber: number\n): Promise<CourseDay[]> {\n  const { start, end } = getDateRangeOfWeek(weekNumber);\n  const result: CourseDay[] = [];\n\n  const timetable = await session.getSchedules({\n    startDate: start.toISOString().split(\"T\")[0],\n    endDate: end.toISOString().split(\"T\")[0],\n  });\n\n  for (const day of timetable.plannings) {\n    const courses = mapMultiCourse(day.events, accountId);\n    result.push({\n      date: day.events[0]?.startDateTime\n        ? new Date(day.events[0].startDateTime)\n        : new Date(),\n      courses: courses,\n    });\n  }\n\n  return result;\n}\n\nfunction mapMultiCourse(data: EventResponse[], accountId: string): Course[] {\n  return data.map(lesson => ({\n    subject: lesson.course.label,\n    id: lesson.id,\n    type: CourseType.LESSON,\n    from: new Date(lesson.startDateTime),\n    to: new Date(lesson.endDateTime),\n    room: lesson.rooms.map(r => r.label).join(\", \"),\n    teacher: lesson.teachers.map(t => t.displayname).join(\", \"),\n    backgroundColor: lesson.course.color,\n    group: lesson.groups.map(g => g.label).join(\", \"),\n    status: lesson.course.online ? CourseStatus.ONLINE : undefined,\n    createdByAccount: accountId,\n  }));\n}\n"
  },
  {
    "path": "services/pronote/attendance.ts",
    "content": "import {\n  notebook,\n  NotebookAbsence,\n  NotebookDelay,\n  NotebookObservation,\n  NotebookPunishment,\n  SessionHandle,\n  TabLocation,\n} from \"pawnote\";\n\nimport { Absence, Attendance, Delay, Observation, Punishment } from \"@/services/shared/attendance\";\nimport { Period } from \"@/services/shared/grade\";\nimport { error } from \"@/utils/logger/logger\";\n\n/**\n * Fetches student Notebook from PRONOTE for a specified periot.\n * @param {SessionHandle} session - The session handle for the PRONOTE session.\n * @param {string} period - The name of the period to fetch attendance for.\n * @param {string} accountId - The ID of the account making the request.\n * @return {Promise<Attendance>} - A promise that resolves to the attendance data for the specified period.\n */\nexport async function fetchPronoteAttendance(session: SessionHandle, accountId: string, period: string): Promise<Attendance> {\n  if (!session) {\n    error(\"Session is undefined\", \"fetchPronoteAttendance\");\n  }\n\n  const attendanceTab = session.user.resources[0].tabs.get(TabLocation.Notebook);\n  if (!attendanceTab) {\n    error(\"Attendance tab not found in session\", \"fetchPronoteAttendance\");\n  }\n\n  const pawnotePeriod = attendanceTab.periods.find(p => p.name === period);\n  if (!pawnotePeriod) {\n    error(`Period \"${period}\" not found in attendance tab`, \"fetchPronoteGrades\");\n  }\n\n  const attendance = await notebook(session, pawnotePeriod);\n  const delays = mapDelays(attendance.delays, accountId).sort((a, b) => a.givenAt.getTime() - b.givenAt.getTime());\n  const absences = mapAbsences(attendance.absences, accountId).sort((a, b) => a.from.getTime() - b.from.getTime());\n  const punishments = mapPunishments(attendance.punishments, accountId).sort((a, b) => a.givenAt.getTime() - b.givenAt.getTime());\n  const observations = mapObservations(attendance.observations).sort((a, b) => a.givenAt.getTime() - b.givenAt.getTime());\n\n  return {\n    delays: delays,\n    absences: absences,\n    punishments: punishments,\n    observations: observations,\n    createdByAccount: accountId\n  }\n}\n\n/**\n * Fetches all attendance periods from PRONOTE.\n * @param {SessionHandle} session - The session handle for the PRONOTE session.\n * @param {string} accountId - The ID of the account making the request.\n * @return {Promise<Array<Period>>} - A promise that resolves to an array of attendance periods.\n */\nexport async function fetchPronoteAttendancePeriods(session: SessionHandle, accountId: string): Promise<Period[]> {\n  const attendanceTab = session.user.resources[0].tabs.get(TabLocation.Notebook);\n  if (!attendanceTab) {\n    error(\"Attendance tab not found in session\", \"fetchPronotePeriods\");\n  }\n\n  return attendanceTab.periods.map(p => ({\n    id: p.id,\n    name: p.name,\n    start: p.startDate,\n    end: p.endDate,\n    createdByAccount: accountId\n  }));\n}\n\n/**\n * Maps a NotebookObservation[] to a shared Observation[].\n * @param observations\n */\nfunction mapObservations(observations: NotebookObservation[]): Observation[] {\n  return observations.map(o => ({\n    id: o.id,\n    givenAt: o.date,\n    sectionName: o.name,\n    sectionType: o.kind,\n    subjectName: o.subject?.name,\n    shouldParentsJustify: o.shouldParentsJustify,\n    reason: o.reason,\n  }));\n}\n\n/**\n * Maps NotebookDelay[] to shared Delay[].\n * @param delays\n */\nfunction mapDelays(delays: NotebookDelay[], accountId: string): Delay[] {\n  return delays.map(d => ({\n    id: d.id,\n    givenAt: d.date,\n    reason: d.reason,\n    justified: d.justified,\n    duration: d.minutes,\n    createdByAccount: accountId\n  }));\n}\n\n/**\n * Maps NotebookAbsence[] to shared Absence[].\n * @param absences\n */\nfunction mapAbsences(absences: NotebookAbsence[], accountId: string): Absence[] {\n  return absences.map(a => ({\n    id: a.id,\n    from: a.startDate,\n    to: a.endDate,\n    reason: a.reason,\n    justified: a.justified,\n    timeMissed: a.hoursMissed * 60 + a.minutesMissed,\n    createdByAccount: accountId\n  }));\n}\n\n/**\n * Maps NotebookPunishment[] to shared Punishment[].\n * @param punishments\n * @param accountId\n */\nfunction mapPunishments(punishments: NotebookPunishment[], accountId: string): Punishment[] {\n  return punishments.map(p => ({\n    id: p.id,\n    givenAt: p.dateGiven,\n    givenBy: p.giver,\n    exclusion: p.exclusion,\n    duringLesson: p.isDuringLesson,\n    homework: {\n      text: p.workToDo,\n      documents: p.workToDoDocuments.map((attachment) => ({\n        type: attachment.kind,\n        name: attachment.name,\n        url: attachment.url,\n        createdByAccount: accountId,\n      }))\n    },\n    reason: {\n      text: p.reasons.join(\", \"),\n      circumstances: p.circumstances,\n      documents: p.circumstancesDocuments.map((attachment) => ({\n        type: attachment.kind,\n        name: attachment.name,\n        url: attachment.url,\n        createdByAccount: accountId,\n      }))\n    },\n    nature: p.title,\n    duration: p.durationMinutes\n  }));\n}"
  },
  {
    "path": "services/pronote/canteen.ts",
    "content": "import { Food as PawnoteFood, Meal as PawnoteMeal, Menu, menus, SessionHandle } from \"pawnote\";\n\nimport { CanteenMenu, Food, Meal } from \"@/services/shared/canteen\";\nimport { error } from \"@/utils/logger/logger\";\n\nexport async function fetchPronoteCanteenMenu(\n  session: SessionHandle,\n  accountId: string,\n  date: Date\n): Promise<CanteenMenu[]> {\n  if (!session) {\n    error(\"Session is undefined\", \"fetchPronoteAttendance\");\n  }\n\n  const weeklyMenu = await menus(session, date);\n  if (!weeklyMenu.days?.length) {\n    return [];\n  }\n\n  return weeklyMenu.days.map(day => ({\n    date: day.date,\n    createdByAccount: accountId,\n    ...mapCanteenMenu(day),\n  })).sort((a, b) => a.date.getTime() - b.date.getTime());\n}\n\nfunction mapCanteenMenu(menu: Menu): { lunch: Meal; dinner: Meal } {\n  return {\n    lunch: mapMeal(menu.lunch),\n    dinner: mapMeal(menu.dinner),\n  };\n}\n\nfunction mapMeal(meal: PawnoteMeal | undefined): Meal {\n  return {\n    entry: mapFood([...meal?.entry ?? []]),\n    main: mapFood([...meal?.main ?? []]),\n    side: mapFood([...meal?.side ?? []]),\n    cheese: mapFood([...meal?.fromage ?? []]),\n    dessert: mapFood([...meal?.dessert ?? []]),\n    drink: mapFood([...meal?.drink ?? []]),\n  };\n}\n\nfunction mapFood(meal: PawnoteFood[]): Food[] {\n  return meal.map(food => ({\n    name: food.name,\n    allergens: food.allergens?.length\n      ? food.allergens.map(allergen => allergen.name)\n      : undefined,\n  }));\n}"
  },
  {
    "path": "services/pronote/chat.ts",
    "content": "import {\n  discussionMessages,\n  discussionRecipients,\n  discussions,\n  discussionSendMessage,\n  EntityKind, newDiscussion, NewDiscussionRecipient, newDiscussionRecipients,\n  SessionHandle,\n  TabLocation,\n} from \"pawnote\";\n\nimport { Chat, Message, Recipient } from \"@/services/shared/chat\";\nimport { error } from \"@/utils/logger/logger\";\n\nexport async function fetchPronoteChats(\n  session: SessionHandle,\n  accountId: string\n): Promise<Chat[]> {\n  if (!session) {\n    error(\"Session is undefined\", \"fetchPronoteChats\");\n  }\n\n  const chats = await discussions(session);\n  return chats.items.map(chat => ({\n    id: chat.participantsMessageID,\n    subject: chat.subject,\n    creator: chat.creator,\n    recipient: chat.recipientName,\n    date: chat.date,\n    ref: chat,\n    createdByAccount: accountId,\n  }));\n}\n\nexport async function fetchPronoteChatRecipients(\n  session: SessionHandle,\n  chat: Chat\n): Promise<Recipient[]> {\n  if (!session) {\n    error(\"Session is undefined\", \"fetchPronoteChatRecipients\");\n  }\n\n  const chatTab = session.user.resources[0].tabs.get(TabLocation.Discussions);\n  if (!chatTab) {\n    error(\"Chat tab not found in session\", \"fetchPronoteChatRecipients\");\n  }\n\n  if (!chat.ref) {\n    error(\"Chat reference is undefined\", \"fetchPronoteChatRecipients\");\n  }\n\n  if (!('participantsMessageID' in chat.ref)) {\n    error(\"Chat reference is not a Discussion type\", \"fetchPronoteChatRecipients\");\n  }\n\n  const recipients = await discussionRecipients(session, chat.ref);\n  return recipients.map((recipient) => {\n    const [namePart, classPart] = recipient.name.split(\"(\");\n\n    return {\n      id: recipient.id,\n      name: namePart.trim(),\n      class: classPart ? classPart.replace(\")\", \"\").trim() : undefined\n    };\n  });\n}\n\nexport async function fetchPronoteChatMessages(\n  session: SessionHandle,\n  accountId: string,\n  chat: Chat\n): Promise<Message[]> {\n  if (!session) {\n    error(\"Session is undefined\", \"fetchPronoteChatMessages\");\n  }\n\n  const chatTab = session.user.resources[0].tabs.get(TabLocation.Discussions);\n  if (!chatTab) {\n    error(\"Chat tab not found in session\", \"fetchPronoteChatMessages\");\n  }\n\n  if (!chat.ref) {\n    error(\"Chat reference is undefined\", \"fetchPronoteChatMessages\");\n  }\n\n  if (!('participantsMessageID' in chat.ref)) {\n    error(\"Chat reference is not a Discussion type\", \"fetchPronoteChatRecipients\");\n  }\n\n  const messages = await discussionMessages(session, chat.ref, true)\n  const studentName = session.user.resources[0].name;\n\n  return messages.sents.map((message) => {\n    return {\n      id: message.id,\n      subject: \"\",\n      content: message.content,\n      author: message.author?.name ?? studentName,\n      date: message.creationDate,\n      attachments: message.files.map((attachment) => ({\n        type: attachment.kind,\n        name: attachment.name,\n        url: attachment.url,\n        createdByAccount: accountId,\n      }))\n    };\n  });\n}\n\nexport async function sendPronoteMessageInChat(\n  session: SessionHandle,\n  chat: Chat,\n  content: string\n): Promise<void> {\n  if (!session) {\n    error(\"Session is undefined\", \"fetchPronoteChatMessages\");\n  }\n\n  const chatTab = session.user.resources[0].tabs.get(TabLocation.Discussions);\n  if (!chatTab) {\n    error(\"Chat tab not found in session\", \"fetchPronoteChatMessages\");\n  }\n\n  if (!chat.ref) {\n    error(\"Chat reference is undefined\", \"fetchPronoteChatMessages\");\n  }\n\n  if (!('participantsMessageID' in chat.ref)) {\n    error(\"Chat reference is not a Discussion type\", \"fetchPronoteChatRecipients\");\n  }\n\n  await discussionSendMessage(session, chat.ref, content)\n}\n\nexport async function fetchPronoteRecipients(\n  session: SessionHandle,\n): Promise<Recipient[]> {\n  if (!session) {\n    error(\"Session is undefined\", \"fetchPronoteChatMessages\");\n  }\n\n  const chatTab = session.user.resources[0].tabs.get(TabLocation.Discussions);\n  if (!chatTab) {\n    error(\"Chat tab not found in session\", \"fetchPronoteChatMessages\");\n  }\n\n  const alLRecipients = await Promise.all(\n    session.user.resources.flatMap(resource =>\n      [\n        EntityKind.Teacher,\n        EntityKind.Personal\n      ].map(kind => newDiscussionRecipients(session, kind))\n    )\n  );\n\n  const recipients = alLRecipients.flat();\n\n  return recipients.map((recipient) => {\n    const [namePart, classPart] = recipient.name.split(\"(\");\n\n    return {\n      id: recipient.id,\n      name: namePart.trim(),\n      class: classPart ? classPart.replace(\")\", \"\").trim() : undefined,\n      ref: recipient\n    };\n  });\n}\n\nexport async function createPronoteMail(session: SessionHandle, accountId: string, subject: string, content: string, recipients: Recipient[]): Promise<Chat> {\n  await newDiscussion(session, subject, content, sharedToPronoteRecipient(recipients))\n  return {\n    id: \"\",\n    subject: subject,\n    recipient: recipients.map(r => r.name).join(\", \"),\n    creator: session.user.name,\n    date: new Date(),\n    createdByAccount: accountId\n  }\n}\n\nfunction sharedToPronoteRecipient(recipients: Recipient[]): NewDiscussionRecipient[] {\n  return recipients.map(recipient => recipient.ref).filter((ref): ref is NewDiscussionRecipient => ref !== undefined);\n}"
  },
  {
    "path": "services/pronote/grades.ts",
    "content": "import { GradeKind, GradesOverview, gradesOverview, GradeValue, SessionHandle, TabLocation } from \"pawnote\";\n\nimport { AttachmentType } from \"@/services/shared/attachment\";\nimport { Grade, GradeScore, Period, PeriodGrades, Subject } from \"@/services/shared/grade\";\nimport { error } from \"@/utils/logger/logger\";\n\n/**\n * Fetches grades from PRONOTE for a specified period.\n * @param {SessionHandle} session - The session handles for the PRONOTE account.\n * @param {string} accountId - The ID of the account requesting the homeworks.\n * @param {string} period - The name of the period for which to fetch grades.\n * @returns {Promise<PeriodGrades>} A promise that resolves to PeriodGrades.\n */\nexport async function fetchPronoteGrades(session: SessionHandle, accountId: string, period: Period): Promise<PeriodGrades> {\n  if (!session) {\n    error(\"Session is undefined\", \"fetchPronoteGrades\");\n  }\n\n  const gradeTab = session.user.resources[0].tabs.get(TabLocation.Grades);\n  if (!gradeTab) {\n    error(\"Grades tab not found in session\", \"fetchPronoteGrades\");\n  }\n\n  const pawnotePeriod = gradeTab.periods.find(p => p.name === period.name);\n  if (!pawnotePeriod) {\n    error(`Period \"${period}\" not found in grades tab`, \"fetchPronoteGrades\");\n  }\n\n  const grades = await gradesOverview(session, pawnotePeriod);\n\n  return {\n    studentOverall: mapGradeValueToScore(grades.overallAverage),\n    classAverage: mapGradeValueToScore(grades.classAverage),\n    subjects: mapSubjectGrades(grades, accountId),\n    createdByAccount: accountId\n  };\n}\n\n/**\n * Fetches all grade periods from PRONOTE.\n * @param {SessionHandle} session - The session handle for the PRONOTE session.\n * @param {string} accountId - The ID of the account making the request.\n * @return {Promise<Array<Period>>} - A promise that resolves to an array of grade periods.\n */\nexport async function fetchPronoteGradePeriods(session: SessionHandle, accountId: string): Promise<Period[]> {\n  const accountTab = session.user.resources[0].tabs.get(TabLocation.Grades);\n  if (!accountTab) {\n    error(\"Grades tab not found in session\", \"fetchPronotePeriods\");\n  }\n\n  return accountTab.periods.map(p => ({\n    id: p.id,\n    name: p.name,\n    start: p.startDate,\n    end: p.endDate,\n    createdByAccount: accountId\n  }));\n}\n\n/**\n * Maps the grade overview to an array of subjects with their respective grades.\n * @param grades\n * @param accountId\n */\nfunction mapSubjectGrades(grades: GradesOverview, accountId: string): Subject[] {\n  const subjects: Subject[] = [];\n  \n  const allMappedGrades: Grade[] = grades.grades.map(g => ({\n    id: g.id,\n    subjectId: g.subject.id,\n    subjectName: g.subject.name,\n    description: g.comment,\n    givenAt: g.date,\n    subjectFile: g.subjectFile ? {\n      ...g.subjectFile,\n      type: AttachmentType.FILE,\n      createdByAccount: accountId\n    } : undefined,\n    correctionFile: g.correctionFile ? {\n      ...g.correctionFile,\n      type: AttachmentType.FILE,\n      createdByAccount: accountId\n    } : undefined,\n    bonus: g.isBonus ?? false,\n    optional: g.isOptional ?? false,\n    outOf: mapGradeValueToScore(g.outOf),\n    coefficient: g.coefficient,\n    studentScore: mapGradeValueToScore(g.value),\n    averageScore: mapGradeValueToScore(g.average),\n    minScore: mapGradeValueToScore(g.min),\n    maxScore: mapGradeValueToScore(g.max),\n    createdByAccount: accountId\n  }));\n\n  for (const average of grades.subjectsAverages) {\n    const subjectId = average.subject.id;\n\n    const subjectGrades = allMappedGrades.filter(g => g.subjectId === subjectId);\n\n    subjects.push({\n      id: subjectId,\n      name: average.subject.name,\n      studentAverage: mapGradeValueToScore(average.student),\n      classAverage: mapGradeValueToScore(average.class_average),\n      maximum: mapGradeValueToScore(average.max),\n      minimum: mapGradeValueToScore(average.min),\n      outOf: mapGradeValueToScore(average.outOf),\n      grades: subjectGrades\n    });\n  }\n\n  return subjects;\n}\n\n/**\n * Maps a GradeValue to a GradeScore.\n * @param grade\n */\nfunction mapGradeValueToScore(grade: GradeValue | undefined): GradeScore {\n  if (typeof grade === \"undefined\")\n  {return { value: 0, disabled: true, status: \"Inconnu\" };}\n\n  switch (grade.kind) {\n  case GradeKind.Grade:\n    return { value: grade.points ?? 0 };\n  case GradeKind.NotGraded:\n    return { value: 0, disabled: true, status: \"N. Not.\" };\n  case GradeKind.Absent:\n    return { value: 0, disabled: true, status: \"Abs.\" };\n  case GradeKind.AbsentZero:\n    return { value: 0, disabled: false, status: \"Abs.*\" };\n  case GradeKind.Exempted:\n    return { value: 0, disabled: true, status: \"Disp.\" };\n  case GradeKind.Unfit:\n    return { value: 0, disabled: true, status: \"Disp.\" };\n  case GradeKind.Unreturned:\n    return { value: 0, disabled: true, status: \"N. Rendu\" };\n  case GradeKind.UnreturnedZero:\n    return { value: 0, disabled: false, status: \"N. Rendu*\" };\n  default:\n    return { value: 0, disabled: true, status: \"Inconnu\" };\n  }\n}"
  },
  {
    "path": "services/pronote/homework.ts",
    "content": "import { assignmentsFromWeek, assignmentStatus, SessionHandle, translateToWeekNumber } from \"pawnote\";\n\nimport { getDateRangeOfWeek } from \"@/database/useHomework\";\nimport { Homework, ReturnFormat } from \"@/services/shared/homework\";\nimport { error } from \"@/utils/logger/logger\";\n\n/**\n  * Fetches homework assignments from PRONOTE for the current week.\n  * @param {SessionHandle} session - The session handle for the PRONOTE account.\n  * @param {string} accountId - The ID of the account requesting the homeworks.\n  * @returns {Promise<Homework[]>} A promise that resolves to an array of Homework objects.\n */\nexport async function fetchPronoteHomeworks(session: SessionHandle, accountId: string, weekNumberRaw: number): Promise<Homework[]> {\n  const result: Homework[] = [];\n\n  const { start } = getDateRangeOfWeek(weekNumberRaw)\n  const weekNumber = translateToWeekNumber(start, session.instance.firstMonday);\n  if (session) {\n    const homeworks = await assignmentsFromWeek(session, weekNumber);\n    for (const homework of homeworks) {\n      result.push({\n        id: homework.id,\n        subject: homework.subject.name,\n        content: homework.description,\n        dueDate: homework.deadline,\n        isDone: homework.done,\n        returnFormat:\n          homework.return.kind === 1 ? ReturnFormat.PAPER : ReturnFormat.FILE_UPLOAD,\n        attachments: homework.attachments.map((attachment) => ({\n          type: attachment.kind,\n          name: attachment.name,\n          url: attachment.url,\n          createdByAccount: accountId,\n        })),\n        evaluation: false,\n        custom: false,\n        createdByAccount: accountId,\n      });\n    }\n  }\n\n  return result;\n}\n\nexport async function setPronoteHomeworkAsDone(session: SessionHandle, homework: Homework, status?: boolean): Promise<Homework> {\n  if (homework.fromCache) {\n    error(\"You can't set data from cache as done.\")\n  }\n\n  try {\n    await assignmentStatus(session, homework.id, status || !homework.isDone)\n  } catch (err) {\n    error(String(err))\n  }\n  return {\n    ...homework,\n    isDone: status || !homework.isDone,\n    progress: (status || !homework.isDone) === true ? 1 : 0\n  }\n}"
  },
  {
    "path": "services/pronote/index.ts",
    "content": "import { SessionHandle, TabLocation } from \"pawnote\";\n\nimport { fetchPronoteAttendance, fetchPronoteAttendancePeriods } from \"@/services/pronote/attendance\";\nimport { fetchPronoteCanteenMenu } from \"@/services/pronote/canteen\";\nimport {\n  createPronoteMail,\n  fetchPronoteChatMessages,\n  fetchPronoteChatRecipients,\n  fetchPronoteChats,\n  fetchPronoteRecipients, sendPronoteMessageInChat,\n} from \"@/services/pronote/chat\";\nimport { fetchPronoteGradePeriods, fetchPronoteGrades } from \"@/services/pronote/grades\";\nimport { fetchPronoteHomeworks, setPronoteHomeworkAsDone } from \"@/services/pronote/homework\";\nimport { fetchPronoteNews, setPronoteNewsAsAcknowledged } from \"@/services/pronote/news\";\nimport { refreshPronoteAccount } from \"@/services/pronote/refresh\";\nimport { fetchPronoteCourseResources, fetchPronoteWeekTimetable } from \"@/services/pronote/timetable\";\nimport { Attendance } from \"@/services/shared/attendance\";\nimport { CanteenMenu } from \"@/services/shared/canteen\";\nimport { Chat, Message, Recipient } from \"@/services/shared/chat\";\nimport { Period, PeriodGrades } from \"@/services/shared/grade\";\nimport { Homework } from \"@/services/shared/homework\";\nimport { News } from \"@/services/shared/news\";\nimport { Course, CourseDay, CourseResource } from \"@/services/shared/timetable\";\nimport { Capabilities, SchoolServicePlugin } from \"@/services/shared/types\";\nimport { Auth, Services } from \"@/stores/account/types\";\nimport { error } from \"@/utils/logger/logger\";\n\nexport class Pronote implements SchoolServicePlugin {\n  displayName = \"PRONOTE\";\n  service = Services.PRONOTE;\n  capabilities: Capabilities[] = [Capabilities.REFRESH];\n  session : SessionHandle | undefined = undefined;\n  tokenExpiration = new Date().getTime() + (5 * 60 * 1000);\n  authData: Auth = {};\n\n  constructor(public accountId: string) {}\n\n  private async checkTokenValidty(): Promise<boolean> {\n    const time = new Date().getTime();\n    if (time > this.tokenExpiration) {\n      this.tokenExpiration = new Date().getTime() + (5 * 60 * 1000);\n      await this.refreshAccount(this.authData);\n      return new Date().getTime() <= this.tokenExpiration;\n    }\n    return true;\n  }\n\n  async refreshAccount(credentials: Auth): Promise<Pronote> {\n    const refresh = (await refreshPronoteAccount(this.accountId, credentials));\n    this.authData = refresh.auth;\n    this.session = refresh.session;\n\n    const tabCapabilities: Partial<Record<TabLocation, Capabilities | Capabilities[]>> = {\n      [TabLocation.Assignments]: Capabilities.HOMEWORK,\n      [TabLocation.Discussions]: [Capabilities.CHAT_READ, Capabilities.CHAT_REPLY, Capabilities.CHAT_CREATE],\n      [TabLocation.Grades]: Capabilities.GRADES,\n      [TabLocation.Notebook]: [Capabilities.ATTENDANCE, Capabilities.ATTENDANCE_PERIODS],\n      [TabLocation.News]: Capabilities.NEWS,\n      [TabLocation.Menus]: Capabilities.CANTEEN_MENU,\n      [TabLocation.Timetable]: Capabilities.TIMETABLE,\n    };\n\n    for (const tab of this.session.user.authorizations.tabs) {\n      const capability = tabCapabilities[tab];\n      if (capability) {\n        this.capabilities.push(...(Array.isArray(capability) ? capability : [capability]));\n      }\n    }\n\t\t\n    return this;\n  }\n\n  async getHomeworks(weekNumber: number): Promise<Homework[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteHomeworks(this.session, this.accountId, weekNumber);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getHomeworks\");\n  }\n\n  async getNews(): Promise<News[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteNews(this.session, this.accountId);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getNews\");\n  }\n\n  async getGradesForPeriod(period: Period): Promise<PeriodGrades> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteGrades(this.session, this.accountId, period);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getGradesForPeriod\");\n  }\n\n  async getGradesPeriods(): Promise<Period[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteGradePeriods(this.session, this.accountId);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getGradesPeriods\");\n  }\n\n  async getAttendanceForPeriod(period: string): Promise<Attendance> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteAttendance(this.session, this.accountId, period);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getAttendanceForPeriod\");\n  }\n\n  async getAttendancePeriods(): Promise<Period[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteAttendancePeriods(this.session, this.accountId);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getAttendancePeriods\");\n  }\n\n  async getWeeklyCanteenMenu(startDate: Date): Promise<CanteenMenu[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteCanteenMenu(this.session, this.accountId, startDate);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getWeeklyCanteenMenu\");\n  }\n\n  async getWeeklyTimetable(weekNumber: number, date: Date): Promise<CourseDay[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteWeekTimetable(this.session, this.accountId, weekNumber, date);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getWeeklyTimetable\");\n  }\n\n  async getCourseResources(course: Course): Promise<CourseResource[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteCourseResources(this.session, course);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getWeeklyTimetable\");\n  }\n\n  async getChats(): Promise<Chat[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteChats(this.session, this.accountId);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getChats\");\n  }\n\n  async getChatRecipients(chat: Chat): Promise<Recipient[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteChatRecipients(this.session, chat);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getChatRecipients\");\n  }\n\n  async getChatMessages(chat: Chat): Promise<Message[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteChatMessages(this.session, this.accountId, chat);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getChatMessages\");\n  }\n\n  async getRecipientsAvailableForNewChat(): Promise<Recipient[]> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return fetchPronoteRecipients(this.session);\n    }\n\n    error(\"Session is not valid\", \"Pronote.getRecipientsAvailableForNewChat\");\n  }\n\n  async sendMessageInChat(chat: Chat, content: string): Promise<void> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      await sendPronoteMessageInChat(this.session, chat, content);\n    }\n\n    error(\"Session is not valid\", \"Pronote.sendMessageInChat\");\n  }\n\n  async setNewsAsAcknowledged(news: News): Promise<News> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return setPronoteNewsAsAcknowledged(this.session, news);\n    }\n\n    error(\"Session is not valid\", \"Pronote.setNewsAsAcknowledged\");\n  }\n\n  async setHomeworkCompletion(homework: Homework, state?: boolean): Promise<Homework> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return setPronoteHomeworkAsDone(this.session, homework, state)\n    }\n    error(\"Session is not valid\", \"Pronote.setHomeworkCompletion\")\n  }\n\n  async createMail(subject: string, content: string, recipients: Recipient[]): Promise<Chat> {\n    await this.checkTokenValidty()\n\n    if (this.session) {\n      return createPronoteMail(this.session, this.accountId, subject, content, recipients)\n    }\n\n    error(\"Session is not valid\", \"Skolengo.createMail\")\n  }\n}\n"
  },
  {
    "path": "services/pronote/news.ts",
    "content": "import { news as PawnoteNews, NewsInformation, newsInformationAcknowledge, SessionHandle } from \"pawnote\";\n\nimport { News } from \"@/services/shared/news\";\nimport { error } from \"@/utils/logger/logger\";\n\n/**\n * Fetches news from PRONOTE.\n * @param {SessionHandle} session - The session handle for the PRONOTE account.\n * @param {string} accountId - The ID of the account requesting the homeworks.\n * @returns {Promise<News[]>} A promise that resolves to an array of News objects.\n */\nexport async function fetchPronoteNews(session: SessionHandle, accountId: string): Promise<News[]> {\n  const result: News[] = [];\n\n  const response = await PawnoteNews(session) as unknown as { items: NewsInformation[] };\n  const news = response.items;\n  for (const item of news) {\n    result.push({\n      id: item.id,\n      title: item.title,\n      createdAt: item.creationDate,\n      acknowledged: item.read,\n      attachments: (item.attachments ?? []).map((attachment) => ({\n        type: attachment.kind,\n        name: attachment.name,\n        url: attachment.url,\n        createdByAccount: accountId\n      })),\n      content: item.content,\n      author: item.author,\n      category: item.category.name,\n      ref: item,\n      createdByAccount: accountId,\n      question: item.question\n    });\n  }\n  return result;\n}\n\nexport async function setPronoteNewsAsAcknowledged(\n  session: SessionHandle,\n  news: News\n): Promise<News> {\n  if (news.ref) {\n    await newsInformationAcknowledge(session, news.ref as NewsInformation);\n    return {\n\t  ...news,\n\t  acknowledged: true,\n    };\n  }\n\n  error(\"Reference for news item is missing.\", \"setPronoteNewsAsAcknowledged\");\n}"
  },
  {
    "path": "services/pronote/refresh.ts",
    "content": "import { AccountKind, createSessionHandle, loginToken, SessionHandle } from \"pawnote\";\n\nimport { useAccountStore } from \"@/stores/account\";\nimport { Auth } from \"@/stores/account/types\";\nimport { customFetcher } from \"@/utils/pronote/fetcher\";\n\n/**\n * Refreshes the Pronote account credentials using the provided authentication data.\n * @param credentials\n * @returns {Promise<Auth>} A promise that resolves to the updated authentication data.\n */\nexport async function refreshPronoteAccount(\n  accountId: string,\n  credentials: Auth\n): Promise<{auth: Auth, session: SessionHandle}> {\n  const handle = createSessionHandle(customFetcher);\n  const refresh = await loginToken(handle, {\n    url: String(credentials.additionals?.[\"instanceURL\"] || \"\"),\n    kind: (credentials.additionals?.[\"kind\"] as AccountKind) || AccountKind.STUDENT,\n    username: String(credentials.additionals?.[\"username\"] || \"\"),\n    token: String(credentials.refreshToken ?? \"\"),\n    deviceUUID: String(credentials.additionals?.[\"deviceUUID\"] || \"\"),\n  });\n\n  const auth: Auth = {\n    accessToken: refresh.token,\n    refreshToken: refresh.token,\n    additionals: {\n      instanceURL: refresh.url,\n      kind: refresh.kind,\n      username: refresh.username,\n      deviceUUID: String(credentials.additionals?.[\"deviceUUID\"] || \"\"),\n    },\n  }\n\n  useAccountStore.getState().updateServiceAuthData(accountId, auth)\n\n  return {\n    auth: auth,\n    session: handle\n  };\n}"
  },
  {
    "path": "services/pronote/timetable.ts",
    "content": "import {\n  parseTimetable, resource,\n  SessionHandle,\n  TabLocation,\n  TimetableClassActivity,\n  TimetableClassDetention,\n  TimetableClassLesson,\n  timetableFromWeek,\n  translateToWeekNumber,\n} from \"pawnote\";\n\nimport { getDateRangeOfWeek } from \"@/database/useHomework\";\nimport { Course, CourseDay, CourseResource, CourseStatus, CourseType } from \"@/services/shared/timetable\";\nimport { error } from \"@/utils/logger/logger\";\n\nexport async function fetchPronoteWeekTimetable(\n  session: SessionHandle,\n  accountId: string,\n  weekNumberRaw: number,\n  date: Date\n): Promise<CourseDay[]> {\n  if (!session) {\n    error(\"Session is undefined\", \"fetchPronoteTimetable\");\n  }\n\n  const weekNumber = translateToWeekNumber(date, session.instance.firstMonday);\n  const timetable = await timetableFromWeek(session, weekNumber);\n\n  parseTimetable(session, timetable, {\n    withSuperposedCanceledClasses: false,\n    withCanceledClasses: true,\n    withPlannedClasses: true,\n  });\n\n  const mappedCourses = mapCourses(accountId, timetable.classes);\n  const dayMap: Record<string, Course[]> = {};\n\n  for (const course of mappedCourses) {\n    const dayKey = course.from.toISOString().split(\"T\")[0];\n    dayMap[dayKey] = dayMap[dayKey] || [];\n    dayMap[dayKey].push(course);\n  }\n\n  for (const day in dayMap) {\n    dayMap[day].sort((a, b) => a.from.getTime() - b.from.getTime());\n  }\n\n  return Object.entries(dayMap).map(([day, courses]) => ({\n    date: new Date(day),\n    courses\n  }));\n}\n\nconst mapCourses = (\n  accountId: string,\n  courses: (\n    | TimetableClassLesson\n    | TimetableClassDetention\n    | TimetableClassActivity\n  )[]\n): Course[] => {\n  const courseList: Course[] = [];\n\n  for (const c of courses) {\n    const baseCourse = {\n      from: c.startDate,\n      to: c.endDate,\n      backgroundColor: c.backgroundColor,\n      additionalInfo: c.notes,\n      createdByAccount: accountId\n    }\n    if (c.is === \"lesson\") {\n      courseList.push({\n        subject: c.subject!.name,\n        id: c.id,\n        type: CourseType.LESSON,\n        room: c.classrooms.join(\", \"),\n        teacher: c.teacherNames.join(\", \"),\n        group: c.groupNames.join(\", \"),\n        status: mapCourseStatus(c),\n        customStatus: c.status,\n        resourceId: c.lessonResourceID,\n        ...baseCourse\n      });\n    } else if (c.is === \"detention\") {\n      courseList.push({\n        id: c.id,\n        type: CourseType.DETENTION,\n        subject: c.title ?? \"Detention\",\n        room: c.classrooms.join(\", \"),\n        ...baseCourse\n      });\n    } else if (c.is === \"activity\") {\n      courseList.push({\n        id: c.id,\n        type: CourseType.ACTIVITY,\n        subject: c.title,\n        ...baseCourse\n      });\n    }\n  }\n\n  return courseList;\n};\n\nexport async function fetchPronoteCourseResources(\n  session: SessionHandle,\n  course: Course\n): Promise<CourseResource[]> {\n  if (!session) {\n    error(\"Session is undefined\", \"fetchPronoteCourseResources\");\n  }\n\n  const timetableTab = session.user.resources[0].tabs.get(\n    TabLocation.Timetable\n  );\n  if (!timetableTab) {\n    error(\"Timetable tab not found in session\", \"fetchPronoteCourseResources\");\n  }\n\n  if (!course.resourceId) {\n    error(\"Course resource ID is undefined\", \"fetchPronoteCourseResources\");\n  }\n\n  const resources = (await resource(session, course.resourceId)).contents;\n\n  return resources.map(r => ({\n    title: r.title,\n    description: r.description,\n    category: r.category,\n    attachments: r.files.map(a => ({\n      type: a.kind,\n      name: a.name,\n      url: a.url,\n      createdByAccount: session.user.resources[0].id\n    }))\n  }))\n}\n\nconst mapCourseStatus = (course: TimetableClassLesson): CourseStatus | undefined => {\n  // eslint-disable-next-line default-case\n  switch (course.status) {\n  case \"Cours annulé\":\n  case \"Prof. absent\":\n  case \"Classe absente\":\n  case \"Prof./pers. absent\":\n  case \"Sortie pédagogique\":\n    return CourseStatus.CANCELED;\n  }\n\n  if (course.test) {\n    return CourseStatus.EVALUATED;\n  }\n\n  return undefined\n};"
  },
  {
    "path": "services/shared/attachment.ts",
    "content": "import { GenericInterface } from \"@/services/shared/types\";\n\n/**\n *\n * Represents an attachment used in homework or other contexts.\n * @property {AttachmentType} type - The type of the attachment (file or link).\n * @property {string} name - The name of the attachment.\n * @property {string} url - The URL or path to the attachment.\n */\nexport interface Attachment extends GenericInterface {\n  type: AttachmentType;\n  name: string;\n  url: string;\n}\n\nexport enum AttachmentType {\n  LINK,\n  FILE\n}"
  },
  {
    "path": "services/shared/attendance.ts",
    "content": "import { Attachment } from \"@/services/shared/attachment\";\nimport { GenericInterface } from \"@/services/shared/types\";\n\nexport interface Attendance extends GenericInterface {\n  delays: Delay[];\n  absences: Absence[];\n  punishments: Punishment[];\n  observations: Observation[];\n}\n\nexport interface Delay extends GenericInterface {\n  id: string;\n  givenAt: Date;\n  reason?: string;\n  justified: boolean;\n  duration: number;\n}\n\nexport enum ObservationType {\n  LogBookIssue,\n  Observation,\n  Encouragement,\n  Other\n}\n\nexport interface Observation {\n  id: string;\n  givenAt: Date;\n  sectionName: string;\n  sectionType: ObservationType;\n  subjectName?: string;\n  shouldParentsJustify: boolean;\n  reason?: string;\n}\n\nexport interface Absence extends GenericInterface {\n  id: string;\n  from: Date;\n  to: Date;\n  reason?: string;\n  timeMissed: number;\n  justified: boolean;\n}\n\nexport interface Punishment {\n  id: string;\n  givenAt: Date;\n  givenBy: string;\n  exclusion: boolean;\n  duringLesson: boolean;\n  homework: {\n    text: string;\n    documents: Attachment[];\n  };\n\n  reason: {\n    text: string;\n    circumstances: string;\n    documents: Attachment[];\n  };\n  nature: string;\n  duration: number;\n}\n"
  },
  {
    "path": "services/shared/balance.ts",
    "content": "import { GenericInterface } from \"./types\";\n\nexport interface Balance extends GenericInterface {\n\tamount: number;\n\tcurrency: string;\n\tlunchRemaining: number;\n\tlunchPrice: number;\n\tlabel: string\n}"
  },
  {
    "path": "services/shared/canteen.ts",
    "content": "import { BookingDay as TurboBookingDay } from \"turboself-api\";\nimport { BookingDay as AliseBookingDay } from \"alise-api\";\n\nimport { GenericInterface } from \"./types\";\n\nexport interface CanteenMenu extends GenericInterface {\n  date: Date;\n  lunch?: Meal;\n  dinner?: Meal;\n}\n\nexport interface Meal {\n  entry: Food[];\n  main?: Food[];\n  side?: Food[];\n  cheese?: Food[];\n  dessert?: Food[];\n  drink?: Food[];\n}\n\nexport interface Food {\n  name: string;\n  allergens?: string[];\n}\n\nexport interface CanteenHistoryItem extends GenericInterface {\n  date: Date;\n  label: string;\n  currency: string;\n  amount: number;\n}\n\nexport interface QRCode extends GenericInterface {\n\ttype: QRType,\n\tdata: string\n}\n\nexport enum QRType {\n\tQRCode,\n\tBarcode\n}\n\nexport interface BookingDay {\n\tdate: Date,\n\tavailable: Booking[]\n}\n\nexport interface Booking extends GenericInterface  {\n\tid: string,\n\tlabel: string,\n\tcanBook: boolean,\n\tbooked: boolean,\n\tref?: TurboBookingDay\n}\n\nexport enum CanteenKind {\n  FORFAIT,\n  ARGENT\n}"
  },
  {
    "path": "services/shared/chat.ts",
    "content": "import { Discussion, NewDiscussionRecipient } from \"pawnote\";\nimport { Mail, Recipients } from \"skolengojs\";\n\nimport { Attachment } from \"@/services/shared/attachment\";\nimport { GenericInterface } from \"@/services/shared/types\";\n\nexport interface Chat extends GenericInterface {\n  id: string;\n  subject: string;\n  recipient?: string;\n  creator?: string;\n  date: Date;\n  ref?: Discussion | Mail;\n}\n\nexport interface Recipient {\n  id: string;\n  name: string;\n  class?: string;\n  ref?: NewDiscussionRecipient | Recipients\n}\n\nexport interface Message {\n  id: string;\n  content: string;\n  author: string;\n  subject: string;\n  date: Date;\n  attachments: Attachment[]\n}"
  },
  {
    "path": "services/shared/grade.ts",
    "content": "import { Attachment } from \"@/services/shared/attachment\";\nimport { GenericInterface } from \"@/services/shared/types\";\n\nexport interface PeriodGrades extends GenericInterface {\n  studentOverall: GradeScore;\n  classAverage: GradeScore;\n  subjects: Subject[];\n  modules?: Subject[];\n  rank?: GradeScore;\n  features?: {\n    [key: string]: any;\n  };\n}\n\nexport interface Subject {\n  id: string;\n  name: string;\n  studentAverage: GradeScore;\n  classAverage: GradeScore;\n  maximum?: GradeScore;\n  minimum?: GradeScore;\n  outOf: GradeScore;\n  grades?: Grade[];\n  credits?: GradeScore;\n  rank?: GradeScore;\n}\n\nexport interface Grade extends GenericInterface {\n  id: string;\n  subjectId: string;\n  subjectName: string;\n  description: string;\n  givenAt?: Date;\n  subjectFile?: Attachment;\n  correctionFile?: Attachment;\n  bonus?: boolean;\n  optional?: boolean;\n  outOf: GradeScore;\n  coefficient: number;\n  studentScore?: GradeScore;\n  averageScore?: GradeScore;\n  minScore?: GradeScore;\n  maxScore?: GradeScore;\n  rank?: GradeScore;\n}\n\nexport interface GradeScore {\n  value: number;\n  outOf?: number;\n  status?: string;\n  disabled?: boolean;\n}\n\nexport interface Period extends GenericInterface {\n  name: string\n  id?: string\n  start: Date\n  end: Date\n}"
  },
  {
    "path": "services/shared/homework.ts",
    "content": "import { Assignment } from \"skolengojs\";\n\nimport { Attachment } from \"@/services/shared/attachment\";\nimport { GenericInterface } from \"@/services/shared/types\";\n\n/**\n *  This interface defines the general structure of a homework object.\n *  @property {string} id - Unique Identifier for each item.\n *  @property {string} subject - The subject of the homework.\n *  @property {string} content - The content or description of the homework in HTML.\n *  @property {Date} dueDate - The date when the homework is due.\n *  @property {boolean} isDone - Indicates whether the homework has been completed.\n *  @property {ReturnFormat} returnFormat - The format in which the homework should be returned.\n *  @property {Array<Attachment>} attachments - List of attachments related to the homework.\n *  @property {boolean} evaluation - Indicates whether the homework is subject to evaluation.\n *  @property {boolean} custom - Indicates whether the homework is custom or predefined.\n *  @property {string} createdByAccount - The local account ID of the user who created the homework, useful for the manager.\n */\nexport interface Homework extends GenericInterface{\n  id: string;\n  subject: string;\n  content: string;\n  dueDate: Date;\n  isDone: boolean;\n  returnFormat?: ReturnFormat;\n  attachments: Attachment[];\n  evaluation: boolean;\n  custom: boolean;\n  progress?: number;\n\tref?: Assignment;\n}\n\nexport enum ReturnFormat {\n  PAPER,\n  FILE_UPLOAD\n}"
  },
  {
    "path": "services/shared/index.ts",
    "content": "import * as Network from \"expo-network\";\n\nimport {\n  addAttendanceToDatabase,\n  getAttendanceFromCache,\n} from \"@/database/useAttendance\";\nimport {\n  addBalancesToDatabase,\n  getBalancesFromCache,\n} from \"@/database/useBalance\";\nimport {\n  addCanteenMenuToDatabase,\n  addCanteenTransactionToDatabase,\n  getCanteenMenuFromCache,\n  getCanteenTransactionsFromCache,\n} from \"@/database/useCanteen\";\nimport {\n  addChatsToDatabase,\n  addMessagesToDatabase,\n  addRecipientsToDatabase,\n  getChatsFromCache,\n  getMessagesFromCache,\n  getRecipientsFromCache,\n} from \"@/database/useChat\";\nimport {\n  addPeriodGradesToDatabase,\n  addPeriodsToDatabase,\n  getGradePeriodsFromCache,\n  getPeriodsFromCache,\n} from \"@/database/useGrades\";\nimport {\n  addHomeworkToDatabase,\n  getHomeworksFromCache,\n} from \"@/database/useHomework\";\nimport { addKidToDatabase, getKidsFromCache } from \"@/database/useKids\";\nimport { addNewsToDatabase, getNewsFromCache } from \"@/database/useNews\";\nimport {\n  addCourseDayToDatabase,\n  getCoursesFromCache,\n} from \"@/database/useTimetable\";\nimport { Attendance } from \"@/services/shared/attendance\";\nimport {\n  Booking,\n  BookingDay,\n  CanteenHistoryItem,\n  CanteenMenu,\n  QRCode,\n} from \"@/services/shared/canteen\";\nimport { Chat, Message, Recipient } from \"@/services/shared/chat\";\nimport { Period, PeriodGrades } from \"@/services/shared/grade\";\nimport { Homework } from \"@/services/shared/homework\";\nimport { News } from \"@/services/shared/news\";\nimport { Course, CourseDay, CourseResource } from \"@/services/shared/timetable\";\nimport {\n  Capabilities,\n  FetchOptions,\n  SchoolServicePlugin,\n} from \"@/services/shared/types\";\nimport { useAccountStore } from \"@/stores/account\";\nimport { Account, ServiceAccount, Services } from \"@/stores/account/types\";\nimport { error, log, warn } from \"@/utils/logger/logger\";\n\nimport { AuthenticationError } from \"../errors/AuthenticationError\";\nimport { Balance } from \"./balance\";\nimport { Kid } from \"./kid\";\n\nexport class AccountManager {\n  private clients: Record<string, SchoolServicePlugin> = {};\n\n  constructor(readonly account: Account) {}\n\n  removeService(id: string): void {\n    delete this.clients[id];\n  }\n\n  getAccount(): Account {\n    return this.account;\n  }\n\n  async refreshAllAccounts(): Promise<boolean> {\n    log(\"We're refreshing all services for the account \" + this.account.id);\n\n    this.handleHasInternet();\n\n    let refreshedAtLeastOne = false;\n\n    for (const service of this.account.services) {\n      try {\n        log(\"Trying to refresh \" + service.id);\n        const plugin = this.getServicePluginForAccount(service);\n\n        if (plugin?.capabilities.includes(Capabilities.REFRESH)) {\n          this.clients[service.id] = await plugin.refreshAccount(service.auth);\n          refreshedAtLeastOne = true;\n          log(\"Successfully refreshed \" + service.id);\n        } else {\n          this.clients[service.id] = plugin;\n          log(\n            \"Plugin for \" +\n              service.id +\n              \" doesn't support refresh but is available for other capabilities\"\n          );\n        }\n      } catch (e) {\n        throw new AuthenticationError(String(e), service)\n      }\n    }\n\n    log(\n      \"Finished refreshing process for all services, services refreshed: \" +\n        Object.keys(this.clients).length\n    );\n    return refreshedAtLeastOne;\n  }\n\n  async getCanteenKind(clientId: string): Promise<CanteenKind> {\n    return await this.fetchData(\n      Capabilities.CANTEEN_BALANCE,\n      async client =>\n        client.getCanteenKind ? client.getCanteenKind() : CanteenKind.ARGENT,\n      {\n        multiple: false,\n        clientId,\n      }\n    );\n  }\n\n  async getKids(): Promise<Kid[]> {\n    return await this.fetchData(\n      Capabilities.HAVE_KIDS,\n      async client => (client.getKids ? client.getKids() : []),\n      {\n        multiple: true,\n        fallback: async () => getKidsFromCache(),\n        saveToCache: async (data: Kid[]) => {\n          await addKidToDatabase(data);\n        },\n      }\n    );\n  }\n\n  async getHomeworks(weekNumber: number): Promise<Homework[]> {\n    return await this.fetchData(\n      Capabilities.HOMEWORK,\n      async client =>\n        client.getHomeworks ? await client.getHomeworks(weekNumber) : [],\n      {\n        multiple: true,\n        fallback: async () => getHomeworksFromCache(weekNumber),\n        saveToCache: async (data: Homework[]) => {\n          await addHomeworkToDatabase(data);\n        },\n      }\n    );\n  }\n\n  async getNews(): Promise<News[]> {\n    return await this.fetchData(\n      Capabilities.NEWS,\n      async client => (client.getNews ? await client.getNews() : []),\n      {\n        multiple: true,\n        fallback: async () => getNewsFromCache(),\n        saveToCache: async (data: News[]) => {\n          await addNewsToDatabase(data);\n        },\n      }\n    );\n  }\n\n  async getGradesForPeriod(\n    period: Period,\n    clientId: string,\n    kid?: Kid\n  ): Promise<PeriodGrades> {\n    return await this.fetchData(\n      Capabilities.GRADES,\n      async client =>\n        client.getGradesForPeriod\n          ? await client.getGradesForPeriod(period, kid)\n          : error(\"Bad Implementation\"),\n      {\n        multiple: false,\n        clientId,\n        fallback: async () => getGradePeriodsFromCache(period.name),\n        saveToCache: async (data: PeriodGrades) => {\n          await addPeriodGradesToDatabase(data, period.name);\n        },\n      }\n    );\n  }\n\n  async getGradesPeriods(): Promise<Period[]> {\n    return await this.fetchData(\n      Capabilities.GRADES,\n      async client =>\n        client.getGradesPeriods ? await client.getGradesPeriods() : [],\n      {\n        multiple: true,\n        fallback: async () => getPeriodsFromCache(),\n        saveToCache: async (data: Period[]) => {\n          await addPeriodsToDatabase(data);\n        },\n      }\n    );\n  }\n\n  async getAttendanceForPeriod(period: string): Promise<Attendance[]> {\n    return await this.fetchData(\n      Capabilities.ATTENDANCE,\n      async client => {\n        if (!client.getAttendanceForPeriod) {\n          throw new Error(\n            \"getAttendanceForPeriod not implemented but the capability is set.\"\n          );\n        }\n        const attendance = await client.getAttendanceForPeriod(period);\n        return Array.isArray(attendance) ? attendance : [attendance];\n      },\n      {\n        multiple: true,\n        fallback: async () => [await getAttendanceFromCache(period)],\n        saveToCache: async (data: Attendance[]) => {\n          await addAttendanceToDatabase(data, period);\n        },\n      }\n    );\n  }\n\n  async getAttendancePeriods(): Promise<Period[]> {\n    return await this.fetchData(\n      Capabilities.ATTENDANCE_PERIODS,\n      async client =>\n        client.getAttendancePeriods ? await client.getAttendancePeriods() : [],\n      {\n        multiple: true,\n        fallback: async () => getPeriodsFromCache(),\n        saveToCache: async (data: Period[]) => {\n          await addPeriodsToDatabase(data);\n        },\n      }\n    );\n  }\n\n  async getWeeklyCanteenMenu(startDate: Date): Promise<CanteenMenu[]> {\n    return await this.fetchData(\n      Capabilities.CANTEEN_MENU,\n      async client =>\n        client.getWeeklyCanteenMenu\n          ? await client.getWeeklyCanteenMenu(startDate)\n          : [],\n      {\n        multiple: true,\n        fallback: async () => getCanteenMenuFromCache(startDate),\n        saveToCache: async (data: CanteenMenu[]) => {\n          await addCanteenMenuToDatabase(data);\n        },\n      }\n    );\n  }\n\n  async getChats(): Promise<Chat[]> {\n    return await this.fetchData(\n      Capabilities.CHAT_READ,\n      async client => (client.getChats ? await client.getChats() : []),\n      {\n        multiple: true,\n        fallback: async () => getChatsFromCache(),\n        saveToCache: async (data: Chat[]) => {\n          await addChatsToDatabase(data);\n        },\n      }\n    );\n  }\n\n  async getChatRecipients(chat: Chat): Promise<Recipient[]> {\n    return await this.fetchData(\n      Capabilities.CHAT_READ,\n      async client =>\n        client.getChatRecipients ? await client.getChatRecipients(chat) : [],\n      {\n        multiple: true,\n        clientId: chat.createdByAccount,\n        fallback: async () => getRecipientsFromCache(chat),\n        saveToCache: async (data: Recipient[]) => {\n          await addRecipientsToDatabase(chat, data);\n        },\n      }\n    );\n  }\n\n  async getChatMessages(chat: Chat): Promise<Message[]> {\n    return await this.fetchData(\n      Capabilities.CHAT_READ,\n      async client =>\n        client.getChatMessages ? await client.getChatMessages(chat) : [],\n      {\n        multiple: true,\n        clientId: chat.createdByAccount,\n        fallback: async () => getMessagesFromCache(chat),\n        saveToCache: async (data: Message[]) => {\n          await addMessagesToDatabase(chat, data);\n        },\n      }\n    );\n  }\n\n  async getRecipientsAvailableForNewChat(): Promise<Recipient[]> {\n    return await this.fetchData(\n      Capabilities.CHAT_READ,\n      async client =>\n        client.getRecipientsAvailableForNewChat\n          ? await client.getRecipientsAvailableForNewChat()\n          : [],\n      { multiple: true }\n    );\n  }\n\n  async getWeeklyTimetable(weekNumber: number, date: Date): Promise<CourseDay[]> {\n    return await this.fetchData(\n      Capabilities.TIMETABLE,\n      async client =>\n        client.getWeeklyTimetable\n          ? await client.getWeeklyTimetable(weekNumber, date)\n          : [],\n      {\n        multiple: true,\n        fallback: async () => getCoursesFromCache([weekNumber], date.getFullYear()),\n        saveToCache: async (data: CourseDay[]) => {\n          addCourseDayToDatabase(data);\n        },\n      }\n    );\n  }\n\n  async getCourseResources(course: Course): Promise<CourseResource[]> {\n    return await this.fetchData(\n      Capabilities.TIMETABLE,\n      async client =>\n        client.getCourseResources\n          ? await client.getCourseResources(course)\n          : [],\n      { multiple: true, clientId: course.createdByAccount }\n    );\n  }\n\n  async sendMessageInChat(chat: Chat, content: string): Promise<void> {\n    return await this.fetchData(\n      Capabilities.CHAT_REPLY,\n      async client => {\n        if (client.sendMessageInChat) {\n          await client.sendMessageInChat(chat, content);\n        }\n      },\n      { clientId: chat.createdByAccount }\n    );\n  }\n\n  async setNewsAsDone(news: News): Promise<News> {\n    return await this.fetchData(\n      Capabilities.NEWS,\n      async client =>\n        client.setNewsAsAcknowledged\n          ? await client.setNewsAsAcknowledged(news)\n          : news,\n      { multiple: false, clientId: news.createdByAccount }\n    );\n  }\n\n  async setHomeworkCompletion(\n    homework: Homework,\n    state?: boolean\n  ): Promise<Homework> {\n    return await this.fetchData(\n      Capabilities.HOMEWORK,\n      async client =>\n        client.setHomeworkCompletion\n          ? await client.setHomeworkCompletion(homework, state)\n          : homework,\n      { multiple: false, clientId: homework.createdByAccount }\n    );\n  }\n\n  async createMail(\n    accountId: string,\n    subject: string,\n    content: string,\n    recipients: Recipient[],\n    cc?: Recipient[],\n    bcc?: Recipient[]\n  ): Promise<Chat> {\n    return await this.fetchData(\n      Capabilities.CHAT_CREATE,\n      async client => {\n        if (client.createMail) {\n          return await client.createMail(subject, content, recipients, cc, bcc);\n        }\n        throw new Error(\"createMail not implemented\");\n      },\n      { multiple: false, clientId: accountId }\n    );\n  }\n\n  async getCanteenBalances(): Promise<Balance[]> {\n    return await this.fetchData(\n      Capabilities.CANTEEN_BALANCE,\n      async client =>\n        client.getCanteenBalances ? await client.getCanteenBalances() : [],\n      {\n        multiple: true,\n        fallback: async () => getBalancesFromCache(),\n        saveToCache: async (data: Balance[]) => {\n          await addBalancesToDatabase(data);\n        },\n      }\n    );\n  }\n\n  async getCanteenTransactionsHistory(\n    clientId: string\n  ): Promise<CanteenHistoryItem[]> {\n    return await this.fetchData(\n      Capabilities.CANTEEN_HISTORY,\n      async client =>\n        client.getCanteenTransactionsHistory\n          ? await client.getCanteenTransactionsHistory()\n          : [],\n      {\n        multiple: true,\n        clientId,\n        fallback: async () => getCanteenTransactionsFromCache(),\n        saveToCache: async (data: CanteenHistoryItem[]) => {\n          await addCanteenTransactionToDatabase(data);\n        },\n      }\n    );\n  }\n\n  async getCanteenQRCodes(clientId: string): Promise<QRCode> {\n    return await this.fetchData(\n      Capabilities.CANTEEN_QRCODE,\n      async client =>\n        client.getCanteenQRCodes\n          ? await client.getCanteenQRCodes()\n          : error(\"getCanteenQRCodes not found\"),\n      {\n        multiple: false,\n        clientId,\n      }\n    );\n  }\n\n  async getCanteenBookingWeek(\n    weekNumber: number,\n    clientId: string\n  ): Promise<BookingDay[]> {\n    return await this.fetchData(\n      Capabilities.CANTEEN_BOOKINGS,\n      async client =>\n        client.getCanteenBookingWeek\n          ? await client.getCanteenBookingWeek(weekNumber)\n          : [],\n      {\n        multiple: true,\n        clientId,\n      }\n    );\n  }\n\n  async setMealAsBooked(meal: Booking, booked?: boolean): Promise<Booking> {\n    return await this.fetchData(\n      Capabilities.CANTEEN_BOOKINGS,\n      async client =>\n        client.setMealAsBooked\n          ? await client.setMealAsBooked(meal, booked)\n          : meal,\n      { multiple: false, clientId: meal.createdByAccount }\n    );\n  }\n\n  clientHasCapatibility(capatibility: Capabilities, clientId: string): boolean {\n    const client = this.clients[clientId];\n    if (client?.capabilities.includes(capatibility)) {\n      return true;\n    }\n    return false;\n  }\n\n  getAvailableClients(capability: Capabilities): SchoolServicePlugin[] {\n    return Object.values(this.clients).filter(client =>\n      client.capabilities.includes(capability)\n    );\n  }\n\n  private async handleHasInternet<T>(\n    options?: FetchOptions<T | T[]>\n  ): Promise<T | T[] | void> {\n    const networkState = await Network.getNetworkStateAsync();\n    const hasInternet = networkState.isInternetReachable ?? false;\n    if (!hasInternet) {\n      warn(\"No internet connection, using fallback if available.\");\n      if (options?.fallback) {\n        return await options.fallback();\n      }\n      throw new Error(\"Internet not reachable and no fallback provided.\");\n    }\n  }\n\n  private async fetchData<T>(\n    capability: Capabilities,\n    callback: (client: SchoolServicePlugin) => Promise<T[]>,\n    options?: FetchOptions<T[]> & { multiple: true }\n  ): Promise<T[]>;\n\n  private async fetchData<T>(\n    capability: Capabilities,\n    callback: (client: SchoolServicePlugin) => Promise<T>,\n    options?: FetchOptions<T> & { multiple?: false }\n  ): Promise<T>;\n\n  private async fetchData<T>(\n    capability: Capabilities,\n    callback: (client: SchoolServicePlugin) => Promise<T | T[]>,\n    options?: FetchOptions<T | T[]> & { multiple?: boolean }\n  ): Promise<T | T[]> {\n    const resultFromFallback = await this.handleHasInternet<T>(options);\n    if (resultFromFallback !== undefined) {\n      return resultFromFallback;\n    }\n    try {\n      if (options?.clientId !== undefined) {\n        const client = this.clients[options.clientId];\n        if (!client) {\n          error(\"Client ID missing\");\n        }\n        if (!client.capabilities.includes(capability)) {\n          error(\n            \"Capability \" +\n              capability +\n              \" not supported by client \" +\n              options.clientId\n          );\n        }\n        const result = await callback(client);\n        if (options.saveToCache) {\n          await options.saveToCache(result);\n        }\n        return result;\n      }\n\n      const availableClients = this.getAvailableClients(capability);\n\n      if (availableClients.length === 0) {\n        log(\n          `No clients available for capability ${capability}, falling back to cache`\n        );\n        if (options?.fallback) {\n          return await options.fallback();\n        }\n        throw new Error(`No clients available for capability: ${capability}`);\n      }\n\n      if (options?.multiple) {\n        const results = await Promise.all(\n          availableClients.map(client => callback(client) as Promise<T[]>)\n        );\n        const combinedResult = results.flat();\n\n        if (options?.saveToCache) {\n          await options.saveToCache(combinedResult);\n        }\n\n        return combinedResult;\n      }\n    } catch (e) {\n      if (options?.fallback) {\n        return await options.fallback();\n      }\n      throw e;\n    }\n\n    error(\n      \"An error occurred while fetching data for capability: \" + capability\n    );\n  }\n\n  private getServicePluginForAccount(\n    service: ServiceAccount\n  ): SchoolServicePlugin {\n    if (service.serviceId === Services.PRONOTE) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const module = require(\"@/services/pronote/index\");\n      return new module.Pronote(service.id);\n    }\n\n    if (service.serviceId === Services.SKOLENGO) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const module = require(\"@/services/skolengo/index\");\n      return new module.Skolengo(service.id);\n    }\n\n    if (service.serviceId === Services.ECOLEDIRECTE) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const module = require(\"@/services/ecoledirecte/index\");\n      return new module.EcoleDirecte(service.id);\n    }\n\n    if (service.serviceId === Services.MULTI) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const module = require(\"@/services/multi/index\");\n      return new module.Multi(service.id);\n    }\n\n    if (service.serviceId === Services.TURBOSELF) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const module = require(\"@/services/turboself/index\");\n      return new module.TurboSelf(service.id);\n    }\n\n    if (service.serviceId === Services.ARD) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const module = require(\"@/services/ard/index\");\n      return new module.ARD(service.id);\n    }\n\n    if (service.serviceId === Services.IZLY) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const module = require(\"@/services/izly/index\");\n      return new module.Izly(service.id);\n    }\n\n    if (service.serviceId === Services.ALISE) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const module = require(\"@/services/alise/index\");\n      return new module.Alise(service.id);\n    }\n\n    if (service.serviceId === Services.APPSCHO) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const module = require(\"@/services/appscho/index\");\n      return new module.Appscho(service.id);\n    }\n\n    if (service.serviceId === Services.LANNION) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const module = require(\"@/services/lannion/index\");\n      return new module.Lannion(service.id);\n    }\n\n    error(\n      \"We're not able to find a plugin for service: \" +\n        service.serviceId +\n        \". Please review your implementation\",\n      \"AccountManager.getServicePluginForAccount\"\n    );\n  }\n}\n\nlet globalManager: AccountManager | null = null;\nconst managerListeners: Array<(manager: AccountManager) => void> = [];\n\nexport const subscribeManagerUpdate = (\n  listener: (manager: AccountManager) => void\n) => {\n  managerListeners.push(listener);\n  if (globalManager) {\n    listener(globalManager);\n  }\n  return () => {\n    const idx = managerListeners.indexOf(listener);\n    if (idx !== -1) {\n      managerListeners.splice(idx, 1);\n    }\n  };\n};\n\nconst notifyManagerListeners = (manager: AccountManager) => {\n  managerListeners.forEach(listener => listener(manager));\n};\n\nexport const initializeAccountManager = async (\n  accountId?: string\n): Promise<AccountManager> => {\n  if (!accountId) {\n    const lastUsedAccount = useAccountStore.getState().lastUsedAccount;\n    if (!lastUsedAccount) {\n      error(\"No account ID provided and no last used account found.\");\n    }\n    accountId = lastUsedAccount;\n  }\n  const account = useAccountStore\n    .getState()\n    .accounts.find(acc => acc.id === accountId);\n\n  if (!account) {\n    error(\"Account not found for ID: \" + accountId);\n  }\n\n  const manager = new AccountManager(account);\n  await manager.refreshAllAccounts();\n  globalManager = manager;\n  notifyManagerListeners(manager);\n  return manager;\n};\n\nexport const getManager = (): AccountManager => {\n  if (!globalManager) {\n    warn(\n      \"Account manager not initialized. Call initializeAccountManager first.\"\n    );\n  }\n  return globalManager;\n};\n"
  },
  {
    "path": "services/shared/kid.ts",
    "content": "import { Skolengo } from \"skolengojs\";\n\nimport { GenericInterface } from \"./types\";\n\nexport interface Kid extends GenericInterface {\n\tid: string,\n\tfirstName: string,\n\tlastName: string,\n\tclass: string,\n\tdateOfBirth: Date,\n\tref?: Skolengo\n}"
  },
  {
    "path": "services/shared/news.ts",
    "content": "import { ActualitiesResponse } from \"esup-multi.js\";\nimport { NewsInformation } from \"pawnote\";\nimport { News as SkolengoNews } from \"skolengojs\";\n\nimport { Attachment } from \"@/services/shared/attachment\";\nimport { GenericInterface } from \"@/services/shared/types\";\n\n/**\n * This interface defines the general structure of a news item.\n * @property {string} id - Unique Identifier for each news item.\n * @property {string} title - The title of the news item.\n * @property {Date} createdAt - The date when the news item was created.\n * @property {boolean} acknowledged - Indicates whether the news item has been acknowledged by the user.\n * @property {Array<Attachment>} attachments - List of attachments related to the news item.\n * @property {string} content - The content or description of the news item in HTML.\n * @property {string} author - The author of the news item.\n * @property {string} category - The category of the news item.\n */\nexport interface News extends GenericInterface {\n  id: string;\n  title?: string;\n  createdAt: Date;\n  acknowledged: boolean;\n  attachments: Attachment[];\n  content: string;\n  author: string;\n  category: string;\n  question?: boolean;\n  ref?: NewsInformation | SkolengoNews | ActualitiesResponse;\n}\n"
  },
  {
    "path": "services/shared/timetable.ts",
    "content": "import { Attachment } from \"@/services/shared/attachment\";\nimport { GenericInterface } from \"@/services/shared/types\";\n\nexport interface CourseDay {\n  date: Date;\n  courses: Course[];\n}\n\nexport interface Course extends GenericInterface {\n  subject: string;\n  id: string;\n  type: CourseType;\n  from: Date;\n  to: Date;\n  additionalInfo?: string;\n  room?: string;\n  teacher?: string;\n  group?: string;\n  backgroundColor?: string;\n  status?: CourseStatus;\n  customStatus?: string;\n  url?: string;\n  resourceId?: string;\n}\n\nexport interface CourseResource {\n  title?: string;\n  description?: string;\n  category: number;\n  attachments: Attachment[]\n}\n\nexport enum CourseType {\n  LESSON,\n  ACTIVITY,\n  DETENTION,\n  VACATION\n}\n\nexport enum CourseStatus {\n  CANCELED,\n  EDITED,\n  ONLINE,\n  EVALUATED\n}"
  },
  {
    "path": "services/shared/types.ts",
    "content": "import { Client } from \"@blockshub/blocksdirecte\";\nimport { User } from \"appscho\";\nimport { Multi as MultiClient } from \"esup-multi.js\";\nimport { Identification } from \"ezly\";\nimport { SessionHandle } from \"pawnote\";\n// import { Client as ArdClient } from \"pawrd\";\nimport { Skolengo as SkolengoSession } from \"skolengojs\";\nimport { Client as TurboselfClient } from \"turboself-api\";\n\nimport { Appscho } from \"@/services/appscho\";\nimport { Lannion } from \"@/services/lannion\";\nimport { LannionClient } from \"@/services/lannion/module\";\nimport { Pronote } from \"@/services/pronote\";\nimport { Attendance } from \"@/services/shared/attendance\";\nimport {\n  Booking,\n  BookingDay,\n  CanteenHistoryItem,\n  CanteenKind,\n  CanteenMenu,\n  QRCode,\n} from \"@/services/shared/canteen\";\nimport { Chat, Message, Recipient } from \"@/services/shared/chat\";\nimport { Period, PeriodGrades } from \"@/services/shared/grade\";\nimport { Homework } from \"@/services/shared/homework\";\nimport { News } from \"@/services/shared/news\";\nimport { Course, CourseDay, CourseResource } from \"@/services/shared/timetable\";\nimport { Auth, Services } from \"@/stores/account/types\";\n\nimport { Alise } from \"../alise\";\nimport { ARD } from \"../ard\";\nimport { EcoleDirecte } from \"../ecoledirecte\";\nimport { Izly } from \"../izly\";\nimport { Multi } from \"../multi\";\nimport { Skolengo } from \"../skolengo\";\nimport { TurboSelf } from \"../turboself\";\nimport { Balance } from \"./balance\";\nimport { Kid } from \"./kid\";\n\n/** Represents a plugin for a school service.\n *\n * @property {string} displayName - The name of the service displayed to the user.\n * @property {Services} service - The identifier for the service.\n * @property {function} refreshAccount - Function used to refresh the account credentials.\n */\nexport interface SchoolServicePlugin {\n  displayName: string;\n  service: Services;\n  capabilities: Capabilities[];\n  authData: Auth;\n  session:\n    | any\n    | Identification\n    | MultiClient\n    | SessionHandle\n    | SkolengoSession\n    | Client\n    | TurboselfClient\n    | User\n    | LannionClient\n    | undefined;\n\n  refreshAccount: (\n    credentials: Auth\n  ) => Promise<Pronote | Skolengo | EcoleDirecte | Multi | TurboSelf | ARD | Izly | Alise | Appscho | Lannion>;\n  getKids?: () => Kid[];\n  getCanteenKind?: () => CanteenKind;\n  getHomeworks?: (weekNumber: number) => Promise<Homework[]>;\n  getNews?: () => Promise<News[]>;\n  getGradesForPeriod?: (period: Period, kid?: Kid) => Promise<PeriodGrades>;\n  getGradesPeriods?: () => Promise<Period[]>;\n  getAttendanceForPeriod?: (period: string) => Promise<Attendance>;\n  getAttendancePeriods?: () => Promise<Period[]>;\n  getWeeklyCanteenMenu?: (startDate: Date) => Promise<CanteenMenu[]>;\n  getChats?: () => Promise<Chat[]>;\n  getChatRecipients?: (chat: Chat) => Promise<Recipient[]>;\n  getChatMessages?: (chat: Chat) => Promise<Message[]>;\n  getRecipientsAvailableForNewChat?: () => Promise<Recipient[]>;\n  getCourseResources?: (course: Course) => Promise<CourseResource[]>;\n  getWeeklyTimetable?: (weekNumber: number, date: Date) => Promise<CourseDay[]>;\n  sendMessageInChat?: (chat: Chat, content: string) => Promise<void>;\n  setNewsAsAcknowledged?: (news: News) => Promise<News>;\n  setHomeworkCompletion?: (\n    homework: Homework,\n    state?: boolean\n  ) => Promise<Homework>;\n  createMail?: (\n    subject: string,\n    content: string,\n    recipients: Recipient[],\n    cc?: Recipient[],\n    bcc?: Recipient[]\n  ) => Promise<Chat>;\n  getCanteenBalances?: () => Promise<Balance[]>;\n  getCanteenTransactionsHistory?: () => Promise<CanteenHistoryItem[]>;\n  getCanteenQRCodes?: () => Promise<QRCode>;\n  getCanteenBookingWeek?: (weekNumber: number) => Promise<BookingDay[]>;\n  setMealAsBooked?: (meal: Booking, booked?: boolean) => Promise<Booking>;\n}\n\n/*\n *\n * Represents the capabilities of a school service plugin.\n * Used to determine what features the plugin supports.\n */\nexport enum Capabilities {\n  REFRESH,\n  HOMEWORK,\n  NEWS,\n  GRADES,\n  ATTENDANCE,\n  ATTENDANCE_PERIODS,\n  CANTEEN_MENU,\n  CHAT_READ,\n  CHAT_CREATE,\n  CHAT_REPLY,\n  TIMETABLE,\n  HAVE_KIDS,\n  CANTEEN_BALANCE,\n  CANTEEN_HISTORY,\n  CANTEEN_BOOKINGS,\n  CANTEEN_QRCODE,\n}\n\n/**\n * Represents a generic interface for objects that have a createdByAccount property.\n *\n * @property {string} createdByAccount - The local account that created the object, useful for the manager.\n */\nexport interface GenericInterface {\n  createdByAccount: string;\n  fromCache?: boolean;\n  kidName?: string;\n}\n\nexport type FetchOptions<T> = {\n  clientId?: string;\n  fallback?: () => Promise<T>;\n  saveToCache?: (data: T) => Promise<void>;\n};\n"
  },
  {
    "path": "services/skolengo/attendance.ts",
    "content": "import { AttendanceItem, AttendanceItemState, AttendanceItemType, Kind, Skolengo } from \"skolengojs\";\n\nimport { Absence, Attendance, Delay } from \"../shared/attendance\";\n\nexport async function fetchSkolengoAttendance(session: Skolengo, accountId: string): Promise<Attendance> {\n  const delays: Delay[] = []\n  const absences: Absence[] = []\n\n  if (session.kind === Kind.STUDENT) {\n    const attendance = await session.GetAttendanceItems()\n    delays.push(...mapSkolengoDelays(attendance, accountId))\n    absences.push(...mapSkolengoAbsences(attendance, accountId))\n  } else {\n    for (const kid of session.kids ?? []) {\n      const attendance = await kid.GetAttendanceItems()\n      delays.push(...mapSkolengoDelays(attendance, accountId, `${kid.firstName} ${kid.lastName}`))\n      absences.push(...mapSkolengoAbsences(attendance, accountId, `${kid.firstName} ${kid.lastName}`))\n    }\n  }\n\n  return {\n    delays,\n    absences,\n    punishments: [],\n    observations: [],\n    createdByAccount: accountId\n  }\n}\n\nfunction mapSkolengoDelays(data: AttendanceItem[], accountId: string, kidName?: string): Delay[] {\n  return data.filter(a => a.type === AttendanceItemType.LATENESS).map(item => ({\n    id: item.id,\n    givenAt: item.startDate,\n    reason: item.reason,\n    justified: (item.state === AttendanceItemState.LOCKED),\n    duration: (item.endDate.getTime() - item.startDate.getTime()) / (1000 * 60),\n    createdByAccount: accountId,\n    kidName: kidName\n  }))\n}\n\nfunction mapSkolengoAbsences(data: AttendanceItem[], accountId: string, kidName?: string): Absence[] {\n  return data.filter(a => a.type === AttendanceItemType.ABSENCE).map(item => ({\n    id: item.id,\n    from: item.startDate,\n    to: item.endDate,\n    reason: item.reason,\n    justified: (item.state === AttendanceItemState.LOCKED),\n    timeMissed: durationToMinutes(item.startDate.getTime(), item.endDate.getTime()),\n    createdByAccount: accountId,\n    kidName: kidName\n  }))\n}\n\nexport function durationToMinutes(timestamp1: number, timestamp2: number): number {\n  return Math.abs(timestamp2 - timestamp1) / (1000 * 60);\n}"
  },
  {
    "path": "services/skolengo/chat.ts",
    "content": "import { Mail, Recipients, Skolengo } from \"skolengojs\";\n\nimport { error } from \"@/utils/logger/logger\";\n\nimport { Chat, Message, Recipient } from \"../shared/chat\";\n\nexport async function fetchSkolengoChats(session: Skolengo, accountId: string): Promise<Chat[]> {\n  const folders = await session.GetAllMails()\n  const mails: Chat[] = folders.flatMap(folder => \n    folder.mails?.map(chat => ({\n      id: chat.id,\n      subject: chat.subject,\n      recipient: chat.participants.join(\", \"),\n      creator: chat.sender?.name,\n      date: chat.date,\n      ref: chat,\n      createdByAccount: accountId\n    })) || []\n  )\n\n  return mails\n}\n\nexport async function fetchSkolengoChatRecipients(chat: Chat): Promise<Recipient[]> {\n  if (!chat.ref && (typeof chat.ref !== typeof Mail)) {\n    error(\"Invalid Chat Reference\")\n  }\n\n  return (chat.ref instanceof Mail) ? chat.ref.participants?.map(p => ({\n    id: p,\n    name: p\n  })) : []\n}\n\nexport async function fetchSkolengoChatMessages(chat: Chat): Promise<Message[]> {\n  if (!chat.ref && (typeof chat.ref !== typeof Mail)) {\n    error(\"Invalid Chat Reference\")\n  }\n\n  const messages = (chat.ref instanceof Mail) ? await chat.ref.getMessages() : error(\"Invalid Chat Reference\");\n  return messages.map(message => ({\n    id: message.id,\n    content: message.content,\n    author: message.author.name,\n    subject: \"\",\n    date: message.date,\n    attachments: []\n  }))\n}\n\nexport async function fetchSkolengoAvailableRecipients(session: Skolengo): Promise<Recipient[]> {\n  const recipients = await session.GetMailSettings()\n  return recipients.recipients.map(recipient => ({\n    id: recipient.id,\n    name: recipient.id,\n    ref: recipient\n  }))\n}\n\nexport async function createSkolengoMail(session: Skolengo, accountId: string, subject: string, content: string, recipients: Recipient[], cc?: Recipient[], bcc?: Recipient[]): Promise<Chat> {\n  const mail = await session.SendMail(subject, content, sharedToSkolengoRecipient(recipients), sharedToSkolengoRecipient(cc ?? []), sharedToSkolengoRecipient(bcc ?? []))\n  return {\n    id: mail.id,\n    subject: subject,\n    recipient: recipients.map(r => r.name).join(\", \"),\n    creator: mail.sender?.name,\n    date: new Date(),\n    ref: mail,\n    createdByAccount: accountId\n  }\n}\n\nfunction sharedToSkolengoRecipient(recipients: Recipient[]): Recipients[] {\n  return recipients.map(recipient => {\n    if (!recipient.ref || typeof recipient.ref !== 'object' || !('type' in recipient.ref)) {\n      throw new Error('Invalid recipient reference');\n    }\n    return {\n      id: recipient.id,\n      type: (recipient.ref).type\n    };\n  });\n}"
  },
  {
    "path": "services/skolengo/grades.ts",
    "content": "import { Grade as SkolengoGrade, Kind,Skolengo, Subject as SkolengoSubjects } from \"skolengojs\";\n\nimport { error } from \"@/utils/logger/logger\";\n\nimport { Grade, GradeScore, Period, PeriodGrades, Subject } from \"../shared/grade\";\n\nexport async function fetchSkolengoGradesForPeriod(session: Skolengo, accountId: string, period: string, kid?: Skolengo): Promise<PeriodGrades> {\n  const getGrades = async (sessionToUse: Skolengo, kidName?: string): Promise<PeriodGrades> => {\n    const subjects = await sessionToUse.GetGradesForPeriod(period)\n    const studentOverall: GradeScore = {\n      value: subjects.reduce((sum, subject) => sum + subject.value, 0) / subjects.length,\n      disabled: false\n    }\n    const classAverage: GradeScore = {\n      value: subjects.reduce((sum, subject) => sum + subject.average, 0) / subjects.length,\n      disabled: false\n    }\n\n    return {\n      createdByAccount: accountId,\n      studentOverall,\n      classAverage,\n      subjects: mapSkolengoSubjects(subjects, accountId, kidName)\n    }\n  }\n  if (session.kind === Kind.STUDENT) {\n    return getGrades(session)\n  } \n  if (kid) {\n    return getGrades(kid, `${kid.firstName} ${kid.lastName}`)\n  }\n  error(\"Kid is not valid\")\n\t\n}\n\nexport async function fetchSkolengoGradePeriods(session: Skolengo, accountId: string): Promise<Period[]> {\n  const result: Period[] = []\n\t\n  if (session.kind === Kind.STUDENT) {\n    const periods = (await session.GetGradesSettings()).periods\n    for (const period of periods) {\n      result.push({\n        name: period.label,\n        id: period.id,\n        start: period.startDate,\n        end: period.endDate,\n        createdByAccount: accountId\n      })\n    }\n  } else {\n    for (const kid of session.kids ?? []) {\n      const periods = (await kid.GetGradesSettings()).periods\n      for (const period of periods) {\n        result.push({\n          name: period.label,\n          id: period.id,\n          start: period.startDate,\n          end: period.endDate,\n          createdByAccount: accountId,\n          kidName: `${kid.firstName} ${kid.lastName}`\n        })\n      }\t\t\n    }\n  }\n  return result\n}\n\nfunction mapSkolengoGrades(grades: SkolengoGrade[], accountId: string, kidName?: string): Grade[] {\n  return grades.map(grade => ({\n    id: grade.id,\n    subjectId: grade.subject?.id ?? \"\",\n    subjectName: grade.subject?.label ?? \"\",\n    description: grade.title ?? \"\",\n    givenAt: grade.date,\n    outOf: { value: grade.outOf },\n    coefficient: grade.coefficient,\n    studentScore: { value: grade.value, disabled: !grade.isGraded, status: grade.notGradedReason },\n    createdByAccount: accountId,\n    kidName: kidName\n  }))\n}\n\nfunction mapSkolengoSubjects(subjects: SkolengoSubjects[], accountId: string, kidName?: string): Subject[] {\n  return subjects.map(subject => ({\n    id: subject.id,\n    name: subject.name,\n    classAverage: { value: subject.average },\n    studentAverage: { value: subject.value },\n    outOf: { value: subject.outOf },\n    grades: mapSkolengoGrades(subject.grades, accountId, kidName)\n  }))\n}\n"
  },
  {
    "path": "services/skolengo/homework.ts",
    "content": "import { Attachment as SkolengoAttachment, Kind, Skolengo } from \"skolengojs\";\n\nimport { getDateRangeOfWeek } from \"@/database/useHomework\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport { Attachment, AttachmentType } from \"../shared/attachment\";\nimport { Homework, ReturnFormat } from \"../shared/homework\";\n\nexport async function fetchSkolengoHomeworks(session: Skolengo, accountId: string, weekNumber: number): Promise<Homework[]> {\n  const {start, end} = getDateRangeOfWeek(weekNumber)\n  const attachments: Record<string, Attachment[]> = {}\n  const result: Homework[] = [];\n\n  const getHomeworks = async (sessionToUse: Skolengo, kidName?: string) => {\n    const homeworks = await sessionToUse.GetAssignments(start, end);\n    for (const homework of homeworks) {\n      const homeworkAttachments = await homework.getAttachments();\n      attachments[homework.id] = homeworkAttachments.map((attachment: SkolengoAttachment) => ({\n        type: AttachmentType.FILE,\n        name: attachment.fileName ?? \"\",\n        url: attachment.url,\n        createdByAccount: accountId,\n        kidName: kidName\n      }));\n\n      result.push({\n        createdByAccount: accountId,\n        id: homework.id,\n        subject: homework.subject.label,\n        content: homework.html,\n        dueDate: homework.dueDateTime,\n        isDone: homework.done,\n        returnFormat: homework.deliverWorkOnline ? ReturnFormat.FILE_UPLOAD : ReturnFormat.PAPER,\n        attachments: attachments[homework.id],\n        evaluation: false,\n        custom: false,\n        ref: homework,\n        kidName: kidName\n      });\n    }\n  };\n\n  if (session.kind === Kind.STUDENT) {\n    await getHomeworks(session);\n  } else {\n    for (const kid of session.kids ?? []) {\n      await getHomeworks(kid, `${kid.firstName} ${kid.lastName}`);\n    }\n  }\n\n  return result;\n}\n\nexport async function setSkolengoHomeworkAsDone(accountId: string, homework: Homework, status?: boolean): Promise<Homework> {\n  if (!homework.ref) {\n    error(\"Invalid Homework Reference\")\n  }\n\n  const state = await homework.ref.setCompletion(status || !homework.isDone)\n  let attachments: Attachment[] = []\n\n  const homeworkAttachments = await state.getAttachments()\n  attachments = homeworkAttachments.map(attachment => ({\n    type: AttachmentType.FILE,\n    name: attachment.fileName ?? \"\",\n    url: attachment.url,\n    createdByAccount: accountId\n  }))\n  return {\n    createdByAccount: accountId,\n    id: state.id,\n    subject: state.subject.label,\n    content: state.html,\n    dueDate: state.dueDateTime,\n    isDone: state.done,\n    returnFormat: state.deliverWorkOnline ? ReturnFormat.FILE_UPLOAD : undefined,\n    attachments: attachments,\n    evaluation: false,\n    custom: false,\n    ref: state\n  }\n}"
  },
  {
    "path": "services/skolengo/index.ts",
    "content": "import { Kind, Permissions, Skolengo as SkolengoSession } from \"skolengojs\";\n\nimport { Auth, Services } from \"@/stores/account/types\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport { Attendance } from \"../shared/attendance\";\nimport { Chat, Message, Recipient } from \"../shared/chat\";\nimport { Period, PeriodGrades } from \"../shared/grade\";\nimport { Homework } from \"../shared/homework\";\nimport { Kid } from \"../shared/kid\";\nimport { News } from \"../shared/news\";\nimport { CourseDay } from \"../shared/timetable\";\nimport { Capabilities, SchoolServicePlugin } from \"../shared/types\";\nimport { fetchSkolengoAttendance } from \"./attendance\";\nimport { createSkolengoMail, fetchSkolengoChatMessages, fetchSkolengoChatRecipients, fetchSkolengoChats } from \"./chat\";\nimport { fetchSkolengoGradePeriods, fetchSkolengoGradesForPeriod } from \"./grades\";\nimport { fetchSkolengoHomeworks, setSkolengoHomeworkAsDone } from \"./homework\";\nimport { fetchSkolengoKids } from \"./kid\";\nimport { fetchSkolengoNews } from \"./news\";\nimport { refreshSkolengoAccount } from \"./refresh\";\nimport { fetchSkolengoTimetable } from \"./timetable\";\n\nexport class Skolengo implements SchoolServicePlugin {\n  displayName = \"Skolengo\";\n  service = Services.SKOLENGO;\n  capabilities: Capabilities[] = [Capabilities.REFRESH, Capabilities.NEWS];\n  session: SkolengoSession | undefined = undefined;\n  authData: Auth = {};\n\n  constructor(public accountId: string){}\n\n  async refreshAccount(credentials: Auth): Promise<Skolengo> {\n    const refresh = (await refreshSkolengoAccount(this.accountId, credentials))\n    this.authData = refresh.auth\n    this.session = refresh.session\n\n    const tabCapabilities: Partial<Record<Permissions, Capabilities>> = {\n      [Permissions.READ_ASSIGNMENTS]: Capabilities.HOMEWORK,\n      [Permissions.READ_MESSAGES]: Capabilities.CHAT_READ,\n      [Permissions.WRITE_MESSAGES]: Capabilities.CHAT_CREATE,\n      [Permissions.READ_ABSENCE_FILES]: Capabilities.ATTENDANCE,\n      [Permissions.READ_LESSONS]: Capabilities.TIMETABLE,\n      [Permissions.READ_EVALUATIONS]: Capabilities.GRADES\n    };\n\n    for (const permission of this.session.permissions) {\n      const capability = tabCapabilities[permission];\n      if (capability) {\n        this.capabilities.push(capability)\n      }\n    }\n\n    if (this.session.kind === Kind.PARENT) {this.capabilities.push(Capabilities.HAVE_KIDS)}\n\n    return this;\n  }\n\n  getKids(): Kid[] {\n    if (this.session) {\n      return fetchSkolengoKids(this.session, this.accountId)\n    }\n\n    error(\"Session is not valid\", \"Skolengo.getKids\");\n  }\n\n  async getHomeworks(weekNumber: number): Promise<Homework[]> {\n    if (this.session) {\n      return fetchSkolengoHomeworks(this.session, this.accountId, weekNumber);\n    }\n\n    error(\"Session is not valid\", \"Skolengo.getHomeworks\");\n  }\n\n  async getNews(): Promise<News[]> {\n    if (this.session) {\n      return fetchSkolengoNews(this.session, this.accountId);\n    }\n\n    error(\"Session is not valid\", \"Skolengo.getNews\");\n  }\n\n  async getGradesForPeriod(period: Period, kid?: Kid): Promise<PeriodGrades> {\n    if (kid?.ref && this.session) {\n      return fetchSkolengoGradesForPeriod(this.session, this.accountId, period.id!, kid?.ref)\n    }\n\t\t\n    if (this.session && this.session.kind === Kind.STUDENT ) {\n      return fetchSkolengoGradesForPeriod(this.session, this.accountId, period.id!);\n    }\n\t\t\n    error(\"Session is not valid\", \"Skolengo.getGradesForPeriod\")\n  }\n\n  async getGradesPeriods(): Promise<Period[]> {\n    if (this.session) {\n      return fetchSkolengoGradePeriods(this.session, this.accountId);\n    }\n\n    error(\"Session is not valid\", \"Skolengo.getGradesPeriods\")\n  }\n\n  async getAttendanceForPeriod(): Promise<Attendance> {\n    if (this.session) {\n      return fetchSkolengoAttendance(this.session, this.accountId);\n    }\n\n    error (\"Session is not valid\", \"Skolengo.getAttendanceForPeriod\")\n  }\n\n  async getWeeklyTimetable(weekNumber: number, date: Date): Promise<CourseDay[]> {\n    if (this.session) {\n      return fetchSkolengoTimetable(this.session, this.accountId, weekNumber)\n    }\n\t\t\n    error(\"Session is not valid\", \"Skolengo.getWeeklyTimetable\")\n  }\n\n  async getChats(): Promise<Chat[]> {\n    if (this.session) {\n      return fetchSkolengoChats(this.session, this.accountId)\n    }\n\n    error(\"Session is not valid\", \"Skolengo.getChats\")\n  }\n\n  async getChatRecipients(chat: Chat): Promise<Recipient[]> {\n    if (this.session) {\n      return fetchSkolengoChatRecipients(chat)\n    }\n\n    error(\"Session is not valid\", \"Skolengo.getChatsRecipients\")\n  }\n\n  async getChatMessages(chat: Chat): Promise<Message[]> {\n    if (this.session) {\n      return fetchSkolengoChatMessages(chat)\n    }\n\n    error(\"Session is not valid\", \"Skolengo.getChatMessages\")\n  }\n\n  async setHomeworkCompletion(homework: Homework, state?: boolean): Promise<Homework> {\n    return setSkolengoHomeworkAsDone(this.accountId, homework, state)\n  }\n\t\n  async createMail(subject: string, content: string, recipients: Recipient[], cc?: Recipient[], bcc?: Recipient[]): Promise<Chat> {\n    if (this.session) {\n      return createSkolengoMail(this.session, this.accountId, subject, content, recipients, cc, bcc)\n    }\n\n    error(\"Session is not valid\", \"Skolengo.createMail\")\n  }\n}"
  },
  {
    "path": "services/skolengo/kid.ts",
    "content": "import { Skolengo } from \"skolengojs\";\n\nimport { Kid } from \"../shared/kid\";\n\nexport function fetchSkolengoKids(session: Skolengo, accountId: string): Kid[] {\n  return (session.kids ?? []).map(kid => ({\n    id: kid.userId,\n    firstName: kid.firstName,\n    lastName: kid.lastName,\n    class: kid.className,\n    dateOfBirth: kid.dateOfBirth,\n    createdByAccount: accountId,\n    ref: kid\n  }))\n}"
  },
  {
    "path": "services/skolengo/news.ts",
    "content": "import { Skolengo } from \"skolengojs\";\n\nimport { AttachmentType } from \"../shared/attachment\";\nimport { News } from \"../shared/news\";\n\nexport async function fetchSkolengoNews(session: Skolengo, accountId: string): Promise<News[]> {\n  const news = await session.GetNews()\n  return news.map(item => ({\n    id: item.id,\n    title: item.title,\n    createdAt: item.publicationDateTime,\n    acknowledged: true,\n    content: item.content,\n    author: item.author.name,\n    category: \"Actualités\",\n    attachments: [{\n      type: AttachmentType.FILE,\n      name: item.illustration.fileName ?? \"\",\n      url: item.illustration.url,\n      createdByAccount: accountId\n    },\n    {\n      type: AttachmentType.LINK,\n      name: item.linkedWebSiteUrl ?? \"\",\n      url: item.linkedWebSiteUrl ?? \"\",\n      createdByAccount: accountId\n    }].filter(attachment => attachment.name && attachment.url),\n    ref: item,\n    createdByAccount: accountId\n  }));\n}"
  },
  {
    "path": "services/skolengo/refresh.ts",
    "content": "import { LoginWithToken, Skolengo } from \"skolengojs\";\n\nimport { useAccountStore } from \"@/stores/account\";\nimport { Auth } from \"@/stores/account/types\";\nimport { error } from \"@/utils/logger/logger\";\n\nexport async function refreshSkolengoAccount(\n  accountId: string,\n  credentials: Auth\n): Promise<{auth: Auth, session: Skolengo}> {\n  if (!credentials.refreshToken) {\n    error(\"Unable to find refreshToken\")\n  }\n  const refreshUrl: string = String(credentials.additionals?.[\"refreshUrl\"] || \"\");\n  const wellKnown: string = String(credentials.additionals?.[\"wellKnown\"] || \"\");\n  const tokenEndpoint: string = String(credentials.additionals?.[\"tokenEndpoint\"] || \"\");\n  const emsCode: string = String(credentials.additionals?.[\"emsCode\"] || \"\");\n  const session = await LoginWithToken(refreshUrl, credentials.refreshToken, wellKnown, tokenEndpoint, emsCode);\n\n  const authData: Auth = {\n    accessToken: session.refreshToken,\n    refreshToken: session.refreshToken,\n    additionals: {\n      refreshUrl: session.refreshURL,\n      wellKnown: wellKnown,\n      tokenEndpoint: tokenEndpoint,\n      emsCode: emsCode\n    }\n  }\n\n  useAccountStore.getState().updateServiceAuthData(accountId, authData)\n  \n  return { auth: authData, session }\n}"
  },
  {
    "path": "services/skolengo/timetable.ts",
    "content": "import { Kind, Lesson, Skolengo } from \"skolengojs\";\n\nimport { getDateRangeOfWeek } from \"@/database/useHomework\";\n\nimport { Course, CourseDay, CourseStatus, CourseType } from \"../shared/timetable\";\n\nexport async function fetchSkolengoTimetable(session: Skolengo, accountId: string, weekNumber: number): Promise<CourseDay[]> {\n  const { start, end } = getDateRangeOfWeek(weekNumber)\n  const result: CourseDay[] = []\n\n  const getTimetable = async (sessionToUse: Skolengo, kidName?: string) => {\n    const timetable = await sessionToUse.GetTimetable(start, end)\n    result.push(...timetable.map(day => ({\n      date: day.date,\n      courses: mapSkolengoCourse(day.lessons, accountId, kidName)\n    })))\n  }\n\n  if (session.kind === Kind.STUDENT) {\n    await getTimetable(session)\n  } else {\n    for (const kid of (session.kids ?? [])) {\n      await getTimetable(kid, `${kid.firstName} ${kid.firstName}`)\n    }\n  }\n  return result;\n}\n\nfunction mapSkolengoCourse(data: Lesson[], accountId: string, kidName?: string): Course[] {\n  return data.map(lesson => ({\n    subject: lesson.subject.label,\n    id: lesson.id,\n    type: CourseType.LESSON,\n    from: lesson.startDateTime,\n    to: lesson.endDateTime,\n    room: lesson.room,\n    teacher: lesson.teacher.map(t => `${t.firstName} ${t.lastName}`).join(\", \"),\n    backgroundColor: lesson.subject.color,\n    status: lesson.canceled ? CourseStatus.CANCELED : undefined,\n    createdByAccount: accountId,\n    kidName: kidName\n  }))\n}"
  },
  {
    "path": "services/transit/fetcher/Fetcher.ts",
    "content": "export class Fetcher {\n  public async get<T>(url: string, options: RequestInit = {\n    method: 'GET',\n  }): Promise<T> {\n    const f = await fetch(url, options);\n    if (!f.ok) {\n      const text = await f.text();\n      throw new Error(text);\n    }\n    const j = await f.json();\n    return j as T;\n  }\n}"
  },
  {
    "path": "services/transit/fetcher/endpoints.ts",
    "content": "const BGTFS_BASE_URL = 'https://bgtfs.transitapp.com/v3/public';\nconst API_BASE_URL = \"https://transitapp.com/en/trip/api\";\n\nexport const BGTFS_PLAN = (\n  fromLat: number,\n  fromLon: number,\n  toLat: number,\n  toLon: number,\n  mode: string,\n  considerDowntimes: boolean,\n  locale: string,\n  leaveTime?: number,\n  arrivalTime?: number\n) =>\n  `${BGTFS_BASE_URL}/plan?from_lat=${fromLat}&from_lon=${fromLon}&to_lat=${toLat}&to_lon=${toLon}&mode=${mode}&consider_downtimes=${considerDowntimes}&locale=${locale}${leaveTime !== undefined && `&leave_time=${leaveTime}`}${arrivalTime !== undefined && `&arrival_time=${arrivalTime}`}`;\n\nexport const TRIP_SUGGESTION = (lat: number, lng: number, query: string) =>\n  `${API_BASE_URL}/suggestions?lat=${lat}&lng=${lng}&search-term=${query}`;\n\nexport const TRIP_LOCATION_DETAILS = (id: string) =>\n  `${API_BASE_URL}/location-details?id=${id}`;"
  },
  {
    "path": "services/transit/index.ts",
    "content": "import { PlaceDetails } from \"@/services/transit/models/PlaceDetails\";\nimport { Suggestions } from \"@/services/transit/models/Suggestions\";\n\nimport {\n  BGTFS_PLAN,\n  TRIP_LOCATION_DETAILS,\n  TRIP_SUGGESTION,\n} from \"./fetcher/endpoints\";\nimport {Fetcher} from \"./fetcher/Fetcher\";\nimport {PlanResult} from \"./models/PlanResult\";\n\nclass Transit {\n  private fetcher: Fetcher = new Fetcher();\n\n  public async plan(\n    fromLat: number,\n    fromLon: number,\n    toLat: number,\n    toLon: number,\n    options: {\n      mode?: string;\n      considerDowntimes?: boolean;\n      locale?: string;\n      leaveTime?: number;\n      arrivalTime?: number;\n    }\n  ): Promise<{ results: PlanResult[] }> {\n    const params = {\n      mode: options.mode ?? \"transit\",\n      considerDowntimes: options.considerDowntimes ?? true,\n      locale: options.locale ?? \"fr\",\n    };\n    return await this.fetcher.get(\n      BGTFS_PLAN(\n        fromLat,\n        fromLon,\n        toLat,\n        toLon,\n        params.mode,\n        params.considerDowntimes,\n        params.locale,\n        options.leaveTime,\n        options.arrivalTime\n      )\n    );\n  }\n\n  public async suggestions(\n    latitude: number,\n    longitude: number,\n    query: string\n  ): Promise<{ suggestions: Suggestions }> {\n    return await this.fetcher.get(TRIP_SUGGESTION(latitude, longitude, query), {\n      headers: {\n        Referer: \"https://transitapp.com/trip\",\n      },\n    });\n  }\n\n  public async locationDetails(\n    id: string\n  ): Promise<{ placeDetails: PlaceDetails }> {\n    return await this.fetcher.get(TRIP_LOCATION_DETAILS(id), {\n      headers: {\n        Referer: \"https://transitapp.com/trip\",\n      },\n    });\n  }\n}\n\nexport default Transit;"
  },
  {
    "path": "services/transit/models/Alerts.ts",
    "content": "import {Period} from \"./Period\";\n\nexport interface Alerts {\n\t/** When the alert is visible */\n\tactive_periods: Period[];\n\t/** When the alerts has been published */\n\tcreated_at: number;\n\n\tdescription: string;\n\teffect: \"REDUCED_SERVICE\" | \"NO_SERVICE\" | string;\n\tinformed_entities: {\n\t\tglobal_route_id: string;\n\t\tglobal_stop_id: string;\n\t}[];\n\tseverity: \"Warning\" | \"Severe\" | string;\n\ttitle: string;\n}"
  },
  {
    "path": "services/transit/models/ArrivalSchedule.ts",
    "content": "export interface ArrivalSchedule {\n\t/** Vehicle departure date (with real-time data if available) */\n\tdeparture_time: number;\n\t/** Estimated arrival date of the vehicle (with real-time data if available) */\n\tarrival_time: number;\n\t/** Is this vehicle served? */\n\tis_cancelled: boolean;\n\t/** Does the vehicle support real-time schedules? */\n\tis_real_time: boolean;\n\t/** Vehicle departure times according to the schedule */\n\tscheduled_departure_time: number;\n\t/** Estimated arrival times according to the schedule */\n\tscheduled_arrival_time: number;\n\t/** Is the vehicule stop equipped to accommodate a person with a wheelchair?*/\n\twheelchair_accessible: number;\n}"
  },
  {
    "path": "services/transit/models/DepartureLegs.ts",
    "content": "import {PlanDetails} from \"./PlanDetails\";\n\nexport interface DepartureLegs {\n\t/** Vehicle departure date (with real-time data if available) */\n\tdeparture_time: number;\n\t/** Estimated arrival date of the vehicle (with real-time data if available) */\n\tarrival_time: number;\n\t/** Is this vehicle served? */\n\tis_cancelled: boolean;\n\t/** Does the vehicle support real-time schedules? */\n\tis_real_time: boolean;\n\t\n\traw_trip_headsign?: string;\n\traw_trip_short_name?: string;\n\n\t/** Id of the itinerary */\n\trt_trip_id: string;\n\t/** Details of the transport */\n\tplan_details: PlanDetails;\n\t/** Vehicle departure times according to the schedule */\n\tscheduled_departure_time: number;\n\t/** Estimated arrival times according to the schedule */\n\tscheduled_arrival_time: number;\n\t/** Is the vehicule stop equipped to accommodate a person with a wheelchair?*/\n\twheelchair_accessible: number;\n\t/** Trip search key on the GTFS Public */\n\ttrip_search_key: string;\n}"
  },
  {
    "path": "services/transit/models/Itineraries.ts",
    "content": "import {ItinerariesPlanDetails} from \"./ItinerariesPlanDetails\";\nimport {Stop} from \"./Stop\";\n\nexport interface Itineraries {\n\tbranch_code: string;\n\tcanonical_itinerary: number;\n\tdirection_headsign: string;\n\tdirection_id: number;\n\theadsign: string;\n\tis_active: boolean;\n\tmerged_headsign: string;\n\tplan_details: ItinerariesPlanDetails;\n\tshape: string;\n\tstops: Stop[];\n}"
  },
  {
    "path": "services/transit/models/ItinerariesPlanDetails.ts",
    "content": "export interface ItinerariesPlanDetails {\n\tend_stop_offset: number;\n\tinternal_itinerary_id: string;\n\tplan_shape: string;\n\tstart_stop_offset: number;\n}"
  },
  {
    "path": "services/transit/models/Location.ts",
    "content": "export interface Location {\n  lat: number;\n  lng: number;\n}"
  },
  {
    "path": "services/transit/models/MatchedSubstring.ts",
    "content": "export interface MatchedSubstring {\n  length: number;\n  offset: number;\n}"
  },
  {
    "path": "services/transit/models/Period.ts",
    "content": "export interface Period {\n\t/** Start of the period */\n\tstart: number;\n\t/** End of the period */\n\tend: number;\n}"
  },
  {
    "path": "services/transit/models/Place.ts",
    "content": "import { Location } from \"@/services/transit/models/Location\";\n\nexport interface Place {\n  address_components: {\n    long_name: string;\n    short_name: string;\n    types: string[];\n  }[];\n  adr_address: string;\n  formatted_address: string;\n  geometry: {\n    location: Location;\n    viewport: {\n      northeast: Location;\n      southwest: Location;\n    };\n  };\n  name: string;\n  types: string[];\n  status: string;\n}"
  },
  {
    "path": "services/transit/models/PlaceDetails.ts",
    "content": "import { Place } from \"@/services/transit/models/Place\";\n\nexport interface PlaceDetails {\n  html_attributions: never[];\n  result: Place;\n  status: string;\n}"
  },
  {
    "path": "services/transit/models/PlaceSuggestion.ts",
    "content": "import { MatchedSubstring } from \"@/services/transit/models/MatchedSubstring\";\n\nexport interface PlaceSuggestion {\n  description: string;\n  matched_substrings: MatchedSubstring[];\n  place_id: string;\n  reference: string;\n  structured_formatting: {\n    main_text: string;\n    main_text_matched_substrings: MatchedSubstring[];\n    secondary_text: string;\n  };\n  terms: { offset: number; value: string }[];\n  types: string[];\n}"
  },
  {
    "path": "services/transit/models/PlanDetails.ts",
    "content": "import {ArrivalSchedule} from \"./ArrivalSchedule\";\nimport {StopSchedule} from \"./StopSchedule\";\n\nexport interface PlanDetails {\n\t/** Arrival time of the vehicle used for the trip */\n\tarrival_schedule_item: ArrivalSchedule;\n\t/** Route ID on the GTFS Public */\n\tglobal_route_id: string;\n\t/** Itinerary ID used by Transit */\n\tinternal_itinerary_id: string;\n\t/** Next arrival time of the vehicle */\n\tstop_schedule_items: StopSchedule[];\n}"
  },
  {
    "path": "services/transit/models/PlanResult.ts",
    "content": "import {RouteLegs} from \"./RouteLegs\";\n\nexport interface PlanResult {\n\taccessibility: string;\n\tduration: number;\n\tstart_time: string;\n\tend_time: string;\n\tlegs: RouteLegs[];\n\tfare?: never;\n}"
  },
  {
    "path": "services/transit/models/Route.ts",
    "content": "import {Alerts} from \"./Alerts\";\nimport {Itineraries} from \"./Itineraries\";\nimport {Vehicle} from \"./Vehicle\";\n\nexport interface Route {\n\talerts: Alerts;\n\tcompact_display_short_name: {\n\t\tboxed_text: string;\n\t\telements: (string | null)[];\n\t\troute_name_redundancy: boolean;\n\t};\n\tfares: never[];\n\tglobal_route_id: string;\n\titineraries: Itineraries;\n\tmode_name: string;\n\treal_time_route_id: string;\n\troute_color: string;\n\troute_display_short_name: {\n\t\tboxed_text: string;\n\t\telements: (string | null)[];\n\t\troute_name_redundancy: boolean;\n\t};\n\troute_image?: string;\n\troute_long_name: string;\n\troute_network_id: string;\n\troute_network_name: string;\n\troute_short_name: string;\n\troute_text_color: string;\n\troute_timezone: string;\n\troute_type: number;\n\tsorting_key: string;\n\ttts_long_name: string;\n\ttts_short_name: string;\n\tvehicle: Vehicle;\n}"
  },
  {
    "path": "services/transit/models/RouteLegs.ts",
    "content": "import {DepartureLegs} from \"./DepartureLegs\";\nimport {Route} from \"./Route\";\n\ninterface BaseRouteLegs {\n\t/** Estimated time for this portion of the trip */\n\tduration: number;\n\t/** Date of departure from the departure point */\n\tstart_time: number;\n\t/** Estimated time of arrival at the destination */\n\tend_time: number;\n}\n\ninterface WalkRouteLegs extends BaseRouteLegs {\n\t/** Action taken by the traveler during this part of the trip */\n\tleg_mode: \"walk\";\n\t/** Distance traveled */\n\tdistance: number;\n\t/** List of points where line segments are drawn between consecutive points */\n\tpolyline: string;\n}\n\ninterface TransitRouteLegs extends BaseRouteLegs {\n\t/** Action taken by the traveler during this part of the trip */\n\tleg_mode: \"transit\";\n\tdepartures: DepartureLegs;\n\troutes: Route[];\n}\n\nexport type RouteLegs = WalkRouteLegs | TransitRouteLegs;"
  },
  {
    "path": "services/transit/models/Station.ts",
    "content": "export interface Station {\n\tcity_name: string;\n\tglobal_stop_id: string;\n\tlocation_type: number;\n\traw_stop_id: string;\n\trt_stop_id: string;\n\tstation_code: string;\n\tstation_name: string;\n}"
  },
  {
    "path": "services/transit/models/Stop.ts",
    "content": "import {Station} from \"./Station\";\n\nexport interface Stop {\n\tcity_name: string;\n\tglobal_stop_id: string;\n\tlocation_type: number;\n\tparent_station?: Station;\n\tparent_station_global_stop_id?: string;\n\traw_stop_id: string;\n\troute_type: number;\n\trt_stop_id: string;\n\tstop_code: string;\n\tstop_lat: number;\n\tstop_lon: number;\n\tstop_name: string;\n\twheelchair_boarding: number;\n}"
  },
  {
    "path": "services/transit/models/StopSchedule.ts",
    "content": "export interface StopSchedule {\n\t/** Vehicle departure date (with real-time data if available) */\n\tdeparture_time: number;\n\t/** Estimated arrival date of the vehicle (with real-time data if available) */\n\tarrival_time: number;\n\t/** Stop ID on the GTFS Public */\n\tglobal_stop_id: string;\n\t/** Is this bus stop served? */\n\tis_cancelled: boolean;\n\t/** Does the bus stop support real-time schedules? */\n\tis_real_time: boolean;\n\t/** Vehicle departure times according to the schedule */\n\tscheduled_departure_time: number;\n\t/** Estimated arrival times according to the schedule */\n\tscheduled_arrival_time: number;\n\t/** Is the bus stop equipped to accommodate a person with a wheelchair?*/\n\twheelchair_accessible: number;\n}"
  },
  {
    "path": "services/transit/models/Suggestions.ts",
    "content": "import { PlaceSuggestion } from \"@/services/transit/models/PlaceSuggestion\";\nimport { Stop } from \"@/services/transit/models/Stop\";\n\nexport interface Suggestions {\n  places: PlaceSuggestion[];\n  stops: Stop[];\n}"
  },
  {
    "path": "services/transit/models/TransitDepartures.ts",
    "content": "export interface TransitDepartures {\n\tarrival_time: number;\n\tdeparture_time: number;\n\tis_cancelled: boolean;\n\tis_real_time: boolean;\n\trt_trip_id: string;\n\tscheduled_arrival_time: number;\n\tscheduled_departure_time: number;\n\ttrip_search_key: string;\n\twheelchair_accessible: number;\n}"
  },
  {
    "path": "services/transit/models/Vehicle.ts",
    "content": "export interface Vehicle {\n\timage: string;\n\tname: string;\n\tname_inflection: string;\n}"
  },
  {
    "path": "services/turboself/balance.ts",
    "content": "import { Client } from \"turboself-api\";\n\nimport { Balance } from \"../shared/balance\";\n\nexport async function fetchTurboSelfBalance(session: Client, accountId: string): Promise<Balance[]> {\n  const balances = await session.getBalances()\n  const lunchPrice = (session.host?.lunchPrice ?? 0)\n  return balances.map(balance => ({\n    amount: balance.estimatedAmount,\n    currency: session.establishment?.currencySymbol ?? \"€\",\n    lunchRemaining: lunchPrice > 0 ? Math.floor(balance.estimatedAmount / lunchPrice) : 0,\n    lunchPrice,\n    label: balance.label,\n    createdByAccount: accountId\n  }))\n}"
  },
  {
    "path": "services/turboself/booking.ts",
    "content": "import { Booking as TurboBooking, Client } from \"turboself-api\";\n\nimport { error } from \"@/utils/logger/logger\";\n\nimport { Booking, BookingDay } from \"../shared/canteen\";\n\nexport async function fetchTurboSelfBookingsWeek(session: Client, accountId: string, weekNumber: number): Promise<BookingDay[]> {\n  const terminals = await session.getBookings(weekNumber);\n\n  const mappedBookings = mapBookings(terminals, accountId)\n\n  return mappedBookings\n}\n\nfunction mapBookings(data: TurboBooking[], accountId: string): BookingDay[] {\n  const toReturn: Record<string, Booking[]> = {}\n  for (const terminal of data) {\n    for (const day of terminal.days) {\n      const key = day.date.toISOString()\n      toReturn[key] = toReturn[key] || [];\n      toReturn[key].push({\n        id: day.id,\n        label: terminal.terminal.name,\n        canBook: day.canBook,\n        booked: day.booked,\n        ref: day,\n        createdByAccount: accountId\n      })\n    }\n  }\n\n  return Object.entries(toReturn).map(([day, bookings]) => ({\n    date: new Date(new Date(day).setDate(new Date(day).getDate() - 1)),\n    available: bookings\n  }));\n}\n\nexport async function setTurboSelfMealBookState(meal: Booking, booked?: boolean): Promise<Booking> {\n  if (!meal.ref) {\n    error(\"Invalid Meal Ref\")\n  }\n\n  booked = booked ?? !meal.booked\n  await meal.ref.book(booked ? 1 : 0)\n\n  return {\n    ...meal,\n    booked: booked\n  }\n}"
  },
  {
    "path": "services/turboself/history.ts",
    "content": "import { Client } from \"turboself-api\";\n\nimport { CanteenHistoryItem } from \"../shared/canteen\";\n\nexport async function fetchTurboSelfHistory(session: Client, accountId: string): Promise<CanteenHistoryItem[]> {\n  const history = await session.getHistory()\n  return history.map(transaction => ({\n    date: new Date(transaction.date.getTime() + transaction.date.getTimezoneOffset() * 60000),\n    label: transaction.label,\n    currency: session.establishment?.currencySymbol ?? \"€\",\n    amount: transaction.amount,\n    createdByAccount: accountId\n  }))\n}"
  },
  {
    "path": "services/turboself/index.ts",
    "content": "import { Client } from \"turboself-api\"\n\nimport { Auth, Services } from \"@/stores/account/types\";\nimport { error } from \"@/utils/logger/logger\";\n\nimport { Balance } from \"../shared/balance\";\nimport { Booking, BookingDay, CanteenHistoryItem, CanteenKind, QRCode } from \"../shared/canteen\";\nimport { Capabilities, SchoolServicePlugin } from \"../shared/types\";\nimport { fetchTurboSelfBalance } from \"./balance\";\nimport { fetchTurboSelfBookingsWeek, setTurboSelfMealBookState } from \"./booking\";\nimport { fetchTurboSelfHistory } from \"./history\";\nimport { fetchTurboSelfQRCode } from \"./qrcode\";\nimport { refreshTurboSelfAccount } from \"./refresh\";\n\nexport class TurboSelf implements SchoolServicePlugin {\n  displayName = \"TurboSelf\";\n  service = Services.TURBOSELF\n  capabilities: Capabilities[] = [\n    Capabilities.REFRESH,\n    Capabilities.CANTEEN_BALANCE,\n    Capabilities.CANTEEN_BOOKINGS,\n    Capabilities.CANTEEN_HISTORY,\n    Capabilities.CANTEEN_QRCODE\n  ];\n  session: Client | undefined = undefined\n  authData: Auth = {};\n\n  constructor(public accountId: string) {}\n\n  async refreshAccount(credentials: Auth): Promise<TurboSelf> {\n    const refresh = await refreshTurboSelfAccount(this.accountId, credentials)\n\n    this.authData = refresh.auth\n    this.session = refresh.session\n\n    return this;\n  }\n\n  getCanteenKind(): CanteenKind {\n    if (!this.session) { return CanteenKind.ARGENT };\n\n    if (this.session.host?.permissions.bookWithNegativeBalance) { return CanteenKind.FORFAIT };\n\n    if (this.session?.host?.mode === \"Argent\") {\n      return CanteenKind.ARGENT;\n    }\n\n    return CanteenKind.FORFAIT;\n  }\n\n  async getCanteenBalances(): Promise<Balance[]> {\n    if (this.session) {\n      return fetchTurboSelfBalance(this.session, this.accountId)\n    }\n\n    error(\"Session is not valid\", \"TurboSelf.getCanteenBalances\");\n  }\n\n  async getCanteenTransactionsHistory(): Promise<CanteenHistoryItem[]> {\n    if (this.session) {\n      return fetchTurboSelfHistory(this.session, this.accountId)\n    }\n\t\t\n    error(\"Session is not valid\", \"TurboSelf.getCanteenTransactionsHistory\")\n  }\n\n  async getCanteenQRCodes(): Promise<QRCode> {\n    if (this.session) {\n      return fetchTurboSelfQRCode(this.session, this.accountId)\n    }\n\n    error(\"Session is not valid\", \"TurboSelf.getCanteenQRCodes\")\n  }\n\t\n  async getCanteenBookingWeek(weekNumber: number): Promise<BookingDay[]> {\n    if (this.session) {\n      return fetchTurboSelfBookingsWeek(this.session, this.accountId, weekNumber)\n    }\n\n    error(\"Session is not valid\", \"TurboSelf.getCanteenBookingWeek\")\n  }\n\n  async setMealAsBooked(meal: Booking, booked?: boolean): Promise<Booking> {\n    return setTurboSelfMealBookState(meal, booked)\n  }\n}"
  },
  {
    "path": "services/turboself/qrcode.ts",
    "content": "import { Client } from \"turboself-api\";\n\nimport { QRCode, QRType } from \"../shared/canteen\";\n\nexport function fetchTurboSelfQRCode(session: Client, accountId: string): QRCode {\n  if (session.host?.cardNumber) {\n    return {\n      type: QRType.QRCode,\n      data: String(session.host.cardNumber),\n      createdByAccount: accountId\n    };\n  }\n\t\n  return {\n    type: QRType.QRCode,\n    data: \"\",\n    createdByAccount: accountId\n  }\n}"
  },
  {
    "path": "services/turboself/refresh.ts",
    "content": "import { authenticateWithCredentials, Client } from \"turboself-api\";\n\nimport { Auth } from \"@/stores/account/types\";\n\nexport async function refreshTurboSelfAccount(accountId: string, credentials: Auth): Promise<{auth: Auth, session: Client}> {\n  const session = await authenticateWithCredentials(\n    String(credentials.additionals?.[\"username\"] ?? \"\"),\n    String(credentials.additionals?.[\"password\"] ?? \"\"),\n    undefined,\n    undefined,\n    Number(credentials.additionals?.[\"hoteId\"] ?? \"\")\n  )\n\n  return {\n    auth: credentials,\n    session\n  }\n}"
  },
  {
    "path": "stores/account/index.ts",
    "content": "import { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nimport { log } from \"@/utils/logger/logger\";\nimport { initializeTransport } from \"@/utils/transport\";\n\nimport { createMMKVStorage } from '../global'\nimport { AccountsStorage, Auth, TransportAddress } from \"./types\";\n\nexport const useAccountStore = create<AccountsStorage>()(\n  persist(\n    (set, get) => ({\n      lastUsedAccount: \"\",\n      accounts: [],\n      removeAccount: account => {\n        const accounts = get().accounts.filter(a => a.id !== account.id);\n        const lastUsedAccount = get().lastUsedAccount;\n\n        set({\n          accounts,\n          lastUsedAccount:\n            lastUsedAccount === account.id\n              ? (accounts[0]?.id ?? \"\")\n              : lastUsedAccount,\n        });\n      },\n      addAccount: account => set({ accounts: [...get().accounts, account] }),\n      updateServiceAuthData: (serviceId: string, authData: Auth) =>\n        set({\n          accounts: get().accounts.map(account => {\n            const hasService = account.services.some(\n              service => service.id === serviceId\n            );\n            if (hasService) {\n              return {\n                ...account,\n                services: account.services.map(service =>\n                  service.id === serviceId\n                    ? { ...service, auth: authData }\n                    : service\n                ),\n              };\n            }\n            return account;\n          }),\n        }),\n      addServiceToAccount: (accountId, service) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === accountId) {\n              return {\n                ...account,\n                services: [...account.services, service],\n              };\n            }\n            return account;\n          }),\n        }),\n      removeServiceFromAccount: serviceId =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.services.find(service => service.id === serviceId)) {\n              return {\n                ...account,\n                services: account.services.filter(\n                  service => service.id !== serviceId\n                ),\n              };\n            }\n            return account;\n          }),\n        }),\n      setAccountProfilePicture: (accountId, profilePicture) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === accountId) {\n              return {\n                ...account,\n                customisation: {\n                  profilePicture,\n                  subjects: account.customisation?.subjects ?? {},\n                },\n              };\n            }\n            return account;\n          }),\n        }),\n      setAccountName: (accountId, firstName, lastName) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === accountId) {\n              return {\n                ...account,\n                firstName,\n                lastName,\n              };\n            }\n            return account;\n          }),\n        }),\n      setLastUsedAccount: (accountId: string) =>\n        set({ lastUsedAccount: accountId }),\n      setSubjectColor: (subject: string, color: string) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === get().lastUsedAccount) {\n              return {\n                ...account,\n                customisation: {\n                  ...account.customisation,\n                  profilePicture: account.customisation?.profilePicture ?? \"\",\n                  subjects: {\n                    ...account.customisation?.subjects,\n                    [subject]: {\n                      emoji:\n                        account.customisation?.subjects?.[subject]?.emoji || \"\",\n                      name:\n                        account.customisation?.subjects?.[subject]?.name || \"\",\n                      color: color,\n                    },\n                  },\n                },\n              };\n            }\n            return account;\n          }),\n        }),\n      setSubjectEmoji: (subject: string, emoji: string) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === get().lastUsedAccount) {\n              return {\n                ...account,\n                customisation: {\n                  ...account.customisation,\n                  profilePicture: account.customisation?.profilePicture ?? \"\",\n                  subjects: {\n                    ...account.customisation?.subjects,\n                    [subject]: {\n                      emoji: emoji,\n                      color:\n                        account.customisation?.subjects?.[subject]?.color || \"\",\n                      name:\n                        account.customisation?.subjects?.[subject]?.name || \"\",\n                    },\n                  },\n                },\n              };\n            }\n            return account;\n          }),\n        }),\n      setSubjectName: (subject: string, name: string) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === get().lastUsedAccount) {\n              return {\n                ...account,\n                customisation: {\n                  ...account.customisation,\n                  profilePicture: account.customisation?.profilePicture ?? \"\",\n                  subjects: {\n                    ...account.customisation?.subjects,\n                    [subject]: {\n                      emoji:\n                        account.customisation?.subjects?.[subject]?.emoji || \"\",\n                      color:\n                        account.customisation?.subjects?.[subject]?.color || \"\",\n                      name: name,\n                    },\n                  },\n                },\n              };\n            }\n            return account;\n          }),\n        }),\n      setSubjects: (subjects: Record<string, Subject>) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === get().lastUsedAccount) {\n              return {\n                ...account,\n                customisation: {\n                  ...account.customisation,\n                  profilePicture: account.customisation?.profilePicture ?? \"\",\n                  subjects: subjects,\n                },\n              };\n            }\n            return account;\n          }),\n        }),\n      setTransportEnabled: (transportEnabled: boolean) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === get().lastUsedAccount) {\n              return {\n                ...account,\n                transport: {\n                  ...account.transport,\n                  enabled: transportEnabled,\n                  homeAddress: account.transport?.homeAddress ?? {\n                    firstTitle: \"current_location\",\n                    secondTitle: \"\",\n                    address: \"current_location\",\n                    longitude: -1,\n                    latitude: -1,\n                  },\n                  defaultApp: account.transport?.defaultApp ?? \"transit\",\n                },\n              };\n            }\n            return account;\n          }),\n        }),\n      setTransportService: (id: string) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === get().lastUsedAccount) {\n              return {\n                ...account,\n                transport: {\n                  ...account.transport,\n                  enabled: true,\n                  defaultApp: id,\n                },\n              };\n            }\n            return account;\n          }),\n        }),\n      setTransportHomeAddress: (address: TransportAddress) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === get().lastUsedAccount) {\n              return {\n                ...account,\n                transport: {\n                  ...account.transport,\n                  enabled: true,\n                  defaultApp: account.transport?.defaultApp ?? \"transit\",\n                  homeAddress: address,\n                },\n              };\n            }\n            return account;\n          }),\n        }),\n      setTransportSchoolAddress: (address: TransportAddress) =>\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === get().lastUsedAccount) {\n              return {\n                ...account,\n                transport: {\n                  ...account.transport,\n                  enabled: true,\n                  defaultApp: account.transport?.defaultApp ?? \"transit\",\n                  schoolAddress: address,\n                },\n              };\n            }\n            return account;\n          }),\n        }),\n      initializeTransport: async (address: string | undefined) => {\n        const config = await initializeTransport(address);\n        log(`Initialized transport at ${JSON.stringify(config.schoolAddress) ?? 'undefined'}`);\n        set({\n          accounts: get().accounts.map(account => {\n            if (account.id === get().lastUsedAccount) {\n              return {\n                ...account,\n                transport: config,\n              };\n            }\n            return account;\n          }),\n        })\n      },\n    }),\n    {\n      name: \"account-storage\",\n      storage: createMMKVStorage<AccountsStorage>(\n        \"account-storage\",\n        \"3f64fc8d-472d-43d5-ba11-461020e2423b\"\n      ),\n    }\n  )\n);"
  },
  {
    "path": "stores/account/types.ts",
    "content": "import * as Ezly from \"ezly\";\nimport { Skolengo } from \"skolengojs\";\n\n/**\n * Represents the storage structure for user accounts.\n *\n * @property {string} lastUsedAccount - The identifier of the most recently used account.\n * @property {Account[]} accounts - An array of `Account` objects associated with the storage.\n */\nexport interface AccountsStorage {\n  lastUsedAccount: string;\n  accounts: Account[];\n  removeAccount: (account: Account) => void;\n  addAccount: (account: Account) => void;\n  setLastUsedAccount: (accountId: string) => void;\n  updateServiceAuthData: (serviceId: string, authData: Auth) => void;\n  addServiceToAccount: (accountId: string, service: ServiceAccount) => void;\n  removeServiceFromAccount: (serviceId: string) => void;\n  setAccountName: (\n    accountId: string,\n    firstName: string,\n    lastName: string\n  ) => void;\n  setSubjectColor: (subject: string, color: string) => void;\n  setSubjectEmoji: (subject: string, emoji: string) => void;\n  setSubjectName: (subject: string, name: string) => void;\n  setSubjects: (\n    subjects: Record<string, { color: string; emoji: string; name: string }>\n  ) => void;\n  setAccountProfilePicture: (accountId: string, profilePicture: string) => void;\n  setTransportEnabled: (transportEnabled: boolean) => void;\n  setTransportService: (id: string) => void;\n  setTransportHomeAddress: (address: TransportAddress) => void;\n  setTransportSchoolAddress: (address: TransportAddress) => void;\n  initializeTransport: (address: string | undefined) => void;\n}\n\n/**\n * Represents a user account.\n *\n * @property {string} id - Unique identifier for the account (read-only).\n * @property {string} firstName - The user's first name.\n * @property {string} lastName - The user's last name.\n * @property {string} [schoolName] - (Optional) The name of the user's school.\n * @property {ServiceAccount[]} services - List of service accounts associated with this account.\n * @property {string} createdAt - ISO string representing the account creation date (stored as string due to MMKV limitations).\n * @property {string} updatedAt - ISO string representing the last update date (stored as string due to MMKV limitations).\n */\nexport interface Account {\n  readonly id: string;\n  firstName: string;\n  lastName: string;\n  schoolName?: string;\n  className?: string;\n  customisation?: CustomisationStorage;\n  transport?: TransportStorage;\n  services: ServiceAccount[];\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface CustomisationStorage {\n  profilePicture: string;\n  subjects: Record<string, { color: string; emoji: string; name: string }>;\n}\n\nexport interface TransportAddress {\n  firstTitle: string;\n  secondTitle: string;\n  address: string;\n  longitude: number;\n  latitude: number;\n}\n\nexport interface TransportStorage {\n  enabled: boolean;\n  homeAddress?: TransportAddress;\n  schoolAddress?: TransportAddress;\n  defaultApp: string;\n}\n\n/**\n * Represents a service account.\n *\n * @property {string} id - Unique identifier for the service account.\n * @property {Services} serviceId - Identifier for the associated service.\n * @property {Auth} auth - Authentication details for the account (access token, refresh token...).\n * @property {string} createdAt - ISO string representing the account creation date (stored as string due to MMKV limitations).\n * @property {string} updatedAt - ISO string representing the last update date (stored as string due to MMKV limitations).\n * @property {string} [firstName] - Optional first name of the account holder.\n * @property {string} [lastName] - Optional last name of the account holder.\n */\nexport interface ServiceAccount {\n  readonly id: string;\n  auth: Auth;\n  serviceId: Services;\n  createdAt: string;\n  updatedAt: string;\n  additionals?: Record<string, string>;\n}\n\n/**\n * Represents authentication credentials and additional metadata.\n *\n * @property {string} [accessToken] - Optional access token used for authentication.\n * @property {string} [refreshToken] - Optional refresh token used to obtain new access tokens.\n * @property {Skolengo} [session] - Optional, used in some libraries like Skolengo.js\n * @property {string} [additionals] - Optional record containing additional authentication-related key-value pairs.\n */\nexport interface Auth {\n  accessToken?: string;\n  refreshToken?: string;\n  session?: Skolengo | Ezly.Identification;\n  additionals?: Record<string, string | number>;\n}\n\nexport enum Services {\n  PRONOTE,\n  SKOLENGO,\n  ECOLEDIRECTE,\n  TURBOSELF,\n  ARD,\n  IZLY,\n  MULTI,\n  ALISE,\n  APPSCHO,\n  LANNION\n}\n"
  },
  {
    "path": "stores/flags/index.ts",
    "content": ""
  },
  {
    "path": "stores/global/index.ts",
    "content": "import { MMKV } from 'react-native-mmkv'\nimport { Skolengo as SkolengoSession } from \"skolengojs\";\nimport { PersistStorage } from 'zustand/middleware'\n\nimport { UniversalClassSerializer } from './serializer';\n\nconst classRegistry = new Map<string, any>();\nclassRegistry.set('Skolengo', SkolengoSession);\n\nexport const createMMKVStorage = <T>(id: string, encryptionKey?: string): PersistStorage<T> => {\n  const mmkv = new MMKV({\n    id: id,\n    encryptionKey: encryptionKey\n  });\n\n  return {\n    getItem: (name) => {\n      const value = mmkv.getString(name);\n      if (!value) {return null;}\n      \n      try {\n        const parsed = JSON.parse(value);\n        return UniversalClassSerializer.deserialize(parsed, classRegistry);\n      } catch (error) {\n        console.error('Error parsing MMKV data:', error);\n        return null;\n      }\n    },\n    setItem: (name, value) => {\n      try {\n        const serialized = UniversalClassSerializer.serialize(value);\n        mmkv.set(name, JSON.stringify(serialized));\n      } catch (error) {\n        console.error('Error serializing MMKV data:', error);\n      }\n    },\n    removeItem: (name) => {\n      mmkv.delete(name);\n    }\n  };\n};"
  },
  {
    "path": "stores/global/serializer.ts",
    "content": "/* eslint-disable no-prototype-builtins */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { warn } from \"@/utils/logger/logger\";\n\nexport interface SerializableClass {\n  _className: string;\n  _data: Record<string, any>;\n}\n\nexport class UniversalClassSerializer {\n  static serialize(obj: any): any {\n    if (obj === null || obj === undefined || typeof obj !== 'object') {\n      return obj;\n    }\n\n    if (Array.isArray(obj)) {\n      return obj.map(item => this.serialize(item));\n    }\n\n    if (obj.constructor?.name && obj.constructor.name !== 'Object') {\n      const serialized: SerializableClass = {\n        _className: obj.constructor.name,\n        _data: {}\n      };\n\n      for (const key in obj) {\n        if (obj.hasOwnProperty(key)) {\n          serialized._data[key] = this.serialize(obj[key]);\n        }\n      }\n\n      return serialized;\n    }\n\n    const result: any = {};\n    for (const [key, value] of Object.entries(obj)) {\n      result[key] = this.serialize(value);\n    }\n    return result;\n  }\n\n  static deserialize(obj: any, classRegistry?: Map<string, any>): any {\n    if (obj === null || obj === undefined || typeof obj !== 'object') {\n      return obj;\n    }\n\n    if (Array.isArray(obj)) {\n      return obj.map(item => this.deserialize(item, classRegistry));\n    }\n\n    if (this.isSerializableClass(obj)) {\n      return this.deserializeClass(obj, classRegistry);\n    }\n\n    const result: any = {};\n    for (const [key, value] of Object.entries(obj)) {\n      result[key] = this.deserialize(value, classRegistry);\n    }\n    return result;\n  }\n\n  private static deserializeClass(obj: SerializableClass, classRegistry?: Map<string, any>): any {\n    const Constructor = this.findConstructor(obj._className, classRegistry);\n    \n    if (Constructor) {\n      return this.createInstance(Constructor, obj._data, classRegistry);\n    }\n    \n    return this.deserialize(obj._data, classRegistry);\n  }\n\n  private static findConstructor(className: string, classRegistry?: Map<string, any>): any {\n    if (classRegistry?.has(className)) {\n      return classRegistry.get(className);\n    }\n\n    if (typeof window !== 'undefined' && window[className as keyof Window]) {\n      return window[className as keyof Window];\n    }\n\n    if (typeof global !== 'undefined' && (global as any)[className]) {\n      return (global as any)[className];\n    }\n\n    warn(\"Constructor Not Found, returning null\")\n    return null;\n  }\n\n  private static createInstance(Constructor: any, data: Record<string, any>, classRegistry?: Map<string, any>): any {\n    const instance = Object.create(Constructor.prototype);\n    \n    for (const [key, value] of Object.entries(data)) {\n      instance[key] = this.deserialize(value, classRegistry);\n    }\n    \n    return instance;\n  }\n\n  static isSerializableClass(obj: any): obj is SerializableClass {\n    return obj && typeof obj === 'object' && obj._className && obj._data;\n  }\n}"
  },
  {
    "path": "stores/logs/index.ts",
    "content": "import { create } from 'zustand'\n\nimport { Log, LogsStorage } from './types'\n\nexport const useLogStore = create<LogsStorage>((set, get) => ({\n  logs: [],\n  addItem: (log: Log) => set({ logs: [...get().logs, log] })\n}))"
  },
  {
    "path": "stores/logs/types.ts",
    "content": "export interface LogsStorage {\n    logs: Log[]\n    addItem: (log: Log) => void;\n}\n\nexport interface Log {\n    date: string,\n    message: string,\n    type: LogType\n    from?: string,\n}\n\nexport enum LogType {\n    LOG = \"LOG\",\n    WARN = \"WARN\",\n    ERROR = \"ERROR\",\n    INFO = \"INFO\"\n}"
  },
  {
    "path": "stores/magic/index.ts",
    "content": "import { create } from 'zustand'\n\nimport { Item, MagicStorage } from './types'\n\nexport const useMagicStore = create<MagicStorage>((set, get) => ({\n  processHomeworks: [],\n  getHomework: (id: string) => get().processHomeworks.find(homework => homework.id === id),\n  addHomework: (item: Item) => set({ processHomeworks: [...get().processHomeworks, item] }),\n  clear: () => set({ processHomeworks: [] }),\n}))"
  },
  {
    "path": "stores/magic/types.ts",
    "content": "export interface MagicStorage {\n    processHomeworks: Item[]\n    getHomework: (id: string) => Item | undefined;\n    addHomework: (homework: Item) => void;\n    clear: () => void;\n}\n\nexport interface Item {\n  id: string,\n  label: string\n}"
  },
  {
    "path": "stores/settings/index.ts",
    "content": "import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { Platform } from \"react-native\";\n\nimport { Colors } from \"@/utils/colors\";\nimport { MAGIC_URL } from \"@/utils/endpoints\";\n\nimport { createMMKVStorage } from \"../global\";\nimport { Personalization,SettingsState, SettingsStorage } from \"./types\";\n\nexport const DEFAULT_MATERIAL_YOU_ENABLED =\n  Platform.OS === \"android\" && typeof Platform.Version === \"number\" && Platform.Version >= 31;\n\nconst defaultPersonalization: Personalization = {\n  colorSelected: Colors.PINK,\n  theme: \"auto\",\n  useMaterialYou: DEFAULT_MATERIAL_YOU_ENABLED,\n  magicEnabled: true,\n  hideNameOnHomeScreen: false,\n  showAlertAtLogin: false,\n  showDevMode: false,\n  magicModelURL: MAGIC_URL,\n};\n\nexport const useSettingsStore = create<SettingsStorage>()(\n  persist(\n    (set, get) => ({\n      personalization: defaultPersonalization,\n\n      mutateProperty: <T extends keyof SettingsState>(\n        section: T,\n        updates: Partial<SettingsState[T]>\n      ) => {\n        set(state => ({\n          ...state,\n          [section]: {\n            ...state[section],\n            ...updates,\n          },\n        }));\n      },\n    }),\n    {\n      name: \"settings-storage\",\n      storage: createMMKVStorage(\"settings\"),\n      version: 1,\n    }\n  )\n);\n"
  },
  {
    "path": "stores/settings/types.ts",
    "content": "import { Colors } from \"@/utils/colors\";\n\nexport interface SettingsStorage {\n  personalization: Personalization;\n  mutateProperty: <T extends keyof SettingsState>(\n    section: T,\n    updates: Partial<SettingsState[T]>\n  ) => void;\n}\n\nexport interface SettingsState {\n  personalization: Personalization;\n}\n\nexport interface Path {\n  directory: string;\n  name: string;\n}\n\nexport interface Wallpaper {\n  id: string;\n  url?: string;\n  path?: Path;\n  thumbnail?: string;\n  credit?: string;\n}\n\nexport interface Personalization {\n  colorSelected?: Colors;\n  theme?: \"light\" | \"dark\" | \"auto\";\n  useMaterialYou?: boolean;\n  magicEnabled?: boolean;\n  hideNameOnHomeScreen?: boolean;\n  showAlertAtLogin?: boolean;\n  showDevMode?: boolean;\n  magicModelURL?: string;\n  language?: string | null;\n  wallpaper?: Wallpaper;\n  disabledTabs?: string[];\n  gradesSortMethod?: string;\n  gradesPeriodId?: string;\n  installedVersion?: string;\n  releaseNotesSeenForVersion?: string;\n}\n"
  },
  {
    "path": "stubs/appscho/index.d.ts",
    "content": "export type Instance = {\n  id: string;\n  name: string;\n  casurl?: string;\n};\n\nexport type User = {\n  token: string;\n  firstname?: string;\n  lastname?: string;\n  program?: string;\n  department?: string;\n  refreshToken?: string;\n};\n\nexport type Lesson = {\n  uid?: string;\n  dtstart: string;\n  dtend: string;\n  summary?: string;\n  description?: string;\n  locations?: string[];\n  location?: string;\n};\n\nexport type NewsFeed = {\n  title: string;\n  content?: string;\n  start: string;\n  url: string;\n  picture?: string;\n  type?: string;\n};\n\nexport const INSTANCES: Instance[];\n\nexport function loginWithCredentials(\n  instanceId: string,\n  username: string,\n  password: string\n): Promise<User>;\n\nexport function loginWithOAuth(instanceId: string, code: string): Promise<User>;\n\nexport function refreshOAuthTokenWithUser(\n  instanceId: string,\n  refreshToken: string\n): Promise<User>;\n\nexport function getPlanning(instanceId: string, token: string): Promise<Lesson[]>;\n\nexport function getNewsFeed(instanceId: string): Promise<NewsFeed[]>;\n\nexport function getCASURL(instanceId: string): string;\n"
  },
  {
    "path": "stubs/appscho/index.js",
    "content": "const unavailableError = () => new Error('AppScho service is temporarily unavailable');\n\nconst INSTANCES = [];\n\nasync function loginWithCredentials() {\n  throw unavailableError();\n}\n\nasync function loginWithOAuth() {\n  throw unavailableError();\n}\n\nasync function refreshOAuthTokenWithUser() {\n  throw unavailableError();\n}\n\nasync function getPlanning() {\n  return [];\n}\n\nasync function getNewsFeed() {\n  return [];\n}\n\nfunction getCASURL() {\n  return '';\n}\n\nmodule.exports = {\n  INSTANCES,\n  loginWithCredentials,\n  loginWithOAuth,\n  refreshOAuthTokenWithUser,\n  getPlanning,\n  getNewsFeed,\n  getCASURL,\n};\n"
  },
  {
    "path": "stubs/appscho/package.json",
    "content": "{\n  \"name\": \"appscho\",\n  \"version\": \"1.1.0\",\n  \"main\": \"index.js\",\n  \"types\": \"index.d.ts\"\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"extends\": \"expo/tsconfig.base\",\n  \"compilerOptions\": {\n    \"strict\": true,\n    \"paths\": {\n      \"@/*\": [\"./*\"]\n    }\n  },\n  \"include\": [\n    \"**/*.ts\",\n    \"**/*.tsx\",\n    \".expo/types/**/*.ts\",\n    \"expo-env.d.ts\",\n    \"babel.config.js\",\n    \"metro.config.js\"\n  ]\n}\n"
  },
  {
    "path": "ui/components/ActionMenu.tsx",
    "content": "import React, { useState, useRef, useEffect, useMemo, useCallback } from \"react\";\nimport type { ComponentType } from \"react\";\nimport type { MenuAction as NativeMenuAction, MenuComponentProps as NativeMenuComponentProps } from \"@react-native-menu/menu\";\nimport {\n  Modal,\n  Platform,\n  Pressable,\n  TouchableOpacity,\n  View,\n  StyleSheet,\n  Text,\n  LayoutRectangle,\n  Dimensions,\n} from \"react-native\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport Stack from \"@/ui/components/Stack\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport { runsIOS26 } from \"@/ui/utils/IsLiquidGlass\";\nimport { warn } from \"@/utils/logger/logger\";\nimport Typography from \"../new/Typography\";\nimport Reanimated, { FadeIn, FadeInRight, FadeOut, FadeOutLeft, LayoutAnimationConfig, LinearTransition, useAnimatedStyle, useSharedValue, withSpring, withTiming, ZoomOut, ZoomOutEasyUp } from \"react-native-reanimated\";\nimport { PapillonAndroidMenuIn, PapillonAppearIn, PapillonAppearOut, PapillonSpringIn, PapillonZoomIn, PapillonZoomOut } from \"../utils/Transition\";\nimport { ListTouchable } from \"../new/List\";\n\nlet NativeMenuView: ComponentType<Record<string, unknown>> | null = null;\nif (Platform.OS === \"ios\") {\n  try {\n    const mod = require(\"@react-native-menu/menu\");\n    NativeMenuView = mod?.MenuView ?? null;\n  } catch (err: unknown) {\n    warn(`ActionMenu: impossible de charger @react-native-menu/menu MenuView: ${String(err)}`);\n  }\n}\n\nfunction MenuItem({\n  action,\n  textColor,\n  subtitleColor,\n  primaryColor,\n  destructiveColor,\n  onPress,\n}: {\n  action: NativeMenuAction;\n  textColor: string;\n  subtitleColor: string;\n  primaryColor: string;\n  destructiveColor: string;\n  onPress: () => void;\n}) {\n  const theme = useTheme();\n\n  // Reduced flags: compute isOn from action.state (attributes does not expose state in the types).\n  const isOn = action.state === \"on\";\n  const hasSubactions = Boolean(action.subactions?.length);\n  const legacy = action as unknown as { destructive?: boolean; disabled?: boolean };\n  const destructive = Boolean(action.attributes?.destructive ?? legacy.destructive);\n  const disabled = Boolean(action.attributes?.disabled ?? legacy.disabled);\n\n  let colorText: string;\n  if (action.imageColor !== undefined && action.imageColor !== null) {\n    colorText = String(action.imageColor);\n  } else if (destructive) {\n    colorText = destructiveColor;\n  } else {\n    colorText = theme.colors.text;\n  }\n\n  return (\n    <View style={styles.itemContainer}>\n      <ListTouchable onPress={onPress} disabled={disabled}>\n        <Stack direction=\"horizontal\" hAlign=\"center\" vAlign=\"center\" gap={12} style={[styles.item, isOn && {\n          backgroundColor: theme.colors.tint + \"20\",\n        }]}>\n          {action.papicon ? (\n            <Papicons name={action.papicon } color={(isOn && !hasSubactions) ? theme.colors.tint : colorText} size={22} />\n          ) : null}\n          <View style={styles.itemContent}>\n            <Typography\n              variant=\"action\"\n              weight={\"bold\"}\n              numberOfLines={1}\n              color={(isOn && !hasSubactions) ? theme.colors.tint : colorText}\n            >\n              {action.title}\n            </Typography>\n            {action.subtitle && (\n              <Typography\n                variant=\"body1\"\n                color={(isOn && !hasSubactions) ? theme.colors.tint : colorText + \"80\"}\n                numberOfLines={2}\n              >\n                {action.subtitle}\n              </Typography>\n            )}\n          </View>\n          {hasSubactions && (\n            <Papicons name=\"ChevronRight\" color={colorText} size={20} style={styles.arrow} />\n          )}\n          {(isOn && !hasSubactions) && (\n            <Papicons name=\"Check\" color={theme.colors.tint} size={18} style={styles.check} />\n          )}\n        </Stack>\n      </ListTouchable>\n    </View>\n  );\n}\n\nexport default function ActionMenu({\n  actions = [],\n  children,\n  onPressAction,\n  title,\n  placement = \"auto\",\n}: NativeMenuComponentProps & { placement?: \"auto\" | \"below\" }) {\n  const handleActionPress = onPressAction ?? (() => { });\n  const { colors } = useTheme();\n  const insets = useSafeAreaInsets();\n  const subtitleColor = `${colors.text}80`;\n  const primaryColor = colors.primary;\n  const cardColor = colors.card;\n  const destructiveColor = (colors as any).danger;\n  const borderColor = colors.border;\n\n  const triggerRef = useRef<View | null>(null);\n  const menuRef = useRef<View | null>(null);\n  const measureTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const actionCloseTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const [visible, setVisible] = useState(false);\n  const [modalVisible, setModalVisible] = useState(false);\n\n  const [submenuStack, setSubmenuStack] = useState<NativeMenuAction[]>([]);\n  const [position, setPosition] = useState<LayoutRectangle | null>(null);\n  const [menuSize, setMenuSize] = useState<{ width: number; height: number } | null>(null);\n\n  function clearTimer(timerRef: React.MutableRefObject<ReturnType<typeof setTimeout> | null>) {\n    if (timerRef.current) {\n      clearTimeout(timerRef.current);\n      timerRef.current = null;\n    }\n  }\n\n  useEffect(() => {\n    if (!visible) {\n      setModalVisible(false);\n    }\n  }, [visible]);\n\n  useEffect(() => {\n    return () => {\n      clearTimer(measureTimeoutRef);\n      clearTimer(closeTimeoutRef);\n      clearTimer(actionCloseTimeoutRef);\n    };\n  }, []);\n\n  // iOS\n  if (Platform.OS === \"ios\" && NativeMenuView) {\n    return (\n      <NativeMenuView\n        onPressAction={handleActionPress}\n        actions={actions}\n        title={title}\n      >\n        {children}\n      </NativeMenuView>\n    );\n  }\n\n  // Android\n  function open() {\n    clearTimer(closeTimeoutRef);\n    clearTimer(actionCloseTimeoutRef);\n    clearTimer(measureTimeoutRef);\n    if (menuContentHeight.value <= 0) {\n      menuContentHeight.value = estimatedMenuContentHeight;\n    }\n    setVisible(true);\n    measureTimeoutRef.current = setTimeout(() => {\n      const trigger = triggerRef.current;\n      if (!trigger) {\n        setModalVisible(true);\n        return;\n      }\n      trigger.measure((x, y, width, height, pageX, pageY) => {\n        setPosition({ x: pageX ?? x, y: pageY ?? y, width, height });\n        setModalVisible(true);\n      });\n    }, 0);\n  }\n\n  function close() {\n    clearTimer(measureTimeoutRef);\n    clearTimer(actionCloseTimeoutRef);\n    setModalVisible(false);\n    clearTimer(closeTimeoutRef);\n    closeTimeoutRef.current = setTimeout(() => {\n      setVisible(false);\n      setSubmenuStack([]);\n      setPosition(null);\n      setMenuSize(null);\n      hasMeasuredMenuContent.current = false;\n      menuContentHeight.value = 0;\n    }, 220);\n  }\n\n  function handlePress(action: NativeMenuAction, fallbackId: string) {\n    if (action.subactions && action.subactions.length > 0) {\n      setSubmenuStack((prev) => [...prev, action]);\n      return;\n    }\n    handleActionPress({ nativeEvent: { event: action.id ?? fallbackId } });\n    clearTimer(actionCloseTimeoutRef);\n    actionCloseTimeoutRef.current = setTimeout(() => {\n      close();\n    }, 30);\n  }\n\n  function handleBack() {\n    setSubmenuStack((prev) => prev.slice(0, -1));\n  }\n\n  function getMenuPosition() {\n    if (!position) {\n      return { position: \"absolute\" as const, top: 0, left: 0, opacity: 0 };\n    }\n\n    const screen = Dimensions.get(\"window\");\n    const MARGIN = 16;\n    const SPACING = 8;\n    const width = menuSize?.width ?? menuWidth;\n    const height = menuSize?.height ?? estimatedMenuHeight;\n\n    const safeLeft = insets.left + MARGIN;\n    const safeRight = screen.width - insets.right - MARGIN;\n    const safeTop = insets.top + MARGIN;\n    const safeBottom = screen.height - insets.bottom - MARGIN;\n\n    const left = Math.min(\n      Math.max(position.x, safeLeft),\n      safeRight - width\n    );\n\n    const topIfBelow = placement === \"below\"\n      ? Math.min(\n        Math.max(position.y, safeTop),\n        Math.max(safeTop, safeBottom - height)\n      )\n      : position.y + position.height + SPACING;\n    const hasSpaceBelow = placement === \"below\" || topIfBelow + height <= safeBottom;\n    const top = hasSpaceBelow\n      ? topIfBelow\n      : Math.max(safeTop, position.y - height - SPACING);\n\n    return { position: \"absolute\" as const, top, left };\n  }\n\n  const side = useMemo(() => {\n    if (!position) {\n      return \"left\";\n    }\n    const screen = Dimensions.get(\"window\");\n    const centerX = position.x + position.width / 2;\n    return centerX < screen.width / 2 ? \"left\" : \"right\";\n  }, [position]);\n\n  const currentSubmenu = submenuStack[submenuStack.length - 1];\n  const currentActions = currentSubmenu?.subactions ?? actions;\n  const menuWidth = Math.min(Dimensions.get(\"window\").width * 0.75, 320);\n  const estimatedMenuContentHeight = (currentActions.length + (currentSubmenu ? 1 : 0)) * 48;\n  const estimatedMenuHeight = estimatedMenuContentHeight + (currentSubmenu ? 52 : 0);\n  const menuContentHeight = useSharedValue(estimatedMenuContentHeight);\n  const hasMeasuredMenuContent = useRef(false);\n\n  useEffect(() => {\n    if (menuContentHeight.value <= 0) {\n      menuContentHeight.value = estimatedMenuContentHeight;\n    }\n  }, [estimatedMenuContentHeight, menuContentHeight]);\n\n  const menuContentAnimatedStyle = useAnimatedStyle(() => ({\n    height: menuContentHeight.value,\n  }));\n  const handleMenuContentLayout = useCallback((e: { nativeEvent: { layout: { height: number } } }) => {\n    const nextHeight = Math.ceil(e.nativeEvent.layout.height);\n    if (!hasMeasuredMenuContent.current) {\n      menuContentHeight.value = nextHeight;\n      hasMeasuredMenuContent.current = true;\n      return;\n    }\n    if (Math.abs(menuContentHeight.value - nextHeight) > 0.5) {\n      menuContentHeight.value = withSpring(nextHeight, { duration: 180 });\n    }\n  }, [menuContentHeight]);\n\n  const theme = useTheme();\n\n  return (\n    <View\n      ref={triggerRef}\n      collapsable={false}\n      onTouchEnd={(e) => {\n        if (!modalVisible) {\n          e.stopPropagation();\n          open();\n        }\n      }}\n    >\n      {children}\n      <Modal visible={visible} transparent onRequestClose={close}>\n        <Pressable style={styles.backdrop} onPress={close} />\n        {modalVisible && (\n          <Reanimated.View\n            style={styles.container}\n            pointerEvents=\"box-none\"\n            key={\"action-menu-container:\"+(visible ? \"visible\" : \"hidden\")}\n          >\n            <Reanimated.View\n              entering={PapillonAndroidMenuIn}\n              exiting={FadeOut.duration(200)}\n              ref={menuRef}\n              onLayout={(e: { nativeEvent: { layout: { width: number; height: number } } }) => {\n                const { width, height } = e.nativeEvent.layout;\n                setMenuSize({ width, height });\n              }}\n              style={[\n                styles.menu,\n                getMenuPosition(),\n                {\n                  backgroundColor: theme.colors.item,\n                  width: menuWidth,\n                  transformOrigin: side === \"left\" ? \"top left\" : \"top right\",\n                },\n              ]}\n            >\n              <Reanimated.View\n                style={[\n                  styles.menuContent,\n                  { backgroundColor: theme.colors.item },\n                  menuContentAnimatedStyle,\n                ]}\n              >\n                <LayoutAnimationConfig skipEntering skipExiting>\n                  <Reanimated.View\n                    style={[\n                      styles.menuContentInner,\n                      {\n                        backgroundColor: theme.colors.item,\n                      }\n                    ]}\n                    key={\"menu:\" + (currentSubmenu?.title ?? \"root\")}\n                    onLayout={handleMenuContentLayout}\n                    entering={FadeIn.duration(150)}\n                    exiting={currentSubmenu && FadeOut.duration(100)}\n                  >\n                    {currentSubmenu && (\n                      <View\n                        style={[\n                          styles.header,\n                          { borderBottomColor: theme.colors.text + \"44\" },\n                        ]}\n                      >\n                        <ListTouchable\n                          onPress={handleBack}\n                        >\n                          <Stack direction=\"horizontal\" vAlign=\"start\" hAlign=\"center\" gap={12} padding={[0, 2]}>\n                            <Papicons name=\"ArrowLeft\" color={colors.text} size={24} style={styles.headerIcon} />\n                            <Typography variant=\"title\" weight=\"bold\">{currentSubmenu.title}</Typography>\n                          </Stack>\n                        </ListTouchable>\n                      </View>\n                    )}\n                    {currentActions.map((action, index) => (\n                      <MenuItem\n                        key={action.id ?? `action-${submenuStack.length}-${index}`}\n                        action={action}\n                        textColor={colors.text}\n                        subtitleColor={subtitleColor}\n                        primaryColor={primaryColor}\n                        destructiveColor={destructiveColor}\n                        onPress={() => handlePress(action, `action-${submenuStack.length}-${index}`)}\n                      />\n                    ))}\n                  </Reanimated.View>\n                </LayoutAnimationConfig>\n              </Reanimated.View>\n            </Reanimated.View>\n          </Reanimated.View>\n        )}\n      </Modal>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  backdrop: {\n    flex: 1,\n    backgroundColor: \"rgba(0,0,0,0.0)\",\n  },\n  container: {\n    position: \"absolute\",\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    padding: 16\n  },\n  menu: {\n    borderRadius: 16,\n    shadowColor: \"#000\",\n    shadowOffset: { width: 0, height: 4 },\n    shadowOpacity: 0.15,\n    shadowRadius: 12,\n    elevation: 8,\n    overflow: \"hidden\",\n    maxWidth: 250,\n  },\n  menuContent: {\n    overflow: \"hidden\",\n  },\n  menuContentInner: {},\n  header: {\n    paddingVertical: 10,\n    paddingHorizontal: 14,\n    borderBottomWidth: 0.5,\n    overflow: \"hidden\"\n  },\n  back: {\n    fontSize: 16,\n    fontWeight: \"600\",\n    lineHeight: 20,\n  },\n  itemContainer: {\n    borderRadius: 0,\n    overflow: \"hidden\",\n  },\n  item: {\n    minHeight: 48,\n    paddingVertical: 12,\n    paddingHorizontal: 16,\n    borderRadius: 0,\n  },\n  itemSelected: {\n    backgroundColor: \"rgba(0,102,204,0.12)\",\n  },\n  itemContent: {\n    flex: 1,\n    marginRight: 10,\n  },\n  itemTitle: {\n    fontSize: 16,\n  },\n  itemSubtitle: {\n    fontSize: 13,\n    marginTop: 2,\n  },\n  arrow: {\n    alignSelf: \"center\",\n    opacity: 0.7,\n    marginLeft: 4,\n  },\n  check: {\n    alignSelf: \"center\",\n    marginLeft: 6,\n  },\n  headerIcon: {\n    alignSelf: \"center\"\n  },\n  disabled: {\n    opacity: 0.4,\n  },\n});\n"
  },
  {
    "path": "ui/components/ActivityIndicator.tsx",
    "content": "import { useTheme } from '@react-navigation/native';\nimport React, { useEffect } from 'react';\nimport { ViewStyle } from 'react-native';\nimport Animated, {\n  useAnimatedStyle,\n  useSharedValue,\n  withRepeat,\n  withTiming,\n  Easing,\n  cancelAnimation,\n} from 'react-native-reanimated';\nimport Svg, { Circle } from 'react-native-svg';\nimport { PapillonAppearIn, PapillonAppearOut } from '../utils/Transition';\n\ninterface ActivityIndicatorProps {\n  size?: number;\n  color?: string;\n  strokeWidth?: number;\n  style?: ViewStyle;\n}\n\nconst ActivityIndicator: React.FC<ActivityIndicatorProps> = ({\n  size = 42,\n  color,\n  strokeWidth: propStrokeWidth,\n  style,\n}) => {\n  const theme = useTheme();\n  const finalColor = color || theme.colors.primary;\n  const rotation = useSharedValue(0);\n\n  useEffect(() => {\n    rotation.value = 0;\n    rotation.value = withRepeat(\n      withTiming(360, {\n        duration: 1000,\n        easing: Easing.linear,\n      }),\n      -1 // Infinite repeat\n    );\n    return () => cancelAnimation(rotation);\n  }, [rotation]);\n\n  const animatedStyle = useAnimatedStyle(() => {\n    return {\n      transform: [{ rotateZ: `${rotation.value}deg` }],\n    };\n  });\n\n  const strokeWidth = propStrokeWidth || Math.max(2, size * 0.12);\n  const radius = (size - strokeWidth) / 2;\n  const circumference = 2 * Math.PI * radius;\n  // 75% filled means 0.75 * circumference is drawn, the rest is gap\n  const strokeDasharray = [circumference * 0.75, circumference];\n\n  return (\n    <Animated.View\n      entering={PapillonAppearIn}\n      exiting={PapillonAppearOut}\n    >\n      <Animated.View\n        style={[\n          { width: size, height: size, justifyContent: 'center', alignItems: 'center' },\n          animatedStyle,\n          style,\n        ]}\n      >\n        <Svg width={size} height={size}>\n          <Circle\n            cx={size / 2}\n            cy={size / 2}\n            r={radius}\n            stroke={finalColor}\n            strokeWidth={strokeWidth}\n            strokeDasharray={strokeDasharray}\n            strokeLinecap=\"round\"\n            fill=\"transparent\"\n          />\n        </Svg>\n      </Animated.View>\n    </Animated.View>\n  );\n};\n\nexport default ActivityIndicator;\n"
  },
  {
    "path": "ui/components/AlertProvider.tsx",
    "content": "import * as LucideIcons from \"lucide-react-native\";\nimport type { ComponentType } from \"react\";\nimport React, {\n  createContext,\n  ReactNode,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport {\n  KeyboardAvoidingView,\n  Platform,\n  Pressable,\n  StyleSheet,\n} from \"react-native\";\nimport Reanimated, {\n  LinearTransition,\n} from \"react-native-reanimated\";\n\nimport { Animation } from \"../utils/Animation\";\n\nconst AnimatedPressable = Reanimated.createAnimatedComponent(Pressable);\n\nimport { useTheme } from \"@react-navigation/native\";\nimport { useRouter } from \"expo-router\";\n\nimport { PapillonAppearIn, PapillonAppearOut } from \"../utils/Transition\";\nimport Typography from \"../new/Typography\";\nimport { runsIOS26 } from \"../utils/IsLiquidGlass\";\nimport { LiquidGlassView } from \"@sbaiahmed1/react-native-blur\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport Icon from \"./Icon\";\n\n// Extend Alert type with unique ID for better performance\nexport type Alert = {\n  id?: string;\n  title: string;\n  message?: string;\n  description?: string;\n  technical?: string;\n  icon?: string;\n  color?: string;\n  customButton?: {\n    label: string;\n    showCancelButton?: boolean;\n    onPress: () => void;\n  };\n  withoutNavbar?: boolean;\n  delay?: number;\n};\n\ntype AlertContextType = {\n  showAlert: (alert: Alert) => void;\n  getCallback: (alertId: string) => (() => void) | undefined;\n  cleanupCallback: (alertId: string) => void;\n};\n\nconst AlertContext = createContext<AlertContextType | undefined>(undefined);\n\nexport const useAlert = () => {\n  const context = useContext(AlertContext);\n  if (!context) {\n    throw new Error(\"useAlert must be used within an AlertProvider\");\n  }\n  return context;\n};\n\nexport const AlertProvider = ({ children }: { children: ReactNode }) => {\n  const [alerts, setAlerts] = useState<Alert[]>([]);\n  const router = useRouter();\n  const timeoutRefs = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n  const callbackRefs = useRef<Map<string, () => void>>(new Map());\n\n  // Memoized showAlert function to prevent re-renders\n  const showAlert = useCallback((alert: Alert) => {\n    const alertId = alert.id || `alert_${Date.now()}_${Math.random()}`;\n    const alertWithId = { ...alert, id: alertId };\n\n    if (alert.customButton?.onPress) {\n      callbackRefs.current.set(alertId, alert.customButton.onPress);\n    }\n\n    setAlerts((prevAlerts) => [...prevAlerts, alertWithId]);\n\n    // Clear existing timeout if alert is updated\n    const existingTimeout = timeoutRefs.current.get(alertId);\n    if (existingTimeout) {\n      clearTimeout(existingTimeout);\n    }\n\n    // Automatically remove the alert after 5 seconds\n    const timeout = setTimeout(() => {\n      setAlerts((prevAlerts) => prevAlerts.filter(a => a.id !== alertId));\n      timeoutRefs.current.delete(alertId);\n      callbackRefs.current.delete(alertId);\n    }, alert.delay || 5000);\n\n    timeoutRefs.current.set(alertId, timeout);\n  }, []);\n\n  // Memoized container style to prevent style recalculations\n  const containerStyle = useMemo(() => ({\n    position: \"absolute\" as const,\n    bottom: alerts.some(alert => alert.withoutNavbar) ? 22 : 82,\n    left: 0,\n    right: 0,\n    padding: Platform.OS === \"ios\" ? 20 : 10,\n    paddingBottom: Platform.OS === \"ios\" ? 10 : 28,\n    zIndex: 1000,\n    gap: 10,\n  }), [alerts]);\n\n  const handleAlertPress = useCallback((alert: Alert, alertId: string) => {\n    const alertDataForParams = {\n      ...alert,\n      customButton: alert.customButton ? {\n        ...alert.customButton,\n        onPress: undefined,\n      } : undefined,\n    };\n\n    router.navigate({\n      pathname: \"/alert\",\n      params: {\n        data: JSON.stringify(alertDataForParams),\n        callbackId: alertId,\n      },\n    });\n    setAlerts((prevAlerts) => prevAlerts.filter(a => a.id !== alertId));\n    const timeout = timeoutRefs.current.get(alertId);\n    if (timeout) {\n      clearTimeout(timeout);\n      timeoutRefs.current.delete(alertId);\n    }\n  }, [router]);\n\n  const getCallback = useCallback((alertId: string) => {\n    return callbackRefs.current.get(alertId);\n  }, []);\n\n  const cleanupCallback = useCallback((alertId: string) => {\n    callbackRefs.current.delete(alertId);\n  }, []);\n\n  // Memoized context value to prevent provider re-renders\n  const contextValue = useMemo(() => ({ showAlert, getCallback, cleanupCallback }), [showAlert, getCallback, cleanupCallback]);\n\n  // Cleanup timeouts on unmount to prevent memory leaks\n  useEffect(() => {\n    return () => {\n      timeoutRefs.current.forEach((timeout) => {\n        clearTimeout(timeout);\n      });\n      timeoutRefs.current.clear();\n    };\n  }, []);\n\n  return (\n    <AlertContext.Provider value={contextValue}>\n      {children}\n\n      <KeyboardAvoidingView\n        behavior={\"height\"}\n        style={[\n          { position: \"absolute\", top: 0, bottom: 0, left: 0, right: 0, zIndex: 1000 },\n          runsIOS26 ? { \n            shadowColor: \"#000\",\n            shadowOffset: { width: 0, height: 1 },\n            shadowOpacity: 0.1,\n            shadowRadius: 10,\n          } : {}\n        ]}\n        pointerEvents={\"box-none\"}\n      >\n        {alerts.length > 0 && (\n          <Reanimated.View\n            layout={Animation(LinearTransition)}\n            style={containerStyle}\n          >\n            {alerts.map((alert) => (\n              <AlertComponent\n                alert={alert}\n                key={alert.id}\n                onPress={() => handleAlertPress(alert, alert.id!)}\n              />\n            ))}\n          </Reanimated.View>\n        )}\n      </KeyboardAvoidingView>\n    </AlertContext.Provider>\n  );\n};\n\n// Optimized Alert component with React.memo and useMemo\nconst AlertComponent = React.memo(({ alert, onPress }: { alert: Alert, onPress?: () => void }) => {\n  const { colors } = useTheme();\n\n  // Memoized icon component to prevent re-renders\n  const IconComponent = useMemo(() => {\n    if (!alert.icon) {\n      return null;\n    }\n    return <Papicons name={alert.icon} />;\n  }, [alert.icon]);\n\n  // Memoized styles for better performance\n  const containerStyle = useMemo(() => [\n    styles.alertContainer,\n    {\n      backgroundColor: colors.item,\n      borderColor: colors.text + \"30\",\n    },\n  ], [colors.item, colors.text]);\n\n  const iconColor = useMemo(() => alert.color ?? colors.text, [alert.color, colors.text]);\n\n  const handlePress = useCallback(() => {\n    if (onPress) {\n      onPress();\n    }\n  }, [onPress]);\n\n  if(runsIOS26) {\n    // For iOS 26, return a simpler alert without animations for better performance\n    return (\n      <Reanimated.View\n        layout={Animation(LinearTransition)}\n        entering={PapillonAppearIn}\n        exiting={PapillonAppearOut}\n      >\n        <LiquidGlassView\n          glassType=\"clear\"\n          isInteractive={true}\n          glassOpacity={0}\n          style={{\n            borderRadius: 30\n          }}\n        >\n          <Pressable\n            onPress={handlePress}\n            style={[containerStyle, {\n              width: \"100%\",\n              borderWidth: 0,\n              shadowColor: \"transparent\",\n              backgroundColor: \"transparent\",\n            }]}\n          >\n            {IconComponent && (\n          <Reanimated.View style={styles.iconContainer}>\n            <Icon size={24} fill={iconColor}>\n              {IconComponent}\n            </Icon>\n          </Reanimated.View>\n        )}\n        <Reanimated.View style={styles.textContainer}>\n          <Typography variant=\"title\"\n            color=\"text\"\n          >{alert.title}</Typography>\n          {alert.message && (\n            <Typography variant=\"body1\"\n              color=\"textSecondary\"\n            >{alert.message}</Typography>\n          )}\n        </Reanimated.View>\n          </Pressable>\n        </LiquidGlassView>\n      </Reanimated.View>\n    );\n  }\n\n  return (\n    <AnimatedPressable\n      onPress={handlePress}\n      layout={Animation(LinearTransition)}\n      entering={PapillonAppearIn}\n      exiting={PapillonAppearOut}\n      style={containerStyle}\n    >\n      {IconComponent && (\n        <Reanimated.View style={styles.iconContainer}>\n          <Icon size={24} fill={iconColor}>\n              {IconComponent}\n            </Icon>\n        </Reanimated.View>\n      )}\n      <Reanimated.View style={styles.textContainer}>\n        <Typography variant=\"title\"\n        >{alert.title}</Typography>\n        {alert.message && (\n          <Typography variant=\"body1\"\n            color=\"textSecondary\"\n          >{alert.message}</Typography>\n        )}\n      </Reanimated.View>\n    </AnimatedPressable>\n  );\n});\n\nAlertComponent.displayName = \"AlertComponent\";\n\n// Export Alert for backwards compatibility\nexport const Alert = AlertComponent;\n\n// Pre-calculated styles for maximum performance\nconst styles = StyleSheet.create({\n  alertContainer: {\n    borderWidth: 0.5,\n    display: \"flex\",\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    paddingHorizontal: 16,\n    paddingVertical: 10,\n    borderRadius: Platform.OS === \"ios\" ? 0 : 14,\n    borderCurve: \"continuous\",\n    gap: 16,\n    shadowColor: \"#000\",\n    shadowOffset: {\n      width: 0,\n      height: 1,\n    },\n    shadowOpacity: 0.15,\n    shadowRadius: 3,\n    // Add elevation for Android performance\n    elevation: 1,\n  },\n  iconContainer: {\n    // Empty for now, can be used for icon-specific optimizations\n  },\n  textContainer: {\n    flex: 1,\n    display: \"flex\",\n    flexDirection: \"column\",\n    gap: 0,\n  },\n});\n"
  },
  {
    "path": "ui/components/AnimatedNumber.tsx",
    "content": "import React, { useRef, useMemo } from 'react';\nimport Typography, { TypographyProps } from './Typography';\nimport Reanimated, { LinearTransition, withDelay, withSpring, AnimateProps } from 'react-native-reanimated';\n\ninterface AnimatedNumberProps extends TypographyProps {\n  distance?: number; // Distance to translate the number\n  duration?: number; // Duration of the animation\n  dampingRatio?: number; // Damping ratio of the animation\n  disableMoveAnimation?: boolean; // Désactivé la transition linéaire\n}\n\n// Type the outer Reanimated component for better type safety\nconst AnimatedView = Reanimated.View as React.ComponentType<AnimateProps<React.ComponentProps<typeof Reanimated.View>>>;\n\nfunction AnimatedNumber({\n  children,\n  distance = 12,\n  duration = 700,\n  dampingRatio = 0.55,\n  disableMoveAnimation = false,\n  ...rest\n}: AnimatedNumberProps) {\n  try {\n    // 1. Memoize value string and digits array\n    const value = useMemo(() => (children?.toString ? children.toString().trim() : ''), [children]);\n    const digits = useMemo(() => value.split(''), [value]);\n\n    // 2. Track previous digits for comparison\n    const prevDigitsRef = useRef<string[]>(digits);\n    React.useEffect(() => {\n      // Update the previous digits AFTER the current render cycle is complete\n      prevDigitsRef.current = digits;\n    }, [value]);\n\n    // 3. Memoize comparison arrays - Runs only when `digits` changes\n    const { unchangedArr, changedIndexArr } = useMemo(() => {\n      const prevDigits = prevDigitsRef.current;\n      const unchangedArr: boolean[] = [];\n      const changedIndexArr: number[] = [];\n      let changedCounter = 0;\n\n      // Use a standard loop for potential slight performance gain over .map()\n      for (let idx = 0; idx < digits.length; idx++) {\n        const isUnchanged = prevDigits[idx] === digits[idx];\n        unchangedArr.push(isUnchanged);\n        changedIndexArr.push(isUnchanged ? -1 : changedCounter++);\n      }\n\n      return { unchangedArr, changedIndexArr };\n    }, [digits]);\n\n    // 4. Memoize animation configs (factory functions) - Runs only if distance or duration changes\n    const getNumberEntering = useMemo(() => {\n      return (changedIndex: number, unchanged: boolean) => () => {\n        'worklet';\n        // Delay applied only if the digit actually changed\n        const delay = unchanged ? 60 : changedIndex * 60;\n        return {\n          initialValues: {\n            opacity: 0,\n            transform: [{ translateY: distance }, { scale: 0.4 }],\n          },\n          animations: {\n            opacity: withDelay(delay, withSpring(1, { duration: duration / 2 })),\n            transform: [\n              { translateY: withDelay(delay, withSpring(0, { duration, dampingRatio })) },\n              { scale: withDelay(delay, withSpring(1, { duration, dampingRatio })) },\n            ],\n          },\n        };\n      };\n    }, [distance, duration]);\n\n    const getNumberExiting = useMemo(() => {\n\n      return (changedIndex: number, unchanged: boolean) => () => {\n        'worklet';\n        const delay = unchanged ? 0 : changedIndex * 60;\n        return {\n          initialValues: {\n            opacity: 1,\n            transform: [{ translateY: 0 }, { scale: 1 }],\n          },\n          animations: {\n            opacity: withDelay(delay, withSpring(0, { duration, dampingRatio })),\n            transform: [\n              { translateY: withDelay(delay, withSpring(-distance, { duration, dampingRatio })) }, // Use -distance for upward exit\n              { scale: withDelay(delay, withSpring(0.5, { duration, dampingRatio })) },\n            ],\n          },\n        };\n      };\n    }, [distance, duration]);\n\n    return (\n      <AnimatedView\n        // Parent view layout for digit count/position changes\n        layout={disableMoveAnimation ? undefined : LinearTransition.springify()}\n        style={{\n          flexDirection: 'row',\n          alignItems: 'center',\n          justifyContent: 'center',\n        }}\n      >\n        {digits.map((digit, index) => {\n          const unchanged = unchangedArr[index];\n          const changedIndex = changedIndexArr[index];\n\n          return (\n            <AnimatedView\n              // Use digit and index in the key to ensure React/Reanimated sees a change \n              // when the value or position of a digit changes\n              key={`animated-number-${digit}-${index}`}\n              // **Optimization:** Removed inner 'layout' prop to rely only on controlled entering/exiting\n              layout={(digit == \".\" || digit == \",\") ? LinearTransition.springify() : undefined}\n              entering={getNumberEntering(changedIndex, unchanged)}\n              exiting={getNumberExiting(changedIndex, unchanged)}\n            >\n              <Typography {...rest}>{digit}</Typography>\n            </AnimatedView>\n          );\n        })}\n      </AnimatedView>\n    );\n  }\n  catch (error) {\n    // Keep error handling robust\n    console.error(\"Error in AnimatedNumber:\", error);\n    return <Typography {...rest}>{children}</Typography>;\n  }\n}\n\n// Keep the outer memoization\nexport default React.memo(AnimatedNumber);"
  },
  {
    "path": "ui/components/AnimatedPressable.tsx",
    "content": "import React, { useCallback, useContext, useMemo, useRef } from \"react\";\nimport { Platform, PressableProps } from \"react-native\";\nimport Reanimated, {\n  LinearTransition,\n  useAnimatedStyle,\n  useSharedValue,\n  withSpring,\n} from \"react-native-reanimated\";\nimport * as ExpoHaptics from \"expo-haptics\";\nimport { Animation } from \"../utils/Animation\";\nimport { Pressable, TapGestureHandler } from \"react-native-gesture-handler\";\nimport { ListTouchableBlockPressContext } from \"../new/ListTouchableContext\";\n\nconst ReanimatedPressable = Reanimated.createAnimatedComponent(Pressable);\n\nconst IS_ANDROID = Platform.OS === \"android\";\nconst SPRING_IN_CONFIG = { duration: 30 };\nconst SPRING_OUT_CONFIG = { duration: 200 };\n\ntype AnimatedPressableProps = PressableProps & {\n  scaleTo?: number;\n  opacityTo?: number;\n  hapticFeedback?: ExpoHaptics.ImpactFeedbackStyle;\n  animated?: boolean;\n};\n\nfunction AnimatedPressable({\n  children,\n  scaleTo = 0.95,\n  opacityTo = 0.7,\n  hapticFeedback,\n  animated = false,\n  style,\n  onPressIn,\n  onPressOut,\n  onPress,\n  ...props\n}: AnimatedPressableProps) {\n  const blockParentListTouchablePress = useContext(ListTouchableBlockPressContext);\n  const scale = useSharedValue(1);\n  const opacity = useSharedValue(1);\n\n  const pressInRef = useRef(onPressIn);\n  const pressOutRef = useRef(onPressOut);\n  const pressRef = useRef(onPress);\n  pressInRef.current = onPressIn;\n  pressOutRef.current = onPressOut;\n  pressRef.current = onPress;\n\n  const animatedStyle = useAnimatedStyle(() => ({\n    transform: [{ scale: scale.value }],\n    opacity: IS_ANDROID ? 1 : opacity.value,\n  }));\n\n  const handlePressIn = useCallback(\n    (e: any) => {\n      blockParentListTouchablePress?.block();\n      if (hapticFeedback) {\n        ExpoHaptics.impactAsync(hapticFeedback);\n      }\n      scale.value = withSpring(scaleTo, SPRING_IN_CONFIG);\n      opacity.value = withSpring(opacityTo, SPRING_IN_CONFIG);\n      pressInRef.current?.(e);\n    },\n    [blockParentListTouchablePress, hapticFeedback, scaleTo, opacityTo, scale, opacity]\n  );\n\n  const handlePressOut = useCallback(\n    (e: any) => {\n      blockParentListTouchablePress?.unblock();\n      scale.value = withSpring(1, SPRING_OUT_CONFIG);\n      opacity.value = withSpring(1, SPRING_OUT_CONFIG);\n      pressOutRef.current?.(e);\n    },\n    [blockParentListTouchablePress, scale, opacity]\n  );\n\n  const handleOnActivated = useCallback((e) => {\n    pressRef.current?.(e);\n  }, []);\n\n  const layoutAnim = useMemo(\n    () => (animated ? Animation(LinearTransition) : undefined),\n    [animated]\n  );\n\n  return (\n    <TapGestureHandler\n      // Configure TapGestureHandler to be more responsive to short presses\n      maxDurationMs={300}\n      maxDelayMs={0}\n      onActivated={handleOnActivated}\n    >\n      <ReanimatedPressable\n        {...props}\n        layout={props.layout || layoutAnim}\n        style={[style, animatedStyle]}\n        onPressIn={handlePressIn}\n        onPressOut={handlePressOut}\n      // onPress is now handled by the TapGestureHandler's onActivated prop\n      >\n        {children}\n      </ReanimatedPressable>\n    </TapGestureHandler>\n  );\n}\n\nexport default React.memo(AnimatedPressable);\n"
  },
  {
    "path": "ui/components/Avatar.tsx",
    "content": "import { Dimensions, Image, View, ViewProps } from \"react-native\";\nimport { useTheme } from \"@react-navigation/native\";\nimport adjust from \"@/utils/adjustColor\";\nimport Typography from \"@/ui/components/Typography\";\nimport Reanimated, {\n  Easing,\n  StyleProps,\n  useSharedValue,\n  withDelay,\n  withRepeat,\n  withTiming,\n} from \"react-native-reanimated\";\nimport { useEffect, useRef, useState } from \"react\";\nimport SkeletonView from \"@/ui/components/SkeletonView\";\nimport AnimatedPressable from \"@/ui/components/AnimatedPressable\";\nimport { RotateCcw } from \"lucide-react-native\";\n\nexport interface AvatarProps extends ViewProps {\n  size?: number;\n  initials?: string;\n  imageUrl?: string;\n  shape?: \"circle\" | \"square\";\n  color?: string;\n  skeleton?: boolean;\n}\n\nconst Avatar = ({\n  size = 40,\n  initials,\n  imageUrl,\n  shape = \"circle\",\n  color,\n  skeleton = false,\n  ...rest\n}: AvatarProps) => {\n  const { colors, dark } = useTheme();\n  const [hasFailed, setHasFailed] = useState(false);\n  const [reloadKey, setReloadKey] = useState(0);\n\n  const borderRadius = shape === \"circle\" ? size / 2 : size * 0.2;\n\n  const generateBodyStyle = (): StyleProps => {\n    let baseStyle: StyleProps = {\n      width: size,\n      height: size,\n      borderRadius: borderRadius,\n      justifyContent: \"center\",\n      alignItems: \"center\",\n      overflow: \"hidden\",\n    };\n\n    if (hasFailed)\n      baseStyle.backgroundColor = adjust(\"#DD0030\", dark ? -0.6 : 0.9);\n    else if (!imageUrl && !skeleton)\n      baseStyle.backgroundColor = adjust(color ?? colors.primary, dark ? -0.6 : 0.85);\n\n    if (hasFailed)\n      baseStyle.borderColor = adjust(color ?? colors.primary, dark ? -0.6 : 0.9);\n    else if (imageUrl || skeleton)\n      baseStyle.borderColor = colors.border;\n    else\n      baseStyle.borderColor = colors.border\n\n    return baseStyle;\n  }\n\n  return (\n    <AnimatedPressable\n      style={[generateBodyStyle(), rest.style]}\n      pointerEvents={hasFailed ? \"auto\" : \"none\"}\n      onPress={() => {\n        setHasFailed(false);\n        setReloadKey((k) => k + 1);\n      }}\n    >\n      {(skeleton || (imageUrl && !hasFailed)) && (\n        <SkeletonView\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            width: size,\n            height: size,\n            borderRadius: borderRadius,\n          }}\n        />\n      )}\n\n      {imageUrl && (\n        <>\n          <Image\n            key={reloadKey}\n            source={{ uri: imageUrl }}\n            style={{ width: size, height: size, borderRadius: borderRadius }}\n            resizeMode=\"cover\"\n            onError={() => setHasFailed(true)}\n          />\n        </>\n      )}\n      {(!imageUrl && !skeleton) && (\n        <Typography\n          color={color ?? colors.primary}\n          weight={\"bold\"}\n          style={{ textTransform: \"uppercase\", fontSize: size * 0.4, lineHeight: size * 0.95 }}\n        >\n          {initials || \"?\"}\n        </Typography>\n      )}\n      {hasFailed && (\n        <RotateCcw color={\"#DD0030\"} size={size * 0.4} style={{ position: \"absolute\" }} />\n      )}\n    </AnimatedPressable>\n  );\n};\n\nexport default Avatar;"
  },
  {
    "path": "ui/components/Button.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport React, { useCallback, useMemo } from \"react\";\nimport { ActivityIndicator, Pressable, PressableProps } from \"react-native\";\nimport Reanimated, { Easing, FadeIn, FadeOut, LinearTransition, useAnimatedStyle, useSharedValue, withSpring, withTiming } from \"react-native-reanimated\";\n\nimport { Animation } from \"../utils/Animation\";\nimport { PapillonZoomIn, PapillonZoomOut } from \"../utils/Transition\";\nimport Typography from \"./Typography\";\nimport * as ExpoHaptics from \"expo-haptics\";\nimport { runsIOS26 } from \"../utils/IsLiquidGlass\";\n\nimport {\n  LiquidGlassView\n} from '@callstack/liquid-glass';\n\nconst AnimatedPressable = Reanimated.createAnimatedComponent(Pressable);\n\ntype Variant = 'primary' | 'outline' | 'light' | 'ghost' | 'service';\nexport type Color = 'primary' | 'text' | 'light' | 'danger' | 'cherry' | 'black' | 'card' | 'blue' | 'orange';\ntype Size = 'small' | 'medium' | 'large';\ntype Alignment = 'start' | 'center' | 'end';\n\ninterface ButtonProps extends PressableProps {\n  variant?: Variant;\n  icon?: React.ReactNode;\n  color?: Color;\n  size?: Size;\n  title?: string;\n  inline?: boolean;\n  loading?: boolean;\n  onPress?: () => void;\n  disabled?: boolean;\n  disableAnimation?: boolean;\n  alignment?: Alignment;\n}\n\nconst defaultProps = {\n  variant: 'primary' as Variant,\n  icon: null,\n  color: 'primary' as Color,\n  size: 'medium' as Size,\n  title: undefined,\n  inline: false,\n  loading: false,\n  onPress: () => { },\n  disabled: false,\n  disableAnimation: false,\n  alignment: 'center' as Alignment,\n};\n\nconst Button: React.FC<ButtonProps> = React.memo(({\n  variant = defaultProps.variant,\n  icon = defaultProps.icon,\n  color = defaultProps.color,\n  size = defaultProps.size,\n  title = defaultProps.title,\n  inline = defaultProps.inline,\n  loading = defaultProps.loading,\n  onPress = defaultProps.onPress,\n  disabled = defaultProps.disabled,\n  alignment = defaultProps.alignment,\n  disableAnimation = defaultProps.disableAnimation,\n  style,\n  ...rest\n}) => {\n  const { colors } = useTheme();\n\n  const colorsList: Record<Color, string> = React.useMemo(() => ({\n    primary: colors.primary,\n    text: colors.text,\n    card: colors.card,\n    light: '#FFFFFF',\n    danger: '#DC1400',\n    cherry: '#D60046',\n    black: '#000000',\n    blue: '#0059DD',\n    orange: '#C94F1A',\n  }), [colors]);\n\n  // Animation scale\n  const scale = useSharedValue(1);\n  const opacity = useSharedValue(1);\n  const animatedStyle = useAnimatedStyle(() => ({\n    transform: [{ scale: scale.value }],\n    opacity: opacity.value,\n  }), []);\n\n  const handlePressIn = useCallback(() => {\n    ExpoHaptics.impactAsync(ExpoHaptics.ImpactFeedbackStyle.Soft)\n    \"use worklet\";\n    scale.value = withTiming(0.97, { duration: 100, easing: Easing.out(Easing.exp) });\n    opacity.value = withTiming(0.7, { duration: 50, easing: Easing.out(Easing.exp) });\n  }, [scale, opacity]);\n\n  const handlePressOut = useCallback(() => {\n    \"use worklet\";\n    scale.value = withSpring(1, { mass: 1, damping: 20, stiffness: 300 });\n    opacity.value = withTiming(1, { duration: 150, easing: Easing.out(Easing.ease) });\n  }, [scale, opacity]);\n\n  const backgroundColor = useMemo(() => {\n    if (disabled) { return colorsList.text + '30'; } // Light color with 30% opacity for disabled state\n\n    switch (variant) {\n      case 'outline':\n      case 'ghost':\n        return 'transparent';\n      case 'light':\n        return colorsList[color as Color] + '30';\n      case 'primary':\n      default:\n        return colorsList[color as Color];\n    }\n  }, [variant, colorsList, color, disabled]);\n\n  const textColor = useMemo(() => {\n    switch (variant) {\n      case 'ghost':\n        return colors.text + \"70\"\n      case 'primary':\n        return colorsList.light;\n      case 'service':\n        return colorsList.text;\n      default:\n        return colorsList[color as Color];\n    }\n  }, [variant, colorsList, color]);\n\n  const justifyContent = useMemo(() => {\n    switch (alignment) {\n      case 'start':\n        return 'flex-start';\n      case 'end':\n        return 'flex-end';\n      case 'center':\n      default:\n        return 'center';\n    }\n  }, [alignment]);\n\n  const buttonStyle = useMemo(() => [\n    {\n      width: inline ? 'auto' : '100%',\n      borderRadius: 50,\n      borderCurve: 'continuous',\n      backgroundColor: backgroundColor,\n      overflow: 'hidden',\n      height: 50,\n      paddingHorizontal: 18,\n      flexDirection: 'row',\n      justifyContent: justifyContent,\n      gap: 5,\n      alignItems: 'center',\n    },\n    variant === 'outline' && {\n      borderWidth: 1,\n      borderColor: colorsList[color as Color],\n      backgroundColor: 'transparent',\n    },\n    variant === 'service' && {\n      borderWidth: 1,\n      borderColor: colorsList.text + \"30\",\n      backgroundColor: colorsList.card,\n    },\n    size === 'small' && {\n      height: 40,\n      paddingHorizontal: 12,\n    },\n    size === 'large' && {\n      height: 60,\n      paddingHorizontal: 24,\n    },\n    inline && { width: undefined },\n    style,\n    animatedStyle,\n  ], [inline, backgroundColor, justifyContent, style, animatedStyle, variant, colorsList, color, size]);\n\n  const buttonIcon = useMemo(() => {\n    if (icon) {\n      return React.cloneElement(icon as React.ReactElement, {\n        // @ts-expect-error\n        color: textColor,\n        strokeWidth: 2,\n      });\n    }\n    return null;\n  }, [icon, textColor]);\n\n  const ButtonContent = (\n    (rest.children && !title) ? rest.children : (\n      <>\n        {loading && (\n          <Reanimated.View layout={Animation(LinearTransition)} entering={PapillonZoomIn} exiting={PapillonZoomOut}>\n            <ActivityIndicator color={textColor} />\n          </Reanimated.View>\n        )}\n        {buttonIcon && (\n          <Reanimated.View layout={Animation(LinearTransition)} entering={PapillonZoomIn} exiting={PapillonZoomOut}>\n            {buttonIcon}\n          </Reanimated.View>\n        )}\n        <Reanimated.View layout={Animation(LinearTransition)}>\n          <Typography variant=\"button\" color={textColor}>\n            {title || \"Button\"}\n          </Typography>\n        </Reanimated.View>\n        {rest.children && typeof rest.children !== \"function\" && (\n          <Reanimated.View layout={Animation(LinearTransition)} entering={PapillonZoomIn} exiting={PapillonZoomOut}>\n            {rest.children}\n          </Reanimated.View>\n        )}\n      </>\n    )\n  )\n\n  const buttonTint = (variant === 'outline' || variant === 'service')\n    ? \"transparent\"\n    : (\n      (style && typeof style === 'object' && !Array.isArray(style) && 'backgroundColor' in style)\n        ? (style as { backgroundColor?: string }).backgroundColor\n        : backgroundColor\n    );\n\n  if (runsIOS26) {\n    return (\n      <LiquidGlassView\n        key=\"button:liquid-glass\"\n        style={{\n          width: inline ? undefined : '100%',\n          height: 50,\n          borderRadius: 160,\n          borderCurve: 'continuous',\n          backgroundColor: buttonTint,\n          overflow: 'visible',\n          paddingHorizontal: 18,\n          justifyContent: justifyContent,\n          alignItems: 'center',\n          flexDirection: 'row',\n          gap: 5,\n          opacity: disabled ? 0.5 : 1,\n        }}\n        tintColor={\n          buttonTint\n        }\n        {...rest}\n        effect=\"regular\"\n        interactive={true}\n      >\n        <Pressable\n          onPress={onPress}\n          style={{\n            width: '100%',\n            height: '100%',\n            justifyContent: justifyContent,\n            alignItems: 'center',\n            flexDirection: 'row',\n            gap: 5,\n          }}\n          disabled={disabled}\n          {...rest}\n        >\n          {ButtonContent}\n        </Pressable>\n      </LiquidGlassView>\n    )\n  }\n\n  return (\n    <AnimatedPressable\n      {...rest}\n      layout={disableAnimation ? undefined : Animation(LinearTransition)}\n      entering={FadeIn}\n      exiting={FadeOut}\n      style={buttonStyle}\n      onPress={onPress}\n      onPressIn={handlePressIn}\n      onPressOut={handlePressOut}\n    >\n      {ButtonContent}\n    </AnimatedPressable>\n  );\n});\n\nButton.displayName = \"Button\";\n\nexport default Button;"
  },
  {
    "path": "ui/components/Calendar.tsx",
    "content": "import DateTimePicker from '@react-native-community/datetimepicker';\nimport { useTheme } from \"@react-navigation/native\";\nimport { LiquidGlassView } from '@sbaiahmed1/react-native-blur';\nimport * as Localization from \"expo-localization\";\nimport React, { useEffect, useState } from \"react\";\nimport { Platform, Pressable } from \"react-native\";\nimport Reanimated from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { PapillonSpringIn, PapillonSpringOut } from \"../utils/Transition\";\n\n\nexport interface CalendarProps {\n  date?: Date;\n  onDateChange?: (date: Date) => void;\n  color?: string;\n}\n\nexport interface CalendarRef {\n  toggle: () => void;\n  show: () => void;\n  hide: () => void;\n}\n\nconst Calendar = React.forwardRef<CalendarRef, CalendarProps>(({\n  date: initialDate = new Date(),\n  onDateChange,\n  color,\n}, ref) => {\n  const [date, setDate] = useState(initialDate);\n  const [visible, setVisible] = useState(false);\n  const { colors } = useTheme();\n\n  React.useImperativeHandle(ref, () => ({\n    toggle: () => setVisible(prev => !prev),\n    show: () => setVisible(true),\n    hide: () => setVisible(false),\n  }));\n\n  useEffect(() => {\n    setDate(initialDate);\n  }, [initialDate]);\n\n  const handleChange = (event: any, selectedDate?: Date) => {\n    const currentDate = selectedDate || date;\n    setDate(currentDate);\n    onDateChange?.(currentDate);\n    if (Platform.OS === \"android\") { setVisible(false); }\n  };\n\n  if (Platform.OS === \"android\") {\n    if (!visible) { return null; }\n    return (\n      <DateTimePicker\n        value={date}\n        mode=\"date\"\n        design=\"material\"\n        display=\"inline\"\n        accentColor={color}\n        locale={Localization.getLocales()[0].languageTag}\n        onChange={handleChange}\n        style={{ maxWidth: 300, width: 300, maxHeight: 320, height: 320, marginTop: -6, marginHorizontal: 10 }}\n      />\n    )\n  }\n\n  const insets = useSafeAreaInsets();\n\n  return (\n    <>\n      {\n        visible && (\n          <Pressable\n            onPress={() => setVisible(false)}\n            style={{\n              width: \"100%\",\n              height: \"100%\",\n              position: \"absolute\",\n              top: 0,\n              left: 0,\n              zIndex: 9,\n            }}\n          />\n        )\n      }\n\n      {visible && (\n        <Reanimated.View\n          style={[{\n            transformOrigin: \"top left\",\n            overflow: \"visible\",\n            position: \"absolute\",\n            top: insets.top + 58,\n            left: 12,\n            zIndex: 10,\n          }]}\n          entering={PapillonSpringIn}\n          exiting={PapillonSpringOut}\n        >\n          <LiquidGlassView\n            glassType=\"regular\"\n            isInteractive={true}\n            glassOpacity={0}\n            style={{\n              borderRadius: 20,\n              width: 340,\n              height: 320,\n              alignItems: \"center\",\n              justifyContent: \"center\"\n            }}\n          >\n            <DateTimePicker\n              value={date}\n              mode=\"date\"\n              display=\"inline\"\n              accentColor={color}\n              locale={Localization.getLocales()[0].languageTag}\n              onChange={handleChange}\n              style={{\n                width: \"100%\",\n                height: \"100%\",\n                paddingHorizontal: 5,\n                paddingBottom: 5,\n              }}\n            />\n          </LiquidGlassView>\n        </Reanimated.View>\n      )}\n    </>\n  );\n});\n\nexport default Calendar;\n"
  },
  {
    "path": "ui/components/ChipButton.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { MenuAction, MenuView } from '@react-native-menu/menu';\nimport { useTheme } from \"@react-navigation/native\";\nimport { LiquidGlassView } from '@sbaiahmed1/react-native-blur';\nimport React from \"react\";\nimport { Platform, Pressable, TouchableNativeFeedback, TouchableOpacity, View } from \"react-native\";\n\nimport { runsIOS26 } from \"../utils/IsLiquidGlass\";\nimport { PapillonAppearIn, PapillonAppearOut } from \"../utils/Transition\";\nimport { Dynamic } from \"./Dynamic\";\nimport Icon from \"./Icon\";\nimport Stack from \"./Stack\";\nimport Typography from \"./Typography\";\nimport ActionMenu from \"./ActionMenu\";\n\nconst ChipButton: React.FC<React.PropsWithChildren<{\n  onPress?: () => void;\n  icon?: string;\n  chevron?: boolean;\n  onPressAction?: ({ nativeEvent }: { nativeEvent: { event: string } }) => void;\n  single?: boolean;\n  actions?: MenuAction[];\n}>> = ({ onPress, icon, children, chevron, onPressAction, single, actions = [] }) => {\n  const { colors } = useTheme()\n\n  if (runsIOS26) {\n    return (\n      <LiquidGlassView\n        glassType=\"regular\"\n        isInteractive={true}\n        glassTintColor=\"transparent\"\n        glassOpacity={0}\n        style={[\n          {\n            borderRadius: 300,\n            zIndex: 999999,\n          },\n          single && {\n            width: 46,\n            height: 46,\n            justifyContent: \"center\",\n            alignItems: \"center\",\n          }\n        ]}\n      >\n        <Pressable onPress={onPress}>\n          <ActionMenu onPressAction={onPressAction} actions={actions}>\n            <Stack animated direction=\"horizontal\" hAlign=\"center\" gap={8} padding={single ? 0 : [12, 6]} radius={200} inline vAlign=\"center\">\n              {icon &&\n                <Dynamic animated>\n                  <Icon style={{ marginLeft: single ? 0 : -2 }} size={24}>\n                    <Papicons name={icon} />\n                  </Icon>\n                </Dynamic>\n              }\n\n              {children &&\n                <Dynamic animated entering={PapillonAppearIn} exiting={PapillonAppearOut} key={\"chip-text:\" + children?.toString()}>\n                  <Typography>\n                    {children}\n                  </Typography>\n                </Dynamic>\n              }\n\n              {chevron &&\n                <Dynamic animated>\n                  <Icon size={20} opacity={0.5}>\n                    <Papicons name=\"chevrondown\" />\n                  </Icon>\n                </Dynamic>\n              }\n            </Stack>\n          </ActionMenu>\n        </Pressable>\n      </LiquidGlassView>\n    );\n  }\n\n  return (\n    <FallBackTouchable\n      style={[\n        {\n          borderRadius: 300,\n          zIndex: 999999,\n          backgroundColor: colors.card,\n          borderWidth: Platform.OS === \"android\" ? 0 : 1,\n          borderColor: colors.border,\n          overflow: 'hidden',\n        },\n        single && {\n          width: 46,\n          height: 46,\n          justifyContent: \"center\",\n          alignItems: \"center\",\n        }\n      ]}\n      contentContainerStyle={{\n        borderRadius: 300,\n        overflow: 'hidden',\n      }}\n      onPress={onPress}\n    >\n      <ActionMenu onPressAction={onPressAction} actions={actions}>\n        <Stack animated direction=\"horizontal\" hAlign=\"center\" gap={8} padding={single ? 0 : [12, 6]} radius={200} inline vAlign=\"center\">\n          {icon &&\n            <Dynamic animated>\n              <Icon style={{ marginLeft: single ? 0 : -2 }} size={24}>\n                <Papicons name={icon} />\n              </Icon>\n            </Dynamic>\n          }\n\n          {children &&\n            <Dynamic animated entering={PapillonAppearIn} exiting={PapillonAppearOut} key={\"chip-text:\" + children?.toString()}>\n              <Typography>\n                {children}\n              </Typography>\n            </Dynamic>\n          }\n\n          {chevron &&\n            <Dynamic animated>\n              <Icon size={20} opacity={0.5}>\n                <Papicons name=\"chevrondown\" />\n              </Icon>\n            </Dynamic>\n          }\n        </Stack>\n      </ActionMenu>\n    </FallBackTouchable>\n  );\n\n}\n\nconst FallBackTouchable = ({ ...props }: React.ComponentProps<typeof TouchableOpacity>) => {\n  if(Platform.OS === 'android') {\n    return (\n      <TouchableNativeFeedback\n        onPress={props.onPress}\n        useForeground\n        style={props.contentContainerStyle}\n      >\n        <View {...props}>\n          {props.children}\n        </View>\n      </TouchableNativeFeedback>\n    );\n  }\n\n  return (\n    <TouchableOpacity activeOpacity={0.5} {...props} />\n  )\n}\n\nexport default ChipButton;"
  },
  {
    "path": "ui/components/CircularProgress.tsx",
    "content": "import React, { FC, useEffect } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Animated, {\n  useAnimatedProps,\n  useSharedValue,\n  withTiming,\n} from 'react-native-reanimated';\nimport Svg, { Circle } from 'react-native-svg';\n\nimport { PapillonAppearIn, PapillonAppearOut } from '../utils/Transition';\n\ntype CircularProgressProps = {\n  strokeWidth: number;\n  radius: number;\n  backgroundColor: string;\n  fill: string;\n  percentageComplete: number;\n};\n\nconst AnimatedCircle = Animated.createAnimatedComponent(Circle);\n\nconst CircularProgress: FC<CircularProgressProps> = ({\n  radius,\n  strokeWidth,\n  backgroundColor,\n  fill,\n  percentageComplete,\n}) => {\n  // return (<></>);\n\n  const innerRadius = radius - strokeWidth / 2;\n  const circumference = 2 * Math.PI * innerRadius;\n\n  const initialOffset = circumference * (1 - percentageComplete / 100);\n  const strokeDashoffset = useSharedValue(initialOffset); // Initialize with correct value\n\n  useEffect(() => {\n    const newOffset = circumference * (1 - percentageComplete / 100);\n    strokeDashoffset.value = withTiming(newOffset, {\n      duration: 500,\n    });\n  }, [percentageComplete, circumference, strokeDashoffset]); // Added dependencies to ensure proper updates\n\n  const animatedProps = useAnimatedProps(() => ({\n    strokeDashoffset: strokeDashoffset.value,\n  }));\n\n  return (\n    <Animated.View\n      entering={PapillonAppearIn}\n      exiting={PapillonAppearOut}\n      style={[styles.container, { width: radius * 2, height: radius * 2 }]}\n      key={`circular-progress-${radius}`}\n    >\n      <Svg width={radius * 2} height={radius * 2}>\n        <Circle\n          cx={radius}\n          cy={radius}\n          r={innerRadius}\n          stroke={backgroundColor}\n          strokeWidth={strokeWidth}\n          fill=\"transparent\"\n        />\n        <AnimatedCircle\n          rotation={-90}\n          origin={`${radius}, ${radius}`}\n          cx={radius}\n          cy={radius}\n          r={innerRadius}\n          stroke={fill}\n          strokeWidth={strokeWidth}\n          strokeLinecap=\"round\"\n          strokeDasharray={`${circumference}, ${circumference}`}\n          animatedProps={animatedProps}\n          fill=\"transparent\"\n        />\n      </Svg>\n    </Animated.View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n});\n\nexport { CircularProgress };"
  },
  {
    "path": "ui/components/CompactGrade.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport { t } from \"i18next\";\nimport { Platform, Text, View } from \"react-native\";\n\nimport SkeletonView from \"@/ui/components/SkeletonView\";\nimport adjust from \"@/utils/adjustColor\";\nimport i18n from \"@/utils/i18n\";\n\nimport AnimatedPressable from \"./AnimatedPressable\";\nimport Stack from \"./Stack\";\nimport Typography from \"./Typography\";\n\ninterface CompactGradeProps {\n  emoji: string;\n  title: string;\n  description: string;\n  score: number;\n  outOf: number;\n  date: Date;\n  disabled?: boolean;\n  status?: string;\n  onPress?: () => void,\n  hasMaxScore?: boolean,\n  color?: string;\n  variant?: \"normal\" | \"home\";\n  skeleton?: boolean;\n}\n\nexport const CompactGrade = ({\n  emoji,\n  title,\n  description,\n  score,\n  outOf,\n  date,\n  disabled,\n  status,\n  onPress,\n  hasMaxScore,\n  variant,\n  color = \"#888888\",\n  skeleton = false,\n}: CompactGradeProps) => {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const trailingBase = adjust(color, theme.dark ? 0.2 : -0.4);\n  const trailingBackground = hasMaxScore ? trailingBase : trailingBase + \"15\";\n  const trailingForeground = hasMaxScore ? \"#FFFFFF\" : trailingBase;\n\n  return (\n    <AnimatedPressable\n      onPress={onPress}\n      style={{\n        width: 210,\n        height: 140,\n        borderRadius: 24,\n        borderCurve: \"continuous\",\n        borderColor: adjust(color, theme.dark ? 0.7 : -0.7) + \"28\",\n        backgroundColor: Platform.OS !== 'android' ? colors.card : adjust(color, theme.dark ? 0.5 : -0.5) + \"18\",\n        borderWidth: Platform.OS !== 'android' ? 1 : 0,\n        shadowColor: '#000',\n        shadowOffset: { width: 0, height: 0 },\n        shadowOpacity: 0.1,\n        shadowRadius: 3\n      }}\n    >\n      {Platform.OS !== 'android' && (\n        <LinearGradient\n          colors={[color + \"10\", color + \"00\"]}\n          locations={[0, 1]}\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            borderRadius: 24,\n          }}\n        />\n      )}\n\n      <View\n        style={{\n          flexDirection: \"row\",\n          alignItems: \"center\",\n          justifyContent: variant === \"home\" ? \"space-between\" : \"flex-start\",\n          gap: 8,\n          paddingHorizontal: 12,\n          paddingVertical: 10,\n        }}\n      >\n        <View\n          style={[\n            variant === \"home\" && {\n              padding: 7,\n              paddingTop: 10,\n              borderRadius: 80,\n            },\n          ]}\n        >\n          {skeleton ? (\n            <SkeletonView style={{ width: 25, height: 25, borderRadius: 100 }} />\n          ) : (\n            <Stack width={28} height={28} card hAlign='center' vAlign='center' radius={32} backgroundColor={color + \"22\"}>\n              <Text style={{ fontSize: 15 }}>\n                {emoji}\n              </Text>\n            </Stack>\n          )}\n\n        </View>\n        {title &&\n          <Typography variant=\"body1\" color={variant === \"home\" ? colors.text : adjust(color, theme.dark ? 0.2 : -0.4)} style={{ flex: 1 }} nowrap weight=\"semibold\" skeleton={skeleton} skeletonWidth={80}>\n            {capitalizeWords(title)}\n          </Typography>\n        }\n        {date &&\n          <Typography variant=\"body1\" color={variant === \"home\" ? \"secondary\" : adjust(color, theme.dark ? 0.2 : -0.4)} nowrap skeleton={skeleton}>\n            {date.toLocaleDateString(i18n.language, {\n              day: \"2-digit\",\n              month: \"short\",\n            })}\n          </Typography>\n        }\n      </View>\n      <View\n        style={{\n          paddingHorizontal: 12,\n          paddingVertical: 2,\n          paddingBottom: 12,\n          flexDirection: \"column\",\n          gap: 8,\n          flex: 1,\n          justifyContent: \"space-between\",\n          alignItems: \"flex-start\",\n        }}\n      >\n        <Typography variant=\"navigation\" color=\"text\" style={{ lineHeight: 20 }} numberOfLines={2} skeleton={skeleton} skeletonWidth={150} skeletonLines={2}>\n          {description ? description : t('Grade_NoDescription', { subject: title })}\n        </Typography>\n\n        <Stack noShadow direction='horizontal' gap={2} card hAlign='end' vAlign='end' padding={[9, 3]} radius={32} backgroundColor={trailingBackground} >\n          {disabled ? (\n            <>\n              <Typography color={trailingForeground} variant='navigation'>\n                {status}\n              </Typography>\n            </>\n          ) : (\n            <>\n              <Typography color={trailingForeground} variant='navigation'>\n                {score.toFixed(2)}\n              </Typography>\n            </>\n          )}\n          <Typography color={trailingForeground + \"99\"} variant='body2'>\n            /{outOf}\n          </Typography>\n\n          {hasMaxScore && (\n            <Papicons style={{ marginBottom: 3.5, marginLeft: 2 }} name=\"crown\" color={trailingForeground} size={18} />\n          )}\n        </Stack>\n      </View>\n    </AnimatedPressable>\n  );\n};\n\nconst capitalizeWords = (str: string) => {\n  return str\n    .toLowerCase()\n    .split(\" \")\n    .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n    .join(\" \");\n};"
  },
  {
    "path": "ui/components/CompactTask.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport Stack from \"./Stack\";\nimport Icon from \"./Icon\";\nimport { Sparkle } from \"lucide-react-native\";\nimport Typography from \"./Typography\";\nimport AnimatedPressable from \"./AnimatedPressable\";\nimport { View } from \"react-native\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport { formatHTML } from \"@/utils/format/html\";\nimport i18n from \"@/utils/i18n\";\n\nfunction CompactTask({ fromCache, setHomeworkAsDone, ref, subject, color, description, emoji, dueDate, done, magic }: { fromCache: boolean, setHomeworkAsDone: (ref: Homework) => void, ref: Homework, subject: string, color: string, description: string, emoji: string, dueDate: Date, done: boolean, magic?: string }) {\n  const { colors } = useTheme();\n\n  return (\n    <Stack\n      style={{\n        backgroundColor: color + 50,\n        borderRadius: 20,\n        width: \"100%\",\n        flex: 1,\n        overflow: \"hidden\",\n        borderWidth: 1,\n        borderColor: colors.border\n      }}\n    >\n      {magic && (\n        <Stack gap={10} direction=\"horizontal\" hAlign=\"center\" style={{ paddingHorizontal: 16, paddingTop: 6 }}>\n          <Icon size={14} skeleton={false}>\n            <Sparkle fill={color} stroke={color} strokeWidth={2} />\n          </Icon>\n          <Typography color={color} weight='semibold' skeleton={false} skeletonWidth={200}>\n            {magic}\n          </Typography>\n        </Stack>\n      )}\n\n      <Stack\n        direction=\"horizontal\"\n        vAlign=\"center\"\n        hAlign=\"center\"\n        gap={16}\n        padding={[16, 12]}\n        style={{ backgroundColor: colors.card, borderTopRightRadius: magic ? 7.5 : undefined, borderTopLeftRadius: magic ? 7.5 : undefined }}\n      >\n        <Stack\n          style={{\n            backgroundColor: color + \"70\",\n            width: 30,\n            height: 30,\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            borderRadius: 80,\n          }}\n        >\n          <Typography>{emoji}</Typography>\n        </Stack>\n\n        <Stack style={{ flex: 1 }} gap={2}>\n          <Typography variant=\"body2\">{subject}</Typography>\n          <Typography variant=\"body2\" color={colors.text + \"95\"} numberOfLines={2}>{formatHTML(description)}</Typography>\n          <Typography variant=\"caption\" color=\"secondary\">\n            {dueDate.toLocaleDateString(i18n.language, { day: \"2-digit\", month: \"2-digit\" })}\n          </Typography>\n        </Stack>\n\n        <AnimatedPressable\n          scaleTo={0.8}\n          style={{\n            width: 24,\n            height: 24,\n            borderWidth: 2,\n            borderColor: done ? color : colors.border,\n            borderRadius: 80,\n            padding: 1.3,\n            justifyContent: \"center\",\n            alignItems: \"center\"\n          }}\n          disabled={fromCache}\n          onPress={() => {\n            setHomeworkAsDone(ref)\n          }}\n        >\n          {done && (\n            <View\n              style={{\n                backgroundColor: color,\n                width: 24,\n                height: 24,\n                borderRadius: 80,\n                alignItems: \"center\",\n                justifyContent: \"center\"\n              }}\n            >\n              <Papicons size={13} name=\"Check\" fill={\"white\"} />\n            </View>\n          )}\n        </AnimatedPressable>\n      </Stack>\n    </Stack>\n  )\n}\n\nexport default CompactTask;"
  },
  {
    "path": "ui/components/ContainedNumber.tsx",
    "content": "import React from 'react';\nimport { View } from 'react-native';\nimport Typography from './Typography';\nimport { useTheme } from '@react-navigation/native';\n\ninterface ContainedNumberProps {\n  children?: React.ReactNode;\n  denominator?: string;\n  color?: string;\n}\n\nconst ContainedNumber: React.FC<ContainedNumberProps> = ({ denominator, color, children, ...rest }) => {\n  const theme = useTheme();\n  const finalColor = color || theme.colors.tint;\n\n  return (\n    <View\n      style={{\n        backgroundColor: finalColor + '26',\n        borderRadius: 80,\n        borderCurve: 'continuous',\n        paddingHorizontal: 10,\n        paddingVertical: 1,\n        gap: 2,\n        flexDirection: 'row',\n        alignItems: 'flex-end',\n        borderColor: finalColor + '46',\n        borderWidth: 0,\n        minWidth: 50,\n        justifyContent: \"center\"\n      }}\n    >\n      {children && (\n        <Typography variant='h5' color={finalColor}>\n          {children}\n        </Typography>\n      )}\n      {denominator && (\n        <Typography variant='body2' color={finalColor + \"a6\"} style={{ marginBottom: 3 }}>\n          {denominator}\n        </Typography>\n      )}\n    </View>\n  );\n};\n\nexport default ContainedNumber;\n"
  },
  {
    "path": "ui/components/Course.tsx",
    "content": "import { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport { LucideIcon } from \"lucide-react-native\";\nimport React, { useCallback, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Platform, StyleProp, StyleSheet, View, ViewStyle } from \"react-native\";\n\nimport adjust from \"@/utils/adjustColor\";\nimport i18n from \"@/utils/i18n\";\n\nimport { formatDuration } from \"../utils/Duration\";\nimport AnimatedPressable from \"./AnimatedPressable\";\nimport Icon from \"./Icon\";\nimport Stack from \"./Stack\";\nimport Typography from \"./Typography\";\nimport { ListTouchable } from \"../new/List\";\n\ntype Variant = \"primary\" | \"separator\";\n\ninterface CourseProps {\n  id: string;\n  name: string;\n  teacher?: string;\n  room?: string;\n  color?: string;\n  status?: {\n    canceled?: boolean;\n    label: string;\n  };\n  variant?: Variant;\n  start: number;\n  end: number;\n  compact?: boolean;\n  onPress?: () => void;\n  readonly?: boolean;\n  containerStyle?: StyleProp<ViewStyle>;\n  leading?: LucideIcon;\n  showTimes?: boolean;\n  timesRendered?: boolean;\n  magicInfo?: {\n    label: string;\n    icon: React.FC<{ color?: string }>;\n  };\n  skeleton?: boolean;\n}\n\n/**\n * Composant Course - Affiche une carte de cours\n * \n * @param id - Identifiant unique du cours\n * @param name - Nom du cours\n * @param teacher - Nom du professeur\n * @param room - Salle du cours\n * @param variant - \"primary\" pour un cours normal, \"separator\" pour une pause\n * @param color - Couleur principale du cours\n * @param status - Statut du cours (annulé, modifié, etc.)\n * @param start - Timestamp de début du cours\n * @param end - Timestamp de fin du cours\n * @param skeleton - Mode chargement avec animation\n * @param start - Timestamp de début du cours\n * @param end - Timestamp de fin du cours\n * @param skeleton - Mode chargement avec animation\n * @param compact - Version compacte avec moins de padding\n * @param showTimes - Affiche les horaires à gauche\n * @param timesRendered - Réserve l'espace des horaires même si non affichés\n * @param magicInfo - Affiche une info spéciale (ex: \"Examens\", \"Réunion\", etc.)\n * @param onPress - Fonction appelée au clic sur le cours\n * @param readonly - Désactive l'interaction au clic\n * @param leading - Icône personnalisée à gauche du nom du cours\n * @param containerStyle - Style personnalisé pour le conteneur principal\n */\nconst Course = React.memo((props: CourseProps) => {\n  const {\n    id: _id,\n    name,\n    teacher,\n    room,\n    color,\n    status,\n    variant = \"primary\",\n    start,\n    end,\n    compact,\n    readonly: _readonly = false,\n    leading: _Leading,\n    showTimes = true,\n    timesRendered = true,\n    magicInfo,\n    onPress,\n    containerStyle,\n    skeleton = false,\n  } = props;\n\n  const duration = end - start;\n  const { t } = useTranslation();\n  const { colors, dark } = useTheme();\n\n  const fStart = new Date(start * 1000);\n  const fEnd = new Date(end * 1000);\n  const hStart = fStart.getHours();\n\n  let textColor = adjust(color ?? \"#FFFFFF\", dark ? 0.1 : -0.15);\n  if (status?.canceled) { textColor = colors.text + \"80\"; }\n\n  /** Horaire */\n  const renderTimes = useCallback(() => (\n    timesRendered && (\n      <Stack\n        style={{\n          width: 60,\n          alignSelf: \"center\",\n          paddingRight: 2,\n          opacity: showTimes ? 1 : 0,\n        }}\n        hAlign=\"center\"\n        vAlign=\"center\"\n        gap={3}\n      >\n        <Typography nowrap variant=\"h5\" align=\"center\" style={{ lineHeight: 20, width: 60 }} skeleton={skeleton}>\n          {fStart.toLocaleTimeString(i18n.language, { hour: \"2-digit\", minute: \"2-digit\" })}\n        </Typography>\n        <Typography nowrap variant=\"body2\" color=\"secondary\" align=\"center\" style={{ width: 60 }} skeleton={skeleton}>\n          {fEnd.toLocaleTimeString(i18n.language, { hour: \"2-digit\", minute: \"2-digit\" })}\n        </Typography>\n      </Stack>\n    )\n  ), [fEnd, fStart, showTimes, skeleton, timesRendered]);\n\n  /** Séparateur */\n  const renderSeparator = useCallback(() => {\n    const [taps, setTaps] = useState(0);\n\n    const messageKeys = {\n      morning: [\n        \"Course_Separator_Morning_Default\",\n        \"Course_Separator_Morning_Alt_1\",\n        \"Course_Separator_Morning_Alt_2\"\n      ],\n      lunch: [\n        \"Course_Separator_Lunch_Default\",\n        \"Course_Separator_Lunch_Alt_1\",\n        \"Course_Separator_Lunch_Alt_2\"\n      ],\n      evening: [\n        \"Course_Separator_Evening_Default\",\n        \"Course_Separator_Evening_Alt_1\",\n        \"Course_Separator_Evening_Alt_2\"\n      ],\n      night: [\n        \"Course_Separator_Night_Default\",\n        \"Course_Separator_Night_Alt_1\",\n        \"Course_Separator_Night_Alt_2\"\n      ]\n    };\n\n    const increaseTaps = () => {\n      setTaps((prevTaps) => (prevTaps + 1) % 3);\n    };\n\n    let timeKey;\n    if (hStart < 11) {\n      timeKey = 'morning';\n    } else if (hStart < 14) {\n      timeKey = 'lunch';\n    } else if (hStart < 18) {\n      timeKey = 'evening';\n    } else {\n      timeKey = 'night';\n    }\n\n    const message = t(messageKeys[timeKey][taps]);\n\n    return (\n      <View\n        style={{\n          flex: 1,\n          overflow: Platform.OS === \"android\" ? \"hidden\" : \"visible\",\n          borderRadius: compact ? 18 : 25,\n          backgroundColor: colors.item,\n        }}\n      >\n      <ListTouchable\n        onPress={() => increaseTaps()}\n        style={{\n          flex: 1,\n        }}\n      >\n        <Stack\n          card\n          direction=\"horizontal\"\n          padding={[14, 8]}\n          radius={300}\n          vAlign=\"start\"\n          gap={8}\n          hAlign=\"center\"\n          style={{ flex: 1, backgroundColor: colors.item }}\n        >\n          <Icon papicon size={24} opacity={skeleton ? 0.1 : 0.6}>\n            {hStart < 11 ? <Papicons name=\"Sunrise\" /> : hStart < 14 ? <Papicons name=\"Cutlery\" /> : <Papicons name=\"Sun\" />}\n          </Icon>\n          <Typography variant=\"h6\" style={{ flex: 1, opacity: 0.6, color: colors.text }} nowrap skeleton={skeleton}>\n            {message}\n          </Typography>\n          <Typography variant=\"body1\" style={{ color: colors.text + \"80\" }} skeleton={skeleton}>\n            {formatDuration(duration)}\n          </Typography>\n        </Stack>\n      </ListTouchable>\n      </View>\n    )\n  }, [colors.card, colors.text, duration, hStart, skeleton]);\n\n  /** statut (cours annulé ou magicInfo) */\n  const renderStatus = useCallback(() => {\n    if (status?.canceled) {\n      return (\n        <Stack direction=\"horizontal\" hAlign=\"center\" style={{ paddingHorizontal: 15, paddingBottom: 5, paddingTop: 6 }} gap={6}>\n          <Icon papicon size={20} fill={skeleton ? colors.text + \"10\" : adjust(\"#DC1400\", dark ? 0.4 : -0.2)}>\n            <Papicons name=\"Ghost\" />\n          </Icon>\n          <Typography\n            nowrap\n            color={adjust(\"#DC1400\", dark ? 0.4 : -0.2)}\n            variant=\"h4\"\n            style={[styles.room, { flex: 1, paddingVertical: 0, opacity: skeleton ? 0.5 : 1 }]}\n            skeleton={skeleton}\n            numberOfLines={1}\n          >\n            {status.label}\n          </Typography>\n        </Stack>\n      );\n    }\n    if (magicInfo?.label) {\n      return (\n        <Stack direction=\"horizontal\" hAlign=\"center\" style={{ paddingHorizontal: 15, paddingBottom: 5, paddingTop: 6 }} gap={6}>\n          {magicInfo.icon && <magicInfo.icon color={skeleton ? colors.text + \"10\" : color} />}\n          <Typography\n            color=\"primary\"\n            variant=\"h4\"\n            style={[styles.room, { flex: 1, paddingVertical: 0, color, opacity: skeleton ? 0.5 : 1 }]}\n            nowrap\n            skeleton={skeleton}\n            numberOfLines={1}\n          >\n            {magicInfo.label}\n          </Typography>\n        </Stack>\n      );\n    }\n    return null;\n  }, [colors.text, dark, magicInfo, skeleton, status]);\n\n  /** Bloc contenu principal */\n  const renderContent = useCallback(() => (\n    <Stack\n      gap={2}\n      direction=\"vertical\"\n      radius={compact ? 18 : 25}\n      style={[\n        styles.container,\n        compact && styles.compactContainer,\n        {\n          borderWidth: Platform.OS === \"android\" ? 0 : 1,\n          borderColor: adjust(color, dark ? 0.7 : -0.7) + \"36\",\n        },\n        status?.canceled && { backgroundColor: colors.card },\n        skeleton && { backgroundColor: colors.text + \"05\" },\n        containerStyle && StyleSheet.flatten(containerStyle),\n      ]}\n    >\n      {color && !status?.canceled && Platform.OS !== \"android\" && (\n        <LinearGradient\n          colors={[adjust(color, dark ? -0.7 : 0.85), adjust(color, dark ? -0.8 : 0.6)]}\n          locations={[0, 1]}\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            borderRadius: compact ? 18 : 25,\n            opacity: 0.7,\n          }}\n        />\n      )}\n\n      {color && !status?.canceled && Platform.OS == \"android\" && (\n        <View\n          style={{\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            borderRadius: compact ? 18 : 25,\n            opacity: 1,\n            backgroundColor: adjust(color, dark ? -0.7 : 0.75),\n          }}\n        />\n      )}\n\n      <Stack direction=\"horizontal\" gap={10}>\n        {/* Barre colorée */}\n        <View style={{ width: 6, height: \"100%\", backgroundColor: textColor, borderRadius: 300 }} />\n        <Stack style={{ flex: 1, marginTop: -2, marginBottom: -3 }}>\n          {/* Nom du cours */}\n          <Typography\n            variant=\"h5\"\n            numberOfLines={compact ? 1 : 2}\n            style={[styles.label, { color: textColor, opacity: skeleton ? 0.5 : 1, width: '100%' }]}\n            skeleton={skeleton}\n          >\n            {name}\n          </Typography>\n\n          {/* Salle + Prof */}\n          {variant === \"primary\" && (\n            <Stack direction=\"horizontal\" style={{ marginTop: 1, opacity: skeleton ? 0.5 : 1 }}>\n              <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: 5, minWidth: 0 }}>\n                <Icon papicon size={20} fill={skeleton ? colors.text + \"20\" : textColor}>\n                  <Papicons name=\"MapPin\" />\n                </Icon>\n                <Typography numberOfLines={1} variant=\"body1\" style={[styles.room, { color: textColor }]} skeleton={skeleton}>\n                  {room || t(\"No_Course_Room\")}\n                </Typography>\n              </View>\n              <View style={[styles.separator, { backgroundColor: skeleton ? colors.text + \"20\" : textColor, marginHorizontal: 8 }]} />\n              <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: 5, flex: 1, minWidth: 0 }}>\n                <Icon papicon size={20} fill={skeleton ? colors.text + \"20\" : textColor}>\n                  <Papicons name=\"User\" />\n                </Icon>\n                <Typography\n                  numberOfLines={1}\n                  ellipsizeMode=\"tail\"\n                  variant=\"body1\"\n                  style={[styles.teacher, { color: textColor }]}\n                  skeleton={skeleton}\n                >\n                  {teacher}\n                </Typography>\n              </View>\n            </Stack>\n          )}\n\n          {/* Statut du cours */}\n          {status && !status.canceled && variant === \"primary\" && (\n            <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: 7, marginTop: status.label ? 4 : 0, opacity: skeleton ? 0.5 : 1 }}>\n              {status.label && (\n                <Stack\n                  radius={300}\n                  backgroundColor={skeleton ? colors.text + \"09\" : colors.background}\n                  style={[styles.statusLabelContainer, { flexShrink: 1, maxWidth: \"70%\" }]}\n                >\n                  <Typography\n                    variant=\"h4\"\n                    style={[styles.statusLabel, { color: textColor, padding: 0 }]}\n                    skeleton={skeleton}\n                    numberOfLines={1}\n                  >\n                    {status.label}\n                  </Typography>\n                </Stack>\n              )}\n              <Typography variant=\"h4\" style={[styles.statusDuration, { color: textColor + \"95\", flex: 1 }]} skeleton={skeleton}>\n                {formatDuration(duration)}\n              </Typography>\n            </View>\n          )}\n        </Stack>\n      </Stack>\n    </Stack>\n  ), [colors.border, colors.card, colors.text, compact, containerStyle, dark, duration, name, room, skeleton, status, textColor, t, teacher, variant, color]);\n\n  /** Cours principale */\n  const renderCourseCard = useCallback(() => (\n    <View style={{\n      flex: 1,\n      overflow: Platform.OS === \"android\" ? \"hidden\" : \"visible\",\n      borderRadius: compact ? 18 : 25,\n      shadowColor: \"#000\",\n      shadowOffset: { width: 0, height: 1 },\n      shadowOpacity: 0.1,\n      backgroundColor: colors.card,\n      elevation: 0,\n    }}>\n      <ListTouchable onPress={onPress} style={{ flex: 1, overflow: \"hidden\" }}>\n        <View\n          style={{\n            flex: 1,\n            borderRadius: compact ? 18 : 25\n          }}\n        >\n          <View\n            style={[\n              { flex: 1, borderRadius: compact ? 18 : 25, overflow: \"hidden\" },\n              status?.canceled && { backgroundColor: adjust(\"#DC1400\", dark ? -0.7 : 0.8), borderWidth: 0.2, borderColor: colors.border },\n              magicInfo && { borderWidth: 1, borderColor: colors.border, backgroundColor: adjust(color ?? \"#FFFFFF\", 0.8) },\n              skeleton && { backgroundColor: \"#00000005\" },\n            ]}\n          >\n            {renderStatus()}\n            {renderContent()}\n          </View>\n        </View>\n      </ListTouchable>\n    </View>\n  ), [color, compact, dark, onPress, renderContent, renderStatus, skeleton, status, colors.border]);\n\n  return (\n    <View style={{ flexDirection: \"row\", gap: 12, width: \"100%\", marginBottom: 6 }}>\n      {renderTimes()}\n      {variant === \"separator\" ? renderSeparator() : renderCourseCard()}\n    </View>\n  );\n});\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    paddingHorizontal: 14,\n    paddingVertical: 14,\n  },\n  compactContainer: {\n    paddingHorizontal: 12,\n    paddingVertical: 12,\n  },\n  label: {\n    flex: 1,\n    fontFamily: \"bold\",\n    lineHeight: 24,\n  },\n  room: {\n    fontSize: 16,\n    fontFamily: \"semibold\",\n  },\n  teacher: {\n    fontSize: 15,\n    fontFamily: \"semibold\",\n    flexShrink: 1,\n    flexGrow: 1,\n    minWidth: 0,\n  },\n  separator: {\n    width: 2,\n    height: 20,\n    alignSelf: \"center\",\n    borderRadius: 50,\n    opacity: 0.5,\n    backgroundColor: \"#000\",\n  },\n  statusLabel: {\n    fontSize: 15,\n  },\n  statusLabelContainer: {\n    paddingHorizontal: 8,\n    flexShrink: 1,\n    width: \"auto\",\n  },\n  statusDuration: {\n    fontSize: 15,\n    color: \"#FFFFFF80\",\n  },\n});\n\nCourse.displayName = \"Course\";\nexport default Course;\n"
  },
  {
    "path": "ui/components/Dynamic.tsx",
    "content": "import React, { useMemo } from \"react\";\nimport Reanimated, { EntryExitAnimationFunction, LayoutAnimation, LinearTransition } from \"react-native-reanimated\";\n\nimport { Animation } from \"../utils/Animation\";\nimport { PapillonAppearIn, PapillonAppearOut } from \"../utils/Transition\";\n\ntype DynamicProps = {\n  children?: React.ReactNode;\n  animated?: boolean;\n  style?: React.CSSProperties;\n  origin?: \"left\" | \"right\" | \"top\" | \"bottom\" | \"center\";\n  layout?: LayoutAnimation;\n  entering?: EntryExitAnimationFunction;\n  exiting?: EntryExitAnimationFunction;\n  key?: string;\n};\n\n// Pre-compute animations to avoid function calls on every render\nconst APPEAR_IN = PapillonAppearIn;\nconst APPEAR_OUT = PapillonAppearOut;\n\n// Pre-compute animated layout to avoid conditional computation\nconst ANIMATED_LAYOUT = Animation(LinearTransition, \"smooth\");\n\n// Base style object to avoid recreation\nconst BASE_STYLE = { flexDirection: \"row\" as const };\n\nexport const Dynamic = React.memo<DynamicProps>(({\n  children,\n  animated,\n  style,\n  origin = \"center\",\n  layout = ANIMATED_LAYOUT,\n  entering = APPEAR_IN,\n  exiting = APPEAR_OUT,\n  ...rest\n}) => {\n  // Memoize the computed style to prevent object recreation\n  const computedStyle = useMemo(() => {\n    if (!style) {\n      return {\n        ...BASE_STYLE,\n        transformOrigin: origin,\n      };\n    }\n\n    return {\n      ...BASE_STYLE,\n      ...style,\n      transformOrigin: origin,\n    };\n  }, [style, origin]);\n\n  // Memoize layout prop to avoid conditional evaluation on every render\n  const layoutProp = useMemo(() =>\n    animated ? layout && ANIMATED_LAYOUT : undefined,\n    [animated]\n  );\n\n  return (\n    <Reanimated.View\n      entering={animated ? entering : undefined}\n      exiting={animated ? exiting : undefined}\n      layout={animated && (layout ?? layoutProp)}\n      // @ts-expect-error - Reanimated types are not fully compatible with React Native types\n      style={computedStyle}\n      {...rest}\n    >\n      {children}\n    </Reanimated.View>\n  );\n});"
  },
  {
    "path": "ui/components/EmptyItem.tsx",
    "content": "import { Papicons } from '@getpapillon/papicons';\nimport React, { memo } from 'react';\n\nimport { Dynamic } from \"@/ui/components/Dynamic\";\nimport Icon from \"@/ui/components/Icon\";\nimport Stack from \"@/ui/components/Stack\";\nimport Typography from \"@/ui/components/Typography\";\n\nexport const EmptyItem = memo(({ icon, title, description, margin = 16 }: { icon: string; title: string; description: string; margin?: number }) => (\n  <Dynamic key={'empty-list:warn'}>\n    <Stack\n      hAlign=\"center\"\n      vAlign=\"center\"\n      margin={margin}\n    >\n      <Icon papicon opacity={0.5} size={32} style={{ marginBottom: 3 }}>\n        <Papicons name={icon} />\n      </Icon>\n      <Typography variant=\"h4\" color=\"text\" align=\"center\">\n        {title}\n      </Typography>\n      <Typography variant=\"body2\" color=\"secondary\" align=\"center\">\n        {description}\n      </Typography>\n    </Stack>\n  </Dynamic>\n));\n"
  },
  {
    "path": "ui/components/ErrorBoundary.tsx",
    "content": "import React from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport Typography from './Typography';\n\ninterface Props {\n  children: React.ReactNode;\n  fallback?: React.ReactNode;\n}\n\ninterface State {\n  hasError: boolean;\n}\n\nexport class ErrorBoundary extends React.Component<Props, State> {\n  constructor(props: Props) {\n    super(props);\n    this.state = { hasError: false };\n  }\n\n  static getDerivedStateFromError(_: Error): State {\n    return { hasError: true };\n  }\n\n  componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n    console.error('ErrorBoundary caught an error:', error, errorInfo);\n  }\n\n  render() {\n    if (this.state.hasError) {\n      if (this.props.fallback) {\n        return this.props.fallback;\n      }\n\n      return (\n        <View style={styles.container}>\n          <Typography variant='title'>Quelque chose s'est mal passé.</Typography>\n          <Typography variant='body1' style={{ opacity: 0.5 }}>Veuillez réessayer plus tard.</Typography>\n        </View>\n      );\n    }\n\n    return this.props.children;\n  }\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    padding: 12,\n    alignItems: 'center',\n    justifyContent: 'center',\n    backgroundColor: '#FF000011',\n    borderRadius: 12,\n    borderCurve: 'continuous',\n  },\n});\n"
  },
  {
    "path": "ui/components/Grade.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport React, { useMemo, useState } from \"react\";\nimport { Pressable, StyleSheet, View } from \"react-native\";\nimport Reanimated, { Easing, LinearTransition } from \"react-native-reanimated\";\n\nimport Stack from \"./Stack\";\nimport Typography from \"./Typography\";\nimport i18n from \"@/utils/i18n\";\n\nconst ListGradesLayoutTransition = LinearTransition.easing(Easing.inOut(Easing.circle)).duration(300);\n\n\nexport interface GradeProps {\n  isFirst?: boolean;\n  isLast?: boolean;\n  title: string;\n  date: number;\n  score: number;\n  outOf: number;\n  disabled?: boolean;\n  status?: string;\n  color?: string; // Optional color prop for custom styling\n  onPress?: () => void;\n  skeleton?: boolean;\n}\n\nconst Grade: React.FC<GradeProps> = React.memo(\n  ({ isFirst, isLast, title, date, score, outOf, color, disabled, status, onPress, skeleton = false }) => {\n    const theme = useTheme();\n    const { colors } = theme;\n\n    const formattedDate = useMemo(\n      () => new Date(date).toLocaleDateString(i18n.language, {\n        day: \"2-digit\",\n        month: \"long\",\n        year: \"numeric\",\n      }),\n      [date],\n    );\n    const formattedScore = useMemo(() => score.toFixed(2), [score]);\n\n    const styles = useMemo(\n      () =>\n        StyleSheet.create({\n          container: {\n            padding: 10,\n            borderWidth: 1,\n            backgroundColor: colors.card,\n            borderColor: colors.border,\n            borderTopWidth: 0,\n            shadowColor: \"rgba(0,0,0,0.1)\",\n            shadowOffset: { width: 0, height: 1 },\n            shadowRadius: 3,\n            shadowOpacity: 1,\n            elevation: 1,\n            borderCurve: \"continuous\",\n          },\n          lastItem: {\n            marginBottom: 16,\n            borderBottomLeftRadius: 22,\n            borderBottomRightRadius: 22,\n          },\n          firstItem: {\n            borderTopLeftRadius: 22,\n            borderTopRightRadius: 22,\n          },\n          stackPadding: {\n            paddingHorizontal: 4,\n          },\n          flexContainer: {\n            flex: 1,\n          },\n        }),\n      [colors],\n    );\n\n    const [isPressed, setIsPressed] = useState(false);\n\n    return (\n      <Reanimated.View\n        layout={ListGradesLayoutTransition}\n      >\n        <Pressable\n          onPress={onPress}\n          onPressIn={() => setIsPressed(true)}\n          onPressOut={() => setIsPressed(false)}\n        >\n          <Reanimated.View\n            style={[styles.container, isLast && styles.lastItem, isFirst && styles.firstItem]}\n          >\n            {isPressed && (\n              <View\n                style={{\n                  position: \"absolute\",\n                  top: 0,\n                  left: 0,\n                  right: 0,\n                  bottom: 0,\n                  backgroundColor: \"#00000020\",\n                  zIndex: 1,\n                  borderTopLeftRadius: isFirst ? 22 : 0,\n                  borderTopRightRadius: isFirst ? 22 : 0,\n                  borderBottomLeftRadius: isLast ? 22 : 0,\n                  borderBottomRightRadius: isLast ? 22 : 0,\n                }}\n              />\n            )}\n\n            <Stack\n              direction=\"horizontal\"\n              hAlign=\"center\"\n              vAlign=\"center\"\n              style={styles.stackPadding}\n            >\n              <Stack inline\n                style={styles.flexContainer}\n                gap={0}\n              >\n                <Typography\n                  variant=\"title\"\n                  skeleton={skeleton}\n                  skeletonWidth={150}\n                  numberOfLines={2}\n                  style={{ lineHeight: 20 }}\n                >\n                  {title}\n                </Typography>\n                <Typography\n                  variant=\"body2\"\n                  color=\"secondary\"\n                  inline\n                  style={{ marginTop: skeleton ? 0 : 2, marginBottom: skeleton ? 0 : 2 }}\n                  skeleton={skeleton}\n                  skeletonWidth={100}\n                  nowrap\n                >\n                  {formattedDate}\n                </Typography>\n              </Stack>\n              <Stack\n                direction=\"horizontal\"\n                hAlign=\"end\"\n                vAlign=\"end\"\n                inline\n                gap={1}\n                backgroundColor={color + \"33\"}\n                style={{\n                  marginTop: 2,\n                  paddingHorizontal: 10,\n                  paddingVertical: 0,\n                  borderRadius: 20,\n                }}\n              >\n                {skeleton ? (\n                  <Typography\n                    variant=\"h5\"\n                    skeleton\n                  />\n                ) : (\n                  <>\n                    <Typography\n                      variant=\"h5\"\n                      color={color}\n                    >\n                      {disabled ? status : formattedScore}\n                    </Typography>\n                    <Typography\n                      variant=\"caption\"\n                      color={color}\n                      style={{ marginBottom: 4 }}\n                    >\n                      /{outOf}\n                    </Typography>\n                  </>\n                )}\n              </Stack>\n            </Stack>\n          </Reanimated.View>\n        </Pressable>\n      </Reanimated.View>\n    );\n  },\n);\n\nexport default Grade;"
  },
  {
    "path": "ui/components/Icon.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport React, { useMemo } from \"react\";\nimport { View, ViewProps } from \"react-native\";\n\nimport { LEADING_TYPE } from \"./Item\";\nimport SkeletonView from \"@/ui/components/SkeletonView\";\n\ninterface IconProps extends ViewProps {\n  children?: React.ReactNode;\n  color?: string;\n  opacity?: number;\n  size?: number;\n  papicon?: boolean;\n  fill?: string;\n  skeleton?: boolean;\n}\n\n// Pre-computed frozen style objects for maximum performance\nconst COLORED_ICON_STYLE = Object.freeze({\n  padding: 4,\n  borderRadius: 8,\n  borderCurve: \"continuous\" as const,\n  marginRight: -4,\n});\n\nconst EMPTY_STYLE = Object.freeze({});\n\n// Color cache to avoid repeated computations\nconst colorCache = new Map<string, { backgroundColor: string; childColor: string }>();\nconst WHITE_COLOR = \"#ffffff\";\n\n// Optimized child enhancement function using direct array operations\nconst enhanceChildrenOptimized = (\n  children: React.ReactNode,\n  childColor: string,\n  size: number,\n  papicon?: boolean,\n  fill?: string\n): React.ReactNode => {\n  if (!children) { return children; }\n\n  // Helper to merge width/height/size\n  const injectProps = (child: React.ReactElement<any>) => {\n    const childProps = child.props;\n    // Don't override explicit color/width/height/size\n    const injected: any = {};\n    const effectiveColor = fill !== undefined ? fill : childColor;\n    if (papicon) {\n      if (childProps.fill === undefined) injected.fill = effectiveColor;\n    } else {\n      if (childProps.color === undefined) injected.color = effectiveColor;\n    }\n    if (childProps.size === undefined) injected.size = size;\n    if (childProps.width === undefined) injected.width = size;\n    if (childProps.height === undefined) injected.height = size;\n    return Object.keys(injected).length > 0 ? React.cloneElement(child, injected) : child;\n  };\n\n  // Fast path for single child (most common case)\n  if (React.isValidElement(children)) {\n    return injectProps(children as React.ReactElement<any>);\n  }\n  // Batch processing for multiple children\n  return React.Children.map(children, (child) => {\n    if (React.isValidElement(child)) {\n      return injectProps(child as React.ReactElement<any>);\n    }\n    return child;\n  });\n};\n\nconst Icon = React.memo<IconProps>(({\n  children,\n  color,\n  opacity,\n  style,\n  size = 24,\n  papicon,\n  fill,\n  skeleton = false,\n  ...rest\n}) => {\n  const { colors } = useTheme();\n\n  if (skeleton)\n    return <SkeletonView\n      style={{\n        width: size,\n        height: size,\n        borderRadius: size * 0.5,\n      }}\n    />\n\n  // Ultra-fast memoization with optimized dependencies\n  const { containerStyle, childColor, enhancedChildren } = useMemo(() => {\n    const hasColor = Boolean(color);\n    const currentChildColor = hasColor ? WHITE_COLOR : colors.text;\n\n    // Use cache for color computations\n    let colorData = colorCache.get(`${color || 'none'}-${colors.text}`);\n    if (!colorData) {\n      colorData = {\n        backgroundColor: color || '',\n        childColor: currentChildColor\n      };\n      // Limit cache size to prevent memory leaks\n      if (colorCache.size > 100) {\n        const firstKey = colorCache.keys().next().value;\n        if (firstKey) {\n          colorCache.delete(firstKey);\n        }\n      }\n      colorCache.set(`${color || 'none'}-${colors.text}`, colorData);\n    }\n\n    // Add opacity to the container style if provided\n    const opacityStyle = opacity !== undefined ? { opacity } : {};\n    return {\n      containerStyle: hasColor\n        ? [COLORED_ICON_STYLE, { backgroundColor: colorData.backgroundColor }, opacityStyle, style]\n        : [EMPTY_STYLE, opacityStyle, style],\n      childColor: colorData.childColor,\n      enhancedChildren: enhanceChildrenOptimized(children, colorData.childColor, size, papicon, fill)\n    };\n  }, [children, color, colors.text, style, size, opacity, papicon, fill]);\n\n  return (\n    <View\n      {...rest}\n      style={containerStyle}\n    >\n      {enhancedChildren}\n    </View>\n  );\n}, (prevProps, nextProps) => {\n  // Custom comparison function for extreme performance\n  return (\n    prevProps.children === nextProps.children &&\n    prevProps.color === nextProps.color &&\n    prevProps.style === nextProps.style &&\n    prevProps.size === nextProps.size &&\n    prevProps.opacity === nextProps.opacity &&\n    prevProps.papicon === nextProps.papicon &&\n    prevProps.fill === nextProps.fill\n  );\n});\n\nIcon.displayName = 'Icon';\n\n// Ajouter le symbol au composant pour qu'il soit reconnu comme Leading\n(Icon as any).__ITEM_TYPE__ = LEADING_TYPE;\n\nexport default Icon;"
  },
  {
    "path": "ui/components/Item.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport React, { useCallback, useMemo, useRef } from \"react\";\nimport { Pressable, PressableProps, View } from \"react-native\";\nimport Reanimated, { Easing, LinearTransition, runOnJS, useAnimatedStyle, useSharedValue, withSpring, withTiming } from \"react-native-reanimated\";\n\nimport { Animation } from \"../utils/Animation\";\nimport { PapillonAppearIn, PapillonAppearOut } from \"../utils/Transition\";\n\nconst AnimatedPressable = Reanimated.createAnimatedComponent(Pressable);\nconst LAYOUT_ANIMATION = Animation(LinearTransition, \"list\");\n\nexport const LEADING_TYPE = Symbol(\"Leading\");\nexport const TRAILING_TYPE = Symbol(\"Trailing\");\n\n// Pre-computed style objects to avoid recreation\nconst LEADING_STYLE = Object.freeze({ layout: LAYOUT_ANIMATION });\nconst TRAILING_STYLE = Object.freeze({ layout: LAYOUT_ANIMATION });\n\nfunction Leading({ children, ...rest }: PressableProps) {\n  return (\n    <View {...rest} layout={LAYOUT_ANIMATION}>\n      {children}\n    </View>\n  );\n}\n\nfunction Trailing({ children, ...rest }: PressableProps) {\n  return (\n    <View {...rest} layout={LAYOUT_ANIMATION}>\n      {children}\n    </View>\n  );\n}\n\n// Extreme optimization: Pre-create memoized components\nconst MemoizedLeading = React.memo(Leading);\nconst MemoizedTrailing = React.memo(Trailing);\n(MemoizedLeading as any).__ITEM_TYPE__ = LEADING_TYPE;\n(MemoizedTrailing as any).__ITEM_TYPE__ = TRAILING_TYPE;\n\n// Cache for theme-based border colors to avoid repeated calculations\nconst borderColorCache = new Map<string, string>();\n\ninterface ListProps extends PressableProps {\n  children?: React.ReactNode;\n  animate?: boolean;\n  contentContainerStyle?: PressableProps[\"style\"];\n  isLast?: boolean;\n  disablePadding?: boolean;\n}\n\nconst DEFAULT_CONTAINER_STYLE = Object.freeze({\n  flexDirection: \"row\" as const,\n  alignItems: \"center\" as const,\n  width: \"100%\" as const,\n  paddingVertical: 12,\n  paddingHorizontal: 16,\n  gap: 16,\n});\n\nconst DEFAULT_CONTENT_STYLE = Object.freeze({\n  flexDirection: \"column\" as const,\n  flex: 1,\n  gap: 2\n});\n\n// Optimized areEqual with early returns and minimal key checking\nfunction areEqual(prev: ListProps, next: ListProps) {\n  // Quick reference equality check\n  if (prev === next) { return true; }\n\n  // Check most likely to change props first\n  if (prev.isLast !== next.isLast) { return false; }\n  if (prev.animate !== next.animate) { return false; }\n  if (prev.onPress !== next.onPress) { return false; }\n  if (prev.onPressIn !== next.onPressIn) { return false; }\n  if (prev.onPressOut !== next.onPressOut) { return false; }\n  if (prev.style !== next.style) { return false; }\n  if (prev.contentContainerStyle !== next.contentContainerStyle) { return false; }\n\n  // Children comparison last (most expensive)\n  return prev.children === next.children;\n}\n\nconst ItemComponent = React.forwardRef<typeof Pressable, ListProps>(function ItemComponent(\n  {\n    children,\n    contentContainerStyle,\n    style,\n    animate,\n    onPressIn,\n    onPressOut,\n    isLast = false,\n    disablePadding = false,\n    ...rest\n  },\n  ref\n) {\n  const { colors } = useTheme();\n\n  // Single shared value for performance - combine scale and opacity into one animation\n  const animationValue = useSharedValue(0);\n  const isAnimatingRef = useRef(false);\n\n  // Pre-calculate if we have an onPress handler to avoid checks during animation\n  const hasOnPress = Boolean(rest.onPress);\n\n  const animatedStyle = useAnimatedStyle(() => {\n    const progress = animationValue.value;\n    return {\n      transform: [{ scale: 1 - progress * 0.03 }], // 0.97 when progress = 1\n      opacity: 1 - progress * 0.3, // 0.7 when progress = 1\n    };\n  }, []);\n\n  const handlePressIn = useCallback((event: any) => {\n    if (!hasOnPress) {\n      event?.preventDefault?.();\n      return;\n    }\n\n    // If animation is running, reset it before starting again\n    if (isAnimatingRef.current) {\n      animationValue.value = 0;\n    }\n    isAnimatingRef.current = true;\n    animationValue.value = withTiming(1, {\n      duration: 100,\n      easing: Easing.out(Easing.exp)\n    });\n\n    onPressIn?.(event);\n  }, [animationValue, hasOnPress, onPressIn]);\n\n  const setAnimatingFalse = () => { isAnimatingRef.current = false; };\n  const handlePressOut = useCallback((event: any) => {\n    // if (!isAnimatingRef.current) { return; }\n\n    animationValue.value = withSpring(0, {\n      mass: 1,\n      damping: 15,\n      stiffness: 300\n    }, () => {\n      'worklet';\n      runOnJS(setAnimatingFalse)();\n    });\n\n    onPressOut?.(event);\n  }, [animationValue, onPressOut]);\n\n  // Extremely optimized children sorting with minimal allocations\n  const sortedChildren = useMemo(() => {\n    if (!children) { return null; }\n\n    let leading: React.ReactNode[] | null = null;\n    let trailing: React.ReactNode[] | null = null;\n    let others: React.ReactNode[] | null = null;\n\n    React.Children.forEach(children, (child) => {\n      if (React.isValidElement(child)) {\n        const childType = (child.type as any)?.__ITEM_TYPE__;\n        if (childType === LEADING_TYPE) {\n          if (!leading) { leading = []; }\n          leading.push(child);\n        } else if (childType === TRAILING_TYPE) {\n          if (!trailing) { trailing = []; }\n          trailing.push(child);\n        } else {\n          if (!others) { others = []; }\n          others.push(child);\n        }\n      } else if (child != null) {\n        if (!others) { others = []; }\n        others.push(child);\n      }\n    });\n\n    return { leading, trailing, others };\n  }, [children]);\n\n  // Pre-compute border color with caching to avoid string concatenation\n  const borderColor = useMemo(() => {\n    const colorKey = colors.text;\n    let cached = borderColorCache.get(colorKey);\n    if (!cached) {\n      cached = `${colorKey}25`;\n      borderColorCache.set(colorKey, cached);\n    }\n    return cached;\n  }, [colors.text]);\n\n  // Optimized style calculations with minimal object creation\n  const borderStyle = useMemo(() =>\n    isLast ? null : {\n      borderBottomWidth: 0.5,\n      borderBottomColor: borderColor,\n    }\n    , [isLast, borderColor]);\n\n  const containerStyle = useMemo(() => {\n    const baseStyle = [DEFAULT_CONTAINER_STYLE, animatedStyle];\n\n    if (disablePadding) {\n      baseStyle.push({ paddingVertical: 0, paddingHorizontal: 0 } as any);\n    }\n\n    if (style) {\n      baseStyle.push(style as any);\n    }\n\n    return baseStyle;\n  }, [style, animatedStyle, disablePadding]);\n\n  const contentStyle = useMemo(() =>\n    contentContainerStyle ? [DEFAULT_CONTENT_STYLE, contentContainerStyle] : DEFAULT_CONTENT_STYLE\n    , [contentContainerStyle]);\n\n  // Early return if no children to render\n  if (!sortedChildren) {\n    return (\n      <Reanimated.View\n        layout={LAYOUT_ANIMATION}\n        style={borderStyle}\n        entering={animate ? PapillonAppearIn : undefined}\n        exiting={animate ? PapillonAppearOut : undefined}\n      >\n        <AnimatedPressable\n          {...rest}\n          ref={ref as any}\n          layout={LAYOUT_ANIMATION}\n          style={containerStyle}\n          onPressIn={handlePressIn}\n          onPressOut={handlePressOut}\n        />\n      </Reanimated.View>\n    );\n  }\n\n  try {\n    return (\n      <Reanimated.View\n        layout={LAYOUT_ANIMATION}\n        style={borderStyle}\n        entering={animate ? PapillonAppearIn : undefined}\n        exiting={animate ? PapillonAppearOut : undefined}\n      >\n        <AnimatedPressable\n          {...rest}\n          ref={ref as any}\n          layout={LAYOUT_ANIMATION}\n          style={containerStyle}\n          onPressIn={handlePressIn}\n          onPressOut={handlePressOut}\n        >\n          {sortedChildren.leading}\n          {sortedChildren.others && (\n            <Reanimated.View style={contentStyle as any}>\n              {sortedChildren.others}\n            </Reanimated.View>\n          )}\n          {sortedChildren.trailing}\n        </AnimatedPressable>\n      </Reanimated.View>\n    );\n  }\n  catch (e) {\n    return null;\n  }\n});\n\n// Ultra-optimized Item component with aggressive memoization\nconst Item = React.memo(ItemComponent, areEqual);\nItem.displayName = \"Item\";\n\n// Pre-export memoized components to avoid recreation\nexport default Item;\nexport { MemoizedLeading as Leading, MemoizedTrailing as Trailing };"
  },
  {
    "path": "ui/components/List.tsx",
    "content": "import { LegendList } from \"@legendapp/list\";\nimport { useTheme } from \"@react-navigation/native\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { StyleProp, ViewProps, ViewStyle } from \"react-native\";\nimport Reanimated, { EntryExitTransition, LinearTransition } from \"react-native-reanimated\";\n\nimport { Animation } from \"../utils/Animation\";\nimport Item from \"./Item\";\n\ninterface ListProps extends ViewProps {\n  data?: any[];\n  children?: React.ReactNode;\n  disablePadding?: boolean;\n  ignoreBorder?: boolean; // NEW: suppresses border bottom for all items\n  contentContainerStyle?: StyleProp<ViewStyle>;\n  animated?: boolean;\n  entering?: EntryExitTransition;\n  exiting?: EntryExitTransition;\n  radius?: number;\n  disableItemAnimation?: boolean;\n  marginBottom?: number;\n  __PERF_MONITOR__?: boolean;\n}\n\nconst LAYOUT_ANIMATION = Object.freeze(Animation(LinearTransition, \"list\"));\nconst BORDER_BOTTOM_WIDTH = 0.5;\nconst OPACITY_HEX = \"25\";\nconst ESTIMATED_ITEM_SIZE = 48;\nconst EMPTY_ARRAY = Object.freeze([]);\n\nconst VIRTUALIZATION_THRESHOLD = 20;\nconst MEMOIZATION_THRESHOLD = 10;\n\nconst BASE_CONTAINER_STYLE: ViewStyle = Object.freeze({\n  flex: 1,\n  width: \"100%\",\n  borderCurve: \"continuous\",\n  shadowColor: \"#000000\",\n  shadowOffset: { width: 0, height: 0 },\n  shadowOpacity: 0.10,\n  shadowRadius: 1.5,\n  elevation: 1,\n});\n\nconst BASE_ITEM_STYLE: ViewStyle = Object.freeze({\n  flex: 1,\n  width: \"100%\",\n});\n\nconst DEFAULT_PADDING: ViewStyle = Object.freeze({\n  paddingHorizontal: 16,\n  paddingVertical: 12,\n});\n\nconst hasPaddingStyle = (style: any): boolean => {\n  if (!style || typeof style !== \"object\") { return false; }\n  if (Array.isArray(style)) {\n    for (let i = 0; i < style.length; i++) {\n      if (hasPaddingStyle(style[i])) { return true; }\n    }\n    return false;\n  }\n  return !!(style.padding != null || style.paddingHorizontal != null || style.paddingVertical != null || style.paddingTop != null || style.paddingBottom != null || style.paddingLeft != null || style.paddingRight != null);\n};\n\nconst itemTypeCache = new WeakMap<any, boolean>();\nconst itemStringCache = new Map<string, boolean>();\nconst displayNameCache = new WeakMap<any, string>();\n\nconst isItemComponent = (element: React.ReactElement): boolean => {\n  const elementType = element.type as any;\n  if (itemTypeCache.has(elementType)) { return itemTypeCache.get(elementType)!; }\n\n  const typeName = elementType?.name || elementType?.displayName;\n  if (typeName && itemStringCache.has(typeName)) {\n    const result = itemStringCache.get(typeName)!;\n    itemTypeCache.set(elementType, result);\n    return result;\n  }\n\n  const displayName = elementType?.displayName;\n  const isItem = displayName === \"Item\" || elementType === Item;\n  itemTypeCache.set(elementType, isItem);\n  if (typeName) { itemStringCache.set(typeName, isItem); }\n  return isItem;\n};\n\ninterface ChildMeta {\n  readonly child: React.ReactNode;\n  readonly isValidElement: boolean;\n  readonly needsPadding: boolean;\n  readonly borderBottomWidth: number;\n  readonly key: React.Key;\n  readonly isItem: boolean;\n  readonly isLast: boolean;\n  readonly index: number;\n}\n\nconst processChildrenBatch = (\n  children: React.ReactNode[],\n  disablePadding: boolean,\n  ignoreBorder: boolean, // Added\n  startIndex: number = 0\n): ChildMeta[] => {\n  const count = children.length;\n  const result: ChildMeta[] = new Array(count);\n\n  for (let i = 0; i < count; i++) {\n    const child = children[i];\n    const index = startIndex + i;\n\n    if (!React.isValidElement(child)) {\n      result[i] = { child, isValidElement: false, needsPadding: false, borderBottomWidth: 0, key: index, isItem: false, isLast: false, index } as const;\n      continue;\n    }\n\n    const childProps = child.props as any;\n    const isItem = isItemComponent(child);\n    const needsPadding = !disablePadding && !childProps?.disableListPadding && !isItem && !hasPaddingStyle(childProps?.style);\n\n    // Updated Logic: Check ignoreBorder\n    const shouldHaveBorder = !ignoreBorder && !isItem && index < count - 1;\n\n    result[i] = {\n      child,\n      isValidElement: true,\n      needsPadding,\n      borderBottomWidth: shouldHaveBorder ? BORDER_BOTTOM_WIDTH : 0,\n      key: child.key ?? index,\n      isItem,\n      isLast: index === count - 1,\n      index,\n    } as const;\n  }\n  return result;\n};\n\nconst List: React.FC<ListProps> = React.memo(\n  ({\n    data,\n    children,\n    disablePadding = false,\n    ignoreBorder = false, // Destructured\n    style,\n    contentContainerStyle,\n    animated = true,\n    entering,\n    exiting,\n    radius = 20,\n    marginBottom = 12,\n    ...rest\n  }) => {\n    const { colors } = useTheme();\n\n    const containerStyle = useMemo(() => {\n      const baseStyle = {\n        ...BASE_CONTAINER_STYLE,\n        backgroundColor: colors.card,\n        borderColor: colors.border,\n        borderWidth: 0.5,\n        borderRadius: radius,\n        marginBottom: marginBottom,\n      };\n      return style ? [baseStyle, style] : baseStyle;\n    }, [colors.card, colors.border, style, radius, marginBottom]);\n\n    const borderBottomColor = useMemo(() => `${colors.text}${OPACITY_HEX}`, [colors.text]);\n\n    const mergedContentContainerStyle = useMemo(() => {\n      if (!contentContainerStyle) { return null; }\n      return Array.isArray(contentContainerStyle) ? contentContainerStyle.filter(Boolean) : [contentContainerStyle];\n    }, [contentContainerStyle]);\n\n    const childrenData: ChildMeta[] = useMemo(() => {\n      if (data) {\n        return data.map((item, index) => {\n          if (React.isValidElement(item)) {\n            const childProps = item.props as any;\n            const isItem = isItemComponent(item);\n            const needsPadding = !disablePadding && !childProps?.disableListPadding && !isItem && !hasPaddingStyle(childProps?.style);\n            const shouldHaveBorder = !ignoreBorder && !isItem && index < data.length - 1;\n\n            return {\n              child: item,\n              isValidElement: true,\n              needsPadding,\n              borderBottomWidth: shouldHaveBorder ? BORDER_BOTTOM_WIDTH : 0,\n              key: item.key ?? index,\n              isItem,\n              isLast: index === data.length - 1,\n              index,\n            } as const;\n          }\n          return { child: item, isValidElement: false, needsPadding: false, borderBottomWidth: 0, key: index, isItem: false, isLast: false, index } as const;\n        });\n      }\n      return processChildrenBatch(React.Children.toArray(children), disablePadding, ignoreBorder);\n    }, [data, children, disablePadding, ignoreBorder]);\n\n    const staticItemStyle = useMemo(() => [BASE_ITEM_STYLE, ...(mergedContentContainerStyle || EMPTY_ARRAY)].filter(Boolean), [mergedContentContainerStyle]);\n\n    const borderStyle = useMemo(() => Object.freeze({ borderBottomColor, borderBottomWidth: BORDER_BOTTOM_WIDTH }), [borderBottomColor]);\n    const paddingBorderStyle = useMemo(() => Object.freeze([...staticItemStyle, borderStyle, DEFAULT_PADDING]), [staticItemStyle, borderStyle]);\n    const paddingOnlyStyle = useMemo(() => Object.freeze([...staticItemStyle, DEFAULT_PADDING]), [staticItemStyle]);\n    const borderOnlyStyle = useMemo(() => Object.freeze([...staticItemStyle, borderStyle]), [staticItemStyle, borderStyle]);\n\n    const [lastVisibleIndex, setLastVisibleIndex] = useState<number | null>(null);\n\n    const onViewableItemsChanged = useCallback((info: { viewableItems: { index: number }[] }) => {\n      if (info?.viewableItems?.length > 0) {\n        setLastVisibleIndex(Math.max(...info.viewableItems.map(i => i.index ?? -1)));\n      }\n    }, []);\n\n    const renderItem = useCallback(\n      ({ item, index }: { item: ChildMeta; index: number }) => {\n        const isLastVisible = lastVisibleIndex === index;\n        if (!item.isValidElement) { return <React.Fragment key={item.key}>{item.child}</React.Fragment>; }\n\n        let itemStyle: any = staticItemStyle;\n        if (item.borderBottomWidth > 0 && item.needsPadding) { itemStyle = paddingBorderStyle; }\n        else if (item.needsPadding) { itemStyle = paddingOnlyStyle; }\n        else if (item.borderBottomWidth > 0) { itemStyle = borderOnlyStyle; }\n\n        const childElement = React.cloneElement(item.child as any, { isLastVisible, isLast: item.isLast });\n\n        return (\n          <Reanimated.View\n            key={item.key}\n            layout={rest.disableItemAnimation ? undefined : LAYOUT_ANIMATION}\n            style={itemStyle}\n          >\n            {childElement}\n          </Reanimated.View>\n        );\n      },\n      [staticItemStyle, paddingBorderStyle, paddingOnlyStyle, borderOnlyStyle, rest.disableItemAnimation, lastVisibleIndex]\n    );\n\n    const shouldUseVirtualization = useMemo(() => {\n      if (!data) { return false; }\n      return childrenData.length >= VIRTUALIZATION_THRESHOLD;\n    }, [data, childrenData.length]);\n\n    return (\n      <Reanimated.View\n        layout={animated ? LAYOUT_ANIMATION : undefined}\n        style={containerStyle}\n        entering={entering}\n        exiting={exiting}\n        {...rest}\n      >\n        {shouldUseVirtualization ? (\n          <LegendList\n            data={childrenData}\n            renderItem={renderItem}\n            keyExtractor={(item: ChildMeta) => String(item.key)}\n            estimatedItemSize={ESTIMATED_ITEM_SIZE}\n            onViewableItemsChanged={onViewableItemsChanged}\n          />\n        ) : (\n          childrenData.map(item => renderItem({ item, index: item.index }))\n        )}\n      </Reanimated.View>\n    );\n  },\n  (prev, next) => (\n    prev.data === next.data &&\n    prev.children === next.children &&\n    prev.disablePadding === next.disablePadding &&\n    prev.ignoreBorder === next.ignoreBorder && // Added to memo check\n    prev.style === next.style\n  )\n);\n\nList.displayName = \"List\";\nexport default List;"
  },
  {
    "path": "ui/components/NativeHeader.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport { useNavigation } from \"expo-router\";\nimport React, { useEffect, useRef } from \"react\";\nimport { Platform, Pressable, PressableProps, PressableStateCallbackType, StyleSheet, View, ViewProps } from \"react-native\";\nimport Reanimated, { LayoutAnimationConfig, LinearTransition, useAnimatedStyle, useSharedValue, withTiming } from \"react-native-reanimated\";\n\nimport { runsIOS26 } from \"../utils/IsLiquidGlass\";\nimport Typography from \"./Typography\";\nimport AnimatedNumber from \"./AnimatedNumber\";\nimport adjust from \"@/utils/adjustColor\";\nconst AnimatedPressable = Reanimated.createAnimatedComponent(Pressable);\n\n// Pre-computed styles for maximum performance\nconst styles = StyleSheet.create({\n  side: {\n    height: 36,\n    minWidth: 36,\n    alignSelf: \"center\",\n    flexShrink: 1,\n    flexDirection: \"row\",\n    gap: 8,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  title: {\n    height: 36,\n    width: \"100%\",\n    flexDirection: \"row\",\n    gap: 4,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  titleAndroid: {\n    alignItems: \"center\",\n    justifyContent: \"flex-start\",\n    maxWidth: 300,\n  },\n  pressable: {\n    height: 42,\n    minWidth: 36,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    flexDirection: \"row\",\n    gap: 4,\n  },\n  highlight: {\n    borderRadius: 10,\n    borderCurve: \"continuous\",\n    paddingHorizontal: 6,\n    marginHorizontal: 2,\n    paddingVertical: 2,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    flexShrink: 0,\n    overflow: \"hidden\",\n  },\n});\n\n// Pre-computed style arrays to avoid array creation on every render\nconst PRESSABLE_STYLE_CACHE = new WeakMap();\nconst getPressableStyle = (userStyle: any) => {\n  if (!userStyle) { return styles.pressable; }\n  if (PRESSABLE_STYLE_CACHE.has(userStyle)) {\n    return PRESSABLE_STYLE_CACHE.get(userStyle);\n  }\n  const combined = [styles.pressable, userStyle];\n  PRESSABLE_STYLE_CACHE.set(userStyle, combined);\n  return combined;\n};\n\n// Pre-computed color cache to avoid string concatenation\nconst COLOR_CACHE = new Map();\nconst getBackgroundColor = (color: string) => {\n  if (COLOR_CACHE.has(color)) {\n    return COLOR_CACHE.get(color);\n  }\n  const bgColor = color + \"22\";\n  COLOR_CACHE.set(color, bgColor);\n  return bgColor;\n};\n\n// Default color constant\nconst DEFAULT_COLOR = \"29947A\";\nconst DEFAULT_BACKGROUND_COLOR = getBackgroundColor(DEFAULT_COLOR);\n\ninterface NativeSideProps extends ViewProps {\n  children?: React.ReactNode;\n  side: 'Left' | 'Right';\n}\n\nconst NativeHeaderSide = React.memo(function NativeHeaderSide({ children, side, ...props }: NativeSideProps) {\n  const navigation = useNavigation();\n  const propsRef = useRef(props);\n  const childrenRef = useRef(children);\n  const theme = useTheme();\n\n  // Update refs without triggering re-renders\n  propsRef.current = props;\n  childrenRef.current = children;\n\n  useEffect(() => {\n    const headerKey = `header${side}`;\n    const renderComponent = () => (\n      <View style={[\n        styles.side,\n        Platform.OS === 'android' ? {\n          marginRight: side === 'Left' ? 16 : 0,\n          marginLeft: side === 'Right' ? 16 : 0,\n        } : {},\n      ]} {...propsRef.current}>\n        {childrenRef.current}\n      </View>\n    );\n\n    navigation.setOptions({ [headerKey]: renderComponent });\n\n    return () => {\n      navigation.setOptions({ [headerKey]: undefined });\n    };\n  }, [navigation, side, theme]); // Add theme as a dependency\n\n  return null;\n});\n\ninterface NativeHeaderTitleProps extends ViewProps {\n  children?: React.ReactNode;\n  headerLargeTitle?: boolean;\n  search?: boolean;\n  placeholder?: string;\n  onSearch?: (query: string) => void;\n  maxWidth?: number;\n  ignoreTouch?: boolean;\n}\n\nconst NativeHeaderTitle = React.memo(function NativeHeaderTitle({\n  children,\n  headerLargeTitle = false,\n  search = false,\n  placeholder = \"Rechercher\",\n  onSearch,\n  ignoreTouch,\n  maxWidth,\n  ...props\n}: NativeHeaderTitleProps) {\n  const navigation = useNavigation();\n  const propsRef = useRef(props);\n  const childrenRef = useRef(children);\n  const onSearchRef = useRef(onSearch);\n\n  // Update refs without triggering re-renders\n  propsRef.current = props;\n  childrenRef.current = children;\n  onSearchRef.current = onSearch;\n\n  useEffect(() => {\n    const handleSearch = (e: any) => {\n      if (onSearchRef.current) { onSearchRef.current(e.nativeEvent.text); }\n    };\n\n    const renderTitle = () => (\n      <LayoutAnimationConfig skipEntering>\n        <View style={[\n          styles.title,\n          { maxWidth: maxWidth ?? 200 },\n          Platform.OS === 'android' ? styles.titleAndroid : {},\n        ]} {...propsRef.current}\n          pointerEvents={ignoreTouch ? \"none\" : \"auto\"}\n        >\n          {childrenRef.current}\n        </View>\n      </LayoutAnimationConfig>\n    );\n\n    const searchOptions = search ? {\n      placeholder,\n      onChangeText: handleSearch,\n    } : undefined;\n\n    navigation.setOptions({\n      headerTitle: renderTitle,\n      headerLargeTitle,\n      headerSearchBarOptions: searchOptions,\n    });\n\n    return () => {\n      navigation.setOptions({\n        headerTitle: undefined,\n        headerLargeTitle: undefined,\n        headerSearchBarOptions: undefined\n      });\n    };\n  }, [navigation, headerLargeTitle, search, placeholder]); // Minimal dependencies\n\n  return null;\n});\n\nconst NativeHeaderPressable = React.memo(function NativeHeaderPressable(props: PressableProps) {\n  const opacity = useSharedValue(1);\n  const scale = useSharedValue(1);\n\n  const animatedStyle = useAnimatedStyle(() => ({\n    opacity: opacity.value,\n    transform: [{ scale: scale.value }],\n  }));\n\n  const handlePressIn = () => {\n    opacity.value = withTiming(runsIOS26 ? 0.5 : 0.3, { duration: 20 });\n    scale.value = withTiming(0.9, { duration: 100 });\n  };\n\n  const handlePressOut = () => {\n    opacity.value = withTiming(1, { duration: 150 });\n    scale.value = withTiming(1, { duration: 150 });\n  };\n\n  if (typeof props.style === 'function') {\n    const styleFunction = (state: PressableStateCallbackType) => {\n      const userStyle = props.style as (state: PressableStateCallbackType) => any;\n      const styleResult = userStyle(state);\n      return [getPressableStyle(styleResult), animatedStyle];\n    };\n\n    return (\n      <AnimatedPressable\n        {...props}\n        style={styleFunction}\n        onPressIn={(e) => {\n          handlePressIn();\n          props.onPressIn?.(e);\n        }}\n        onPressOut={(e) => {\n          handlePressOut();\n          props.onPressOut?.(e);\n        }}\n      />\n    );\n  }\n\n  const style = [getPressableStyle(props.style), animatedStyle];\n  return (\n    <AnimatedPressable\n      {...props}\n      style={style}\n      onPressIn={(e) => {\n        handlePressIn();\n        props.onPressIn?.(e);\n      }}\n      onPressOut={(e) => {\n        handlePressOut();\n        props.onPressOut?.(e);\n      }}\n    />\n  );\n});\n\ninterface NativeHeaderHighlightProps extends ViewProps {\n  children?: React.ReactNode;\n  color?: string;\n  light?: boolean;\n  variant?: \"navigation\" | \"header\";\n}\n\nconst NativeHeaderHighlight = React.memo(function NativeHeaderHighlight({\n  children,\n  color,\n  light = false,\n  variant = \"navigation\",\n  style,\n  ...props\n}: NativeHeaderHighlightProps) {\n  const theme = useTheme();\n  if (!color) {\n    color = theme.colors.primary;\n  }\n  // Use cached background color\n  const backgroundColor = light ? 'transparent' : getBackgroundColor(color);\n\n  // Pre-compute style array once\n  const viewStyle = style ? [styles.highlight, { backgroundColor }, style, light ? { padding: 0 } : {}] : [styles.highlight, { backgroundColor }, { borderRadius: light ? 0 : styles.highlight.borderRadius }, light ? { padding: 0 } : {}];\n  const adjustedColor = adjust(color, theme.dark ? 0.2 : -0.2);\n\n  return (\n    <LayoutAnimationConfig skipEntering>\n      <Reanimated.View style={viewStyle} {...props} layout={LinearTransition.springify()}>\n        {typeof children === 'string' ? (\n          <AnimatedNumber variant={variant} style={{ color: adjustedColor }}>\n            {children}\n          </AnimatedNumber>\n        ) : (\n          children\n        )}\n      </Reanimated.View>\n    </LayoutAnimationConfig>\n  );\n});\n\nexport { NativeHeaderHighlight, NativeHeaderPressable, NativeHeaderSide, NativeHeaderTitle };"
  },
  {
    "path": "ui/components/Pattern/CrossPattern.tsx",
    "content": "import { Path, Pattern, Rect, Svg } from \"react-native-svg\";\n\nconst CrossPattern = ({ color }: { color: string }) => {\n  return (\n    <Svg fill={color}>\n      <Pattern\n        id={\"cross-pattern\"}\n        patternUnits={\"userSpaceOnUse\"}\n        width={47}\n        height={45}\n      >\n        <Path d={\"M23.2909 25.4089C23.9627 24.9243 24.9 25.0759 25.3846 25.7478L29.6913 31.7185L35.6629 27.4118C36.3348 26.9272 37.2721 27.0788 37.7567 27.7507C38.2413 28.4226 38.0897 29.3598 37.4178 29.8445L31.4461 34.1511L35.7538 40.1228C36.2384 40.7946 36.0868 41.7319 35.4149 42.2165C34.7431 42.7011 33.8058 42.5494 33.3211 41.8777L29.0135 35.906L23.0428 40.2136C22.371 40.6981 21.4337 40.5465 20.9491 39.8747C20.4645 39.2029 20.6163 38.2657 21.2879 37.781L27.2586 33.4734L22.952 27.5027C22.4674 26.8309 22.6192 25.8936 23.2909 25.4089ZM0.316265 29.112C1.00175 24.8778 4.99025 22.0008 9.22447 22.6863C13.4586 23.3718 16.3357 27.3603 15.6502 31.5945C14.9646 35.8285 10.9762 38.7047 6.74205 38.0193C2.50793 37.3338 -0.369034 33.3461 0.316265 29.112ZM8.74498 25.6472C6.14633 25.2265 3.69888 26.9929 3.27818 29.5915C2.85765 32.1901 4.62298 34.6376 7.22154 35.0583C9.82005 35.4789 12.2675 33.7134 12.6883 31.115C13.109 28.5163 11.3436 26.0679 8.74498 25.6472ZM25.1463 11.2019C25.8318 6.96773 29.8194 4.09074 34.0536 4.7761C38.2878 5.46159 41.1648 9.45009 40.4794 13.6843C39.7937 17.9183 35.8052 20.7946 31.5711 20.1091C27.3372 19.4235 24.461 15.4359 25.1463 11.2019ZM5.38072 0.578834C6.05245 0.0944033 6.98977 0.24622 7.47447 0.917702L11.7811 6.8884L17.7528 2.58176C18.4245 2.09736 19.3619 2.24914 19.8465 2.92063C20.3312 3.5925 20.1795 4.53072 19.5077 5.01536L13.536 9.322L17.8436 15.2927C18.3283 15.9646 18.1766 16.9028 17.5047 17.3874C16.833 17.8718 15.8957 17.72 15.411 17.0486L11.1034 11.0769L5.13267 15.3845C4.46094 15.8688 3.52358 15.7171 3.03892 15.0456C2.55428 14.3738 2.70592 13.4355 3.37779 12.9509L9.34849 8.64329L5.04185 2.67356C4.55721 2.00169 4.70884 1.06348 5.38072 0.578834ZM33.5741 7.73704C30.9755 7.31654 28.528 9.08283 28.1073 11.6814C27.6868 14.2798 29.4522 16.7274 32.0506 17.1482C34.6492 17.5689 37.0965 15.8032 37.5174 13.2048C37.9381 10.6062 36.1727 8.15774 33.5741 7.73704Z\"}/>\n      </Pattern>\n      <Rect width=\"100%\" height=\"100%\" fill=\"url(#cross-pattern)\" />\n    </Svg>\n  )\n}\n\nexport default CrossPattern;"
  },
  {
    "path": "ui/components/Pattern/Pattern.tsx",
    "content": "import { DimensionValue, Platform, ViewProps } from \"react-native\";\nimport { LinearGradient } from \"expo-linear-gradient\";\nimport MaskedView from \"@react-native-masked-view/masked-view\";\nimport CrossPattern from \"@/ui/components/Pattern/CrossPattern\";\nimport { useTheme } from \"@react-navigation/native\";\n\nenum AvailablePatterns {\n  CROSS = \"cross\",\n}\n\ninterface PatternProps extends ViewProps{\n  pattern: AvailablePatterns;\n  width?: DimensionValue\n  height?: DimensionValue;\n  color?: string;\n  opacity?: number;\n}\n\nconst Pattern = (props: PatternProps) => {\n  const { colors } = useTheme();\n\n  return (\n    <MaskedView\n      maskElement={\n        <LinearGradient\n          colors={[\"#000\", \"#0000\"]}\n          start={{ x: 0, y: 0 }}\n          end={{ x: 0, y: 1 }}\n          style={{\n            flex: 1,\n            width: \"100%\",\n            height: \"100%\",\n          }}\n        />\n      }\n      style={{\n        position: \"absolute\",\n        top: 0,\n        left: 0,\n        zIndex: 0,\n        width: props.width || \"100%\",\n        height: props.height || \"100%\",\n        opacity: (props.opacity || 0.25) * (Platform.OS === \"android\" ? 0.3 : 1),\n      }}\n    >\n      {props.pattern === \"cross\" && (\n        <CrossPattern color={props.color || colors.text}/>\n      )}\n    </MaskedView>\n  );\n}\n\nexport { AvailablePatterns, Pattern };"
  },
  {
    "path": "ui/components/Search.tsx",
    "content": "import { isLiquidGlassSupported } from \"@callstack/liquid-glass\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { LiquidGlassView } from '@sbaiahmed1/react-native-blur';\nimport React, { useEffect, useState } from \"react\";\nimport { Dimensions, Platform, TextInput, TouchableOpacity, View } from \"react-native\";\n\nimport { PapillonAppearIn, PapillonAppearOut } from \"../utils/Transition\";\nimport { Dynamic } from \"./Dynamic\";\nimport Icon from \"./Icon\";\nimport Stack from \"./Stack\";\n\ninterface SearchProps {\n  autoFocus?: boolean,\n  placeholder?: string,\n  onTextChange?: (text: string) => void,\n  color?: string,\n  style?: StyleProp<ViewStyle>,\n  value?: string,\n  setValue?: (text: string) => void,\n  icon?: string,\n};\n\nconst SearchContainer = ({ children, style }: { children: React.ReactNode, style?: StyleProp<ViewStyle> }) => {\n  const { colors } = useTheme();\n\n  if (!isLiquidGlassSupported) {\n    return (\n      <View\n        style={[{\n          width: Dimensions.get(\"window\").width - 32,\n          borderRadius: 300,\n          backgroundColor: Platform.OS === 'ios' ? colors.text + \"16\" : colors.item,\n        }, style]}\n      >\n        {children}\n      </View>\n    );\n  }\n\n  return (\n    <LiquidGlassView\n      glassType=\"regular\"\n      isInteractive={true}\n      glassTintColor=\"transparent\"\n      glassOpacity={0}\n      style={[{\n        width: Dimensions.get(\"window\").width - 32,\n        borderRadius: 300,\n      }, style]}\n    >\n      {children}\n    </LiquidGlassView>\n  );\n};\n\nconst Search: React.FC<SearchProps> = ({\n  placeholder = \"Rechercher\",\n  onTextChange = () => { },\n  autoFocus = false,\n  color,\n  style,\n  value,\n  setValue,\n  icon,\n}) => {\n  const { colors } = useTheme();\n  const [localInput, setLocalInput] = useState(\"\");\n\n  const input = value !== undefined && setValue !== undefined ? value : localInput;\n  const setInput = (text: string) => {\n    if (setValue) {\n      setValue(text);\n    } else {\n      setLocalInput(text);\n    }\n  };\n\n  useEffect(() => {\n    onTextChange(input);\n  }, [input]);\n\n  return (\n    <SearchContainer style={style}>\n      <Stack\n        height={42}\n        style={{\n          borderWidth: 0,\n          overflow: 'hidden',\n        }}\n        radius={300}\n        direction=\"horizontal\"\n        hAlign=\"center\"\n        vAlign=\"center\"\n        gap={10}\n        padding={[14, 0]}\n      >\n        <Icon size={24} opacity={input.length > 0 ? 1 : 0.5}>\n          <Papicons name={icon ?? \"search\"} />\n        </Icon>\n\n        <TextInput\n          value={input}\n          onChangeText={setInput}\n          placeholder={placeholder}\n          autoFocus={autoFocus}\n          autoCapitalize=\"none\"\n          autoCorrect={false}\n          cursorColor={color}\n          selectionColor={color}\n          selectionHandleColor={color}\n          placeholderTextColor={colors.text + \"77\"}\n          style={{\n            flex: 1,\n            height: '100%',\n            fontSize: 17,\n            color: colors.text,\n            fontFamily: \"semibold\",\n            marginTop: Platform.OS === 'android' ? 2 : 0,\n          }}\n        />\n\n        {input.length > 0 && (\n          <Dynamic animated entering={PapillonAppearIn} exiting={PapillonAppearOut}>\n            <TouchableOpacity\n              onPress={() => setInput(\"\")}\n            >\n              <Icon size={20} opacity={0.5}>\n                <Papicons name=\"cross\" />\n              </Icon>\n            </TouchableOpacity>\n          </Dynamic>\n        )}\n      </Stack>\n    </SearchContainer>\n  );\n};\n\nexport default Search;\n"
  },
  {
    "path": "ui/components/SectionHeader.tsx",
    "content": "import React from \"react\";\r\n\r\nimport Stack from \"@/ui/components/Stack\";\r\nimport Typography from \"@/ui/components/Typography\";\r\n\r\ninterface SectionHeaderProps {\r\n  title: string;\r\n  leading?: React.ReactNode;\r\n  trailing?: React.ReactNode;\r\n}\r\n\r\nexport default function SectionHeader({ title, leading, trailing }: SectionHeaderProps) {\r\n  return (\r\n    <Stack\r\n      direction=\"horizontal\"\r\n      gap={10}\r\n      vAlign=\"center\"\r\n      hAlign=\"start\"\r\n      style={{\r\n        paddingHorizontal: 6,\r\n        paddingVertical: 0,\r\n        marginBottom: 14,\r\n        opacity: 0.5,\r\n        justifyContent: 'space-between',\r\n        alignItems: 'center',\r\n        width: '100%',\r\n      }}\r\n    >\r\n      <Stack direction=\"horizontal\" gap={10} vAlign=\"center\" hAlign=\"start\" style={{ alignItems: 'center' }}>\r\n        {leading}\r\n        <Typography>\r\n          {title}\r\n        </Typography>\r\n      </Stack>\r\n\r\n      {trailing && (\r\n        <Stack>\r\n          {trailing}\r\n        </Stack>\r\n      )}\r\n    </Stack>\r\n  );\r\n}"
  },
  {
    "path": "ui/components/SkeletonView.tsx",
    "content": "import { Dimensions, View, ViewProps } from \"react-native\";\nimport Reanimated, { Easing, useAnimatedStyle, useSharedValue, withRepeat, withTiming } from \"react-native-reanimated\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { useEffect, useMemo } from \"react\";\nimport LinearGradient from \"react-native-linear-gradient\";\n\nexport interface SkeletonViewProps extends ViewProps {\n}\n\nconst SkeletonView = (props: SkeletonViewProps) => {\n  const { colors } = useTheme();\n\n  const translationX = useSharedValue(-200);\n\n  const window_width = Dimensions.get(\"window\").width;\n\n  useEffect(() => {\n    translationX.value = withRepeat(\n      withTiming(window_width, {\n        duration: 2000,\n        easing: Easing.linear,\n      }),\n      -1,\n      false,\n    );\n  }, []);\n\n  const skeletonTranslation = useAnimatedStyle(() => ({\n    position: \"absolute\",\n    top: 0,\n    left: -200,\n    bottom: 0,\n    width: 200,\n    transform: [{ translateX: translationX.value }],\n  }));\n\n  const AnimatedLinearGradient = useMemo(\n    () => Reanimated.createAnimatedComponent(LinearGradient),\n    [],\n  );\n\n\n  return (\n    <View\n      {...props}\n      style={[{\n        backgroundColor: colors.text + \"10\",\n        overflow: \"hidden\",\n      }, props.style]}\n    >\n      <AnimatedLinearGradient\n        colors={[colors.text + \"00\", colors.text + \"10\", colors.text + \"00\"]}\n        start={{ x: 0, y: 0.5 }}\n        end={{ x: 1, y: 0.5 }}\n        style={skeletonTranslation}\n      />\n    </View>\n  );\n};\n\nexport default SkeletonView;"
  },
  {
    "path": "ui/components/Stack.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport React from \"react\";\nimport { FlexAlignType, Platform, StyleProp, StyleSheet, ViewProps, ViewStyle } from \"react-native\";\nimport Reanimated, { LinearTransition } from \"react-native-reanimated\";\n\nimport { Animation } from \"../utils/Animation\";\n\n// Types pour la direction et l'alignement\ntype Direction = \"vertical\" | \"horizontal\";\ntype Alignment = \"start\" | \"center\" | \"end\";\n\ninterface StackProps extends ViewProps {\n  direction?: Direction;\n  gap?: number;\n  padding?: number | [number, number];\n  height?: DimensionValue;\n  width?: DimensionValue;\n  margin?: number;\n  vAlign?: Alignment;\n  hAlign?: Alignment;\n  inline?: boolean;\n  flex?: boolean;\n  backgroundColor?: string;\n  card?: boolean; // Utilisé pour les cartes\n  flat?: boolean; // Utilisé pour les listes plates\n  bordered?: boolean; // Utilisé pour les listes avec bordures\n  radius?: number;\n  animated?: boolean;\n  noShadow?: boolean;\n  layout?: unknown;\n  style?: StyleProp<ViewStyle>;\n}\n\n// Pre-computed alignment maps for maximum performance\nconst ALIGN_ITEMS_MAP: Record<Alignment, FlexAlignType> = {\n  start: \"flex-start\",\n  center: \"center\",\n  end: \"flex-end\",\n} as const;\n\nconst JUSTIFY_CONTENT_MAP: Record<Alignment, ViewStyle[\"justifyContent\"]> = {\n  start: \"flex-start\",\n  center: \"center\",\n  end: \"flex-end\",\n} as const;\n\n// Pre-computed style cache to avoid object creation\nconst STYLE_CACHE = new Map<string, StyleProp<ViewStyle>>();\n\n// Cache cleanup to prevent memory leaks (runs when cache gets too large)\nconst MAX_CACHE_SIZE = 100;\nconst cleanupCache = () => {\n  if (STYLE_CACHE.size > MAX_CACHE_SIZE) {\n    const entries = Array.from(STYLE_CACHE.entries());\n    STYLE_CACHE.clear();\n    // Keep only the last 50 entries (most recently used)\n    entries.slice(-50).forEach(([key, value]) => {\n      STYLE_CACHE.set(key, value);\n    });\n  }\n};\n\n// Pre-computed common combinations\nconst COMMON_STYLES = StyleSheet.create({\n  base: {\n    width: \"100%\",\n  },\n  vertical: {\n    width: \"100%\",\n    flexDirection: \"column\",\n  },\n  horizontal: {\n    width: \"100%\",\n    flexDirection: \"row\",\n  },\n});\n\n// Memoized Stack component for extreme performance\nconst Stack: React.FC<StackProps> = ({\n  direction = \"vertical\",\n  gap = 4,\n  width,\n  height,\n  padding = 0,\n  margin = 0,\n  vAlign = \"start\",\n  hAlign = \"start\",\n  inline = false,\n  flex = false,\n  backgroundColor,\n  radius = 0,\n  card = false,\n  flat = false,\n  bordered,\n  style,\n  children,\n  noShadow = false,\n  animated = false,\n  ...rest\n}) => {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  // Generate cache key for style optimization\n  const cacheKey = React.useMemo(() =>\n    `${direction}-${gap}-${width}--${height}-${padding}-${margin}-${vAlign}-${hAlign}-${inline}-${theme.dark}-${flex}-${backgroundColor || ''}-${radius}-${card}-${animated}-${noShadow}`,\n    [direction, gap, width, height, padding, margin, vAlign, hAlign, inline, theme.dark, flex, backgroundColor, radius, card, animated, noShadow]\n  );\n\n  // Ultra-optimized style computation with caching\n  const computedStyle = React.useMemo(() => {\n    // Check cache first\n    const cached = STYLE_CACHE.get(cacheKey);\n    if (cached) { return cached; }\n\n    // Use pre-computed base styles\n    const baseStyle = direction === \"vertical\" ? COMMON_STYLES.vertical : COMMON_STYLES.horizontal;\n\n    // Build style object with minimal allocations\n    const dynamicStyle: ViewStyle = {\n      gap,\n      padding: !(padding instanceof Array) ? padding : undefined,\n      paddingHorizontal: padding instanceof Array ? padding[0] : undefined,\n      paddingVertical: padding instanceof Array ? padding[1] : undefined,\n      margin,\n      width: width,\n      height: height,\n      alignItems: ALIGN_ITEMS_MAP[hAlign],\n      justifyContent: JUSTIFY_CONTENT_MAP[vAlign],\n    };\n\n    // Add conditional styles only if needed\n    if (backgroundColor && typeof backgroundColor === 'string' && !backgroundColor.includes('undefined') && !backgroundColor.includes('null')) {\n      dynamicStyle.backgroundColor = backgroundColor;\n    }\n\n    if (radius > 0) {\n      dynamicStyle.borderRadius = radius;\n      dynamicStyle.borderCurve = \"continuous\";\n    }\n\n    // Handle inline with React Native compatible values\n    if (inline) {\n      dynamicStyle.alignSelf = \"center\";\n      dynamicStyle.width = width !== undefined ? width : \"auto\";\n      dynamicStyle.flex = flex ? 1 : 0;\n    }\n\n    if (card) {\n      dynamicStyle.borderRadius = radius || 20;\n      dynamicStyle.borderCurve = \"continuous\";\n      if (!noShadow) {\n        dynamicStyle.shadowColor = flat ? \"transparent\" : \"#000000\";\n        dynamicStyle.shadowOffset = { width: 0, height: 0 };\n        dynamicStyle.shadowOpacity = flat ? 0 : 0.16;\n        dynamicStyle.shadowRadius = 1.5;\n      }\n      dynamicStyle.overflow = \"visible\"; // Ensure shadows are visible\n      dynamicStyle.borderColor = colors.text + \"25\";\n      dynamicStyle.borderWidth = Platform.OS === 'android' ? 0 : (bordered !== undefined && bordered === false) ? 0 : (flat ? 1 : 0.5);\n      dynamicStyle.backgroundColor = backgroundColor || colors.item; // Default to theme background\n    }\n\n    if (bordered) {\n      dynamicStyle.borderRadius = radius || 20;\n      dynamicStyle.borderCurve = \"continuous\";\n      dynamicStyle.borderColor = colors.border + \"33\";\n      dynamicStyle.borderWidth = 1;\n      dynamicStyle.backgroundColor = backgroundColor || colors.card;\n    }\n\n    const finalStyle = [baseStyle, dynamicStyle];\n\n    // Cache the result\n    STYLE_CACHE.set(cacheKey, finalStyle);\n\n    // Cleanup cache if necessary\n    cleanupCache();\n\n    return finalStyle;\n  }, [cacheKey, direction, gap, padding, margin, hAlign, vAlign, backgroundColor, radius, inline]);\n\n  return (\n    <Reanimated.View style={[computedStyle, style]} layout={rest.layout || (animated ? Animation(LinearTransition) : undefined)} {...rest}>\n      {children}\n    </Reanimated.View>\n  );\n};\n\n// Set display name for debugging\nStack.displayName = 'Stack';\n\nexport default Stack;"
  },
  {
    "path": "ui/components/Subject.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport React, { memo } from \"react\";\nimport { StyleSheet, Text, View } from \"react-native\";\nimport Reanimated, { Easing, LinearTransition } from \"react-native-reanimated\";\n\nimport Stack from \"./Stack\";\nimport Typography from \"./Typography\";\nimport SkeletonView from \"@/ui/components/SkeletonView\";\n\nconst ListGradesLayoutTransition = LinearTransition.easing(Easing.inOut(Easing.circle)).duration(300);\n\nexport interface SubjectProps {\n  color: string;\n  emoji: string;\n  name: string;\n  average: number;\n  disabled?: boolean;\n  status?: string;\n  outOf: number;\n  skeleton?: boolean;\n}\n\nconst Subject: React.FC<SubjectProps> = ({\n  color,\n  emoji,\n  name,\n  average,\n  disabled = false,\n  status,\n  outOf,\n  skeleton = false,\n}) => {\n  const { colors } = useTheme();\n\n  return (\n    <Reanimated.View\n      layout={ListGradesLayoutTransition}\n      style={[styles.container, { backgroundColor: skeleton ? colors.text + \"10\" : color + 33 }]}\n    >\n      <Stack direction=\"horizontal\" hAlign=\"center\" gap={12}>\n        {skeleton ? (\n          <SkeletonView style={styles.emojiContainer} />\n        ):(\n          <View style={[styles.emojiContainer, { backgroundColor: color + 50 }]}>\n            <Text style={styles.emoji}>\n              {emoji}\n            </Text>\n          </View>\n        )}\n        <Typography nowrap variant=\"title\" color={color} style={styles.flex1} skeleton={skeleton} skeletonWidth={120}>\n          {name}\n        </Typography>\n\n        <Stack\n          direction=\"horizontal\"\n          backgroundColor={skeleton ? colors.text + \"05\" : color + \"25\"}\n          inline\n          radius={120}\n          gap={1}\n          hAlign=\"end\"\n          style={styles.gradeContainer}\n        >\n          {skeleton ? (\n            <Typography skeleton />\n          ) : (\n            <>\n              <Typography variant=\"body1\" weight=\"bold\" color={color}>\n                {disabled ? status : (average ?? 0).toFixed(2)}\n              </Typography>\n              <Typography variant=\"caption\" weight=\"semibold\" color={color + \"DF\"} style={{ fontSize: 13, opacity: 0.8 }}>\n                {`/${outOf}`}\n              </Typography>\n            </>\n          )}\n        </Stack>\n      </Stack>\n    </Reanimated.View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    borderColor: \"#00000022\",\n    borderWidth: 1,\n    borderBottomWidth: 0,\n    padding: 7,\n    borderTopLeftRadius: 22,\n    borderTopRightRadius: 22,\n    borderCurve: \"continuous\",\n    shadowColor: \"rgba(0,0,0,0.1)\",\n    shadowOffset: { width: 0, height: 1 },\n    shadowRadius: 3,\n    shadowOpacity: 1,\n    elevation: 1,\n    paddingBottom: 7 + 24,\n    marginBottom: -24,\n  },\n  emojiContainer: {\n    width: 34,\n    aspectRatio: 1,\n    borderRadius: 20,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n  },\n  emoji: {\n    fontSize: 20,\n  },\n  flex1: {\n    flex: 1,\n  },\n  gradeContainer: {\n    paddingHorizontal: 10,\n    paddingVertical: 4,\n  },\n});\n\nexport default memo(Subject);"
  },
  {
    "path": "ui/components/TabFlatList.tsx",
    "content": "import { LegendList } from \"@legendapp/list\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { FlashList } from \"@shopify/flash-list\";\nimport React, { memo } from \"react\";\nimport { Dimensions, FlatList, FlatListProps, Platform, View } from \"react-native\";\nimport Reanimated, { Extrapolate, interpolate, runOnJS, useAnimatedReaction, useAnimatedScrollHandler, useAnimatedStyle, useDerivedValue, useSharedValue } from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport { AvailablePatterns, Pattern } from \"@/ui/components/Pattern/Pattern\";\n\nconst AnimatedLegendList = Reanimated.createAnimatedComponent(LegendList);\nconst AnimatedFlatList = Reanimated.createAnimatedComponent(FlatList);\nconst AnimatedFlashList = Reanimated.createAnimatedComponent(FlashList);\n\ninterface TabFlatListProps extends FlatListProps<any> {\n  header?: React.ReactNode;\n  backgroundColor?: string;\n  foregroundColor?: string;\n  pattern?: AvailablePatterns;\n  height?: number;\n  padding?: number;\n  paddingTop?: number;\n  radius?: number;\n  gap?: number;\n  engine?: 'FlatList' | 'LegendList' | 'FlashList';\n  translucent?: boolean;\n  onFullyScrolled?: (isFullyScrolled: boolean) => void;\n}\n\nconst TabFlatList: React.FC<TabFlatListProps> = memo(({\n  header,\n  backgroundColor = \"#F7E8F5\",\n  foregroundColor = \"#29947A\",\n  pattern,\n  height = 120,\n  padding = 16,\n  paddingTop,\n  radius = 28,\n  gap = 0,\n  engine = \"FlatList\",\n  translucent = false,\n  onFullyScrolled,\n  ...rest\n}) => {\n  const { colors } = useTheme();\n  const insets = useSafeAreaInsets();\n\n  const screenHeight = Dimensions.get('window').height;\n  const headerInset = insets.top + 40;\n  const finalHeight = height + headerInset;\n  let tabBarHeight = 0;\n  try {\n    tabBarHeight = 80;\n    if (isNaN(tabBarHeight)) tabBarHeight = 0;\n  } catch {\n    tabBarHeight = 0;\n  }\n\n  // Memoize shared values for scroll position and threshold\n  const scrollY = React.useRef(useSharedValue(0)).current;\n  const isScrolledPastThreshold = React.useRef(useSharedValue(false)).current;\n\n  // Memoize scroll handler for performance\n  const scrollHandler = useAnimatedScrollHandler({\n    onScroll: (event) => {\n      'worklet';\n      const y = event.contentOffset.y;\n      scrollY.value = y;\n\n\n      const wasScrolledPast = isScrolledPastThreshold.value;\n      const isNowScrolledPast = y > height - 24;\n      if (wasScrolledPast !== isNowScrolledPast) {\n        isScrolledPastThreshold.value = isNowScrolledPast;\n        if (onFullyScrolled) {\n          runOnJS(onFullyScrolled)(isNowScrolledPast);\n        }\n      }\n    }\n  });\n\n  // Memoize header animation style for performance\n  const headerStyle = useAnimatedStyle(() => {\n    'worklet';\n    const y = scrollY.value;\n    return {\n      transform: [\n        {\n          scale: interpolate(\n            y,\n            [0, finalHeight],\n            [1, 0.5],\n            Extrapolate.CLAMP\n          ),\n        },\n        {\n          translateY: interpolate(\n            y,\n            [0, finalHeight],\n            [0, -100],\n            Extrapolate.EXTEND\n          ),\n        }\n      ],\n      opacity: interpolate(y, [0, finalHeight - 150], [1, 0], Extrapolate.CLAMP),\n      willChange: 'transform, opacity',\n    };\n  }, [finalHeight]);\n\n  // Memoize header container style for performance\n  const headerContainerStyle = useAnimatedStyle(() => {\n    'worklet';\n    const y = scrollY.value;\n    return {\n      height: interpolate(\n        y,\n        [0, finalHeight],\n        [finalHeight, 0],\n        Extrapolate.EXTEND\n      ),\n    };\n  }, [finalHeight]);\n\n  // Memoize derived value and scroll indicator state\n  const isScrolledPastThresholdDerived = useDerivedValue(() => isScrolledPastThreshold.value);\n  const [showScrollIndicator, setShowScrollIndicator] = React.useState(false);\n\n  // Use useAnimatedReaction directly (not inside useEffect)\n  useAnimatedReaction(\n    () => isScrolledPastThresholdDerived.value,\n    (currentValue) => {\n      runOnJS(setShowScrollIndicator)(currentValue);\n    }\n  );\n\n  const ListEngine = engine === \"LegendList\" ? AnimatedLegendList : engine === \"FlashList\" ? AnimatedFlashList : AnimatedFlatList;\n\n  try {\n    return (\n      <>\n        {/* Header */}\n        <Reanimated.View\n          style={[\n            {\n              position: 'absolute',\n              top: 0,\n              left: 0,\n              right: 0,\n              zIndex: 10001,\n              overflow: 'hidden',\n            },\n            headerContainerStyle\n          ]}\n          pointerEvents={showScrollIndicator ? \"none\" : \"auto\"}\n        >\n          <View style={{ height: finalHeight, paddingTop: headerInset }}>\n            <Reanimated.View\n              style={[\n                {\n                  flex: 1,\n                  justifyContent: 'center',\n                  alignItems: 'center',\n                  height: finalHeight,\n                  width: '100%',\n                },\n                headerStyle,\n              ]}>\n              {header}\n            </Reanimated.View>\n          </View>\n        </Reanimated.View>\n\n        {/* Header Pattern */}\n        {pattern && (\n          <Pattern pattern={pattern} color={foregroundColor} height={finalHeight} />\n        )}\n\n        {/* Background */}\n        <View\n          style={{\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            zIndex: -10000,\n            backgroundColor: backgroundColor,\n          }}\n        >\n        </View>\n\n        {/* FlatList */}\n        <ListEngine\n          {...rest}\n\n          onScroll={scrollHandler}\n          /* snapToOffsets={[0, height - 16]} // Snap to header and modal positions */\n          decelerationRate=\"normal\" // Faster deceleration for smoother feel\n          snapToEnd={false} // Disable snap to end for better control\n          // scrollEventThrottle is not supported by LegendList, so removed for type safety\n\n          ListFooterComponent={\n            <>\n              <View style={{ height: Platform.OS === 'ios' ? tabBarHeight + 12 : 260 }} />\n\n              {Platform.OS === 'ios' && (\n                <View\n                  style={{\n                    position: 'absolute',\n                    bottom: -995,\n                    left: -100,\n                    height: 1000,\n                    width: Dimensions.get('window').width + 200,\n                    backgroundColor: colors.background,\n                  }}\n                />\n              )}\n            </>\n          }\n\n          showsVerticalScrollIndicator={Platform.OS === 'android' ? false : showScrollIndicator}\n          scrollIndicatorInsets={{\n            top: 28\n          }}\n\n          style={{\n            flex: 1,\n            zIndex: 9999,\n          }}\n\n          contentContainerStyle={{\n            minHeight: screenHeight - finalHeight,\n            backgroundColor: translucent ? \"transparent\" : colors.background,\n            marginTop: finalHeight,\n            borderTopLeftRadius: radius,\n            borderTopRightRadius: radius,\n            borderCurve: 'continuous',\n            padding: padding,\n            paddingVertical: padding,\n            paddingTop: paddingTop ?? padding,\n            gap: gap,\n          }}\n        />\n      </>\n    )\n  }\n  catch (error) {\n    return <View style={{ flex: 1, backgroundColor: colors.background }} />;\n  }\n});\n\nexport default TabFlatList;"
  },
  {
    "path": "ui/components/TabHeader.tsx",
    "content": "\nimport { useTheme } from '@react-navigation/native';\nimport { ProgressiveBlurView } from '@sbaiahmed1/react-native-blur';\nimport React, { useEffect } from 'react';\nimport { Platform, View } from 'react-native';\nimport Reanimated from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport { runsIOS26 } from '../utils/IsLiquidGlass';\nimport { TabHeaderTitleProps } from './TabHeaderTitle';\nimport AndroidBackButton from '@/utils/theme/AndroidBackButton';\n\n\ninterface TabHeaderProps {\n  onHeightChanged?: (height: number) => void,\n  title?: React.ReactElement<TabHeaderTitleProps>,\n  trailing?: React.ReactElement,\n  bottom?: React.ReactElement,\n  shouldCollapseHeader?: boolean,\n  modal?: boolean,\n  backgroundColor?: string,\n  showAndroidBackButton?: boolean,\n};\n\nconst TabHeader: React.FC<TabHeaderProps> = ({\n  onHeightChanged = () => { },\n  title,\n  trailing,\n  bottom,\n  shouldCollapseHeader,\n  modal,\n  backgroundColor,\n  showAndroidBackButton,\n}) => {\n  const isModal = Platform.OS === 'ios' ? modal : false;\n  const theme = useTheme();\n  const colors = theme.colors;\n  const insets = useSafeAreaInsets();\n  const [height, setHeight] = React.useState(0);\n  const usedInsets = isModal ? 16 : insets.top;\n\n  useEffect(() => {\n    onHeightChanged(height + (Platform.OS === 'android' ? 6 : 0));\n  }, [height]);\n\n  return (\n    <>\n      <Reanimated.View\n        style={[{\n          backgroundColor: runsIOS26 ? 'transparent' : backgroundColor || colors.background,\n          borderBottomWidth: (Platform.OS === 'ios' && !runsIOS26) ? 0.5 : 0,\n          borderBottomColor: (Platform.OS === 'ios' && !runsIOS26) ? colors.border : undefined,\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          right: 0,\n          height: height,\n          zIndex: 99,\n          overflow: Platform.OS === 'android' ? 'visible' : 'hidden',\n          elevation: 0,\n        }]}\n        pointerEvents={'none'}\n      >\n        {runsIOS26 && (\n          <ProgressiveBlurView\n            blurType=\"systemMaterial\"\n            blurAmount={20}\n            direction=\"blurredTopClearBottom\"\n            startOffset={0}\n            reducedTransparencyFallbackColor=\"#00000000\"\n            style={{\n              position: 'absolute',\n              top: 0,\n              left: 0,\n              right: 0,\n              height: height - 20,\n              zIndex: 99,\n            }}\n          />\n        )}\n      </Reanimated.View>\n\n      <View\n        style={{\n          paddingTop: usedInsets + 4,\n          paddingBottom: 16,\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          right: 0,\n          zIndex: 1001,\n          gap: 10,\n          alignItems: 'center',\n          justifyContent: 'center',\n        }}\n        onLayout={(event) => {\n          const { height } = event.nativeEvent.layout;\n          setHeight(height);\n        }}\n      >\n        <View\n          style={{\n            flex: 1,\n            flexDirection: 'row',\n            gap: 8,\n            paddingHorizontal: 16,\n            paddingLeft: isModal ? 24 : 16,\n            height: 40,\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n        >\n          {showAndroidBackButton && Platform.OS === 'android' && (\n            <View style={{\n              marginTop: -2,\n            }}>\n              <AndroidBackButton />\n            </View>\n          )}\n\n          {title}\n\n          <View\n            style={{\n              flex: 1,\n              alignItems: 'flex-end',\n              justifyContent: 'center',\n            }}\n          >\n            {trailing}\n          </View>\n        </View>\n\n        {bottom}\n      </View>\n    </>\n  )\n};\n\nexport default TabHeader;"
  },
  {
    "path": "ui/components/TabHeaderTitle.tsx",
    "content": "\nimport { Papicons } from '@getpapillon/papicons';\nimport React from 'react';\nimport { Dimensions, TouchableOpacity } from 'react-native';\nimport { LayoutAnimationConfig, LinearTransition } from 'react-native-reanimated';\n\nimport { NativeHeaderHighlight } from '@/ui/components/NativeHeader';\nimport Typography from '@/ui/components/Typography';\n\nimport { Animation } from '../utils/Animation';\nimport { PapillonAppearIn, PapillonAppearOut } from '../utils/Transition';\nimport ActivityIndicator from './ActivityIndicator';\nimport { Dynamic } from './Dynamic';\nimport Icon from './Icon';\nimport Stack from './Stack';\n\nexport interface TabHeaderTitleProps {\n  leading?: string,\n  number?: string,\n  trailing?: string,\n  subtitle?: string,\n  chevron?: boolean,\n  color?: string,\n  loading?: boolean,\n  height?: number,\n  onPress?: () => void,\n};\n\nconst TabHeaderTitle: React.FC<TabHeaderTitleProps> = ({\n  leading,\n  number,\n  trailing,\n  subtitle,\n  chevron = true,\n  color,\n  loading = false,\n  height,\n  onPress = () => { }\n}) => {\n  return (\n    <LayoutAnimationConfig skipEntering>\n      <TouchableOpacity\n        style={{\n          flexDirection: 'row',\n          alignItems: 'center',\n          gap: 4,\n        }}\n        onPress={() => {\n          onPress();\n        }}\n      >\n        <Stack\n          animated\n          direction='vertical'\n          gap={0}\n          vAlign='center'\n          height={height}\n        >\n          <Stack\n            animated\n            direction='horizontal'\n            hAlign='center'\n            gap={4}\n            style={{\n              maxWidth: Dimensions.get('window').width - 230,\n            }}\n          >\n            {leading &&\n              typeof leading === 'string' ? (\n              <Dynamic animated entering={PapillonAppearIn} exiting={PapillonAppearOut} key={\"leading:\" + leading.toString()}>\n                <Typography variant=\"header\" nowrap>{leading}</Typography>\n              </Dynamic>\n            ) : (\n              leading\n            )}\n\n            {number && (\n              <Dynamic animated entering={PapillonAppearIn} exiting={PapillonAppearOut}>\n                <NativeHeaderHighlight variant='navigation' color={color}>{number}</NativeHeaderHighlight>\n              </Dynamic>\n            )}\n\n            {trailing &&\n              typeof trailing === 'string' ? (\n              <Dynamic animated entering={PapillonAppearIn} exiting={PapillonAppearOut} key={\"trailing:\" + trailing.toString()}>\n                <Typography variant=\"header\">{trailing}</Typography>\n              </Dynamic>\n            ) : (\n              trailing\n            )}\n\n            {chevron && (\n              <Dynamic animated entering={PapillonAppearIn} exiting={PapillonAppearOut}>\n                <Icon size={20} opacity={0.5}>\n                  <Papicons name=\"chevrondown\" />\n                </Icon>\n              </Dynamic>\n            )}\n\n            {loading && (\n              <Dynamic animated layout={Animation(LinearTransition, \"list\")}>\n                <ActivityIndicator size={22} strokeWidth={3} color={color} style={{ marginLeft: 8 }} />\n              </Dynamic>\n            )}\n          </Stack>\n          {subtitle && (\n            <Dynamic animated entering={PapillonAppearIn} exiting={PapillonAppearOut} key={\"subtitle:\" + subtitle.toString()}>\n              <Typography variant=\"body1\" color={\"secondary\"}>\n                {subtitle}\n              </Typography>\n            </Dynamic>\n          )}\n        </Stack>\n      </TouchableOpacity>\n    </LayoutAnimationConfig>\n  )\n};\n\nexport default TabHeaderTitle;"
  },
  {
    "path": "ui/components/TableFlatList.tsx",
    "content": "import { LegendList } from '@legendapp/list';\nimport { useHeaderHeight } from '@react-navigation/elements';\nimport { useTheme } from '@react-navigation/native';\nimport { FlashList } from '@shopify/flash-list';\nimport React from 'react';\nimport { FlatList, FlatListProps, PressableProps, StyleProp, ViewStyle } from 'react-native';\nimport Reanimated from 'react-native-reanimated';\n\nimport { runsIOS26 } from '../utils/IsLiquidGlass';\nimport Icon from './Icon';\nimport Item, { Leading, Trailing } from './Item';\nimport Stack from './Stack';\nimport Typography from './Typography';\n\ninterface SectionItem {\n  leading?: React.ReactNode;\n  trailing?: React.ReactNode;\n  icon?: React.ReactNode;\n  papicon?: React.ReactNode;\n  type?: string;\n  content?: React.ReactNode;\n  title?: string;\n  titleProps?: any;\n  tags?: Array<string>;\n  description?: string;\n  descriptionProps?: any;\n  onPress?: () => void;\n  hideTitle?: boolean;\n  itemProps?: PressableProps;\n  ui?: {\n    first?: boolean;\n    last?: boolean;\n    [key: string]: any;\n  };\n}\n\ninterface Section {\n  title?: string;\n  icon?: React.ReactNode;\n  papicon?: React.ReactNode;\n  hideTitle?: boolean; // Optional property to hide the title\n  items: Array<SectionItem>;\n}\n\ninterface TableFlatListProps extends FlatListProps<SectionItem> {\n  sections: Array<Section | null>;\n  engine?: 'FlatList' | 'LegendList' | 'FlashList';\n  contentInsetAdjustmentBehavior?: 'automatic' | 'scrollableAxes' | 'never';\n  style?: StyleProp<ViewStyle>;\n  contentContainerStyle?: StyleProp<ViewStyle>;\n  listProps?: any;\n  renderItem?: (item: SectionItem) => React.ReactNode;\n  data?: Array<SectionItem>;\n  ignoreHeaderHeight?: boolean;\n}\n\nconst TableFlatList: React.FC<TableFlatListProps> = ({\n  sections,\n  engine = 'FlatList',\n  contentInsetAdjustmentBehavior = 'never',\n  style = {},\n  contentContainerStyle = {},\n  ignoreHeaderHeight = false,\n  ...rest\n}) => {\n  const theme = useTheme();\n  const { colors } = theme;\n  const headerHeight = ignoreHeaderHeight ? 0 : useHeaderHeight();\n\n  // render section title and items in same level array\n  const data = sections.reduce((acc, section) => {\n    if (!section) return acc;\n    if (section.title) {\n      acc.push({ type: 'title', title: section.title, icon: section.icon, papicon: section.papicon, hideTitle: section.hideTitle });\n    }\n    section.items.forEach((item, idx) => {\n      const first = idx === 0;\n      const last = idx === section.items.length - 1;\n      acc.push({\n        ...item,\n        type: 'item',\n        ui: {\n          ...(item.ui || {}),\n          first,\n          last,\n        },\n      });\n    });\n    return acc;\n  }, [] as Array<SectionItem & { type: 'title' | 'item'; ui?: { first?: boolean; last?: boolean } }>);\n\n  const ListComponent = engine === 'LegendList' ? LegendList : engine === 'FlashList' ? FlashList : FlatList;\n\n  const renderItemComponent = ({ item, index }: any) => (\n    item.type === 'item' ? (\n      <Reanimated.View\n        key={index}\n        style={[\n          {\n            backgroundColor: colors.card,\n            borderColor: colors.border,\n            borderLeftWidth: 1,\n            borderRightWidth: 1,\n            borderBottomWidth: 1,\n            borderCurve: \"continuous\",\n            shadowColor: \"#000000\",\n            shadowOffset: { width: 0, height: 0 },\n            shadowOpacity: 0.16,\n            shadowRadius: 1.5,\n            elevation: 1,\n          },\n          item.ui?.first && {\n            borderTopLeftRadius: 20,\n            borderTopRightRadius: 20,\n            borderTopWidth: 1,\n          },\n          item.ui?.last && {\n            borderBottomLeftRadius: 20,\n            borderBottomRightRadius: 20,\n            marginBottom: 14,\n          }\n        ]}\n      >\n        <Item\n          onPress={item.onPress}\n          isLast={true}\n          {...item.itemProps}\n        >\n          {item.leading && (\n            <Leading>\n              {item.leading}\n            </Leading>\n          )}\n          {item.icon || item.papicon ? (\n            <Icon papicon={!!item.papicon} opacity={0.5}>\n              {item.papicon ? item.papicon : item.icon}\n            </Icon>\n          ) : null}\n          {item.title && (\n            <Typography variant='title' {...item.titleProps}>\n              {item.title}\n            </Typography>\n          )}\n          {item.description && !item.tags && (\n            <Typography variant=\"body2\" weight='medium' color=\"secondary\" {...item.descriptionProps}>\n              {item.description}\n            </Typography>\n          )}\n          {item.tags && (\n            <Stack direction={\"horizontal\"} gap={6}>\n              {item.tags.map((tag: string, tagIndex: number) => (\n                <Stack direction={\"horizontal\"} gap={8} hAlign={\"center\"} radius={100} backgroundColor={colors.background} inline padding={[12, 3]} card flat key={tag}>\n                  <Typography variant={\"body1\"} color=\"secondary\">\n                    {tag}\n                  </Typography>\n                </Stack>\n              ))}\n            </Stack>\n          )}\n          {item.content && (\n            item.content\n          )}\n          {item.trailing && (\n            <Trailing>\n              {item.trailing}\n            </Trailing>\n          )}\n        </Item>\n      </Reanimated.View>\n    ) : item.type === 'title' && !item.hideTitle ? (\n      <Stack direction=\"horizontal\" gap={8} vAlign=\"start\" hAlign=\"center\" style={{\n        paddingHorizontal: 4,\n        paddingVertical: 0,\n        marginBottom: 14,\n        marginTop: 1,\n        opacity: 0.5,\n      }}>\n        {item.icon || item.papicon ? (\n          <Icon size={20} papicon={!!item.papicon}>\n            {item.papicon ? item.papicon : item.icon}\n          </Icon>\n        ) : null}\n        <Typography>\n          {item.title}\n        </Typography>\n      </Stack>\n    ) : null\n  );\n\n  return (\n    <ListComponent\n      contentInsetAdjustmentBehavior={ignoreHeaderHeight ? 'never' : contentInsetAdjustmentBehavior}\n      style={[{\n        flex: 1, height: \"100%\", width: \"100%\",\n        backgroundColor: colors.background,\n        paddingTop: runsIOS26 && contentInsetAdjustmentBehavior !== 'automatic' ? headerHeight : 0\n      }, style]}\n      data={data}\n      contentContainerStyle={[{ padding: 16 }, contentContainerStyle]}\n      keyExtractor={(item, index) => `${item.type}-${index}`}\n      renderItem={renderItemComponent}\n      {...rest}\n    />\n  )\n};\n\nexport default TableFlatList;"
  },
  {
    "path": "ui/components/Task.tsx",
    "content": "import React from 'react';\nimport Stack from './Stack';\nimport Typography from './Typography';\nimport { formatHTML } from '@/utils/format/html';\nimport { useTheme } from '@react-navigation/native';\nimport adjust from '@/utils/adjustColor';\nimport { Text } from 'react-native';\n\nimport { formatDistanceToNow, formatDistanceToNowStrict } from 'date-fns';\nimport * as DateLocale from 'date-fns/locale';\nimport i18n from '@/utils/i18n';\nimport { LinearGradient } from 'expo-linear-gradient';\nimport { Papicons } from '@getpapillon/papicons';\nimport Icon from './Icon';\nimport { Dynamic } from './Dynamic';\nimport { Animation } from '../utils/Animation';\nimport { LinearTransition } from 'react-native-reanimated';\nimport { PapillonAppearIn, PapillonAppearOut } from '../utils/Transition';\nimport { t } from 'i18next';\nimport { Platform } from 'react-native';\nimport { ListTouchable } from '../new/List';\n\ninterface TaskProps {\n  subject: string;\n  emoji: string;\n  title: string;\n  color: string;\n  description: string;\n  date: Date;\n  completed: boolean;\n  hasAttachments: boolean;\n  magic?: string;\n  onToggle: () => void;\n  onPress: () => void;\n}\n\nconst Task: React.FC<TaskProps> = ({\n  subject,\n  emoji,\n  title,\n  color,\n  description,\n  date,\n  completed,\n  hasAttachments,\n  magic,\n  onToggle,\n  onPress\n}) => {\n  const theme = useTheme();\n  const tintedColor = adjust(color, theme.dark ? 0.3 : -0.3);\n\n  function formatDistanceDay(date: Date): string {\n    // if yesterday, today or tomorrow\n    const today = new Date();\n    const yesterday = new Date(today);\n    yesterday.setDate(today.getDate() - 1);\n    const tomorrow = new Date(today);\n    tomorrow.setDate(today.getDate() + 1);\n\n    if (date.toDateString() === yesterday.toDateString()) {\n      return i18n.t(\"Yesterday\").toLowerCase();\n    } else if (date.toDateString() === today.toDateString()) {\n      return i18n.t(\"Today\").toLowerCase();\n    } else if (date.toDateString() === tomorrow.toDateString()) {\n      return i18n.t(\"Tomorrow\").toLowerCase();\n    }\n\n    return formatDistanceToNow(date, { addSuffix: true, locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS })\n  }\n\n  return (\n    <ListTouchable onPress={onPress}>\n      <Stack animated layout={Animation(LinearTransition, \"list\")} card radius={20} style={{ borderColor: theme.colors.text + \"32\", borderWidth: Platform.OS === \"android\" ? 0 : 1, backgroundColor: (Platform.OS === 'android' && !theme.dark) ? \"#FFF\" : theme.colors.item, elevation: 2, overflow: \"hidden\" }}>\n        <Stack animated layout={Animation(LinearTransition, \"list\")} padding={[16, 14]} gap={12} radius={20} style={{ overflow: \"hidden\" }}>\n          {Platform.OS !== \"android\" && (\n            <LinearGradient\n              colors={[color, theme.colors.card]}\n              style={{\n                position: \"absolute\",\n                top: 0,\n                left: 0,\n              right: 0,\n              height: 100,\n              zIndex: -1,\n              opacity: 0.1\n            }}\n          /> )}\n\n          {/* Subejct */}\n          <Stack direction=\"horizontal\" gap={8} hAlign='center'>\n            {/* Emoji container */}\n            <Text style={{ fontSize: 22 }}>\n              {emoji}\n            </Text>\n            {/* Name */}\n            <Stack inline flex direction=\"horizontal\" gap={4} hAlign='center'>\n              <Typography nowrap variant='body1' weight='semibold' color={tintedColor}>\n                {subject}\n              </Typography>\n\n              {/* Attachments */}\n              {hasAttachments && (\n                <Icon size={18} fill={tintedColor}>\n                  <Papicons name=\"link\" />\n                </Icon>\n              )}\n            </Stack>\n            {/* Date */}\n            <Typography nowrap variant='body2' weight='medium' color={\"secondary\"}>\n              {formatDistanceDay(date)}\n            </Typography>\n          </Stack>\n\n          {/* Content */}\n          <Stack animated layout={Animation(LinearTransition, \"list\")}>\n            <Typography numberOfLines={3} variant='title' weight='medium'>\n              {formatHTML(description)}\n            </Typography>\n          </Stack>\n\n          {/* Bottom */}\n          <Stack animated layout={Animation(LinearTransition, \"list\")} direction=\"horizontal\" gap={8} hAlign='center'>\n            <Stack inline flex hAlign='start' vAlign='center'>\n              {/* Magic */}\n              {magic && (\n                <Dynamic animated>\n                  <Stack\n                    animated\n                    direction=\"horizontal\"\n                    gap={6}\n                    hAlign='center'\n                    vAlign='center'\n                    padding={[12, 6]}\n                    radius={12}\n                    backgroundColor={tintedColor + \"20\"}\n                  >\n                    <Papicons name='sparkles' size={22} color={tintedColor} style={{ marginLeft: -2 }} />\n                    <Typography color={tintedColor} variant='body1' weight='semibold'>\n                      {magic}\n                    </Typography>\n                  </Stack>\n                </Dynamic>\n              )}\n            </Stack>\n            <Stack animated layout={Animation(LinearTransition, \"list\")} radius={300} inline hAlign='end' vAlign='center' style={{ overflow: Platform.OS === \"android\" ? \"hidden\" : undefined }}>\n              <ListTouchable scaleTo={0.8} animated layout={Animation(LinearTransition, \"list\")} onPress={onToggle}>\n                <Stack\n                  animated\n                  layout={Animation(LinearTransition, \"list\")}\n                  card\n                  backgroundColor={completed ? tintedColor : undefined}>\n                  <Stack\n                    animated\n                    layout={Animation(LinearTransition, \"list\")}\n                    padding={[completed ? 12 : 8, 8]}\n                    direction='horizontal'\n                    gap={6}\n                    radius={100}\n                    hAlign='center'\n                    style={{ overflow: \"hidden\" }}\n                  >\n                    <Icon size={24} opacity={completed ? 1 : 0.5} fill={completed ? \"#FFF\" : undefined}>\n                      <Papicons name='check' />\n                    </Icon>\n                    {completed &&\n                      <Dynamic animated>\n                        <Typography color='#FFF'>\n                          Terminé\n                        </Typography>\n                      </Dynamic>\n                    }\n                  </Stack>\n                </Stack>\n              </ListTouchable>\n            </Stack>\n          </Stack>\n        </Stack>\n      </Stack>\n    </ListTouchable >\n  );\n};\n\nexport default Task;\n"
  },
  {
    "path": "ui/components/Typography.tsx",
    "content": "import React from \"react\";\nimport { DimensionValue, StyleSheet, Text, TextProps, TextStyle, View, StyleProp } from \"react-native\";\nimport { useTheme } from \"@react-navigation/native\";\nimport { screenOptions } from \"@/utils/theme/ScreenOptions\";\nimport SkeletonView from \"@/ui/components/SkeletonView\";\n\nconst FONT_FAMILIES = {\n  regular: \"regular\",\n  medium: \"medium\",\n  semibold: \"semibold\",\n  bold: \"bold\",\n} as const;\n\nexport const VARIANTS = StyleSheet.create({\n  body1: {\n    fontSize: 16,\n    fontFamily: FONT_FAMILIES.medium,\n    lineHeight: 20,\n  },\n  body2: {\n    fontSize: 15,\n    fontFamily: FONT_FAMILIES.semibold,\n    lineHeight: 19,\n  },\n  caption: {\n    fontSize: 14,\n    fontFamily: FONT_FAMILIES.regular,\n    lineHeight: 19,\n    letterSpacing: 0.1,\n  },\n  button: {\n    fontSize: 16,\n    fontFamily: FONT_FAMILIES.bold,\n    lineHeight: 24,\n  },\n  title: {\n    fontSize: 17,\n    fontFamily: FONT_FAMILIES.semibold,\n    lineHeight: 22,\n  },\n  navigation: {\n    fontSize: screenOptions.headerTitleStyle.fontSize || 18,\n    fontFamily: FONT_FAMILIES.semibold,\n    lineHeight: 24,\n  },\n  header: {\n    fontSize: 19,\n    fontFamily: FONT_FAMILIES.bold,\n    letterSpacing: 0.08,\n    lineHeight: 22,\n  },\n  h0: {\n    fontSize: 44,\n    fontFamily: FONT_FAMILIES.bold,\n    lineHeight: 56,\n  },\n  h1: {\n    fontSize: 32,\n    fontFamily: FONT_FAMILIES.bold,\n    lineHeight: 40,\n  },\n  h2: {\n    fontSize: 28,\n    fontFamily: FONT_FAMILIES.bold,\n    lineHeight: 34,\n  },\n  h3: {\n    fontSize: 24,\n    fontFamily: FONT_FAMILIES.bold,\n    lineHeight: 30,\n  },\n  h4: {\n    fontSize: 20,\n    fontFamily: FONT_FAMILIES.bold,\n    lineHeight: 26,\n  },\n  h5: {\n    fontSize: 18,\n    fontFamily: FONT_FAMILIES.semibold,\n    lineHeight: 32,\n  },\n  h6: {\n    fontSize: 17,\n    fontFamily: FONT_FAMILIES.bold,\n    lineHeight: 32,\n  },\n});\n\nconst ALIGNMENT_STYLES = StyleSheet.create({\n  left: { textAlign: \"left\" },\n  center: { textAlign: \"center\" },\n  right: { textAlign: \"right\" },\n  justify: { textAlign: \"justify\" },\n});\n\nconst WEIGHT_STYLES = StyleSheet.create({\n  regular: { fontFamily: FONT_FAMILIES.regular },\n  medium: { fontFamily: FONT_FAMILIES.medium },\n  semibold: { fontFamily: FONT_FAMILIES.semibold },\n  bold: { fontFamily: FONT_FAMILIES.bold },\n});\n\nconst STATIC_COLORS = {\n  light: \"#FFFFFF\",\n  danger: \"#DC1400\",\n} as const;\n\nconst FLEX_ALIGN_MAP = {\n  left: \"flex-start\",\n  center: \"center\",\n  right: \"flex-end\",\n  justify: \"stretch\",\n} as const;\n\nconst ITALIC_STYLE = { transform: [{ skewX: \"-13deg\" }] };\n\nexport type Variant = keyof typeof VARIANTS;\ntype Color = \"primary\" | \"text\" | \"secondary\" | \"light\" | \"danger\";\ntype Alignment = keyof typeof ALIGNMENT_STYLES;\n\nexport interface TypographyProps extends TextProps {\n  variant?: Variant;\n  color?: Color | string;\n  align?: Alignment;\n  style?: StyleProp<TextStyle>;\n  inline?: boolean;\n  nowrap?: boolean;\n  weight?: keyof typeof WEIGHT_STYLES;\n  skeleton?: boolean;\n  skeletonLines?: number;\n  skeletonWidth?: DimensionValue;\n  italic?: boolean;\n}\n\nconst arePropsEqual = (prev: TypographyProps, next: TypographyProps) => {\n  if (prev.children !== next.children) return false;\n  if (prev.variant !== next.variant) return false;\n  if (prev.color !== next.color) return false;\n  if (prev.align !== next.align) return false;\n  if (prev.weight !== next.weight) return false;\n  if (prev.italic !== next.italic) return false;\n  if (prev.inline !== next.inline) return false;\n  if (prev.nowrap !== next.nowrap) return false;\n  if (prev.skeleton !== next.skeleton) return false;\n\n  if (prev.style === next.style) return true;\n\n  if (Array.isArray(prev.style) && Array.isArray(next.style)) {\n    if (prev.style.length !== next.style.length) return false;\n    for (let i = 0; i < prev.style.length; i++) {\n      if (prev.style[i] !== next.style[i]) return false;\n    }\n    return true;\n  }\n\n  return false;\n};\n\nconst Typography = React.memo(({\n  variant = \"body1\",\n  color = \"text\",\n  align = \"left\",\n  inline = false,\n  nowrap = false,\n  weight,\n  style,\n  skeleton = false,\n  skeletonLines = 1,\n  skeletonWidth,\n  italic = false,\n  children,\n  ...rest\n}: TypographyProps) => {\n  const { colors } = useTheme();\n\n  if (skeleton) {\n    const variantStyles = VARIANTS[variant];\n    const fontSize = variantStyles.fontSize;\n    const lineHeight = variantStyles.lineHeight;\n    const spacer = (lineHeight - fontSize) / 2;\n\n    const skeletons = [];\n    for (let i = 0; i < skeletonLines; i++) {\n      let width: DimensionValue = \"100%\";\n      if (skeletonWidth !== undefined) {\n        if (typeof skeletonWidth === \"number\") {\n          width = skeletonWidth * (1 - (i / 5));\n        } else if (typeof skeletonWidth === \"string\" && skeletonWidth.endsWith(\"%\")) {\n          const val = parseFloat(skeletonWidth);\n          width = `${val * (1 - (i / 5))}%`;\n        }\n      } else if (typeof children === \"string\") {\n        width = `${(children.length * 2) * (1 - (i / 5))}%`;\n      }\n\n      skeletons.push(\n        <SkeletonView\n          key={i}\n          style={{\n            width,\n            minWidth: 50,\n            height: fontSize,\n            borderRadius: 4,\n            marginTop: spacer,\n            marginBottom: spacer,\n          }}\n        />\n      );\n    }\n\n    return (\n      <View\n        style={[\n          style,\n          { flexDirection: \"column\", alignItems: FLEX_ALIGN_MAP[align] }\n        ]}\n        {...rest}\n      >\n        {skeletons}\n      </View>\n    );\n  }\n\n  const textColor =\n    color === \"primary\" ? colors.primary :\n      color === \"text\" ? colors.text :\n        color === \"secondary\" ? colors.text :\n          color === \"light\" ? STATIC_COLORS.light :\n            color === \"danger\" ? STATIC_COLORS.danger :\n              color;\n\n  const secondaryOpacity = color === \"secondary\" ? { opacity: 0.5 } : undefined;\n\n  const combinedStyle = [\n    VARIANTS[variant],\n    ALIGNMENT_STYLES[align],\n    { color: textColor },\n    secondaryOpacity,\n    weight && WEIGHT_STYLES[weight],\n    italic && ITALIC_STYLE,\n    style\n  ];\n\n  return (\n    <Text\n      {...rest}\n      style={combinedStyle}\n      numberOfLines={nowrap ? 1 : rest.numberOfLines}\n    >\n      {children}\n    </Text>\n  );\n}, arePropsEqual);\n\nTypography.displayName = \"Typography\";\n\nexport default Typography;"
  },
  {
    "path": "ui/components/ViewContainer.tsx",
    "content": "import React from 'react';\nimport { View } from 'react-native';\nimport getCorners from '../utils/Corners';\nimport { useTheme } from '@react-navigation/native';\n\nexport default function ViewContainer({ children }: Readonly<{ children: React.ReactNode }>) {\n    const corners = getCorners();\n    const { colors } = useTheme();\n\n    return (\n        <View\n            style={{\n                flex: 1,\n                borderRadius: corners,\n                backgroundColor: colors.background\n            }}\n        >\n            {children}\n        </View>\n    )\n}"
  },
  {
    "path": "ui/hooks/useKeyboardHeight.ts",
    "content": "import { useAnimatedKeyboard } from 'react-native-reanimated';\n\nexport const useKeyboardHeight = () => {\n  const keyboard = useAnimatedKeyboard();\n  return keyboard.height;\n};\n"
  },
  {
    "path": "ui/native/NativeSwitch.tsx",
    "content": "import { Platform, Switch } from \"react-native\"\nimport { Host, Switch as AndroidSwitch } from '@expo/ui/jetpack-compose';\n\ntype NativeSwitchProps = {\n  value: boolean\n  onValueChange: (value: boolean) => void\n  disabled?: boolean\n}\n\nconst NativeSwitch: React.FC<NativeSwitchProps> = ({ value, onValueChange, disabled }) => {\n  if(Platform.OS === \"android\") {\n    return (\n      <Host matchContents>\n        <AndroidSwitch\n          value={value}\n          onCheckedChange={onValueChange}\n          disabled={disabled}\n        />\n      </Host>\n    )\n  }\n\n  return (\n    <Switch\n      value={value}\n      onValueChange={onValueChange}\n      disabled={disabled}\n    />\n  )\n}\n\nexport default NativeSwitch"
  },
  {
    "path": "ui/new/Button.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport React from \"react\";\nimport { ViewStyle } from \"react-native\";\n\nimport Ripple from \"./RippleEffect\";\nimport Typography from \"./Typography\";\n\nexport default function Button({ label, onPress, disabled = false, variant = \"primary\", fullWidth = false, leading, trailing, gap = 10, height = 50, color }: { label: string; onPress: () => void; disabled?: boolean; variant?: \"primary\" | \"secondary\" | \"outlined\" | \"ghost\" | \"text\"; fullWidth?: boolean; leading?: React.ReactNode; trailing?: React.ReactNode, gap?: number, height?: number, color?: string }) {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const ButtonVariants = {\n    primary: {\n      backgroundColor: disabled ? colors.text + \"22\" : (color ?? colors.primary),\n    },\n    secondary: {\n      backgroundColor: color ? color + '18' : colors.text + \"18\",\n    },\n    outlined: {\n      backgroundColor: \"transparent\",\n      borderWidth: 1,\n      borderColor: disabled ? colors.text + \"44\" : color ?? colors.primary,\n    },\n    ghost: {\n      backgroundColor: disabled ? colors.text + \"22\" : color ?? colors.primary + \"22\",\n    },\n    text: {\n      backgroundColor: \"transparent\",\n    }\n  };\n\n  const TextVariants = {\n    primary: {\n      variant: \"title\",\n      color: \"white\"\n    },\n    secondary: {\n      variant: \"title\",\n      color: disabled ? \"textSecondary\" : color ?? \"textPrimary\"\n    },\n    outlined: {\n      variant: \"title\",\n      color: disabled ? \"textSecondary\" : color ?? \"primary\"\n    },\n    ghost: {\n      variant: \"title\",\n      color: disabled ? \"textSecondary\" : color ?? \"primary\"\n    },\n    text: {\n      variant: \"title\",\n      color: disabled ? \"textSecondary\" : color ?? \"primary\"\n    }\n  };\n\n  const RippleVariants = {\n    primary: {\n      rippleColor: \"#FFFFFF55\",\n    },\n    secondary: {\n      rippleColor: colors.text + \"22\",\n    },\n    outlined: {\n      rippleColor: colors.primary + \"55\",\n    },\n    ghost: {\n      rippleColor: colors.primary + \"22\",\n    },\n    text: {\n      rippleColor: colors.primary + \"22\",\n    }\n  };\n\n  return (\n    <Ripple\n      style={[\n        ButtonVariants[variant] as ViewStyle,\n        {\n          paddingHorizontal: 20,\n          height: height,\n          justifyContent: \"center\",\n          alignItems: \"center\",\n          borderRadius: 500,\n          gap: 10,\n          width: fullWidth ? \"100%\" : \"auto\",\n          flexDirection: \"row\",\n          gap: gap,\n          pointerEvents: disabled ? \"none\" : \"auto\"\n        },\n      ]}\n      rippleColor={RippleVariants[variant].rippleColor}\n      onTap={() => {\n        requestAnimationFrame(() => {\n          onPress();\n        });\n      }}\n    >\n      {leading}\n      <Typography {...TextVariants[variant]}>{label}</Typography>\n      {trailing}\n    </Ripple>\n  );\n}"
  },
  {
    "path": "ui/new/Divider.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport React from \"react\";\nimport { View } from \"react-native\";\n\nexport default function Divider({ height = 1, ghost = false, color }: { height?: number, ghost?: boolean, color?: string }) {\n  const { colors } = useTheme();\n\n  const backgroundColor = ghost ? \"transparent\" : color ? color : colors.border;\n\n  return (\n    <View style={{ height, backgroundColor: backgroundColor, width: \"100%\" }} />\n  )\n}"
  },
  {
    "path": "ui/new/List.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport { FlashList } from \"@shopify/flash-list\";\nimport React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Platform, StyleSheet, TouchableNativeFeedback, TouchableOpacity, View } from \"react-native\";\nimport Reanimated, { createAnimatedComponent, LinearTransition } from 'react-native-reanimated';\n\nimport { Animation } from \"../utils/Animation\";\nimport { PapillonAppearIn, PapillonAppearOut } from \"../utils/Transition\";\nimport Typography from \"./Typography\";\nimport { LegendList } from \"@legendapp/list\";\n\ntype MarkerProps = {\n  children?: React.ReactNode;\n};\n\ntype ListItemProps = MarkerProps & {\n  id?: string;\n  animated?: boolean;\n  onPress?: () => void;\n  containerStyle?: any;\n  style?: any;\n  entering?: any;\n  exiting?: any;\n};\n\ntype ListViewProps = MarkerProps & {\n  id?: string;\n  style?: any;\n};\n\ntype ListRuntimeItemContext = {\n  renderItem: (props: ListItemProps) => React.ReactNode;\n} | null;\n\nconst ListRuntimeItemContext = React.createContext<ListRuntimeItemContext>(null);\n\nconst isType = (child, component, name) => {\n  return child?.type && (child.type === component || child.type.displayName === name);\n};\n\nconst getComponentTypeName = (type: any) => {\n  return type?.displayName || type?.name || type?.type?.displayName || type?.type?.name || \"\";\n};\n\nconst shouldApplyDefaultLeadingOpacity = (node: React.ReactNode) => {\n  if (!React.isValidElement(node)) {\n    return false;\n  }\n  const typeName = getComponentTypeName(node.type);\n  if (typeName === \"Icon\") {\n    return true;\n  }\n  return typeof typeName === \"string\" && typeName.toLowerCase().includes(\"papicon\");\n};\n\nconst withDefaultLeadingOpacity = (node: React.ReactNode): React.ReactNode => {\n  if (Platform.OS !== \"ios\" || node == null) {\n    return node;\n  }\n\n  if (Array.isArray(node)) {\n    return node.map((child) => withDefaultLeadingOpacity(child));\n  }\n\n  if (!React.isValidElement(node)) {\n    return node;\n  }\n\n  if (node.type === React.Fragment) {\n    return React.cloneElement(node, {\n      children: React.Children.map(node.props.children, (child) => withDefaultLeadingOpacity(child)),\n    });\n  }\n\n  if (node.props?.opacity !== undefined || !shouldApplyDefaultLeadingOpacity(node)) {\n    return node;\n  }\n\n  return React.cloneElement(node, { opacity: 0.6 });\n};\n\nconst splitItemChildren = (children: React.ReactNode) => {\n  let leading = null;\n  let trailing = null;\n  const main = [];\n\n  React.Children.forEach(children, (child) => {\n    if (!child) {\n      return;\n    }\n\n    const type = child.type;\n    if (type === Leading || type?.displayName === \"List.Leading\") {\n      leading = withDefaultLeadingOpacity(child.props.children);\n    } else if (type === Trailing || type?.displayName === \"List.Trailing\") {\n      trailing = child.props.children;\n    } else {\n      main.push(child);\n    }\n  });\n\n  return { leading, trailing, main };\n};\n\nconst renderListRow = ({\n  itemProps,\n  leading,\n  trailing,\n  main,\n  isFirst,\n  isLast,\n  gapBefore = 0,\n  listAnimated,\n  colors,\n}) => {\n  const ItemComponent = listAnimated ? Reanimated.View : View;\n  const entering = itemProps.entering ?? (itemProps.animated ? PapillonAppearIn : undefined);\n  const exiting = itemProps.exiting ?? (itemProps.animated ? PapillonAppearOut : undefined);\n\n  return (\n    <ItemComponent\n      style={[\n        styles.rowContainer,\n        isFirst && styles.first,\n        isLast && styles.last,\n        { marginTop: gapBefore },\n        Platform.OS === \"android\"\n          ? { marginBottom: !isLast ? 4 : 0 }\n          : {\n              borderColor: colors.border,\n              backgroundColor: colors.border,\n              borderLeftWidth: 1,\n              borderRightWidth: 1,\n              borderBottomWidth: 1,\n              borderTopWidth: isFirst ? 1 : 0,\n              shadowColor: \"#000000\",\n              shadowOffset: { width: 0, height: 0 },\n              shadowOpacity: 0.1,\n              shadowRadius: 2,\n              elevation: 1,\n              overflow: \"visible\",\n              ...itemProps.containerStyle,\n            },\n      ]}\n      layout={itemProps.animated ? Animation(LinearTransition, \"list\") : undefined}\n      entering={entering}\n      exiting={exiting}\n    >\n      <ListTouchable {...(itemProps.onPress ? { onPress: itemProps.onPress } : {})}>\n        <View\n          style={[\n            styles.row,\n            isFirst && styles.first,\n            isLast && styles.last,\n            {\n              backgroundColor: colors.item,\n              overflow: \"hidden\",\n              ...itemProps.style,\n            },\n            Platform.OS === \"android\"\n              ? {\n                  borderTopLeftRadius: isFirst ? 20 : 8,\n                  borderTopRightRadius: isFirst ? 20 : 8,\n                  borderBottomLeftRadius: isLast ? 20 : 8,\n                  borderBottomRightRadius: isLast ? 20 : 8,\n                }\n              : null,\n          ]}\n        >\n          {leading && <View style={styles.leading}>{leading}</View>}\n          <View style={styles.body}>{main}</View>\n          {trailing && <View style={styles.trailing}>{trailing}</View>}\n        </View>\n      </ListTouchable>\n    </ItemComponent>\n  );\n};\n\nconst Item: React.FC<ListItemProps> = (props) => {\n  const runtimeContext = useContext(ListRuntimeItemContext);\n  if (runtimeContext) {\n    return runtimeContext.renderItem(props);\n  }\n  return props.children;\n};\nItem.displayName = \"List.Item\";\n\nconst Leading: React.FC<MarkerProps> = ({ children }) => children;\nLeading.displayName = \"List.Leading\";\n\nconst Trailing: React.FC<MarkerProps> = ({ children }) => children;\nTrailing.displayName = \"List.Trailing\";\n\nconst Section: React.FC<MarkerProps & { id?: string }> = ({ children }) => children;\nSection.displayName = \"List.Section\";\n\nconst SectionTitle: React.FC<MarkerProps & { id?: string }> = ({ children }) => children;\nSectionTitle.displayName = \"List.SectionTitle\";\n\nconst Label: React.FC<MarkerProps> = ({ children }) => children;\nLabel.displayName = \"List.Label\";\n\nconst ViewItem: React.FC<ListViewProps> = ({ children }) => children;\nViewItem.displayName = \"List.View\";\n\nconst RawRuntimeItem: React.FC<{\n  index: number;\n  total: number;\n  itemProps: ListItemProps;\n  animated: boolean;\n  colors: any;\n}> = ({ index, total, itemProps, animated, colors }) => {\n  const parsed = splitItemChildren(itemProps.children);\n  return renderListRow({\n    itemProps,\n    leading: parsed.leading,\n    trailing: parsed.trailing,\n    main: parsed.main,\n    isFirst: index === 0,\n    isLast: total > 0 ? index === total - 1 : false,\n    listAnimated: animated,\n    colors,\n  });\n};\n\nconst RawRuntimeRenderer: React.FC<{\n  item: any;\n  animated: boolean;\n  colors: any;\n}> = ({ item, animated, colors }) => {\n  const indexCursorRef = useRef(0);\n  const countRef = useRef(0);\n  const [count, setCount] = useState(0);\n\n  indexCursorRef.current = 0;\n\n  const runtimeValue = useMemo(() => ({\n    renderItem: (itemProps: ListItemProps) => {\n      const index = indexCursorRef.current;\n      indexCursorRef.current += 1;\n      return (\n        <RawRuntimeItem\n          key={itemProps.id ?? `raw-item-${index}`}\n          index={index}\n          total={count}\n          itemProps={itemProps}\n          animated={animated}\n          colors={colors}\n        />\n      );\n    },\n  }), [animated, colors, count]);\n\n  useEffect(() => {\n    if (countRef.current !== indexCursorRef.current) {\n      countRef.current = indexCursorRef.current;\n      if (count !== countRef.current) {\n        setCount(countRef.current);\n      }\n    }\n  });\n\n  return (\n    <View style={{ marginTop: item.gapBefore }}>\n      <ListRuntimeItemContext.Provider value={runtimeValue}>\n        {item.rawItem}\n      </ListRuntimeItemContext.Provider>\n    </View>\n  );\n};\n\nconst MemoizedRawRuntimeRenderer = React.memo(RawRuntimeRenderer);\n\nconst List = ({ children, animated = false, gap = 12, ...rest }) => {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const data = useMemo(() => {\n    const parseItem = (item, index) => {\n      const { leading, trailing, main } = splitItemChildren(item.props.children);\n\n      return {\n        kind: \"item\",\n        id: item.props.id || `item-${index}`,\n        leading,\n        trailing,\n        main,\n        itemProps: item.props,\n      };\n    };\n\n    const parseRawItem = (rawItem, index) => {\n      return {\n        kind: \"raw\",\n        id: rawItem?.props?.id || rawItem?.key?.toString?.() || `raw-${index}`,\n        rawItem,\n      };\n    };\n\n    const parseSectionTitle = (sectionTitle, index, sectionId = null) => {\n      let label = null;\n      const main = [];\n\n      React.Children.forEach(sectionTitle.props.children, (child) => {\n        if (!child) {\n          return;\n        }\n\n        const type = child.type;\n        if (type === Label || type?.displayName === \"List.Label\") {\n          label = child.props.children;\n        } else {\n          main.push(child);\n        }\n      });\n\n      return {\n        kind: \"sectionTitle\",\n        id: sectionTitle.props.id || `section-title-${index}`,\n        sectionId,\n        label,\n        main,\n      };\n    };\n\n    const parseViewItem = (viewItem, index, sectionId = null) => {\n      return {\n        kind: \"view\",\n        id: viewItem.props.id || `view-${index}`,\n        sectionId,\n        viewProps: viewItem.props,\n        main: viewItem.props.children,\n      };\n    };\n\n    const withSectionFlags = (items, sectionId) => {\n      return items.map((item, index) => ({\n        ...item,\n        sectionId,\n        isFirstInSection: index === 0,\n        isLastInSection: index === items.length - 1,\n      }));\n    };\n\n    const output = [];\n    const topLevel = React.Children.toArray(children).filter(Boolean);\n    let implicitItems = [];\n    let implicitSectionId = null;\n\n    const flushImplicit = () => {\n      if (!implicitItems.length || !implicitSectionId) {\n        implicitItems = [];\n        implicitSectionId = null;\n        return;\n      }\n      output.push(...withSectionFlags(implicitItems, implicitSectionId));\n      implicitItems = [];\n      implicitSectionId = null;\n    };\n\n    topLevel.forEach((child, index) => {\n      if (isType(child, SectionTitle, \"List.SectionTitle\")) {\n        flushImplicit();\n        output.push(parseSectionTitle(child, index));\n        return;\n      }\n\n      if (isType(child, Section, \"List.Section\")) {\n        flushImplicit();\n        const sectionId = child.props?.id || `section-${index}`;\n        const sectionChildren = React.Children.toArray(child.props.children).filter(Boolean);\n        const sectionEntries = [];\n        let sectionItemCursor = 0;\n\n        sectionChildren.forEach((sectionChild, sectionChildIndex) => {\n          if (isType(sectionChild, SectionTitle, \"List.SectionTitle\")) {\n            sectionEntries.push(parseSectionTitle(sectionChild, `${index}-title-${sectionChildIndex}`, sectionId));\n            return;\n          }\n\n          if (isType(sectionChild, ViewItem, \"List.View\")) {\n            sectionEntries.push(parseViewItem(sectionChild, `${index}-view-${sectionChildIndex}`, sectionId));\n            return;\n          }\n\n          if (isType(sectionChild, Item, \"List.Item\")) {\n            sectionEntries.push(parseItem(sectionChild, `${index}-${sectionItemCursor}`));\n            sectionItemCursor += 1;\n            return;\n          }\n\n          sectionEntries.push(parseRawItem(sectionChild, `${index}-raw-${sectionChildIndex}`));\n        });\n\n        const sectionItems = sectionEntries.filter((entry) => entry.kind === \"item\" || entry.kind === \"raw\");\n        const sectionItemsWithFlags = withSectionFlags(sectionItems, sectionId);\n        let sectionItemIndex = 0;\n        const normalizedSectionEntries = sectionEntries.map((entry) => {\n          if (entry.kind !== \"item\" && entry.kind !== \"raw\") {\n            return entry;\n          }\n          const normalized = sectionItemsWithFlags[sectionItemIndex];\n          sectionItemIndex += 1;\n          return normalized;\n        });\n\n        output.push(...normalizedSectionEntries);\n        return;\n      }\n\n      if (isType(child, ViewItem, \"List.View\")) {\n        flushImplicit();\n        output.push(parseViewItem(child, `${index}`));\n        return;\n      }\n\n      if (isType(child, Item, \"List.Item\")) {\n        if (!implicitSectionId) {\n          implicitSectionId = `section-implicit-${index}`;\n        }\n        implicitItems.push(parseItem(child, `${index}-${implicitItems.length}`));\n        return;\n      }\n\n      flushImplicit();\n      output.push({\n        ...parseRawItem(child, `${index}`),\n        sectionId: `section-raw-${index}`,\n        isFirstInSection: true,\n        isLastInSection: true,\n      });\n    });\n\n    flushImplicit();\n\n    return output.map((entry, index) => {\n      if (index === 0) {\n        return { ...entry, gapBefore: 0 };\n      }\n\n      const previous = output[index - 1];\n      if (entry.kind === \"sectionTitle\") {\n        return { ...entry, gapBefore: gap };\n      }\n\n      if (entry.kind === \"view\") {\n        return { ...entry, gapBefore: 0 };\n      }\n\n      if (entry.isFirstInSection && previous.kind === \"sectionTitle\") {\n        if (previous.sectionId === entry.sectionId) {\n          return { ...entry, gapBefore: 6 };\n        }\n        return { ...entry, gapBefore: 0 };\n      }\n\n      if (entry.isFirstInSection && previous.sectionId !== entry.sectionId) {\n        return { ...entry, gapBefore: gap };\n      }\n\n      return { ...entry, gapBefore: 0 };\n    });\n  }, [children, gap]);\n\n  const ListComponent = Reanimated.FlatList;\n\n  const keyExtractor = useCallback((item) => item.id, []);\n\n  const renderItem = useCallback(({ item }) => {\n    if (item.kind === \"sectionTitle\") {\n      return (\n        <View style={[styles.sectionTitleContainer, { marginTop: item.gapBefore }]}>\n          {item.main}\n          {item.label && (\n            <Typography variant=\"body1\" weight=\"semibold\" color=\"textSecondary\">\n              {item.label}\n            </Typography>\n          )}\n        </View>\n      );\n    }\n\n    if (item.kind === \"view\") {\n      return <View style={item.viewProps.style}>{item.main}</View>;\n    }\n\n    if (item.kind === \"raw\") {\n      return <MemoizedRawRuntimeRenderer item={item} animated={animated} colors={colors} />;\n    }\n\n    return renderListRow({\n      itemProps: item.itemProps,\n      leading: item.leading,\n      trailing: item.trailing,\n      main: item.main,\n      isFirst: item.isFirstInSection,\n      isLast: item.isLastInSection,\n      gapBefore: item.gapBefore,\n      listAnimated: animated,\n      colors,\n    });\n  }, [animated, colors]);\n\n  const contentContainerStyle = useMemo(\n    () => [rest.contentContainerStyle, styles.listContentContainer],\n    [rest.contentContainerStyle],\n  );\n  const listStyle = useMemo(() => [rest.style, styles.list], [rest.style]);\n  const removeClippedSubviews = rest.removeClippedSubviews ?? Platform.OS === \"android\";\n  const initialNumToRender = rest.initialNumToRender ?? 10;\n  const maxToRenderPerBatch = rest.maxToRenderPerBatch ?? 10;\n  const updateCellsBatchingPeriod = rest.updateCellsBatchingPeriod ?? 16;\n  const windowSize = rest.windowSize ?? 10;\n  const estimatedItemSize = rest.estimatedItemSize ?? 74;\n  const nonAnimatedListPerfProps = animated ? null : { estimatedItemSize };\n\n  return (\n    <ListComponent\n      showsVerticalScrollIndicator={Platform.OS === \"ios\" ? rest.showsVerticalScrollIndicator ?? true : false}\n      itemLayoutAnimation={animated ? Animation(LinearTransition, \"list\") : undefined}\n      data={data}\n      keyExtractor={keyExtractor}\n      renderItem={renderItem}\n      {...rest}\n      removeClippedSubviews={removeClippedSubviews}\n      initialNumToRender={initialNumToRender}\n      maxToRenderPerBatch={maxToRenderPerBatch}\n      updateCellsBatchingPeriod={updateCellsBatchingPeriod}\n      windowSize={windowSize}\n      {...nonAnimatedListPerfProps}\n      contentContainerStyle={contentContainerStyle}\n      style={listStyle}\n    />\n  );\n};\n\nexport const ListTouchable = React.memo(({ ...props }) => {\n  const parentBlockPress = useContext(ListTouchableContext);\n  const blockOwnPressRef = useRef(false);\n  const theme = useTheme();\n  const hasOnPress = typeof props.onPress === \"function\";\n\n  const blockOwnPress = useCallback(() => {\n    blockOwnPressRef.current = true;\n  }, []);\n\n  const handlePress = useCallback((event) => {\n    if (blockOwnPressRef.current) {\n      blockOwnPressRef.current = false;\n      return;\n    }\n    props.onPress?.(event);\n  }, [props.onPress]);\n\n  if (!hasOnPress) {\n    return (\n      <ListTouchableContext.Provider value={parentBlockPress}>\n        <View {...props}>{props.children}</View>\n      </ListTouchableContext.Provider>\n    );\n  }\n\n  if (Platform.OS === \"android\") {\n    return (\n      <ListTouchableContext.Provider value={blockOwnPress}>\n        <TouchableNativeFeedback\n          background={TouchableNativeFeedback.Ripple(theme.colors.text + \"22\", true)}\n          useForeground\n          {...props}\n          onPress={(event) => {\n            parentBlockPress?.();\n            handlePress(event);\n          }}\n        >\n          {props.children}\n        </TouchableNativeFeedback>\n      </ListTouchableContext.Provider>\n    );\n  }\n\n  return (\n    <ListTouchableContext.Provider value={blockOwnPress}>\n      <TouchableOpacity\n        activeOpacity={0.5}\n        {...props}\n        onPress={(event) => {\n          parentBlockPress?.();\n          handlePress(event);\n        }}\n      >\n        {props.children}\n      </TouchableOpacity>\n    </ListTouchableContext.Provider>\n  );\n});\n\nconst ListTouchableContext = React.createContext(null);\n\nList.Item = Item;\nList.Leading = Leading;\nList.Trailing = Trailing;\nList.Section = Section;\nList.SectionTitle = SectionTitle;\nList.Label = Label;\nList.View = ViewItem;\n\nconst styles = StyleSheet.create({\n  rowContainer: {},\n  row: { flexDirection: \"row\", alignItems: \"center\", paddingVertical: Platform.OS === \"android\" ? 14 : 12, paddingHorizontal: 16 },\n  leading: { marginRight: 16 },\n  body: { flex: 1 },\n  trailing: { marginLeft: 16 },\n  sectionTitleContainer: { paddingHorizontal: Platform.OS === \"android\" ? 16 : 4, paddingVertical: 6, paddingBottom: Platform.OS === \"android\" ? 6 : 4, flexDirection: \"row\", alignItems: \"center\", gap: Platform.OS === \"android\" ? 10 : 8, marginRight: 6 },\n  first: {\n    borderTopLeftRadius: 20,\n    borderTopRightRadius: 20,\n  },\n  last: {\n    borderBottomLeftRadius: 20,\n    borderBottomRightRadius: 20,\n  },\n  listContentContainer: {\n    gap: 0,\n    overflow: \"visible\",\n  },\n  list: {\n    overflow: \"visible\",\n  },\n});\n\nexport default List;\n"
  },
  {
    "path": "ui/new/ListTouchableContext.ts",
    "content": "import React from \"react\";\n\nexport type ListTouchableBlockPressController = {\n  block: () => void;\n  unblock: () => void;\n};\n\nexport const ListTouchableBlockPressContext = React.createContext<ListTouchableBlockPressController | null>(null);\n"
  },
  {
    "path": "ui/new/RippleEffect.tsx",
    "content": "import React from 'react';\nimport { InteractionManager, ViewStyle } from 'react-native';\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler';\nimport Animated, {\n  Easing,\n  runOnJS,\n  useAnimatedStyle,\n  useSharedValue,\n  withSpring,\n  withTiming\n} from 'react-native-reanimated';\n\ninterface RippleProps {\n  style?: ViewStyle;\n  onTap?: () => void;\n  rippleColor?: string;\n  pressScale?: number; // Target scale (e.g., 0.9)\n  scaleDuration?: number; // How fast the view shrinks/grows\n  children: React.ReactNode;\n}\n\nconst Ripple: React.FC<RippleProps> = ({\n  style,\n  onTap,\n  rippleColor = 'rgba(0,0,0,0.1)',\n  pressScale = 0.96,\n  scaleDuration = 100,\n  children\n}) => {\n  const centerX = useSharedValue(0);\n  const centerY = useSharedValue(0);\n  const scale = useSharedValue(0);\n  const width = useSharedValue(0);\n  const height = useSharedValue(0);\n  const rippleOpacity = useSharedValue(1);\n\n  // Independent scale for the container\n  const containerScale = useSharedValue(1);\n\n  const handleTap = () => {\n    // InteractionManager ensures the JS thread is clear \n    // and animations have finished before navigating\n    InteractionManager.runAfterInteractions(() => {\n      onTap?.();\n    });\n  };\n\n  const gesture = Gesture.Tap()\n    .onBegin((event) => {\n      // 1. Position and Start Ripple\n      centerX.value = event.x;\n      centerY.value = event.y;\n      rippleOpacity.value = 1;\n      scale.value = 0;\n      scale.value = withTiming(1, { duration: 1000, easing: Easing.out(Easing.quad) });\n\n      // 2. Shrink the entire view independently\n      containerScale.value = withTiming(pressScale, { duration: scaleDuration / 2 });\n    })\n    .onEnd(() => {\n      runOnJS(handleTap)();\n    })\n    .onTouchesCancelled(() => {\n      rippleOpacity.value = withTiming(0, { duration: 700 });\n      containerScale.value = withSpring(1, { duration: scaleDuration * 5, dampingRatio: 0.4 });\n    })\n    .onFinalize(() => {\n      // 3. Reset everything\n      rippleOpacity.value = withTiming(0, { duration: 700 });\n      containerScale.value = withSpring(1, { duration: scaleDuration * 5, dampingRatio: 0.4 });\n    });\n\n  const rStyle = useAnimatedStyle(() => {\n    const circleRadius = Math.sqrt(width.value ** 2 + height.value ** 2);\n    return {\n      width: circleRadius * 2,\n      height: circleRadius * 2,\n      borderRadius: circleRadius,\n      opacity: rippleOpacity.value,\n      backgroundColor: rippleColor,\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      transform: [\n        { translateX: centerX.value - circleRadius },\n        { translateY: centerY.value - circleRadius },\n        { scale: scale.value },\n      ],\n    };\n  });\n\n  const containerAnimatedStyle = useAnimatedStyle(() => ({\n    transform: [{ scale: containerScale.value }],\n  }));\n\n  return (\n    <GestureDetector gesture={gesture}>\n      <Animated.View\n        onLayout={(e) => {\n          width.value = e.nativeEvent.layout.width;\n          height.value = e.nativeEvent.layout.height;\n        }}\n        style={[style, containerAnimatedStyle, { overflow: 'hidden' }]}\n      >\n        {children}\n        <Animated.View style={rStyle} />\n      </Animated.View>\n    </GestureDetector>\n  );\n};\n\nexport default Ripple;"
  },
  {
    "path": "ui/new/TextInput.tsx",
    "content": "import { useTheme } from '@react-navigation/native';\nimport React from 'react';\nimport { TextInput,View } from 'react-native';\n\nconst PapillonTextInput = ({ height = 54, color, ...props }) => {\n  const { colors } = useTheme();\n\n  return (\n    <View\n      style={{\n        backgroundColor: colors.background,\n        borderColor: colors.text + \"20\",\n        borderWidth: 1,\n        borderRadius: 16,\n        borderCurve: 'continuous',\n        height: height,\n        width: '100%',\n        ...props.contentContainerStyle,\n      }}\n    >\n      <TextInput\n        style={{\n          flex: 1,\n          paddingHorizontal: 16,\n          color: colors.text,\n          fontFamily: 'medium',\n          fontSize: 17,\n        }}\n        placeholderTextColor={colors.text + \"80\"}\n        cursorColor={color ?? colors.primary}\n        selectionColor={color ?? colors.primary}\n        selectionHandleColor={color ?? colors.primary}\n        {...props}\n      />\n    </View>\n  );\n}\n\nexport default PapillonTextInput;"
  },
  {
    "path": "ui/new/Typography.tsx",
    "content": "import { useTheme } from \"@react-navigation/native\";\nimport React from \"react\";\nimport { Platform, Text } from \"react-native\";\n\nconst WEIGHTS = [\"light\", \"regular\", \"medium\", \"semibold\", \"bold\"];\n\nconst VARIANTS: Record<string, Record<string, string | number>> = {\n  \"h1\": {\n    fontFamily: WEIGHTS[4],\n    fontSize: 34,\n    lineHeight: \"120%\"\n  },\n  \"h2\": {\n    fontFamily: WEIGHTS[4],\n    fontSize: 28,\n    lineHeight: \"120%\"\n  },\n  \"h3\": {\n    fontFamily: WEIGHTS[4],\n    fontSize: 24,\n    lineHeight: \"120%\"\n  },\n  \"h4\": {\n    fontFamily: WEIGHTS[4],\n    fontSize: 21,\n    lineHeight: \"130%\"\n  },\n  \"h5\": {\n    fontFamily: WEIGHTS[4],\n    fontSize: 19,\n    lineHeight: \"130%\"\n  },\n  \"title\": {\n    fontFamily: WEIGHTS[4],\n    fontSize: Platform.OS === \"android\" ? 18 : 17,\n    lineHeight: \"130%\"\n  },\n  \"action\": {\n    fontFamily: WEIGHTS[2],\n    fontSize: 17,\n    lineHeight: \"140%\"\n  },\n  \"body1\": {\n    fontFamily: Platform.OS === \"android\" ? WEIGHTS[3] : WEIGHTS[2],\n    fontSize: 15,\n    lineHeight: \"140%\"\n  },\n  \"body2\": {\n    fontFamily: WEIGHTS[2],\n    fontSize: 14,\n    lineHeight: \"140%\"\n  },\n  \"caption\": {\n    fontFamily: WEIGHTS[2],\n    fontSize: 13,\n    lineHeight: \"140%\",\n    letterSpacing: 0.1\n  }\n};\n\nconst fixLineHeight = (style: Record<string, string | number>) => {\n  if (!style) { return {}; }\n  if (style.lineHeight && style.fontSize) {\n    if (typeof style.lineHeight === \"string\" && style.lineHeight.endsWith(\"%\")) {\n      style.lineHeight = (parseFloat(style.lineHeight) / 100) * style.fontSize;\n    }\n  }\n  return style;\n};\n\nconst ALIGNMENTS: Record<string, string> = {\n  \"left\": \"left\",\n  \"center\": \"center\",\n  \"right\": \"right\"\n}\n\nexport default function Typography({ variant = \"body1\", color = \"textPrimary\", align = \"left\", weight, ...rest }: any) {\n  const theme = useTheme();\n  const { colors } = theme;\n\n  const COLORS: Record<string, string> = {\n    \"textPrimary\": colors.text,\n    \"textSecondary\": colors.text + \"88\",\n    \"primary\": colors.tint,\n  }\n\n  const variantStyle = fixLineHeight(variant in VARIANTS ? VARIANTS[variant] : VARIANTS[\"body1\"]);\n  const textColor = color in COLORS ? COLORS[color] : color;\n  const textAlign = align in ALIGNMENTS ? ALIGNMENTS[align] : ALIGNMENTS[\"left\"];\n  const textWeight = weight ? weight : variantStyle.fontFamily;\n\n  const style = [\n    variantStyle,\n    { color: textColor, textAlign, fontFamily: textWeight },\n    fixLineHeight(rest?.style)\n  ]\n\n  return (\n    <Text {...rest} style={style} />\n  );\n}"
  },
  {
    "path": "ui/new/symbols/PapillonLogo.tsx",
    "content": "import * as React from \"react\";\nimport type { SvgProps } from \"react-native-svg\";\nimport Svg, { Path } from \"react-native-svg\";\nconst PapillonLogo = (props: SvgProps) => (\n  <Svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={148}\n    height={32}\n    fill=\"#29947A\"\n    viewBox=\"0 0 148 32\"\n    {...props}\n  >\n    <Path\n      fillRule=\"evenodd\"\n      d=\"M6.313 7.452c.16.696.38 1.419.66 2.153-.715.072-1.394.183-2.025.334-1.163.276-2.241.702-3.098 1.319-.864.622-1.59 1.511-1.795 2.688s.18 2.265.782 3.15c.598.878 1.468 1.654 2.467 2.317q.28.186.58.365c1.952 1.172 4.528 2.103 7.365 2.611 3.201.574 6.246.267 8.56-.413q.19-.055.375-.115c-.34 1.457-.571 2.848-.68 4.08-.106 1.202-.104 2.344.073 3.28.134.707.469 1.82 1.431 2.381q.192.12.42.204c1.16.43 2.226-.12 2.887-.615.719-.537 1.412-1.33 2.053-2.237 1.297-1.831 2.606-4.441 3.664-7.398s1.706-5.81 1.871-8.06c.082-1.114.053-2.174-.158-3.056-.17-.711-.552-1.66-1.427-2.17a2.5 2.5 0 0 0-.439-.213c-1.039-.385-2.032-.033-2.749.416-.732.459-1.421 1.161-2.054 1.98a18 18 0 0 0-1.32 1.998 21.5 21.5 0 0 0-3.487-5.912c-1.784-2.162-3.78-3.913-5.69-5.05a14 14 0 0 0-.818-.457C12.696.484 11.601.106 10.554.019 9.5-.07 8.38.137 7.48.906l.031.037c-.887.765-1.297 1.87-1.44 2.945-.145 1.093-.042 2.318.243 3.564m6.065-3.525q.293.15.597.332c1.522.915 3.235 2.392 4.827 4.32a18.7 18.7 0 0 1 2.348 3.615c-1.87-1.016-4.22-1.82-6.785-2.28-1.008-.18-2.003-.3-2.967-.36a14 14 0 0 1-1.004-2.83c-.225-.986-.27-1.804-.19-2.406.083-.615.269-.851.353-.923.08-.068.285-.187.784-.145.509.042 1.199.246 2.037.677m-.624 15.27c-2.53-.454-4.712-1.265-6.265-2.19a11 11 0 0 1-.41-.259c-.787-.522-1.306-1.027-1.596-1.454-.285-.418-.287-.658-.268-.763s.1-.33.509-.624c.416-.3 1.074-.594 1.988-.811.81-.193 1.759-.31 2.808-.338.52.861 1.119 1.711 1.793 2.527 1.596 1.935 3.485 3.29 5.36 4.13-1.225.079-2.554.026-3.919-.218m1.106-6.09c2.53.453 4.712 1.264 6.266 2.189q.212.128.41.259c.786.522 1.305 1.027 1.595 1.454q.058.085.1.16a4 4 0 0 1-.46.072c-.65.063-1.472-.004-2.392-.254-1.838-.5-3.934-1.698-5.643-3.768l-.128-.156q.126.02.252.044m14.75-.643c.417-.542.777-.897 1.054-1.109.074.426.101 1.05.04 1.875-.137 1.881-.7 4.44-1.688 7.2-.989 2.76-2.176 5.089-3.26 6.62-.409.577-.773.999-1.074 1.282-.058-.508-.06-1.206.017-2.078.177-2.01.749-4.629 1.659-7.259q.072-.155.125-.325c.08-.173.135-.347.175-.508.944-2.527 2.002-4.466 2.952-5.698\"\n      clipRule=\"evenodd\"\n    />\n    <Path\n      d=\"M35.405 25.853V3.536h8.643q2.583 0 4.465.788 1.914.757 2.935 2.46 1.052 1.67 1.052 4.412 0 2.616-1.148 4.382-1.148 1.733-3.158 2.616-1.977.85-4.529.85h-3.987v6.81zm4.273-10.59h3.924q2.105 0 3.38-1.01 1.276-1.008 1.276-3.088 0-1.86-1.084-2.774-1.053-.945-3.317-.946h-4.179zM58.72 26.043a8.1 8.1 0 0 1-2.87-.505q-1.308-.536-2.105-1.607-.797-1.104-.797-2.774 0-1.23.446-2.08a4.4 4.4 0 0 1 1.244-1.45 6.5 6.5 0 0 1 1.818-.946 14 14 0 0 1 2.105-.536 25 25 0 0 1 2.488-.347q1.371-.126 2.934-.284 0-.945-.383-1.607a2.46 2.46 0 0 0-1.084-1.04q-.702-.38-1.722-.379-1.084 0-1.882.379-.798.346-1.212 1.197h-4.242q.318-1.89 1.403-2.994 1.116-1.102 2.711-1.576a10.8 10.8 0 0 1 3.285-.504q2.584 0 4.147.914t2.264 2.679q.702 1.734.702 4.255v9.015h-3.134l-.789-2.017a5.6 5.6 0 0 1-1.69 1.387 6.4 6.4 0 0 1-1.882.63 8.8 8.8 0 0 1-1.755.19m.862-3.342q1.211 0 2.169-.441.989-.442 1.562-1.26.607-.852.67-2.018v-.63q-.702.062-1.403.157-.702.063-1.435.158-.702.063-1.404.189-1.18.157-1.914.662-.733.504-.733 1.387 0 .693.383 1.103.415.377.988.536.574.157 1.117.157M69.992 32V9.242h3.326l.789 2.143q1.02-1.26 2.36-1.828 1.34-.6 2.966-.599 2.488 0 4.115 1.135 1.626 1.134 2.424 3.089.83 1.923.829 4.318 0 2.46-.861 4.413-.83 1.923-2.52 3.058-1.658 1.103-4.178 1.103a8.3 8.3 0 0 1-2.105-.252 7 7 0 0 1-1.722-.694 6.1 6.1 0 0 1-1.244-1.04V32zm8.548-9.645q1.563 0 2.456-.694a3.8 3.8 0 0 0 1.276-1.765 7 7 0 0 0 .383-2.301q0-1.26-.415-2.364a3.7 3.7 0 0 0-1.308-1.828q-.924-.694-2.456-.694-1.403 0-2.392.694a4.3 4.3 0 0 0-1.467 1.765 6 6 0 0 0-.478 2.395q0 1.292.478 2.396a4.1 4.1 0 0 0 1.435 1.734q.99.661 2.488.662M88.602 25.853V9.242h4.178v16.611zm2.105-18.408q-1.18 0-1.914-.693-.702-.726-.702-1.829 0-1.134.734-1.86.765-.724 1.914-.724 1.051 0 1.818.725.797.693.797 1.828 0 1.134-.765 1.86-.735.693-1.882.693M100.406 26.043q-1.85 0-3.094-.63-1.212-.663-1.818-1.955-.574-1.292-.574-3.215V3.536h4.178v15.887q0 .85.16 1.482.19.63.638.977.477.346 1.339.346a3.9 3.9 0 0 0 1.212-.189 4 4 0 0 0 1.053-.599l.977 3.184c-.341.645-.999.925-1.743 1.135a9.2 9.2 0 0 1-2.328.284M110.398 26.043q-1.85 0-3.094-.63-1.212-.663-1.818-1.955-.574-1.292-.574-3.215V3.536h4.178v15.887q0 .85.16 1.482.19.63.638.977.478.346 1.339.346a3.9 3.9 0 0 0 1.212-.189 4 4 0 0 0 1.053-.599l1.371 3.184q-1.02.82-2.137 1.135a9.2 9.2 0 0 1-2.328.284M122.623 26.074q-2.584 0-4.466-1.04a7.4 7.4 0 0 1-2.934-2.932q-1.02-1.922-1.021-4.539 0-2.647 1.053-4.57a7.34 7.34 0 0 1 2.934-2.963q1.882-1.072 4.402-1.072 2.551 0 4.401 1.072a7.3 7.3 0 0 1 2.903 3.026q1.02 1.923 1.02 4.57 0 2.585-1.02 4.508a7.04 7.04 0 0 1-2.839 2.931q-1.85 1.01-4.433 1.009m-.064-3.783q1.53 0 2.456-.662a3.68 3.68 0 0 0 1.371-1.733 6.3 6.3 0 0 0 .415-2.301q0-1.23-.415-2.333a3.9 3.9 0 0 0-1.339-1.796q-.925-.694-2.488-.694-1.5 0-2.456.694a4.14 4.14 0 0 0-1.372 1.796 6.4 6.4 0 0 0-.414 2.333q0 1.23.414 2.332a3.96 3.96 0 0 0 1.372 1.734q.957.63 2.456.63M132.308 25.853V9.242h3.357l.789 2.017a4.76 4.76 0 0 1 1.563-1.355 7.4 7.4 0 0 1 1.882-.725 8 8 0 0 1 1.786-.221q2.392 0 3.763 1.04 1.372 1.04 1.946 2.806.606 1.733.606 3.877v9.172h-4.178V17.28q0-.852-.128-1.64a4.7 4.7 0 0 0-.478-1.481 2.6 2.6 0 0 0-.989-1.04q-.638-.41-1.69-.41-1.34 0-2.265.694-.893.661-1.34 1.796-.446 1.135-.446 2.553v8.101z\"\n    />\n  </Svg>\n);\nexport default PapillonLogo;"
  },
  {
    "path": "ui/package.json",
    "content": "{\n  \"name\": \"papillon-ui\",\n  \"version\": \"0.1.0\",\n  \"description\": \"The official Papillon UI library\",\n  \"main\": \"./index.js\",\n  \"author\": \"PapillonApp\",\n  \"license\": \"GPL-3.0-or-later\"\n}\n"
  },
  {
    "path": "ui/utils/Animation.ts",
    "content": "import { Easing, FadeInUp, FadeOut } from \"react-native-reanimated\";\n\nconst SPRING_CONFIG = { mass: 1, damping: 20, stiffness: 300 };\n\ntype AnimationStyle = \"default\" | \"spring\" | \"list\" | \"smooth\" | \"fade\";\n\nconst PapillonSpring = (a: any) =>\n  a?.springify().mass(SPRING_CONFIG.mass).damping(SPRING_CONFIG.damping).stiffness(SPRING_CONFIG.stiffness);\n\nconst PapillonList = (a: any) =>\n  a?.duration(300).easing(Easing.out(Easing.exp));\n\nconst PapillonReanimatedSpring = (a: any) =>\n  a?.springify({ duration: 300 });\n\nconst PapillonFade = {\n  in: FadeInUp.duration(200).easing(Easing.out(Easing.ease)).withInitialValues({\n    opacity: 0,\n  }),\n  out: FadeOut.duration(150).easing(Easing.in(Easing.ease)),\n};\n\nexport const Animation = (animation?: any, style?: AnimationStyle) => {\n  switch (style) {\n  case \"spring\":\n    return PapillonSpring(animation);\n  case \"list\":\n    return PapillonList(animation);\n  case \"smooth\":\n    return PapillonReanimatedSpring(animation);\n  default:\n    return PapillonSpring(animation);\n  }\n};\n\nexport const PapillonFadeIn = PapillonFade.in;\nexport const PapillonFadeOut = PapillonFade.out;\n"
  },
  {
    "path": "ui/utils/Corners.ts",
    "content": "import * as Device from \"expo-device\";\n\nconst defaultRadius = 5.0;\n\nconst radiuses = [\n  {\n    devices: \"X, Xs, Xs max, 11 pron 11 pro max\",\n    radius: 39.0,\n  },\n  {\n    devices: \"Xr, 11\",\n    radius: 41.5,\n  },\n  {\n    devices: \"12 mini, 13 mini\",\n    radius: 45.0,\n  },\n  {\n    devices: \"12, 12 pro, 13, 13 pro, 14, 16e\",\n    radius: 47.33,\n  },\n  {\n    devices: \"12 pro max, 13 pro max, 14 plus\",\n    radius: 53.33,\n  },\n  {\n    devices: \"14 pro, 14 pro max, 15, 15 plus, 15 pro, 15 pro max\",\n    radius: 57.0,\n  },\n  {\n    devices: \"16, 16 pro, 16 pro max, 16 plus\",\n    radius: 61.0,\n  },\n  {\n    devices: \"iPhone17,3, iPhone17,4\", // iphone 16 & 16 plus\n    radius: 55.0,\n  },\n  {\n    devices: \"iPhone17,1, iPhone17,2\", // iphone 16 pro & 16 pro max\n    radius: 62.0,\n  },\n  {\n    devices: \"pixel 3\",\n    radius: 20.0,\n  },\n  {\n    devices: \"ipad (10th generation)\",\n    radius: 22.0,\n  },\n];\n\n\nlet cachedCornerRadius: number | undefined;\n\nconst getCorners = (): number => {\n  if (cachedCornerRadius !== undefined) {return cachedCornerRadius;}\n\n  let modelName = Device.modelName;\n  if (!modelName || modelName.toLowerCase().includes(\"simulator\")) {\n    modelName = Device.deviceName?.toLowerCase() || null;\n  }\n  if (!modelName) {\n    cachedCornerRadius = defaultRadius;\n    return cachedCornerRadius;\n  }\n\n  // make device name lowercase\n  let device = modelName.toLowerCase();\n  // if device starts with \"iphone\" remove it\n  device = device.replace(\"iphone\", \"\");\n  device = device.trim();\n\n  const corner = device.length > 0 && radiuses.find((r) => r.devices.includes(device));\n  cachedCornerRadius = corner ? corner.radius : defaultRadius;\n  return cachedCornerRadius;\n};\n\nexport default getCorners;"
  },
  {
    "path": "ui/utils/Duration.ts",
    "content": "export function formatDuration(seconds: number): string {\n  const hours = Math.floor(seconds / 3600);\n  const minutes = Math.floor((seconds % 3600) / 60);\n  if (hours && minutes) {return `${hours}h ${minutes} ${minutes > 1 ? \"mins\" : \"min\"}`;}\n  if (hours) {return `${hours} ${hours > 1 ? \"heures\" : \"heure\"}`;}\n  return `${minutes} ${minutes > 1 ? \"mins\" : \"min\"}`;\n}"
  },
  {
    "path": "ui/utils/IsLiquidGlass.ts",
    "content": "import { Platform } from \"react-native\";\n\nexport const runsIOS26 = (Platform.OS === \"ios\" && parseInt(Platform.Version) >= 26);\n// return (Platform.OS === \"ios\" && parseInt(Platform.Version) >= 26);"
  },
  {
    "path": "ui/utils/Transition.ts",
    "content": "import { Platform } from \"react-native\";\nimport { Easing, withSpring, withTiming } from \"react-native-reanimated\";\n\nexport const PapillonZoomIn = () => {\n  \"worklet\";\n  return {\n    initialValues: {\n      opacity: 0,\n      transform: [{ scale: 0.1 }],\n    },\n    animations: {\n      opacity: withTiming(1, {\n        duration: 300,\n        easing: Easing.bezier(0.3, 0.3, 0, 1),\n      }),\n      transform: [\n        {\n          scale: withTiming(1, {\n            duration: 300,\n            easing: Easing.bezier(0.3, 0.3, 0, 1),\n          }),\n        },\n      ],\n    },\n  };\n};\n\nexport const PapillonZoomOut = () => {\n  \"worklet\";\n  return {\n    initialValues: {\n      opacity: 1,\n      transform: [{ scale: 1 }],\n    },\n    animations: {\n      opacity: withTiming(0, {\n        duration: 300,\n        easing: Easing.bezier(0.3, 0.3, 0, 1),\n      }),\n      transform: [\n        {\n          scale: withTiming(0.1, {\n            duration: 300,\n            easing: Easing.bezier(0.3, 0.3, 0, 1),\n          }),\n        },\n      ],\n    },\n  };\n};\n\nexport const PapillonAppearIn = () => {\n  \"worklet\";\n  return {\n    initialValues: {\n      opacity: Platform.OS === 'android' ? 1 : 0,\n      transform: [{ scale: 0.9 }],\n    },\n    animations: {\n      opacity: Platform.OS === 'android' ? 1 : withTiming(1, {\n        duration: 300,\n        easing: Easing.bezier(0.3, 0.3, 0, 1),\n      }),\n      transform: [\n        {\n          scale: withTiming(1, {\n            duration: 300,\n            easing: Easing.bezier(0.3, 0.3, 0, 1),\n          }),\n        },\n      ],\n    },\n  };\n};\n\nexport const PapillonAppearOut = () => {\n  \"worklet\";\n  return {\n    initialValues: {\n      opacity: 1,\n      transform: Platform.OS === 'android' ? [] : [{ scale: 1 }],\n    },\n    animations: {\n      opacity: withTiming(0, {\n        duration: 300,\n        easing: Easing.bezier(0.3, 0.3, 0, 1),\n      }),\n      transform: Platform.OS === 'android' ? [] : [\n        {\n          scale: withTiming(0.9, {\n            duration: 300,\n            easing: Easing.bezier(0.3, 0.3, 0, 1),\n          }),\n        },\n      ],\n    },\n  };\n};\n\nexport const PapillonSpringIn = () => {\n  \"worklet\";\n  return {\n    initialValues: {\n      opacity: Platform.OS === 'android' ? 1 : 0,\n      transform: [{ scale: 0.8 }],\n    },\n    animations: {\n      opacity: Platform.OS === 'android' ? 1 : withSpring(1, {\n        duration: 200\n      }),\n      transform: [\n        {\n          scale: withSpring(1, {\n            duration: 350,\n            dampingRatio: 0.8\n          }),\n        },\n      ],\n    },\n  };\n};\n\nexport const PapillonSpringOut = () => {\n  \"worklet\";\n  return {\n    initialValues: {\n      opacity: 1,\n      transform: Platform.OS === 'android' ? [] : [{ scale: 1 }],\n    },\n    animations: {\n      opacity: withSpring(0, {\n        duration: 200\n      }),\n      transform: Platform.OS === 'android' ? [] : [\n        {\n          scale: withSpring(0.8, {\n            duration: 200\n          }),\n        },\n      ],\n    },\n  };\n};\n\nexport const PapillonAndroidMenuIn = () => {\n  \"worklet\";\n  return {\n    initialValues: {\n      opacity: 0,\n      transform: [{ scaleX: 0.8 }, { scaleY: 0.5 }],\n    },\n    animations: {\n      opacity: withSpring(1, {\n        duration: 100,\n      }),\n      transform: [\n        {\n          scaleX: withSpring(1, {\n            duration: 200,\n          })\n        },\n        {\n          scaleY: withSpring(1, {\n            duration: 250,\n          })\n        }\n      ],\n    },\n  };\n};"
  },
  {
    "path": "utils/adjustColor.ts",
    "content": "const cache = new Map<string, string>();\n\nexport default function adjust(hex: string, percent: number) {\n  if (!hex) return hex;\n\n  const key = `${hex}_${percent}`;\n  if (cache.has(key)) {\n    return cache.get(key)!;\n  }\n\n\n  hex = hex.replace(/^#/, '');\n\n  if (hex.length === 3) {\n    hex = hex.split('').map(c => c + c).join('');\n  }\n\n  const num = parseInt(hex, 16);\n  let r = num >> 16;\n  let g = (num >> 8) & 0x00FF;\n  let b = num & 0x0000FF;\n\n  const t = percent < 0 ? 0 : 255;\n  const p = Math.abs(percent);\n\n  r = Math.round(r + (t - r) * p);\n  g = Math.round(g + (t - g) * p);\n  b = Math.round(b + (t - b) * p);\n\n  const result = `#${((1 << 24) + (r << 16) + (g << 8) + b)\n    .toString(16)\n    .slice(1)}`;\n\n  cache.set(key, result);\n\n  // check if result is valid HEX\n  if (!/^#[0-9A-F]{6}$/i.test(result)) {\n    console.error(`Invalid HEX color: ${result}`, 'adjustColor');\n    return hex;\n  }\n\n  return result;\n}\n"
  },
  {
    "path": "utils/attachments/helper.ts",
    "content": "export const URLToBase64 = (url: string): Promise<string> =>\n  fetch(url, {\n    headers: {\n      \"User-Agent\":\n        \"Mozilla/5.0 (iPhone; CPU iPhone OS 19_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 PRONOTE Mobile APP Version/2.0.11\",\n    },\n  })\n    .then((response) => response.blob())\n    .then(\n      (blob) =>\n        new Promise<string>((resolve, reject) => {\n          const reader = new FileReader();\n          reader.onloadend = () => {\n            if (typeof reader.result === \"string\") {\n              const base64 = reader.result.split(\",\")[1];\n              resolve(base64);\n            } else {\n              resolve(\"\");\n            }\n          };\n          reader.onerror = reject;\n          reader.readAsDataURL(blob);\n        })\n    );\n"
  },
  {
    "path": "utils/chats/colors.ts",
    "content": "import { Colors } from \"../subjects/colors\"\n\nexport function getProfileColorByName (name: string): string {\n  let hash = 0;\n  for (let i = 0; i < name.length; i++) {\n    hash = name.charCodeAt(i) + ((hash << 5) - hash);\n  }\n  const index = Math.abs(hash % Colors.length);\n  return Colors[index];\n}"
  },
  {
    "path": "utils/chats/initials.ts",
    "content": "export function getInitials(name: string): string {\n  let rgx = /(\\p{L})\\p{L}*|\\p{L}/gu;\n  let matches = [...name.matchAll(rgx)];\n\n  let initials = (\n    (matches.shift()?.[1] || '') + (matches.pop()?.[1] || '')\n  ).toUpperCase();\n\n  return initials;\n}"
  },
  {
    "path": "utils/colorCheck.ts",
    "content": "type RgbComponent = number;\ntype HexColor = string;\n\ninterface ContrastCheckResult {\n  contrastRatio: number;\n  isSufficient: boolean;\n}\n\nconst hexToRgb = (hex: HexColor): [RgbComponent, RgbComponent, RgbComponent] => {\n  const cleanHex = hex.startsWith('#') ? hex.slice(1) : hex;\n  let r: RgbComponent;\n  let g: RgbComponent;\n  let b: RgbComponent;\n\n  if (cleanHex.length === 3) {\n    r = parseInt(cleanHex[0] + cleanHex[0], 16);\n    g = parseInt(cleanHex[1] + cleanHex[1], 16);\n    b = parseInt(cleanHex[2] + cleanHex[2], 16);\n  } else if (cleanHex.length === 6) {\n    r = parseInt(cleanHex.substring(0, 2), 16);\n    g = parseInt(cleanHex.substring(2, 4), 16);\n    b = parseInt(cleanHex.substring(4, 6), 16);\n  } else {\n    throw new Error(`Invalid hex color format: ${hex}`);\n  }\n\n  if (isNaN(r) || isNaN(g) || isNaN(b)) {\n      throw new Error(`Failed to parse hex color: ${hex}`);\n  }\n\n  return [r, g, b];\n};\n\nconst calculateLuminance = (rgb: [RgbComponent, RgbComponent, RgbComponent]): number => {\n  const linearize = (c: RgbComponent): number => {\n    const sRGB = c / 255;\n    return sRGB <= 0.03928 \n      ? sRGB / 12.92 \n      : Math.pow((sRGB + 0.055) / 1.055, 2.4);\n  };\n\n  const [r, g, b] = rgb.map(linearize);\n  return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nconst calculateContrastRatio = (l1: number, l2: number): number => {\n  const [L_light, L_dark] = l1 > l2 ? [l1, l2] : [l2, l1];\n  return (L_light + 0.05) / (L_dark + 0.05);\n};\n\nexport const colorCheck = (\n  foreground: HexColor, \n  backgrounds: HexColor[]\n): boolean => {\n  const MIN_CONTRAST_RATIO = 4.5; \n\n  try {\n    const fgRgb = hexToRgb(foreground);\n    const fgLuminance = calculateLuminance(fgRgb);\n    \n    // Check if ANY background provides sufficient contrast\n    return backgrounds.some(bgHex => {\n      try {\n        const bgRgb = hexToRgb(bgHex);\n        const bgLuminance = calculateLuminance(bgRgb);\n        const contrastRatio = calculateContrastRatio(fgLuminance, bgLuminance);\n        \n        return contrastRatio >= MIN_CONTRAST_RATIO;\n      } catch (error) {\n        return false;\n      }\n    });\n\n  } catch (error) {\n    return false;\n  }\n};"
  },
  {
    "path": "utils/colors.ts",
    "content": "import { t } from \"i18next\";\n\nexport enum Colors {\n  PINK,\n  YELLOW,\n  GREEN,\n  PURPLE,\n  BLUE,\n  BLACK,\n}\n\nexport const AppColors = [\n  {\n    mainColor: \"#DD007D\",\n    backgroundColor: \"#FAD9EC\",\n    nameKey: \"Rose\",\n    colorEnum: Colors.PINK,\n  },\n  {\n    mainColor: \"#E8B048\",\n    backgroundColor: \"#FCF3E4\",\n    nameKey: \"Jaune\",\n    colorEnum: Colors.YELLOW,\n  },\n  {\n    mainColor: \"#26B290\",\n    backgroundColor: \"#DEF3EE\",\n    nameKey: \"Vert\",\n    colorEnum: Colors.GREEN,\n  },\n  {\n    mainColor: \"#C400DD\",\n    backgroundColor: \"#F6D9FA\",\n    nameKey: \"Violet\",\n    colorEnum: Colors.PURPLE,\n  },\n  {\n    mainColor: \"#48B7E8\",\n    backgroundColor: \"#E4F4FC\",\n    nameKey: \"Bleu\",\n    colorEnum: Colors.BLUE,\n  },\n  {\n    mainColor: \"#6D6D6D\",\n    backgroundColor: \"#E9E9E9\",\n    nameKey: \"Noir\",\n    colorEnum: Colors.BLACK,\n  },\n];\n"
  },
  {
    "path": "utils/endpoints.ts",
    "content": "// URL pour Magic+\nexport const MAGIC_URL =\n  \"https://raw.githubusercontent.com/PapillonApp/PapiAPI/refs/heads/main/magic/manifest.json\";"
  },
  {
    "path": "utils/format/formatSchoolName.ts",
    "content": "export function formatSchoolName(input: string): string {\n  if (!input) return \"\";\n\n  let name = input.trim();\n\n  // Normalize spaces\n  name = name.replace(/\\s+/g, \" \");\n\n  // Remove unwanted segments\n  name = name\n    .replace(/\\b(general et technologique|general|technologique|professionnel)\\b/gi, \"\")\n    .replace(/\\s+/g, \" \")\n    .trim();\n\n  // Normalize casing\n  name = name.toLowerCase();\n\n  // Replace keywords\n  name = name\n    .replace(/\\blycee\\b/g, \"Lycée\")\n    .replace(/\\bcollege\\b/g, \"Collège\");\n\n  // Capitalize words (except small words)\n  const SMALL_WORDS = [\"de\", \"du\", \"des\", \"la\", \"le\", \"les\", \"d'\", \"l'\"];\n\n  name = name\n    .split(\" \")\n    .map((word, i) => {\n      if (!word) return \"\";\n\n      // Handle apostrophes (d', l')\n      if (word.includes(\"'\")) {\n        return word\n          .split(\"'\")\n          .map((part, idx) => {\n            if (idx === 0 && SMALL_WORDS.includes(part + \"'\")) {\n              return part.toLowerCase();\n            }\n            return part.charAt(0).toUpperCase() + part.slice(1);\n          })\n          .join(\"'\");\n      }\n\n      if (SMALL_WORDS.includes(word) && i !== 0) {\n        return word.toLowerCase();\n      }\n\n      return word.charAt(0).toUpperCase() + word.slice(1);\n    })\n    .join(\" \");\n\n  // Final cleanup\n  name = name\n    .replace(/\\s+-\\s+/g, \" - \")\n    .replace(/\\s+,/g, \",\")\n    .replace(/\\s{2,}/g, \" \")\n    .trim();\n\n  return name;\n}"
  },
  {
    "path": "utils/format/html.ts",
    "content": "export const formatHTML = (html: string, nobreak: boolean = false) => {\n  // Remove all HTML tags\n  let text = html.replace(/<[^>]*>/g, '');\n\n  // Decode HTML entities\n  const entities: { [key: string]: string } = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\",\n    '&apos;': \"'\",\n    '&nbsp;': ' ',\n    // Add more entities as needed\n  };\n  text = text.replace(/&[a-zA-Z0-9#]+;/g, (entity) => {\n    if (entities[entity]) return entities[entity];\n    // Handle numeric entities\n    if (/^&#\\d+;/.test(entity)) {\n      return String.fromCharCode(Number(entity.replace(/[^0-9]/g, '')));\n    }\n    if (/^&#x[0-9a-fA-F]+;/.test(entity)) {\n      return String.fromCharCode(parseInt(entity.replace(/[^0-9a-fA-F]/g, ''), 16));\n    }\n    return entity;\n  });\n  if (nobreak) {\n    text = text.replace(/[\\r\\n]+/g, ' ');\n  }\n  return text;\n}"
  },
  {
    "path": "utils/generateId.ts",
    "content": "export function generateId(str?: string): string {\n  const input = str ?? \"\";\n  let hash = BigInt(\"0xcbf29ce484222325\");\n  const prime = BigInt(\"0x100000001b3\");\n\n  for (let i = 0; i < input.length; i++) {\n    hash ^= BigInt(input.charCodeAt(i));\n    hash *= prime;\n    hash &= BigInt(\"0xFFFFFFFFFFFFFFFF\");\n  }\n\n  return `id-${hash.toString(36)}`;\n}\n"
  },
  {
    "path": "utils/github/contributors.ts",
    "content": "\nexport interface Contributor {\n  login: string;\n  avatar_url: string;\n  html_url: string;\n  contributions: number;\n}\n\nexport async function getContributors (): Promise<Contributor[]> {\n  try {\n    const response = await fetch(\"https://api.github.com/repos/PapillonApp/Papillon/contributors\");\n    const allContributors: Contributor[] = await response.json();\n\n    return allContributors\n  } catch (error) {\n    console.error(\"Erreur lors de la récupération des contributeurs:\", error);\n    return [];\n  }\n}"
  },
  {
    "path": "utils/grades/algorithms/helpers.ts",
    "content": "import { Grade } from \"@/services/shared/grade\";\n\nexport type ScoreProperty = \"studentScore\" | \"averageScore\" | \"minScore\" | \"maxScore\";\n\nexport const getSubjectAverageByProperty = (\n  subject: Grade[],\n  property: ScoreProperty = \"studentScore\",\n  loop: boolean = false\n): number => {\n  let calcGradesSum = 0;\n  let calcOutOfSum = 0;\n\n  for (let i = 0; i < subject.length; i++) {\n    const grade = subject[i];\n    const targetScore = grade[property];\n\n    // Skip invalid grades\n    if (\n      !targetScore ||\n      targetScore.disabled ||\n      targetScore.value === null ||\n      targetScore.value < 0 ||\n      grade.coefficient === 0 ||\n      typeof targetScore.value !== \"number\" ||\n      !grade.outOf?.value\n    ) {\n      continue;\n    }\n\n    const coefficient = grade.coefficient || 1;\n    const outOfValue = grade.outOf.value;\n    const gradeValue = targetScore.value;\n\n    // Handle optional grades (only for student scores)\n    if (property === \"studentScore\" && grade.optional && !loop) {\n      const filteredSubject = subject.filter((_, idx) => idx !== i);\n      const avgWithout = getSubjectAverageByProperty(filteredSubject, property, true);\n      const avgWith = getSubjectAverageByProperty(subject, property, true);\n\n      // Only keep optional grade if it improves the average\n      if (avgWithout > avgWith) {\n        continue;\n      }\n    }\n\n    // Handle bonus grades (only for student scores)\n    if (property === \"studentScore\" && grade.bonus) {\n      const averageMoy = outOfValue / 2;\n      const newGradeValue = gradeValue - averageMoy;\n\n      if (newGradeValue >= 0) {\n        calcGradesSum += newGradeValue;\n        calcOutOfSum += 1;\n      }\n      continue;\n    }\n\n    // Normalize grades to /20 scale\n    if (gradeValue > 20 || (coefficient < 1 && outOfValue - 20 >= -5) || outOfValue > 20) {\n      const gradeOn20 = (gradeValue / outOfValue) * 20;\n      calcGradesSum += gradeOn20 * coefficient;\n      calcOutOfSum += 20 * coefficient;\n    } else {\n      calcGradesSum += gradeValue * coefficient;\n      calcOutOfSum += outOfValue * coefficient;\n    }\n  }\n\n  if (calcOutOfSum > 0) {\n    const result = Math.min((calcGradesSum / calcOutOfSum) * 20, 20);\n    return isNaN(result) ? -1 : result;\n  }\n\n  return -1;\n};\n\nexport const PapillonSubjectAvgByProperty = (\n  grades: Grade[],\n  property: ScoreProperty = \"studentScore\"\n): number => {\n  if (!grades?.length) {\n    return 0;\n  }\n\n  const groupedBySubject: Record<string, Grade[]> = {};\n  let countedSubjects = 0;\n  let totalAverage = 0;\n\n  // Group grades by subject\n  for (let i = 0; i < grades.length; i++) {\n    const grade = grades[i];\n    const key = grade.subjectId;\n    if (!groupedBySubject[key]) {\n      groupedBySubject[key] = [];\n    }\n    groupedBySubject[key].push(grade);\n  }\n\n  const subjects = Object.values(groupedBySubject);\n\n  // Calculate average for each subject\n  for (let i = 0; i < subjects.length; i++) {\n    const nAvg = getSubjectAverageByProperty(subjects[i], property);\n    if (nAvg !== -1) {\n      countedSubjects++;\n      totalAverage += nAvg;\n    }\n  }\n\n  return countedSubjects > 0 ? totalAverage / countedSubjects : 0;\n};\n"
  },
  {
    "path": "utils/grades/algorithms/median.ts",
    "content": "import { Grade } from \"@/services/shared/grade\";\n\nconst PapillonMedian = (grades: Grade[]): number => {\n  const validGrades = grades\n    .filter((grade) => \n      grade.studentScore?.value !== null && \n      grade.studentScore?.value !== undefined && \n      grade.outOf?.value !== null && \n      grade.outOf?.value !== undefined &&\n      !grade.studentScore.disabled &&\n      grade.coefficient !== 0 &&\n      grade.studentScore.value >= 0\n    )\n    .map((grade) => {\n      const coefficient = grade.coefficient || 1;\n      const outOfValue = grade.outOf.value!;\n      const gradeValue = grade.studentScore!.value!;\n      \n      // Normalize to /20 scale\n      let normalizedValue: number;\n      if (gradeValue > 20 || (coefficient < 1 && outOfValue - 20 >= -5) || outOfValue > 20) {\n        normalizedValue = (gradeValue / outOfValue) * 20;\n      } else {\n        normalizedValue = (gradeValue / outOfValue) * 20;\n      }\n      \n      return normalizedValue;\n    });\n\n  if (validGrades.length === 0) {\n    return 0;\n  }\n\n  validGrades.sort((a, b) => a - b);\n\n  const middle = Math.floor(validGrades.length / 2);\n\n  if (validGrades.length % 2 === 0) {\n    return (validGrades[middle - 1] + validGrades[middle]) / 2;\n  }\n  \n  return validGrades[middle];\n};\n\nexport default PapillonMedian;"
  },
  {
    "path": "utils/grades/algorithms/subject.ts",
    "content": "import { Grade } from \"@/services/shared/grade\";\nimport { ScoreProperty } from \"./helpers\";\n\nexport const getSubjectAverage = (\n  subject: Grade[],\n  loop: boolean = false,\n  key: ScoreProperty = \"studentScore\"\n): number => {\n  let calcGradesSum = 0;\n  let calcOutOfSum = 0;\n\n  for (let i = 0; i < subject.length; i++) {\n    const grade = subject[i];\n\n    // Skip invalid grades\n    if (\n      !grade[key] ||\n      grade[key].disabled ||\n      grade[key].value === null ||\n      grade[key].value < 0 ||\n      grade.coefficient === 0 ||\n      typeof grade[key].value !== \"number\" ||\n      !grade.outOf?.value\n    ) {\n      continue;\n    }\n\n    const coefficient = grade.coefficient || 1;\n    const outOfValue = grade.outOf.value;\n    const gradeValue = grade[key].value;\n\n    // Handle optional grades\n    if (grade.optional && !loop) {\n      const filteredSubject = subject.filter((_, idx) => idx !== i);\n      const avgWithout = getSubjectAverage(filteredSubject, true, key);\n      const avgWith = getSubjectAverage(subject, true, key);\n\n      // Only keep optional grade if it improves the average\n      if (avgWithout > avgWith) {\n        continue;\n      }\n    }\n\n    // Handle bonus grades\n    if (grade.bonus) {\n      const averageMoy = outOfValue / 2;\n      const newGradeValue = gradeValue - averageMoy;\n\n      if (newGradeValue >= 0) {\n        calcGradesSum += newGradeValue;\n        calcOutOfSum += 1;\n      }\n      continue;\n    }\n\n    // Normalize grades to /20 scale\n    if (gradeValue > 20 || (coefficient < 1 && outOfValue - 20 >= -5) || outOfValue > 20) {\n      const gradeOn20 = (gradeValue / outOfValue) * 20;\n      calcGradesSum += gradeOn20 * coefficient;\n      calcOutOfSum += 20 * coefficient;\n    } else {\n      calcGradesSum += gradeValue * coefficient;\n      calcOutOfSum += outOfValue * coefficient;\n    }\n  }\n\n  if (calcOutOfSum > 0) {\n    const result = Math.min((calcGradesSum / calcOutOfSum) * 20, 20);\n    return isNaN(result) ? -1 : result;\n  }\n\n  return -1;\n};\n\nconst PapillonSubjectAvg = (grades: Grade[], key: ScoreProperty = \"studentScore\"): number => {\n  if (!grades?.length) {\n    return 0;\n  }\n\n  const groupedBySubject: Record<string, Grade[]> = {};\n  let countedSubjects = 0;\n  let totalAverage = 0;\n\n  // Group grades by subject\n  for (let i = 0; i < grades.length; i++) {\n    const grade = grades[i];\n    const key = grade.subjectId;\n    if (!groupedBySubject[key]) {\n      groupedBySubject[key] = [];\n    }\n    groupedBySubject[key].push(grade);\n  }\n\n  const subjects = Object.values(groupedBySubject);\n\n  // Calculate average for each subject\n  for (let i = 0; i < subjects.length; i++) {\n    const nAvg = getSubjectAverage(subjects[i], false, key);\n    if (nAvg !== -1) {\n      countedSubjects++;\n      totalAverage += nAvg;\n    }\n  }\n\n  return countedSubjects > 0 ? totalAverage / countedSubjects : 0;\n};\n\nexport default PapillonSubjectAvg;"
  },
  {
    "path": "utils/grades/algorithms/time.ts",
    "content": "import { Grade } from \"@/services/shared/grade\";\nimport { ScoreProperty } from \"./helpers\";\n\nconst PapillonGradesAveragesOverTime = (algorithm: (grades: Grade[], key: ScoreProperty) => number, grades: Grade[], key: ScoreProperty = \"studentScore\") => {\n  const sortedGrades = grades.sort((a, b) => new Date(a.givenAt).getTime() - new Date(b.givenAt).getTime());\n\n  const averages: { date: Date; average: number }[] = [];\n\n  for (let i = 0; i < sortedGrades.length; i++) {\n    const currentGrades = sortedGrades.slice(0, i + 1);\n    const average = algorithm(currentGrades, key);\n    averages.push({ date: sortedGrades[i].givenAt, average });\n  }\n\n  return averages;\n};\n\nexport default PapillonGradesAveragesOverTime;"
  },
  {
    "path": "utils/grades/algorithms/weighted.ts",
    "content": "import { Grade } from \"@/services/shared/grade\";\nimport { ScoreProperty } from \"./helpers\";\n\nconst PapillonWeightedAvg = (grades: Grade[], key: ScoreProperty = \"studentScore\"): number => {\n  let calcGradesSum = 0;\n  let calcOutOfSum = 0;\n\n  grades.forEach((grade) => {\n    // Skip invalid grades\n    if (\n      !grade[key] ||\n      grade[key].disabled ||\n      grade[key].value === null ||\n      grade[key].value < 0 ||\n      grade.coefficient === 0 ||\n      typeof grade[key].value !== \"number\" ||\n      !grade.outOf?.value\n    ) {\n      return;\n    }\n\n    const coefficient = grade.coefficient || 1;\n    const outOfValue = grade.outOf.value;\n    const gradeValue = grade[key].value;\n\n    // Handle bonus grades\n    if (grade.bonus) {\n      const averageMoy = outOfValue / 2;\n      const newGradeValue = gradeValue - averageMoy;\n\n      if (newGradeValue >= 0) {\n        calcGradesSum += newGradeValue;\n        calcOutOfSum += 1;\n      }\n      return;\n    }\n\n    // Normalize grades to /20 scale\n    if (gradeValue > 20 || (coefficient < 1 && outOfValue - 20 >= -5) || outOfValue > 20) {\n      const gradeOn20 = (gradeValue / outOfValue) * 20;\n      calcGradesSum += gradeOn20 * coefficient;\n      calcOutOfSum += 20 * coefficient;\n    } else {\n      calcGradesSum += gradeValue * coefficient;\n      calcOutOfSum += outOfValue * coefficient;\n    }\n  });\n\n  if (calcOutOfSum > 0) {\n    const result = Math.min((calcGradesSum / calcOutOfSum) * 20, 20);\n    return isNaN(result) ? 0 : result;\n  }\n\n  return 0;\n};\n\nexport default PapillonWeightedAvg;"
  },
  {
    "path": "utils/grades/helper/period.ts",
    "content": "import { Period } from \"@/services/shared/grade\";\nimport { error, warn } from \"@/utils/logger/logger\";\n\nexport function getCurrentPeriod(periods: Period[]): Period {\n  const now = new Date().getTime();\n  const excludedNames = [\n    \"Bac blanc\",\n    \"Brevet blanc\",\n    \"Hors période\",\n    \"Année\",\n    \"ANNÉE\",\n    \"ANNEE\",\n    \"Contrôle en cours de formation\",\n    \"EPREUVES PONCTUELLES 1ERE SERIE\",\n    \"EPREUVES PONCTUELLES 2EME SERIE\",\n    \"MI-SEMESTRE 1\",\n    \"MI-SEMESTRE 2\",\n  ];\n\n  periods = periods\n    .filter(period => !excludedNames.includes(period.name))\n    .sort((a, b) => a.start.getTime() - b.start.getTime());\n\n  for (const period of periods) {\n    if (period.start.getTime() < now && period.end.getTime() > now) {\n      return period;\n    }\n  }\n\n  if (periods.length > 0) {\n    warn(\"Current period not found. Falling back to the first period in the array.\");\n    return periods[0];\n  }\n\n  error(\"Unable to find the current period and unable to fallback...\");\n  return periods[0];\n}"
  },
  {
    "path": "utils/i18n.ts",
    "content": "import * as Localization from \"expo-localization\";\r\nimport i18n from \"i18next\";\r\nimport { initReactI18next } from \"react-i18next\";\r\n\r\nimport af from \"@/locales/af.json\";\r\nimport ar from \"@/locales/ar.json\";\r\nimport bg from \"@/locales/bg.json\";\r\nimport bn from \"@/locales/bn.json\";\r\nimport br from \"@/locales/br.json\";\r\nimport cs from \"@/locales/cs.json\";\r\nimport da from \"@/locales/da.json\";\r\nimport de from \"@/locales/de.json\";\r\nimport el from \"@/locales/el.json\";\r\nimport en from \"@/locales/en.json\";\r\nimport es from \"@/locales/es.json\";\r\nimport et from \"@/locales/et.json\";\r\nimport fa from \"@/locales/fa.json\";\r\nimport fi from \"@/locales/fi.json\";\r\nimport fr from \"@/locales/fr.json\";\r\nimport he from \"@/locales/he.json\";\r\nimport hi from \"@/locales/hi.json\";\r\nimport hr from \"@/locales/hr.json\";\r\nimport hu from \"@/locales/hu.json\";\r\nimport id from \"@/locales/id.json\";\r\nimport it from \"@/locales/it.json\";\r\nimport ja from \"@/locales/ja.json\";\r\nimport ko from \"@/locales/ko.json\";\r\nimport ms from \"@/locales/ms.json\";\r\nimport nl from \"@/locales/nl.json\";\r\nimport no from \"@/locales/no.json\";\r\nimport pl from \"@/locales/pl.json\";\r\nimport pt from \"@/locales/pt.json\";\r\nimport ro from \"@/locales/ro.json\";\r\nimport ru from \"@/locales/ru.json\";\r\nimport sk from \"@/locales/sk.json\";\r\nimport sq from \"@/locales/sq.json\";\r\nimport sv from \"@/locales/sv.json\";\r\nimport sw from \"@/locales/sw.json\";\r\nimport th from \"@/locales/th.json\";\r\nimport tr from \"@/locales/tr.json\";\r\nimport uk from \"@/locales/uk.json\";\r\nimport ur from \"@/locales/ur.json\";\r\nimport vi from \"@/locales/vi.json\";\r\n\r\nexport const resources = {\r\n  fr: { translation: fr, emoji: \"🇫🇷\", label: \"Français\" },\r\n  en: { translation: en, emoji: \"🇬🇧\", label: \"English\" },\r\n  de: { translation: de, emoji: \"🇩🇪\", label: \"Deutsch\" },\r\n  es: { translation: es, emoji: \"🇪🇸\", label: \"Español\" },\r\n  it: { translation: it, emoji: \"🇮🇹\", label: \"Italiano\" },\r\n  tr: { translation: tr, emoji: \"🇹🇷\", label: \"Türkçe\" },\r\n  br: { translation: br, emoji: \"🏁\", label: \"Brezhoneg\" },\r\n  pt: { translation: pt, emoji: \"🇵🇹\", label: \"Português\" },\r\n  ja: { translation: ja, emoji: \"🇯🇵\", label: \"日本語\" },\r\n  ru: { translation: ru, emoji: \"🇷🇺\", label: \"Русский\" },\r\n  ko: { translation: ko, emoji: \"🇰🇷\", label: \"한국어\" },\r\n  af: { translation: af, emoji: \"🇿🇦\", label: \"Afrikaans\" },\r\n  ar: { translation: ar, emoji: \"🇦🇪\", label: \"العربية\" },\r\n  el: { translation: el, emoji: \"🇬🇷\", label: \"Ελληνικά\" },\r\n  hi: { translation: hi, emoji: \"🇮🇳\", label: \"हिन्दी\" },\r\n  nl: { translation: nl, emoji: \"🇳🇱\", label: \"Nederlands\" },\r\n  pl: { translation: pl, emoji: \"🇵🇱\", label: \"Polski\" },\r\n  ro: { translation: ro, emoji: \"🇷🇴\", label: \"Română\" },\r\n  sq: { translation: sq, emoji: \"🇦🇱\", label: \"Shqip\" },\r\n  uk: { translation: uk, emoji: \"🇺🇦\", label: \"Українська\" },\r\n  vi: { translation: vi, emoji: \"🇻🇳\", label: \"Tiếng Việt\" },\r\n  bg: { translation: bg, emoji: \"🇧🇬\", label: \"Български\" },\r\n  bn: { translation: bn, emoji: \"🇧🇩\", label: \"বাংলা\" },\r\n  cs: { translation: cs, emoji: \"🇨🇿\", label: \"Čeština\" },\r\n  da: { translation: da, emoji: \"🇩🇰\", label: \"Dansk\" },\r\n  fi: { translation: fi, emoji: \"🇫🇮\", label: \"Suomi\" },\r\n  he: { translation: he, emoji: \"✡️\", label: \"עברית\" },\r\n  hu: { translation: hu, emoji: \"🇭🇺\", label: \"Magyar\" },\r\n  id: { translation: id, emoji: \"🇮🇩\", label: \"Bahasa Indonesia\" },\r\n  no: { translation: no, emoji: \"🇳🇴\", label: \"Norsk\" },\r\n  sk: { translation: sk, emoji: \"🇸🇰\", label: \"Slovenčina\" },\r\n  sv: { translation: sv, emoji: \"🇸🇪\", label: \"Svenska\" },\r\n  th: { translation: th, emoji: \"🇹🇭\", label: \"ไทย\" },\r\n  fa: { translation: fa, emoji: \"🇮🇷\", label: \"فارسی\" },\r\n  ur: { translation: ur, emoji: \"🇵🇰\", label: \"اردو\" },\r\n  ms: { translation: ms, emoji: \"🇲🇾\", label: \"Bahasa Malaysia\" },\r\n  sw: { translation: sw, emoji: \"🇹🇿\", label: \"Swahili\" },\r\n  hr: { translation: hr, emoji: \"🇭🇷\", label: \"Hrvatski\" },\r\n  et: { translation: et, emoji: \"🇪🇪\", label: \"Eesti\" },\r\n};\r\n\r\nconst languageDetector = {\r\n  type: \"languageDetector\",\r\n  async: true,\r\n  detect: (cb: (lang: string) => void) => {\r\n    const detectedLang = Localization.getLocales()[0].languageTag.split(\"-\")[0];\r\n    cb(Object.keys(resources).includes(detectedLang) ? detectedLang : \"en\");\r\n  },\r\n};\r\n\r\ni18n\r\n  .use(languageDetector as any)\r\n  .use(initReactI18next)\r\n  .init({\r\n    resources,\r\n    fallbackLng: [\"en\", \"fr\"],\r\n    interpolation: { escapeValue: false },\r\n    detection: {\r\n      order: [\"languageDetector\"],\r\n    },\r\n  });\r\n\r\nexport default i18n;\r\n"
  },
  {
    "path": "utils/logger/consent.ts",
    "content": "import Countly from \"countly-sdk-react-native-bridge\";\nimport { MMKV } from \"react-native-mmkv\";\n\ninterface ConsentStatus {\n  given: boolean;\n  required: boolean;\n  optional: boolean;\n  advanced: boolean;\n}\n\nexport const checkConsent = async (): Promise<ConsentStatus> => {\n  const consentConfig = new MMKV();\n  const given = await consentConfig.getBoolean(\"consent\") ?? false;\n  const required = await consentConfig.getBoolean(\"countly-consent-required\") ?? false;\n  const optional = await consentConfig.getBoolean(\"countly-consent-optional\") ?? false;\n  const advanced = await consentConfig.getBoolean(\"countly-consent-advanced\") ?? false;\n\n  return { given, required, optional, advanced };\n}\n\ninterface ConsentLevels {\n  none: boolean;\n  required: boolean;\n  optional: boolean;\n  advanced: boolean;\n}\n\nexport const setConsent = async (consent: keyof ConsentLevels) => {\n  const consentConfig = new MMKV();\n\n  if (consent === \"none\") {\n    await consentConfig.set(\"consent\", true);\n    await consentConfig.set(\"countly-consent-required\", false);\n    await consentConfig.set(\"countly-consent-optional\", false);\n    await consentConfig.set(\"countly-consent-advanced\", false);\n  } else if (consent === \"required\") {\n    await consentConfig.set(\"consent\", true);\n    await consentConfig.set(\"countly-consent-required\", true);\n    await consentConfig.set(\"countly-consent-optional\", false);\n    await consentConfig.set(\"countly-consent-advanced\", false);\n    Countly.giveConsent([\"sessions\"]);\n  } else if (consent === \"optional\") {\n    await consentConfig.set(\"consent\", true);\n    await consentConfig.set(\"countly-consent-required\", true);\n    await consentConfig.set(\"countly-consent-optional\", true);\n    await consentConfig.set(\"countly-consent-advanced\", false);\n    Countly.giveConsent([\"sessions\", \"crashes\", \"users\"]);\n  } else if (consent === \"advanced\") {\n    await consentConfig.set(\"consent\", true);\n    await consentConfig.set(\"countly-consent-required\", true);\n    await consentConfig.set(\"countly-consent-optional\", true);\n    await consentConfig.set(\"countly-consent-advanced\", true);\n    Countly.giveConsent([\"sessions\", \"crashes\", \"users\", \"location\", \"attribution\", \"push\", \"star-rating\", \"feedback\"]);\n  }\n\n  return;\n}"
  },
  {
    "path": "utils/logger/logger.ts",
    "content": "/* eslint-disable no-console */\n// Reporting (if consent has been given)\nimport Countly from 'countly-sdk-react-native-bridge';\n\nimport { useLogStore } from '@/stores/logs/index';\nimport { LogType } from '@/stores/logs/types';\nconst format = \"[%DATE%][%FROM%] %MESSAGE%\";\n\nconst typeList = [\"LOG\", \"ERROR\", \"WARN\", \"INFO\"];\n\nexport function getIsoDate(): string {\n  return new Date().toISOString();\n}\n\nfunction getMessage(type: number, date: string, from: string, message: string): string {\n  return format\n    .replaceAll(\"%TYPE%\", typeList[type].padEnd(5))\n    .replaceAll(\"%DATE%\", date)\n    .replaceAll(\"%FROM%\", from)\n    .replaceAll(\"%MESSAGE%\", message);\n}\n\nfunction obtainFunctionName(from?: string): string {\n  const stack = new Error().stack?.split(\"\\n\") ?? [];\n\n  const relevant = stack.find((line, index) => \n    index > 2 &&\n    line.includes(\"at \") &&\n    line.includes(\"http\") &&\n    !line.includes(\"logger\")\n  );\n\n  const match = relevant?.match(/at (\\S+)\\s*\\(/);\n  const functionName = match?.[1];\n\n  if (!functionName || /^(anonymous|anon_0_)/.test(functionName)) {\n    return from ?? \"UNKNOWN\";\n  }\n\n  return functionName;\n}\n\nfunction saveLog(date: string, message: string, type: LogType, from?: string) {\n  useLogStore.getState().addItem({ date, message, from, type });\n\n  // Does NOT sends anything to the server --> only if crash happens\n  Countly.addCrashLog(message);\n}\n\nfunction log(message: string, from?: string): void {\n  const date = getIsoDate()\n  const functionName = obtainFunctionName(from)\n  const entry = getMessage(0, date, functionName, message);\n  saveLog(date, message, LogType.LOG, functionName);\n  console.log(entry);\n}\n\nfunction error(message: string, from?: string): void {\n  const date = getIsoDate()\n  const functionName = obtainFunctionName(from)\n  const entry = getMessage(1, date, functionName, message);\n  saveLog(date, message, LogType.ERROR, functionName);\n  console.error(message);\n  Countly.logException(message, true, JSON.parse(JSON.stringify(entry)));\n}\n\nfunction warn(message: string, from?: string): void {\n  const date = getIsoDate()\n  const functionName = obtainFunctionName(from)\n  const entry = getMessage(2, date, functionName, message);\n  saveLog(date, message, LogType.WARN, functionName);\n  console.warn(entry);\n}\n\nfunction info(message: string, from?: string): void {\n  const date = getIsoDate()\n  const functionName = obtainFunctionName(from)\n  const entry = getMessage(3, date, functionName, message);\n  saveLog(date, message, LogType.INFO, functionName);\n  console.info(entry);\n}\n\nexport { error, info, log, warn };\n"
  },
  {
    "path": "utils/magic/ModelManager.ts",
    "content": "/* eslint-disable max-depth */\r\nimport { Directory, File, Paths } from \"expo-file-system\";\r\nimport { loadTensorflowModel, TensorflowModel } from \"react-native-fast-tflite\";\r\n\r\nimport packageJson from \"@/package.json\";\r\nimport { useSettingsStore } from \"@/stores/settings\";\r\n\r\nimport { MAGIC_URL } from \"../endpoints\";\r\nimport { log } from \"../logger/logger\";\r\nimport { checkAndUpdateModel, getCurrentPtr } from \"./updater\"; \r\n\r\nexport type ModelPrediction = {\r\n  scores: number[];\r\n  predicted: string;\r\n  labelScores: Record<string, number>;\r\n};\r\n\r\nfunction removeAccents(text: string): string {\r\n  return text.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\r\n}\r\n\r\nfunction applyKerasFilters(text: string, filters?: string): string {\r\n  const defaultFilters = '!\"#$%&()*+,-./:;<=>?@[\\\\]^_`{|}~\\t\\n';\r\n  const filtersToUse = filters ?? defaultFilters;\r\n\r\n  let result = text;\r\n  for (const char of filtersToUse) {\r\n    result = result.replace(new RegExp(\"\\\\\" + char, \"g\"), \" \");\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction compactSpaces(text: string): string {\r\n  return text.trim().replace(/\\s+/g, \" \");\r\n}\r\n\r\nfunction normalizeText(text: string, config: any): string {\r\n  let normalized = text;\r\n  normalized = removeAccents(normalized);\r\n\r\n  if (config.lower === true) {\r\n    normalized = normalized.toLowerCase();\r\n  }\r\n\r\n  normalized = applyKerasFilters(normalized, config.filters);\r\n\r\n  normalized = compactSpaces(normalized);\r\n\r\n  return normalized;\r\n}\r\n\r\nlet globalInitializationPromise: Promise<void> | null = null;\r\n\r\nfunction getMagicURL(): string {\r\n  return useSettingsStore.getState().personalization.magicModelURL || MAGIC_URL;\r\n}\r\n\r\nclass ModelManager {\r\n  private static instance: ModelManager;\r\n  private model: TensorflowModel | null = null;\r\n  private maxLen = 128;\r\n  private batchSize = 1;\r\n  private labels: string[] = [];\r\n  private labelToId: Record<string, number> = {};\r\n  private wordIndex: Record<string, number> = {};\r\n  private tokenizerConfig: any = {};\r\n  private oovIndex = 1;\r\n  private isInitializing = false;\r\n  private hasInitialized = false;\r\n  private predictionQueue: Array<() => Promise<any>> = [];\r\n  private isProcessingQueue = false;\r\n\r\n  static getInstance(): ModelManager {\r\n    if (!ModelManager.instance) {\r\n      ModelManager.instance = new ModelManager();\r\n    }\r\n    return ModelManager.instance;\r\n  }\r\n\r\n  async performPreventiveCleanup(): Promise<void> {\r\n    try {\r\n      const ptr = await getCurrentPtr();\r\n      if (ptr) {\r\n        const modelFile = new File(ptr.dir + \"model/model.tflite\");\r\n        const tokenizerFile = new File(ptr.dir + \"model/tokenizer.json\");\r\n        const labelsFile = new File(ptr.dir + \"model/labels.json\");\r\n\r\n        if (!modelFile.exists || !tokenizerFile.exists || !labelsFile.exists) {\r\n          const resetResult = await this.reset();\r\n          if (!resetResult.success) {\r\n            log(`Cleanup failed: ${resetResult.error}`);\r\n            throw new Error(`Cleanup failed: ${resetResult.error}`);\r\n          }\r\n        }\r\n      }\r\n    } catch (error) {\r\n      log(`Preventive cleanup error: ${String(error)}`);\r\n      throw new Error(`Preventive cleanup error: ${String(error)}`);\r\n    }\r\n  }\r\n\r\n  async safeInit(): Promise<void> {\r\n    if (globalInitializationPromise) {\r\n      return globalInitializationPromise;\r\n    }\r\n\r\n    if (this.hasInitialized || this.isInitializing) {\r\n      return;\r\n    }\r\n\r\n    globalInitializationPromise = this._performSafeInit();\r\n\r\n    try {\r\n      await globalInitializationPromise;\r\n    } finally {\r\n      globalInitializationPromise = null;\r\n    }\r\n  }\r\n\r\n  private async _performSafeInit(): Promise<void> {\r\n    this.isInitializing = true;\r\n\r\n    try {\r\n      await this.performPreventiveCleanup();\r\n\r\n      const result = await this.init();\r\n      if (!result.success) {\r\n        const resetResult = await this.reset();\r\n        if (!resetResult.success) {\r\n          log(`Safe init reset failed: ${resetResult.error}`);\r\n          throw new Error(`Safe init reset failed: ${resetResult.error}`);\r\n        }\r\n      }\r\n      this.hasInitialized = true;\r\n      log(\"SafeInit completed successfully. Model is up-to-date.\");\r\n    } catch (error) {\r\n      log(`Safe init error: ${String(error)}`);\r\n      throw new Error(`Safe init error: ${String(error)}`);\r\n    } finally {\r\n      this.isInitializing = false;\r\n    }\r\n  }\r\n\r\n  resetInitializationState(): void {\r\n    this.isInitializing = false;\r\n    this.hasInitialized = false;\r\n    globalInitializationPromise = null;\r\n  }\r\n\r\n  async init(): Promise<{ source: string; success: boolean; error?: string }> {\r\n    try {\r\n      const loadedFromActive = await this.tryLoadFromActivePtr();\r\n      if (loadedFromActive) {\r\n        log(\"Model initialized successfully\");\r\n        return { source: loadedFromActive, success: true };\r\n      }\r\n\r\n      try {\r\n        await checkAndUpdateModel(packageJson.version, getMagicURL());\r\n      } catch {\r\n        log(\"Model update failed\");\r\n      }\r\n\r\n      const loadedAfterUpdate = await this.tryLoadFromActivePtr();\r\n      if (loadedAfterUpdate) {\r\n        log(\"Model initialized successfully after update\");\r\n        return { source: loadedAfterUpdate, success: true };\r\n      }\r\n\r\n      const ptr = await getCurrentPtr();\r\n      const errorMsg = `No dynamic model available. Reason: ${ptr ? \"ptr exists\" : \"no ptr\"}`;\r\n      log(`Initialization error: ${errorMsg}`);\r\n      return { source: \"none\", success: false, error: errorMsg };\r\n    } catch (error) {\r\n      log(`Initialization error: ${String(error)}`);\r\n      return {\r\n        source: \"none\",\r\n        success: false,\r\n        error: `Init error: ${String(error)}`,\r\n      };\r\n    }\r\n  }\r\n\r\n  async refresh(): Promise<{\r\n    success: boolean;\r\n    updated: boolean;\r\n    error?: string;\r\n  }> {\r\n    try {\r\n      const before = await getCurrentPtr();\r\n\r\n      try {\r\n        await checkAndUpdateModel(packageJson.version, getMagicURL());\r\n      } catch {\r\n        log(\"Model refresh failed during update\");\r\n        return { success: false, updated: false, error: \"Update failed\" };\r\n      }\r\n\r\n      const after = await getCurrentPtr();\r\n\r\n      if (\r\n        after &&\r\n        (!before ||\r\n          before.version !== after.version ||\r\n          before.name !== after.name)\r\n      ) {\r\n        try {\r\n          await this.loadFromDirectory(after.dir);\r\n          log(\"Model refreshed successfully with new version\");\r\n          return { success: true, updated: true };\r\n        } catch {\r\n          log(\"Failed to load new model during refresh\");\r\n          return {\r\n            success: false,\r\n            updated: false,\r\n            error: \"Failed to load new model\",\r\n          };\r\n        }\r\n      }\r\n\r\n      if (!this.model && after) {\r\n        try {\r\n          await this.loadFromDirectory(after.dir);\r\n          log(\"Model refreshed successfully with existing version\");\r\n          return { success: true, updated: true };\r\n        } catch {\r\n          log(\"Failed to load existing model during refresh\");\r\n          return {\r\n            success: false,\r\n            updated: false,\r\n            error: \"Failed to load existing model\",\r\n          };\r\n        }\r\n      }\r\n\r\n      log(\"Model refresh completed with no changes\");\r\n      return { success: true, updated: false };\r\n    } catch (error) {\r\n      log(`Refresh error: ${String(error)}`);\r\n      return {\r\n        success: false,\r\n        updated: false,\r\n        error: `Refresh error: ${String(error)}`,\r\n      };\r\n    }\r\n  }\r\n\r\n  async reset(): Promise<{ success: boolean; error?: string }> {\r\n    try {\r\n      this.model = null;\r\n      this.labels = [];\r\n      this.labelToId = {};\r\n      this.wordIndex = {};\r\n      this.tokenizerConfig = {};\r\n      this.oovIndex = 1;\r\n      this.maxLen = 128;\r\n      this.batchSize = 1;\r\n\r\n      this.isInitializing = false;\r\n      this.hasInitialized = false;\r\n      globalInitializationPromise = null;\r\n\r\n      const MODELS_ROOT = new Directory(Paths.document, \"papillon-models\");\r\n      const CURRENT_PTR = new File(MODELS_ROOT, \"current.json\");\r\n\r\n      if (CURRENT_PTR.exists) {\r\n        CURRENT_PTR.delete();\r\n      }\r\n\r\n      if (MODELS_ROOT.exists) {\r\n        MODELS_ROOT.delete();\r\n      }\r\n\r\n      log(\"Model reset successfully\");\r\n      return { success: true };\r\n    } catch (error) {\r\n      log(`Reset error: ${String(error)}`);\r\n      return { success: false, error: `Reset error: ${String(error)}` };\r\n    }\r\n  }\r\n\r\n  getStatus(): {\r\n    hasModel: boolean;\r\n    maxLen: number;\r\n    batchSize: number;\r\n    labelsCount: number;\r\n    labelToIdCount: number;\r\n    wordIndexSize: number;\r\n    oovIndex: number;\r\n    tokenizerConfigLoaded: boolean;\r\n    isInitializing: boolean;\r\n    hasInitialized: boolean;\r\n    labels: string[];\r\n    modelType: string;\r\n    tokenizerInfo: {\r\n      hasFilters: boolean;\r\n      hasLowerCase: boolean;\r\n      oovToken: string | null;\r\n      configKeys: string[];\r\n    };\r\n    memoryInfo: {\r\n      globalPromiseActive: boolean;\r\n      instanceExists: boolean;\r\n    };\r\n    } {\r\n    return {\r\n      hasModel: this.model !== null,\r\n      maxLen: this.maxLen,\r\n      batchSize: this.batchSize,\r\n      labelsCount: this.labels.length,\r\n      labelToIdCount: Object.keys(this.labelToId).length,\r\n      wordIndexSize: Object.keys(this.wordIndex).length,\r\n      oovIndex: this.oovIndex,\r\n      tokenizerConfigLoaded: Object.keys(this.tokenizerConfig).length > 0,\r\n      isInitializing: this.isInitializing,\r\n      hasInitialized: this.hasInitialized,\r\n      labels: [...this.labels],\r\n      modelType: this.model ? \"TensorFlow Lite\" : \"None\",\r\n      tokenizerInfo: {\r\n        hasFilters: this.tokenizerConfig.filters !== undefined,\r\n        hasLowerCase: this.tokenizerConfig.lower === true,\r\n        oovToken: this.tokenizerConfig.oov_token || null,\r\n        configKeys: Object.keys(this.tokenizerConfig),\r\n      },\r\n      memoryInfo: {\r\n        globalPromiseActive: globalInitializationPromise !== null,\r\n        instanceExists: ModelManager.instance !== undefined,\r\n      },\r\n    };\r\n  }\r\n\r\n  private async tryLoadFromActivePtr(): Promise<string | null> {\r\n    const ptr = await getCurrentPtr();\r\n    if (!ptr) {\r\n      return null;\r\n    }\r\n    try {\r\n      await this.loadFromDirectory(ptr.dir);\r\n      return `dynamic:${ptr.version}`;\r\n    } catch (e) {\r\n      log(`[MODELMANAGER] Échec du chargement du modèle: ${String(e)}`);\r\n      try {\r\n        const MODELS_ROOT = new Directory(Paths.document, \"papillon-models\");\r\n        const CURRENT_PTR = new File(MODELS_ROOT, \"current.json\");\r\n\r\n        if (CURRENT_PTR.exists) {\r\n          CURRENT_PTR.delete();\r\n        }\r\n\r\n        const modelDir = new Directory(ptr.dir);\r\n        if (modelDir.exists) {\r\n          modelDir.delete();\r\n        }\r\n      } catch (_cleanupError) {\r\n        // Ignore cleanup errors\r\n      }\r\n\r\n      return null;\r\n    }\r\n  }\r\n\r\n  async loadFromDirectory(dirUri: string): Promise<void> {\r\n    try {\r\n      const modelUri = dirUri + \"model/model.tflite\";\r\n      const tokenizerFile = new File(dirUri + \"model/tokenizer.json\");\r\n      const labelsFile = new File(dirUri + \"model/labels.json\");\r\n\r\n      // Vérifier que tous les fichiers requis existent\r\n      const modelFile = new File(modelUri);\r\n      if (!modelFile.exists) {\r\n        throw new Error(`Fichier modèle manquant: ${modelUri}`);\r\n      }\r\n      if (!tokenizerFile.exists) {\r\n        throw new Error(`Fichier tokenizer manquant: ${tokenizerFile.uri}`);\r\n      }\r\n      if (!labelsFile.exists) {\r\n        throw new Error(`Fichier labels manquant: ${labelsFile.uri}`);\r\n      }\r\n\r\n      this.model = await loadTensorflowModel({ url: modelUri });\r\n\r\n      const tokenizerRaw = await tokenizerFile.text();\r\n      const tokenizerJson = JSON.parse(tokenizerRaw);\r\n      const config = tokenizerJson.config;\r\n      this.tokenizerConfig = config;\r\n\r\n      const wordIndexFile = new File(dirUri + \"model/word_index.json\");\r\n      const indexWordFile = new File(dirUri + \"model/index_word.json\");\r\n\r\n      let wordIndex: Record<string, number> = {};\r\n\r\n      if (wordIndexFile.exists) {\r\n        const wordIndexRaw = await wordIndexFile.text();\r\n        wordIndex = JSON.parse(wordIndexRaw);\r\n      } else if (indexWordFile.exists) {\r\n        const indexWordRaw = await indexWordFile.text();\r\n        const indexWord = JSON.parse(indexWordRaw);\r\n        wordIndex = {};\r\n        for (const [index, word] of Object.entries(indexWord)) {\r\n          if (typeof word === \"string\") {\r\n            wordIndex[word] = parseInt(index, 10);\r\n          }\r\n        }\r\n      } else if (tokenizerJson.word_index) {\r\n        wordIndex = tokenizerJson.word_index;\r\n      } else if (tokenizerJson.index_word) {\r\n        const indexWord = tokenizerJson.index_word;\r\n        wordIndex = {};\r\n        for (const [index, word] of Object.entries(indexWord)) {\r\n          if (typeof word === \"string\") {\r\n            wordIndex[word] = parseInt(index, 10);\r\n          }\r\n        }\r\n      } else {\r\n        throw new Error(\r\n          \"Aucun word_index disponible : ni word_index.json, ni word_index dans tokenizer.json, ni index_word\"\r\n        );\r\n      }\r\n\r\n      this.wordIndex = wordIndex;\r\n\r\n      const oovToken = config.oov_token;\r\n      if (oovToken && wordIndex[oovToken] !== undefined) {\r\n        this.oovIndex = wordIndex[oovToken];\r\n      } else {\r\n        this.oovIndex = 1;\r\n      }\r\n\r\n      const labelsRaw = await labelsFile.text();\r\n      this.labels = JSON.parse(labelsRaw);\r\n\r\n      const labelToIdFile = new File(dirUri + \"model/label_to_id.json\");\r\n      if (labelToIdFile.exists) {\r\n        const labelToIdRaw = await labelToIdFile.text();\r\n        this.labelToId = JSON.parse(labelToIdRaw);\r\n      } else {\r\n        this.labelToId = {};\r\n        for (let i = 0; i < this.labels.length; i++) {\r\n          this.labelToId[this.labels[i]] = i;\r\n        }\r\n      }\r\n    } catch (error) {\r\n      throw new Error(`Load error: ${String(error)}`);\r\n    }\r\n  }\r\n\r\n  tokenize(text: string, verbose: boolean = false): number[] {\r\n    const normalizedText = normalizeText(text, this.tokenizerConfig);\r\n\r\n    if (!normalizedText.trim()) {\r\n      return new Array(this.maxLen).fill(0);\r\n    }\r\n    const words = normalizedText.split(\" \").filter(w => w.length > 0);\r\n    const sequence: number[] = [];\r\n    const unknownWords: string[] = [];\r\n\r\n    for (const word of words) {\r\n      const idx = this.wordIndex[word];\r\n      if (idx !== undefined) {\r\n        sequence.push(idx);\r\n      } else {\r\n        sequence.push(this.oovIndex);\r\n        unknownWords.push(word);\r\n      }\r\n    }\r\n\r\n    if (sequence.length > this.maxLen) {\r\n      sequence.splice(this.maxLen);\r\n    }\r\n\r\n    while (sequence.length < this.maxLen) {\r\n      sequence.push(0);\r\n    }\r\n\r\n    if (unknownWords.length > 0) {\r\n      log(\r\n        `[TOKENIZE] Mots inconnus (${unknownWords.length}): [${unknownWords.join(\", \")}]`\r\n      );\r\n    }\r\n\r\n    log(\r\n      `[TOKENIZE] Séquence finale: longueur=${sequence.length}, 10 premiers tokens=[${sequence.slice(0, 10).join(\", \")}]`\r\n    );\r\n\r\n    return sequence;\r\n  }\r\n\r\n  private async processQueue(): Promise<void> {\r\n    if (this.isProcessingQueue || this.predictionQueue.length === 0) {\r\n      return;\r\n    }\r\n\r\n    this.isProcessingQueue = true;\r\n\r\n    while (this.predictionQueue.length > 0) {\r\n      const task = this.predictionQueue.shift();\r\n      if (task) {\r\n        try {\r\n          await task();\r\n        } catch (error) {\r\n          log(`[QUEUE ERROR] Error processing prediction: ${String(error)}`);\r\n        }\r\n      }\r\n    }\r\n\r\n    this.isProcessingQueue = false;\r\n  }\r\n\r\n  private async queuePrediction<T>(task: () => Promise<T>): Promise<T> {\r\n    return new Promise((resolve, reject) => {\r\n      this.predictionQueue.push(async () => {\r\n        try {\r\n          const result = await task();\r\n          resolve(result);\r\n        } catch (error) {\r\n          reject(error);\r\n        }\r\n      });\r\n\r\n      this.processQueue();\r\n    });\r\n  }\r\n\r\n  async predict(\r\n    text: string,\r\n    verbose: boolean = false\r\n  ): Promise<ModelPrediction | { error: string; success: false }> {\r\n    return this.queuePrediction(() => this.predictInternal(text, verbose));\r\n  }\r\n\r\n  private async predictInternal(\r\n    text: string,\r\n    verbose: boolean = false\r\n  ): Promise<ModelPrediction | { error: string; success: false }> {\r\n    try {\r\n      if (!this.model) {\r\n        const errorMsg =\r\n          \"Model not loaded (dynamic-only): appelle d'abord ModelManager.init()\";\r\n        log(`[PREDICT ERROR] ${errorMsg}`);\r\n        return { error: errorMsg, success: false };\r\n      }\r\n\r\n      const seq = this.tokenize(text, verbose);\r\n      const inputArr = new Int32Array(this.batchSize * this.maxLen);\r\n\r\n      for (let i = 0; i < seq.length && i < this.maxLen; i++) {\r\n        inputArr[i] = seq[i];\r\n      }\r\n\r\n      try {\r\n        const [out] = await this.model.run([inputArr]);\r\n\r\n        const scores = Array.from(out as Float32Array);\r\n\r\n        const best = scores.indexOf(Math.max(...scores));\r\n\r\n        let predictedLabel: string | undefined;\r\n\r\n        if (Object.keys(this.labelToId).length > 0) {\r\n          predictedLabel = Object.keys(this.labelToId).find(\r\n            label => this.labelToId[label] === best\r\n          );\r\n        } else {\r\n          predictedLabel = this.labels?.[best];\r\n        }\r\n\r\n        const predicted =\r\n          predictedLabel === null ? \"null\" : (predictedLabel ?? `#${best}`);\r\n\r\n        const labelScores: Record<string, number> = {};\r\n\r\n        if (Object.keys(this.labelToId).length > 0) {\r\n          for (const [label, id] of Object.entries(this.labelToId)) {\r\n            if (id < scores.length) {\r\n              labelScores[label] = scores[id];\r\n            }\r\n          }\r\n        } else {\r\n          for (let i = 0; i < this.labels.length && i < scores.length; i++) {\r\n            const label = this.labels[i];\r\n            if (label !== null) {\r\n              labelScores[label] = scores[i];\r\n            } else {\r\n              labelScores[\"null\"] = scores[i];\r\n            }\r\n          }\r\n        }\r\n\r\n        return { scores, predicted, labelScores };\r\n      } catch (e: unknown) {\r\n        const errorMessage = e instanceof Error ? e.message : String(e);\r\n        log(`[PREDICT MODEL RUN ERROR] Erreur TFLite: ${errorMessage}`);\r\n        return {\r\n          error: `Erreur d'exécution du modèle TFLite: ${errorMessage}`,\r\n          success: false,\r\n        };\r\n      }\r\n    } catch (e: unknown) {\r\n      const errorMessage = e instanceof Error ? e.message : String(e);\r\n      log(`[PREDICT ERROR] Erreur générale: ${errorMessage}`);\r\n      return {\r\n        error: `Erreur générale lors de la prédiction: ${errorMessage}`,\r\n        success: false,\r\n      };\r\n    }\r\n  }\r\n}\r\n\r\nexport default ModelManager.getInstance();\r\n"
  },
  {
    "path": "utils/magic/prediction.ts",
    "content": "import * as Battery from \"expo-battery\";\n\nimport { useMagicStore } from \"@/stores/magic\";\n\nimport { generateId } from \"../generateId\";\nimport ModelManager, { ModelPrediction } from \"./ModelManager\";\nimport regexPatterns from \"./regex/homeworks.json\";\n\nconst compiledPatterns: Record<string, RegExp[]> = Object.fromEntries(\n  Object.entries(regexPatterns).map(([category, patterns]) => [\n    category,\n    (patterns as string[]).map(p => new RegExp(p, \"i\")),\n  ])\n);\n\nexport function isModelPrediction(object: unknown): object is ModelPrediction {\n  return (\n    typeof object === \"object\" &&\n    object !== null &&\n    Array.isArray((object as any).scores) &&\n    typeof (object as any).predicted === \"string\" &&\n    typeof (object as any).labelScores === \"object\" &&\n    (object as any).labelScores !== null\n  );\n}\n\nexport async function predictHomework(label: string, magicEnabled: boolean = true): Promise<string> {\n  const store = useMagicStore.getState();\n  const homeworkId = generateId(label);\n  const existingHomework = store.getHomework(homeworkId);\n  \n  if (existingHomework) {\n    return existingHomework.label;\n  }\n\n  if (!magicEnabled) {\n    return \"\";\n  }\n\n  let batteryLevel: number;\n  try {\n    batteryLevel = await Battery.getBatteryLevelAsync();\n  } catch {\n    batteryLevel = 1;\n  }\n\n  // Si batterie < 10%, on utilise le regex\n  if (batteryLevel < 0.1) {\n    for (const [category, regexList] of Object.entries(compiledPatterns)) {\n      if (regexList.some(rgx => rgx.test(label))) {\n        store.addHomework({ id: homeworkId, label: category });\n        return category;\n      }\n    }\n    store.addHomework({ id: homeworkId, label: \"\" });\n    return \"\";\n  }\n\n  const prediction = await ModelManager.predict(label);\n\n  const beautifyLabel = (rawLabel: string): string => {\n    const labelMap: Record<string, string> = {\n      'evaluation': 'Évaluation',\n      'finaltask': 'Tâche finale',\n      'homework': 'Devoir Maison',\n      'null': 'null',\n      'oral': 'Présentation orale',\n      'sheets': 'Fiche',\n    };\n    \n    return labelMap[rawLabel.toLowerCase()] || rawLabel\n      .split('_')\n      .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n      .join(' ');\n  };\n\n  const finalLabel =\n    isModelPrediction(prediction) && prediction.predicted !== \"null\"\n      ? beautifyLabel(prediction.predicted)\n      : \"\";\n\n  store.addHomework({ id: homeworkId, label: finalLabel });\n  return finalLabel;\n}"
  },
  {
    "path": "utils/magic/regex/homeworks.json",
    "content": "{\n  \"Évaluations\": [\n    \"\\\\b(?:DS|devoir\\\\s(?:sur\\\\stable|surveillé(?:\\\\ssur\\\\s(?:le|la|les)\\\\schapitre\\\\s\\\\d+(?:\\\\s\\\\([^\\\\)]+\\\\))?)?|commun|blanc|écrit|oral|partiel|final|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année))\\\\b\",\n    \"\\\\bdevoir\\\\s(?:surveillé)\\\\s(?:sur\\\\s(?:le|la|les)\\\\schapitre\\\\s\\\\d+(?:\\\\s\\\\([^\\\\)]+\\\\))?)\\\\b\",\n    \"\\\\bdevoir\\\\s(?:à\\\\sfaire\\\\sen\\\\sclasse|en\\\\sclasse\\\\ssurveillé|sur\\\\stable|écrit|oral|noté|évalué|corrigé|important|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bdevoir\\\\s(?:noté|évalué|corrigé)\\\\s(?:en\\\\sclasse|surveillé|important|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bcomposition\\\\s(?:surveillée|notée|trimestrielle|semestrielle|écrite|orale|finale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bcontrôle\\\\s|bcontrole\\\\s(?:sur\\\\stable|en\\\\sclasse|surveillé|continu|inopiné|écrit|oral|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bexamen\\\\s(?:sur\\\\stable|surveillé|en\\\\sclasse|blanc|final|écrit|oral|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bépreuve\\\\s(?:surveillée|sur\\\\stable|en\\\\sclasse|anticipée|terminale|écrite|orale|finale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\btest\\\\s(?:surveillé|en\\\\sclasse|sur\\\\stable|de\\\\sconnaissances|de\\\\scompétences|écrit|oral|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bevaluation\\\\s|évaluation\\\\s(?:de|écrite|finale|sur|surveillée|sur\\\\stable|diagnostique|formative|écrite|orale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",      \n    \"\\\\binterrogation\\\\s(?:écrite|surveillée|surprise|courte|orale|finale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bcontrole\\\\s|contrôle\\\\s(?:n|de|écrit|des\\\\sconnaissances|continu|inopiné|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bexamen\\\\s(?:partiel|final|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|oral|écrit|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bépreuve\\\\s(?:écrite|orale|pratique|anticipée|terminale|finale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\béval(?:uation)?\\\\s(?:continue|finale|formative|sommative|diagnostique|écrite|orale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bTP\\\\s(?:noté|évalué|pratique|en\\\\slaboratoire|écrit|oral|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bdictée\\\\s(?:préparée|non\\\\spréparée|notée|évaluée|surprise|écrite|orale|finale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\brédaction\\\\s(?:notée|évaluée|surveillée|argumentative|écrite|orale|finale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bdissertation\\\\s(?:philosophique|littéraire|historique|argumentative|écrite|orale|finale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bcommentaire\\\\s(?:de\\\\stexte|composé|littéraire|critique|écrit|oral|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\btest\\\\s(?:d'anglais|d'espagnol|d'allemand|de\\\\slangue)\\\\s(?:écrit|oral|de\\\\scompréhension|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\b(?:English|Spanish|German|French)\\\\s(?:writing|speaking|listening|reading)\\\\s(?:test|exam|assessment|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bprueba\\\\sde\\\\sespañol\\\\s(?:escrita|oral|de\\\\scomprensión|de\\\\sgramática|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bDeutschtest\\\\s(?:schriftlich|mündlich|Hörverstehen|Leseverstehen|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\b(?:examen|prueba|evaluación|control)\\\\s(?:final|parcial|oral|escrito|diagnóstica|formativa|sumativa|de\\\\srecuperación|de\\\\smedio\\\\scurso|de\\\\sfin\\\\sde\\\\scurso)\\\\b\"\n  ],\n  \"Devoirs Maison\": [\n    \"\\\\bDM\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bdevoir\\\\s?maison\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bdevoir\\\\s(?:à\\\\s(?:faire|la)\\\\s)?maison\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bdevoir\\\\s(?:à\\\\sfaire\\\\sà\\\\sla\\\\smaison|à\\\\srendre|pour\\\\sla\\\\sprochaine\\\\sfois|écrit|oral|noté|évalué|corrigé|long|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bdevoir\\\\s(?:non\\\\ssurveillé|personnel|hebdomadaire|écrit|oral|noté|évalué|corrigé|long|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bdevoir\\\\s(?:noté|évalué|corrigé)\\\\s(?:à\\\\sla\\\\smaison|à\\\\srendre|long|écrit|oral|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\btravail\\\\s(?:à\\\\sla\\\\smaison|personnel|à\\\\srendre|de\\\\srecherche|écrit|oral|noté|évalué|corrigé|long|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bexercices?\\\\s(?:à\\\\sfaire\\\\schez\\\\ssoi|à\\\\srendre|supplémentaires|écrits|oraux|notés|évalués|corrigés|longs|finaux|partiels|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bprojet\\\\s(?:à\\\\sréaliser\\\\sà\\\\sla\\\\smaison|personnel|de\\\\sgroupe|long\\\\sterme|écrit|oral|noté|évalué|corrigé|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\brédaction\\\\s(?:à\\\\sla\\\\smaison|personnelle|créative|argumentative|écrite|orale|notée|évaluée|corrigée|finale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bcomposition\\\\s(?:à\\\\sla\\\\smaison|personnelle|littéraire|historique|écrite|orale|notée|évaluée|corrigée|finale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\brecherche\\\\s(?:personnelle|à\\\\sla\\\\smaison|documentaire|approfondie|écrite|orale|notée|évaluée|corrigée|finale|partielle|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bessai\\\\s(?:à\\\\srédiger\\\\schez\\\\ssoi|personnel|argumentatif|critique|écrit|oral|noté|évalué|corrigé|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\",\n    \"\\\\bexposé\\\\s(?:à\\\\spréparer\\\\sà\\\\sla\\\\smaison|personnel|oral|écrit|noté|évalué|corrigé|final|partiel|de\\\\sfin\\\\sde\\\\ssemestre|de\\\\srattrapage|de\\\\smi\\\\ssemestre|de\\\\smi\\\\strimestre|de\\\\sfin\\\\sd'année)\\\\b\"\n  ],\n  \"Tâche Finale\": [\n    \"\\\\b(?:tâche\\\\sfinale|final\\\\stask)\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bprojet\\\\sfinal\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bfinal\\\\s(?:task|project|assignment|presentation)\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bultimate\\\\s(?:task|challenge|assignment)\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bévaluation\\\\s(?:finale|sommative|globale)\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\b(?:tâche|projet|évaluation)\\\\s(?:de\\\\sfin\\\\sde)\\\\s(?:séquence|chapitre|unité|module|trimestre|semestre|année|cours|programme|cycle|étude|formation)\\\\b\"\n  ],\n  \"Présentations Orales\": [\n    \"\\\\b(?:présentation|presentation)\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\boral\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bprésentation\\\\s?orale\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bexposé\\\\s?oral\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\boral\\\\s?presentation\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bsoutenance\\\\s?orale\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\boral\\\\s?defense\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bplaidoirie\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bdébat\\\\s?oral\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\boral\\\\s?exam\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bexamen\\\\s?oral\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bspeech\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bdiscours\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bpitch\\\\s?oral\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bconférence\\\\s?orale\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bcompte-rendu\\\\s?oral\\\\b(?:\\\\s+\\\\w+){0,3}\"\n  ],\n  \"Fiche\": [\n    \"\\\\bfaire\\\\s(?:une?|des|la|les)\\\\sfiche(?:s)?\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bcréer\\\\s(?:une?|des|la|les)\\\\sfiche(?:s)?\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\brédiger\\\\s(?:une?|des|la|les)\\\\sfiche(?:s)?\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bélaborer\\\\s(?:une?|des|la|les)\\\\sfiche(?:s)?\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bpréparer\\\\s(?:une?|des|la|les)\\\\sfiche(?:s)?\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bfiche\\\\s(?:de\\\\s(?:lecture|révision|synthèse|travail|mémorisation|étude|analyse|recherche|cours|programme|cycle|formation))\\\\b(?:\\\\s+\\\\w+){0,3}\",\n    \"\\\\bfiche\\\\s(?:récapitulative|résumé|mnémotechnique|d'exercices|de\\\\srévision|de\\\\ssynthèse|de\\\\stravail|de\\\\smémorisation|d'étude|d'analyse|de\\\\srecherche|de\\\\scours|de\\\\sprogramme|de\\\\scycle|de\\\\sformation)\\\\b(?:\\\\s+\\\\w+){0,3}\"\n  ],\n  \"Compte rendu\": [\n    \"\\\\bcompte[-\\\\s]rendu\\\\s(?:de\\\\s(?:TP|travaux\\\\spratiques|lecture|expérience|stage|visite|projet|recherche|étude|travail\\\\sde\\\\sgroupe|analyse|observation|enquête|mission|activité|intervention|atelier|séance|cours|programme|cycle|formation))\\\\b\",\n    \"\\\\brapport\\\\s(?:de\\\\s(?:stage|projet|recherche|laboratoire|expérience|étude|travail\\\\sde\\\\sgroupe|analyse|observation|enquête|mission|activité|intervention|atelier|séance|cours|programme|cycle|formation))\\\\b\",\n    \"\\\\bcompte[-\\\\s]rendu\\\\s(?:de\\\\s(?:TP|travaux\\\\spratiques|lecture|expérience|stage|visite))\\\\b\",\n    \"\\\\brapport\\\\s(?:de\\\\s(?:stage|projet|recherche|laboratoire|expérience))\\\\b\",\n    \"\\\\banalyse\\\\sde\\\\sdocuments?\\\\s(?:historiques?|scientifiques?|littéraires?|économiques?)\\\\b\",\n    \"\\\\banalyse\\\\sd'expérience\\\\s(?:scientifique|en\\\\slaboratoire|pratique)\\\\b\",\n    \"\\\\brendu\\\\sfinal\\\\sde\\\\s(?:projet|recherche|étude|travail\\\\sde\\\\sgroupe)\\\\b\"\n  ],\n  \"Lecture\": [\n    \"\\\\blecture\\\\s(?:analytique|critique|commentée|approfondie|guidée)\\\\b\",\n    \"\\\\banalyse\\\\sde\\\\stexte\\\\s(?:littéraire|historique|philosophique|scientifique)\\\\b\",\n    \"\\\\bétude\\\\sde\\\\stexte\\\\s(?:dirigée|approfondie|comparative|thématique)\\\\b\",\n    \"\\\\bétude\\\\sd'(?:œuvre|ouvrage)\\\\s(?:intégrale|complète|littéraire|classique)\\\\b\"\n  ],\n  \"Projet\": [\n    \"\\\\bprojet\\\\sde\\\\sgroupe\\\\s(?:collaboratif|interdisciplinaire|innovant|créatif)\\\\b\",\n    \"\\\\bprojet\\\\spratique\\\\s(?:en\\\\s(?:sciences|technologie|arts|informatique))\\\\b\",\n    \"\\\\bprojet\\\\sd'application\\\\s(?:des\\\\sconnaissances|pratique|théorique)\\\\b\",\n    \"\\\\bprojet\\\\sde\\\\srecherche\\\\s(?:individuel|collectif|scientifique|documentaire)\\\\b\"\n  ],\n  \"Analyse\": [\n    \"\\\\bdissertation\\\\s(?:argumentative|comparative|critique|philosophique)\\\\b\",\n    \"\\\\bessai\\\\s(?:argumentatif|critique|analytique|réflexif)\\\\b\",\n    \"\\\\bexposé\\\\s(?:oral|écrit)\\\\s(?:analytique|critique|comparatif)\\\\b\",\n    \"\\\\banalyse\\\\s(?:littéraire|historique|scientifique|comparative|textuelle)\\\\b\",\n    \"\\\\blecture\\\\scritique\\\\s(?:d'article|d'ouvrage|de\\\\sdocument|de\\\\spresse)\\\\b\"\n  ],\n  \"Pratique\": [\n    \"\\\\bexercice\\\\spratique\\\\s(?:en\\\\s(?:laboratoire|atelier|classe|terrain))\\\\b\",\n    \"\\\\bmanip\\\\s|manipulation\\\\s\\\\notées\\\\s(?:en\\\\s(?:laboratoire|atelier|classe|salle\\\\sde\\\\sTP))\\\\b\",\n    \"\\\\bTP\\\\s(?:de\\\\s(?:chimie|physique|biologie|informatique|SVT))\\\\b\",\n    \"\\\\btravaux\\\\spratiques\\\\s(?:dirigés|en\\\\sgroupe|individuels|expérimentaux)\\\\b\",\n    \"\\\\brapport\\\\sde\\\\s(?:TP|travaux\\\\spratiques|expérience|manipulation)\\\\b\",\n    \"\\\\bséance\\\\sde\\\\s(?:travaux\\\\spratiques|manipulation|expérimentation)\\\\b\"\n  ]\n}"
  },
  {
    "path": "utils/magic/updater/extract.ts",
    "content": "import * as FileSystem from \"expo-file-system/legacy\";\r\nimport { unzipSync } from \"fflate\";\r\n\r\nimport { log } from \"@/utils/logger/logger\";\r\n\r\nimport { ensureDir, readJSON } from \"./fileUtils\";\r\n\r\nfunction base64ToBytes(b64: string): Uint8Array {\r\n  const bin = atob(b64);\r\n  const out = new Uint8Array(bin.length);\r\n  for (let i = 0; i < bin.length; i++) {out[i] = bin.charCodeAt(i);}\r\n  return out;\r\n}\r\nfunction bytesToBase64(u8: Uint8Array): string {\r\n  let s = \"\";\r\n  for (let i = 0; i < u8.length; i++) {s += String.fromCharCode(u8[i]);}\r\n  return btoa(s);\r\n}\r\n\r\nasync function listAllFiles(dirUri: string, relPrefix = \"\"): Promise<string[]> {\r\n  const entries = await FileSystem.readDirectoryAsync(dirUri);\r\n  const out: string[] = [];\r\n  for (const name of entries) {\r\n    const full = dirUri + name;\r\n    const rel = relPrefix + name;\r\n    const st = await FileSystem.getInfoAsync(full);\r\n    if (st.isDirectory) {\r\n      const sub = await listAllFiles(full + \"/\", rel + \"/\");\r\n      out.push(...sub);\r\n    } else {\r\n      out.push(rel);\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\nasync function normalizeStagingLayout(stagingDir: string) {\r\n  const expected = await FileSystem.getInfoAsync(\r\n    stagingDir + \"model/model.tflite\"\r\n  );\r\n  if (expected.exists) {return;}\r\n\r\n  const all = await listAllFiles(stagingDir);\r\n  log(`[EXTRACT] files: ${all.join(\", \")}`);\r\n  const tfliteRel = all.find(p => /\\.tflite$/i.test(p));\r\n  if (!tfliteRel) {\r\n    return;\r\n  }\r\n\r\n  const tfliteDirRel = tfliteRel.split(\"/\").slice(0, -1).join(\"/\");\r\n  const tfliteName = tfliteRel.split(\"/\").pop()!;\r\n  const srcDirUri = tfliteDirRel ? stagingDir + tfliteDirRel + \"/\" : stagingDir;\r\n\r\n  const dstModelDir = stagingDir + \"model/\";\r\n  await ensureDir(dstModelDir);\r\n\r\n  await FileSystem.moveAsync({\r\n    from: stagingDir + tfliteRel,\r\n    to: dstModelDir + \"model.tflite\",\r\n  });\r\n\r\n  const maybe = [\"tokenizer.json\", \"labels.json\", \"word_index.json\", \"index_word.json\"];\r\n  for (const f of maybe) {\r\n    const src = srcDirUri + f;\r\n    const info = await FileSystem.getInfoAsync(src);\r\n    if (info.exists) {\r\n      log(`[EXTRACT] Déplacement ${f}: ${src} -> ${dstModelDir + f}`);\r\n      await FileSystem.moveAsync({ from: src, to: dstModelDir + f });\r\n    } else {\r\n      log(`[EXTRACT] Fichier manquant: ${f} (cherché dans ${src})`);\r\n    }\r\n  }\r\n}\r\n\r\nexport async function extractMagicToStaging(\r\n  magicUri: string,\r\n  stagingDir: string\r\n) {\r\n  const st = await FileSystem.getInfoAsync(stagingDir);\r\n  if (st.exists) {await FileSystem.deleteAsync(stagingDir, { idempotent: true });}\r\n  await ensureDir(stagingDir);\r\n\r\n  const b64 = await FileSystem.readAsStringAsync(magicUri, {\r\n    encoding: FileSystem.EncodingType.Base64,\r\n  });\r\n  const zipBytes = base64ToBytes(b64);\r\n  const files = unzipSync(zipBytes);\r\n\r\n  for (const [relOriginal, content] of Object.entries(files)) {\r\n    const isDir =\r\n      relOriginal.endsWith(\"/\") ||\r\n      relOriginal === \"\" ||\r\n      relOriginal.endsWith(\"\\\\\");\r\n    if (isDir) {\r\n      await ensureDir(stagingDir + relOriginal);\r\n    } else {\r\n      const parts = relOriginal.split(\"/\").slice(0, -1);\r\n      if (parts.length) {await ensureDir(stagingDir + parts.join(\"/\") + \"/\");}\r\n      await FileSystem.writeAsStringAsync(\r\n        stagingDir + relOriginal,\r\n        bytesToBase64(content),\r\n        { encoding: FileSystem.EncodingType.Base64 }\r\n      );\r\n    }\r\n  }\r\n\r\n  await normalizeStagingLayout(stagingDir);\r\n}\r\n\r\nexport async function validateExtractedTree(stagingDir: string) {\r\n  const mustExist = [\r\n    \"model/model.tflite\",\r\n    \"model/tokenizer.json\",\r\n    \"model/labels.json\",\r\n    \"metadata.json\",\r\n  ];\r\n  for (const rel of mustExist) {\r\n    const info = await FileSystem.getInfoAsync(stagingDir + rel);\r\n    if (!info.exists) {throw new Error(`missing-file:${rel}`);}\r\n  }\r\n  const infos = await readJSON<unknown>(stagingDir + \"metadata.json\");\r\n  return infos;\r\n}\r\n"
  },
  {
    "path": "utils/magic/updater/fileUtils.ts",
    "content": "import { Directory,File } from \"expo-file-system\";\r\n\r\nexport async function ensureDir(uri: string) {\r\n  const dir = new Directory(uri);\r\n  if (!dir.exists) {\r\n    dir.create({ intermediates: true });\r\n  }\r\n}\r\n\r\nasync function ensureParentDir(path: string) {\r\n  const parts = path.split(\"/\").slice(0, -1).join(\"/\") + \"/\";\r\n  const parentDir = new Directory(parts);\r\n  if (!parentDir.exists) {\r\n    parentDir.create({ intermediates: true });\r\n  }\r\n}\r\n\r\nexport async function readJSON<T>(uri: string): Promise<T> {\r\n  const file = new File(uri);\r\n  const raw = await file.text();\r\n  return JSON.parse(raw) as T;\r\n}\r\n\r\nexport async function writeJSON(uri: string, data: unknown) {\r\n  await ensureParentDir(uri);\r\n  const file = new File(uri);\r\n  await file.write(JSON.stringify(data, null, 2));\r\n}\r\n\r\nexport async function withLock<T>(\r\n  lockPath: string,\r\n  fn: () => Promise<T>\r\n): Promise<T> {\r\n  await ensureParentDir(lockPath);\r\n\r\n  const lockFile = new File(lockPath);\r\n  if (lockFile.exists) {\r\n    throw new Error(\"update-in-progress\");\r\n  }\r\n\r\n  await lockFile.write(Date.now().toString());\r\n  try {\r\n    return await fn();\r\n  } finally {\r\n    try {\r\n      lockFile.delete();\r\n    } catch { /* empty */ }\r\n  }\r\n}\r\n"
  },
  {
    "path": "utils/magic/updater/index.ts",
    "content": "import { Directory, File, Paths } from \"expo-file-system\";\r\nimport { loadTensorflowModel } from \"react-native-fast-tflite\";\r\n\r\nimport { log } from \"@/utils/logger/logger\";\r\n\r\nimport { extractMagicToStaging, validateExtractedTree } from \"./extract\";\r\nimport { ensureDir, readJSON, withLock, writeJSON } from \"./fileUtils\";\r\nimport { fileSha256Hex, verifySize } from \"./integrity\";\r\nimport { fetchManifest, validateManifest } from \"./manifest\";\r\nimport { isInternetReachable } from \"./network\";\r\nimport { satisfiesAll } from \"./semver\";\r\nimport { CurrentPtr } from \"./types\";\r\n\r\nconst MODELS_ROOT = new Directory(Paths.document, \"papillon-models\");\r\n\r\nexport async function getCurrentPtr(): Promise<CurrentPtr | null> {\r\n  const currentPtrFile = new File(MODELS_ROOT, \"current.json\");\r\n  log(`[MODELUPDATER] Lecture du pointeur actuel: ${currentPtrFile.uri}`);\r\n  \r\n  // Vérifier si le répertoire parent existe\r\n  if (!MODELS_ROOT.exists) {\r\n    log(\"[PTR] Répertoire papillon-models n'existe pas\");\r\n    return null;\r\n  }\r\n  \r\n  if (!currentPtrFile.exists) {\r\n    log(\"[PTR] Aucun pointeur trouvé.\");\r\n    return null;\r\n  }\r\n  \r\n  try {\r\n    const ptr = await readJSON<CurrentPtr>(currentPtrFile.uri);\r\n    log(`[MODELUPDATER] Actuel: ${ptr.name} v${ptr.version}`);\r\n    return ptr;\r\n  } catch (error) {\r\n    log(`[PTR] Erreur lecture pointeur: ${String(error)}`);\r\n    return null;\r\n  }\r\n}\r\n\r\nexport async function setCurrentPtr(ptr: CurrentPtr) {\r\n  log(`[PTR] Mise à jour du pointeur -> ${ptr.name} v${ptr.version}`);\r\n  await ensureDir(MODELS_ROOT.uri);\r\n  const currentPtrFile = new File(MODELS_ROOT, \"current.json\");\r\n  await writeJSON(currentPtrFile.uri, ptr);\r\n}\r\n\r\nasync function smokeTestModel(dirUri: string) {\r\n  log(`[MODELUPDATER] Test du modèle: ${dirUri}model/model.tflite`);\r\n  const m = await loadTensorflowModel({ url: dirUri + \"model/model.tflite\" });\r\n  const inputShape = m?.inputs?.[0]?.shape;\r\n  const batchSize = inputShape?.[0] ?? 1;\r\n  const maxLen = inputShape?.[1] ?? 128;\r\n  const totalElements = batchSize * maxLen;\r\n  log(`[MODELUPDATER] Input shape: ${inputShape}, batchSize=${batchSize}, maxLen=${maxLen}, totalElements=${totalElements}`);\r\n  \r\n  const inputArr = new Int32Array(totalElements);\r\n  inputArr.fill(0);\r\n  \r\n  await m.run([inputArr]);\r\n  log(\"[MODELUPDATER] Test réussi\");\r\n}\r\n\r\nexport async function checkAndUpdateModel(\r\n  appVersion: string,\r\n  manifestUrl?: string\r\n) {\r\n  return withLock(new File(MODELS_ROOT, \".update.lock\").uri, async () => {\r\n    log(\"[MODELUPDATER] Démarrage de l'updater\");\r\n\r\n    if (!(await isInternetReachable())) {\r\n      log(\"[MODELUPDATER] Pas de connexion internet. Annulation.\");\r\n      return {\r\n        updated: false,\r\n        using: await getCurrentPtr(),\r\n        reason: \"offline\",\r\n      };\r\n    }\r\n\r\n    if (!manifestUrl) {\r\n      throw new Error(\"manifestUrl is required\");\r\n    }\r\n    const latest = await fetchManifest(manifestUrl, appVersion);\r\n    validateManifest(latest);\r\n    log(\"[MODELUPDATER] Manifest valide\");\r\n\r\n    if (\r\n      latest.compatible_versions?.length &&\r\n      !satisfiesAll(appVersion, latest.compatible_versions)\r\n    ) {\r\n      log(\r\n        `[MODELUPDATER] Version app ${appVersion} incompatible avec ${latest.compatible_versions.join(\", \")}`\r\n      );\r\n      return {\r\n        updated: false,\r\n        using: await getCurrentPtr(),\r\n        reason: \"incompatible\",\r\n      };\r\n    }\r\n    log(\"[MODELUPDATER] Compatible\");\r\n\r\n    log(\"[MODELUPDATER] Vérification si déjà à jour…\");\r\n    const current = await getCurrentPtr();\r\n    if (\r\n      current &&\r\n      current.version === latest.version &&\r\n      current.name === latest.name\r\n    ) {\r\n      log(\"[MODELUPDATER] Déjà à jour\");\r\n      return { updated: false, using: current, reason: \"same-version\" };\r\n    }\r\n    log(\"[MODELUPDATER] Nouvelle version détectée\");\r\n\r\n    const magicFile = new File(MODELS_ROOT, `tmp_${Date.now()}.magic`);\r\n    log(\r\n      `[MODELUPDATER] Téléchargement du nouveau modèle: ${latest.download_url}`\r\n    );\r\n    const downloadedFile = await File.downloadFileAsync(latest.download_url, MODELS_ROOT);\r\n    await downloadedFile.move(magicFile);\r\n    log(`[MODELUPDATER] Téléchargement terminé -> ${magicFile.uri}`);\r\n\r\n    if (latest.size_bytes) {\r\n      await verifySize(magicFile.uri, latest.size_bytes);\r\n      log(\"[MODELUPDATER] Taille correcte\");\r\n    }\r\n\r\n    if (latest.sha256) {\r\n      const hex = await fileSha256Hex(magicFile.uri);\r\n      if (hex !== latest.sha256.toLowerCase()) {\r\n        throw new Error(`sha256-mismatch expected=${latest.sha256} got=${hex}`);\r\n      }\r\n      log(\"[MODELUPDATER] Intégrité OK\");\r\n    }\r\n\r\n    const staging = new Directory(MODELS_ROOT, `_staging_${latest.name}_${latest.version}`);\r\n    await extractMagicToStaging(magicFile.uri, staging.uri);\r\n    log(\"[MODELUPDATER] Extraction terminée\");\r\n\r\n    const infos = (await validateExtractedTree(staging.uri)) as {\r\n      name: string;\r\n      version: string;\r\n    };\r\n    if (infos.name !== latest.name || infos.version !== latest.version) {\r\n      throw new Error(\"infos-mismatch\");\r\n    }\r\n    log(\"[MODELUPDATER] Structure valide\");\r\n\r\n    log(\"[MODELUPDATER] Lancement du test\");\r\n    await smokeTestModel(staging.uri);\r\n\r\n    const modelDir = new Directory(MODELS_ROOT, latest.name);\r\n    const finalDir = new Directory(modelDir, latest.version);\r\n    log(`[MODELUPDATER] Promotion vers dossier final: ${finalDir.uri}`);\r\n    await ensureDir(modelDir.uri);\r\n    if (finalDir.exists) {\r\n      log(\"[MODELUPDATER] Suppression ancienne version…\");\r\n      finalDir.delete();\r\n    }\r\n    staging.move(finalDir);\r\n    log(\"[MODELUPDATER] Promotion effectuée ✅\");\r\n\r\n    const nextPtr: CurrentPtr = {\r\n      name: latest.name,\r\n      version: latest.version,\r\n      dir: finalDir.uri,\r\n    };\r\n    await setCurrentPtr(nextPtr);\r\n\r\n    try {\r\n      log(`[MODELUPDATER] Suppression fichier temporaire: ${magicFile.uri}`);\r\n      magicFile.delete();\r\n    } catch (e) {\r\n      log(`[MODELUPDATER]  Erreur suppression temp: ${String(e)}`);\r\n    }\r\n\r\n    log(\"[MODELUPDATER] Mise a jour terminé\");\r\n    return { updated: true, using: nextPtr };\r\n  });\r\n}\r\n\r\nexport function getActivePaths(ptr: CurrentPtr) {\r\n  const base = ptr.dir;\r\n  return {\r\n    model: base + \"model/model.tflite\",\r\n    tokenizer: base + \"model/tokenizer.json\",\r\n    labels: base + \"model/labels.json\",\r\n    infos: base + \"metadata.json\",\r\n  };\r\n}\r\n"
  },
  {
    "path": "utils/magic/updater/integrity.ts",
    "content": "import * as Crypto from \"expo-crypto\";\r\nimport * as FileSystem from \"expo-file-system/legacy\";\r\n\r\nexport async function fileSha256Hex(uri: string): Promise<string> {\r\n  const b64 = await FileSystem.readAsStringAsync(uri, {\r\n    encoding: FileSystem.EncodingType.Base64,\r\n  });\r\n  const bin = atob(b64);\r\n  const bytes = new Uint8Array(bin.length);\r\n  for (let i = 0; i < bin.length; i++) {bytes[i] = bin.charCodeAt(i);}\r\n  const digest = await Crypto.digest(\r\n    Crypto.CryptoDigestAlgorithm.SHA256,\r\n    bytes\r\n  );\r\n  return Array.from(new Uint8Array(digest as ArrayBuffer))\r\n    .map(b => b.toString(16).padStart(2, \"0\"))\r\n    .join(\"\");\r\n}\r\n\r\nexport async function verifySize(uri: string, expected: number) {\r\n  const stat = await FileSystem.getInfoAsync(uri);\r\n  if (!stat.exists) {throw new Error(\"file-missing\");}\r\n  if ((stat.size ?? -1) !== expected) {\r\n    throw new Error(\r\n      `size-mismatch expected=${expected} got=${stat.size ?? -1}`\r\n    );\r\n  }\r\n}\r\n"
  },
  {
    "path": "utils/magic/updater/manifest.ts",
    "content": "import { fetchJsonWithRetry } from \"./network\";\r\nimport { cmp, satisfiesAll } from \"./semver\";\r\nimport { ApiModel } from \"./types\";\r\n\r\nexport async function fetchManifest(\r\n  url: string,\r\n  appVersion: string\r\n): Promise<ApiModel> {\r\n  const data = await fetchJsonWithRetry<{ models: ApiModel[] }>(url);\r\n\r\n  if (!Array.isArray(data.models)) {\r\n    throw new Error(\"Le manifest doit contenir un tableau 'models'.\");\r\n  }\r\n\r\n  const compatible = data.models.filter(m =>\r\n    satisfiesAll(appVersion, m.compatible_versions)\r\n  );\r\n\r\n  if (compatible.length === 0) {\r\n    throw new Error(\r\n      `Aucun modèle compatible trouvé pour appVersion ${appVersion}`\r\n    );\r\n  }\r\n\r\n  let mostRecent = compatible[0];\r\n  \r\n  for (let i = 1; i < compatible.length; i++) {\r\n    const current = compatible[i];\r\n    \r\n    const isMoreRecent = compareModels(current, mostRecent);\r\n    if (isMoreRecent > 0) {\r\n      mostRecent = current;\r\n    }\r\n  }\r\n\r\n  return mostRecent;\r\n}\r\n\r\nfunction compareModels(a: ApiModel, b: ApiModel): number {\r\n  if (a.date_created && b.date_created) {\r\n    const dateA = new Date(a.date_created);\r\n    const dateB = new Date(b.date_created);\r\n    const dateDiff = dateA.getTime() - dateB.getTime(); \r\n    if (dateDiff !== 0) {\r\n      return dateDiff;\r\n    }\r\n  }\r\n  else if (a.date_created && !b.date_created) {\r\n    return 1;\r\n  }\r\n  else if (!a.date_created && b.date_created) {\r\n    return -1;\r\n  }\r\n  \r\n  return cmp(a.version, b.version);\r\n}\r\n\r\nexport function validateManifest(m: ApiModel): void {\r\n  if (!m.name || !m.version || !m.download_url || !m.sha256) {\r\n    throw new Error(\r\n      \"Manifest incomplet (name, version, download_url, sha256 requis).\"\r\n    );\r\n  }\r\n  if (!Array.isArray(m.compatible_versions)) {\r\n    throw new Error(\"compatible_versions doit être un tableau.\");\r\n  }\r\n  if (!/^[0-9a-f]{64}$/i.test(m.sha256)) {\r\n    throw new Error(\"sha256 invalide (doit être 64 hex).\");\r\n  }\r\n}\r\n"
  },
  {
    "path": "utils/magic/updater/network.ts",
    "content": "import * as Network from \"expo-network\";\r\n\r\nimport { ApiResponse } from \"./types\";\r\n\r\nexport async function isInternetReachable(): Promise<boolean> {\r\n  const s = await Network.getNetworkStateAsync();\r\n  return Boolean(s.isInternetReachable ?? s.isConnected);\r\n}\r\n\r\nexport async function fetchJsonWithRetry<T>(\r\n  url: string,\r\n  retries = 3,\r\n  backoffMs = 800\r\n): Promise<T> {\r\n  let last: unknown;\r\n  for (let attempt = 1; attempt <= retries; attempt++) {\r\n    try {\r\n      const res = await fetch(url);\r\n      if (!res.ok) {throw new Error(`HTTP ${res.status}`);}\r\n      return (await res.json()) as T;\r\n    } catch (e) {\r\n      last = e;\r\n      if (attempt < retries)\r\n      {await new Promise(r => setTimeout(r, backoffMs * attempt));}\r\n    }\r\n  }\r\n  throw new Error(`fetch-failed: ${String(last)}`);\r\n}\r\n\r\nexport async function fetchLatestManifest(url: string) {\r\n  return (await fetchJsonWithRetry<ApiResponse>(url)).model;\r\n}\r\n"
  },
  {
    "path": "utils/magic/updater/semver.ts",
    "content": "export type SemverTuple = [number, number, number];\r\n\r\nexport function parse(v: string): SemverTuple {\r\n  const [maj = \"0\", min = \"0\", patch = \"0\"] = v\r\n    .replace(/^v/i, \"\")\r\n    .trim()\r\n    .split(\".\");\r\n  return [\r\n    parseInt(maj, 10) || 0,\r\n    parseInt(min, 10) || 0,\r\n    parseInt(patch, 10) || 0,\r\n  ];\r\n}\r\n\r\nexport function cmp(a: string, b: string): number {\r\n  const aa = parse(a);\r\n  const bb = parse(b);\r\n  for (let i = 0; i < 3; i++) {\r\n    if (aa[i] > bb[i]) {return 1;}\r\n    if (aa[i] < bb[i]) {return -1;}\r\n  }\r\n  return 0;\r\n}\r\n\r\nexport function satisfies(version: string, constraint: string): boolean {\r\n  const range = constraint.trim();\r\n  const dash = range.match(/^(\\S+)\\s*-\\s*(\\S+)$/);\r\n  if (dash) {\r\n    const [, lo, hi] = dash;\r\n    return cmp(version, lo) >= 0 && cmp(version, hi) <= 0;\r\n  }\r\n  const m = range.match(/^(>=|<=|>|<|=)?\\s*(\\S+)$/);\r\n  if (!m) {return false;}\r\n  const op = m[1] || \"=\";\r\n  const v = m[2];\r\n  switch (op) {\r\n  case \">\":\r\n    return cmp(version, v) > 0;\r\n  case \">=\":\r\n    return cmp(version, v) >= 0;\r\n  case \"<\":\r\n    return cmp(version, v) < 0;\r\n  case \"<=\":\r\n    return cmp(version, v) <= 0;\r\n  case \"=\":\r\n    return cmp(version, v) === 0;\r\n  default:\r\n    return false;\r\n  }\r\n}\r\n\r\nexport function satisfiesAll(version: string, constraints: string[]): boolean {\r\n  return constraints.every(c => satisfies(version, c));\r\n}\r\n"
  },
  {
    "path": "utils/magic/updater/types.ts",
    "content": "export type CurrentPtr = { name: string; version: string; dir: string };\r\n\r\nexport type ApiModel = {\r\n  name: string;\r\n  version: string;\r\n  download_url: string;\r\n  sha256: string;\r\n  size_bytes?: number;\r\n  compatible_versions: string[];\r\n  date_created?: string;\r\n};\r\n\r\nexport type ApiResponse = { model: ApiModel };\r\n"
  },
  {
    "path": "utils/native/AnimatedNavigator.ts",
    "content": "import type {\n  ParamListBase,\n  StackNavigationState,\n} from \"@react-navigation/native\";\nimport {\n  createNativeStackNavigator,\n  type NativeStackNavigationEventMap,\n  type NativeStackNavigationOptions,\n} from \"@react-navigation/native-stack\";\nimport { withLayoutContext } from \"expo-router\";\n\nconst { Navigator } = createNativeStackNavigator();\n\nexport const Stack = withLayoutContext<\n  NativeStackNavigationOptions,\n  typeof Navigator,\n  StackNavigationState<ParamListBase>,\n  NativeStackNavigationEventMap\n>(Navigator);\n"
  },
  {
    "path": "utils/native/georeverse.ts",
    "content": "import { error } from \"../logger/logger\";\n\nexport async function GeographicReverse(lat: number, lon: number): Promise<GeoInfo> {\n  try {\n    let retries = 3;\n    let res: Response = new Response();\n\n    while (retries > 0) {\n      res = await fetch(\n        `https://data.geopf.fr/geocodage/reverse?lat=${lat}&lon=${lon}&limit=1&index=parcel,poi,address`\n      );\n\n      if (res.ok) {\n        break;\n      }\n\n      retries--;\n      \n      if (retries > 0) {\n        await new Promise(resolve => setTimeout(resolve, 1000));\n      } else {\n        throw new Error(`Failed after 3 retries. Status: ${res.status}`);\n      }\n    }\n\n\n    if (!res.ok) {\n      throw new Error(`Status: ${res.status}`);\n    }\n\n    const response = await res.json();\n\n    const feature = response?.features?.[0];\n    if (!feature?.properties?.city || !feature?.properties?.postcode) {\n      throw new Error(JSON.stringify(feature));\n    }\n\n    return {\n      city: feature.properties.city[0],\n      postalCode: Number(feature.properties.postcode),\n      longitude: feature.geometry.coordinates[0],\n      latitude: feature.geometry.coordinates[1]\n    };\n\n  } catch (err) {\n    error(String(err))\n  }\n}\n\nexport async function GeographicQuerying(q: string, retry = 3): Promise<GeoInfo> {\n  try {\n    let retries = retry;\n    let res: Response = new Response();\n\n    while (retries > 0) {\n      res = await fetch(\n        `https://data.geopf.fr/geocodage/search?q=${q}`\n      );\n\n      if (res.ok) {\n        break;\n      }\n\n      retries--;\n      if (retries > 0) {\n        await new Promise(resolve => setTimeout(resolve, 1000));\n      } else {\n        throw new Error(`Failed after 3 retries. Status: ${res.status}`);\n      }\n    }\n\n    const response = await res.json();\n\n    const feature = response?.features?.[0];\n    if (!feature?.properties?.city || !feature?.properties?.postcode) {\n      throw new Error(JSON.stringify(feature));\n    }\n\n    return {\n      city: feature.properties.city[0],\n      postalCode: Number(feature.properties.postcode),\n      longitude: feature.geometry.coordinates[0],\n      latitude: feature.geometry.coordinates[1]\n    };\n\n  } catch (err) {\n    error(String(err))\n  }\n}\n\nexport async function GeographicSearchCities(q: string, retry = 3): Promise<GeoSearchCityInfo[]> {\n  try {\n    let retries = retry;\n    let res: Response = new Response();\n\n    while (retries > 0) {\n      res = await fetch(\n        `https://data.geopf.fr/geocodage/search?q=${q}`\n      );\n\n      if (res.ok) {\n        break;\n      }\n\n      retries--;\n      if (retries > 0) {\n        await new Promise(resolve => setTimeout(resolve, 1000));\n      } else {\n        throw new Error(`Failed after 3 retries. Status: ${res.status}`);\n      }\n    }\n\n    const response = await res.json();\n\n    const resp = response?.features.map((feature: any) => ({\n      id: feature.properties.banId,\n      city: feature.properties.city,\n      context: feature.properties.context,\n      importance: feature.properties.score,\n      postalCode: Number(feature.properties.postcode),\n      longitude: feature.geometry.coordinates[0],\n      latitude: feature.geometry.coordinates[1]\n    })) ?? [];\n\n    return resp;\n  } catch (err) {\n    error(String(err))\n  }\n}\n\nexport interface GeoInfo {\n  city: string;\n  postalCode: number;\n  latitude: number;\n  longitude: number;\n}\n\nexport interface GeoSearchCityInfo {\n  id: string;\n  city: string;\n  citycode: string;\n  context: string;\n  importance: number;\n  postalCode: number;\n  latitude: number;\n  longitude: number;\n}"
  },
  {
    "path": "utils/native/position.ts",
    "content": "import * as Location from \"expo-location\";\n\nexport interface CurrentPosition {\n  longitude: number\n  latitude: number\n}\n\nexport const getCurrentPosition = async (): Promise<CurrentPosition | null> => {\n  try {\n    const permission = await Location.requestForegroundPermissionsAsync()\n    if (!permission.granted) {\n      return null\n    }\n    const { coords } = await Location.getCurrentPositionAsync({ accuracy: Location.Accuracy.High });\n\n    return {\n      longitude: coords.longitude,\n      latitude: coords.latitude\n    };\n  }\n  catch {\n    return null;\n  }\n};\n\nexport const calculateDistanceBetweenPositions = (lat1: number, lon1: number, lat2: number, lon2:number) => {\n  const r = 6371e3; // metres\n  const p1 = lat1 * Math.PI/180;\n  const p2 = lat2 * Math.PI/180;\n  const dp = (lat2-lat1)*Math.PI/180;\n  const da = (lon2-lon1)*Math.PI/180;\n\n  const a = Math.sin(dp/2) * Math.sin(dp/2) + Math.cos(p1) * Math.cos(p2) * Math.sin(da/2) * Math.sin(da/2)\n  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n\n  return r * c;\n}"
  },
  {
    "path": "utils/news/cleanUpHTMLNews.ts",
    "content": "export const cleanHtmlForArticle = (htmlString: string): string => {\n    // 1. Define the unique block delimiter\n    const specialDelimiter = '<br />';\n\n    // 2. Pre-cleanup: Normalize whitespace, remove comments, and common entities\n    let cleaned = htmlString\n        .replace(/<!--[\\s\\S]*?-->/g, '') // Remove HTML comments\n        .replace(/&nbsp;/g, ' ') // Replace non-breaking spaces with standard space\n        .replace(/\\r/g, '') // Remove carriage returns\n        .trim();\n\n    // --- Core Cleaning Steps ---\n\n    // 3. Remove all attributes (style, class, id, etc.) except for 'href' on 'a' tags.\n    cleaned = cleaned.replace(/<([a-z0-9]+)(\\s+[^>]*)*>/ig, (match, tagName) => {\n        const lowerTag = tagName.toLowerCase();\n        \n        // Custom logic for <a>: keep the href attribute\n        if (lowerTag === 'a') {\n            const hrefMatch = match.match(/href=[\"']([^\"']+)[\"']/i);\n            const href = hrefMatch ? ` href=\"${hrefMatch[1]}\"` : '';\n            return `<a${href}>`;\n        }\n        \n        // For all other tags, remove all attributes\n        return `<${lowerTag}>`;\n    });\n    \n    // 4. Block Segmentation: Replace structural/unwanted tags (span, div, br) with the block delimiter.\n    cleaned = cleaned.replace(/<\\/?(?:span|div|br)\\b[^>]*>/ig, specialDelimiter);\n\n    // 5. Clean up redundant delimiters and trim.\n    cleaned = cleaned.replace(new RegExp(`${specialDelimiter}+`, 'g'), specialDelimiter);\n    cleaned = cleaned.replace(new RegExp(`^${specialDelimiter}|${specialDelimiter}$`, 'g'), '');\n\n\n    // 6. Structural Normalization (Paragraph/List Creation):\n    const blocks = cleaned.split(specialDelimiter)\n        .map(block => block.trim())\n        .filter(block => block.length > 0);\n\n    let finalHtml = '';\n    // Regex to detect blocks starting with a bullet point (• or -) followed by optional space.\n    const listMarkerRegex = /^[\\•\\-]\\s*(.*)$/;\n    // Updated set of allowed tags for cleanup step a)\n    const allowedTagsRegex = 'h[1-4]|p|b|i|a|u|ul|ol|li';\n\n    blocks.forEach((block) => {\n        // a) Remove remaining disallowed tags from within the block, keeping their content.\n        block = block.replace(new RegExp(`<(?!\\/?(?:${allowedTagsRegex})\\\\b)[^>]+>`, 'ig'), '').trim();\n\n        if (block.length === 0) return; // Skip empty blocks after cleanup\n\n        // Prevent nested <p> tags by stripping leading/trailing <p> tags from the block content\n        block = block.replace(/^<p>\\s*/i, '').replace(/\\s*<\\/p>$/i, '').trim();\n\n        const listMatch = block.match(listMarkerRegex);\n\n        if (listMatch) {\n            // This block looks like a list item\n            const listItemContent = listMatch[1].trim();\n\n            // *** USER REQUESTED LOGIC (INVALID HTML BUT REQUIRED) ***\n            // Encapsulate each list item in its own <ul> block, followed by the specialDelimiter.\n            finalHtml += `<ul><li>${listItemContent}</li></ul>${specialDelimiter}`;\n            // *******************************************************\n\n        } else {\n            // This block is NOT a list item\n            \n            // Treat as a standard paragraph, followed by the specialDelimiter.\n            finalHtml += `<p>${block}</p>${specialDelimiter}`;\n        }\n    });\n\n    // 7. Final cleanup for a **single line**: replace specialDelimiter with an empty string.\n    // This removes all delimiters, resulting in a continuous single line of HTML.\n    return finalHtml.trim()\n        .replace(new RegExp(specialDelimiter + '+$'), '') // Remove trailing delimiters\n        .replace(new RegExp(`${specialDelimiter}+`, 'g'), '') // **KEY CHANGE:** Replace all remaining delimiters with an empty string\n        .replace(/\\s+/g, ' '); // **Optional:** Collapse all remaining whitespace (including spaces between tags) to a single space for maximum compression.\n};"
  },
  {
    "path": "utils/news/getAttachmentIcon.ts",
    "content": "import { Attachment } from \"@/services/shared/attachment\";\n\nexport const getAttachmentIcon = (attachment: Attachment) => {\n  if(attachment.type === 0) {\n    return \"link\"\n  }\n\n  if(attachment.name.endsWith(\".png\") || attachment.name.endsWith(\".jpg\") || attachment.name.endsWith(\".jpeg\") || attachment.name.endsWith(\".gif\") || attachment.name.endsWith(\".webp\")) {\n    return \"gallery\"\n  }\n\n  return \"paper\"\n}"
  },
  {
    "path": "utils/notification/reminder/helper.ts",
    "content": "import * as Notifications from 'expo-notifications';\nimport { Platform } from 'react-native';\n\nexport type ScheduledNotification = {\n  id: string;\n  title?: string;\n  body?: string;\n  data?: unknown;\n  trigger: Notifications.SchedulableNotificationTriggerInput;\n};\n\nNotifications.setNotificationHandler({\n  handleNotification: async () => ({\n    shouldShowAlert: true,\n    shouldPlaySound: false,\n    shouldSetBadge: false,\n    shouldShowBanner: true,\n    shouldShowList: true,\n  }),\n});\n\nexport async function requestNotificationPermissions(): Promise<boolean> {\n  const settings = await Notifications.getPermissionsAsync();\n  let finalStatus = settings.status;\n\n  if (Platform.OS === 'ios') {\n    const iosStatus = settings.ios?.status;\n    if (iosStatus === Notifications.IosAuthorizationStatus.NOT_DETERMINED) {\n      const result = await Notifications.requestPermissionsAsync({\n        ios: { allowAlert: true, allowBadge: true, allowSound: true },\n      });\n      finalStatus = result.status;\n    }\n  } else if (finalStatus !== 'granted') {\n    const result = await Notifications.requestPermissionsAsync();\n    finalStatus = result.status;\n  }\n\n  return finalStatus === 'granted';\n}\n\nexport async function scheduleNotification(\n  content: { title?: string; body?: string; data?: any },\n  trigger: Notifications.SchedulableNotificationTriggerInput\n): Promise<string> {\n  const id = await Notifications.scheduleNotificationAsync({ content, trigger });\n  return id;\n}\n\nexport async function scheduleNotificationAtDate(\n  title: string,\n  body: string,\n  date: Date,\n  data?: unknown\n): Promise<string> {\n  return scheduleNotification(\n    { title, body, data },\n    { type: Notifications.SchedulableTriggerInputTypes.DATE, date }\n  );\n}\n\nexport async function scheduleDailyNotification(\n  title: string,\n  body: string,\n  hour: number,\n  minute = 0,\n  data?: unknown\n): Promise<string> {\n  return scheduleNotification(\n    { title, body, data },\n    { type: Notifications.SchedulableTriggerInputTypes.CALENDAR, hour, minute, repeats: true }\n  );\n}\n\nexport async function getAllScheduledNotifications(): Promise<Notifications.NotificationRequest[]> {\n  return await Notifications.getAllScheduledNotificationsAsync();\n}\n\nexport async function cancelNotification(id: string): Promise<void> {\n  await Notifications.cancelScheduledNotificationAsync(id);\n}\n\nexport async function cancelAllNotifications(): Promise<void> {\n  await Notifications.cancelAllScheduledNotificationsAsync();\n}\n"
  },
  {
    "path": "utils/pronote/fetcher.ts",
    "content": "import type { Fetcher } from \"@literate.ink/utilities\";\n\n// PRONOTE weird user-agent check\nexport const customFetcher: Fetcher = async (options) => {\n\n  const response = await fetch(options.url, {\n    method: options.method,\n    headers: {\n      ...options.headers,\n      \"User-Agent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 19_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 PRONOTE Mobile APP Version/2.0.11\"\n    },\n    body: options.method !== \"GET\" ? options.content : void 0,\n    redirect: options.redirect\n  });\n\n  const content = await response.text();\n\n  return {\n    content,\n    status: response.status,\n\n    get headers() {\n      return response.headers;\n    }\n  };\n};"
  },
  {
    "path": "utils/pronote/name.ts",
    "content": "export function GetIdentityFromPronoteUsername(str: string): { firstName: string; lastName: string } {\n  const match = /[A-Z]{2,}(?:\\s[A-Z]{2,})*/.exec(str);\n\n  if (match) {\n    const lastName = match[0].trim();\n    const firstName = str.replace(lastName, \"\").trim();\n    return { firstName, lastName };\n  }\n\n  return { firstName: str.trim(), lastName: \"\" };\n}\n"
  },
  {
    "path": "utils/restaurant/detect-price.ts",
    "content": "import { CanteenHistoryItem } from \"@/services/shared/canteen\";\n\nexport function detectMealPrice (history: CanteenHistoryItem[]): number | null {\n  let mostFrequentAmount: number = 0;\n  let maxCount = 0;\n  const amountCount: Record<number, number> = {};\n\n  for (const consumption of history) {\n    if (consumption.amount < 0) {\n      const amount = consumption.amount * -1;\n      \n      if (amount >= 50 && amount <= 2000) {\n        amountCount[amount] = (amountCount[amount] || 0) + 1;\n\n        if (amountCount[amount] > maxCount) {\n          maxCount = amountCount[amount];\n          mostFrequentAmount = amount;\n        }\n      }\n    }\n  }\n  \n  return maxCount > 0 ? mostFrequentAmount : null;\n}"
  },
  {
    "path": "utils/services/helper.ts",
    "content": "import { ImageSourcePropType } from \"react-native\";\n\nimport { Services } from \"@/stores/account/types\";\n\nexport function getServiceName(service: Services): string {\n  switch(service) {\n  case Services.TURBOSELF:\n    return \"TurboSelf\";\n  case Services.ARD:\n    return \"ARD\";\n  case Services.IZLY:\n    return \"Izly\";\n  case Services.ALISE:\n    return \"Alise\";\n  case Services.ECOLEDIRECTE:\n    return \"ÉcoleDirecte\";\n  case Services.LANNION:\n    return \"IUT de Lannion\";\n  default:\n    return \"Pronote\";\n  }\n}\n\nexport function getServiceLogo(service: Services): ImageSourcePropType {\n  switch(service) {\n  case Services.PRONOTE:\n    return require(\"@/assets/images/service_pronote.png\")\n  case Services.SKOLENGO:\n    return require(\"@/assets/images/service_skolengo.png\")\n  case Services.LANNION:\n    return require(\"@/assets/images/univ_lannion.png\")\n  case Services.TURBOSELF:\n    return require(\"@/assets/images/turboself.png\")\n  case Services.ARD:\n    return require(\"@/assets/images/ard.png\")\n  case Services.IZLY:\n    return require(\"@/assets/images/izly.png\")\n  case Services.ECOLEDIRECTE:\n    return require(\"@/assets/images/ecoledirecte.png\")\n  case Services.ALISE:\n    return require(\"@/assets/images/alise.jpg\")\n  default: \n    return require(\"@/assets/images/turboself.png\")\n  }\n}\n\nexport function getServiceBackground(service: Services): ImageSourcePropType {\n  switch(service) {\n  case Services.TURBOSELF:\n    return require(\"@/assets/images/turboself_background_card.png\")\n  case Services.IZLY:\n    return require(\"@/assets/images/izly_background_card.png\")\n  case Services.ARD:\n    return require(\"@/assets/images/ard_background_card.png\")\n  case Services.ECOLEDIRECTE:\n    return require(\"@/assets/images/card_background/ecoledirecte.png\")\n  case Services.ALISE:\n    return require(\"@/assets/images/alise_background_card.png\")\n  default: \n    // eslint-disable-next-line @typescript-eslint/no-require-imports\n    return require(\"@/assets/images/ard_background_card.png\")\n  }\n}\n\nexport function getServiceColor(service: Services): string {\n  switch(service) {\n  case Services.TURBOSELF:\n    return \"#E70026\"\n  case Services.ARD:\n    return \"#295888\"\n  case Services.ECOLEDIRECTE:\n    return \"#108ED1\"\n  case Services.ALISE:\n    return \"#108ED1\"\n  default:\n    return \"#E70026\"\n  }\n}\n\nexport function getCodeType(service: Services): string {\n  switch(service) {\n  case Services.ECOLEDIRECTE:\n    return \"CODE39\"\n  default:\n    return \"QR\"\n  }\n}\n\nexport function isSelfModuleEnabledED(additionals?: Record<string, any>): boolean {\n  if (!additionals) {return false;}\n  for (const module of additionals[\"modules\"] as Array<{badge: number, code: string, enable: true, ordre: number, params: Array<any>}>) {\n    if (module.code === \"CANTINE_BARCODE\" && module.enable) {\n      if (module.params && module.params.numeroBadge)\n      {return true;}\n    }\n  }\n  return false;\n}"
  },
  {
    "path": "utils/services/periods.ts",
    "content": "import { t } from \"i18next\";\n\n\nexport const getPeriodName = (name: string) => {\n  // Clean up the string: remove digits and trim\n  // Remove common prefixes that might be leftover (like \"er\" from \"1er\") \n  let newName = name.replace(/^\\d{1,4}[a-zÀ-ù]{0,4}/, '').replace(/\\d/g, '').trim();\n\n  // Remove digits\n  newName = newName.replace(/\\d/g, '').trim();\n\n  switch (newName.toLowerCase()) {\n    case \"trimestre\":\n      return t(\"Grades_Trimester\");\n    case \"semestre\":\n      return t(\"Grades_Semester\");\n    case \"hors période\":\n      return t(\"Grades_OutPeriod\");\n    case \"bac blanc\":\n      return t(\"Grades_MockExamBac\");\n    case \"brevet blanc\":\n      return t(\"Grades_MockExamBrevet\");\n    case \"année\":\n      return t(\"Grades_Year\");\n    default:\n      return newName;\n  }\n}\n\nexport const isPeriodWithNumber = (name: string) => {\n  // return only digits\n  let newName = name.replace(/\\D/g, '').trim();\n\n  return newName.length > 0;\n}\n\nexport const getPeriodNumber = (name: string) => {\n  // return only digits\n  let newName = name.replace(/\\D/g, '').trim();\n\n  if (newName.length === 0) {\n    newName = name[0].toUpperCase();\n  }\n\n  return newName.toString()[0];\n}"
  },
  {
    "path": "utils/subjects/colors.ts",
    "content": "import { useAccountStore } from \"@/stores/account\";\n\nimport { cleanSubjectName } from \"./utils\";\n\nexport function getSubjectColor(subject: string): string {\n  const cleanedName = cleanSubjectName(subject)\n  const lastUsedAccount = useAccountStore.getState().lastUsedAccount;\n  const subjectProperties = useAccountStore.getState().accounts.find(a => a.id === lastUsedAccount)?.customisation?.subjects[cleanedName]\n  if (subjectProperties && subjectProperties.color && subjectProperties.color !== \"\") {\n    return subjectProperties.color;\n  }\n\n  const subjects = useAccountStore.getState().accounts.find(a => a.id === lastUsedAccount)?.customisation?.subjects\n  const ignoredColors = Object.values(subjects ?? {}).map(item => item.color)\n\n  const color = getRandomColor(ignoredColors)\n\n  setTimeout(() => {\n    useAccountStore.getState().setSubjectColor(cleanedName, color)\n  }, 0)\n\n  return color;\n}\n\nexport function getRandomColor(ignoredColors?: string[]) {\n  if (ignoredColors && ignoredColors.length !== Colors.length) {\n    const availableColors = Colors.filter(color => !ignoredColors.includes(color));\n    \n    if (availableColors.length > 0) {\n      return availableColors[Math.floor(Math.random() * availableColors.length)];\n    }\n  }\n\n  return Colors[Math.floor(Math.random() * Colors.length)];\n}\n\nexport const Colors = [\n  \"#C50017\",\n  \"#DA2400\",\n  \"#DD6B00\",\n  \"#E8901C\",\n  \"#E8B048\",\n  \"#6BAE00\",\n  \"#37BB12\",\n  \"#12BB67\",\n  \"#26B290\",\n  \"#26ABB2\",\n  \"#2DB9D8\",\n  \"#009EC5\",\n  \"#007FDA\",\n  \"#3A56D0\",\n  \"#7600CA\",\n  \"#962DD8\",\n  \"#B300CA\",\n  \"#C50066\",\n  \"#DD004A\",\n  \"#DD0030\"\n]"
  },
  {
    "path": "utils/subjects/emoji.ts",
    "content": "import { useAccountStore } from \"@/stores/account\";\n\nimport { cleanSubjectName, getSubjectFormat } from \"./utils\";\n\nexport function getSubjectEmoji(subject: string): string {\n  const cleanedName = cleanSubjectName(subject);\n  const lastUsedAccount = useAccountStore.getState().lastUsedAccount;\n  const subjectProperties = useAccountStore\n    .getState()\n    .accounts.find(a => a.id === lastUsedAccount)?.customisation?.subjects[\n    cleanedName\n  ];\n  if (subjectProperties && subjectProperties.emoji !== \"\") {\n    return subjectProperties.emoji;\n  }\n\n  const foundFormat = getSubjectFormat(subject);\n\n  const emoji = foundFormat?.emoji || \"🤓\";\n  useAccountStore.getState().setSubjectEmoji(cleanedName, emoji);\n  return emoji;\n}\n"
  },
  {
    "path": "utils/subjects/lesson_formats.json",
    "content": "[\r\n  {\r\n    \"label\": \"accompagnementperso\",\r\n    \"pretty\": \"Accompagnement Personnalisé\",\r\n    \"emoji\": \"🤝\",\r\n    \"formats\": [\r\n      \"Acccocpagnement pepsonnalisé\",\r\n      \"Accompaanement personnallsé\",\r\n      \"Accompaghnement persnonalisé\",\r\n      \"Accompagnement personnalisé\",\r\n      \"Accompagnement personnalisé Tle\",\r\n      \"Accompagnement pversonnalisé\",\r\n      \"Accompagnementpersonnalisé\",\r\n      \"Accompagnemt Perso\",\r\n      \"Accompagnemunt perspnnalisé\",\r\n      \"Accopmagnement personnaloisé\",\r\n      \"Acovpagnoment personnalisé\",\r\n      \"Actompagnement peosonanlisé\",\r\n      \"Acuompagrement personnalisé\",\r\n      \"Aczompagnement perbonnalisé\",\r\n      \"Afccompagnement personnalié\",\r\n      \"accaompagnemt perso\",\r\n      \"acccocpagnement pepsonnalise\",\r\n      \"acccompagnemnt personnalise\",\r\n      \"accmopagnement personnwalise\",\r\n      \"accmpagnement personnalies\",\r\n      \"accmpagqnemt perso\",\r\n      \"accomeagnemt persc\",\r\n      \"accommpagnemt perso\",\r\n      \"accompaanement personnallse\",\r\n      \"accompagemt perso\",\r\n      \"accompagemtp erso\",\r\n      \"accompaghnement persnonalise\",\r\n      \"accompagnement eprosonnalise\",\r\n      \"accompagnement personnalise\",\r\n      \"accompagnement personnalise (TP)\",\r\n      \"accompagnement personnalise tle\",\r\n      \"accompagnement personnaliset\",\r\n      \"accompagnement personnaylise\",\r\n      \"accompagnement pversonnalise\",\r\n      \"accompagnementperso\",\r\n      \"accompagnementpersonnalise\",\r\n      \"accompagnemenyt personnalise\",\r\n      \"accompagnemevt personnalisp\",\r\n      \"accompagnemt perseo\",\r\n      \"accompagnemt perso - groupe A\",\r\n      \"accompagnemt perso cap\",\r\n      \"accompagnemt perso groupe a\",\r\n      \"accompagnemt pesye\",\r\n      \"accompagnemt pevrso\",\r\n      \"accompagnemtperso\",\r\n      \"accompagnemtx perso\",\r\n      \"accompagnemunt perspnnalise\",\r\n      \"accompagnment personnalise\",\r\n      \"accompagnmtoberso\",\r\n      \"accompagnnmt pefmso\",\r\n      \"accompagnsegt perso\",\r\n      \"accompganement pwersonnalise\",\r\n      \"accompgcement personnnlise\",\r\n      \"accompwagnement personnalise\",\r\n      \"accopagnement personnalise\",\r\n      \"accopmagnement personnaloise\",\r\n      \"acovpagnoment personnalise\",\r\n      \"actompagnement peosonanlise\",\r\n      \"acuompagrement personnalise\",\r\n      \"acyogpagnemt perso\",\r\n      \"aczompagnement perbonnalise\",\r\n      \"afccompagnement personnalie\",\r\n      \"ahcompagnzment personnalise\",\r\n      \"cAcompagnement personnalisé\",\r\n      \"cacompagnement personnalise\",\r\n      \"kccowpagnement personnalise\",\r\n      \"kccowpagnement personnalisé\",\r\n      \"qccomapgnement personndlise\",\r\n      \"qccomapgnement personndlisé\",\r\n      \"consacperchorien\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"aidefrancais\",\r\n    \"pretty\": \"Aide Francais\",\r\n    \"emoji\": \"📖\",\r\n    \"formats\": [\r\n      \"ADE FARNCAIS\",\r\n      \"AIDE FRANCAIS\",\r\n      \"AIDE FRANCAIS (AP)\",\r\n      \"AIDE RANCAIS\",\r\n      \"AIDEFRANCAIS\",\r\n      \"AIDw FsANCAIS\",\r\n      \"aidbhfracais\",\r\n      \"aide francais 5e\",\r\n      \"aide francamis\",\r\n      \"aidefrancais\",\r\n      \"aidi rfanlais\",\r\n      \"aidk frawcais\",\r\n      \"aride fawncais\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"aideindivautres\",\r\n    \"pretty\": \"Aide Indiv Autres\",\r\n    \"emoji\": \"🧩\",\r\n    \"formats\": [\r\n      \"ADE INDIV. AUTRSE\",\r\n      \"AIDE INDIV. AUTERS\",\r\n      \"AIDE INDIV. AUTRES 4e\",\r\n      \"AIDE INDIV. AUTkRES\",\r\n      \"AIDEINDIV.AUTRES\",\r\n      \"AIED INDIV. AUoqES\",\r\n      \"AIxE IDvIV. AUTRES\",\r\n      \"Aide Indiv. Autres\",\r\n      \"AjDu NIDIV. AUTRES\",\r\n      \"ade indiv autrse\",\r\n      \"aide indiv auters\",\r\n      \"aide indiv autkres\",\r\n      \"aide indiv autres\",\r\n      \"aide indiv autres 4e\",\r\n      \"aideindiv autres\",\r\n      \"aideindivautres\",\r\n      \"aied indiv auoqes\",\r\n      \"aixe idviv autres\",\r\n      \"ajdu nidiv autres\",\r\n      \"cours de AIDE INDIV. AUTRES\",\r\n      \"cours de aide indiv autres\",\r\n      \"xIDoE INDIV. AUrRES\",\r\n      \"xidoe indiv aurres\",\r\n      \"zAIDE INDIV. AUTRES\",\r\n      \"zaide indiv autres\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"aideindivfrancais\",\r\n    \"pretty\": \"Aide Indiv Francais\",\r\n    \"emoji\": \"📘\",\r\n    \"formats\": [\r\n      \"AIDE IDIV. FRuANCAIS\",\r\n      \"AIDE INDIV. FRANCAIS\",\r\n      \"AIDE INDIV. FRANCAIS 5e\",\r\n      \"AIDE INDIV. FRANCAIS > salle 201\",\r\n      \"AIDE INDIV. FRANCAS\",\r\n      \"AIDE INDIV. FRANCASI\",\r\n      \"AIDE IhDIV.pFRANCnAIS\",\r\n      \"AIDE NIDIV. FRANCAIS\",\r\n      \"AIDE NIDIV. FRANCsAIS\",\r\n      \"AIDEINDIV.FRANCAIS\",\r\n      \"AIDEnIDNIV.mFRANCAIS\",\r\n      \"AIDrE INgIp. FRANCAIS\",\r\n      \"aide idiv fruancais\",\r\n      \"aide ihdiv pfrancnais\",\r\n      \"aide indiv francais\",\r\n      \"aide indiv francais 5e\",\r\n      \"aide indiv francais salle 201\",\r\n      \"aide indiv francas\",\r\n      \"aide indiv francasi\",\r\n      \"aide nidiv francais\",\r\n      \"aide nidiv francsais\",\r\n      \"aideindiv francais\",\r\n      \"aideindivfrancais\",\r\n      \"aidenidniv mfrancais\",\r\n      \"aidre ingip francais\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"aideindividualisee\",\r\n    \"pretty\": \"Aide Individualisee\",\r\n    \"emoji\": \"🎯\",\r\n    \"formats\": [\r\n      \"AIDE INDIIVDUALISEE\",\r\n      \"AIDE INDIVDUALISEE\",\r\n      \"AIDE INDIVIDUALISEE LV2\",\r\n      \"AIDE INDIVIbDUAbISEE\",\r\n      \"Aide Individualisee\",\r\n      \"aide individualisee 1ere\",\r\n      \"aide indvdiualisee\",\r\n      \"aideindividualisee\",\r\n      \"atde indviidualisel\",\r\n      \"avdecindividualiseem\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"aideindivmaths\",\r\n    \"pretty\": \"Aide Indiv Maths\",\r\n    \"emoji\": \"🧮\",\r\n    \"formats\": [\r\n      \"ADIE INDIV. MAgTHS\",\r\n      \"AIDE INDIV. AMTHS\",\r\n      \"AIDE INDIV. MATHS\",\r\n      \"AIDE INDIV. MATHS - groupe A\",\r\n      \"AIDE INDIV. MATHS 4e\",\r\n      \"AIDE INDIV. MATdHS\",\r\n      \"AIDE INDIe. MApnHS\",\r\n      \"AIDE NDIV. MATHS\",\r\n      \"AIDE NIDIV. MATHS\",\r\n      \"AIDEI NDIV. MATHS\",\r\n      \"AIDEINDIV.MATHS\",\r\n      \"AIDbeINDIV. MATHS\",\r\n      \"adie indiv magths\",\r\n      \"aidbeindiv maths\",\r\n      \"aide indie mapnhs\",\r\n      \"aide indiv amths\",\r\n      \"aide indiv matdhs\",\r\n      \"aide indiv maths\",\r\n      \"aide indiv maths 4e\",\r\n      \"aide indiv maths groupe a\",\r\n      \"aide ndiv maths\",\r\n      \"aide nidiv maths\",\r\n      \"aidei ndiv maths\",\r\n      \"aideindiv maths\",\r\n      \"aideindivmaths\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"aidelangues\",\r\n    \"pretty\": \"Aide Langues\",\r\n    \"emoji\": \"🗣️\",\r\n    \"formats\": [\r\n      \"AIDE LANGUES\",\r\n      \"AIDE LANGUES 3e\",\r\n      \"AIDE LANGUSE\",\r\n      \"AIDELANGUES\",\r\n      \"AlDE cANGEUS\",\r\n      \"AtDd LANGUES\",\r\n      \"aidd zangues\",\r\n      \"aide langues bac pro\",\r\n      \"aidelangues\",\r\n      \"amdv langue\",\r\n      \"apde languen\",\r\n      \"laide langue\",\r\n      \"yAIeE LANGsES\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"aidetravperson\",\r\n    \"pretty\": \"Aide Trav Person\",\r\n    \"emoji\": \"✍️\",\r\n    \"formats\": [\r\n      \"ADE TRVA PERSON\",\r\n      \"ADEaTRiV PERSON\",\r\n      \"AIDE TRAV PERSON\",\r\n      \"AIDE TRAV PERSON (accompagnement)\",\r\n      \"AIDE TRAupPERdSON\",\r\n      \"AIDETRAVPERSON\",\r\n      \"AfIDE TRAV PERSON\",\r\n      \"aide ravhpersot\",\r\n      \"aide trav person 2nde\",\r\n      \"aide travv person\",\r\n      \"aidetravperson\",\r\n      \"aioe hrav person\",\r\n      \"arde treav persow\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"aidevieprofess\",\r\n    \"pretty\": \"Aide Vie Profess\",\r\n    \"emoji\": \"💼\",\r\n    \"formats\": [\r\n      \"AID EVIE PROFESSv.\",\r\n      \"AIDE VI PROFESS.\",\r\n      \"AIDE VIE PROFESS. (option)\",\r\n      \"AIDE VIE PROFESS. 5e\",\r\n      \"AIDE VIE PROFfES.\",\r\n      \"AIDE Vh PROFEdS.\",\r\n      \"AIDEVIE RPOFESS.\",\r\n      \"AIDEVIEPROFESS.\",\r\n      \"AIvE VI EPROFxSS.\",\r\n      \"Aide Vie Profess.\",\r\n      \"aid evie professv\",\r\n      \"aide vh profeds\",\r\n      \"aide vi profess\",\r\n      \"aide vie profess\",\r\n      \"aide vie profess 5e\",\r\n      \"aide vie proffes\",\r\n      \"aidevie rpofess\",\r\n      \"aidevieprofess\",\r\n      \"aive vi eprofxss\",\r\n      \"bIDE qIE PROFESS.\",\r\n      \"bide qie profess\",\r\n      \"yAIDE VIE PROFSES.\",\r\n      \"yaide vie profses\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"aidevieprofession\",\r\n    \"pretty\": \"Aide Vie Profession\",\r\n    \"emoji\": \"🏢\",\r\n    \"formats\": [\r\n      \"AIDE VI EPROFESSIOsN.\",\r\n      \"AIDE VIE POFESSION.\",\r\n      \"AIDE VIE PROFESISON.\",\r\n      \"AIDE VIE PROFESSION.\",\r\n      \"AIDE VIE PROFESSION. LP\",\r\n      \"AIDE VIE PROFESSION. bac pro\",\r\n      \"AIDE VIE PROFSSION.\",\r\n      \"AIDE VIE PROqESSIOl.\",\r\n      \"AIDE VIE PRwFESSION.\",\r\n      \"AIDE oIE PROnFEkSION.\",\r\n      \"AIDEVIEPROFESSION.\",\r\n      \"AIDEs VIE PROFESSION.\",\r\n      \"aide oie pronfeksion\",\r\n      \"aide vi eprofessiosn\",\r\n      \"aide vie pofession\",\r\n      \"aide vie profesison\",\r\n      \"aide vie profession\",\r\n      \"aide vie profession bac pro\",\r\n      \"aide vie profession lp\",\r\n      \"aide vie profssion\",\r\n      \"aide vie proqessiol\",\r\n      \"aide vie prwfession\",\r\n      \"aides vie profession\",\r\n      \"aidevieprofession\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"allemand\",\r\n    \"pretty\": \"Allemand LV3\",\r\n    \"emoji\": \"🇩🇪\",\r\n    \"formats\": [\r\n      \"AELMAND LV2\",\r\n      \"ALEAMND LV2\",\r\n      \"ALELMAND LV1\",\r\n      \"ALLEAND LV3\",\r\n      \"ALLEMAD LV1\",\r\n      \"ALLEMAN DLV3\",\r\n      \"ALLEMAN LV1\",\r\n      \"ALLEMAND LV1\",\r\n      \"ALLEMAND LV1 special\",\r\n      \"ALLEMAND LV2 - groupe A\",\r\n      \"ALLEMAND LV2 3e\",\r\n      \"ALLEMAND LV3\",\r\n      \"ALLEMAND LV3 Tle\",\r\n      \"ALLEMANDLV1\",\r\n      \"ALLEMANDp LV2\",\r\n      \"ALLEMANbD LV1\",\r\n      \"ALhLEMADN LV1\",\r\n      \"ALLEMAND LVB\",\r\n      \"ALLEMAND LV B\",\r\n      \"Allemand Lv1\",\r\n      \"Allemand Lv2\",\r\n      \"ApLLEMAND LV\",\r\n      \"AuLLEMANy pV3\",\r\n      \"AzgEMAND LV2\",\r\n      \"LALEMAND LV1\",\r\n      \"LALEMAND LkV3\",\r\n      \"LLEMANDp LV1\",\r\n      \"adlemand l2\",\r\n      \"aelmand\",\r\n      \"aleamnd\",\r\n      \"alelmand\",\r\n      \"alhlemadn\",\r\n      \"alleand\",\r\n      \"allemad\",\r\n      \"alleman\",\r\n      \"allemanbd\",\r\n      \"allemand\",\r\n      \"allemand 3e\",\r\n      \"allemand groupe a\",\r\n      \"allemand lv1v\",\r\n      \"allemand lz3\",\r\n      \"allemand special\",\r\n      \"allemand tle\",\r\n      \"allemand vl2\",\r\n      \"allemandlv2\",\r\n      \"allemandlv3\",\r\n      \"allemandp\",\r\n      \"allemanid v3\",\r\n      \"azgemand\",\r\n      \"lLLEMAND LV3\",\r\n      \"lalemand\",\r\n      \"llemandp\",\r\n      \"lllemand\",\r\n      \"tllemand li\",\r\n      \"wLLEMANz LV3\",\r\n      \"wllemanz\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"allemandcorres\",\r\n    \"pretty\": \"Allemand LV1 Corres\",\r\n    \"emoji\": \"📬\",\r\n    \"formats\": [\r\n      \"ALLEAMND LV1 CORRES.\",\r\n      \"ALLEMADN LV1 CORRES.\",\r\n      \"ALLEMAND LV1 CORRE.\",\r\n      \"ALLEMAND LV1 CORRES.\",\r\n      \"ALLEMAND LV1 CORRES. CAP\",\r\n      \"ALLEMAND LV1 CORRESf.\",\r\n      \"ALLEMAND V1 CRORES.\",\r\n      \"ALLEMANDLV1CORRES.\",\r\n      \"ALLgMAND pV1 CORRES.\",\r\n      \"AqLEMANDLV1 CORRcS.\",\r\n      \"alleamnd corres\",\r\n      \"allemadn corres\",\r\n      \"allemand corre\",\r\n      \"allemand corres\",\r\n      \"allemand corres cap\",\r\n      \"allemand corresf\",\r\n      \"allemand v1 crores\",\r\n      \"allemandcorres\",\r\n      \"allemandlv1corres\",\r\n      \"allgmand pv1 corres\",\r\n      \"aqlemandlv1 corrcs\",\r\n      \"cours de ALLEMAND LV1 CORRES.\",\r\n      \"cours de allemand corres\",\r\n      \"hLLEMANh LV1 CORRES.\",\r\n      \"hllemanh corres\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"allemanddialect\",\r\n    \"pretty\": \"Allemand Dialect LV2\",\r\n    \"emoji\": \"🗨️\",\r\n    \"formats\": [\r\n      \"ALLEAMND DIefECT.LV1\",\r\n      \"ALLEMAN DAILECT.LV2\",\r\n      \"ALLEMAND DALECT.LV1\",\r\n      \"ALLEMAND DIALECT.L2\",\r\n      \"ALLEMAND DIALECT.LV1\",\r\n      \"ALLEMAND DIALECT.LV1 (option)\",\r\n      \"ALLEMAND DIALECT.LV2\",\r\n      \"ALLEMAND DIALECT.LV2 bac pro\",\r\n      \"ALLEMAND DIALECT.VL1\",\r\n      \"ALLEMAND DIALET.LV1p\",\r\n      \"ALLEMAND DIALETC.LVi2\",\r\n      \"ALLEMAND DIALETC.LkV1\",\r\n      \"ALLEMAND IDALECT.LV1\",\r\n      \"ALLEMANDDIALECT.LV1\",\r\n      \"ALLEMANDDIALECT.LV2\",\r\n      \"ALLEMpND DIALECT.LV2\",\r\n      \"ALesMAND DIALECT.LgV2\",\r\n      \"ALlEMANiD IALECT.LV2\",\r\n      \"Allemand Dialect.Lv1\",\r\n      \"Allemand Dialect.Lv2\",\r\n      \"alesmand dialect lgv2\",\r\n      \"alleamnd diefect\",\r\n      \"alleman dailect\",\r\n      \"allemand dalect\",\r\n      \"allemand dialect\",\r\n      \"allemand dialect bac pro\",\r\n      \"allemand dialect l2\",\r\n      \"allemand dialect vl1\",\r\n      \"allemand dialet lv1p\",\r\n      \"allemand dialetc lkv1\",\r\n      \"allemand dialetc lvi2\",\r\n      \"allemand idalect\",\r\n      \"allemanddialect\",\r\n      \"allemanid ialect\",\r\n      \"allempnd dialect\",\r\n      \"fALLbMqND DIALECT.LV2\",\r\n      \"fallbmqnd dialect\",\r\n      \"qLLEMANh DIALECT.LV2\",\r\n      \"qllemanh dialect\",\r\n      \"wLLEMANtD DIALEaT.LV1\",\r\n      \"wllemantd dialeat\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"allemandlvdebutant\",\r\n    \"pretty\": \"Allemand Lv Debutant\",\r\n    \"emoji\": \"📗\",\r\n    \"formats\": [\r\n      \"ALLEMAND LV DEBUTANT\",\r\n      \"ALLEMAND LV DEBUTANT 1ere\",\r\n      \"ALLEMAND LV EDBUTANT\",\r\n      \"ALLEMAND uLV DEBUTANT\",\r\n      \"alleaan dlv debutxnt\",\r\n      \"alleman dlv dbutant\",\r\n      \"allemand av debutjnt\",\r\n      \"allemand l vdebutant\",\r\n      \"allemand lv debotanmg\",\r\n      \"allemandlvdebutant\",\r\n      \"gallemand lv debutnt\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"allemandlvrenforce\",\r\n    \"pretty\": \"Allemand Lv Renforce\",\r\n    \"emoji\": \"📕\",\r\n    \"formats\": [\r\n      \"ALLEMAND LV RENFORCE 4e\",\r\n      \"ALLEMAND LV RENFORCE LV1\",\r\n      \"ALLEMAND LV RENoOqCE\",\r\n      \"ALLEMAND LV RNEFORClE\",\r\n      \"ALLEMAND LV RsFNORoE\",\r\n      \"ALsEMAND LV RENFORCs\",\r\n      \"aljlemandlv renforce\",\r\n      \"alleman dlv renforce\",\r\n      \"allemand dld renfnrce\",\r\n      \"allemand lv renforce\",\r\n      \"allemandlvrenforce\",\r\n      \"allhmandolv renforce\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"allemdiallvrenf\",\r\n    \"pretty\": \"Allem Dial Lv Renf\",\r\n    \"emoji\": \"💬\",\r\n    \"formats\": [\r\n      \"ALLEM.DIAL. LV REN.\",\r\n      \"ALLEM.DIAL. LV RENF.\",\r\n      \"ALLEM.DIAL. LV REnNF.\",\r\n      \"ALLEM.DIAL.LVRENF.\",\r\n      \"ALLEM.DIAL.vL pRENF.\",\r\n      \"ALLEM.DILA. LV REN.\",\r\n      \"ALLEM.tIAL. xV ERNF.\",\r\n      \"ALLEn.DIAL. LV RENF.\",\r\n      \"ALdLEM.DIAL. LV RENF.\",\r\n      \"ALrEM.DIAL. bLV RENFa\",\r\n      \"aldlem dial lv renf\",\r\n      \"allem dial lv ren\",\r\n      \"allem dial lv renf\",\r\n      \"allem dial lv rennf\",\r\n      \"allem dial lvrenf\",\r\n      \"allem dial vl prenf\",\r\n      \"allem dila lv ren\",\r\n      \"allem tial xv ernf\",\r\n      \"allemdiallvrenf\",\r\n      \"allen dial lv renf\",\r\n      \"alrem dial blv renfa\",\r\n      \"cours de ALLEM.DIAL. LV RENF.\",\r\n      \"cours de allem dial lv renf\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"anglais\",\r\n    \"pretty\": \"Anglais LV1\",\r\n    \"emoji\": \"🇬🇧\",\r\n    \"formats\": [\r\n      \"AGNiLAIS LV2\",\r\n      \"ANGALIS LV2\",\r\n      \"ANGLAI LV2\",\r\n      \"ANGLAIS LV1\",\r\n      \"ANGLAIS LV1 > salle 201\",\r\n      \"ANGLAIS LV2\",\r\n      \"ANGLAIS LV2 (TP)\",\r\n      \"ANGLAIS LV2 CAP\",\r\n      \"ANGLAIS LVA\",\r\n      \"ANGLAIS LV A\",\r\n      \"ANGLAIS VL2\",\r\n      \"ANGLAISLV1\",\r\n      \"ANGLAISLV2\",\r\n      \"ANGLIAS LVh1\",\r\n      \"ANGLIS LV1\",\r\n      \"AaGLAgS LV1\",\r\n      \"Anglais Lv1\",\r\n      \"ArGLAISLn1\",\r\n      \"ArGLAIv LV1\",\r\n      \"AzNGLASI LV2\",\r\n      \"aaglags\",\r\n      \"agnilais\",\r\n      \"angalis\",\r\n      \"angdlais l2v\",\r\n      \"anglai\",\r\n      \"anglairilv1\",\r\n      \"anglais\",\r\n      \"anglais cap\",\r\n      \"anglais salle 201\",\r\n      \"anglis\",\r\n      \"anllaishlv1\",\r\n      \"antlai dlv2\",\r\n      \"arglaiv\",\r\n      \"aznglasi\",\r\n      \"AGL1\",\r\n      \"AGL L1\",\r\n      \"AGL LV1\",\r\n      \"AGL LV1\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"anglaislvdebutant\",\r\n    \"pretty\": \"Anglais Lv Debutant\",\r\n    \"emoji\": \"📙\",\r\n    \"formats\": [\r\n      \"AGLAId LV DuBUTANT\",\r\n      \"ANGALIS LV DEBUTANT\",\r\n      \"ANGLAIS LV DEBUTANT\",\r\n      \"ANGLAIS LV DEBUTANT (accompagnement)\",\r\n      \"ANGLAIS LV DEBUTANT Tle\",\r\n      \"ANGLAISLVDEBUTANT\",\r\n      \"ANGLeIS LV DtBUTANjT\",\r\n      \"ANGcjIS LV EDBUTANT\",\r\n      \"AzNGLAIS Ls DlBUTANT\",\r\n      \"anglail lv debutant\",\r\n      \"anglais lv debbutant\",\r\n      \"anglaislrv dpbutant\",\r\n      \"anglaislvdebutant\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"anglaislvrenforce\",\r\n    \"pretty\": \"Anglais Lv Renforce\",\r\n    \"emoji\": \"📒\",\r\n    \"formats\": [\r\n      \"ANGLAIS LV RENFORCE\",\r\n      \"ANGLAIS LV RENFORCE Tle\",\r\n      \"ANGLAIS LV RNFORCE\",\r\n      \"ANGLAISL V RENFORE\",\r\n      \"ANGLAISLVRENFORCE\",\r\n      \"ANGLAISpLV RqNFORxCE\",\r\n      \"ANGLAISxuV RENFORCE\",\r\n      \"ANiGLsIS LV ReNFORCE\",\r\n      \"anglais lv reforce\",\r\n      \"anglais lv renforce special\",\r\n      \"anglaislvrenforce\",\r\n      \"anglxais lv renforce\",\r\n      \"valais lv renforce\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"arabecorresp\",\r\n    \"pretty\": \"Arabe LV2 Corresp\",\r\n    \"emoji\": \"🇸🇦\",\r\n    \"formats\": [\r\n      \"AARBE LV3 CORRESP.\",\r\n      \"ARAB ELV2 CORRESP.\",\r\n      \"ARAB EV1 CORRESP.\",\r\n      \"ARABE L1V CORRES.\",\r\n      \"ARABE L2aCORREdP.\",\r\n      \"ARABE LV1 CORRES.\",\r\n      \"ARABE LV1 CORRESP.\",\r\n      \"ARABE LV1 CORRESP. > salle 201\",\r\n      \"ARABE LV1sCORbESP.\",\r\n      \"ARABE LV2 CORRESP.\",\r\n      \"ARABE LV2 CORRESP. (accompagnement)\",\r\n      \"ARABE LV2cCOzRESP.\",\r\n      \"ARABE LV3 CORRESP.\",\r\n      \"ARABE LV3 CORRESP. LV1\",\r\n      \"ARABE LV3 CORRESPd.\",\r\n      \"ARABE LV3iCORREiP.\",\r\n      \"ARABE V2 CORRESP.\",\r\n      \"ARABE oVn CORRESP.\",\r\n      \"ARABEL V3 CkORRESP.\",\r\n      \"ARABELV1CORRESP.\",\r\n      \"ARABELV2 CORRESP.\",\r\n      \"ARABELV2CORRESP.\",\r\n      \"ARABELV3CORRESP.\",\r\n      \"ARABEhLV3 CORRESg.\",\r\n      \"ARABeE LV1 CORRESP.\",\r\n      \"ARABqE LV2 CORRESP.\",\r\n      \"ARAE LVq1 CORRESP.\",\r\n      \"ARAEB LV3oCoRRESP.\",\r\n      \"ARBE LV2 CORRESP.\",\r\n      \"ARjBe LV3 CORRSEP.\",\r\n      \"Arabe Lv1 Corresp.\",\r\n      \"Arabe Lv2 Corresp.\",\r\n      \"Arabe Lv3 Corresp.\",\r\n      \"aarbe corresp\",\r\n      \"arab elv2 corresp\",\r\n      \"arab ev1 corresp\",\r\n      \"arabe corres\",\r\n      \"arabe corresp\",\r\n      \"arabe corresp salle 201\",\r\n      \"arabe correspd\",\r\n      \"arabe l1v corres\",\r\n      \"arabe l2acorredp\",\r\n      \"arabe lv1scorbesp\",\r\n      \"arabe lv2ccozresp\",\r\n      \"arabe lv3icorreip\",\r\n      \"arabe ovn corresp\",\r\n      \"arabe v2 corresp\",\r\n      \"arabecorresp\",\r\n      \"arabee corresp\",\r\n      \"arabehlv3 corresg\",\r\n      \"arabel v1bcorrespu\",\r\n      \"arabel v3 ckorresp\",\r\n      \"arabelv1corresp\",\r\n      \"arabelv2 corresp\",\r\n      \"arabelv2corresp\",\r\n      \"arabelv3corresp\",\r\n      \"arabqe corresp\",\r\n      \"arae lvq1 corresp\",\r\n      \"araeb lv3ocorresp\",\r\n      \"arbe corresp\",\r\n      \"arjbe corrsep\",\r\n      \"cRABE LV3 CORRESP.\",\r\n      \"crabe corresp\",\r\n      \"mRABE LV2 CORlSP.\",\r\n      \"mrabe corlsp\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"arabedialcorr\",\r\n    \"pretty\": \"Arabe Dial LV2 Corr\",\r\n    \"emoji\": \"🕌\",\r\n    \"formats\": [\r\n      \"ARAB EDIAL.qLV3 CORR.\",\r\n      \"ARABE DAIL.LV2 CORR.\",\r\n      \"ARABE DAL.LV2 CORR.\",\r\n      \"ARABE DAL.LV2 COaRR.\",\r\n      \"ARABE DIAL.LV2 CORR.\",\r\n      \"ARABE DIAL.LV2 CORR. 1ere\",\r\n      \"ARABE DIAL.LV2 CORR. special\",\r\n      \"ARABE DIAL.LV2 CROR.\",\r\n      \"ARABE DIAL.LV3 CORR.\",\r\n      \"ARABE DIAL.LV3 CORR. (accompagnement)\",\r\n      \"ARABE DIAL.LV3 CgRR.\",\r\n      \"ARABE DIALL.V3 CORR.\",\r\n      \"ARABE DIALs.LV3 CORR.\",\r\n      \"ARABE DIL.LV2 CORR.\",\r\n      \"ARABE DIL.LV3 CORR.\",\r\n      \"ARABE DILA.LV2 CORR.\",\r\n      \"ARABEDIAL.LV2CORR.\",\r\n      \"ARABEDIAL.LV3CORR.\",\r\n      \"ARABElDIAj.LV3 CsORR.\",\r\n      \"ARABEm DIAL.LV 2CORR.\",\r\n      \"ARABr DIAL.LV3 xOdRR.\",\r\n      \"ARAEc DIAL.LV2 CORR.\",\r\n      \"AgRABE DIAL.LV3oCORR.\",\r\n      \"Arabe Dial.Lv3 Corr.\",\r\n      \"agrabe dial lv3ocorr\",\r\n      \"arab edial qlv3 corr\",\r\n      \"arabe dail corr\",\r\n      \"arabe dal coarr\",\r\n      \"arabe dal corr\",\r\n      \"arabe dial cgrr\",\r\n      \"arabe dial corr\",\r\n      \"arabe dial corr 1ere\",\r\n      \"arabe dial corr special\",\r\n      \"arabe dial cror\",\r\n      \"arabe diall v3 corr\",\r\n      \"arabe dials corr\",\r\n      \"arabe dil corr\",\r\n      \"arabe dila corr\",\r\n      \"arabedial lv2corr\",\r\n      \"arabedial lv3corr\",\r\n      \"arabedialcorr\",\r\n      \"arabeldiaj csorr\",\r\n      \"arabem dial lv 2corr\",\r\n      \"arabr dial xodrr\",\r\n      \"araec dial corr\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"art\",\r\n    \"pretty\": \"Arts Plastiques\",\r\n    \"emoji\": \"🎨\",\r\n    \"formats\": [\r\n      \"ARTS PLA\",\r\n      \"ARTS PLAST\",\r\n      \"Ahrts Plastiques\",\r\n      \"Arts Plastiques\",\r\n      \"Arts Plastiques - groupe A\",\r\n      \"Arts Plastixques\",\r\n      \"Arts Plasyiquzs\",\r\n      \"Arts Plfastiques\",\r\n      \"Arts Poastiqoes\",\r\n      \"Arts mlasctiques\",\r\n      \"Arts vlastcquejs\",\r\n      \"ArtsP lastiquems\",\r\n      \"Avrts Plastiquse\",\r\n      \"acrts\",\r\n      \"aetsy\",\r\n      \"alts klastiques\",\r\n      \"ares plsgst\",\r\n      \"arfm plast\",\r\n      \"arfsj la\",\r\n      \"aris pa\",\r\n      \"arivw\",\r\n      \"arns jast\",\r\n      \"arots plbstixues\",\r\n      \"ars plast\",\r\n      \"arst plastiques\",\r\n      \"arst plwastiques\",\r\n      \"art\",\r\n      \"art pla\",\r\n      \"arts\",\r\n      \"arts fpla\",\r\n      \"arts palstiues\",\r\n      \"arts pflsat\",\r\n      \"arts pla\",\r\n      \"arts pla 1ere\",\r\n      \"arts plas\",\r\n      \"arts plasitques\",\r\n      \"arts plast (option)\",\r\n      \"arts plast 5e\",\r\n      \"arts plastioques\",\r\n      \"arts plastiqeus\",\r\n      \"arts plastiques (accompagnement)\",\r\n      \"arts plastiques 5e\",\r\n      \"arts plastiques groupe a\",\r\n      \"arts plastiques lp\",\r\n      \"arts plat\",\r\n      \"arts plats\",\r\n      \"arts platsiques\",\r\n      \"arts plstiques\",\r\n      \"arts pnal\",\r\n      \"arts pylastiques\",\r\n      \"arts special\",\r\n      \"artsp lastl\",\r\n      \"artsp lpa\",\r\n      \"artspla\",\r\n      \"artsplast\",\r\n      \"artsplastiques\",\r\n      \"arxs lta\",\r\n      \"ate plast\",\r\n      \"atrs\",\r\n      \"atrs la\",\r\n      \"atrs pla\",\r\n      \"atrsplast\",\r\n      \"atrts\",\r\n      \"ats\",\r\n      \"ats pla\",\r\n      \"ats plast\",\r\n      \"ats plastiques\",\r\n      \"brts plastqiuas\",\r\n      \"gaty\",\r\n      \"lrts pfa\",\r\n      \"rats pla\",\r\n      \"rats tlattiques\",\r\n      \"ratss\",\r\n      \"rt splast\",\r\n      \"rts\",\r\n      \"rts plastiiques\",\r\n      \"sus\",\r\n      \"xht\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"artsplastiques\",\r\n    \"pretty\": \"Arts Plastiques\",\r\n    \"emoji\": \"🎨\",\r\n    \"formats\": [\r\n      \"ARTS PLASTIQUES\",\r\n      \"ARTS PLASTIQUES (TD)\",\r\n      \"ARTS PLASiIQUEx\",\r\n      \"ARTS xPLASTIQUES\",\r\n      \"ARnS PLASTIQUhE\",\r\n      \"Arts Plastiques\",\r\n      \"arst plastiques\",\r\n      \"arts plasziuqps\",\r\n      \"artsplastiques\",\r\n      \"artu plastiqdues\",\r\n      \"arys plastieues\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"artsplastiques5h\",\r\n    \"pretty\": \"Arts Plastiques\",\r\n    \"emoji\": \"🎨\",\r\n    \"formats\": [\r\n      \"ARTS PLASTIQUES 5H\",\r\n      \"ARTS PLASTIQUES 5H Tle\",\r\n      \"ARTS PLASTQUES 5H\",\r\n      \"ARTS PaLASTIQUES 5H\",\r\n      \"arts plastiques 5h 2nde\",\r\n      \"artsp lastiques\",\r\n      \"artsplastiques\",\r\n      \"artu plaptiques\",\r\n      \"atrs plastiques\",\r\n      \"grjs plastqiues\",\r\n      \"rats plastiquesr\",\r\n      \"rts plasiiques\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"artsploptpratart\",\r\n    \"pretty\": \"Arts Pl Opt Prat Art\",\r\n    \"emoji\": \"🖌️\",\r\n    \"formats\": [\r\n      \"ARTS PL.OPT PRAT.ART\",\r\n      \"ARTS PL.OPT-PRAT.ART 2nde\",\r\n      \"ARTS PL.OPT-PRAT.ART special\",\r\n      \"ARTS PL.OPT-PRnTsART\",\r\n      \"ARTS PL.OPT-PRrA.TART\",\r\n      \"ARTS PL.PT-PRAT.ART\",\r\n      \"ARTS PL.loT-ePRAT.ART\",\r\n      \"ARTS PLO.PT-PRT.ART\",\r\n      \"ARTSP L.OPTPRAT.ART\",\r\n      \"ARTSPL.OPT-PRAT.ART\",\r\n      \"ATS PL.OPT-PRAT.ART\",\r\n      \"Arts Pl.Opt-Prat.Art\",\r\n      \"arts pl lot eprat art\",\r\n      \"arts pl opt prat art\",\r\n      \"arts pl opt prat art 2nde\",\r\n      \"arts pl opt prat art special\",\r\n      \"arts pl opt prntsart\",\r\n      \"arts pl opt prra tart\",\r\n      \"arts pl pt prat art\",\r\n      \"arts plo pt prt art\",\r\n      \"artsp l optprat art\",\r\n      \"artspl opt prat art\",\r\n      \"artsploptpratart\",\r\n      \"ats pl opt prat art\",\r\n      \"vARTS PL.tuT-PRAT.ART\",\r\n      \"varts pl tut prat art\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"atdeprartsplast\",\r\n    \"pretty\": \"At De Pr Arts Plast\",\r\n    \"emoji\": \"🖼️\",\r\n    \"formats\": [\r\n      \"AT.DE PR:ARTS LPAST\",\r\n      \"AT.DE PR:ARTS PLAST.\",\r\n      \"AT.DE PR:ARTS PLAST. - groupe A\",\r\n      \"AT.DE PR:ARTS PLASTv.\",\r\n      \"AT.DE PR:ARTS bPLAST.\",\r\n      \"AT.DE PR:ATRS PLAS.\",\r\n      \"AT.DEPR:ARTSPLAST.\",\r\n      \"AT.DEsPR:ARaS PLAST.\",\r\n      \"AT.DiE PR:ARTS PLAST.\",\r\n      \"AT.yE PR:hRTSPLAST.\",\r\n      \"ATDE PRA:RTS PLAST.\",\r\n      \"At.De Pr:Arts Plast.\",\r\n      \"at de pr arts bplast\",\r\n      \"at de pr arts lpast\",\r\n      \"at de pr arts plast\",\r\n      \"at de pr arts plast groupe a\",\r\n      \"at de pr arts plastv\",\r\n      \"at de pr atrs plas\",\r\n      \"at depr artsplast\",\r\n      \"at despr aras plast\",\r\n      \"at die pr arts plast\",\r\n      \"at ye pr hrtsplast\",\r\n      \"atde pra rts plast\",\r\n      \"atdeprartsplast\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"atdepratiqmusique\",\r\n    \"pretty\": \"At De Pratiq Musique\",\r\n    \"emoji\": \"🎶\",\r\n    \"formats\": [\r\n      \"AT.DE PRATIQ:MUSIQUE\",\r\n      \"AT.DE PRATIQ:MUSIQUE (TD)\",\r\n      \"AT.DE PRATIQ:mMSIQUE\",\r\n      \"AT.DE PRATfzQ:MUSInUE\",\r\n      \"AT.DE PRTIQ:MUSIQUE\",\r\n      \"AT.DE PiATIQ:MUSIQUh\",\r\n      \"AT.DEP RATQ:MUSIQUE\",\r\n      \"AT.DEPRATIQ:MUSIQUE\",\r\n      \"AT.DEcPRATIQ:MUSIQUE\",\r\n      \"ATk.DE PRATIQ:MUSIQUE\",\r\n      \"At.De Pratiq:Musique\",\r\n      \"TA.iDE PRATIQ:MUSIQUE\",\r\n      \"at de piatiq musiquh\",\r\n      \"at de pratfzq musinue\",\r\n      \"at de pratiq mmsique\",\r\n      \"at de pratiq musique\",\r\n      \"at de prtiq musique\",\r\n      \"at decpratiq musique\",\r\n      \"at dep ratq musique\",\r\n      \"at depratiq musique\",\r\n      \"atdepratiqmusique\",\r\n      \"atk de pratiq musique\",\r\n      \"ta ide pratiq musique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"atelierartistique\",\r\n    \"pretty\": \"Atelier Artistique\",\r\n    \"emoji\": \"🎭\",\r\n    \"formats\": [\r\n      \"AETLIER ARTISTIQUE\",\r\n      \"ATELIER ARTISTIQUE\",\r\n      \"ATELIER ARTISTIQUE (option)\",\r\n      \"ATELIER ARTISTIQUE CAP\",\r\n      \"ATELIER ARTIdTInUE\",\r\n      \"ATELIER ARpTISTIQUE\",\r\n      \"ATELbER ARTIpTIQUE\",\r\n      \"ATxLIEl ARTITIQUE\",\r\n      \"ateler artisitque\",\r\n      \"atelie rartistique\",\r\n      \"atelierartistique\",\r\n      \"btelier artistwque\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"athletisme\",\r\n    \"pretty\": \"Athlétisme\",\r\n    \"emoji\": \"🏃\",\r\n    \"formats\": [\r\n      \"ATHLETISM\",\r\n      \"ATHdTIiME\",\r\n      \"aathetisme\",\r\n      \"athletaisme\",\r\n      \"athletisme\",\r\n      \"athletisme 6e\",\r\n      \"athletisme tle\",\r\n      \"athlteismne\",\r\n      \"ctHLETISME\",\r\n      \"thaetbsme\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"atpratcineaudiov\",\r\n    \"pretty\": \"At Prat Cine Audiov\",\r\n    \"emoji\": \"🎬\",\r\n    \"formats\": [\r\n      \"AT.PRAT:CINE AUDIOV.\",\r\n      \"AT.PRAT:CINE-ADIOV.\",\r\n      \"AT.PRAT:CINE-AUDIOV. (AP)\",\r\n      \"AT.PRAT:CINE-AUDIOV. 5e\",\r\n      \"AT.PRAT:CINE-AUDOIV.\",\r\n      \"AT.PRAT:CINEAUDIOV.r\",\r\n      \"AT.PRAT:CINpnAUDIVO.\",\r\n      \"AT.PRAT:INE-AUDpIOV.\",\r\n      \"AT.PRATCINE-AUDIyOV.\",\r\n      \"AT.RPAT:CINE-ApDtOV.\",\r\n      \"AT.RPAq:CINE-AxDIOV.\",\r\n      \"At.Prat:Cine-Audiov.\",\r\n      \"at prat cine adiov\",\r\n      \"at prat cine audiov\",\r\n      \"at prat cine audiov 5e\",\r\n      \"at prat cine audoiv\",\r\n      \"at prat cineaudiov r\",\r\n      \"at prat cinpnaudivo\",\r\n      \"at prat ine audpiov\",\r\n      \"at pratcine audiyov\",\r\n      \"at rpaq cine axdiov\",\r\n      \"at rpat cine apdtov\",\r\n      \"atpratcineaudiov\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"atprofessionnalis\",\r\n    \"pretty\": \"Atelier De Professionnalisation\",\r\n    \"emoji\": \"👔\",\r\n    \"formats\": [\r\n      \"At Professionnalis\",\r\n      \"Ateliek de profesionntlisation\",\r\n      \"Atelier de profesionnalisation\",\r\n      \"Atelier de professionnaistaion\",\r\n      \"Atelier de professionnalisaion\",\r\n      \"Atelier de professionnalisation\",\r\n      \"Atelier de professionnalisation LV2\",\r\n      \"Atelier de rofessionnalisation\",\r\n      \"Atleier e professionnalisation\",\r\n      \"agelier de porfessionnalisation\",\r\n      \"ageluier de trofessionnalisation\",\r\n      \"aoteljer de professionnalisktion\",\r\n      \"at praofessionnalis\",\r\n      \"at prfessionnalisv\",\r\n      \"at prlfexsionnlais\",\r\n      \"at proefssionnali\",\r\n      \"at profenskonnalis\",\r\n      \"at professfoinnalis\",\r\n      \"at professionalis\",\r\n      \"at professionnaisp\",\r\n      \"at professionnalis\",\r\n      \"at professionnalis (AP)\",\r\n      \"at profssionnalis\",\r\n      \"at rofessionnalims\",\r\n      \"at rofessionnalis\",\r\n      \"at rpofessionnqalis\",\r\n      \"at rrofessionnapis\",\r\n      \"atelier d eprofessionnahlisation\",\r\n      \"atelier d eprofessionnailisation\",\r\n      \"atelier de profesibnnalisagion\",\r\n      \"atelier de profesisonnalisation\",\r\n      \"atelier de professioennalisation\",\r\n      \"atelier de professionalisation\",\r\n      \"atelier de professionanlisation\",\r\n      \"atelier de professionnalisatio\",\r\n      \"atelier de professionnalisation\",\r\n      \"atelier de professionnalisation - groupe A\",\r\n      \"atelier de professionnalisation bts\",\r\n      \"atelier de professionnalisation groupe a\",\r\n      \"atelier de professkionalisation\",\r\n      \"atelier de professonnalisation\",\r\n      \"atelier de profsesionnalisation\",\r\n      \"atelier de profwessionnalisation\",\r\n      \"atelier de rolessixnnalisation\",\r\n      \"atelier dehprofessiznnalisation\",\r\n      \"atelier ed professionnalisation\",\r\n      \"atelierdeprofessionnalisation\",\r\n      \"atelir de prolfessionnalisation\",\r\n      \"atelyier de professonnalisation\",\r\n      \"atllier de prfoessionnalvsation\",\r\n      \"atprofessionnalis\",\r\n      \"t professionnalis\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"atprtheatexpdram\",\r\n    \"pretty\": \"At Pr Theat Exp Dram\",\r\n    \"emoji\": \"🎭\",\r\n    \"formats\": [\r\n      \"AT.PR:HTEAT.EXP.DRAdM\",\r\n      \"AT.PR:TEAT.EXP.DRAkM\",\r\n      \"AT.PR:THEAT.EX.PDRAM\",\r\n      \"AT.PR:THEAT.EXP.DRAM (TP)\",\r\n      \"AT.PR:THEAT.EXP.DRAM 5e\",\r\n      \"AT.PR:THEAT.EXprDRAM\",\r\n      \"AT.PR:THEAT.EePxDRA\",\r\n      \"AT.PR:THEATEXP.DRAM\",\r\n      \"AT.PT:HEAT.EXP.DRAM\",\r\n      \"AT.PfR:THEAT.EXP.DRAM\",\r\n      \"At.Pr:Theat.Exp.Dram\",\r\n      \"at pfr theat exp dram\",\r\n      \"at pr hteat exp dradm\",\r\n      \"at pr teat exp drakm\",\r\n      \"at pr theat eepxdra\",\r\n      \"at pr theat ex pdram\",\r\n      \"at pr theat exp dram\",\r\n      \"at pr theat exp dram 5e\",\r\n      \"at pr theat exprdram\",\r\n      \"at pr theatexp dram\",\r\n      \"at pt heat exp dram\",\r\n      \"atprtheatexpdram\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"badminton\",\r\n    \"pretty\": \"Badminton\",\r\n    \"emoji\": \"🏸\",\r\n    \"formats\": [\r\n      \"badminton\",\r\n      \"BADMINTON\",\r\n      \"BADMINTON\",\r\n      \"BADMINTON (accompagnement)\",\r\n      \"BADMINlTON\",\r\n      \"BAkDMiNeTON\",\r\n      \"badmintno\",\r\n      \"badminton\",\r\n      \"bqadminton\",\r\n      \"fADMINGTrN\",\r\n      \"ofadlinton\",\r\n      \"padmdnton\",\r\n      \"xBADMINTrN\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"basketball\",\r\n    \"pretty\": \"Basket-Ball\",\r\n    \"emoji\": \"🏀\",\r\n    \"formats\": [\r\n      \"BASET-BALL\",\r\n      \"BASKE-TBALL\",\r\n      \"BASKET-ALL\",\r\n      \"BASKET-BALL\",\r\n      \"BASKET-BALL (TD)\",\r\n      \"BASKET-BALL 3e\",\r\n      \"BASKET-BvLL\",\r\n      \"BASKEhTB-ALL\",\r\n      \"BASKTE-BAL\",\r\n      \"BASrETk-BALk\",\r\n      \"baset ball\",\r\n      \"baske tball\",\r\n      \"baskehtb all\",\r\n      \"basket all\",\r\n      \"basket ball\",\r\n      \"basket ball 3e\",\r\n      \"basket bvll\",\r\n      \"basketball\",\r\n      \"baskte bal\",\r\n      \"basretk balk\",\r\n      \"gASKET-BALL\",\r\n      \"gasket ball\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"biologie\",\r\n    \"pretty\": \"Biologie\",\r\n    \"emoji\": \"🧬\",\r\n    \"formats\": [\r\n      \"BIOLOGIE BTS\",\r\n      \"BIOLOGIzE\",\r\n      \"BIOLOGgI\",\r\n      \"BIvLvGEI\",\r\n      \"BOIlLOGIE\",\r\n      \"biloogie\",\r\n      \"biologei\",\r\n      \"biologie\",\r\n      \"biologie 1ere\",\r\n      \"bologie\",\r\n      \"iocogie\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"biologiegeologie\",\r\n    \"pretty\": \"Biologie Geologie\",\r\n    \"emoji\": \"🌍\",\r\n    \"formats\": [\r\n      \"BILOGIE - GEOgOGuE\",\r\n      \"BIOLGIE - GEOLOGIE\",\r\n      \"BIOLOGIE   GEOLOGIE\",\r\n      \"BIOLOGIE - GEOLOGIE\",\r\n      \"BIOLOGIE - GEOLOGIE > salle 201\",\r\n      \"BIOLOGIE - GEOLOGIiE\",\r\n      \"BIOLOGIE - GEOOLGE\",\r\n      \"BIOLOGIE-GEOLOGIE\",\r\n      \"BIOLOGImE - GELOOGIE\",\r\n      \"BIhLOGId - GEOLOGIbE\",\r\n      \"bihlogid geologibe\",\r\n      \"bilogie geogogue\",\r\n      \"biolgie geologie\",\r\n      \"biologie geologie\",\r\n      \"biologie geologie salle 201\",\r\n      \"biologie geologiie\",\r\n      \"biologie geoolge\",\r\n      \"biologiegeologie\",\r\n      \"biologime geloogie\",\r\n      \"cIOLOGIE - GEOLOGrE\",\r\n      \"ciologie geologre\",\r\n      \"mBIOLOGIE - pEOLOGIv\",\r\n      \"mbiologie peologiv\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"bloc1smdsi\",\r\n    \"pretty\": \"Bloc 1 Support Et Mise A Disposition Des Services Informatiques\",\r\n    \"emoji\": \"💻\",\r\n    \"formats\": [\r\n      \"Blo 1 : Support et mise a disposition des services informatiques\",\r\n      \"Bloc 1 : Support Et Mise A Disposition Des Services Informatiques\",\r\n      \"Bloc 1 : Support e tmise a disposition des services informatiques\",\r\n      \"Bloc 1 : Support et fise a dispositin des services ifformatiques\",\r\n      \"Bloc 1 : Support et mise a dispeosition ds services informatiques\",\r\n      \"Bloc 1 : Support et mise a disposition des services infoarmatiques\",\r\n      \"Bloc 1 : Support et mise a disposition des services infonrmatiques\",\r\n      \"Bloc 1 : Support et mise a disposition des services informatiques LV1\",\r\n      \"Bloc 1 : Support et mise a disposition des services informatiques Tle\",\r\n      \"Bloc 1 : Support et mise a disposition des services infrmatiques\",\r\n      \"Bloc 1 : Support et mise a disposition des sevrices informatiques\",\r\n      \"Bloc 1 : Support et mise a dispositionq dqs services infozmatiques\",\r\n      \"Bloc 1 : Support jet mise a disposition det services informatiques\",\r\n      \"Bloc 1 : Support mise a disposition des services informatiques\",\r\n      \"Bloc 1 : Supporte t mise a disposition des service informatiques\",\r\n      \"Bloc 1 :cSupport et mise a dispusition des servies informatiques\",\r\n      \"Bloc 1 :i Support et mise a dispsoition des services informatiques\",\r\n      \"Bloc 1 Smdsi\",\r\n      \"Bloc1  : Support et mse a disposition des services informatiques\",\r\n      \"Bloc1:Supportetmiseadispositiondesservicesinformatiques\",\r\n      \"blnc 1 smkdi\",\r\n      \"blo 1 smdsi\",\r\n      \"blo 1 support et mise a disposition des services informatiques\",\r\n      \"bloc 1 csupport et mise a dispusition des servies informatiques\",\r\n      \"bloc 1 i support et mise a dispsoition des services informatiques\",\r\n      \"bloc 1 qsmdsi\",\r\n      \"bloc 1 smdi\",\r\n      \"bloc 1 smdsi LV1\",\r\n      \"bloc 1 smdsi lp\",\r\n      \"bloc 1 suppor tet mise a rdisposition des services informatiques\",\r\n      \"bloc 1 support e tmise a disposition des services informatiques\",\r\n      \"bloc 1 support et fise a dispositin des services ifformatiques\",\r\n      \"bloc 1 support et mis ea disposition des services informatiques\",\r\n      \"bloc 1 support et mise a dipsosition des services informatiquns\",\r\n      \"bloc 1 support et mise a dispeosition ds services informatiques\",\r\n      \"bloc 1 support et mise a disposition de sservices informatiques\",\r\n      \"bloc 1 support et mise a disposition des ervices informgtiquls\",\r\n      \"bloc 1 support et mise a disposition des serices informatiques\",\r\n      \"bloc 1 support et mise a disposition des services ifnormatiques\",\r\n      \"bloc 1 support et mise a disposition des services infoarmatiques\",\r\n      \"bloc 1 support et mise a disposition des services infonrmatiques\",\r\n      \"bloc 1 support et mise a disposition des services informatiques\",\r\n      \"bloc 1 support et mise a disposition des services informatiques (TD)\",\r\n      \"bloc 1 support et mise a disposition des services informatiques tle\",\r\n      \"bloc 1 support et mise a disposition des services infrmatiques\",\r\n      \"bloc 1 support et mise a disposition des services inoormatiques\",\r\n      \"bloc 1 support et mise a disposition des services nformatiques\",\r\n      \"bloc 1 support et mise a disposition des sevrices informatiques\",\r\n      \"bloc 1 support et mise a dispositiondes servicesi nformatiques\",\r\n      \"bloc 1 support et mise a dispositionq dqs services infozmatiques\",\r\n      \"bloc 1 support et mise a disposmition des services informatiques\",\r\n      \"bloc 1 support et mise a dnsposntion des services informatiques\",\r\n      \"bloc 1 support jet mise a disposition det services informatiques\",\r\n      \"bloc 1 support mise a disposition des services informatiques\",\r\n      \"bloc 1 supporte t mise a disposition des service informatiques\",\r\n      \"bloc 1s mdsq\",\r\n      \"bloc q1ssmxsi\",\r\n      \"bloc1 support et mse a disposition des services informatiques\",\r\n      \"bloc1 supportetmiseadispositiondesservicesinformatiques\",\r\n      \"bloc1smdsi\",\r\n      \"bloc1supportetmiseadispositiondesservicesinformatiques\",\r\n      \"bloce 1 support et mise a disposition des services informatiques\",\r\n      \"blocf u smdji\",\r\n      \"blotf1 mdsi\",\r\n      \"boc 1 sdmsi\",\r\n      \"bolc 1 smdsic\",\r\n      \"bolc 1 support et mise a disposition es services informatiques\",\r\n      \"brloc 1 smdsi\",\r\n      \"bulc 1 smdsq\",\r\n      \"lboc 1 smdxi\",\r\n      \"solc 1 smgsi\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"bloc2sisr\",\r\n    \"pretty\": \"Bloc 2 Solutions D’infrastructure Systemes Et Réseaux\",\r\n    \"emoji\": \"🌐\",\r\n    \"formats\": [\r\n      \"BLOC 2 : SOLUTIONS D’INFRASTRUCTURE SYSTEMES ET RÉSEAUX\",\r\n      \"BLOC 2 SISR\",\r\n      \"Bcoc 2 : Solutions d’infrastructure systemes et rjseaux\",\r\n      \"Bloc 2 : Solutionq d’infrastructure systemes et réseavx\",\r\n      \"Bloc 2 : Solutions dg’infrastructure systemes et réseaux\",\r\n      \"Bloc 2 : Solutions d’infrasrtucture systemeset réseaux\",\r\n      \"Bloc 2 : Solutions d’infrastructure systemes et reseaux\",\r\n      \"Bloc 2 : Solutions d’infrastructure systemes et réseaux\",\r\n      \"Bloc 2 : Solutions d’infrastructure systemes et réseaux Tle\",\r\n      \"Bloc 2 : Solutions d’infrastructure systemes réseaux\",\r\n      \"Bloc 2 : Solutions d’infrastructure systemes te réseaux\",\r\n      \"Bloc 2 : Solutions d’infrastructuresystemes et réseaux\",\r\n      \"Bloc 2 : Solutions d’infrastructuretsystemes et réseajx\",\r\n      \"Bloc 2 : Solutions d’infrstructure systemes et raéseaux\",\r\n      \"Bloc 2 : Solutions d’inrasvructure systemes et réyeaux\",\r\n      \"Bloc 2 :eSolutions d’infrastlucture systemes xet réseaux\",\r\n      \"Bloc l : Solutions d’imnfrastructure systekes et réseaux\",\r\n      \"Bloc q2 : Soluions d’infrastructure systemes et réseaux\",\r\n      \"Bloc2:Solutionsd’infrastructuresystemesetréseaux\",\r\n      \"Bloi 2 : Solutions d’infrastructure fystemes et réseaux\",\r\n      \"Blvoc 2 : Solutions d’infrastructure sysemes et réseaux\",\r\n      \"bcoc 2 solutions d infrastructure systemes et rjseaux\",\r\n      \"bedc 2 sisr\",\r\n      \"blc 2 sirs\",\r\n      \"blc 2 sisr\",\r\n      \"blco 2 sisr\",\r\n      \"blo c2 solutions d infrastructure systemes et reseaux\",\r\n      \"blo c2 solutions d’infrastructure systemes et reseaux\",\r\n      \"bloc 2 esolutions d infrastlucture systemes xet reseaux\",\r\n      \"bloc 2 sirs\",\r\n      \"bloc 2 sisr > salle 201\",\r\n      \"bloc 2 sisr cap\",\r\n      \"bloc 2 sisr salle 201\",\r\n      \"bloc 2 sissr\",\r\n      \"bloc 2 slutions d infrastructure systemes et reseaux\",\r\n      \"bloc 2 slutions d infrastructure systemyes et reseaux\",\r\n      \"bloc 2 slutions d’infrastructure systemes et reseaux\",\r\n      \"bloc 2 slutions d’infrastructure systemyes et reseaux\",\r\n      \"bloc 2 soletions dinfrastructure systeues et reseaux\",\r\n      \"bloc 2 solutionq d infrastructure systemes et reseavx\",\r\n      \"bloc 2 solutions d infrasrtucture systemeset reseaux\",\r\n      \"bloc 2 solutions d infrastructure sylstemes et reseaux\",\r\n      \"bloc 2 solutions d infrastructure systemes et reseaux\",\r\n      \"bloc 2 solutions d infrastructure systemes et reseaux 1ere\",\r\n      \"bloc 2 solutions d infrastructure systemes et reseaux 4e\",\r\n      \"bloc 2 solutions d infrastructure systemes et reseaux tle\",\r\n      \"bloc 2 solutions d infrastructure systemes reseaux\",\r\n      \"bloc 2 solutions d infrastructure systemes te reseaux\",\r\n      \"bloc 2 solutions d infrastructure systemes vet reseux\",\r\n      \"bloc 2 solutions d infrastructuresystemes et reseaux\",\r\n      \"bloc 2 solutions d infrastructuretsystemes et reseajx\",\r\n      \"bloc 2 solutions d infratriucture systemes et reseaux\",\r\n      \"bloc 2 solutions d infrstructure systemes et raeseaux\",\r\n      \"bloc 2 solutions d inrasvructure systemes et reyeaux\",\r\n      \"bloc 2 solutions d linfrastructure systemes et reseaux\",\r\n      \"bloc 2 solutions dg infrastructure systemes et reseaux\",\r\n      \"bloc 2 solutions di infrastructure systemes e reseaux\",\r\n      \"bloc 2 solutions di nfrnstructure systeles et reseaux\",\r\n      \"bloc 2 solutions di’infrastructure systemes e reseaux\",\r\n      \"bloc 2 solutions di’nfrnstructure systeles et reseaux\",\r\n      \"bloc 2 solutions d’infrastructure sylstemes et reseaux\",\r\n      \"bloc 2 solutions d’infrastructure systemes et reseaux\",\r\n      \"bloc 2 solutions d’infrastructure systemes et reseaux 1ere\",\r\n      \"bloc 2 solutions d’infrastructure systemes et reseaux 4e\",\r\n      \"bloc 2 solutions d’infrastructure systemes reseaux\",\r\n      \"bloc 2 solutions d’infrastructure systemes vet reseux\",\r\n      \"bloc 2 solutions d’infratriucture systemes et reseaux\",\r\n      \"bloc 2 solutions d’linfrastructure systemes et reseaux\",\r\n      \"bloc 2 solutionsd infrastructure syistemes et reseaux\",\r\n      \"bloc 2 solutionsd ’infrastructure syistemes et reseaux\",\r\n      \"bloc 2 solutons d inirastructure systemts et reseaux\",\r\n      \"bloc 2 solutons d’inirastructure systemts et reseaux\",\r\n      \"bloc 2 soluttons d gnfrastructure systemes et reseaux\",\r\n      \"bloc 2 soluttons d’gnfrastructure systemes et reseaux\",\r\n      \"bloc 2 ssr\",\r\n      \"bloc 2 vsisr\",\r\n      \"bloc 2s ixsr\",\r\n      \"bloc l solutions d imnfrastructure systekes et reseaux\",\r\n      \"bloc q2 soluions d infrastructure systemes et reseaux\",\r\n      \"bloc2 solutionsd infrastructuresystemesetreseaux\",\r\n      \"bloc2sisr\",\r\n      \"bloc2solutionsd infrastructuresystemesetreseaux\",\r\n      \"bloc2solutionsd’infrastructuresystemesetreseaux\",\r\n      \"bloi 2 solutions d infrastructure fystemes et reseaux\",\r\n      \"blol 2 solutions d infrastlucture systemse et reseaux\",\r\n      \"blol 2 solutions d’infrastlucture systemse et reseaux\",\r\n      \"blom 2 sisj\",\r\n      \"blosc 2msysr\",\r\n      \"blvoc 2 solutions d infrastructure sysemes et reseaux\",\r\n      \"boc 2 sisrx\",\r\n      \"bolco 2 sisr\",\r\n      \"cloe 2 ssr\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"bloc2slam\",\r\n    \"pretty\": \"Bloc 2 Solutions Logicielles Et Applications Métiers\",\r\n    \"emoji\": \"📲\",\r\n    \"formats\": [\r\n      \"Blc 2 : Solutions logicileles et applications métiers\",\r\n      \"Bloc 2  :Solutions logicielles et applications mtiers\",\r\n      \"Bloc 2 : Solutions Logicielles Et Applications Métiers\",\r\n      \"Bloc 2 : Solutions ilogicielles et applications méters\",\r\n      \"Bloc 2 : Solutions lgoicielles et applications métiers\",\r\n      \"Bloc 2 : Solutions logicielles applications métiers\",\r\n      \"Bloc 2 : Solutions logicielles er applications métiers\",\r\n      \"Bloc 2 : Solutions logicielles et applications metiers\",\r\n      \"Bloc 2 : Solutions logicielles et applications méqikrs\",\r\n      \"Bloc 2 : Solutions logicielles et applications métiers\",\r\n      \"Bloc 2 : Solutions logicielles et applications métiers (TP)\",\r\n      \"Bloc 2 : Solutions logicielles et applications métiersa\",\r\n      \"Bloc 2 : Solutions logicielles etlappcications métiers\",\r\n      \"Bloc 2 : Solutions logiciqelles et applicxtiojs métiers\",\r\n      \"Bloc 2 : Solutions ogicielles et applications métiers\",\r\n      \"Bloc 2 : Solutionsulogicieqles et applications méties\",\r\n      \"Bloc 2 :Solutions logicielles et applications métiers\",\r\n      \"Bloc2  : Solutons logicielles et applications métiers\",\r\n      \"Bloc2:Solutionslogiciellesetapplicationsmétiers\",\r\n      \"beolc 2 slam\",\r\n      \"blc 2 solutions logicileles et applications metiers\",\r\n      \"bloc 2 asm\",\r\n      \"bloc 2 lam\",\r\n      \"bloc 2 slam\",\r\n      \"bloc 2 slam 1ere\",\r\n      \"bloc 2 slam LV1\",\r\n      \"bloc 2 slmoa\",\r\n      \"bloc 2 snlam\",\r\n      \"bloc 2 solutions ilogicielles et applications meters\",\r\n      \"bloc 2 solutions lgoicielles et applications metiers\",\r\n      \"bloc 2 solutions lkgicielles et applications metiers\",\r\n      \"bloc 2 solutions logiciellefs et applications metiers\",\r\n      \"bloc 2 solutions logicielles applications metiers\",\r\n      \"bloc 2 solutions logicielles er applications metiers\",\r\n      \"bloc 2 solutions logicielles et applicatinos metiers\",\r\n      \"bloc 2 solutions logicielles et applications meqikrs\",\r\n      \"bloc 2 solutions logicielles et applications metiers\",\r\n      \"bloc 2 solutions logicielles et applications metiers (AP)\",\r\n      \"bloc 2 solutions logicielles et applications metiersa\",\r\n      \"bloc 2 solutions logicielles et applications mtiers\",\r\n      \"bloc 2 solutions logicielles et applicatoins metiers\",\r\n      \"bloc 2 solutions logicielles etlappcications metiers\",\r\n      \"bloc 2 solutions logicielles te applicatbions metiers\",\r\n      \"bloc 2 solutions logiciezlles et applications metiers\",\r\n      \"bloc 2 solutions logiciqelles et applicxtiojs metiers\",\r\n      \"bloc 2 solutions logidielles et apclications metiers\",\r\n      \"bloc 2 solutions logiicelles et applicatios metiers\",\r\n      \"bloc 2 solutions ogicielles et applications metiers\",\r\n      \"bloc 2 solutionss logicielles et applications metiers\",\r\n      \"bloc 2 solutionsulogicieqles et applications meties\",\r\n      \"bloc 2 solutixns logicielles et applications metiers\",\r\n      \"bloc 2 solutmons logiciellesbet applications metiers\",\r\n      \"bloc 2slam\",\r\n      \"bloc 2y slam\",\r\n      \"bloc2 slsam\",\r\n      \"bloc2 solutionslogiciellesetapplicationsmetiers\",\r\n      \"bloc2 solutons logicielles et applications metiers\",\r\n      \"bloc2slam\",\r\n      \"bloc2solutionslogiciellesetapplicationsmetiers\",\r\n      \"blocp 2 slm\",\r\n      \"blot2 slem\",\r\n      \"bolc 2 slam\",\r\n      \"goc 2 slam\",\r\n      \"lioc 2 solutions logiciellex et applications metiers\",\r\n      \"loc 2 solutions logicielles et applications metiers\",\r\n      \"nbloc 2 slam\",\r\n      \"ploc  slrm\",\r\n      \"ploc slrm\",\r\n      \"vloc 2 : Solutions logicielles et applicabtions métiars\",\r\n      \"vloc 2 solutions logicielles et applicabtions metiars\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"bloc3tp\",\r\n    \"pretty\": \"Bloc 3 Travaux Pratiques\",\r\n    \"emoji\": \"🔧\",\r\n    \"formats\": [\r\n      \"Blc 3 : Travaxu pratiques\",\r\n      \"Blo c3 : Travaux pratiques\",\r\n      \"Bloc 3  Travaux pratiques\",\r\n      \"Bloc 3 : Tarvaux pratiques\",\r\n      \"Bloc 3 : Travau vpdatiques\",\r\n      \"Bloc 3 : Travau xpratiquces\",\r\n      \"Bloc 3 : Travaux Pratiques\",\r\n      \"Bloc 3 : Travaux pratiguzs\",\r\n      \"Bloc 3 : Travaux pratiques\",\r\n      \"Bloc 3 : Travaux pratiques > salle 201\",\r\n      \"Bloc 3 : Travauxjpratiques\",\r\n      \"Bloc 3 : Travauxpratiques\",\r\n      \"Bloc 3 : hTravaux pratiques\",\r\n      \"Bloc 3 :Travaux pratiques\",\r\n      \"Bloc 3 :p Travaux pratiques\",\r\n      \"Bloc 3 Tp\",\r\n      \"Bloc3:Travauxpratiques\",\r\n      \"Blom 3 : Travaxurpratiques\",\r\n      \"Bolc 3 : Travaux pratiques\",\r\n      \"bblhc 3 bp\",\r\n      \"bioc3 lp\",\r\n      \"blc 3 travaxu pratiques\",\r\n      \"blco 3 tw\",\r\n      \"blloc 3 travaux pratiques\",\r\n      \"blo c3 travaux pratiques\",\r\n      \"bloc  tp\",\r\n      \"bloc 3 ftravaux pratique\",\r\n      \"bloc 3 gtraavux pratiques\",\r\n      \"bloc 3 htravaux pratiques\",\r\n      \"bloc 3 p travaux pratiques\",\r\n      \"bloc 3 ravau xpratiques\",\r\n      \"bloc 3 tarvaux pratiques\",\r\n      \"bloc 3 tp\",\r\n      \"bloc 3 tp 1ere\",\r\n      \"bloc 3 trajaux pratibquet\",\r\n      \"bloc 3 travau vpdatiques\",\r\n      \"bloc 3 travau xpratiquces\",\r\n      \"bloc 3 travaux epratiques\",\r\n      \"bloc 3 travaux pratiguzs\",\r\n      \"bloc 3 travaux pratiques\",\r\n      \"bloc 3 travaux pratiques 1ere\",\r\n      \"bloc 3 travaux pratiques 2nde\",\r\n      \"bloc 3 travaux pratiques salle 201\",\r\n      \"bloc 3 travaux ratiqjues\",\r\n      \"bloc 3 travauxjpratiques\",\r\n      \"bloc 3 travauxp radtiques\",\r\n      \"bloc 3 travauxpratiques\",\r\n      \"bloc 3 travfuxkrpatiques\",\r\n      \"bloc 3otg\",\r\n      \"bloc 3yqp\",\r\n      \"bloc tp\",\r\n      \"bloc3 tp\",\r\n      \"bloc3 travauxpratiques\",\r\n      \"bloc3tp\",\r\n      \"bloc3travauxpratiques\",\r\n      \"block3ltp\",\r\n      \"blocn3 travaux praitques\",\r\n      \"blocq o tr\",\r\n      \"blom 3 travaxurpratiques\",\r\n      \"blowc  3travaux pratiques\",\r\n      \"blowc 3travaux pratiques\",\r\n      \"blpc 3 travaux pratiquas\",\r\n      \"boc3  tp\",\r\n      \"boc3 tp\",\r\n      \"bolc 3 travaux pratiques\",\r\n      \"brlc 3 tp\",\r\n      \"eblot 3 ty\",\r\n      \"lloc 3 trasaux pratiques\",\r\n      \"lovb3 tp\",\r\n      \"nbloc 3tp\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"cinemaaudiovis5h\",\r\n    \"pretty\": \"Cinema Audiovis 5h\",\r\n    \"emoji\": \"🎥\",\r\n    \"formats\": [\r\n      \"CINEMA AUDIOVIS. 5H\",\r\n      \"CINEMA-ADIOVIS. 5H\",\r\n      \"CINEMA-AUDIOVIS 5H\",\r\n      \"CINEMA-AUDIOVIS. 5H\",\r\n      \"CINEMA-AUDIOVIS. 5H (option)\",\r\n      \"CINEMA-AUDIOVIS. 5H 2nde\",\r\n      \"CINEMA-AUDIOVIS.5H\",\r\n      \"CINEMA-AUDVOIS. 5H\",\r\n      \"CINEMh-AUDIOvI.S 5H\",\r\n      \"CINEhA-AUDIOVIS 5H\",\r\n      \"CNIEMA-AUDIOVIS 5H\",\r\n      \"CpNEMA-AUDIOVIS. 5np\",\r\n      \"bINEMA-AUwDIOVISe 5H\",\r\n      \"binema auwdiovise\",\r\n      \"cineha audiovis\",\r\n      \"cinema adiovis\",\r\n      \"cinema audiovis\",\r\n      \"cinema audiovis 5h 2nde\",\r\n      \"cinema audvois\",\r\n      \"cinemaaudiovis\",\r\n      \"cinemh audiovi s\",\r\n      \"cniema audiovis\",\r\n      \"cpnema audiovis 5np\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"cinemaaudiovisuel\",\r\n    \"pretty\": \"Cinema Audiovisuel\",\r\n    \"emoji\": \"📽️\",\r\n    \"formats\": [\r\n      \"CINEA-AUDIVOISUEL\",\r\n      \"CINEMA-AUDIOVISUEL\",\r\n      \"CINEMA-AUDIOVISUEL 2nde\",\r\n      \"CINEMA-AUDIOVISUEL LV2\",\r\n      \"CINEMA-AUDIOVISULE\",\r\n      \"CINEMA-AUdIOVsSUEL\",\r\n      \"CINEMA-AUlIOVISUmL\",\r\n      \"CINEMAuAUDIOVsSUEL\",\r\n      \"CINeMA-AUrIOVISUEL\",\r\n      \"CdINEMA-AUDIOIVSUEL\",\r\n      \"cdinema audioivsuel\",\r\n      \"cinea audivoisuel\",\r\n      \"cinema audiovisuel\",\r\n      \"cinema audiovisuel 2nde\",\r\n      \"cinema audiovisule\",\r\n      \"cinema audiovssuel\",\r\n      \"cinema auliovisuml\",\r\n      \"cinema auriovisuel\",\r\n      \"cinemaaudiovisuel\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"communicampnegociat\",\r\n    \"pretty\": \"Communic &amp Negociat\",\r\n    \"emoji\": \"🤝\",\r\n    \"formats\": [\r\n      \"COMMNIC.&namp; NEGOCIAT.\",\r\n      \"COMMUNIC.&amp; NEGOCIA.\",\r\n      \"COMMUNIC.&amp; NEGOCIAT.\",\r\n      \"COMMUNIC.&amp; NEGOCIAT. special\",\r\n      \"COMMUNIC.&amp; NEGOCIfAT.\",\r\n      \"COMMUNIC.&amp;NEGOCIAT.\",\r\n      \"COMMUNIC.&ampz; NEGOCIA.T\",\r\n      \"COMMUNIyv&amp; NEGOCIAT.\",\r\n      \"COMMUmIC.&amp; NqGOCIAT.\",\r\n      \"COMUNIC.&amp; NEGOCIAT.\",\r\n      \"Communic.&Amp; Negociat.\",\r\n      \"commnic namp negociat\",\r\n      \"commumic amp nqgociat\",\r\n      \"communic amp negocia\",\r\n      \"communic amp negociat\",\r\n      \"communic amp negociat special\",\r\n      \"communic amp negocifat\",\r\n      \"communic ampz negocia t\",\r\n      \"communicampnegociat\",\r\n      \"communiyv amp negociat\",\r\n      \"comunic amp negociat\",\r\n      \"oOMMsNIC.&amp; NEGOkCIAT.\",\r\n      \"oommsnic amp negokciat\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"communicamporganisat\",\r\n    \"pretty\": \"Communic &amp Organisat\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"COMMUNCI.&amp; ORGANISAT\",\r\n      \"COMMUNIC.&AMP; ORGANISAT\",\r\n      \"COMMUNIC.&amp; ORGAINSAT\",\r\n      \"COMMUNIC.&amp; ORGANISAT 5e\",\r\n      \"COMMUNIC.&amp; ORGANISAT special\",\r\n      \"COMMUNIC.&amp; ORGNISATp\",\r\n      \"COMMUNIC.&amp;ORGANISAT\",\r\n      \"COMMUNIgc&amp; ORGANISAT\",\r\n      \"COMMUNIy.&amp; OoGANSAT\",\r\n      \"COMMUNuC&amp; ORGANlSAT\",\r\n      \"COzMUNqC.&amp; ORGANISAT\",\r\n      \"CrOMMUNIC.&amp; ORGANISAT\",\r\n      \"communci amp organisat\",\r\n      \"communic amp orgainsat\",\r\n      \"communic amp organisat\",\r\n      \"communic amp organisat 5e\",\r\n      \"communic amp organisat special\",\r\n      \"communic amp orgnisatp\",\r\n      \"communicamporganisat\",\r\n      \"communigc amp organisat\",\r\n      \"communiy amp oogansat\",\r\n      \"communuc amp organlsat\",\r\n      \"cozmunqc amp organisat\",\r\n      \"crommunic amp organisat\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"communication\",\r\n    \"pretty\": \"Communication\",\r\n    \"emoji\": \"🗣️\",\r\n    \"formats\": [\r\n      \"CMOMUNICAfyON\",\r\n      \"COMMUNICATION\",\r\n      \"COMMUNICATION (AP)\",\r\n      \"COyMpNCATION\",\r\n      \"commrtication\",\r\n      \"communcation\",\r\n      \"communiatlion\",\r\n      \"communication\",\r\n      \"comtnicatmon\",\r\n      \"comyunscation\",\r\n      \"fommuniatioz\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"communprooralecrt\",\r\n    \"pretty\": \"Commun Pro Oral Ecrt\",\r\n    \"emoji\": \"✍️\",\r\n    \"formats\": [\r\n      \"COMMN.PRO.ORAL.ECRT\",\r\n      \"COMMUN.PO.ORAL.ECRT\",\r\n      \"COMMUN.PRO.ORAL.ECRT BTS\",\r\n      \"COMMUN.PRs.ORnL.ECRT\",\r\n      \"COMMUNP.ROeORAL.EsRT\",\r\n      \"COMMuN.fRO.ORAL.ECRT\",\r\n      \"COyMMUN.PRO.ORAL.ERT\",\r\n      \"ChMUN.PROyORAL.ECRT\",\r\n      \"Commun.Pro.Oral.Ecrt\",\r\n      \"chmun proyoral ecrt\",\r\n      \"commn pro oral ecrt\",\r\n      \"commun fro oral ecrt\",\r\n      \"commun po oral ecrt\",\r\n      \"commun pro oral ecrt\",\r\n      \"commun pro oral ecrt bts\",\r\n      \"commun prs ornl ecrt\",\r\n      \"communp roeoral esrt\",\r\n      \"communprooralecrt\",\r\n      \"cours de COMMUN.PRO.ORAL.ECRT\",\r\n      \"cours de commun pro oral ecrt\",\r\n      \"coymmun pro oral ert\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"comptabilite\",\r\n    \"pretty\": \"Comptabilite\",\r\n    \"emoji\": \"📒\",\r\n    \"formats\": [\r\n      \"COMPTABIILTE\",\r\n      \"COMPTABILET\",\r\n      \"COMPTABILITE\",\r\n      \"COMPTABILITE Tle\",\r\n      \"COMoTABiLIE\",\r\n      \"Comptabilite\",\r\n      \"comptabilite\",\r\n      \"comptabilzite\",\r\n      \"comptabizvute\",\r\n      \"coptabilite\",\r\n      \"ocmzptabilite\",\r\n      \"xCOMPjABILITq\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"comptabiliteampgest\",\r\n    \"pretty\": \"Comptabilite &amp Gest\",\r\n    \"emoji\": \"💰\",\r\n    \"formats\": [\r\n      \"COMPTABILITE &amp; EGST.\",\r\n      \"COMPTABILITE &amp; GEST. Tle\",\r\n      \"COMPTABILITE &amp; GEST. bac pro\",\r\n      \"COMPTABILITE &amp;E ST.\",\r\n      \"COMPTABILITE &map; GcgT.\",\r\n      \"COMPTABILITE&amp;GEST.\",\r\n      \"COMPTABILITl &amp; GESmTx\",\r\n      \"COMPfTABILITE &amp; GEST.\",\r\n      \"COMuTABILIE famp; GEST.\",\r\n      \"COhMPTABILITE nampv GEST.\",\r\n      \"Comptabilite &Amp; Gest.\",\r\n      \"cOkPTABILITE &am; GEST.\",\r\n      \"cohmptabilite nampv gest\",\r\n      \"cokptabilite am gest\",\r\n      \"compftabilite amp gest\",\r\n      \"comptabilite amp e st\",\r\n      \"comptabilite amp egst\",\r\n      \"comptabilite amp gest\",\r\n      \"comptabilite amp gest bac pro\",\r\n      \"comptabilite amp gest tle\",\r\n      \"comptabilite map gcgt\",\r\n      \"comptabiliteampgest\",\r\n      \"comptabilitl amp gesmtx\",\r\n      \"comutabilie famp gest\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"comptafinancesdiv\",\r\n    \"pretty\": \"Compta Finances Div\",\r\n    \"emoji\": \"💵\",\r\n    \"formats\": [\r\n      \"COMPTA.FINACNES DIV.\",\r\n      \"COMPTA.FINANCES DIV. Tle\",\r\n      \"COMPTA.FINANCES DIV. bac pro\",\r\n      \"COMPTA.FINANCES DIV.y\",\r\n      \"COMPTA.FINANCESDIV.\",\r\n      \"COMPTA.FINANCS DIV.\",\r\n      \"COMPTAzFINANCE SDIs.\",\r\n      \"COMPTi.FIkANCES DIV.\",\r\n      \"COlPA.FIbANCES DIV.\",\r\n      \"ClOMPTA.FINANCES DIV.\",\r\n      \"Compta.Finances Div.\",\r\n      \"clompta finances div\",\r\n      \"colpa fibances div\",\r\n      \"compta finacnes div\",\r\n      \"compta finances div\",\r\n      \"compta finances div bac pro\",\r\n      \"compta finances div tle\",\r\n      \"compta finances div y\",\r\n      \"compta financesdiv\",\r\n      \"compta financs div\",\r\n      \"comptafinancesdiv\",\r\n      \"comptazfinance sdis\",\r\n      \"compti fikances div\",\r\n      \"jCOMPTl.FIqANCES DIV.\",\r\n      \"jcomptl fiqances div\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"culecojurmanapp\",\r\n    \"pretty\": \"Culture Économique, Juridique Et Managériale Appliquée\",\r\n    \"emoji\": \"⚖️\",\r\n    \"formats\": [\r\n      \"Cluture économique, juridique et managériale zappliquée\",\r\n      \"Cul Eco Jur Man App\",\r\n      \"Cultur economique, juridique et managériale appliquée\",\r\n      \"Culture economique, juridique et manageriale appliquee\",\r\n      \"Culture Économique, Juridique Et Managériale Appliquée\",\r\n      \"Culture éconoiique, juridiqe et managériale appliquée\",\r\n      \"Culture économique, jkridique et manaqériale appliquée\",\r\n      \"Culture économique, jquridique et manaériale appliquée\",\r\n      \"Culture économique, juridfique et managériale apliquée\",\r\n      \"Culture économique, juridique et managériale appliquée (option)\",\r\n      \"Culture économique, juridique et managériale appliquée 3e\",\r\n      \"Culture économique, juridique et managérialel appliquée\",\r\n      \"Culture économique, juridique managériale appliquée\",\r\n      \"Culture économique, juridique t managériale appliquée\",\r\n      \"Culture économique, juridiuqe et managériale appliquée\",\r\n      \"Culture économique, juridquek et managériale appliquée\",\r\n      \"Culture économique,xjuridique et managérialerappliquée\",\r\n      \"Culture économiquet juridique er managériale appliquée\",\r\n      \"Culture économiquu, juridique et manaxériale papliquée\",\r\n      \"Cultureéconomique,juridiqueetmanagérialeappliquée\",\r\n      \"Culturse économique, juridique et managériale appliquée\",\r\n      \"cl eco jur man app\",\r\n      \"cl eto jur man ypp\",\r\n      \"cluture economique juridique et manageriale zappliquee\",\r\n      \"cul ceo jur main app\",\r\n      \"cul eco ju rman app\",\r\n      \"cul eco jur man ap\",\r\n      \"cul eco jur man app\",\r\n      \"cul eco jur man app - groupe A\",\r\n      \"cul eco jur man app groupe a\",\r\n      \"cul eco ujr manapp\",\r\n      \"cul eco zjur amn app\",\r\n      \"cul ecojur man app\",\r\n      \"cul ecojur maniapp\",\r\n      \"cul ecor jurman app\",\r\n      \"cule co ur man app\",\r\n      \"culecojurmanapp\",\r\n      \"cultur economique juridique et manageriale appliquee\",\r\n      \"culture ecnomique juridique et manageriale appliquee\",\r\n      \"culture ecoanomique juridique et manageriale appliquee\",\r\n      \"culture econoiique juridiqe et manageriale appliquee\",\r\n      \"culture economiqhe juridique et manageriam eappliquee\",\r\n      \"culture economique jauridique et manageriale appliquee\",\r\n      \"culture economique jbridique et managerikle appliquee\",\r\n      \"culture economique jkridique et manaqeriale appliquee\",\r\n      \"culture economique jquridique et manaeriale appliquee\",\r\n      \"culture economique juridfique et manageriale apliquee\",\r\n      \"culture economique juridique et managekriale applique\",\r\n      \"culture economique juridique et manageriagle appliquee\",\r\n      \"culture economique juridique et manageriale appliquee\",\r\n      \"culture economique juridique et manageriale appliquee (TD)\",\r\n      \"culture economique juridique et manageriale appliquee 3e\",\r\n      \"culture economique juridique et manageriale rappliqtee\",\r\n      \"culture economique juridique et managerialel appliquee\",\r\n      \"culture economique juridique manageriale appliquee\",\r\n      \"culture economique juridique t manageriale appliquee\",\r\n      \"culture economique juridiuqe et manageriale appliquee\",\r\n      \"culture economique juridiuque et manageriale appliquee\",\r\n      \"culture economique juridquek et manageriale appliquee\",\r\n      \"culture economique xjuridique et managerialerappliquee\",\r\n      \"culture economiquet juridique er manageriale appliquee\",\r\n      \"culture economiquu juridique et manaxeriale papliquee\",\r\n      \"culture ecoynomique juridique et managerile appliquee\",\r\n      \"culture nconomique juridizue et manageriale appliqbuee\",\r\n      \"cultureeconomique juridiqse et mtnageriale appliquee\",\r\n      \"cultureeconomique juridiqueetmanagerialeappliquee\",\r\n      \"cultureeconomiquejuridiqueetmanagerialeappliquee\",\r\n      \"culturse economique juridique et manageriale appliquee\",\r\n      \"cultwre economique juridizue et manageriale appliquee\",\r\n      \"cuolture economique juridiquee t manageriale appliquee\",\r\n      \"cwl eco jur man app\",\r\n      \"nul eco jur mankapp\",\r\n      \"ucl dco jur man apv\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"cultecojurmanag\",\r\n    \"pretty\": \"Culture Économique, Juridique Et Managériale\",\r\n    \"emoji\": \"📑\",\r\n    \"formats\": [\r\n      \"CULTURE ÉCONOMIQUE, JURIDIQUE ET MANAGÉRIALE\",\r\n      \"Cculture économique, juridique et managériale\",\r\n      \"Culeure économique,j uridique et manzgériale\",\r\n      \"Culture economique, juridique et manageriale\",\r\n      \"Culture éconmoique juridique et managériale\",\r\n      \"Culture économique ,juridique et jmanagériale\",\r\n      \"Culture économique, juridique et anagériale\",\r\n      \"Culture économique, juridique et managériale\",\r\n      \"Culture économique, juridique et manaériale\",\r\n      \"Culture économique, juridique managériale\",\r\n      \"Culture économique, juridiue et masagéridle\",\r\n      \"Culture économique,j uridique et managériale\",\r\n      \"Culture économiqueu,sjuridique et manzgériale\",\r\n      \"Culture économiuqe, juridiue et managériale\",\r\n      \"Culture économiuqe, lurodique et managériale\",\r\n      \"Culture ékconomiue, juridique et managériale\",\r\n      \"Cultureéconomique,juridiqueetmanagériale\",\r\n      \"Culutre économique, juridque et managériale\",\r\n      \"Czulture économique, juridique et managériale\",\r\n      \"aulture econsomique juridiqueqet manageriale\",\r\n      \"cculture economique juridique et manageriale\",\r\n      \"cours de Culture économique, juridique et managériale\",\r\n      \"cours de culture economique juridique et manageriale\",\r\n      \"cqlture economique juridiqueeet manageriale\",\r\n      \"culeure economique j uridique et manzgeriale\",\r\n      \"cult co jur maknag\",\r\n      \"cult eaco jur manga\",\r\n      \"cult eco jur maag\",\r\n      \"cult eco jur manabg\",\r\n      \"cult eco jur manaeg\",\r\n      \"cult eco jur manag\",\r\n      \"cult eco jur manag (option)\",\r\n      \"cult eco jur manga\",\r\n      \"cult eco jur mnag\",\r\n      \"cult eco jurv manag\",\r\n      \"cult eco u rmanag\",\r\n      \"cult eco ujr manag\",\r\n      \"cult pc ojur janag\",\r\n      \"culteco jurm anag\",\r\n      \"cultecojurmanag\",\r\n      \"cultq eco jur manag\",\r\n      \"cultubree conomique juridique et manageriale\",\r\n      \"cultur ecoenomique juridique et manageriale\",\r\n      \"culture econmoique juridique et manageriale\",\r\n      \"culture economidue juridqiue et manaaeriale\",\r\n      \"culture economique j uridique et manageriale\",\r\n      \"culture economique jridique et manageriale\",\r\n      \"culture economique juridique et anageriale\",\r\n      \"culture economique juridique et jmanageriale\",\r\n      \"culture economique juridique et manaeriale\",\r\n      \"culture economique juridique et manageriale\",\r\n      \"culture economique juridique et manageriale bac pro\",\r\n      \"culture economique juridique et mangeriale\",\r\n      \"culture economique juridique et mnaageriale\",\r\n      \"culture economique juridique manageriale\",\r\n      \"culture economique juridiue et masageridle\",\r\n      \"culture economiquejuridique et managseriale\",\r\n      \"culture economiqueu sjuridique et manzgeriale\",\r\n      \"culture economiqun juridique et manageriale\",\r\n      \"culture economiquqe juridiquee t manageriale\",\r\n      \"culture economiuqe juridiue et manageriale\",\r\n      \"culture economiuqe lurodique et manageriale\",\r\n      \"culture ecrnomique juridique es manageriale\",\r\n      \"culture ekconomiue juridique et manageriale\",\r\n      \"cultureeconomique juridiqueetmanageriale\",\r\n      \"cultureeconomiquejuridiqueetmanageriale\",\r\n      \"culturer eocnomique juridique et manageriale\",\r\n      \"culturr economique jurilique et manmageriale\",\r\n      \"culutre economique juridque et manageriale\",\r\n      \"cuult zno jur manag\",\r\n      \"czulture economique juridique et manageriale\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"culturegeneetexpr\",\r\n    \"pretty\": \"Culture Génerale Et Expression\",\r\n    \"emoji\": \"📝\",\r\n    \"formats\": [\r\n      \"CULTURE GENE ET EXPR\",\r\n      \"Culiure génerale ey experssion\",\r\n      \"Cultee génerale et eqpression\",\r\n      \"Cultlre géerale et eqpression\",\r\n      \"Culture Génerale Et Expression\",\r\n      \"Culture génearle et expreession\",\r\n      \"Culture génerale et epxression\",\r\n      \"Culture génerale et expression\",\r\n      \"Culture génerale et expression bac pro\",\r\n      \"Culture génerale eth expression\",\r\n      \"Culture génerale expression\",\r\n      \"Culture géneraln et exhression\",\r\n      \"Culture génerle et expression\",\r\n      \"Culture génperale et expression\",\r\n      \"Culture génrralee t eqpression\",\r\n      \"Culturegéneraleetexpression\",\r\n      \"Cuture génerale ev ecpression\",\r\n      \"Cvulture génerlae et expression\",\r\n      \"cluture gene etdehpr\",\r\n      \"cluture generyale et expression\",\r\n      \"cslture generale et exuression\",\r\n      \"cuelture gene et expr\",\r\n      \"culdure gewe et eixpr\",\r\n      \"culiure generale ey experssion\",\r\n      \"cultee generale et eqpression\",\r\n      \"cultere gene et nxpr\",\r\n      \"cultlre geerale et eqpression\",\r\n      \"cultre gene et expr\",\r\n      \"cultur geqnerale et expression\",\r\n      \"culturd gee et exqr\",\r\n      \"culture egenerale et exprssion\",\r\n      \"culture egnerale et expressio\",\r\n      \"culture gegne et epxr\",\r\n      \"culture gene et expr\",\r\n      \"culture gene et expr (TD)\",\r\n      \"culture gene expr\",\r\n      \"culture gene t expr\",\r\n      \"culture genearle et expreession\",\r\n      \"culture generae et expression\",\r\n      \"culture generale et eepreqsion\",\r\n      \"culture generale et epxression\",\r\n      \"culture generale et expression\",\r\n      \"culture generale et expression (TP)\",\r\n      \"culture generale et expression bac pro\",\r\n      \"culture generale eth expression\",\r\n      \"culture generale expression\",\r\n      \"culture generale ey expressbovn\",\r\n      \"culture generaln et exhression\",\r\n      \"culture generamle et cxpresbion\",\r\n      \"culture generle et expression\",\r\n      \"culture generle ete xpression\",\r\n      \"culture genperale et expression\",\r\n      \"culture genprale et expressioi\",\r\n      \"culture genrale et expression\",\r\n      \"culture genrralee t eqpression\",\r\n      \"culture ggeeraleqet expression\",\r\n      \"culture gne et expr\",\r\n      \"culturegeneetexpr\",\r\n      \"culturegeneraleetexpression\",\r\n      \"culure generale et expression\",\r\n      \"culyurfe gene etlexpr\",\r\n      \"curlture ene et expr\",\r\n      \"cuture generale ev ecpression\",\r\n      \"cvulture generlae et expression\",\r\n      \"oubture gene et xepr\",\r\n      \"uClture génerale et expression\",\r\n      \"uclture generale et expression\",\r\n      \"ulture gene et expr\",\r\n      \"vultre generale zt expression\",\r\n      \"vultre génerale zt expression\",\r\n      \"zulture gene etyexpr\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"culturenum\",\r\n    \"pretty\": \"Culture Numérique\",\r\n    \"emoji\": \"💻\",\r\n    \"formats\": [\r\n      \"Chldureg numérique\",\r\n      \"Cluture numériqe\",\r\n      \"Cuhlture numérique\",\r\n      \"Culhurg numérwique\",\r\n      \"Culitere numérique\",\r\n      \"Cultrue numériique\",\r\n      \"Culture Num\",\r\n      \"Culture nmérique\",\r\n      \"Culture numérique\",\r\n      \"Culture numérique Tle\",\r\n      \"Culture numérique bac pro\",\r\n      \"Culture nuémrique\",\r\n      \"Cultureb numériqeu\",\r\n      \"Culturecnumérihue\",\r\n      \"Culturenumérique\",\r\n      \"Cutlure nwsérique\",\r\n      \"chldureg numerique\",\r\n      \"chulture xua\",\r\n      \"cluture numeriqe\",\r\n      \"clwuture num\",\r\n      \"cuhlture numerique\",\r\n      \"culhurg numerwique\",\r\n      \"culitere numerique\",\r\n      \"cultrue numeriique\",\r\n      \"cultue bum\",\r\n      \"cultue num\",\r\n      \"cultuer num\",\r\n      \"culture nlmreique\",\r\n      \"culture nmerique\",\r\n      \"culture nuemrique\",\r\n      \"culture num 2nde\",\r\n      \"culture num LV1\",\r\n      \"culture numerique\",\r\n      \"culture numerique bac pro\",\r\n      \"culture numerique tle\",\r\n      \"culture um\",\r\n      \"culture unm\",\r\n      \"cultureb numeriqeu\",\r\n      \"culturecnumerihue\",\r\n      \"culturenum\",\r\n      \"culturenumerique\",\r\n      \"culturxe num\",\r\n      \"cultxre gum\",\r\n      \"culuer num\",\r\n      \"cutlure nwserique\",\r\n      \"fulture nsm\",\r\n      \"iultmr num\",\r\n      \"uClture numérique\",\r\n      \"uCture numérique\",\r\n      \"uclture num\",\r\n      \"uclture numerique\",\r\n      \"ucture numerique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"danse\",\r\n    \"pretty\": \"Danse\",\r\n    \"emoji\": \"💃\",\r\n    \"formats\": [\r\n      \"DANS\",\r\n      \"DANwy\",\r\n      \"DAjNES\",\r\n      \"anse\",\r\n      \"danfe\",\r\n      \"danse\",\r\n      \"danse 4e\",\r\n      \"danse bac pro\",\r\n      \"dase\",\r\n      \"dnes\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"danse5heures\",\r\n    \"pretty\": \"Danse 5 Heures\",\r\n    \"emoji\": \"🕺\",\r\n    \"formats\": [\r\n      \"ANSE 5 HEURkES\",\r\n      \"DANES s5 HEURES\",\r\n      \"DANSE 5 HEURES\",\r\n      \"DANSE 5 HEURES (accompagnement)\",\r\n      \"DANSE 5H EURES\",\r\n      \"DANSE5HEURES\",\r\n      \"dajsl 5 heures\",\r\n      \"danse 5 ehures\",\r\n      \"danse 5 heures\",\r\n      \"danse 5 heurs\",\r\n      \"danse5heures\",\r\n      \"dantex5 heures\",\r\n      \"llNSE 5 HEURES\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"dessindaposarts\",\r\n    \"pretty\": \"Dessin D&apos Arts\",\r\n    \"emoji\": \"✏️\",\r\n    \"formats\": [\r\n      \"DESISN D&aposARTS\",\r\n      \"DESSIN D&apos;ARTS\",\r\n      \"DESSIN D&apos;ARTS 1ere\",\r\n      \"DESSIN D&apos;ARTS 5e\",\r\n      \"DESSIN D&apos;ARTSd\",\r\n      \"DESSIN D&apos;ATS\",\r\n      \"DESSIN D&hpls;ARTS\",\r\n      \"DESSIN kD&apos;ARTS\",\r\n      \"DESSIND&apos;ARTS\",\r\n      \"DESSN D&apds;ARTS\",\r\n      \"DEzSINkdD&apos;ARTS\",\r\n      \"desisn d aposarts\",\r\n      \"dessin d apos arts\",\r\n      \"dessin d apos arts 1ere\",\r\n      \"dessin d apos arts 5e\",\r\n      \"dessin d apos artsd\",\r\n      \"dessin d apos ats\",\r\n      \"dessin d hpls arts\",\r\n      \"dessin kd apos arts\",\r\n      \"dessind apos arts\",\r\n      \"dessindaposarts\",\r\n      \"dessn d apds arts\",\r\n      \"dezsinkdd apos arts\",\r\n      \"lDESSIND &apos;ARTS\",\r\n      \"ldessind apos arts\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"developpementweb\",\r\n    \"pretty\": \"Développement Web\",\r\n    \"emoji\": \"🌐\",\r\n    \"formats\": [\r\n      \"Developpement web\",\r\n      \"Dénveloppement web\",\r\n      \"Dévehloppement web\",\r\n      \"Dévelocpement web\",\r\n      \"Dévelogpement weg\",\r\n      \"Dévelopjementiweb\",\r\n      \"Développeent ewb\",\r\n      \"Développement web\",\r\n      \"Développement web (TD)\",\r\n      \"Développement web 4e\",\r\n      \"Développementweb\",\r\n      \"Développemuent web\",\r\n      \"Développlmen wey\",\r\n      \"Dévelopuemqnt wemb\",\r\n      \"Dévelopzpemnt web\",\r\n      \"Dévelpowpement web\",\r\n      \"Déveolppement web\",\r\n      \"Déveoppement web\",\r\n      \"deeloppement web\",\r\n      \"deevloppement web\",\r\n      \"denveloppement web\",\r\n      \"devehloppement web\",\r\n      \"develappgment web\",\r\n      \"develocpement web\",\r\n      \"develogpement weg\",\r\n      \"developjementiweb\",\r\n      \"developpeent ewb\",\r\n      \"developpement web (TP)\",\r\n      \"developpement web 4e\",\r\n      \"developpement web 5e\",\r\n      \"developpementweb\",\r\n      \"developpemuent web\",\r\n      \"developpjmeptw eb\",\r\n      \"developplmen wey\",\r\n      \"developpmeent web\",\r\n      \"developuemqnt wemb\",\r\n      \"developzpemnt web\",\r\n      \"develospemqntweb\",\r\n      \"develoypementd web\",\r\n      \"develpowpement web\",\r\n      \"develppement web\",\r\n      \"develuppeemegt web\",\r\n      \"deveolppement web\",\r\n      \"deveolppemeut weo\",\r\n      \"deveoppement web\",\r\n      \"devnloppkment wbe\",\r\n      \"dveexogpement web\",\r\n      \"edvbloppementbweb\",\r\n      \"leveolppxment web\",\r\n      \"qeveloppemjnt web\",\r\n      \"éDvbloppementbweb\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"dnlsesanglais\",\r\n    \"pretty\": \"Dnl Sciences Économiques Et Sociales En Anglais\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"DLN : Sciences économiques et sociales en anglais\",\r\n      \"DLN : Sciences économiques et sociales en anglas\",\r\n      \"DN L: Sciences économiques et socialesen anglais\",\r\n      \"DNL  Sciences économqiues et sociales en anglais\",\r\n      \"DNL : Sciences economiques et sociales en anglais\",\r\n      \"DNL : Sciences écnoomiques et sociaules en anglais\",\r\n      \"DNL : Sciences éconmoiques et sociles en anglais\",\r\n      \"DNL : Sciences économiques et sociales en anglais\",\r\n      \"DNL : Sciences économiques et sociales en anglais LV2\",\r\n      \"DNL : Sciences économiques et soiales en anglais\",\r\n      \"DNL : Sciences économiques gt sociales enjanglais\",\r\n      \"DNL : Sciences économiques sociales en anglais\",\r\n      \"DNL : Sciences économiquese t sociales en anglais\",\r\n      \"DNL : Sciences écsonomiques et socieles en anglaij\",\r\n      \"DNL : Sfiences économiqhes et sociales en anglais\",\r\n      \"DNL : cyiences économiques et socialex en anglais\",\r\n      \"DNL: Sciences économiques et sociales en anglais\",\r\n      \"DNL:Scienceséconomiquesetsocialesenanglais\",\r\n      \"DNm :eSciences économiques et sociales en anglais\",\r\n      \"Dnl : Sciences Économiques Et Sociales En Anglais\",\r\n      \"dfl sts anglais\",\r\n      \"dl ses anglaais\",\r\n      \"dln sciences economiques et sociales en anglais\",\r\n      \"dln sciences economiques et sociales en anglas\",\r\n      \"dn l sciences economiques et socialesen anglais\",\r\n      \"dng ses antlasi\",\r\n      \"dnl cyiences economiques et socialex en anglais\",\r\n      \"dnl ess anglais\",\r\n      \"dnl sciences ecnoomiques et sociaules en anglais\",\r\n      \"dnl sciences econmoiques et sociles en anglais\",\r\n      \"dnl sciences economiques et sociales en anglais\",\r\n      \"dnl sciences economiques et soiales en anglais\",\r\n      \"dnl sciences economiques gt sociales enjanglais\",\r\n      \"dnl sciences economiques sociales en anglais\",\r\n      \"dnl sciences economiquese t sociales en anglais\",\r\n      \"dnl sciences economqiues et sociales en anglais\",\r\n      \"dnl sciences ecsonomiques et socieles en anglaij\",\r\n      \"dnl scienceseconomiquesetsocialesenanglais\",\r\n      \"dnl seks anglais\",\r\n      \"dnl ses anglais\",\r\n      \"dnl ses anglais - groupe A\",\r\n      \"dnl ses anglais Tle\",\r\n      \"dnl ses anglais groupe a\",\r\n      \"dnl ses anglaisv\",\r\n      \"dnl ses anglsif\",\r\n      \"dnl ses anglsiz\",\r\n      \"dnl ses anglvais\",\r\n      \"dnl ses canglais\",\r\n      \"dnl sfiences economiqhes et sociales en anglais\",\r\n      \"dnlo sis lnglais\",\r\n      \"dnlses angalis\",\r\n      \"dnlsesanglais\",\r\n      \"dnm esciences economiques et sociales en anglais\",\r\n      \"dvl ses anglahs\",\r\n      \"ndl ses anglai\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"histoiregeodnl\",\r\n    \"pretty\": \"Histoire-Géographie DNL\",\r\n    \"emoji\": \"🌎\",\r\n    \"formats\": [\r\n      \"HIST-GEO / HIST-GEO DNL\",\r\n      \"HIST-GEO / HIST-GEO  DNL\",\r\n      \"HIST-GEO DNL\",\r\n      \"HISTOIRE-GEO DNL\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ses\",\r\n    \"pretty\": \"Sciences Économiques Et Sociales\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"Sciences économiques et sociales\",\r\n      \"Sciences économiques et sociale\",\r\n      \"Sciences économqiues et sociales\",\r\n      \"Sciences economiques et sociales\",\r\n      \"Sciences écnoomiques et sociaules\",\r\n      \"Sciences éconmoiques et sociles\",\r\n      \"Sciences économiques et soiales\",\r\n      \"Sciences économiques gt sociales\",\r\n      \"Sciences économiques sociales\",\r\n      \"Sciences économiquese t sociales\",\r\n      \"Sciences écsonomiques et socieles\",\r\n      \"Sfiences économiqhes et sociales\",\r\n      \"cyiences économiques et socialex\",\r\n      \"Scienceséconomiquesetsociales\",\r\n      \"Sciences Économiques Et Sociales\",\r\n      \"sciences economiques et sociales\",\r\n      \"sciences economiques et sociale\",\r\n      \"cyiences economiques et socialex\",\r\n      \"sciences ecnoomiques et sociaules\",\r\n      \"sciences econmoiques et sociles\",\r\n      \"sciences economiques et soiales\",\r\n      \"sciences economiques gt sociales\",\r\n      \"sciences economiques sociales\",\r\n      \"sciences economiquese t sociales\",\r\n      \"sciences economqiues et sociales\",\r\n      \"sciences ecsonomiques et socieles\",\r\n      \"scienceseconomiquesetsociales\",\r\n      \"SES\",\r\n      \"SEs\",\r\n      \"SeS\",\r\n      \"sES\",\r\n      \"Ses\",\r\n      \"seS\",\r\n      \"sEs\",\r\n      \"S.E.S.\",\r\n      \"S.E.S\",\r\n      \"sfiences economiqhes et sociales\",\r\n      \"esciences economiques et sociales\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"echecs\",\r\n    \"pretty\": \"Echecs\",\r\n    \"emoji\": \"♟️\",\r\n    \"formats\": [\r\n      \"CEHECS\",\r\n      \"ECHECS\",\r\n      \"ECHECS (accompagnement)\",\r\n      \"ECHEjCS\",\r\n      \"ECHdECS\",\r\n      \"EfHbyCS\",\r\n      \"EgECw\",\r\n      \"echecs\",\r\n      \"echecsu\",\r\n      \"eches\",\r\n      \"echesc\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ecoagroterrcitoye\",\r\n    \"pretty\": \"Eco Agro Terr Citoye\",\r\n    \"emoji\": \"🌱\",\r\n    \"formats\": [\r\n      \"ECO.AGRO.TER.CITOfYE\",\r\n      \"ECO.AGRO.TERR.CITOE\",\r\n      \"ECO.AGRO.TERR.CITOYE\",\r\n      \"ECO.AGRO.TERR.CITOYE (option)\",\r\n      \"ECO.AGRO.TERR.CITOYE 3e\",\r\n      \"ECO.AGRO.TERR.CTOYE\",\r\n      \"ECO.AGRO.TERRCITOYE\",\r\n      \"ECO.AGcO.TfRR.CIOTYE\",\r\n      \"ECO.AGvO.TERR.CqTOYEq\",\r\n      \"ECO.cGRO.TERR.CpTOYE\",\r\n      \"eCp.AGR.OTERR.CITOYE\",\r\n      \"eco agco tfrr ciotye\",\r\n      \"eco agro ter citofye\",\r\n      \"eco agro terr citoe\",\r\n      \"eco agro terr citoye\",\r\n      \"eco agro terr citoye 3e\",\r\n      \"eco agro terr ctoye\",\r\n      \"eco agro terrcitoye\",\r\n      \"eco agvo terr cqtoyeq\",\r\n      \"eco cgro terr cptoye\",\r\n      \"ecoagroterrcitoye\",\r\n      \"ecp agr oterr citoye\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ecoampgestentrepris\",\r\n    \"pretty\": \"Eco &amp Gest Entrepris\",\r\n    \"emoji\": \"🏦\",\r\n    \"formats\": [\r\n      \"CEO.&am; GEST.ENTREPRIS\",\r\n      \"ECO.&amp; GEST.ENTREPRIS\",\r\n      \"ECO.&amp; GEST.ENTREPRIS special\",\r\n      \"ECO.&amp; GEST.ENTRERPIS\",\r\n      \"ECO.&amp; GEST.bNTREPcIS\",\r\n      \"ECO.&amp; SET.ENTREPRIS\",\r\n      \"ECO.&amp;GEST.ENTREPRIS\",\r\n      \"ECO.j&amp; GEqT.ENTREPRmS\",\r\n      \"ECu.&ams; GEST.ENTREPRIS\",\r\n      \"EO.&amp; GEST.ENTREPkRIS\",\r\n      \"Eco.&Amp; Gest.Entrepris\",\r\n      \"EjCO.&amp; GEST.ENTREPRIS\",\r\n      \"ceo am gest entrepris\",\r\n      \"eco amp gest bntrepcis\",\r\n      \"eco amp gest entrepris\",\r\n      \"eco amp gest entrepris special\",\r\n      \"eco amp gest entrerpis\",\r\n      \"eco amp set entrepris\",\r\n      \"eco j amp geqt entreprms\",\r\n      \"ecoampgestentrepris\",\r\n      \"ecu ams gest entrepris\",\r\n      \"ejco amp gest entrepris\",\r\n      \"eo amp gest entrepkris\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ecoamporgentreprise\",\r\n    \"pretty\": \"Eco &amp Org Entreprise\",\r\n    \"emoji\": \"📈\",\r\n    \"formats\": [\r\n      \"ECO.&AMP; ORG.ENTREPRISE\",\r\n      \"ECO.&amp; ORG.ENTREPRISE - groupe A\",\r\n      \"ECO.&amp; ORG.ENTREPRISE 4e\",\r\n      \"ECO.&amp; ORG.ENTREPRISEq\",\r\n      \"ECO.&amp; ORG.ENTREPRIxSE\",\r\n      \"ECO.&amp; ORGE.NTREPRISE\",\r\n      \"ECO.&amp; ORGx.ENTREPRISE\",\r\n      \"ECO.&amp; OpGpNTREPRISE\",\r\n      \"ECO.&amp;ORG.ENTREPRISE\",\r\n      \"ECO.&apm; ORG.ENTRxEPRISE\",\r\n      \"ECO.iamp; ORGE.NTREcRISE\",\r\n      \"ECOr.&amp; ORG.ENTREPRISE\",\r\n      \"eco amp opgpntreprise\",\r\n      \"eco amp org entreprise\",\r\n      \"eco amp org entreprise 4e\",\r\n      \"eco amp org entreprise groupe a\",\r\n      \"eco amp org entrepriseq\",\r\n      \"eco amp org entreprixse\",\r\n      \"eco amp orge ntreprise\",\r\n      \"eco amp orgx entreprise\",\r\n      \"eco apm org entrxeprise\",\r\n      \"eco iamp orge ntrecrise\",\r\n      \"ecoamporgentreprise\",\r\n      \"ecor amp org entreprise\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ecoamptechnqgestion\",\r\n    \"pretty\": \"Eco &amp Technq Gestion\",\r\n    \"emoji\": \"💹\",\r\n    \"formats\": [\r\n      \"ECO.&AMP; TECHNQ.GESTION\",\r\n      \"ECO.&amp ;TECHN.GESTION\",\r\n      \"ECO.&amp TECHNmQ.GESTION\",\r\n      \"ECO.&amp; TECHNQ.EGSTION\",\r\n      \"ECO.&amp; TECHNQ.GESIjON\",\r\n      \"ECO.&amp; TECHNQ.GESTION - groupe A\",\r\n      \"ECO.&amp; TECHNQ.GESTION CAP\",\r\n      \"ECO.&amp; TECHnNQ.GESTION\",\r\n      \"ECO.&amp; TEHNQ.GESTION\",\r\n      \"ECO.&amp;TECHNQ.GESTION\",\r\n      \"ECO.&ampw; TECNQ.GESTION\",\r\n      \"ECf.&amp; TECHQ.lESTION\",\r\n      \"ecf amp techq lestion\",\r\n      \"eco amp techn gestion\",\r\n      \"eco amp technmq gestion\",\r\n      \"eco amp technnq gestion\",\r\n      \"eco amp technq egstion\",\r\n      \"eco amp technq gesijon\",\r\n      \"eco amp technq gestion\",\r\n      \"eco amp technq gestion cap\",\r\n      \"eco amp technq gestion groupe a\",\r\n      \"eco amp tehnq gestion\",\r\n      \"eco ampw tecnq gestion\",\r\n      \"ecoamptechnqgestion\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ecodaposentreprampgest\",\r\n    \"pretty\": \"Eco D&apos Entrepr &amp Gest\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"EC.D&apos;ENTREPR.&amp; GEST\",\r\n      \"ECO.D&amos;ENTRPt.&amp; GEST\",\r\n      \"ECO.D&apos;ENTREPR.&amp; GEST\",\r\n      \"ECO.D&apos;ENTREPR.&amp; GEST 1ere\",\r\n      \"ECO.D&apos;ENTREPR.&amp;GEST\",\r\n      \"ECO.D&apovs;ENTREPR.&amp; eESd\",\r\n      \"ECO.D&aps;ENTREPR.&amp; GEST\",\r\n      \"ECO.D&aspos;ENTREPR.&amp;G EST\",\r\n      \"ECOD.&apos;ENTREPR.&amp; jhST\",\r\n      \"ECOgD&adpos;ENTREPR.gamp; GEST\",\r\n      \"EO.D&apos;ENTREPg.&amp;lGEST\",\r\n      \"Eco.D&Apos;Entrepr.&Amp; Gest\",\r\n      \"ec d apos entrepr amp gest\",\r\n      \"eco d amos entrpt amp gest\",\r\n      \"eco d apos entrepr amp gest\",\r\n      \"eco d apos entrepr amp gest 1ere\",\r\n      \"eco d apovs entrepr amp eesd\",\r\n      \"eco d aps entrepr amp gest\",\r\n      \"eco d aspos entrepr amp g est\",\r\n      \"ecod apos entrepr amp jhst\",\r\n      \"ecodaposentreprampgest\",\r\n      \"ecogd adpos entrepr gamp gest\",\r\n      \"eo d apos entrepg amp lgest\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ecoetdroitdunumerique\",\r\n    \"pretty\": \"Éco & Droit Du Numérique\",\r\n    \"emoji\": \"⚖️\",\r\n    \"formats\": [\r\n      \"Eco. & droit du numerique\",\r\n      \"cours de eco droit du numerique\",\r\n      \"cours de eco et droit du numerique\",\r\n      \"cours de Éco. & droit du numérique\",\r\n      \"ecdo droitd u numerique\",\r\n      \"ecj et droit du nhmerique\",\r\n      \"eco bet droit du numerique\",\r\n      \"eco doit du numeriqeu\",\r\n      \"eco drnit du numeriqie\",\r\n      \"eco droit du enumerique\",\r\n      \"eco droit du hummrique\",\r\n      \"eco droit du nuerique\",\r\n      \"eco droit du numerique\",\r\n      \"eco droit du numerique 3e\",\r\n      \"eco droit du numeriue\",\r\n      \"eco droit du numreique\",\r\n      \"eco droit dun umerique\",\r\n      \"eco droit duq numerique\",\r\n      \"eco droitdunumerique\",\r\n      \"eco dt droitddu numerique\",\r\n      \"eco edt droi du numerique\",\r\n      \"eco ei yroit du numerique\",\r\n      \"eco et driot du numerique\",\r\n      \"eco et droit d numeriuqe\",\r\n      \"eco et droit du numerique\",\r\n      \"eco et droit du nzumerique\",\r\n      \"eco et droit du unmerique\",\r\n      \"eco et droiti du numerique\",\r\n      \"eco ex droitou numerique\",\r\n      \"eco ft droit du numerilque\",\r\n      \"eco n dritzdu numerique\",\r\n      \"eco t drojit du numerique\",\r\n      \"eco te droit du numeriqhue\",\r\n      \"ecoetdroitdunumerique\",\r\n      \"eoc ddroit du numerique\",\r\n      \"Écdo. & droitd u numérique\",\r\n      \"Éco .& droit du numérique\",\r\n      \"Éco.  droit du numréique\",\r\n      \"Éco. & Droit Du Numérique\",\r\n      \"Éco. & doit du numériqeu\",\r\n      \"Éco. & drnit du numériqie\",\r\n      \"Éco. & droit du enumérique\",\r\n      \"Éco. & droit du hummrique\",\r\n      \"Éco. & droit du numérique 3e\",\r\n      \"Éco. & droit du numériue\",\r\n      \"Éco. & droit du nuérique\",\r\n      \"Éco. & droit duq numérique\",\r\n      \"Éco. &droit du numérique\",\r\n      \"Éco. &droit dun umérique\",\r\n      \"Éco.&droitdunumérique\",\r\n      \"Éco.n& dritzdu numérique\",\r\n      \"Éoc. & ddroit du numérique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ecogenecoentrepr\",\r\n    \"pretty\": \"Eco Gen Eco Entrepr\",\r\n    \"emoji\": \"💼\",\r\n    \"formats\": [\r\n      \"ECO.GEN-.ECO.ENTREPR\",\r\n      \"ECO.GEN-.ECO.NTREPR\",\r\n      \"ECO.GEN. ECO.ENTREPR\",\r\n      \"ECO.GEN.-ECO.ENTERtPR\",\r\n      \"ECO.GEN.-ECO.ENTREPR\",\r\n      \"ECO.GEN.-ECO.ENTREPR bac pro\",\r\n      \"ECO.GEN.-ECO.ENTjREPR\",\r\n      \"ECO.GEN.-ECO.ENTlREPR\",\r\n      \"ECO.GEN.-EOC.ENTREPR\",\r\n      \"ECO.GEN.-xCO.ENTgER\",\r\n      \"ECOw.GE.-ECO.ENTREPR\",\r\n      \"Eco.Gen.-Eco.Entrepr\",\r\n      \"eco gen eco entertpr\",\r\n      \"eco gen eco entjrepr\",\r\n      \"eco gen eco entlrepr\",\r\n      \"eco gen eco entrepr\",\r\n      \"eco gen eco entrepr bac pro\",\r\n      \"eco gen eco ntrepr\",\r\n      \"eco gen eoc entrepr\",\r\n      \"eco gen xco entger\",\r\n      \"ecogenecoentrepr\",\r\n      \"ecow ge eco entrepr\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"econgestionampdroit\",\r\n    \"pretty\": \"Econ Gestion &amp Droit\",\r\n    \"emoji\": \"📚\",\r\n    \"formats\": [\r\n      \"ECON.GESTION &am; RDOIT\",\r\n      \"ECON.GESTION &amp nROIT\",\r\n      \"ECON.GESTION &amp; DROIT\",\r\n      \"ECON.GESTION &ap; DRxOIT\",\r\n      \"ECON.GESTION&amp;DROIT\",\r\n      \"ECON.GESTIONx &amp; DROIT\",\r\n      \"ECON.GESTIOi a&mi; DROIT\",\r\n      \"ECON.GESTOIN&amp; DROIT\",\r\n      \"ECON.GExSTION &amp; DROI\",\r\n      \"EkON.GESTINb&amp; DROIT\",\r\n      \"cours de ECON.GESTION &amp; DROIT\",\r\n      \"cours de econ gestion amp droit\",\r\n      \"econ gestioi a mi droit\",\r\n      \"econ gestion am rdoit\",\r\n      \"econ gestion amp droit\",\r\n      \"econ gestion amp nroit\",\r\n      \"econ gestion ap drxoit\",\r\n      \"econ gestionx amp droit\",\r\n      \"econ gestoin amp droit\",\r\n      \"econ gexstion amp droi\",\r\n      \"econgestionampdroit\",\r\n      \"ekon gestinb amp droit\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"economconstruction\",\r\n    \"pretty\": \"Econom Construction\",\r\n    \"emoji\": \"🏗️\",\r\n    \"formats\": [\r\n      \"CEONOM. CONiSTRUCTION\",\r\n      \"ECONM. CONSTRzCTION\",\r\n      \"ECONOM. CONSTRUCTION\",\r\n      \"ECONOM. CONSTRUCTION (TP)\",\r\n      \"ECONOM. CONSTRUCTION 2nde\",\r\n      \"ECONOM. CONSToUCTeON\",\r\n      \"ECONOM.CONSTRUCTION\",\r\n      \"ECONOxM. CONSTRUCTION\",\r\n      \"ECONOyM. CONSTRUCTION\",\r\n      \"ECOOM. CONSTRUCTION\",\r\n      \"EONOM. OCNSTRUCTION\",\r\n      \"ceonom conistruction\",\r\n      \"econm constrzction\",\r\n      \"econom constoucteon\",\r\n      \"econom construction\",\r\n      \"econom construction 2nde\",\r\n      \"economconstruction\",\r\n      \"econoxm construction\",\r\n      \"econoym construction\",\r\n      \"ecoom construction\",\r\n      \"eonom ocnstruction\",\r\n      \"gECONOM. CONSTRUCTINO\",\r\n      \"geconom constructino\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"economfamilampsoc\",\r\n    \"pretty\": \"Econom Famil &amp Soc\",\r\n    \"emoji\": \"👨‍👩‍👧‍👦\",\r\n    \"formats\": [\r\n      \"ECONM. FAMIL.&amp; SOC.\",\r\n      \"ECONOM. FAMIL.&AMP; SOC.\",\r\n      \"ECONOM. FAMIL.&ahp;y SOw.\",\r\n      \"ECONOM. FAMIL.&amp; OSC.\",\r\n      \"ECONOM. FAMIL.&amp; SOC.\",\r\n      \"ECONOM. FAMIL.&amp; SOCb.\",\r\n      \"ECONOM. FAMIL.a&mp;c SOC.\",\r\n      \"ECONOM.FAMIL.&amp;SOC.\",\r\n      \"ECONOe. FAMIL.&agp; SOC.\",\r\n      \"ECONOu. FAMIL.&amp; SOC.\",\r\n      \"ECeONOM. FAIML.&amp; SOC.\",\r\n      \"cours de ECONOM. FAMIL.&amp; SOC.\",\r\n      \"cours de econom famil amp soc\",\r\n      \"eceonom faiml amp soc\",\r\n      \"econm famil amp soc\",\r\n      \"econoe famil agp soc\",\r\n      \"econom famil a mp c soc\",\r\n      \"econom famil ahp y sow\",\r\n      \"econom famil amp osc\",\r\n      \"econom famil amp soc\",\r\n      \"econom famil amp socb\",\r\n      \"economfamilampsoc\",\r\n      \"econou famil amp soc\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"economie\",\r\n    \"pretty\": \"Economie\",\r\n    \"emoji\": \"💶\",\r\n    \"formats\": [\r\n      \"ECNOOMIE\",\r\n      \"ECONOMIE LV2\",\r\n      \"ECvOffMIE\",\r\n      \"Economie\",\r\n      \"ceonome\",\r\n      \"ceonomie\",\r\n      \"echnomie\",\r\n      \"econjomie\",\r\n      \"economie\",\r\n      \"economie cap\",\r\n      \"ecqnomiec\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"economieampdroit\",\r\n    \"pretty\": \"Economie &amp Droit\",\r\n    \"emoji\": \"⚖️\",\r\n    \"formats\": [\r\n      \"ECONOMIE &amp; DROIT\",\r\n      \"ECONOMIE &amp; DROIT special\",\r\n      \"ECONOMIE &amp; DROT\",\r\n      \"ECONOMIE &amp;D ROIT\",\r\n      \"ECONOMIE &amp;kDbgOIT\",\r\n      \"ECONOMIE& amp; DROIT\",\r\n      \"ECONOMIE&amp; DROIT\",\r\n      \"ECONOMIE&amp;DROIT\",\r\n      \"ECOONMIE &amp; DOIT\",\r\n      \"economie amp d roit\",\r\n      \"economie amp droit\",\r\n      \"economie amp droit special\",\r\n      \"economie amp drot\",\r\n      \"economie amp kdbgoit\",\r\n      \"economieampdroit\",\r\n      \"ecoonmie amp doit\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"economieampgestdiv\",\r\n    \"pretty\": \"Economie &amp Gest Div\",\r\n    \"emoji\": \"📉\",\r\n    \"formats\": [\r\n      \"ECONMOIE &amp; GEST.DIV.\",\r\n      \"ECONOMIE &AMP; GEST.DIV.\",\r\n      \"ECONOMIE &amp; GEST.DIV\",\r\n      \"ECONOMIE &amp; GEST.DIV.\",\r\n      \"ECONOMIE &amp; GEST.DIV. bac pro\",\r\n      \"ECONOMIE hamp; GEST.DIV.\",\r\n      \"ECONOMIE&amp;GEST.DIV.\",\r\n      \"ECONOhIE &amp; GEST.Do.V\",\r\n      \"ECONOxMIE &amp; GEST.DIV.\",\r\n      \"ECxNOMIE &aap; GEST.DIV.\",\r\n      \"EwONOMEI &amp; GESTiDIV.\",\r\n      \"econmoie amp gest div\",\r\n      \"econohie amp gest do v\",\r\n      \"economie amp gest div\",\r\n      \"economie amp gest div bac pro\",\r\n      \"economie hamp gest div\",\r\n      \"economieampgestdiv\",\r\n      \"econoxmie amp gest div\",\r\n      \"ecxnomie aap gest div\",\r\n      \"ewonomei amp gestidiv\",\r\n      \"gECONOMIE &amp; GEST.IV.\",\r\n      \"geconomie amp gest iv\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"economieampgestion\",\r\n    \"pretty\": \"Economie &amp Gestion\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"ECNOMIE &amp; GESTION\",\r\n      \"ECONOMIE &am; GSETION\",\r\n      \"ECONOMIE &amp; GESTINOs\",\r\n      \"ECONOMIE &amp; GESTION\",\r\n      \"ECONOMIE &amp; GESTION (accompagnement)\",\r\n      \"ECONOMIE&amp;GESTION\",\r\n      \"ECONOqIE &amp; GESTuON\",\r\n      \"ECONOsuE &amp; GESTION\",\r\n      \"EsONOMIE &tmp; GESTION\",\r\n      \"ecnomie amp gestion\",\r\n      \"economie am gsetion\",\r\n      \"economie amp gestinos\",\r\n      \"economie amp gestion\",\r\n      \"economieampgestion\",\r\n      \"econoqie amp gestuon\",\r\n      \"econosue amp gestion\",\r\n      \"esonomie tmp gestion\",\r\n      \"gmONOMIE &amp;GESTION\",\r\n      \"gmonomie amp gestion\",\r\n      \"lCOiOMIE &amp; GESTION\",\r\n      \"lcoiomie amp gestion\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"economiedaposentrepris\",\r\n    \"pretty\": \"Economie D&apos Entrepris\",\r\n    \"emoji\": \"🏭\",\r\n    \"formats\": [\r\n      \"ECONOMIE &Dapos;jENTREPRIS\",\r\n      \"ECONOMIE D&apos;ENTREPRIS\",\r\n      \"ECONOMIE D&apos;ENTREPRIS (TP)\",\r\n      \"ECONOMIE D&apos;ENTREPRIS CAP\",\r\n      \"ECONOMIE D&aposENTREPRIS\",\r\n      \"ECONOMIE D&pos;ENTREPRIS\",\r\n      \"ECONOMIED&apos;ENTREPRIS\",\r\n      \"ECONOMIfE D&apos;ENTREPRIS\",\r\n      \"ECONOlIE D&upos;ENTREPRISe\",\r\n      \"ECONbMOIE D&apos;ENTREPRIS\",\r\n      \"ECONvOMIE D&apos;ENTREPIS\",\r\n      \"EyrNOMIE D&apos;ENTREPRIqS\",\r\n      \"econbmoie d apos entrepris\",\r\n      \"econolie d upos entreprise\",\r\n      \"economie d apos entrepris\",\r\n      \"economie d apos entrepris cap\",\r\n      \"economie d aposentrepris\",\r\n      \"economie d pos entrepris\",\r\n      \"economie dapos jentrepris\",\r\n      \"economied apos entrepris\",\r\n      \"economiedaposentrepris\",\r\n      \"economife d apos entrepris\",\r\n      \"econvomie d apos entrepis\",\r\n      \"eyrnomie d apos entrepriqs\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"economiegenerale\",\r\n    \"pretty\": \"Economie Generale\",\r\n    \"emoji\": \"💱\",\r\n    \"formats\": [\r\n      \"ECONMIE GENERALE\",\r\n      \"ECONMOIE GENEALE\",\r\n      \"ECONOMIE GENERALE (option)\",\r\n      \"ECONOMIE GENERALE LP\",\r\n      \"ECONOMIE GNERALE\",\r\n      \"ECONOMIEGENERALE\",\r\n      \"ECOjOMEI bENERALE\",\r\n      \"economge generalk\",\r\n      \"economie generale\",\r\n      \"economie genereale\",\r\n      \"economiebgeneral\",\r\n      \"economiegenerale\",\r\n      \"econoqie generael\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ecoorgvieentrepr\",\r\n    \"pretty\": \"Eco Org Vie Entrepr\",\r\n    \"emoji\": \"👔\",\r\n    \"formats\": [\r\n      \"EC-ORG.VIE ENTREPR.\",\r\n      \"ECO ORG.VIE ENTREPR.\",\r\n      \"ECO-OGR.VIE ENTREPR.\",\r\n      \"ECO-ORG.VIE ENTREPR. 3e\",\r\n      \"ECO-ORG.VIE ENTREPR. > salle 201\",\r\n      \"ECO-ORG.VIE ENTREyRl\",\r\n      \"ECO-ORG.VIE ENTRsEPR.\",\r\n      \"ECO-ORG.VIE NETREPR.\",\r\n      \"ECO-ORG.VIEENTREPR.\",\r\n      \"ECO-wRG.VIE ENTREPv.\",\r\n      \"ECOOR.GVIE ENTREPR.\",\r\n      \"Eco-Org.Vie Entrepr.\",\r\n      \"ec org vie entrepr\",\r\n      \"eco ogr vie entrepr\",\r\n      \"eco org vie entrepr\",\r\n      \"eco org vie entrepr 3e\",\r\n      \"eco org vie entrepr salle 201\",\r\n      \"eco org vie entreyrl\",\r\n      \"eco org vie entrsepr\",\r\n      \"eco org vie netrepr\",\r\n      \"eco org vieentrepr\",\r\n      \"eco wrg vie entrepv\",\r\n      \"ecoor gvie entrepr\",\r\n      \"ecoorgvieentrepr\",\r\n      \"lCO-ORfG.VIE ENTREPR.\",\r\n      \"lco orfg vie entrepr\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ecrituremedianum\",\r\n    \"pretty\": \"Écriture Média Numérique\",\r\n    \"emoji\": \"⌨️\",\r\n    \"formats\": [\r\n      \"Ecriture media numerique\",\r\n      \"decriture meida num\",\r\n      \"echiture media numeriuqx\",\r\n      \"ecjitre mediaznumerique\",\r\n      \"ecritmre media nim\",\r\n      \"ecritre mjdia nam\",\r\n      \"ecrituie meia nrmerique\",\r\n      \"ecritunekmedia num\",\r\n      \"ecritur media num\",\r\n      \"ecritur media numeriqeu\",\r\n      \"ecriture ekdia num\",\r\n      \"ecriture emdia num\",\r\n      \"ecriture media mu\",\r\n      \"ecriture media nmeriqze\",\r\n      \"ecriture media num\",\r\n      \"ecriture media num tle\",\r\n      \"ecriture media numeriqe\",\r\n      \"ecriture medianumerique\",\r\n      \"ecriture medin nu\",\r\n      \"ecriture mgdia numerivue\",\r\n      \"ecriture pmedia num\",\r\n      \"ecriturem edia nuerique\",\r\n      \"ecriturem edia numeriue\",\r\n      \"ecrituremedianum\",\r\n      \"ecrituremedianumerique\",\r\n      \"ecriturevmediawnumerique\",\r\n      \"ecriturtdmedia numerique\",\r\n      \"ecriure media anum\",\r\n      \"ecrtlure medit numerique\",\r\n      \"ecwitqre media num\",\r\n      \"ecwiturc media num\",\r\n      \"evcriture media num\",\r\n      \"Échiture média numériuqx\",\r\n      \"Écjitre médiaznumérique\",\r\n      \"Écrituie méia nrmérique\",\r\n      \"Écritur média numériqeu\",\r\n      \"Écriture Média Numérique\",\r\n      \"Écriture mgdia numérivue\",\r\n      \"Écriture média nmériqze\",\r\n      \"Écriture média numériqe\",\r\n      \"Écriture média numérique\",\r\n      \"Écriture média numérique (TP)\",\r\n      \"Écriture médianumérique\",\r\n      \"Écriturem édia numériue\",\r\n      \"Écriturem édia nuérique\",\r\n      \"Écrituremédianumérique\",\r\n      \"Écriturevmédiawnumérique\",\r\n      \"Écriturtdmédia numérique\",\r\n      \"Écrtlure médit numérique\",\r\n      \"ecriture media\",\r\n      \"écriture media\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"edciviqjuridiqsoc\",\r\n    \"pretty\": \"Ed Civiq Juridiq Soc\",\r\n    \"emoji\": \"📜\",\r\n    \"formats\": [\r\n      \"ED.CIVI.JURIDIQ.SOC\",\r\n      \"ED.CIVIQ.JURIDIQ.SC\",\r\n      \"ED.CIVIQ.JURIDIQ.SCO\",\r\n      \"ED.CIVIQ.JURIDIQ.SOC\",\r\n      \"ED.CIVIQ.JURIDIQ.SOC 5e\",\r\n      \"ED.CIVIQ.JURIDIQ.SOC Tle\",\r\n      \"ED.CIVIQ.JURzIDIQ.SOC\",\r\n      \"ED.CIVIQ.UJRIDIQ.SOi\",\r\n      \"ED.CVIIQ.JURIDIQ.SOC\",\r\n      \"ED.xIVIQJ.URuDIQ.SOC\",\r\n      \"EDd.CIVQI.JURIDIQ.SOC\",\r\n      \"ed civi juridiq soc\",\r\n      \"ed civiq juridiq sc\",\r\n      \"ed civiq juridiq sco\",\r\n      \"ed civiq juridiq soc\",\r\n      \"ed civiq juridiq soc 5e\",\r\n      \"ed civiq juridiq soc tle\",\r\n      \"ed civiq jurzidiq soc\",\r\n      \"ed civiq ujridiq soi\",\r\n      \"ed cviiq juridiq soc\",\r\n      \"ed xiviqj urudiq soc\",\r\n      \"edciviqjuridiqsoc\",\r\n      \"edd civqi juridiq soc\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"edphysiqueampsport\",\r\n    \"pretty\": \"Ed Physique &amp Sport\",\r\n    \"emoji\": \"🤸\",\r\n    \"formats\": [\r\n      \"ED.HYSIQUE &amp; SPORT.\",\r\n      \"ED.HYSIQUv &amp; SPORd.\",\r\n      \"ED.PHYSIQU E&amp; SPORT.\",\r\n      \"ED.PHYSIQUE &AMP; SPORT.\",\r\n      \"ED.PHYSIQUE &amp; SPORT. 2nde\",\r\n      \"ED.PHYSIQUE&amp;SPORT.\",\r\n      \"ED.PHYSIQUj &ampu SPORT.\",\r\n      \"ED.PYSIQUE &map; SPORT.\",\r\n      \"EDoPHYSQUE &ampj SPORT.\",\r\n      \"Eq.PHYlIQUE &amp;S PORT.\",\r\n      \"cours de ED.PHYSIQUE &amp; SPORT.\",\r\n      \"cours de ed physique amp sport\",\r\n      \"ed hysique amp sport\",\r\n      \"ed hysiquv amp spord\",\r\n      \"ed physiqu e amp sport\",\r\n      \"ed physique amp sport\",\r\n      \"ed physique amp sport 2nde\",\r\n      \"ed physiquj ampu sport\",\r\n      \"ed pysique map sport\",\r\n      \"edophysque ampj sport\",\r\n      \"edphysiqueampsport\",\r\n      \"eq phylique amp s port\",\r\n      \"uD.HPoSIQUE &amp; SPORT.\",\r\n      \"ud hposique amp sport\",\r\n      \"ED.PHYSIQUE &amp SPORT.\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"edphysiquesport\",\r\n    \"pretty\": \"Éducation Physique & Sportive\",\r\n    \"emoji\": \"🏋️\",\r\n    \"formats\": [\r\n      \"EDUCATION PHYSIQUE ET SPORTIVE\",\r\n      \"Education physique & sportive\",\r\n      \"bducation physiqumet sportive\",\r\n      \"cpu\",\r\n      \"de physique sport\",\r\n      \"de physique spot\",\r\n      \"ed phssiqub shport\",\r\n      \"ed phsyique sporrt\",\r\n      \"ed phyaique ssort\",\r\n      \"ed phymiqul sport\",\r\n      \"ed physeique sport\",\r\n      \"ed physiqme sport\",\r\n      \"ed physiqu esport\",\r\n      \"ed physique osport\",\r\n      \"ed physique sporpt\",\r\n      \"ed physique sporqt\",\r\n      \"ed physique sport\",\r\n      \"ed physique sport (accompagnement)\",\r\n      \"ed physique sport 2nde\",\r\n      \"ed physique spotr\",\r\n      \"edd hysique sport\",\r\n      \"edphysiquesport\",\r\n      \"eduaction physique sportive\",\r\n      \"eduaction physnque et tportive\",\r\n      \"eduation physique sportive\",\r\n      \"educaion physique sportive\",\r\n      \"educaitpn physique ea sportive\",\r\n      \"educatien phyique et spbrtive\",\r\n      \"educatio physique et sportive\",\r\n      \"educatiobgpyhsique sportive\",\r\n      \"education jhysique et sportive\",\r\n      \"education phsysique s portive\",\r\n      \"education phydiqui sportive\",\r\n      \"education physieue et sportivl\",\r\n      \"education physiqe s portive\",\r\n      \"education physiqu pgsportive\",\r\n      \"education physique et sportive 3e\",\r\n      \"education physique et sportive > salle 201\",\r\n      \"education physique et sportive salle 201\",\r\n      \"education physique et spozrtive\",\r\n      \"education physique et sprtive\",\r\n      \"education physique ets pfortive\",\r\n      \"education physique sportive\",\r\n      \"education physique t sportive\",\r\n      \"education physiqueg sportive\",\r\n      \"education physiquevt kportive\",\r\n      \"education physiqune et sportive\",\r\n      \"education physyique soprtive\",\r\n      \"education pyhsiue sportive\",\r\n      \"education pyhysque sportive\",\r\n      \"educationphysique sportive\",\r\n      \"educationphysiqueetsportive\",\r\n      \"educatlon physwque ets portive\",\r\n      \"educrtion hyxique sportive\",\r\n      \"eej\",\r\n      \"ejx\",\r\n      \"enps\",\r\n      \"eps\",\r\n      \"eps (AP)\",\r\n      \"eps lp\",\r\n      \"epv\",\r\n      \"epw\",\r\n      \"epys\",\r\n      \"eudcation physiqu sportive\",\r\n      \"evs\",\r\n      \"mxs\",\r\n      \"veps\",\r\n      \"Éduaction physique & sportive\",\r\n      \"Éduation physique & sportive\",\r\n      \"Éducaion physique & sportive\",\r\n      \"Éducatiobgpyhsique & sportive\",\r\n      \"Éducation phsysique &s portive\",\r\n      \"Éducation phydiqui&  sportive\",\r\n      \"Éducation physiqe &s portive\",\r\n      \"Éducation physiqu pgsportive\",\r\n      \"Éducation physique & sportive\",\r\n      \"Éducation physique & sportive (option)\",\r\n      \"Éducation physiqueg & sportive\",\r\n      \"Éducation physyique & soprtive\",\r\n      \"Éducation pyhsiue & sportive\",\r\n      \"Éducation pyhysque & sportive\",\r\n      \"Éducationphysique&sportive\",\r\n      \"Éducrtion hyxique & sportive\",\r\n      \"Éudcation physiqu & sportive\",\r\n      \"ED.PHYSIQUE & SPORT.\",\r\n      \"edphysique  sport\",\r\n      \"Éudcation physiqu & sportive\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"edplastampartsappl\",\r\n    \"pretty\": \"Ed Plast &amp Arts Appl\",\r\n    \"emoji\": \"🎨\",\r\n    \"formats\": [\r\n      \"ED.PLAST.&amp; ARTS APLP\",\r\n      \"ED.PLAST.&amp; ARTS APPL\",\r\n      \"ED.PLAST.&amp; ARTS APPL bac pro\",\r\n      \"ED.PLAST.&amp; ARwS sPPL\",\r\n      \"ED.PLAST.&amp;ARTSAPPL\",\r\n      \"ED.PLASTc.dmp; ARTS APPL\",\r\n      \"ED.PLuAST.&amp; ARTS APPL\",\r\n      \"ED.uLAST.&am;p ARTS APPL\",\r\n      \"EDPLAST.&amp; ARTS APPL\",\r\n      \"Ed.Plast.&Amp; Arts Appl\",\r\n      \"ed plast amp arts aplp\",\r\n      \"ed plast amp arts appl\",\r\n      \"ed plast amp arts appl bac pro\",\r\n      \"ed plast amp artsappl\",\r\n      \"ed plast amp arws sppl\",\r\n      \"ed plastc dmp arts appl\",\r\n      \"ed pluast amp arts appl\",\r\n      \"ed ulast am p arts appl\",\r\n      \"edplast amp arts appl\",\r\n      \"edplastampartsappl\",\r\n      \"pED.PLAST.&amp; ARTS dPzL\",\r\n      \"ped plast amp arts dpzl\",\r\n      \"sED.PLAST.&amp; ARTSAPPL\",\r\n      \"sed plast amp artsappl\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"educartartsappliq\",\r\n    \"pretty\": \"Educ Art Arts Appliq\",\r\n    \"emoji\": \"🖌️\",\r\n    \"formats\": [\r\n      \"EDUC.AR-ARTS APPLIQ\",\r\n      \"EDUC.ART ARTS APPLIQ\",\r\n      \"EDUC.ART-ARTS APLPI\",\r\n      \"EDUC.ART-ARTS APPLIQ\",\r\n      \"EDUC.ART-ARTS APPdIz\",\r\n      \"EDUC.ART-ARTSAPPLIQ\",\r\n      \"EDUC.ART-wRTS APPLIQ\",\r\n      \"EDUC.ARk-pARTS APPvIQ\",\r\n      \"EDUC.fRTiARTS APLIQ\",\r\n      \"EDUC.kART-ARTS APLIQ\",\r\n      \"EDUC.mRT-ARpTu APPLIQ\",\r\n      \"Educ.Art-Arts Appliq\",\r\n      \"cours de EDUC.ART-ARTS APPLIQ\",\r\n      \"cours de educ art arts appliq\",\r\n      \"educ ar arts appliq\",\r\n      \"educ ark parts appviq\",\r\n      \"educ art arts aplpi\",\r\n      \"educ art arts appdiz\",\r\n      \"educ art arts appliq\",\r\n      \"educ art artsappliq\",\r\n      \"educ art wrts appliq\",\r\n      \"educ frtiarts apliq\",\r\n      \"educ kart arts apliq\",\r\n      \"educ mrt arptu appliq\",\r\n      \"educartartsappliq\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"educationartistique\",\r\n    \"pretty\": \"Education Artistique\",\r\n    \"emoji\": \"🎭\",\r\n    \"formats\": [\r\n      \"EDCATION ARTISTIQUE\",\r\n      \"EDUCATION ARTISTIQUE\",\r\n      \"EDUCATION ARTISTIQUE special\",\r\n      \"EDUCATION ARTIsTIQUtr\",\r\n      \"EDUCATON ARTISTIQUE\",\r\n      \"Education Artistique\",\r\n      \"EeUCATION ARISTjQUE\",\r\n      \"eduaction arliscique\",\r\n      \"education artsitique\",\r\n      \"educationartistique\",\r\n      \"edueation aristkque\",\r\n      \"egucmiton artistique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"educationcivique\",\r\n    \"pretty\": \"Éducation Civique\",\r\n    \"emoji\": \"🗳️\",\r\n    \"formats\": [\r\n      \"Education civique\",\r\n      \"eduation civizue\",\r\n      \"educaeion civiqde\",\r\n      \"educaiioh ivique\",\r\n      \"educaitonl civique\",\r\n      \"educatdion civique\",\r\n      \"educateion civique\",\r\n      \"educatibn civivue\",\r\n      \"educatidon ciique\",\r\n      \"education ciivvue\",\r\n      \"education cisiyue\",\r\n      \"education civfqle\",\r\n      \"education civgique\",\r\n      \"education civiqe\",\r\n      \"education civique CAP\",\r\n      \"education civique bac pro\",\r\n      \"education civique lp\",\r\n      \"education cviuqe\",\r\n      \"education fcvque\",\r\n      \"educationc ivique\",\r\n      \"educationcivicque\",\r\n      \"educationcivique\",\r\n      \"educatiop cxique\",\r\n      \"educazionncivique\",\r\n      \"educdjion civqiue\",\r\n      \"educeibon civique\",\r\n      \"educytion cvlique\",\r\n      \"ehducation ivique\",\r\n      \"emducaion civique\",\r\n      \"eudcation civique\",\r\n      \"exuclrtion civique\",\r\n      \"reducatiwn oivique\",\r\n      \"yducation civqcque\",\r\n      \"Éduation civizue\",\r\n      \"Éducaeion civiqde\",\r\n      \"Éducaiioh ivique\",\r\n      \"Éducaitonl civique\",\r\n      \"Éducatibn civivue\",\r\n      \"Éducatidon ciique\",\r\n      \"Éducation Civique\",\r\n      \"Éducation ciivvue\",\r\n      \"Éducation cisiyue\",\r\n      \"Éducation civique LP\",\r\n      \"Éducation civique LV2\",\r\n      \"Éducationcivicque\",\r\n      \"Éducationcivique\",\r\n      \"Éducatiop cxique\",\r\n      \"Éducdjion civqiue\",\r\n      \"Éduceibon civique\",\r\n      \"Éhducation ivique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"educationcivique_xml\",\r\n    \"pretty\": \"Education Civique\",\r\n    \"emoji\": \"📜\",\r\n    \"formats\": [\r\n      \"EDUCATIN CIVIQUE\",\r\n      \"EDUCATIO NCIVhIQUE\",\r\n      \"EDUCATION CIVIQUE\",\r\n      \"EDUCATION CIVIQUE (TP)\",\r\n      \"EDUCATION CIVIQUEa\",\r\n      \"EDUCATON CIVzQUE\",\r\n      \"education cviisque\",\r\n      \"educationcivique\",\r\n      \"educationcivique_xml\",\r\n      \"educationiciviqu\",\r\n      \"edvcation civieu\",\r\n      \"nDUCpTION CIVIQUE\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"educationmusicale\",\r\n    \"pretty\": \"Éducation Musicale\",\r\n    \"emoji\": \"🎼\",\r\n    \"formats\": [\r\n      \"EDUC MUSICALE\",\r\n      \"busiqe\",\r\n      \"deuc mudsicale\",\r\n      \"eazcation musicale\",\r\n      \"eddcu musicale\",\r\n      \"edncatiox musiacle\",\r\n      \"edu musicale\",\r\n      \"eduaction musicale\",\r\n      \"educ emusicale\",\r\n      \"educ lmusicale\",\r\n      \"educ mgusicale\",\r\n      \"educ musicae\",\r\n      \"educ musicale\",\r\n      \"educ musicale - groupe A\",\r\n      \"educ musicale groupe a\",\r\n      \"educ usicale\",\r\n      \"educ xusicale\",\r\n      \"educatfonmusieale\",\r\n      \"educatino musicale\",\r\n      \"educatio muasicale\",\r\n      \"educatio nmusicale\",\r\n      \"education hutijcale\",\r\n      \"education lmusicale\",\r\n      \"education msicale\",\r\n      \"education muiscale\",\r\n      \"education musicael\",\r\n      \"education musicale\",\r\n      \"education musicale 2nde\",\r\n      \"education musicale LV1\",\r\n      \"education musicale salle 201\",\r\n      \"education musicale tle\",\r\n      \"education musicle\",\r\n      \"education muswdcawe\",\r\n      \"educationcmisiczale\",\r\n      \"educationemusicqle\",\r\n      \"educationffnusicale\",\r\n      \"educationimusiclre\",\r\n      \"educationm usicalem\",\r\n      \"educationmusicale\",\r\n      \"educmusicale\",\r\n      \"educrmuskucale\",\r\n      \"educsation musicale\",\r\n      \"educstion musiccle\",\r\n      \"educv musicale\",\r\n      \"eduecationm usicale\",\r\n      \"eouc musiccle\",\r\n      \"esucamusicale\",\r\n      \"ewucaton mksicale\",\r\n      \"gducation musicau\",\r\n      \"kducatison mnsicale\",\r\n      \"mdeique\",\r\n      \"miuque\",\r\n      \"msiquet\",\r\n      \"msuiquer\",\r\n      \"musfzue\",\r\n      \"musiouqe\",\r\n      \"musiqe\",\r\n      \"musiqu\",\r\n      \"musique\",\r\n      \"musique 4e\",\r\n      \"musique special\",\r\n      \"rdhc musiale\",\r\n      \"teducation musicale\",\r\n      \"umsique\",\r\n      \"usique\",\r\n      \"xeducation musicale\",\r\n      \"Éazcation musicale\",\r\n      \"Édncatiox musiacle\",\r\n      \"Éduaction musicale\",\r\n      \"Éducatio muasicale\",\r\n      \"Éducatio nmusicale\",\r\n      \"Éducation hutijcale\",\r\n      \"Éducation lmusicale\",\r\n      \"Éducation muiscale\",\r\n      \"Éducation musicale\",\r\n      \"Éducation musicale > salle 201\",\r\n      \"Éducation musicale Tle\",\r\n      \"Éducation musicle\",\r\n      \"Éducationcmisiczale\",\r\n      \"Éducationffnusicale\",\r\n      \"Éducationm usicalem\",\r\n      \"Éducationmusicale\",\r\n      \"Éducstion musiccle\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"educationmusicale_xml\",\r\n    \"pretty\": \"Education Musicale\",\r\n    \"emoji\": \"🎵\",\r\n    \"formats\": [\r\n      \"EDUACTION MUSrICALE\",\r\n      \"EDUCATION MUSICALE\",\r\n      \"EDUCATION MUSICALE > salle 201\",\r\n      \"EDUCATION MUSICALE CAP\",\r\n      \"EDUCATION MUSICzALE\",\r\n      \"EUDCATION MUSICALE\",\r\n      \"EgCATIONlMUSICALE\",\r\n      \"edcuation musicale\",\r\n      \"education muicale\",\r\n      \"education musicale salle 201\",\r\n      \"educationm usicale\",\r\n      \"educationmusicale\",\r\n      \"educationmusicale_xml\",\r\n      \"eduction musciale\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"enseigmtartistique\",\r\n    \"pretty\": \"Enseigmt Artistique\",\r\n    \"emoji\": \"🎨\",\r\n    \"formats\": [\r\n      \"ENSEIGMT ARTISTIQUE (option)\",\r\n      \"ENSEIGMTARTISTIQUE\",\r\n      \"ENSEIGMTARTzmTIQUE\",\r\n      \"ENSEIMGT ARqTISTIQUE\",\r\n      \"ESNEIGT ARTISTIQUE\",\r\n      \"eiseigomn artistique\",\r\n      \"enseigmt artistique\",\r\n      \"enseigmt artistique 5e\",\r\n      \"enseigmt artistiue\",\r\n      \"enseigmta rtistique\",\r\n      \"enseigmtartistique\",\r\n      \"jNSEIGMT ARTISITgUE\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"enseignscientifique\",\r\n    \"pretty\": \"Enseignement Scientifique\",\r\n    \"emoji\": \"🔬\",\r\n    \"formats\": [\r\n      \"Ensceignemenw scientisique\",\r\n      \"Enseign Scientifique\",\r\n      \"Enseignemcent scientifique\",\r\n      \"Enseignemen kscientifique\",\r\n      \"Enseignement Scientifique\",\r\n      \"Enseignement scienktifique\",\r\n      \"Enseignement scientifique\",\r\n      \"Enseignement scintfiique\",\r\n      \"Enseignement scxenticique\",\r\n      \"Enseignement sidentifique\",\r\n      \"Enseignementbscentirique\",\r\n      \"Enseignementscientifique\",\r\n      \"Enseilgneent scientifique\",\r\n      \"Enseinement scientifique\",\r\n      \"ejsdignement scintifique\",\r\n      \"enesignscientifique\",\r\n      \"eniegfn scientifique\",\r\n      \"ensaignehent scietifique\",\r\n      \"enseign scientifique bac pro\",\r\n      \"enseign scientifique cap\",\r\n      \"enseign scientifirfe\",\r\n      \"enseign scientifqiue\",\r\n      \"enseign scijentifique\",\r\n      \"enseign scinetifique\",\r\n      \"enseign sctentifimue\",\r\n      \"enseign sucivntifiquz\",\r\n      \"enseigneen tscientifique\",\r\n      \"enseignement csietifique\",\r\n      \"enseignement gscientifique\",\r\n      \"enseignement scientifique (option)\",\r\n      \"enseignement scientifique 5e\",\r\n      \"enseignement scientifique bac pro\",\r\n      \"enseignement scinetifique\",\r\n      \"enseignementscientifiquqe\",\r\n      \"enseignemnetscientifique\",\r\n      \"enseignetmens scyentifique\",\r\n      \"enseignmeent scentifique\",\r\n      \"enseignmeent scientifique\",\r\n      \"enseignnement scientifique\",\r\n      \"enseignscientifique\",\r\n      \"enseigsq scientijique\",\r\n      \"enseingement scientifimque\",\r\n      \"ensiegnement scientifique\",\r\n      \"ensignement sciekntifique\",\r\n      \"enstignement scientifeque\",\r\n      \"ensuign screntifique\",\r\n      \"eoseign scientifiqie\",\r\n      \"epnseign ccientifeque\",\r\n      \"eseign scientsifique\",\r\n      \"jnseign scwientificue\",\r\n      \"nEseignement scentifique\",\r\n      \"neseignement scieniimique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ensreligcatholique\",\r\n    \"pretty\": \"Ens Relig Catholique\",\r\n    \"emoji\": \"✝️\",\r\n    \"formats\": [\r\n      \"EN.SRELIG.CATHOLIQUnE\",\r\n      \"ENS.RELIG.CATHOLIQUE\",\r\n      \"ENS.RELIG.CATHOLIQUE > salle 201\",\r\n      \"ENS.RELIG.CATHOLhIQE\",\r\n      \"ENS.RELIGC.ATHOLIQUE\",\r\n      \"ENS.RELIlG.CATHOLIQUE\",\r\n      \"ENShRELvG.CATHOLIQUE\",\r\n      \"ENx.RELIG.CAnHOLIQEU\",\r\n      \"NES.RELIG.CATHOLIQUE\",\r\n      \"en srelig catholiqune\",\r\n      \"ens relig catholhiqe\",\r\n      \"ens relig catholique\",\r\n      \"ens relig catholique salle 201\",\r\n      \"ens religc atholique\",\r\n      \"ens relilg catholique\",\r\n      \"enshrelvg catholique\",\r\n      \"ensreligcatholique\",\r\n      \"enx relig canholiqeu\",\r\n      \"nes relig catholique\",\r\n      \"qNS.RELIG.CATOLIQlE\",\r\n      \"qns relig catoliqle\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ensreligisraelite\",\r\n    \"pretty\": \"Ens Relig Israelite\",\r\n    \"emoji\": \"✡️\",\r\n    \"formats\": [\r\n      \"ENS.ELIG.ISRAELIjTE\",\r\n      \"ENS.RELI.GISRAEeqTE\",\r\n      \"ENS.RELIG.IRSAELITE\",\r\n      \"ENS.RELIG.ISRAELITE\",\r\n      \"ENS.RELIG.ISRAELITE bac pro\",\r\n      \"ENS.RELIG.IjRALIgE\",\r\n      \"ENS.RELIk.ISRALITw\",\r\n      \"ENS.RcELIG.ISRELITE\",\r\n      \"ENS.RjLhIG.ISRAELITE\",\r\n      \"EvNS.RELIG.ISRAELITE\",\r\n      \"ens elig israelijte\",\r\n      \"ens rcelig isrelite\",\r\n      \"ens reli gisraeeqte\",\r\n      \"ens relig ijralige\",\r\n      \"ens relig irsaelite\",\r\n      \"ens relig israelite\",\r\n      \"ens relig israelite bac pro\",\r\n      \"ens relik isralitw\",\r\n      \"ens rjlhig israelite\",\r\n      \"ensreligisraelite\",\r\n      \"evns relig israelite\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ensreligprotestant\",\r\n    \"pretty\": \"Ens Relig Protestant\",\r\n    \"emoji\": \"⛪\",\r\n    \"formats\": [\r\n      \"EN.RELIG.PnOTESTxNT\",\r\n      \"ENS.RELIG.PORTESTANT\",\r\n      \"ENS.RELIG.PROTESTANT\",\r\n      \"ENS.RELIG.PROTESTANT > salle 201\",\r\n      \"ENS.RELIG.PROTESnTAN\",\r\n      \"ENS.RELIG.RPTESTANT\",\r\n      \"ENS.xELIG.PwRoTESTANT\",\r\n      \"ENSR.ELIG.PROTESTANT\",\r\n      \"Ens.Relig.Protestant\",\r\n      \"dENS.RELIG.PROTESTANT\",\r\n      \"dens relig protestant\",\r\n      \"eENS.RELIG.PROTESATNT\",\r\n      \"eens relig protesatnt\",\r\n      \"en relig pnotestxnt\",\r\n      \"ens relig portestant\",\r\n      \"ens relig protesntan\",\r\n      \"ens relig protestant\",\r\n      \"ens relig protestant salle 201\",\r\n      \"ens relig rptestant\",\r\n      \"ens xelig pwrotestant\",\r\n      \"ensr elig protestant\",\r\n      \"ensreligprotestant\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"epscomplement\",\r\n    \"pretty\": \"EPS Complement\",\r\n    \"emoji\": \"🏃‍♂️\",\r\n    \"formats\": [\r\n      \"EPS COMPELMENT\",\r\n      \"EPS COMPLEMENT\",\r\n      \"EPS COMPLEMENTy\",\r\n      \"EPS CeMPtEMENT\",\r\n      \"EPS vOpLEMENT\",\r\n      \"EPSCOMPLEMENT\",\r\n      \"EmS wCOMPLErENT\",\r\n      \"Eps Complement\",\r\n      \"eps combplemnt\",\r\n      \"eps complement special\",\r\n      \"eps complment\",\r\n      \"epscomplement\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"epsdetermination\",\r\n    \"pretty\": \"EPS Determination\",\r\n    \"emoji\": \"🤾\",\r\n    \"formats\": [\r\n      \"EPS DETERINATION\",\r\n      \"EPS DETERIkNATION\",\r\n      \"EPS DETERMINATION 6e\",\r\n      \"EPS DETERMINATION Tle\",\r\n      \"EPS DETiERIMNATION\",\r\n      \"EPS EDTERMINATION\",\r\n      \"EPSDETERMINATION\",\r\n      \"EPbpDETERMINATION\",\r\n      \"Eps Determination\",\r\n      \"eps detezrminatino\",\r\n      \"epsdetermination\",\r\n      \"epskpetermination\",\r\n      \"pes deterination\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"epspleinair\",\r\n    \"pretty\": \"E P S Plein Air\",\r\n    \"emoji\": \"🌲\",\r\n    \"formats\": [\r\n      \".EP.SpjPLEIN AIR\",\r\n      \"E.P.. PLEIN AIR\",\r\n      \"E.P.S. PLEI AIR\",\r\n      \"E.P.S. PLEIN AIR\",\r\n      \"E.P.S. PLEIN AIR 4e\",\r\n      \"E.P.S. PLEIN AIR > salle 201\",\r\n      \"E.P.S.PLEINAIR\",\r\n      \"E.P.Ss. PLEIN AIR\",\r\n      \"E.P.c .PLEIN wIR\",\r\n      \"E.P.t. PLfEIN AIR\",\r\n      \"EP..vS. PLEIN AIR\",\r\n      \"EPc.S.mPLEIN AIR\",\r\n      \"e p c plein wir\",\r\n      \"e p plein air\",\r\n      \"e p s plei air\",\r\n      \"e p s plein air\",\r\n      \"e p s plein air 4e\",\r\n      \"e p s plein air salle 201\",\r\n      \"e p s pleinair\",\r\n      \"e p ss plein air\",\r\n      \"e p t plfein air\",\r\n      \"ep spjplein air\",\r\n      \"ep vs plein air\",\r\n      \"epc s mplein air\",\r\n      \"epspleinair\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"espagnol\",\r\n    \"pretty\": \"Espagnol LV2\",\r\n    \"emoji\": \"🇪🇸\",\r\n    \"formats\": [\r\n      \"ESAGNOL L2V\",\r\n      \"ESPAGNL LV1\",\r\n      \"ESPAGNLO LV1\",\r\n      \"ESPAGNOL L2V\",\r\n      \"ESPAGNOL LV1\",\r\n      \"ESPAGNOL LV1 (option)\",\r\n      \"ESPAGNOL LV1 LP\",\r\n      \"ESPAGNOL LV2 3e\",\r\n      \"ESPAGNOL LV2 > salle 201\",\r\n      \"ESPAGNOL LV3\",\r\n      \"ESPAGNOL LV3 1ere\",\r\n      \"ESPAGNOL LV3 CAP\",\r\n      \"ESPAGNOL LVB\",\r\n      \"ESPAGNOL LV B\",\r\n      \"ESPAGNOLL V3\",\r\n      \"ESPAGNOLLV2\",\r\n      \"ESPAGNOLLV3\",\r\n      \"ESPAGNOLdVL3\",\r\n      \"ESPAGNOjL LV3\",\r\n      \"ESPANsOy LV2\",\r\n      \"ESPAoGNOL LV1\",\r\n      \"ESPGNOmL LV1\",\r\n      \"EScnAnNOL LV3\",\r\n      \"ESqAGnyOL LV2\",\r\n      \"EStAGzOL LV2\",\r\n      \"Espagnol Lv2\",\r\n      \"dspragnolplv1\",\r\n      \"enpagnol lj3\",\r\n      \"epsagnol lhv3\",\r\n      \"esSPqGNOL LV1\",\r\n      \"escnannol\",\r\n      \"espagdol la3\",\r\n      \"espagnl\",\r\n      \"espagnlo\",\r\n      \"espagnojl\",\r\n      \"espagnol\",\r\n      \"espagnol 1ere\",\r\n      \"espagnol 3e\",\r\n      \"espagnol cap\",\r\n      \"espagnol lev1\",\r\n      \"espagnol llv2\",\r\n      \"espagnol lp\",\r\n      \"espagnol salle 201\",\r\n      \"espagnol vy3\",\r\n      \"espagnollv1\",\r\n      \"espansoy\",\r\n      \"espaognol\",\r\n      \"espgnoml\",\r\n      \"esqagnyol\",\r\n      \"esspqgnol\",\r\n      \"estagzol\",\r\n      \"mESPAGOL LV2\",\r\n      \"mespagol\",\r\n      \"stPAGNOL LV1\",\r\n      \"stpagnol\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"espagnollvrenforce\",\r\n    \"pretty\": \"Espagnol Lv Renforce\",\r\n    \"emoji\": \"🌞\",\r\n    \"formats\": [\r\n      \"ESPAGNOL LV RENFORCE 1ere\",\r\n      \"ESPAGNOL LV RENFORCE LP\",\r\n      \"ESPAGNOL LV RENFRCE\",\r\n      \"ESPAGNOL yLVRENFORCE\",\r\n      \"ESPAGONL LV RENFORCE\",\r\n      \"Espagnol Lv Renforce\",\r\n      \"espagnol l nenfcrce\",\r\n      \"espagnol l vrenforce\",\r\n      \"espagnol lv renforpce\",\r\n      \"espagnol lv resnforce\",\r\n      \"espagnollvrenforce\",\r\n      \"espagnpol lv renforce\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"etudesdirigencadr\",\r\n    \"pretty\": \"Etudes Dirig Encadr\",\r\n    \"emoji\": \"📖\",\r\n    \"formats\": [\r\n      \"ETUDES DIRIG. ENADR\",\r\n      \"ETUDES DIRIG. ENCADR - groupe A\",\r\n      \"ETUDES DIRIG. ENCADR 5e\",\r\n      \"ETUDES DIRIG. ENxCADR\",\r\n      \"ETUDES DIRIG. NECADR\",\r\n      \"ETUDES DIlRIG. ENCADR\",\r\n      \"ETUDESDIRIG. ENCADR\",\r\n      \"ETUDESDIRIG.ENCADR\",\r\n      \"ETUDEwS DIRIG. ENCADR\",\r\n      \"Etudes Dirig. Encadr\",\r\n      \"bETUDES DIRIG. ENADR\",\r\n      \"betudes dirig enadr\",\r\n      \"etudes dilrig encadr\",\r\n      \"etudes dirig enadr\",\r\n      \"etudes dirig encadr\",\r\n      \"etudes dirig encadr 5e\",\r\n      \"etudes dirig encadr groupe a\",\r\n      \"etudes dirig enxcadr\",\r\n      \"etudes dirig necadr\",\r\n      \"etudesdirig encadr\",\r\n      \"etudesdirigencadr\",\r\n      \"etudews dirig encadr\",\r\n      \"nTUDES DIRIG. gNCADR\",\r\n      \"ntudes dirig gncadr\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"expressioncom\",\r\n    \"pretty\": \"Expression & Communication\",\r\n    \"emoji\": \"💬\",\r\n    \"formats\": [\r\n      \"EXPRESSION COM\",\r\n      \"Eperssion & communication\",\r\n      \"Experssion & communication\",\r\n      \"Expreesion & commumication\",\r\n      \"Exprelsion & cotmunication\",\r\n      \"Expresniyn & communicationb\",\r\n      \"Expressiokn & communication\",\r\n      \"Expression & communicagwon\",\r\n      \"Expression & communication\",\r\n      \"Expression & communication (AP)\",\r\n      \"Expression & communication 4e\",\r\n      \"Expression & communicaztion\",\r\n      \"Expression & communsication\",\r\n      \"Expression & cxmmunicatron\",\r\n      \"Expression & lcommunicytaon\",\r\n      \"Expression & lommunication\",\r\n      \"Expression &jcommnuicatiwn\",\r\n      \"Expression&communication\",\r\n      \"eperssion communication\",\r\n      \"exdpressiot fom\",\r\n      \"experssion communication\",\r\n      \"expessihon com\",\r\n      \"explessiyn cmo\",\r\n      \"expnregsior com\",\r\n      \"expreesion commumication\",\r\n      \"exprelsion cotmunication\",\r\n      \"expresizon com\",\r\n      \"expresniyn communicationb\",\r\n      \"expressicon com\",\r\n      \"expressiokn communication\",\r\n      \"expression com bac pro\",\r\n      \"expression com cap\",\r\n      \"expression communicagwon\",\r\n      \"expression communication\",\r\n      \"expression communication 4e\",\r\n      \"expression communicaztion\",\r\n      \"expression communsication\",\r\n      \"expression cxmmunicatron\",\r\n      \"expression jcommnuicatiwn\",\r\n      \"expression lcommunicytaon\",\r\n      \"expression lommunication\",\r\n      \"expressioncom\",\r\n      \"expresson com\",\r\n      \"expreszsio ncom\",\r\n      \"exprssion com\",\r\n      \"exressionc om\",\r\n      \"exressmion com\",\r\n      \"exwrssionjcom\",\r\n      \"xepression qom\",\r\n      \"xpression & compupication\",\r\n      \"xpression com\",\r\n      \"xpression compupication\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"expressionfrancaise\",\r\n    \"pretty\": \"Expression Francaise\",\r\n    \"emoji\": \"📝\",\r\n    \"formats\": [\r\n      \"EXPRESSION FRANCAISE special\",\r\n      \"EXPRSESION FRANCAISE\",\r\n      \"EXoRESoSION FRANCAaSE\",\r\n      \"Expression Francaise\",\r\n      \"XRPESSION FRANCAISE\",\r\n      \"excreysion francaie\",\r\n      \"expressio francaiseh\",\r\n      \"expressio franmaish\",\r\n      \"expression francaise 3e\",\r\n      \"expression rfancaise\",\r\n      \"expressionfrancaise\",\r\n      \"expressoin francaise\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"football\",\r\n    \"pretty\": \"Football\",\r\n    \"emoji\": \"⚽\",\r\n    \"formats\": [\r\n      \"FOOBTALL\",\r\n      \"FOOTBALL\",\r\n      \"FOOTBALL - groupe A\",\r\n      \"FOOkTBALL\",\r\n      \"FOoTnBAeL\",\r\n      \"footbaill\",\r\n      \"football\",\r\n      \"football groupe a\",\r\n      \"footballb\",\r\n      \"fotball\",\r\n      \"fqqotbalh\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"francais\",\r\n    \"pretty\": \"Français\",\r\n    \"emoji\": \"📚\",\r\n    \"formats\": [\r\n      \"FRANÇAIS\",\r\n      \"Fançajs\",\r\n      \"Fkakçais\",\r\n      \"Fkrnçdis\",\r\n      \"Frabnçfib\",\r\n      \"Fracçaisw\",\r\n      \"Françai\",\r\n      \"Français\",\r\n      \"Français (option)\",\r\n      \"Françasi\",\r\n      \"Fravnçais\",\r\n      \"Fraçdaig\",\r\n      \"Frnçais\",\r\n      \"aorancaxs\",\r\n      \"arancaps\",\r\n      \"fancais\",\r\n      \"fancajs\",\r\n      \"fançais\",\r\n      \"fardncais\",\r\n      \"fardnçais\",\r\n      \"fgancvis\",\r\n      \"fgançvis\",\r\n      \"fkakcais\",\r\n      \"fkrncdis\",\r\n      \"foranais\",\r\n      \"fqrancais\",\r\n      \"frabncfib\",\r\n      \"fraccaisw\",\r\n      \"fracdaig\",\r\n      \"fraclair\",\r\n      \"fracnais\",\r\n      \"franacis\",\r\n      \"franaçis\",\r\n      \"francai\",\r\n      \"francais\",\r\n      \"francais 1ere\",\r\n      \"francais bts\",\r\n      \"francais cap\",\r\n      \"francaizs\",\r\n      \"francasi\",\r\n      \"francias\",\r\n      \"francis\",\r\n      \"français 1ere\",\r\n      \"français BTS\",\r\n      \"françaizs\",\r\n      \"fravncais\",\r\n      \"fraxcis\",\r\n      \"fraxçis\",\r\n      \"fraçlair\",\r\n      \"frncais\",\r\n      \"frnnacais\",\r\n      \"froncais\",\r\n      \"fronçais\",\r\n      \"frrnjcais\",\r\n      \"frrnjçais\",\r\n      \"frzncais\",\r\n      \"frznçais\",\r\n      \"fxarncais\",\r\n      \"fxarnçais\",\r\n      \"irancid\",\r\n      \"irançid\",\r\n      \"pFranças\",\r\n      \"pfrancas\",\r\n      \"rancaeis\",\r\n      \"rancais\",\r\n      \"rançaeis\",\r\n      \"rançais\",\r\n      \"rfancais\",\r\n      \"rgnfais\",\r\n      \"rnacais\",\r\n      \"rnaçais\",\r\n      \"tfrancais\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"francais_xml\",\r\n    \"pretty\": \"Francais\",\r\n    \"emoji\": \"📘\",\r\n    \"formats\": [\r\n      \"FANCAIS\",\r\n      \"FARmNCAIS\",\r\n      \"FRACNAI\",\r\n      \"FRANACISx\",\r\n      \"FRANCAIS\",\r\n      \"FRANCAIS - groupe A\",\r\n      \"RFANCAIS\",\r\n      \"fracais\",\r\n      \"francais\",\r\n      \"francais groupe a\",\r\n      \"francais_xml\",\r\n      \"frnacais\",\r\n      \"uancars\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"francaisletrniv1\",\r\n    \"pretty\": \"Francais L Etr Niv1\",\r\n    \"emoji\": \"🗣️\",\r\n    \"formats\": [\r\n      \"FRANAIS L ETc. NIVd\",\r\n      \"FRANCAI L ETR. NIV1\",\r\n      \"FRANCAI SL ETR. NIV1o\",\r\n      \"FRANCAIS  ETR. NIV1\",\r\n      \"FRANCAIS L ET. NIV1\",\r\n      \"FRANCAIS L ETR. NIV1\",\r\n      \"FRANCAIS L ETR. NIV1 special\",\r\n      \"FRANCAISLETR.NIV1\",\r\n      \"FRlNCoIS L ET.R NIV1\",\r\n      \"Francais L Etr. Niv1\",\r\n      \"RANCAIS oL ETR. NIV1\",\r\n      \"franais l etc nivd\",\r\n      \"francai l etr niv1\",\r\n      \"francai sl etr niv1o\",\r\n      \"francais etr niv1\",\r\n      \"francais l et niv1\",\r\n      \"francais l etr niv1\",\r\n      \"francais l etr niv1 special\",\r\n      \"francaisletr niv1\",\r\n      \"francaisletrniv1\",\r\n      \"frlncois l et r niv1\",\r\n      \"oRANCAIS L ETR. NIg1\",\r\n      \"orancais l etr nig1\",\r\n      \"rancais ol etr niv1\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"francaisletrniv2\",\r\n    \"pretty\": \"Francais L Etr Niv2\",\r\n    \"emoji\": \"📖\",\r\n    \"formats\": [\r\n      \"FRANCAI SL ETR.NIV2\",\r\n      \"FRANCAIS L ET.RNbIV2\",\r\n      \"FRANCAIS L ETR.NIV2 4e\",\r\n      \"FRANCAIS L ETR.NIV2 bac pro\",\r\n      \"FRANCAIS L ETR.NVI2\",\r\n      \"FRANCAIS n ETR.oIV2\",\r\n      \"FRANCAISL TER.NIV2\",\r\n      \"FRANCAISLETR.NIV2\",\r\n      \"FRANCAIjS L ETR.NIV2\",\r\n      \"FRANCIS L ETR.NzIV2\",\r\n      \"Francais L Etr.Niv2\",\r\n      \"FyANCAIS LE TR.NIV2\",\r\n      \"francai sl etr niv2\",\r\n      \"francaijs l etr niv2\",\r\n      \"francais l et rnbiv2\",\r\n      \"francais l etr niv2\",\r\n      \"francais l etr niv2 4e\",\r\n      \"francais l etr niv2 bac pro\",\r\n      \"francais l etr nvi2\",\r\n      \"francais n etr oiv2\",\r\n      \"francaisl ter niv2\",\r\n      \"francaisletr niv2\",\r\n      \"francaisletrniv2\",\r\n      \"francis l etr nziv2\",\r\n      \"fyancais le tr niv2\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"francaisletrniv3\",\r\n    \"pretty\": \"Francais L Etr Niv3\",\r\n    \"emoji\": \"📕\",\r\n    \"formats\": [\r\n      \"FRANCAIS L ETR. NIV3\",\r\n      \"FRANCAIS L ETR. NIV3 > salle 201\",\r\n      \"FRANCAIS L ETR.p NIV\",\r\n      \"FRANCAIS L ETdR.NIV3\",\r\n      \"FRANCAIS LwETR. NdV3\",\r\n      \"FRANCAISLETR.NIV3\",\r\n      \"FRAgNCAIS L ETR. NIV3\",\r\n      \"FRxANCAIS L ETR. NIV3\",\r\n      \"RAatAIS L ETR. NIV3\",\r\n      \"fcancais l etrk nivv3\",\r\n      \"fragncais l etr niv3\",\r\n      \"francais l etdr niv3\",\r\n      \"francais l etr niv3\",\r\n      \"francais l etr niv3 salle 201\",\r\n      \"francais l etr p niv\",\r\n      \"francais lwetr ndv3\",\r\n      \"francaisletr niv3\",\r\n      \"francaisletrniv3\",\r\n      \"francasi l exrt niv3\",\r\n      \"frxancais l etr niv3\",\r\n      \"raatais l etr niv3\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"francaislitterature\",\r\n    \"pretty\": \"Francais Litterature\",\r\n    \"emoji\": \"📜\",\r\n    \"formats\": [\r\n      \"FRANCAIS LITTERATURE\",\r\n      \"FRANCAIS LITTERATURE (TP)\",\r\n      \"FRANCAIS LITTExRATURE\",\r\n      \"FRANCAISLITTERATURE\",\r\n      \"FRANCAISkLITTERATrRE\",\r\n      \"FRANuAIS lTTERATURE\",\r\n      \"farncais litterature\",\r\n      \"feancais tittreature\",\r\n      \"francaislitterature\",\r\n      \"francmais litterature\",\r\n      \"francsis limteratur\",\r\n      \"franhaij litterature\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"francaismodule\",\r\n    \"pretty\": \"Francais Module\",\r\n    \"emoji\": \"📘\",\r\n    \"formats\": [\r\n      \"FRACASI MODULE\",\r\n      \"FRANCAIS MODULE\",\r\n      \"FRANCAIS MODULE 2nde\",\r\n      \"FRANCAISMODULE\",\r\n      \"bfrancais module\",\r\n      \"cours de francais module\",\r\n      \"francacsumodule\",\r\n      \"francaism odue\",\r\n      \"francaismodule\",\r\n      \"francias module\",\r\n      \"fzancaisdmodule\",\r\n      \"ranccais module\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gescomanagforcev\",\r\n    \"pretty\": \"Ges Co Manag Force V\",\r\n    \"emoji\": \"📈\",\r\n    \"formats\": [\r\n      \"ES.CO-MANeAG.FORCE V\",\r\n      \"GES.CO MANAG.FORCE V\",\r\n      \"GES.CO-AMNAG.FORCE V\",\r\n      \"GES.CO-MAAG.FORCE V\",\r\n      \"GES.CO-MANAG.FORCE V 6e\",\r\n      \"GES.CO-MANAG.FORCE V bac pro\",\r\n      \"GES.CO-MANAG.FORCEV\",\r\n      \"GES.CO-MANAG.FORCEVq\",\r\n      \"GES.CO-MANAG.ORCE V\",\r\n      \"GES.CO-gMANAG.FORCE V\",\r\n      \"GES.bO-MANAG.FOmCE V\",\r\n      \"GESrCO-MANAG.lROCE V\",\r\n      \"Ges.Co-Manag.Force V\",\r\n      \"es co maneag force v\",\r\n      \"ges bo manag fomce v\",\r\n      \"ges co amnag force v\",\r\n      \"ges co gmanag force v\",\r\n      \"ges co maag force v\",\r\n      \"ges co manag force v\",\r\n      \"ges co manag force v 6e\",\r\n      \"ges co manag force v bac pro\",\r\n      \"ges co manag forcev\",\r\n      \"ges co manag forcevq\",\r\n      \"ges co manag orce v\",\r\n      \"gescomanagforcev\",\r\n      \"gesrco manag lroce v\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestactivitadminis\",\r\n    \"pretty\": \"Gest Activit Adminis\",\r\n    \"emoji\": \"🗂️\",\r\n    \"formats\": [\r\n      \"EST.ACzTIVIT.ADMINIS\",\r\n      \"GEST.ACTIVIT.ADINIS\",\r\n      \"GEST.ACTIVIT.ADMINIS 2nde\",\r\n      \"GEST.ACTIVIT.ADMINIS LV1\",\r\n      \"GEST.ACTIVIT.ADMINSIc\",\r\n      \"GEST.ACTIVIT.qADMINIS\",\r\n      \"GEST.ACTIVTI.ADMINIS\",\r\n      \"GEST.rCTIVIT.cDMINS\",\r\n      \"GET.ACTIVIT.ADMIlNIS\",\r\n      \"Gest.Activit.Adminis\",\r\n      \"est acztivit adminis\",\r\n      \"gest activit adinis\",\r\n      \"gest activit adminis\",\r\n      \"gest activit adminis 2nde\",\r\n      \"gest activit adminsic\",\r\n      \"gest activit qadminis\",\r\n      \"gest activti adminis\",\r\n      \"gest rctivit cdmins\",\r\n      \"gestactivitadminis\",\r\n      \"get activit admilnis\",\r\n      \"kEST.ACTIVIT.ADMINbS\",\r\n      \"kest activit adminbs\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestampinformatique\",\r\n    \"pretty\": \"Gest &amp Informatique\",\r\n    \"emoji\": \"💻\",\r\n    \"formats\": [\r\n      \"GEST. &amp INFORMATIQUE\",\r\n      \"GEST. &amp; INFORMATIQU\",\r\n      \"GEST. &amp; INFORMATIQUE\",\r\n      \"GEST. &amp; INFORMATIQUE (AP)\",\r\n      \"GEST. &amp; INFORMATIQUE 6e\",\r\n      \"GEST. &amp; INFORMATlIQUE\",\r\n      \"GEST. &ap; INFhORMATIQUE\",\r\n      \"GEST. &map; INFORMAqIQyE\",\r\n      \"GEST. qamp; INFORqATIQUE\",\r\n      \"GEST.&amp;INFORMATIQUE\",\r\n      \"GESTm. &map; INFORMATIQUE\",\r\n      \"GESsT. &amp; INFORMATIQUE\",\r\n      \"gesst amp informatique\",\r\n      \"gest amp informatiqu\",\r\n      \"gest amp informatique\",\r\n      \"gest amp informatique 6e\",\r\n      \"gest amp informatlique\",\r\n      \"gest ap infhormatique\",\r\n      \"gest map informaqiqye\",\r\n      \"gest qamp inforqatique\",\r\n      \"gestampinformatique\",\r\n      \"gestm map informatique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestampvieentrepris\",\r\n    \"pretty\": \"Gest &amp Vie Entrepris\",\r\n    \"emoji\": \"🏢\",\r\n    \"formats\": [\r\n      \"EST.&amp; VEI ENTREPRIS\",\r\n      \"GES.T&amp; VIuE ENTREPRIS\",\r\n      \"GEST.&am; VIE ENTREPRIS\",\r\n      \"GEST.&amp; VIE ENREPRIS\",\r\n      \"GEST.&amp; VIE ENTREPRIS\",\r\n      \"GEST.&amp; VIE ENTREPRIS (option)\",\r\n      \"GEST.&amp; VIE ENTRPERIS\",\r\n      \"GEST.&amp; VIE yENTREPRIS\",\r\n      \"GEST.&amp; VIEENTREPRIi\",\r\n      \"GEST.&amp;VIEENTREPRIS\",\r\n      \"est amp vei entrepris\",\r\n      \"ges t amp viue entrepris\",\r\n      \"gest am vie entrepris\",\r\n      \"gest amp vie enrepris\",\r\n      \"gest amp vie entrepris\",\r\n      \"gest amp vie entrperis\",\r\n      \"gest amp vie yentrepris\",\r\n      \"gest amp vieentreprii\",\r\n      \"gest amp vieentrepris\",\r\n      \"gestampvieentrepris\",\r\n      \"iGEST.&amp; VIE ENTREPRIS\",\r\n      \"igest amp vie entrepris\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestinformathmax\",\r\n    \"pretty\": \"Gest Informat H Max\",\r\n    \"emoji\": \"🖥️\",\r\n    \"formats\": [\r\n      \"GEST. INFORMAT.H.MAX\",\r\n      \"GEST.-INFORMAT..HMAX\",\r\n      \"GEST.-INFORMAT.H.AX\",\r\n      \"GEST.-INFORMAT.H.MAX\",\r\n      \"GEST.-INFORMAT.H.MAX LP\",\r\n      \"GEST.-INFORMAT.H.MAX special\",\r\n      \"GEST.-INFORMAT.HMAX\",\r\n      \"GEST.-INFORMAT.yH.MAX\",\r\n      \"GEST.-INFORMATH..MAX\",\r\n      \"GEST.INFORMAT.H.MAX\",\r\n      \"GESTl-INFORMAT.H.MAX\",\r\n      \"GErST.-INFORMA.H.MAX\",\r\n      \"gerst informa h max\",\r\n      \"gest informat h ax\",\r\n      \"gest informat h max\",\r\n      \"gest informat h max lp\",\r\n      \"gest informat h max special\",\r\n      \"gest informat hmax\",\r\n      \"gest informat yh max\",\r\n      \"gest informath max\",\r\n      \"gestinformathmax\",\r\n      \"gestl informat h max\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestion\",\r\n    \"pretty\": \"Gestion\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"GESITON\",\r\n      \"GESTION\",\r\n      \"GESTION LV2\",\r\n      \"egstio\",\r\n      \"gesinn\",\r\n      \"gestion\",\r\n      \"gestloin\",\r\n      \"getsion\",\r\n      \"gleston\",\r\n      \"gsetion\",\r\n      \"zgurtion\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestionadmproduc\",\r\n    \"pretty\": \"Gestion Adm Produc\",\r\n    \"emoji\": \"🗄️\",\r\n    \"formats\": [\r\n      \"GESION ADM.P RODUC.\",\r\n      \"GESTION ADM. PRODUC.\",\r\n      \"GESTION ADM. PRODUC. (TD)\",\r\n      \"GESTION ADM. PRODUi.\",\r\n      \"GESTION ADM. RODUC.\",\r\n      \"GESTION ADM.udRODUC.c\",\r\n      \"GESTIONADM.PRODUC.\",\r\n      \"GESTIqN ADM. ROcUC.\",\r\n      \"GEexION ADM.PRODUC.\",\r\n      \"GEhSTION ADM. PyODoC.\",\r\n      \"GSTION ADM. PRODUC.\",\r\n      \"Gestion Adm. Produc.\",\r\n      \"geexion adm produc\",\r\n      \"gehstion adm pyodoc\",\r\n      \"gesion adm p roduc\",\r\n      \"gestion adm produc\",\r\n      \"gestion adm produi\",\r\n      \"gestion adm roduc\",\r\n      \"gestion adm udroduc c\",\r\n      \"gestionadm produc\",\r\n      \"gestionadmproduc\",\r\n      \"gestiqn adm rocuc\",\r\n      \"gstion adm produc\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestionamplegislat\",\r\n    \"pretty\": \"Gestion &amp Legislat\",\r\n    \"emoji\": \"⚖️\",\r\n    \"formats\": [\r\n      \"GESTINO &amp; LEGISLATh\",\r\n      \"GESTION &ambp; LEGISLAT.\",\r\n      \"GESTION &amp; LEGISLA.T\",\r\n      \"GESTION &amp; LEGISLAT.\",\r\n      \"GESTION &amp; LEGISLAT. (AP)\",\r\n      \"GESTION &amp;x LEGISLAT.\",\r\n      \"GESTION &vmp; LEGISoAT.\",\r\n      \"GESTION&amp;LEGISLAT.\",\r\n      \"GESTIONzr&ampw LEGISLAT.\",\r\n      \"GESTIOuN &amp; LEGSLAT.\",\r\n      \"GESTOIN &amp; LEdISqAT.\",\r\n      \"gestino amp legislath\",\r\n      \"gestion ambp legislat\",\r\n      \"gestion amp legisla t\",\r\n      \"gestion amp legislat\",\r\n      \"gestion amp x legislat\",\r\n      \"gestion vmp legisoat\",\r\n      \"gestionamplegislat\",\r\n      \"gestionzr ampw legislat\",\r\n      \"gestioun amp legslat\",\r\n      \"gestoin amp ledisqat\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestiondeprojet\",\r\n    \"pretty\": \"Gestion De Projet\",\r\n    \"emoji\": \"📋\",\r\n    \"formats\": [\r\n      \"Gestion De Projet\",\r\n      \"Gestion de projet (AP)\",\r\n      \"Gestoin de projet\",\r\n      \"Getsion de projet\",\r\n      \"Gkestion de proejt\",\r\n      \"gdestion de prjoet\",\r\n      \"gefsion de projgt\",\r\n      \"gescvionzde projet\",\r\n      \"gesion de projet\",\r\n      \"gestaon de pjojaet\",\r\n      \"gestioi dehprjet\",\r\n      \"gestion cb projet\",\r\n      \"gestion d eprojet\",\r\n      \"gestion de projet 1ere\",\r\n      \"gestion de projet 3e\",\r\n      \"gestion de projet Tle\",\r\n      \"gestion de projeut\",\r\n      \"gestion de projeyt\",\r\n      \"gestion de projte\",\r\n      \"gestion de proxjt\",\r\n      \"gestion de pzoiet\",\r\n      \"gestion def projet\",\r\n      \"gestion dep rojet\",\r\n      \"gestion tde projet\",\r\n      \"gestion vde projet\",\r\n      \"gestionde projet\",\r\n      \"gestiondeprojet\",\r\n      \"gestionq de prbjpt\",\r\n      \"gestoin de proet\",\r\n      \"gestoin de prqojet\",\r\n      \"gwstion ds probjet\",\r\n      \"xestioa de proujet\",\r\n      \"zesdion de projet\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestionentreprise\",\r\n    \"pretty\": \"Gestion Entreprise\",\r\n    \"emoji\": \"🏦\",\r\n    \"formats\": [\r\n      \"GESTION ENTREPRISE (TD)\",\r\n      \"GESTIONENTREPRISE\",\r\n      \"GcESTION ENTREPRISE\",\r\n      \"GxSTIOj ENTREPRISE\",\r\n      \"gestion efteprisl\",\r\n      \"gestion entrepris\",\r\n      \"gestion entreprise\",\r\n      \"gestion entreprise 2nde\",\r\n      \"gestion entryepeisi\",\r\n      \"gestionentrekprise\",\r\n      \"gestionentreprise\",\r\n      \"gestiotn entreprise\",\r\n      \"gwstaon jentreprise\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestionhoteliere\",\r\n    \"pretty\": \"Gestion Hoteliere\",\r\n    \"emoji\": \"🏨\",\r\n    \"formats\": [\r\n      \"GESITON HOELIERE\",\r\n      \"GESTINO HOTELIERE\",\r\n      \"GESTION HOTEIREE\",\r\n      \"GESTION HOTELIERE\",\r\n      \"GESTION HOTELIERE 6e\",\r\n      \"GESTION HOTEmLIERE\",\r\n      \"GESTION HyOTELIERE\",\r\n      \"gesion hoteliere\",\r\n      \"gestion hoteeieye\",\r\n      \"gestion hoteliere 1ere\",\r\n      \"gestion ohteliere\",\r\n      \"gestionhoteliere\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"grecancien\",\r\n    \"pretty\": \"Grec Ancien\",\r\n    \"emoji\": \"🏛️\",\r\n    \"formats\": [\r\n      \"GREC ANCEN\",\r\n      \"GREC ANCIE\",\r\n      \"GREC ANCIEN\",\r\n      \"GRECANCIEN\",\r\n      \"GRECx NCuEN\",\r\n      \"GRjEC ANIEN\",\r\n      \"Grec Ancien\",\r\n      \"grchc ancien\",\r\n      \"grec ancien 1ere\",\r\n      \"grecancien\",\r\n      \"kgrecvancisn\",\r\n      \"rge ancien\",\r\n      \"znfec ancien\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"grecmoderne\",\r\n    \"pretty\": \"Grec Moderne LV3\",\r\n    \"emoji\": \"🇬🇷\",\r\n    \"formats\": [\r\n      \"GREC MODENRE LV3\",\r\n      \"GREC MODERNE LV3\",\r\n      \"GREC MODERNE LV3 - groupe A\",\r\n      \"GREC MODERNuE LV3\",\r\n      \"GREC ODERNE LV3\",\r\n      \"GREC ODERNE VL3\",\r\n      \"GRECMODERNELV3\",\r\n      \"GaREC MODENRE LV3\",\r\n      \"Grec Moderne Lv3\",\r\n      \"garec modenre\",\r\n      \"grec modenre\",\r\n      \"grec moderen flv3\",\r\n      \"grec moderne\",\r\n      \"grec moderne groupe a\",\r\n      \"grec modernelv3\",\r\n      \"grec modernr elv3\",\r\n      \"grec modernue\",\r\n      \"grec oderne\",\r\n      \"grecmoderne\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gymnastique\",\r\n    \"pretty\": \"Gymnastique\",\r\n    \"emoji\": \"🤸\",\r\n    \"formats\": [\r\n      \"GYMNASTIQUE\",\r\n      \"GYMNASTIQUE LV1\",\r\n      \"GYMNATSIQUE\",\r\n      \"GYMNSATIQUE\",\r\n      \"GYNMASTIQUE\",\r\n      \"glmnassqiue\",\r\n      \"gomnastqiuc\",\r\n      \"gymnasitque\",\r\n      \"gymnastijuqe\",\r\n      \"gymnastique\",\r\n      \"wYMNASTfQUE\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"handball\",\r\n    \"pretty\": \"Handball\",\r\n    \"emoji\": \"🤾‍♂️\",\r\n    \"formats\": [\r\n      \"HADBALL\",\r\n      \"HANDBAL\",\r\n      \"HANDBALL (TP)\",\r\n      \"HANDBALL CAP\",\r\n      \"HANrBALv\",\r\n      \"hanblal\",\r\n      \"handball\",\r\n      \"handblayl\",\r\n      \"handbnall\",\r\n      \"hjndbxjll\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"hebreu\",\r\n    \"pretty\": \"Hebreu\",\r\n    \"emoji\": \"🇮🇱\",\r\n    \"formats\": [\r\n      \"HBREU\",\r\n      \"HEBEU\",\r\n      \"HEBREU\",\r\n      \"HEBREU 4e\",\r\n      \"HEBpEaU\",\r\n      \"bhebqeu\",\r\n      \"cours de HEBREU\",\r\n      \"ebrue\",\r\n      \"heberu\",\r\n      \"hebpreu\",\r\n      \"hebreu\",\r\n      \"nhbereu\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"histgeoeducciviq\",\r\n    \"pretty\": \"Hist Geo Educ Civiq\",\r\n    \"emoji\": \"🗺️\",\r\n    \"formats\": [\r\n      \"HIST.GEO.EDUC.CIIVQ.\",\r\n      \"HIST.GEO.EDUC.CIVIQ\",\r\n      \"HIST.GEO.EDUC.CIVIQ.\",\r\n      \"HIST.GEO.EDUC.CIVIQ. (option)\",\r\n      \"HIST.GEO.EDUC.CIVwIQ.\",\r\n      \"HIST.GuObEUC.CIVIQ.\",\r\n      \"HISTG.EO.EDUC.CIVIQ\",\r\n      \"HISTG.EO.EDUC.CIVIQ.\",\r\n      \"HISi.dEO.EDUC.CIIVQ.\",\r\n      \"IST.GEO.EDUCd.CIVIQ.\",\r\n      \"hisi deo educ ciivq\",\r\n      \"hist geo educ ciivq\",\r\n      \"hist geo educ civiq\",\r\n      \"hist geo educ civwiq\",\r\n      \"hist guobeuc civiq\",\r\n      \"histg eo educ civiq\",\r\n      \"histgeoeducciviq\",\r\n      \"ist geo educd civiq\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"histoire-geographie-emc\",\r\n    \"pretty\": \"Histoire-Géographie et EMC\",\r\n    \"emoji\": \"🌍\",\r\n    \"formats\": [\r\n      \"HISTOIRE-GEOGRAPHIE et EMC\",\r\n      \"Histoire-Géographie et EMC\",\r\n      \"Histoire Géographie et EMC\",\r\n      \"Histoire Géographie EMC\",\r\n      \"Histoire Géo EMC\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"histgeographmodule\",\r\n    \"pretty\": \"Hist Geograph Module\",\r\n    \"emoji\": \"🌍\",\r\n    \"formats\": [\r\n      \"HIST.GEOGRAPH.MODUL\",\r\n      \"HIST.GEOGRAPH.MODULE\",\r\n      \"HIST.GEOGRAPH.MODULE 4e\",\r\n      \"HIST.GEOGRAPH.MODULE > salle 201\",\r\n      \"HIST.GEOGRAPH.ODULdE\",\r\n      \"HIST.GEOGRmAPH.MODULE\",\r\n      \"HIST.GErOGRAPH.MODULE\",\r\n      \"HISTn.GEOGRPAH.MODULE\",\r\n      \"IST.GEOGRAPH.MODULE\",\r\n      \"ISTa.GEOGRAPH.MODULE\",\r\n      \"hist geograph modul\",\r\n      \"hist geograph module\",\r\n      \"hist geograph module 4e\",\r\n      \"hist geograph module salle 201\",\r\n      \"hist geograph odulde\",\r\n      \"hist geogrmaph module\",\r\n      \"hist gerograph module\",\r\n      \"histgeographmodule\",\r\n      \"histn geogrpah module\",\r\n      \"ist geograph module\",\r\n      \"ista geograph module\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"histgeolegisprof\",\r\n    \"pretty\": \"Hist Geo Legis Prof\",\r\n    \"emoji\": \"📜\",\r\n    \"formats\": [\r\n      \"HIST.GEO.LEGIS.PROF.\",\r\n      \"HIST.GEO.LEGIS.PROF. 1ere\",\r\n      \"HIST.GEO.LEGIS.PROF. bac pro\",\r\n      \"HIST.GEO.LEGIS.PRkOF.\",\r\n      \"HIST.GO.LEGIS.PROF.\",\r\n      \"HIST.GqEOL.EGIS.PROF.\",\r\n      \"HIST.uEO.LcGIS.PROF.\",\r\n      \"HISr.aEO.EGIS.PROF.\",\r\n      \"HIpST.GEO.LEGIS.PROF.\",\r\n      \"HIsT.GEO.LEIGS.bROF.\",\r\n      \"hipst geo legis prof\",\r\n      \"hisr aeo egis prof\",\r\n      \"hist geo legis prkof\",\r\n      \"hist geo legis prof\",\r\n      \"hist geo legis prof 1ere\",\r\n      \"hist geo legis prof bac pro\",\r\n      \"hist geo leigs brof\",\r\n      \"hist go legis prof\",\r\n      \"hist gqeol egis prof\",\r\n      \"hist ueo lcgis prof\",\r\n      \"histgeolegisprof\",\r\n      \"sHIST.GEO.LEGIS.POF.\",\r\n      \"shist geo legis pof\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"histoireampgeograph\",\r\n    \"pretty\": \"Histoire &amp Geograph\",\r\n    \"emoji\": \"📖\",\r\n    \"formats\": [\r\n      \"HISOTIRE &amp; GEOGRAPH.\",\r\n      \"HISTIRE &amp; GEOGRAPH.\",\r\n      \"HISTOIRE &AMP; GEOGRAPH.\",\r\n      \"HISTOIRE &amp; GEOGRAPH. 6e\",\r\n      \"HISTOIRE &ap; GEOGRAPH.w\",\r\n      \"HISTOIRE &mp; GEOGRAPH.\",\r\n      \"HISTOIRE damp; GEOvRAPH.\",\r\n      \"HISTOIRE&amp;GEOGRAPH.\",\r\n      \"HIoSTOIRE &amp; GEOGRAPH.\",\r\n      \"HIuTOwRE &am;p GEOGRAPH.\",\r\n      \"ISTOIRE &amp; GEOGRAPH.\",\r\n      \"cours de HISTOIRE &amp; GEOGRAPH.\",\r\n      \"cours de histoire amp geograph\",\r\n      \"hiostoire amp geograph\",\r\n      \"hisotire amp geograph\",\r\n      \"histire amp geograph\",\r\n      \"histoire amp geograph\",\r\n      \"histoire amp geograph 6e\",\r\n      \"histoire ap geograph w\",\r\n      \"histoire damp geovraph\",\r\n      \"histoire mp geograph\",\r\n      \"histoireampgeograph\",\r\n      \"hiutowre am p geograph\",\r\n      \"istoire amp geograph\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"histoiredesarts\",\r\n    \"pretty\": \"Histoire Des Arts\",\r\n    \"emoji\": \"🎨\",\r\n    \"formats\": [\r\n      \"HISOTwRE DyS ARTS\",\r\n      \"HISTOIRE DES ARTS\",\r\n      \"HISTOIRE DES ARTS (TP)\",\r\n      \"HISTOIRE DES RATS\",\r\n      \"HISaTOIRE DES ARTS\",\r\n      \"HSTOIRE DES ARTS\",\r\n      \"Histoire Des Arts\",\r\n      \"IHSTOIRE DvS AdTS\",\r\n      \"hicstoire desarts\",\r\n      \"hihstoire des arts\",\r\n      \"histoiredesarts\",\r\n      \"hiutoire des aits\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"histoiredesarts5h\",\r\n    \"pretty\": \"Histoire Des Arts 5h\",\r\n    \"emoji\": \"🖼️\",\r\n    \"formats\": [\r\n      \"HISTOIRE DE ARTS 5H\",\r\n      \"HISTOIRE DES ARTS 5H\",\r\n      \"HISTOIRE DES ARTS 5H (TP)\",\r\n      \"HISTOIRE DES ARTS H\",\r\n      \"Histoire Des Arts 5H\",\r\n      \"ISTOIREn DES ARTS 5H\",\r\n      \"dhistoire des ats\",\r\n      \"himtoire des avts\",\r\n      \"histoikre des arts\",\r\n      \"histoire des arts\",\r\n      \"histoire es xarts\",\r\n      \"histoiredesarts\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"histoiregeo\",\r\n    \"pretty\": \"Histoire-Géographie\",\r\n    \"emoji\": \"🌍\",\r\n    \"formats\": [\r\n      \"Histeirl-Géographie\",\r\n      \"Histoire Geo\",\r\n      \"Histoire Geograph\",\r\n      \"Histoire Géographie\",\r\n      \"Histoire-Geographie\",\r\n      \"Histoire-Gojpraphie\",\r\n      \"Histoire-Goégraphiae\",\r\n      \"Histoire-Gégographe\",\r\n      \"Histoire-Géogaphie\",\r\n      \"Histoire-Géograhpie\",\r\n      \"Histoire-Géographei\",\r\n      \"Histoire-Géographie\",\r\n      \"Histoire-Géographie LV1\",\r\n      \"Histoire-Géogronhie\",\r\n      \"Histoire-éographie\",\r\n      \"HistoireG-éographii\",\r\n      \"HistoireGqéobraphie\",\r\n      \"Histoirhe-Géographie\",\r\n      \"Hnstoire-Géopraphie\",\r\n      \"hcitoire geo\",\r\n      \"hietoirdgeographie\",\r\n      \"hilssoire geograph\",\r\n      \"hiptoire geojraphs\",\r\n      \"hiqtoirewgeogrph\",\r\n      \"hirtoire geouraphei\",\r\n      \"hisbtoire geo\",\r\n      \"hisooiresgeographie\",\r\n      \"histeirl geographie\",\r\n      \"histhiqe xgeo\",\r\n      \"histnoire geogaph\",\r\n      \"histoiare gegraphie\",\r\n      \"histoier geographi\",\r\n      \"histoiergeographie\",\r\n      \"histoir egeographie\",\r\n      \"histoir egeograpie\",\r\n      \"histoir geogrpah\",\r\n      \"histoire eo\",\r\n      \"histoire eographie\",\r\n      \"histoire gegographe\",\r\n      \"histoire geo BTS\",\r\n      \"histoire geo bac pro\",\r\n      \"histoire geogaphie\",\r\n      \"histoire geograhpie\",\r\n      \"histoire geograpaiu\",\r\n      \"histoire geograph LV1\",\r\n      \"histoire geograph tle\",\r\n      \"histoire geographe\",\r\n      \"histoire geographei\",\r\n      \"histoire geographie\",\r\n      \"histoire geographie (option)\",\r\n      \"histoire geographie 2nde\",\r\n      \"histoire geographie 5e\",\r\n      \"histoire geographie tle\",\r\n      \"histoire geogrept\",\r\n      \"histoire geogronhie\",\r\n      \"histoire geoigraphie\",\r\n      \"histoire georaphike\",\r\n      \"histoire goegraphiae\",\r\n      \"histoire gojpraphie\",\r\n      \"histoire-eographie\",\r\n      \"histoire-geograpaiu\",\r\n      \"histoire-geographe\",\r\n      \"histoire-geographie 5e\",\r\n      \"histoire-geographie Tle\",\r\n      \"histoire-geoigraphie\",\r\n      \"histoireg eographii\",\r\n      \"histoiregeo\",\r\n      \"histoiregeograph\",\r\n      \"histoiregeographie\",\r\n      \"histoiregqeobraphie\",\r\n      \"histoires geographe\",\r\n      \"histoires-geographe\",\r\n      \"histoirhe geographie\",\r\n      \"histoirie geographei\",\r\n      \"histoirse geographie\",\r\n      \"histoirse-geographie\",\r\n      \"histoirzegeographwe\",\r\n      \"histoirzgeograpbie\",\r\n      \"histore egographie\",\r\n      \"histore geo\",\r\n      \"histore geographie\",\r\n      \"histore geohgraphie\",\r\n      \"histore-egographie\",\r\n      \"histore-geohgraphie\",\r\n      \"historie geo\",\r\n      \"histoure gbograzph\",\r\n      \"histoxre geographiu\",\r\n      \"histtore geograph\",\r\n      \"histvire gogrbph\",\r\n      \"hitsoir geographie\",\r\n      \"hitsoir-geographie\",\r\n      \"hitsoire geo\",\r\n      \"hitsoire geograph\",\r\n      \"hiutoire geogrjph\",\r\n      \"hiwtoiret eo\",\r\n      \"hlstoier geogrnph\",\r\n      \"hnstoire geopraphie\",\r\n      \"hpstoire gyo\",\r\n      \"hsitoire geograph\",\r\n      \"hustoire geogarphie\",\r\n      \"hustoire-geogarphie\",\r\n      \"hustoireh geo\",\r\n      \"hystgoire jeo\",\r\n      \"iHstoire-Géographie\",\r\n      \"ihstoire geographie\",\r\n      \"istoire geo\",\r\n      \"istoire geographie\",\r\n      \"istoire-geographie\",\r\n      \"oiftoire geographfie\",\r\n      \"oiftoire-geographfie\",\r\n      \"qhiytpire geographie\",\r\n      \"yustoire geo\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"humanlitterphilo\",\r\n    \"pretty\": \"Humanites, Littérature & Philosophie\",\r\n    \"emoji\": \"🤔\",\r\n    \"formats\": [\r\n      \"HUMANITES, LITTÉRATURE & PHILOSOPHIE\",\r\n      \"Hmuanites, Littérature & Philosophie\",\r\n      \"Human Litter Philo\",\r\n      \"Humanites Littérature & Philosophie\",\r\n      \"Humanites, Litterature & Philosophie\",\r\n      \"Humanites, Littéattre & Phdlosophie\",\r\n      \"Humanites, Littérajune & Philosophie\",\r\n      \"Humanites, Littératur e& Philosophie\",\r\n      \"Humanites, Littérature  &Philosophi\",\r\n      \"Humanites, Littérature  &Philosphie\",\r\n      \"Humanites, Littérature & Philosophie\",\r\n      \"Humanites, Littérature & Philosophie (TD)\",\r\n      \"Humanites, Littératurl & Philocophie\",\r\n      \"Humanites,Littérature&Philosophie\",\r\n      \"Humanitse, Littérature & Philosophie\",\r\n      \"Humanwites, Littérature & Philosopihe\",\r\n      \"Humaxites, Littéprature & Philjsophie\",\r\n      \"gumanites litterature pgilosophie\",\r\n      \"gumanites, Littérature & Pgilosophie\",\r\n      \"hmuanites litterature philosophie\",\r\n      \"huanites litteratuer philosophie\",\r\n      \"human itter philo\",\r\n      \"human lbtter phiqo\",\r\n      \"human litcetr philo\",\r\n      \"human litetr phmilo\",\r\n      \"human litter philo\",\r\n      \"human litter philo (TP)\",\r\n      \"human litter phiol\",\r\n      \"human litter rrilo\",\r\n      \"human ltityr rhilo\",\r\n      \"human ltter philo\",\r\n      \"humanites littarature phiqosophie\",\r\n      \"humanites litteattre phdlosophie\",\r\n      \"humanites litterajune philosophie\",\r\n      \"humanites litteratue philosophie\",\r\n      \"humanites litteratur e philosophie\",\r\n      \"humanites litterature philosophi\",\r\n      \"humanites litterature philosophie\",\r\n      \"humanites litterature philosophie (TP)\",\r\n      \"humanites litterature philosophie BTS\",\r\n      \"humanites litterature philosphie\",\r\n      \"humanites litterature philosxpaie\",\r\n      \"humanites litterature philsoophie\",\r\n      \"humanites litterature phxilosophie\",\r\n      \"humanites litteraturephiloxsophie\",\r\n      \"humanites litteraturl philocophie\",\r\n      \"humanites litterayrure phinosophie\",\r\n      \"humanites littrature philosophie\",\r\n      \"humanitesl itterature philosophie\",\r\n      \"humaniteslitteraturephilosophie\",\r\n      \"humanitse litterature philosophie\",\r\n      \"humanlitterphilo\",\r\n      \"humanties littverature philosophie\",\r\n      \"humanu litter phlo\",\r\n      \"humanwites litterature philosopihe\",\r\n      \"humaxites litteprature philjsophie\",\r\n      \"humn litter phlio\",\r\n      \"humna littr philo\",\r\n      \"humy nlitter phclo\",\r\n      \"husan lituer phlo\",\r\n      \"hvmanites litttrature philosopphie\",\r\n      \"ouman licter philo\",\r\n      \"pHumanites, ittérature & Philosophie\",\r\n      \"phumanites itterature philosophie\",\r\n      \"umauines litterature philosophie\",\r\n      \"zHumanites, Littérature & Philosophie\",\r\n      \"zhumanites litterature philosophie\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"informatiqgestcom\",\r\n    \"pretty\": \"Informatiq Gest Com\",\r\n    \"emoji\": \"💻\",\r\n    \"formats\": [\r\n      \"IFNORMATIQ.GEST.COM.\",\r\n      \"INFORMAIQ.GEST.COM.\",\r\n      \"INFORMATIQ.GEST.COM.\",\r\n      \"INFORMATIQ.GEST.COM. LP\",\r\n      \"INFORMATIQ.GEST.COM. bac pro\",\r\n      \"INFORMhTIQ.GEqT.COM.\",\r\n      \"INFOuMATIQ.GiST.vCOM.\",\r\n      \"INORcMATIQ.GEST.COM.\",\r\n      \"IvFORpATIQ.EST.COM.\",\r\n      \"ifnormatiq gest com\",\r\n      \"informaiq gest com\",\r\n      \"informatiq gest com\",\r\n      \"informatiq gest com bac pro\",\r\n      \"informatiq gest com lp\",\r\n      \"informatiqgestcom\",\r\n      \"informhtiq geqt com\",\r\n      \"infoumatiq gist vcom\",\r\n      \"inorcmatiq gest com\",\r\n      \"ivforpatiq est com\",\r\n      \"mNFORMATIQ.vEST.CM.\",\r\n      \"mnformatiq vest cm\",\r\n      \"sNwORMATI.GEST.COM.\",\r\n      \"snwormati gest com\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"informatique\",\r\n    \"pretty\": \"Informatique\",\r\n    \"emoji\": \"🖥️\",\r\n    \"formats\": [\r\n      \"IFORMATQIUE\",\r\n      \"INFORMATIQUE\",\r\n      \"INFORMATIQUE 6e\",\r\n      \"INFORMATIQUE LV2\",\r\n      \"INFORlrATIQUE\",\r\n      \"INFvORMATIQEU\",\r\n      \"eNFROMATIiUE\",\r\n      \"hNFOtRMATIQUE\",\r\n      \"informatique\",\r\n      \"inpformatiue\",\r\n      \"niformatiquhe\",\r\n      \"tINFOhMATIQwE\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"informatqapplgest\",\r\n    \"pretty\": \"Informatq Appl Gest\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"INFOMATQ APPL.GESec\",\r\n      \"INFORMAT QAPPL.GEST.\",\r\n      \"INFORMATQ APP.LGEST.\",\r\n      \"INFORMATQ APPL.GES.\",\r\n      \"INFORMATQ APPL.GEST.\",\r\n      \"INFORMATQ APPL.GEST. (AP)\",\r\n      \"INFORMATQAPPL.GEST.\",\r\n      \"INFORMATQtAPPL.GESqT\",\r\n      \"INFORMATQx APPL.GEST.\",\r\n      \"INwOMRATQ AePL.GEST.\",\r\n      \"Informatq Appl.Gest.\",\r\n      \"cNFOgMATQ APPeL.GEST.\",\r\n      \"cnfogmatq appel gest\",\r\n      \"infomatq appl gesec\",\r\n      \"informat qappl gest\",\r\n      \"informatq app lgest\",\r\n      \"informatq appl ges\",\r\n      \"informatq appl gest\",\r\n      \"informatqappl gest\",\r\n      \"informatqapplgest\",\r\n      \"informatqtappl gesqt\",\r\n      \"informatqx appl gest\",\r\n      \"inwomratq aepl gest\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"informatqautomatism\",\r\n    \"pretty\": \"Informatq Automatism\",\r\n    \"emoji\": \"⚙️\",\r\n    \"formats\": [\r\n      \"IFNORMATQ-AUTOMATISM\",\r\n      \"INFORMATQ AUTOMATISM\",\r\n      \"INFORMATQ-AUTOMATISM - groupe A\",\r\n      \"INFORMATQ-AUTOMATISM 3e\",\r\n      \"INFORMATQ-AUTOMATIbSM\",\r\n      \"INFORMATQ-AUTOjMATISM\",\r\n      \"INFORMATQ-UjTOzATISM\",\r\n      \"INFORMATQxAqOMATISM\",\r\n      \"INFORMTQ-AUTOMATISM\",\r\n      \"INFORtATQ-AtTOMTAISM\",\r\n      \"INrORMATQ-AUTOMATISM\",\r\n      \"Informatq-Automatism\",\r\n      \"ifnormatq automatism\",\r\n      \"informatq autojmatism\",\r\n      \"informatq automatibsm\",\r\n      \"informatq automatism 3e\",\r\n      \"informatq automatism groupe a\",\r\n      \"informatq ujtozatism\",\r\n      \"informatqautomatism\",\r\n      \"informtq automatism\",\r\n      \"infortatq attomtaism\",\r\n      \"inrormatq automatism\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"informatqsystprod\",\r\n    \"pretty\": \"Informatq Syst Prod\",\r\n    \"emoji\": \"🔌\",\r\n    \"formats\": [\r\n      \"INFORMATQ SYST.PROD.\",\r\n      \"INFORMATQ SYST.PROD. 2nde\",\r\n      \"INFORMATQ SYST.PROD. special\",\r\n      \"INFORMATQ SYST.bPROD.\",\r\n      \"INFORMATQ SYSTr.PROD.\",\r\n      \"INFORMATQ lYiT.PROD.\",\r\n      \"INFORMATQSYST.PROD.\",\r\n      \"INFORMATQi SYST.PROD.\",\r\n      \"INFORMTQ SYST.PROD.\",\r\n      \"INFORMlTQ SxYST.PROx.\",\r\n      \"InNFORMTAQ SYST.PROD.\",\r\n      \"NjORMATQ SYST.PReD.\",\r\n      \"informatq lyit prod\",\r\n      \"informatq syst bprod\",\r\n      \"informatq syst prod\",\r\n      \"informatq syst prod 2nde\",\r\n      \"informatq syst prod special\",\r\n      \"informatq systr prod\",\r\n      \"informatqi syst prod\",\r\n      \"informatqsyst prod\",\r\n      \"informatqsystprod\",\r\n      \"informltq sxyst prox\",\r\n      \"informtq syst prod\",\r\n      \"innformtaq syst prod\",\r\n      \"njormatq syst pred\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"informmondetravail\",\r\n    \"pretty\": \"Inform Monde Travail\",\r\n    \"emoji\": \"🧑‍💻\",\r\n    \"formats\": [\r\n      \"INFOM.MONDE TRAAVIL\",\r\n      \"INFORM.MNDE TRAVAIL\",\r\n      \"INFORM.MODE TRAVAIL\",\r\n      \"INFORM.MOND ETRAVAIL\",\r\n      \"INFORM.MONDE RAVAIL\",\r\n      \"INFORM.MONDE TRAAVIL\",\r\n      \"INFORM.MONDE TRAVAIL\",\r\n      \"INFORM.MONDE TRAVAIL LV1\",\r\n      \"INFORM.MONDETRAVAIL\",\r\n      \"INFORM.gMuNDE TRAVzIL\",\r\n      \"infom monde traavil\",\r\n      \"inform gmunde travzil\",\r\n      \"inform mnde travail\",\r\n      \"inform mode travail\",\r\n      \"inform mond etravail\",\r\n      \"inform monde ravail\",\r\n      \"inform monde traavil\",\r\n      \"inform monde travail\",\r\n      \"inform mondetravail\",\r\n      \"informmondetravail\",\r\n      \"xINFORM.MONDE TRAVALI\",\r\n      \"xinform monde travali\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"integration\",\r\n    \"pretty\": \"Intégration\",\r\n    \"emoji\": \"🌐\",\r\n    \"formats\": [\r\n      \"INTÉGRATION\",\r\n      \"Inlégraxion\",\r\n      \"Intéagratin\",\r\n      \"Intégraiton\",\r\n      \"Intégratino\",\r\n      \"Intégration (accompagnement)\",\r\n      \"Intégration BTS\",\r\n      \"Intégrtaion\",\r\n      \"Inétgration\",\r\n      \"Itnégraion\",\r\n      \"Ixntérgation\",\r\n      \"Ixtégratioz\",\r\n      \"iltegratios\",\r\n      \"inetegration\",\r\n      \"inetgration\",\r\n      \"inlegraxion\",\r\n      \"intbgration\",\r\n      \"intbxraiton\",\r\n      \"inteagratin\",\r\n      \"integraion\",\r\n      \"integraiton\",\r\n      \"integratin\",\r\n      \"integratino\",\r\n      \"integration\",\r\n      \"integration - groupe A\",\r\n      \"integration bts\",\r\n      \"integration groupe a\",\r\n      \"integraton\",\r\n      \"integrtaion\",\r\n      \"integrtion\",\r\n      \"interatoin\",\r\n      \"intgration\",\r\n      \"intigrktgion\",\r\n      \"itnegraion\",\r\n      \"itnegration\",\r\n      \"itnegrbation\",\r\n      \"ixntergation\",\r\n      \"ixtegratioz\",\r\n      \"jntegratois\",\r\n      \"jntégratois\",\r\n      \"nItégraion\",\r\n      \"nItégration\",\r\n      \"nitegraion\",\r\n      \"nitegration\",\r\n      \"ntnezration\",\r\n      \"ntnézration\",\r\n      \"untegration\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"italiencorresp\",\r\n    \"pretty\": \"Italien LV3 Corresp\",\r\n    \"emoji\": \"🇮🇹\",\r\n    \"formats\": [\r\n      \"ITAIEN LV3 CORRESP.\",\r\n      \"ITALIE NLV1 CORRSP.\",\r\n      \"ITALIE NLV3 CORoRESP.\",\r\n      \"ITALIEN LV1 CORRESP. BTS\",\r\n      \"ITALIEN LV1 CORRESP. LV1\",\r\n      \"ITALIEN LV2 CORRESP. Tle\",\r\n      \"ITALIEN LV2 CORRESP. bac pro\",\r\n      \"ITALIEN LV2 CORRESPb.\",\r\n      \"ITALIEN LV2 CORRSP.\",\r\n      \"ITALIEN LV2 CORlESPk\",\r\n      \"ITALIEN LV2 ORRESP.\",\r\n      \"ITALIEN LV3 CORRESP.\",\r\n      \"ITALIEN LV3 CORRESP. BTS\",\r\n      \"ITALIEN LV3 CORRESP. bac pro\",\r\n      \"ITALIEN LV3 COzRRESP.\",\r\n      \"ITALIEN VL1 CORRESP.\",\r\n      \"ITALIEN VL3 CORRES.\",\r\n      \"ITALIEN VL3 CORRESdP.\",\r\n      \"ITALIEN fV2qCORRESP.\",\r\n      \"ITALIENLV1CORRESP.\",\r\n      \"ITALIENLV2CORRESP.\",\r\n      \"ITALIENLV3CORRESP.\",\r\n      \"ITALIENjLVfC ORRESP.\",\r\n      \"ITALIEnNLV1xCORRESP.\",\r\n      \"ITALIEvN LV1 CORRESP.\",\r\n      \"ITALIN LV3 CORRESP.\",\r\n      \"ITALvEN LV1 CqRESP.\",\r\n      \"ITArIENiLV2 CORdRESP.\",\r\n      \"ITmLIEo LV1 CORRESP.\",\r\n      \"ITwLIEN LVi1 CORRESPd\",\r\n      \"IsALIEN LV3C xRRESP.\",\r\n      \"Italien Lv1 Corresp.\",\r\n      \"Italien Lv2 Corresp.\",\r\n      \"TALIEN LV2 CORRESP.\",\r\n      \"isalien lv3c xrresp\",\r\n      \"itaien corresp\",\r\n      \"italie nlv1 corrsp\",\r\n      \"italie nlv3 cororesp\",\r\n      \"italien corlespk\",\r\n      \"italien corresp\",\r\n      \"italien corresp bac pro\",\r\n      \"italien corresp bts\",\r\n      \"italien corresp tle\",\r\n      \"italien correspb\",\r\n      \"italien corrsp\",\r\n      \"italien cozrresp\",\r\n      \"italien fv2qcorresp\",\r\n      \"italien orresp\",\r\n      \"italien vl1 corresp\",\r\n      \"italien vl3 corres\",\r\n      \"italien vl3 corresdp\",\r\n      \"italiencorresp\",\r\n      \"italienjlvfc orresp\",\r\n      \"italienlv1corresp\",\r\n      \"italienlv2corresp\",\r\n      \"italienlv3corresp\",\r\n      \"italiennlv1xcorresp\",\r\n      \"italievn corresp\",\r\n      \"italin corresp\",\r\n      \"italven cqresp\",\r\n      \"itarienilv2 cordresp\",\r\n      \"itmlieo corresp\",\r\n      \"jITALjEN tV2 CORRESP.\",\r\n      \"jitaljen tv2 corresp\",\r\n      \"talien corresp\",\r\n      \"uTAnIEN LV3 CORRESP.\",\r\n      \"utanien corresp\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"judo\",\r\n    \"pretty\": \"Judo\",\r\n    \"emoji\": \"🥋\",\r\n    \"formats\": [\r\n      \"JDUO\",\r\n      \"JUDO\",\r\n      \"JUDO LV1\",\r\n      \"JUDOf\",\r\n      \"JUOD\",\r\n      \"JUsDO\",\r\n      \"JUtfy\",\r\n      \"bJUDO\",\r\n      \"jmudo\",\r\n      \"judo\",\r\n      \"jum\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"langcultregionales\",\r\n    \"pretty\": \"Lang Cult Regionales\",\r\n    \"emoji\": \"🏞️\",\r\n    \"formats\": [\r\n      \"LANG.CULT.REGIONAES\",\r\n      \"LANG.CULT.REGIONALES 3e\",\r\n      \"LANG.CULT.REGIONALES LV2\",\r\n      \"LANG.CULT.REIGONALES\",\r\n      \"LANG.CULT.RpEGIONALES\",\r\n      \"LANG.CUxT.RaGIONALES\",\r\n      \"LANG.ULT.REGIONALES\",\r\n      \"LANGg.CULT.REGIONALEn\",\r\n      \"Lang.Cult.Regionales\",\r\n      \"jLANG.CULv.REGIOuALES\",\r\n      \"jlang culv regiouales\",\r\n      \"lang cult regionaes\",\r\n      \"lang cult regionales\",\r\n      \"lang cult regionales 3e\",\r\n      \"lang cult reigonales\",\r\n      \"lang cult rpegionales\",\r\n      \"lang cuxt ragionales\",\r\n      \"lang ult regionales\",\r\n      \"langcultregionales\",\r\n      \"langg cult regionalen\",\r\n      \"vANG.CULT.REGIONbLESl\",\r\n      \"vang cult regionblesl\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"languegrddebutant\",\r\n    \"pretty\": \"Langue Grd Debutant\",\r\n    \"emoji\": \"📘\",\r\n    \"formats\": [\r\n      \"ALNGUE GD DEBUTANT\",\r\n      \"LAGNUE GRD DEBeUTANT\",\r\n      \"LANGUE GRD DEBUTANT\",\r\n      \"LANGUE GRD DEBUTANT > salle 201\",\r\n      \"LANGUE RG DEBUTANT\",\r\n      \"LANGUEGRDDEBUTANT\",\r\n      \"langu enrt debutant\",\r\n      \"langue gr debutpant\",\r\n      \"langue grd debutant salle 201\",\r\n      \"langue grd deutant\",\r\n      \"languegrddebutant\",\r\n      \"languje grd vebutant\",\r\n      \"laxgue grd debztant\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"langueregionale\",\r\n    \"pretty\": \"Langue Regionale\",\r\n    \"emoji\": \"🗺️\",\r\n    \"formats\": [\r\n      \"LANGU REGfIONALE\",\r\n      \"LANGUE REGIONALE 1ere\",\r\n      \"LANGUE REGIONLE\",\r\n      \"LANGUEREGIONALE\",\r\n      \"LcNGUb RxEGIONALE\",\r\n      \"LvNGUEzRGEIONALE\",\r\n      \"lague regionale\",\r\n      \"lange regioanle\",\r\n      \"langue regionale\",\r\n      \"langue regionale 2nde\",\r\n      \"langueregionale\",\r\n      \"ltagnue regionale\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"languerenforcee\",\r\n    \"pretty\": \"Langue Renforcee\",\r\n    \"emoji\": \"📗\",\r\n    \"formats\": [\r\n      \"LANGUE RENFORCEE (TP)\",\r\n      \"LANGUE RENOFRCEE\",\r\n      \"LANGUERENFORCEE\",\r\n      \"aangue renforcey\",\r\n      \"langu renforcele\",\r\n      \"langue renforcee\",\r\n      \"langue renforcee cap\",\r\n      \"langue renforee\",\r\n      \"langue rneforcee\",\r\n      \"langue rnfocree\",\r\n      \"languerenforcee\",\r\n      \"lnague renforcee\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"languevivante1\",\r\n    \"pretty\": \"Langue Vivante 1\",\r\n    \"emoji\": \"🗣️\",\r\n    \"formats\": [\r\n      \"ALNGUE kVIVANTE 1\",\r\n      \"ANGmUE VIVANTE 1\",\r\n      \"LAGUE VIVANTE 1\",\r\n      \"LANGUE VIVANTE 1 (option)\",\r\n      \"LANGUgE VIVANTE 1\",\r\n      \"elanguevivante 1\",\r\n      \"langeu vivante 1\",\r\n      \"langue ivante 1\",\r\n      \"langue vivante 1\",\r\n      \"langue vivante 1 bts\",\r\n      \"languevivante1\",\r\n      \"lnafue vivznte 1\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"languevivante2\",\r\n    \"pretty\": \"Langue Vivante 2\",\r\n    \"emoji\": \"💬\",\r\n    \"formats\": [\r\n      \"LANGUE VIVANTE 2\",\r\n      \"LANGUE VIVANTE 2 (option)\",\r\n      \"LANGUyk VIVANTE 2\",\r\n      \"Langue Vivante 2\",\r\n      \"lague vivante 2\",\r\n      \"langu evivante 2\",\r\n      \"langue viantet 2\",\r\n      \"langue vivanate 2\",\r\n      \"langue vivante f2\",\r\n      \"langue vivcnxe 2\",\r\n      \"languevivante2\",\r\n      \"leangue vihanue 2\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"languevivante3\",\r\n    \"pretty\": \"Langue Vivante 3\",\r\n    \"emoji\": \"📝\",\r\n    \"formats\": [\r\n      \"LANGEU VIVANTE 3\",\r\n      \"LANGUE VIVAN E3\",\r\n      \"LANGUE VIVANTE 3 BTS\",\r\n      \"LANGUE VIVATNE 3\",\r\n      \"LANGUEIVVANTE 3\",\r\n      \"LANGUEVIVANTE3\",\r\n      \"laguetvivante 3\",\r\n      \"langce vivante t\",\r\n      \"langu evivante 3\",\r\n      \"langue vivante 3\",\r\n      \"langue vivante 3 bac pro\",\r\n      \"langue vivbnteb3\",\r\n      \"languevivante3\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"latin\",\r\n    \"pretty\": \"Latin\",\r\n    \"emoji\": \"🏛️\",\r\n    \"formats\": [\r\n      \"LCA LATIN\",\r\n      \"LATIN\",\r\n      \"LATIN LV2\",\r\n      \"LATNI\",\r\n      \"LAyNm\",\r\n      \"LbAITN\",\r\n      \"atin\",\r\n      \"kaxin\",\r\n      \"latin\",\r\n      \"lcaitn\",\r\n      \"xAdyIN\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"llcanglmondcont\",\r\n    \"pretty\": \"Llcer Anglais Monde Contemporain\",\r\n    \"emoji\": \"🌍\",\r\n    \"formats\": [\r\n      \"LLC ANGL MOND CONT\",\r\n      \"LLCER Anglais Monde Contemporain 1ere\",\r\n      \"LLCER Anglais Monde Contemporain 4e\",\r\n      \"LLCER Anglais Monde Contemporan\",\r\n      \"LLCER Anglais Monde Contemporrkn\",\r\n      \"LLCER Anglais nMonde Contemporain\",\r\n      \"LLCER anglais Monde Contemproaix\",\r\n      \"LLCER nzlais Monde Contqmporain\",\r\n      \"LLCRE Anghyis Monde Contemporain\",\r\n      \"Llcer Anglais Monde Contemporain\",\r\n      \"lcer anglais monde contemporain\",\r\n      \"lhlc angl mond cont\",\r\n      \"llc angk mosd cont\",\r\n      \"llc angl mond cocnt\",\r\n      \"llc angl mond conct\",\r\n      \"llc angl mond cont - groupe A\",\r\n      \"llc angl mond cont 5e\",\r\n      \"llc angl mond cont groupe a\",\r\n      \"llc angl monod cont\",\r\n      \"llc angl movd coxnn\",\r\n      \"llc anglm ond cont\",\r\n      \"llc kngl moed cont\",\r\n      \"llc ngl mond cont\",\r\n      \"llc pngl mondc oxt\",\r\n      \"llca ngxl mond cont\",\r\n      \"llcangl mond cont\",\r\n      \"llcanglmondcont\",\r\n      \"llcea nglais monde contemporain\",\r\n      \"llcer agnlais monde contemporain\",\r\n      \"llcer anglaes mondecontemporqin\",\r\n      \"llcer anglais mnde contempoarin\",\r\n      \"llcer anglais monde conemporain\",\r\n      \"llcer anglais monde contemoprain\",\r\n      \"llcer anglais monde contemporain (accompagnement)\",\r\n      \"llcer anglais monde contemporain 5e\",\r\n      \"llcer anglais monde contempporain\",\r\n      \"llcer anglais monde contemproain\",\r\n      \"llcer anglais monde contempwroain\",\r\n      \"llcer anglais monde contlmpoarie\",\r\n      \"llcer anglais monde ontemporain\",\r\n      \"llcer anglais mondex cntemporain\",\r\n      \"llcer anglais monfeg contemportin\",\r\n      \"llcer anglais omnde contemporain\",\r\n      \"llcer anglaism onde conteporain\",\r\n      \"llceranglaismondecontemporain\",\r\n      \"llceriangcais monde contemporain\",\r\n      \"llcey anglais mondc contemporin\",\r\n      \"llcre aglais monde contemporain\",\r\n      \"lloer anglaisxmonde contemporain\",\r\n      \"lls anlg mond cnnt\",\r\n      \"llt angl mwnd cont\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"lutte\",\r\n    \"pretty\": \"Lutte\",\r\n    \"emoji\": \"🤼\",\r\n    \"formats\": [\r\n      \"LTUTE\",\r\n      \"LUTTE\",\r\n      \"LUTTE special\",\r\n      \"Lutte\",\r\n      \"LxUpE\",\r\n      \"attf\",\r\n      \"leutte\",\r\n      \"lute\",\r\n      \"lutte\",\r\n      \"ultteb\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"lvmodule\",\r\n    \"pretty\": \"Lv Module\",\r\n    \"emoji\": \"🗣️\",\r\n    \"formats\": [\r\n      \"L VMOULE\",\r\n      \"LV MDOULE\",\r\n      \"LV MODULE 1ere\",\r\n      \"LV MODULE > salle 201\",\r\n      \"LV MODcULE\",\r\n      \"LVMODULE\",\r\n      \"Lb MuDUtLE\",\r\n      \"av mohle\",\r\n      \"lv module\",\r\n      \"lv module salle 201\",\r\n      \"lvam odule\",\r\n      \"lvm dule\",\r\n      \"lvmodule\",\r\n      \"lvvmoble\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"marketing\",\r\n    \"pretty\": \"Marketing\",\r\n    \"emoji\": \"📢\",\r\n    \"formats\": [\r\n      \"MARKETING\",\r\n      \"Mareting\",\r\n      \"Marketig\",\r\n      \"Marketing (AP)\",\r\n      \"Markgteing\",\r\n      \"Markttqng\",\r\n      \"Marzketinw\",\r\n      \"Mrakeing\",\r\n      \"Mzrketnkg\",\r\n      \"Sdc Marketing\",\r\n      \"anrketbng\",\r\n      \"dsc mrketing\",\r\n      \"hMarkjying\",\r\n      \"mareking\",\r\n      \"markeitng\",\r\n      \"marketing\",\r\n      \"marketing 4e\",\r\n      \"maurketing\",\r\n      \"myarketing\",\r\n      \"sacnmarketirng\",\r\n      \"sd cmarketing\",\r\n      \"sdc arketing\",\r\n      \"sdc iwarketijg\",\r\n      \"sdc marbetiqg\",\r\n      \"sdc marketeno\",\r\n      \"sdc marketing (option)\",\r\n      \"sdc marketing 2nde\",\r\n      \"sdc marketingj\",\r\n      \"sdc marketmx\",\r\n      \"sdcmarketind\",\r\n      \"sdcmarketing\",\r\n      \"sfc marketmkng\",\r\n      \"swc makretinn\",\r\n      \"syc marketigg\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mathematiques\",\r\n    \"pretty\": \"Mathématiques\",\r\n    \"emoji\": \"🧮\",\r\n    \"formats\": [\r\n      \"Mabthématiques\",\r\n      \"Mahtématiquef\",\r\n      \"Masthématiuuts\",\r\n      \"Math\",\r\n      \"Mathematiques 1Ere\",\r\n      \"Maths\",\r\n      \"Mathéimatqiues\",\r\n      \"Mathélmatiuqes\",\r\n      \"Mathémaitques\",\r\n      \"Mathématibues\",\r\n      \"Mathématiques\",\r\n      \"Mathématiques (option)\",\r\n      \"Mathématiques CAP\",\r\n      \"Mathématiuqes\",\r\n      \"Mathémrntiqles\",\r\n      \"Matéhmatiques\",\r\n      \"Mewhéatiques\",\r\n      \"Mmthémagiqques\",\r\n      \"aMhématiques\",\r\n      \"aMthématiquesm\",\r\n      \"amhematiques\",\r\n      \"amthematiquesm\",\r\n      \"amthetttiques\",\r\n      \"amtp\",\r\n      \"ath\",\r\n      \"aths\",\r\n      \"athws\",\r\n      \"bagtq\",\r\n      \"eath\",\r\n      \"ematsh\",\r\n      \"fath 1ure\",\r\n      \"fath becre\",\r\n      \"gathematiqed\",\r\n      \"hathematiques\",\r\n      \"iiatb\",\r\n      \"lxathb\",\r\n      \"mabthematiques\",\r\n      \"madhh\",\r\n      \"mah\",\r\n      \"mahematiquesh1xre\",\r\n      \"mahmts\",\r\n      \"maht 1eap\",\r\n      \"mahtematidques 1ere\",\r\n      \"mahtematiquef\",\r\n      \"malhs\",\r\n      \"masthematiuuts\",\r\n      \"mateematiquesm 1zre\",\r\n      \"matehmatiques\",\r\n      \"math (TP)\",\r\n      \"math 1ere\",\r\n      \"math 1ere (option)\",\r\n      \"math 1ere 1ere\",\r\n      \"math 1eroe\",\r\n      \"math 3e\",\r\n      \"math1 epre\",\r\n      \"math1ere\",\r\n      \"mathedatiquem 1ere\",\r\n      \"matheimatqiues\",\r\n      \"mathelmatiuqes\",\r\n      \"mathemaitques\",\r\n      \"mathematibues\",\r\n      \"mathematieus\",\r\n      \"mathematiqes\",\r\n      \"mathematiqes 1ere\",\r\n      \"mathematiques\",\r\n      \"mathematiques 1ere 1ere\",\r\n      \"mathematiques 1ere LP\",\r\n      \"mathematiques 1ree\",\r\n      \"mathematiques 3e\",\r\n      \"mathematiques > salle 201\",\r\n      \"mathematiques cap\",\r\n      \"mathematiques salle 201\",\r\n      \"mathematiques1ere\",\r\n      \"mathematiqupes\",\r\n      \"mathematiuqes\",\r\n      \"mathematkwue 1ere\",\r\n      \"mathematqiue 1ere\",\r\n      \"mathemrntiqles\",\r\n      \"mathemtaiques\",\r\n      \"mathemtaques 1ere\",\r\n      \"mathevatqiuea\",\r\n      \"mathezpatiquhs\",\r\n      \"mathh 1ere\",\r\n      \"mathie1xe\",\r\n      \"mathmatiques 1ere\",\r\n      \"maths CAP\",\r\n      \"maths LV2\",\r\n      \"matqh ere\",\r\n      \"matshj\",\r\n      \"matsumatiquhes\",\r\n      \"matswh\",\r\n      \"matuelaiques\",\r\n      \"matuh\",\r\n      \"matzh\",\r\n      \"maukt\",\r\n      \"mavthejatiquss\",\r\n      \"mduh\",\r\n      \"mewheatiques\",\r\n      \"mgtts\",\r\n      \"mmthemagiqques\",\r\n      \"mntiematiques 1eret\",\r\n      \"mtah\",\r\n      \"mtah 1ere\",\r\n      \"mtahematiques\",\r\n      \"mtath1 ere\",\r\n      \"mthematiques 1ere\",\r\n      \"mtt 1erx\",\r\n      \"mwathematique 1ere\",\r\n      \"omtahematiques\",\r\n      \"qatheakatiques 1ere\",\r\n      \"qtav\",\r\n      \"tdth 1ere\",\r\n      \"vmaths\",\r\n      \"vthp\",\r\n      \"yith\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mathematiques_xml\",\r\n    \"pretty\": \"Mathematiques\",\r\n    \"emoji\": \"📐\",\r\n    \"formats\": [\r\n      \"AMTHEMATIQUES\",\r\n      \"MATHEMATIQUES\",\r\n      \"MATHEMATIQUES (option)\",\r\n      \"MATHEMATIQUEsS\",\r\n      \"matematiqunes\",\r\n      \"mathematiqquse\",\r\n      \"mathematiques 5e\",\r\n      \"mathematiques_xml\",\r\n      \"mathematiupes\",\r\n      \"mathematiuse\",\r\n      \"mathematzques\",\r\n      \"mathemratiqeus\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mathematiquesappliq\",\r\n    \"pretty\": \"Mathematiques Appliq\",\r\n    \"emoji\": \"📏\",\r\n    \"formats\": [\r\n      \"MATHEMATIQUES APPLIQ\",\r\n      \"MATHEMATIQUES APPLIQ (TP)\",\r\n      \"MATHEMATIQUES APPgLIQ\",\r\n      \"MATHEMATIUES kAPPLIQ\",\r\n      \"amhematiques appliq\",\r\n      \"mathematinuesjappliq\",\r\n      \"mathematiqeus appliq\",\r\n      \"mathematiques apjpliq\",\r\n      \"mathematiquesappliq\",\r\n      \"mathematqiues appliq\",\r\n      \"mathematqyues appliq\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mathematiquesmodule\",\r\n    \"pretty\": \"Mathematiques Module\",\r\n    \"emoji\": \"➗\",\r\n    \"formats\": [\r\n      \"MATEHMATIQUElS MODULE\",\r\n      \"MATHEMATIQUES MODULE - groupe A\",\r\n      \"MATHEMATIQUES MODULE BTS\",\r\n      \"MATHEMATIQUES MOyUfL\",\r\n      \"MATHEMATIQzESdMODbULE\",\r\n      \"MATHhMATIQUzS MDULE\",\r\n      \"MTAHEMATIQUES MODULE\",\r\n      \"Mathematiques Module\",\r\n      \"MztEMATIQUES MODULE\",\r\n      \"mamthematiqeus module\",\r\n      \"mathemamtiques module\",\r\n      \"mathematiques module groupe a\",\r\n      \"mathematiquesmodule\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mathsinformatique\",\r\n    \"pretty\": \"Maths Informatique\",\r\n    \"emoji\": \"💻\",\r\n    \"formats\": [\r\n      \"MATHS INFORAMTIaQUE\",\r\n      \"MATHS INFORMATIQUE\",\r\n      \"MATHS INFORMATIQUE (AP)\",\r\n      \"MATHS INFbRMATIQUE\",\r\n      \"MATHS uINFORMATIQUE\",\r\n      \"MATHSINFORMATIQUE\",\r\n      \"MATHSlINFORMATIQnE\",\r\n      \"mathnu inxormatique\",\r\n      \"maths informatique\",\r\n      \"maths infromatique\",\r\n      \"mathsinformatique\",\r\n      \"mths informatique\",\r\n      \"uATHxS ItFORMATIQUE\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mathspourinformatq\",\r\n    \"pretty\": \"Mathématiques Pour L’informatique\",\r\n    \"emoji\": \"🖥️\",\r\n    \"formats\": [\r\n      \"MATHS POUR INFORMATQ\",\r\n      \"Mahtémaokques pour l’Informatique\",\r\n      \"Mathematiques pour l’Informatique\",\r\n      \"Mathémaitques pou l’Informatique\",\r\n      \"Mathématique spour lp’Informatique\",\r\n      \"Mathématiquec pour l’Informatihue\",\r\n      \"Mathématiquegpour l’Infoxmatique\",\r\n      \"Mathématiques pour l’Informasique\",\r\n      \"Mathématiques pour l’Informatique\",\r\n      \"Mathématiques pour l’Informatique 1ere\",\r\n      \"Mathématiques pour l’Informatique bac pro\",\r\n      \"Mathématiques pour l’nIformatiqxe\",\r\n      \"Mathématiquespourl’Informatique\",\r\n      \"Mathématiquews pour l’Informatique\",\r\n      \"Mathématiquves pour l’Informatique\",\r\n      \"Maythématiques pour lInformatique\",\r\n      \"Mtahématiques pour l’Infzrmatique\",\r\n      \"aMthématiques pour l’Informatique\",\r\n      \"amthematiquers pour l informatique\",\r\n      \"amthematiquers pour l’informatique\",\r\n      \"amthematiques pour l informatique\",\r\n      \"athematiques pour l informateique\",\r\n      \"athematiques pour l informatqiue\",\r\n      \"athématiques pour l’Informateique\",\r\n      \"athématiques pour l’Informatqiue\",\r\n      \"kaths pour informatq\",\r\n      \"mahs pou rinformatq\",\r\n      \"mahtemaokques pour l informatique\",\r\n      \"mashs pour informtq\",\r\n      \"matheatiques pour l informatique\",\r\n      \"matheatiques pour l’informatique\",\r\n      \"mathemaciques pour l tnfrmatique\",\r\n      \"mathemaciques pour l’tnfrmatique\",\r\n      \"mathemaitques pou l informatique\",\r\n      \"mathematique spour lp informatique\",\r\n      \"mathematiquec pour l informatihue\",\r\n      \"mathematiquegpour l infoxmatique\",\r\n      \"mathematiques pou l informatique\",\r\n      \"mathematiques pou l’informatique\",\r\n      \"mathematiques pouer l informatique\",\r\n      \"mathematiques pouer l’informatique\",\r\n      \"mathematiques pour l informaltique\",\r\n      \"mathematiques pour l informasique\",\r\n      \"mathematiques pour l informatique\",\r\n      \"mathematiques pour l informatique 1ere\",\r\n      \"mathematiques pour l informatique bac pro\",\r\n      \"mathematiques pour l informatique tle\",\r\n      \"mathematiques pour l infrmatique\",\r\n      \"mathematiques pour l infromatique\",\r\n      \"mathematiques pour l niformatiqxe\",\r\n      \"mathematiques pour l’informaltique\",\r\n      \"mathematiques pour l’informatique LV2\",\r\n      \"mathematiques pour l’informatique Tle\",\r\n      \"mathematiques pour l’infrmatique\",\r\n      \"mathematiques pour l’infromatique\",\r\n      \"mathematiques pourx l informatique\",\r\n      \"mathematiques pourx l’informatique\",\r\n      \"mathematiques pror l pinformatique\",\r\n      \"mathematiques pror l’pinformatique\",\r\n      \"mathematiquespourl informatique\",\r\n      \"mathematiquespourl’informatique\",\r\n      \"mathematiquews pour l informatique\",\r\n      \"mathematiqus pour l informatique\",\r\n      \"mathematiqus pour l’informatique\",\r\n      \"mathematiquves pour l informatique\",\r\n      \"mathmatiques pour l informatique\",\r\n      \"mathmatiques pour l’informatique\",\r\n      \"maths our ionformatq\",\r\n      \"maths poo informalq\",\r\n      \"maths poru informatq\",\r\n      \"maths pour ifnrmatq\",\r\n      \"maths pour informatq\",\r\n      \"maths pour informatq (AP)\",\r\n      \"maths pour infromatq\",\r\n      \"maths pouri nformatq\",\r\n      \"maths puor informatq\",\r\n      \"mathspourinformatq\",\r\n      \"mathsz pour infomratq\",\r\n      \"mats pour infomratq\",\r\n      \"maythematiques pour linformatique\",\r\n      \"mkthematiques pour a informatique\",\r\n      \"mkthematiques pour a’informatique\",\r\n      \"mtahematiques pour l infzrmatique\",\r\n      \"mtkhs psur informatq\",\r\n      \"omtahs pour informatq\",\r\n      \"xathematiques povur l inaormatique\",\r\n      \"xathematiques povur l’inaormatique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mecaampconstruction\",\r\n    \"pretty\": \"Meca &amp Construction\",\r\n    \"emoji\": \"⚙️\",\r\n    \"formats\": [\r\n      \"MEC.A &amp; kONSTRUCTION\",\r\n      \"MECA. &am;pnCONlTRUCTION\",\r\n      \"MECA. &amp CONSTRUCTION\",\r\n      \"MECA. &amp; CONSTRUCTION (AP)\",\r\n      \"MECA. &amp; CONSTRUCTION 5e\",\r\n      \"MECA. &amp; CONSTRUrTION\",\r\n      \"MECA. &amp; CONtTRnCTION\",\r\n      \"MECA. &amp; OCNSTRUCTION\",\r\n      \"MECA. &apm; CONSTUCTION\",\r\n      \"MECA. iamp; CONSTRUCTION\",\r\n      \"MECA.&amp;CONSTRUCTION\",\r\n      \"Meca. &Amp; Construction\",\r\n      \"mec a amp konstruction\",\r\n      \"meca am pnconltruction\",\r\n      \"meca amp construction\",\r\n      \"meca amp construction 5e\",\r\n      \"meca amp construrtion\",\r\n      \"meca amp conttrnction\",\r\n      \"meca amp ocnstruction\",\r\n      \"meca apm constuction\",\r\n      \"meca iamp construction\",\r\n      \"mecaampconstruction\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mecaampresistcematx\",\r\n    \"pretty\": \"Meca &amp Resistce Matx\",\r\n    \"emoji\": \"🛠️\",\r\n    \"formats\": [\r\n      \"MEC.A&amp; REStISTCE MATX\",\r\n      \"MECA.&amg; RESISTCE yAT\",\r\n      \"MECA.&amp; RESISCTE MATX\",\r\n      \"MECA.&amp; RESISTC EMArTX\",\r\n      \"MECA.&amp; RESISTCE MATX\",\r\n      \"MECA.&amp; RESISTCE MATX Tle\",\r\n      \"MECA.&amp;RESISTCEMATX\",\r\n      \"MECA.&ampc; RESISTCE MATX\",\r\n      \"MECA.&amz;R ESISTCEtMATX\",\r\n      \"MECb.&amp;rRESISTCE MATX\",\r\n      \"MoECA.&amp; RESISTCE MAT\",\r\n      \"mec a amp restistce matx\",\r\n      \"meca amg resistce yat\",\r\n      \"meca amp resiscte matx\",\r\n      \"meca amp resistc emartx\",\r\n      \"meca amp resistce matx\",\r\n      \"meca amp resistce matx tle\",\r\n      \"meca amp resistcematx\",\r\n      \"meca ampc resistce matx\",\r\n      \"meca amz r esistcetmatx\",\r\n      \"mecaampresistcematx\",\r\n      \"mecb amp rresistce matx\",\r\n      \"moeca amp resistce mat\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mecaaplmottransmi\",\r\n    \"pretty\": \"Meca Apl Mot Transmi\",\r\n    \"emoji\": \"🚗\",\r\n    \"formats\": [\r\n      \"MCEA.APL.MOT.TRANSI\",\r\n      \"MEAC.APL.MOT.TRANSMI\",\r\n      \"MECA.APL.MOT.TRANSMI\",\r\n      \"MECA.APL.MOT.TRANSMI (option)\",\r\n      \"MECA.APL.MOT.TRANSMsI\",\r\n      \"MECA.APL.MOT.TRbNdMI\",\r\n      \"MECA.APL.MOT.TRyNASMI\",\r\n      \"MECA.APLMOT.RTANSMI\",\r\n      \"MECA.APvLMOToTRANSMI\",\r\n      \"MECAh.APL.MOT.TRANSMI\",\r\n      \"Meca.Apl.Mot.Transmi\",\r\n      \"mcea apl mot transi\",\r\n      \"meac apl mot transmi\",\r\n      \"meca apl mot transmi\",\r\n      \"meca apl mot transmsi\",\r\n      \"meca apl mot trbndmi\",\r\n      \"meca apl mot trynasmi\",\r\n      \"meca aplmot rtansmi\",\r\n      \"meca apvlmototransmi\",\r\n      \"mecaaplmottransmi\",\r\n      \"mecah apl mot transmi\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mecaappliqvehicule\",\r\n    \"pretty\": \"Meca Appliq Vehicule\",\r\n    \"emoji\": \"🚙\",\r\n    \"formats\": [\r\n      \"MEAC.APqLIQ.VEHkCULE\",\r\n      \"MECA.APPLIQ.VEHICULE BTS\",\r\n      \"MECA.APPLIQ.VEHIpCULE\",\r\n      \"MECA.APPLIQm.VEHICULE\",\r\n      \"MECA.hPPLIQ.VEHICULE\",\r\n      \"MECAtAPPLIQ.VEjICULE\",\r\n      \"MECf.APPLIQ.VEHlICUqE\",\r\n      \"Meca.Appliq.Vehicule\",\r\n      \"MmECA.APPLQI.VEHICULE\",\r\n      \"cours de MECA.APPLIQ.VEHICULE\",\r\n      \"cours de meca appliq vehicule\",\r\n      \"gECA.APPLIQ.VvHICULE\",\r\n      \"geca appliq vvhicule\",\r\n      \"meac apqliq vehkcule\",\r\n      \"meca appliq vehicule\",\r\n      \"meca appliq vehicule bts\",\r\n      \"meca appliq vehipcule\",\r\n      \"meca appliqm vehicule\",\r\n      \"meca hppliq vehicule\",\r\n      \"mecaappliqvehicule\",\r\n      \"mecatappliq vejicule\",\r\n      \"mecf appliq vehlicuqe\",\r\n      \"mmeca applqi vehicule\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mecaniqindustrielle\",\r\n    \"pretty\": \"Mecaniq Industrielle\",\r\n    \"emoji\": \"🏭\",\r\n    \"formats\": [\r\n      \"MEANIQ.INDUSTRIELLE\",\r\n      \"MECANIQ.INDSUTRIELLE\",\r\n      \"MECANIQ.INDUSTRIELLE\",\r\n      \"MECANIQ.INDUSTRIELLE 1ere\",\r\n      \"MECANIQ.INDUSTRIELLE 4e\",\r\n      \"MECANIQ.INDUSTRILLE\",\r\n      \"MECANIQ.INUDSTRIELLE\",\r\n      \"MECANIQ.INcUxTRIEfLLE\",\r\n      \"MECANIQ.InDUSTRIELt\",\r\n      \"MEnANIQ.INDUSTRIjLLE\",\r\n      \"MjECANIQ.NIDUSTRIELLE\",\r\n      \"meaniq industrielle\",\r\n      \"mecaniq incuxtrieflle\",\r\n      \"mecaniq indsutrielle\",\r\n      \"mecaniq industrielle\",\r\n      \"mecaniq industrielle 1ere\",\r\n      \"mecaniq industrielle 4e\",\r\n      \"mecaniq industrielt\",\r\n      \"mecaniq industrille\",\r\n      \"mecaniq inudstrielle\",\r\n      \"mecaniqindustrielle\",\r\n      \"menaniq industrijlle\",\r\n      \"mjecaniq nidustrielle\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"mecanique\",\r\n    \"pretty\": \"Mecanique\",\r\n    \"emoji\": \"🔧\",\r\n    \"formats\": [\r\n      \"MCANIUQE\",\r\n      \"MECAINQUE\",\r\n      \"MECANIQUE\",\r\n      \"MECANIQUE LV2\",\r\n      \"MECANQIUEj\",\r\n      \"McyANIQUE\",\r\n      \"mecanikqeu\",\r\n      \"mecanique\",\r\n      \"mecanique 2nde\",\r\n      \"mecaniuqe\",\r\n      \"mecanqiue\",\r\n      \"mecnique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"methodesinformatiq\",\r\n    \"pretty\": \"Methodes Informatiq\",\r\n    \"emoji\": \"🖥️\",\r\n    \"formats\": [\r\n      \"METHDmbS INFORMATIQ.\",\r\n      \"METHODES INFORMATI.Q\",\r\n      \"METHODES INFORMATIQ.\",\r\n      \"METHODES INFORMATIQ. Tle\",\r\n      \"METHODES INFbRMATzQ.\",\r\n      \"METHODES INORMATIQ.\",\r\n      \"METHODES IfFORMATIQ.\",\r\n      \"METHODESINFORMATIQ.\",\r\n      \"METHODzS INFORMfTIQ.\",\r\n      \"METHeDEe INFORMATIQ.\",\r\n      \"MTHODES INFORMATIQ.\",\r\n      \"Methodes Informatiq.\",\r\n      \"methdmbs informatiq\",\r\n      \"methedee informatiq\",\r\n      \"methodes ifformatiq\",\r\n      \"methodes infbrmatzq\",\r\n      \"methodes informati q\",\r\n      \"methodes informatiq\",\r\n      \"methodes informatiq tle\",\r\n      \"methodes inormatiq\",\r\n      \"methodesinformatiq\",\r\n      \"methodzs informftiq\",\r\n      \"mthodes informatiq\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"methodologie\",\r\n    \"pretty\": \"Méthodologie\",\r\n    \"emoji\": \"📋\",\r\n    \"formats\": [\r\n      \"Methodologie\",\r\n      \"Méhtodolgie\",\r\n      \"Métcoiologie\",\r\n      \"Méthdoologi\",\r\n      \"Méthdoologie\",\r\n      \"Méthodloogie\",\r\n      \"Méthodologie\",\r\n      \"Méthodologie (AP)\",\r\n      \"Méthodologie 5e\",\r\n      \"Méthodoloige\",\r\n      \"Méthodolwlie\",\r\n      \"Méthodoogie\",\r\n      \"Méthodooige\",\r\n      \"Métqodofoguie\",\r\n      \"ethddoyogie\",\r\n      \"mehtodolgie\",\r\n      \"melhodolovie\",\r\n      \"metcoiologie\",\r\n      \"methcodolgie\",\r\n      \"methdoologi\",\r\n      \"methdoologie\",\r\n      \"methkdologik\",\r\n      \"methodclogie\",\r\n      \"methodlegie\",\r\n      \"methodloogie\",\r\n      \"methodologie\",\r\n      \"methodologie - groupe A\",\r\n      \"methodologie 5e\",\r\n      \"methodologie groupe a\",\r\n      \"methodoloige\",\r\n      \"methodolwlie\",\r\n      \"methodoogie\",\r\n      \"methodooige\",\r\n      \"methodoolgie\",\r\n      \"methowoligie\",\r\n      \"metoghdologie\",\r\n      \"metqodofoguie\",\r\n      \"meyhodologiq\",\r\n      \"mrethodologie\",\r\n      \"mtehodologiie\",\r\n      \"mtehoologie\",\r\n      \"mtehzodologie\",\r\n      \"méthodlegie\",\r\n      \"pitodologie\",\r\n      \"éthddoyogie\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"misanivinformatiq\",\r\n    \"pretty\": \"Mis A Niv Informatiq\",\r\n    \"emoji\": \"💻\",\r\n    \"formats\": [\r\n      \"I.SA NIV.INFORMATIQ\",\r\n      \"IMS.A NIV.INFzORMATIQ\",\r\n      \"MIS.A NIV.INFORMATIQ\",\r\n      \"MIS.A NIV.INFORMATIQ LV2\",\r\n      \"MIS.A NIVI.NFORMATyIQ\",\r\n      \"MIS.ANIV.INFORMATIQ\",\r\n      \"MIS.Ae NIV.INFORMATIQ\",\r\n      \"MIS.b NIVdINOFRMATIQ\",\r\n      \"MIS.q NIV.INFORMATuQ\",\r\n      \"MS.A NfV.INFOaMATIQ\",\r\n      \"i sa niv informatiq\",\r\n      \"ims a niv infzormatiq\",\r\n      \"mis a niv informatiq\",\r\n      \"mis a nivi nformatyiq\",\r\n      \"mis ae niv informatiq\",\r\n      \"mis aniv informatiq\",\r\n      \"mis b nivdinofrmatiq\",\r\n      \"mis q niv informatuq\",\r\n      \"misanivinformatiq\",\r\n      \"ms a nfv infoamatiq\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"modapprof1bureaut\",\r\n    \"pretty\": \"Mod Approf 1 Bureaut\",\r\n    \"emoji\": \"⌨️\",\r\n    \"formats\": [\r\n      \"MD.APPROF.1 BURhEAUT\",\r\n      \"MOD.APPROF.1 BUEAUT\",\r\n      \"MOD.APPROF.1 BUREAT\",\r\n      \"MOD.APPROF.1 BUREAUT\",\r\n      \"MOD.APPROF.1 BUREAUT 3e\",\r\n      \"MOD.APPROF.1 BUREAUT bac pro\",\r\n      \"MOD.APPROF.1BUREAUT\",\r\n      \"MOD.APPmOt.1 BUeREAUT\",\r\n      \"MOD.AhPPROF.1 BUREAUT\",\r\n      \"MOD.AmPPROF.1 BUREAUT\",\r\n      \"MOD.PPROiF.1 BUREAUT\",\r\n      \"MOD.mPPROF.1 BURnEAUg\",\r\n      \"md approf 1 burheaut\",\r\n      \"mod ahpprof 1 bureaut\",\r\n      \"mod ampprof 1 bureaut\",\r\n      \"mod appmot 1 buereaut\",\r\n      \"mod approf 1 bueaut\",\r\n      \"mod approf 1 bureat\",\r\n      \"mod approf 1 bureaut\",\r\n      \"mod approf 1 bureaut 3e\",\r\n      \"mod approf 1 bureaut bac pro\",\r\n      \"mod approf 1bureaut\",\r\n      \"mod mpprof 1 burneaug\",\r\n      \"mod pproif 1 bureaut\",\r\n      \"modapprof1bureaut\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"modul\",\r\n    \"pretty\": \"Modul(fr Mat Hg Lv1)\",\r\n    \"emoji\": \"📘\",\r\n    \"formats\": [\r\n      \"MDUL(FR.MAT.zG.LV1e\",\r\n      \"MODU(FR.MAT.HGdLV1x\",\r\n      \"MODUL(FR.MAT.H.GLV1s)\",\r\n      \"MODUL(FR.MAT.HG.LV1)\",\r\n      \"MODUL(FR.MAT.HG.LV1) 5e\",\r\n      \"MODUL(FR.MAT.HG.LV1) LV1\",\r\n      \"MODUL(FR.MAT.HG.LV1)z\",\r\n      \"MODUL(FR.MAT.HG.V1)\",\r\n      \"MODUL(FR.MAT.HGL.V1)\",\r\n      \"MODUL(FR.qMAT.HG.L1)\",\r\n      \"MOnUL(bR.MAT.HG.lLV1)\",\r\n      \"mdul fr mat zg lv1e\",\r\n      \"modu fr mat hgdlv1x\",\r\n      \"modul\",\r\n      \"modul 5e\",\r\n      \"modulz\",\r\n      \"monul\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"module\",\r\n    \"pretty\": \"Module\",\r\n    \"emoji\": \"📚\",\r\n    \"formats\": [\r\n      \"MODULE\",\r\n      \"MODULE (TP)\",\r\n      \"MOUDLE\",\r\n      \"MtDUhE\",\r\n      \"ODfULE\",\r\n      \"moduelv\",\r\n      \"module\",\r\n      \"moudl\",\r\n      \"moudwl\",\r\n      \"moule\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"modulenstechnopro\",\r\n    \"pretty\": \"Modul Ens Techno Pro\",\r\n    \"emoji\": \"⚙️\",\r\n    \"formats\": [\r\n      \"MODL.ENS.TECHNO.PRO\",\r\n      \"MODUL.ENS.TECHNO.PRO (option)\",\r\n      \"MODUL.ENS.TECHNO.PRO BTS\",\r\n      \"MODUL.ENS.TECpHNO.PRO\",\r\n      \"MODUL.EvS.TECpNO.PRO\",\r\n      \"MODUL.EyNS.TECHNO.PRO\",\r\n      \"MODULE.NS.TEHNO.PRO\",\r\n      \"MODULh.ENS.TECHNO.PRO\",\r\n      \"MOUL.ENS.TECHNO.PRO\",\r\n      \"MOmUL.ENS.TECHdO.PRO\",\r\n      \"Modul.Ens.Techno.Pro\",\r\n      \"modl ens techno pro\",\r\n      \"modul ens techno pro\",\r\n      \"modul ens techno pro bts\",\r\n      \"modul ens tecphno pro\",\r\n      \"modul evs tecpno pro\",\r\n      \"modul eyns techno pro\",\r\n      \"module ns tehno pro\",\r\n      \"modulenstechnopro\",\r\n      \"modulh ens techno pro\",\r\n      \"momul ens techdo pro\",\r\n      \"moul ens techno pro\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"musique\",\r\n    \"pretty\": \"Musique\",\r\n    \"emoji\": \"🎶\",\r\n    \"formats\": [\r\n      \"MSUIQUE\",\r\n      \"MUSIQUE bac pro\",\r\n      \"MUSIsQw\",\r\n      \"MUSrIQUE\",\r\n      \"MUhQIbE\",\r\n      \"jmusiuqe\",\r\n      \"muisque\",\r\n      \"musique\",\r\n      \"musique 6e\",\r\n      \"muyiqge\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"musique5heures\",\r\n    \"pretty\": \"Musique 5 Heures\",\r\n    \"emoji\": \"🎼\",\r\n    \"formats\": [\r\n      \"MUSIQUE 5 HEURES\",\r\n      \"MUSIQUE 5 HEURES 1ere\",\r\n      \"MUSIQUE 5 zHEURES\",\r\n      \"MUSIQUE 5HUERES\",\r\n      \"MUSIQUE m HEURhS\",\r\n      \"MUSIQUE5  HURES\",\r\n      \"MUSqIUE 5 HEURES\",\r\n      \"MUkIQwE 5 HEURES\",\r\n      \"muisque 5 heures\",\r\n      \"musique 5 heure\",\r\n      \"musique5 hures\",\r\n      \"musique5heures\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"musoptionpratart\",\r\n    \"pretty\": \"Mus Option Prat Art\",\r\n    \"emoji\": \"🎵\",\r\n    \"formats\": [\r\n      \"MUS.OPTION PRAT.ART.\",\r\n      \"MUS.OPTION-PARTART.\",\r\n      \"MUS.OPTION-PRAT.ART. > salle 201\",\r\n      \"MUS.OPTION-PRAT.ART. LP\",\r\n      \"MUS.OPTION-PuRAT.ART.\",\r\n      \"MUS.OPaTION-PRAT.ART.\",\r\n      \"MUS.OTIO-NPRAT.ART.\",\r\n      \"MUS.POTION-PRAT.ART.\",\r\n      \"MUS.zPTIOv-PRATART.\",\r\n      \"MUSOTPION-PRAT.ART.\",\r\n      \"MtS.OPTIOk-PRATe.ART.\",\r\n      \"Mus.Option-Prat.Art.\",\r\n      \"mts optiok prate art\",\r\n      \"mus opation prat art\",\r\n      \"mus option partart\",\r\n      \"mus option prat art\",\r\n      \"mus option prat art lp\",\r\n      \"mus option prat art salle 201\",\r\n      \"mus option purat art\",\r\n      \"mus otio nprat art\",\r\n      \"mus potion prat art\",\r\n      \"mus zptiov pratart\",\r\n      \"musoptionpratart\",\r\n      \"musotpion prat art\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"natation\",\r\n    \"pretty\": \"Natation\",\r\n    \"emoji\": \"🏊\",\r\n    \"formats\": [\r\n      \"NATAITON\",\r\n      \"NATATION LV1\",\r\n      \"NATATIpON\",\r\n      \"gamation\",\r\n      \"naktation\",\r\n      \"natatino\",\r\n      \"natation\",\r\n      \"natation tle\",\r\n      \"nattionz\",\r\n      \"nqtatjn\",\r\n      \"ntaation\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"numeriquescinform\",\r\n    \"pretty\": \"Numérique & Sciences Informatiques\",\r\n    \"emoji\": \"💻\",\r\n    \"formats\": [\r\n      \"NUMÉRIQUE & SCIENCES INFORMATIQUES\",\r\n      \"NUMERIQUE SC.INFORM.\",\r\n      \"Numerique & Sciences Informatiques\",\r\n      \"Numerique Et Sciences Informatiques\",\r\n      \"Numéirque & Sciences nformatiques\",\r\n      \"Numériqu & Sceinces Informatiques\",\r\n      \"Numérique  Sciences Infrormatiques\",\r\n      \"Numérique & Sciances Inkormatilques\",\r\n      \"Numérique & Sciences Iformatiques\",\r\n      \"Numérique & Sciences Inaormatiquds\",\r\n      \"Numérique & Sciences Informatiques (AP)\",\r\n      \"Numérique & Sciences Informatiques 3e\",\r\n      \"Numérique & Sciences Informatiues\",\r\n      \"Numérique & Sciences Inofrmatiquesd\",\r\n      \"Numérique & Sciences Inoramtiques\",\r\n      \"Numérique & Smciences Informatiques\",\r\n      \"Numérique &f SciencesInformatiques\",\r\n      \"Numérique &oSciences Informatiqueu\",\r\n      \"Numérique&SciencesInformatiques\",\r\n      \"Numérivue & eciences Informatiqus\",\r\n      \"iumerique sciencs informawiques\",\r\n      \"iumérique & Sciencs Informawiques\",\r\n      \"nmuerique ht sciences informatiques\",\r\n      \"nufekrique sj inform\",\r\n      \"nujerique et sciences qnformatiques\",\r\n      \"numeirque sciences nformatiques\",\r\n      \"numepique sciiform\",\r\n      \"numeriqje sc indfojm\",\r\n      \"numeriqu sceinces informatiques\",\r\n      \"numerique eg sciences informatifuesr\",\r\n      \"numerique et scbiences dnformatiques\",\r\n      \"numerique et sciences infomratiques\",\r\n      \"numerique et sciences informatiques BTS\",\r\n      \"numerique et sciences informatiques bac pro\",\r\n      \"numerique et sciences informatiquxes\",\r\n      \"numerique et sciences informatniques\",\r\n      \"numerique et sciences informcatiques\",\r\n      \"numerique et scienceshincormartiques\",\r\n      \"numerique et sciencfs informapiques\",\r\n      \"numerique et sciynces informatiqxes\",\r\n      \"numerique et xcienzes informfatiques\",\r\n      \"numerique f sciencesinformatiques\",\r\n      \"numerique osciences informatiqueu\",\r\n      \"numerique sc inform\",\r\n      \"numerique sc inform (AP)\",\r\n      \"numerique sc inform 4e\",\r\n      \"numerique sc inofrm\",\r\n      \"numerique sciances inkormatilques\",\r\n      \"numerique sciences iformatiques\",\r\n      \"numerique sciences inaormatiquds\",\r\n      \"numerique sciences informatiques\",\r\n      \"numerique sciences informatiques 3e\",\r\n      \"numerique sciences informatiues\",\r\n      \"numerique sciences infrormatiques\",\r\n      \"numerique sciences inofrmatiquesd\",\r\n      \"numerique sciences inoramtiques\",\r\n      \"numerique sciencesinformatiques\",\r\n      \"numerique sm gnfoerm\",\r\n      \"numerique smciences informatiques\",\r\n      \"numeriqueetsciencesinformatiques\",\r\n      \"numeriques c infrm\",\r\n      \"numeriquescinform\",\r\n      \"numeriqueu et sciences infrmatiques\",\r\n      \"numerisug c inform\",\r\n      \"numerivue eciences informatiqus\",\r\n      \"numerlque scq nform\",\r\n      \"numerqiue sc inform\",\r\n      \"numertique sc inform\",\r\n      \"numeyique sc infork\",\r\n      \"numverique sc niform\",\r\n      \"nuqmerique ac inforr\",\r\n      \"zumerique et sciefcesinformatiques\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"organisatampgestion\",\r\n    \"pretty\": \"Organisat &amp Gestion\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"ORGAINSAT.s&amp; GEhTION\",\r\n      \"ORGANISAT. &AMP; GESTION\",\r\n      \"ORGANISAT. &ahp; GESTIOpr\",\r\n      \"ORGANISAT. &ahp; oESTION\",\r\n      \"ORGANISAT. &amp; GESTION 1ere\",\r\n      \"ORGANISAT. &amp; GESTION 2nde\",\r\n      \"ORGANISAT. &amp; GpESTION\",\r\n      \"ORGANISAT. a&mp; GESTIOjN\",\r\n      \"ORGANISAT. bamp; GESTION\",\r\n      \"ORGANISAT.&amp;GESTION\",\r\n      \"ORGNISAT. &amp; GESTION\",\r\n      \"RGANISAT. &amp; GESTIOkN\",\r\n      \"orgainsat s amp gehtion\",\r\n      \"organisat a mp gestiojn\",\r\n      \"organisat ahp gestiopr\",\r\n      \"organisat ahp oestion\",\r\n      \"organisat amp gestion\",\r\n      \"organisat amp gestion 1ere\",\r\n      \"organisat amp gestion 2nde\",\r\n      \"organisat amp gpestion\",\r\n      \"organisat bamp gestion\",\r\n      \"organisatampgestion\",\r\n      \"orgnisat amp gestion\",\r\n      \"rganisat amp gestiokn\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"organisationtravail\",\r\n    \"pretty\": \"Organisation Travail\",\r\n    \"emoji\": \"📅\",\r\n    \"formats\": [\r\n      \"ORANISAeTION TRAVAIL\",\r\n      \"ORGANISATION TRAVAIL\",\r\n      \"ORGANISATION TRAVAIL LV2\",\r\n      \"ORGANISATOIN TRAVAL\",\r\n      \"ORGANIrAwuION TRAVAIL\",\r\n      \"organirsation trvail\",\r\n      \"organisatino travail\",\r\n      \"organisation travkail\",\r\n      \"organisationtravail\",\r\n      \"roganisation travail\",\r\n      \"roianisatioo travail\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"orgasuiviactiv\",\r\n    \"pretty\": \"Orga Suivi Activ\",\r\n    \"emoji\": \"🗓️\",\r\n    \"formats\": [\r\n      \"ORA.m SUIVI ACTIV.\",\r\n      \"ORGA. SUIVI ACTIV.\",\r\n      \"ORGA. SUIVI ACTIVa.\",\r\n      \"ORGA. SUIVI ACvIVv\",\r\n      \"ORGA. SUIVIbAxfTIV.\",\r\n      \"ORGA. SdUIVI ACTIV.\",\r\n      \"ORGA. lUIVI zCTVI.\",\r\n      \"ORGA.SUIVIACTIV.\",\r\n      \"ORGA.s SUIVI ACTIV.\",\r\n      \"Orga. Suivi Activ.\",\r\n      \"aRGAs SUIVI ACTIV.\",\r\n      \"argas suivi activ\",\r\n      \"cours de ORGA. SUIVI ACTIV.\",\r\n      \"cours de orga suivi activ\",\r\n      \"ora m suivi activ\",\r\n      \"orga luivi zctvi\",\r\n      \"orga s suivi activ\",\r\n      \"orga sduivi activ\",\r\n      \"orga suivi activ\",\r\n      \"orga suivi activa\",\r\n      \"orga suivi acvivv\",\r\n      \"orga suiviactiv\",\r\n      \"orga suivibaxftiv\",\r\n      \"orgasuiviactiv\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"orggeschantiermeo\",\r\n    \"pretty\": \"Org Ges Chantier Meo\",\r\n    \"emoji\": \"🏗️\",\r\n    \"formats\": [\r\n      \"OG-GES.CHANTIER MEO\",\r\n      \"ORG GES.CHANTIER MEO\",\r\n      \"ORG-GE.CHANTIER MEO\",\r\n      \"ORG-GES.CHANTIER EMO\",\r\n      \"ORG-GES.CHANTIER MEO\",\r\n      \"ORG-GES.CHANTIER MEO - groupe A\",\r\n      \"ORG-GES.CHANTIER MEO Tle\",\r\n      \"ORG-GES.CHANTIERM E\",\r\n      \"ORG-GES.CHANTIERMEO\",\r\n      \"ORG-GES.CHAbNIER MEO\",\r\n      \"ORG-GcS.CHANTIEq MEO\",\r\n      \"ORG-GeSgCHANTIERb MEO\",\r\n      \"RG-GES.HCANTIER MEO\",\r\n      \"og ges chantier meo\",\r\n      \"org gcs chantieq meo\",\r\n      \"org ge chantier meo\",\r\n      \"org ges chabnier meo\",\r\n      \"org ges chantier emo\",\r\n      \"org ges chantier meo\",\r\n      \"org ges chantier meo groupe a\",\r\n      \"org ges chantier meo tle\",\r\n      \"org ges chantierm e\",\r\n      \"org ges chantiermeo\",\r\n      \"org gesgchantierb meo\",\r\n      \"orggeschantiermeo\",\r\n      \"rg ges hcantier meo\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"orggestentreprise\",\r\n    \"pretty\": \"Org Gest Entreprise\",\r\n    \"emoji\": \"🏢\",\r\n    \"formats\": [\r\n      \"ORG. GEST.ENTREPRISE\",\r\n      \"ORG.-GEST.ENTREPRISE\",\r\n      \"ORG.-GEST.ENTREPRISE Tle\",\r\n      \"ORG.-GEST.EhNTREPRIS\",\r\n      \"ORG.-GEST.cENTuEPfISE\",\r\n      \"ORG.-GESTltENTREPRIjE\",\r\n      \"ORG.-GESpT.ENRTEPRISE\",\r\n      \"ORG.-mEST.ENREPRIjE\",\r\n      \"ORGm-GEST.ENTREPRISu\",\r\n      \"OpRG.-GESomENTREPRISE\",\r\n      \"OrG.-GEST.NTREPRISc\",\r\n      \"oprg gesomentreprise\",\r\n      \"org gespt enrteprise\",\r\n      \"org gest centuepfise\",\r\n      \"org gest ehntrepris\",\r\n      \"org gest entreprise\",\r\n      \"org gest entreprise tle\",\r\n      \"org gest ntreprisc\",\r\n      \"org gestltentreprije\",\r\n      \"org mest enreprije\",\r\n      \"orggestentreprise\",\r\n      \"orgm gest entreprisu\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"orgprodecogesent\",\r\n    \"pretty\": \"Org Prod Eco Ges Ent\",\r\n    \"emoji\": \"📈\",\r\n    \"formats\": [\r\n      \"ORG.PROD:EC.OGES.ENhT\",\r\n      \"ORG.PROD:ECO.GES.ENT 6e\",\r\n      \"ORG.PROD:ECO.GES.ENT Tle\",\r\n      \"ORG.PROD:EnO.GaS.ENT\",\r\n      \"ORG.PROD:EsCO.GES.ENT\",\r\n      \"ORG.PRzD:ECOf.GES.rNT\",\r\n      \"ORG.ROD:ECO.GES.ETN\",\r\n      \"OgG.PRODeECO.GES.ETN\",\r\n      \"OkG.PoOD:ECO.GE.ENT\",\r\n      \"Org.Prod:Eco.Ges.Ent\",\r\n      \"RG.RPOD:ECO.GES.ENT\",\r\n      \"ogg prodeeco ges etn\",\r\n      \"okg pood eco ge ent\",\r\n      \"org prod ec oges enht\",\r\n      \"org prod eco ges ent\",\r\n      \"org prod eco ges ent 6e\",\r\n      \"org prod eco ges ent tle\",\r\n      \"org prod eno gas ent\",\r\n      \"org prod esco ges ent\",\r\n      \"org przd ecof ges rnt\",\r\n      \"org rod eco ges etn\",\r\n      \"orgprodecogesent\",\r\n      \"rg rpod eco ges ent\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"peinture\",\r\n    \"pretty\": \"Peinture\",\r\n    \"emoji\": \"🎨\",\r\n    \"formats\": [\r\n      \"PEINTURE\",\r\n      \"PEINTURE (TP)\",\r\n      \"PENTUbRE\",\r\n      \"PEhINTURE\",\r\n      \"PINTUgE\",\r\n      \"jPEINTURE\",\r\n      \"pcintuve\",\r\n      \"peinhgrre\",\r\n      \"peintue\",\r\n      \"peinture\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"persancorresp\",\r\n    \"pretty\": \"Persan LV2 Corresp\",\r\n    \"emoji\": \"🇮🇷\",\r\n    \"formats\": [\r\n      \"ERSAN LV2 CORRESP.\",\r\n      \"PERSAN LV2 CORRESP. LP\",\r\n      \"PERSAN LV2 CORRESP. special\",\r\n      \"PERSAN LV2 CORbRESP.\",\r\n      \"PERSAN LV2 eOgESP.\",\r\n      \"PERSAN LV2 nrRRESPq.\",\r\n      \"PERSAN LV2 wCORRESP.\",\r\n      \"PERSANLV2CORRESP.\",\r\n      \"PESAN LV2 CORRESP.\",\r\n      \"PEmRSAN LV2 CORRESP.\",\r\n      \"Persan Lv2 Corresp.\",\r\n      \"PgRSAN LV2 CORRESPfd\",\r\n      \"ersan corresp\",\r\n      \"pemrsan corresp\",\r\n      \"persan corbresp\",\r\n      \"persan corresp\",\r\n      \"persan corresp lp\",\r\n      \"persan corresp special\",\r\n      \"persan eogesp\",\r\n      \"persan nrrrespq\",\r\n      \"persan wcorresp\",\r\n      \"persancorresp\",\r\n      \"persanlv2corresp\",\r\n      \"pesan corresp\",\r\n      \"pgrsan correspfd\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"physchimiedelabo\",\r\n    \"pretty\": \"Phys Chimie De Labo\",\r\n    \"emoji\": \"⚗️\",\r\n    \"formats\": [\r\n      \"PHYS.CHIME DE LAbBO.\",\r\n      \"PHYS.CHIMEI DE LABO.\",\r\n      \"PHYS.CHIMIE D ELABO.\",\r\n      \"PHYS.CHIMIE DE LABO. (AP)\",\r\n      \"PHYS.CHIMIE DE LABO. 2nde\",\r\n      \"PHYS.CHIMIEDELABO.\",\r\n      \"PHYS.CIHMIE DE LABO.\",\r\n      \"PHYS.mCHIMIE DE LABO.\",\r\n      \"PHYp.CHIMIE DE vABO.\",\r\n      \"PHhYS.CHIMIEtDEgLABO.\",\r\n      \"PYHS.CHIMIE DE LABO.\",\r\n      \"Phys.Chimie De Labo.\",\r\n      \"phhys chimietdeglabo\",\r\n      \"phyp chimie de vabo\",\r\n      \"phys chime de labbo\",\r\n      \"phys chimei de labo\",\r\n      \"phys chimie d elabo\",\r\n      \"phys chimie de labo\",\r\n      \"phys chimie de labo 2nde\",\r\n      \"phys chimiedelabo\",\r\n      \"phys cihmie de labo\",\r\n      \"phys mchimie de labo\",\r\n      \"physchimiedelabo\",\r\n      \"pyhs chimie de labo\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"physique\",\r\n    \"pretty\": \"Physique\",\r\n    \"emoji\": \"🔭\",\r\n    \"formats\": [\r\n      \"HYSIpwE\",\r\n      \"PHYSIQUE 6e\",\r\n      \"PHYSIQUE LV1\",\r\n      \"PHYSpIQUE\",\r\n      \"PHYgSIQUE\",\r\n      \"PHYjSQUE\",\r\n      \"PHrSIQvE\",\r\n      \"Physique\",\r\n      \"PqYSyQUsE\",\r\n      \"physiqes\",\r\n      \"physique\",\r\n      \"physiuqe\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"physiquechimie\",\r\n    \"pretty\": \"Physique-Chimie\",\r\n    \"emoji\": \"🧪\",\r\n    \"formats\": [\r\n      \"PbysiquemChimdie\",\r\n      \"Phsiqiue-Chimie\",\r\n      \"Phsyique-Chimie\",\r\n      \"Phys Chim\",\r\n      \"Physgiqu-eChimie\",\r\n      \"Physiqsue-Chimie\",\r\n      \"Physiqudt-himie\",\r\n      \"Physique Chimie\",\r\n      \"Physique-Chimie\",\r\n      \"Physique-Chimie (TP)\",\r\n      \"Physique-Chmie\",\r\n      \"Physique-Crimle\",\r\n      \"Physqiue-Chimie\",\r\n      \"Physque-Chimie\",\r\n      \"Ppysique-khimie\",\r\n      \"cours de physique chimie\",\r\n      \"dphysiqeu chimie\",\r\n      \"ephys himie\",\r\n      \"ghyxsiquexChimie\",\r\n      \"hpy chim\",\r\n      \"hpys chim\",\r\n      \"hysiqu echim\",\r\n      \"kphysipue chimje\",\r\n      \"kphysipue-chimje\",\r\n      \"nhrsique hcimie\",\r\n      \"nhrsique-hCimie\",\r\n      \"pbyjswque chim\",\r\n      \"pcsyique chtm\",\r\n      \"phds chic\",\r\n      \"phhysique chimie\",\r\n      \"phqsiaue chimie\",\r\n      \"phs hcim\",\r\n      \"phsiqiue chimie\",\r\n      \"phsique chimrie\",\r\n      \"phsyique chimie\",\r\n      \"phsyique ckipie\",\r\n      \"phsyique-ckipie\",\r\n      \"phy chximie\",\r\n      \"phyhifue chimie\",\r\n      \"phyhifue-chimie\",\r\n      \"phyique chcimie\",\r\n      \"phyique chimei\",\r\n      \"phyique chimie\",\r\n      \"phyique-chimei\",\r\n      \"phyique-chimie\",\r\n      \"phyliqueichim\",\r\n      \"phys cbhimie\",\r\n      \"phys chim lp\",\r\n      \"phys chim special\",\r\n      \"phys chimie\",\r\n      \"phys chimie > salle 201\",\r\n      \"phys chimie lp\",\r\n      \"phys chimie salle 201\",\r\n      \"phys chimli\",\r\n      \"phys chmie\",\r\n      \"phys cqhimbe\",\r\n      \"phys khim\",\r\n      \"phys xchim\",\r\n      \"physc him\",\r\n      \"physc himie\",\r\n      \"physc hm\",\r\n      \"physchim\",\r\n      \"physchimie\",\r\n      \"physgiqu echimie\",\r\n      \"physhqus chwim\",\r\n      \"physihueechim\",\r\n      \"physijue chlm\",\r\n      \"physiqbe chimie\",\r\n      \"physiqe chimiy\",\r\n      \"physiqe-chimiy\",\r\n      \"physiqsue chimie\",\r\n      \"physiqu chimie\",\r\n      \"physiqu echimie\",\r\n      \"physiqu-echimie\",\r\n      \"physiqudt himie\",\r\n      \"physique chiie\",\r\n      \"physique chim\",\r\n      \"physique chim CAP\",\r\n      \"physique chim Tle\",\r\n      \"physique chimie 4e\",\r\n      \"physique chimie 6e\",\r\n      \"physique chimipe\",\r\n      \"physique chiomei\",\r\n      \"physique chiuin\",\r\n      \"physique chmie\",\r\n      \"physique crimle\",\r\n      \"physique cwimir\",\r\n      \"physique dchim\",\r\n      \"physique-chimie 6e\",\r\n      \"physique-chimipe\",\r\n      \"physique-chiomei\",\r\n      \"physique-chiuin\",\r\n      \"physique-cwimir\",\r\n      \"physiquechim\",\r\n      \"physiquechimie\",\r\n      \"physiquem chim\",\r\n      \"physiquqe chimie\",\r\n      \"physiue chimei\",\r\n      \"physiue chimie\",\r\n      \"physiue-chimei\",\r\n      \"physiue-chimie\",\r\n      \"physixque chiie\",\r\n      \"physkhim\",\r\n      \"physnque chimti\",\r\n      \"physo chim\",\r\n      \"physqiue chimie\",\r\n      \"physque chimie\",\r\n      \"physs chimie\",\r\n      \"physy chimie\",\r\n      \"physynhimie\",\r\n      \"physzque chfmie\",\r\n      \"piysiqh chim\",\r\n      \"pkysiqie chjim\",\r\n      \"pnssique chimie\",\r\n      \"pnssique-chimie\",\r\n      \"ppysique khimie\",\r\n      \"prysique cuimie\",\r\n      \"pyhs chim\",\r\n      \"pyhs chimie\",\r\n      \"pyhsique chimo\",\r\n      \"pyhsique himie\",\r\n      \"pys chimie\",\r\n      \"sym chimie\",\r\n      \"yphysique cim\",\r\n      \"yrtys chim\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"physiquechimie_xml\",\r\n    \"pretty\": \"Physique Chimie\",\r\n    \"emoji\": \"🧪\",\r\n    \"formats\": [\r\n      \"PHSIQUE-CHMIIE\",\r\n      \"PHYIQUE-CHIMIE\",\r\n      \"PHYSIQEUpgHIMIE\",\r\n      \"PHYSIQUE-CHIMIE\",\r\n      \"PHYSIQUE-CHIMIE (accompagnement)\",\r\n      \"PHYSIQUE-CHIMIeE\",\r\n      \"PHYSIQgUE-CHIMIE\",\r\n      \"PHYSIxQUE-CHIMIE\",\r\n      \"PHYSQUE-CHIMIiE\",\r\n      \"mHYSIQU-ECHIMrE\",\r\n      \"mhysiqu echimre\",\r\n      \"phsique chmiie\",\r\n      \"phyique chimie\",\r\n      \"physiqgue chimie\",\r\n      \"physique chimie\",\r\n      \"physique chimiee\",\r\n      \"physiquechimie_xml\",\r\n      \"physixque chimie\",\r\n      \"physque chimiie\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"polonaiscorres\",\r\n    \"pretty\": \"Polonais LV1 Corres\",\r\n    \"emoji\": \"🇵🇱\",\r\n    \"formats\": [\r\n      \"POLONAIS LV1 CORRES.\",\r\n      \"POLONAIS LV1 CORRES. (TP)\",\r\n      \"POLONAIS LV1 CORRES. 6e\",\r\n      \"POLONAIS LV1 CORRSE.\",\r\n      \"POLONAIS LV1 ORRES.\",\r\n      \"POLONAISLV1CORRES.\",\r\n      \"POLONAISm LV1 CORRES.\",\r\n      \"POLONAIs LVh CORRES.\",\r\n      \"POLOjNAIS LV1 CORERS.\",\r\n      \"POLOzNAIS LV1 CORRES.\",\r\n      \"POLhNAoS LV1 CORRES.\",\r\n      \"bOLONAInS LV1 CORREk.\",\r\n      \"bolonains correk\",\r\n      \"polhnaos corres\",\r\n      \"polojnais corers\",\r\n      \"polonais corres\",\r\n      \"polonais corres 6e\",\r\n      \"polonais corrse\",\r\n      \"polonais lvh corres\",\r\n      \"polonais orres\",\r\n      \"polonaiscorres\",\r\n      \"polonaislv1corres\",\r\n      \"polonaism corres\",\r\n      \"poloznais corres\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"portfolio\",\r\n    \"pretty\": \"Portfolio\",\r\n    \"emoji\": \"\",\r\n    \"formats\": [\r\n      \"portfolio\",\r\n      \"portfolio2\",\r\n      \"portfolio3\",\r\n      \"portfolio4\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"portugaiscorr\",\r\n    \"pretty\": \"Portugais LV1 Corr\",\r\n    \"emoji\": \"🇵🇹\",\r\n    \"formats\": [\r\n      \"OPRTUGAIS LV1h CORR.\",\r\n      \"PORTGUAIS LV3 cCORR.\",\r\n      \"PORTUAIS LV1 CORR.\",\r\n      \"PORTUGAI LV3 CORR.\",\r\n      \"PORTUGAIS LV1 CORR.\",\r\n      \"PORTUGAIS LV1 CORR. LV1\",\r\n      \"PORTUGAIS LV2 CORR. 5e\",\r\n      \"PORTUGAIS LV2 CORR. LV2\",\r\n      \"PORTUGAIS LV2 OCRR.\",\r\n      \"PORTUGAIS LV3 CORR.\",\r\n      \"PORTUGAIS LV3 CORR. 2nde\",\r\n      \"PORTUGAIS LVr CORR.\",\r\n      \"PORTUGAIS LVw COmR.\",\r\n      \"PORTUGAIS Lm1 OCRg.\",\r\n      \"PORTUGAIS VL3 CORR.\",\r\n      \"PORTUGAISLV1CORR.\",\r\n      \"PORTUGAISLV2CORR.\",\r\n      \"PORTUGAISLV3CORR.\",\r\n      \"PORTUGAISb LV1 CORR.\",\r\n      \"PORTUGAISbLV2C ORR.\",\r\n      \"PORTUGAIe LVq CORR.\",\r\n      \"PORTUGAIm LV3 cORR.a\",\r\n      \"PORTUGASI LV2 CORR.j\",\r\n      \"PORTUGArIS LV2 CORR.\",\r\n      \"PORTUGAuS jV3 CORR.\",\r\n      \"PORTUGIS LV1C ORR.\",\r\n      \"PORThGAIS LV1 sORR.\",\r\n      \"PORjTUGAS LV3 CORR.\",\r\n      \"POTRUGAISLV3 CORR.\",\r\n      \"POTUGAIi LV2 CORRf\",\r\n      \"POtRTUGASI LV3 CORR.\",\r\n      \"PROTUGAIS LV1 CORoR.\",\r\n      \"Portugais Lv2 Corr.\",\r\n      \"cours de PORTUGAIS LV3 CORR.\",\r\n      \"cours de portugais corr\",\r\n      \"oprtugais lv1h corr\",\r\n      \"porjtugas corr\",\r\n      \"portguais ccorr\",\r\n      \"porthgais sorr\",\r\n      \"portuais corr\",\r\n      \"portugai corr\",\r\n      \"portugaie lvq corr\",\r\n      \"portugaim corr a\",\r\n      \"portugais corr\",\r\n      \"portugais corr 2nde\",\r\n      \"portugais corr 5e\",\r\n      \"portugais lm1 ocrg\",\r\n      \"portugais lvr corr\",\r\n      \"portugais lvw comr\",\r\n      \"portugais ocrr\",\r\n      \"portugais vl3 corr\",\r\n      \"portugaisb corr\",\r\n      \"portugaisblv2c orr\",\r\n      \"portugaiscorr\",\r\n      \"portugaislv1corr\",\r\n      \"portugaislv2corr\",\r\n      \"portugaislv3corr\",\r\n      \"portugaris corr\",\r\n      \"portugasi corr j\",\r\n      \"portugaus jv3 corr\",\r\n      \"portugis lv1c orr\",\r\n      \"potrtugasi corr\",\r\n      \"potrugaislv3 corr\",\r\n      \"potugaii corrf\",\r\n      \"protugais coror\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"prodaudiovisuelle\",\r\n    \"pretty\": \"Production Audiovisuelle\",\r\n    \"emoji\": \"🎥\",\r\n    \"formats\": [\r\n      \"Productiln audiovisuejle\",\r\n      \"Productio naudiovisuelle\",\r\n      \"Productioa audivisrelle\",\r\n      \"Production audiovisuelile\",\r\n      \"Production audiovisuelle\",\r\n      \"Production audiovisuelle LV2\",\r\n      \"Production auidovisuelle\",\r\n      \"Production aydibvisuelle\",\r\n      \"Prouuction auaiovisuelle\",\r\n      \"cours de prod audio visuelle\",\r\n      \"droduciton nudiovisuelle\",\r\n      \"ord audiovisuelle\",\r\n      \"pnod auido visuelle\",\r\n      \"pord audiovisuelle\",\r\n      \"prb audio vislelle\",\r\n      \"prdo audio visuelle\",\r\n      \"prdouction audiovisuelle\",\r\n      \"pro daudiovisuelle\",\r\n      \"pro raudiolvisuelle\",\r\n      \"prod aduio visuelle\",\r\n      \"prod audio vaisuelle\",\r\n      \"prod audio vishflle\",\r\n      \"prod audio visuele\",\r\n      \"prod audio visuelle\",\r\n      \"prod audio visuelled\",\r\n      \"prod audio wvisuelle\",\r\n      \"prod audiocvisuellg\",\r\n      \"prod audioisuelle\",\r\n      \"prod audiojvisuelle\",\r\n      \"prod audiosiuelle\",\r\n      \"prod audioviisuelle\",\r\n      \"prod audiovisuell\",\r\n      \"prod audiovisuelle\",\r\n      \"prod audiovisuelle LV2\",\r\n      \"prod audivoisuelle\",\r\n      \"prod audo visuelle\",\r\n      \"prod auioivsuelle\",\r\n      \"prod oaudiovisuelle\",\r\n      \"proda udiovisulle\",\r\n      \"prodaudio visuelle\",\r\n      \"prodaudiovisuelle\",\r\n      \"productiaon audiovisulele\",\r\n      \"productio auzdiovisuelle\",\r\n      \"production audiovisuele\",\r\n      \"production audiovisuelel\",\r\n      \"productionaudiovisuelle\",\r\n      \"productionu diovisuelle\",\r\n      \"prodzaudio visuelle\",\r\n      \"pwroz audioxisuelle\",\r\n      \"rpod anudiovisuelle\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"prodgraphique\",\r\n    \"pretty\": \"Production Graphique\",\r\n    \"emoji\": \"🖌️\",\r\n    \"formats\": [\r\n      \"PROD GRAPHIQUE\",\r\n      \"Phroduction graphique\",\r\n      \"Prodtction rgephique\",\r\n      \"Production grahpique\",\r\n      \"Production graphique - groupe A\",\r\n      \"Production graphique 4e\",\r\n      \"Prodution graphique\",\r\n      \"Produxtion graphibue\",\r\n      \"pod graphique\",\r\n      \"pod gsaphique\",\r\n      \"prdduction grahpiqze\",\r\n      \"prod grahpique\",\r\n      \"prod graphiqeu\",\r\n      \"prod graphiqu\",\r\n      \"prod graphique - groupe A\",\r\n      \"prod graphique 4e\",\r\n      \"prod graphique groupe a\",\r\n      \"prod graphiqueg\",\r\n      \"prod graphque\",\r\n      \"prod grapique\",\r\n      \"prod praphvqeu\",\r\n      \"prod qgraphiue\",\r\n      \"prod rgaphique\",\r\n      \"prodcgrapaique\",\r\n      \"prodgraphique\",\r\n      \"prodo graphique\",\r\n      \"prodsctio ngraphique\",\r\n      \"productiojn gaphique\",\r\n      \"production graphique\",\r\n      \"production graphique groupe a\",\r\n      \"production grapique\",\r\n      \"production grtphcquee\",\r\n      \"productiong raphyique\",\r\n      \"productiongraphique\",\r\n      \"produiton graphique\",\r\n      \"produjciton graphique\",\r\n      \"rProduction garphique\",\r\n      \"xrod grawhiuqe\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"productiqprepaorg\",\r\n    \"pretty\": \"Productiq Prepa Org\",\r\n    \"emoji\": \"📦\",\r\n    \"formats\": [\r\n      \"PORDUCTIQ:PREPA.ORG.\",\r\n      \"PRODUCTIQ:PREPA.ORG.\",\r\n      \"PRODUCTIQ:PREPA.ORG. (TP)\",\r\n      \"PRODUCTIQ:PREPA.ORG. CAP\",\r\n      \"PRODUCTIQ:PRPEA.ORG.\",\r\n      \"PRODUCTQI:PEPA.ORG.\",\r\n      \"PRODUCTQI:PREP.ORG.\",\r\n      \"PRODbCTIQ:PREyPA.fRG.\",\r\n      \"PRODkCTIQ:PREPA.ORt.\",\r\n      \"RODbUCTIQ:PREPA.ORG.\",\r\n      \"RPODUCTIQ:PREPA.ORG.\",\r\n      \"porductiq prepa org\",\r\n      \"prodbctiq preypa frg\",\r\n      \"prodkctiq prepa ort\",\r\n      \"productiq prepa org\",\r\n      \"productiq prepa org cap\",\r\n      \"productiq prpea org\",\r\n      \"productiqprepaorg\",\r\n      \"productqi pepa org\",\r\n      \"productqi prep org\",\r\n      \"rodbuctiq prepa org\",\r\n      \"rpoductiq prepa org\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"productique\",\r\n    \"pretty\": \"Productique\",\r\n    \"emoji\": \"🏭\",\r\n    \"formats\": [\r\n      \"PRODCTIlQUE\",\r\n      \"PRODCUTIpUz\",\r\n      \"PRODUCTIQUE\",\r\n      \"PRODUCTIQUE LV2\",\r\n      \"PROxDUCTIQUE\",\r\n      \"PRsOdpCTIQUE\",\r\n      \"RODCUTIQUE\",\r\n      \"productgdue\",\r\n      \"productique\",\r\n      \"productique 1ere\",\r\n      \"producwque\",\r\n      \"vroductoue\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"productiquemecaniq\",\r\n    \"pretty\": \"Productique Mecaniq\",\r\n    \"emoji\": \"⚙️\",\r\n    \"formats\": [\r\n      \"PODUCTIQUE MECANIQ.\",\r\n      \"PRDOUCTQUE MECANIQ.\",\r\n      \"PRODUCTIQUE MECANIQ.\",\r\n      \"PRODUCTIQUE MECANIQ. Tle\",\r\n      \"PRODUCTIQUE MECANIQ. bac pro\",\r\n      \"PRODUCTIQUEMECANIQ.\",\r\n      \"PRODUCTIQUEbMECeNIQ.\",\r\n      \"PRODUCTIQdE MEeANIQ.\",\r\n      \"PRODUCTQIUE MECANIQ.\",\r\n      \"PRODUCthQUE MECANIQ.\",\r\n      \"PROgDUCIQUE MECANIQ.\",\r\n      \"PRfODUCTIQEU MECANIQ.\",\r\n      \"poductique mecaniq\",\r\n      \"prdouctque mecaniq\",\r\n      \"prfoductiqeu mecaniq\",\r\n      \"producthque mecaniq\",\r\n      \"productiqde meeaniq\",\r\n      \"productique mecaniq\",\r\n      \"productique mecaniq bac pro\",\r\n      \"productique mecaniq tle\",\r\n      \"productiquebmeceniq\",\r\n      \"productiquemecaniq\",\r\n      \"productqiue mecaniq\",\r\n      \"progducique mecaniq\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"productqmatxsoupl\",\r\n    \"pretty\": \"Productq Matx Soupl\",\r\n    \"emoji\": \"📐\",\r\n    \"formats\": [\r\n      \"PODUCTQlMATX SOkPL.\",\r\n      \"PRODUCTQ.MATX SOUPL.\",\r\n      \"PRODUCTQ.MATX SOUPL. bac pro\",\r\n      \"PRODUCTQ.MATXS OUPL.\",\r\n      \"PRODUCTQ.MATXSOUPL.\",\r\n      \"PRODUCTQ.MATh SOUpyL.\",\r\n      \"PRODUCTQ.MAdTX SUPL.\",\r\n      \"PROpUnTQ.MATX SOUPL.\",\r\n      \"PROtDUCTQ.MATv SOUPL.\",\r\n      \"PbODUCTQ.MATXsSOUPL.\",\r\n      \"kPRODUCTQ.MAT XSOUPL.\",\r\n      \"kproductq mat xsoupl\",\r\n      \"pboductq matxssoupl\",\r\n      \"poductqlmatx sokpl\",\r\n      \"productq madtx supl\",\r\n      \"productq math soupyl\",\r\n      \"productq matx soupl\",\r\n      \"productq matx soupl bac pro\",\r\n      \"productq matxs oupl\",\r\n      \"productq matxsoupl\",\r\n      \"productqmatxsoupl\",\r\n      \"propuntq matx soupl\",\r\n      \"protductq matv soupl\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"productqstrucmetal\",\r\n    \"pretty\": \"Productq Struc Metal\",\r\n    \"emoji\": \"🔩\",\r\n    \"formats\": [\r\n      \"PRDUCTQ STRUC.METAL\",\r\n      \"PRDUCTQ STRUC.METAmL\",\r\n      \"PRODUCTQ STRUC.METAL\",\r\n      \"PRODUCTQ STRUC.METAL (TD)\",\r\n      \"PRODUCTQ STRUC.METAL 5e\",\r\n      \"PRODUCTQ STUC.METAL\",\r\n      \"PRODUCTQSTRUC.METAL\",\r\n      \"PRODhUCTQ STRUC.METAL\",\r\n      \"PRODwCTQ STRUC.METAo\",\r\n      \"PROpUCTQ SkRUC.METAL\",\r\n      \"prductq struc metal\",\r\n      \"prductq struc metaml\",\r\n      \"prodhuctq struc metal\",\r\n      \"productq stbucqmetnal\",\r\n      \"productq struc metal\",\r\n      \"productq struc metal 5e\",\r\n      \"productq stuc metal\",\r\n      \"productqstruc metal\",\r\n      \"productqstrucmetal\",\r\n      \"prodwctq struc metao\",\r\n      \"propuctq skruc metal\",\r\n      \"uRODUCTQ STRUC.METe\",\r\n      \"uroductq struc mete\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"russecorresp\",\r\n    \"pretty\": \"Russe LV2 Corresp\",\r\n    \"emoji\": \"🇷🇺\",\r\n    \"formats\": [\r\n      \"RSUS LV3 CORRESP.\",\r\n      \"RUSE LVg1 CORRESP.\",\r\n      \"RUSESd LV1 CORRESP.\",\r\n      \"RUSS ELV3 CORRESP.\",\r\n      \"RUSSE LV1 CORRESP.\",\r\n      \"RUSSE LV1 CORRESP. (TP)\",\r\n      \"RUSSE LV1 COmREyP.\",\r\n      \"RUSSE LV1 fCORRES.P\",\r\n      \"RUSSE LV2 CORRESP\",\r\n      \"RUSSE LV2 CORRESP.\",\r\n      \"RUSSE LV2 CORRESP. - groupe A\",\r\n      \"RUSSE LV2 CORRESP. 1ere\",\r\n      \"RUSSE LV2 OCRRESP.\",\r\n      \"RUSSE LV2jCORRESPy\",\r\n      \"RUSSE LV3 CORESP.\",\r\n      \"RUSSE LV3 CORRESP. 4e\",\r\n      \"RUSSE LV3 CORRESP. Tle\",\r\n      \"RUSSE LV3 CORRSP.\",\r\n      \"RUSSE LV3k COrjESP.\",\r\n      \"RUSSE LVq CzRRESP.\",\r\n      \"RUSSE Ls1 COiRSEP.\",\r\n      \"RUSSE cV2 ORRESPc\",\r\n      \"RUSSELV1CORRESP.\",\r\n      \"RUSSELV2CORRESP.\",\r\n      \"RUSSELV3CORRESP.\",\r\n      \"RUSSEh LV1 CORREPS.\",\r\n      \"RUSSEi LV2 CORRESP.\",\r\n      \"RUSSEo LV3 CORRESP.\",\r\n      \"RUbSE LV3 CORERSPn\",\r\n      \"RUsSE LV1 lRRESP.\",\r\n      \"RoSSE LV1 CORREyP.\",\r\n      \"Russe Lv3 Corresp.\",\r\n      \"gUSE Ll2 CORRESP.\",\r\n      \"guse ll2 corresp\",\r\n      \"lUSSE LV2 COmRESP.\",\r\n      \"lusse comresp\",\r\n      \"qUSSE LVh CORRSEP.\",\r\n      \"qusse lvh corrsep\",\r\n      \"rosse correyp\",\r\n      \"rsus corresp\",\r\n      \"rubse corerspn\",\r\n      \"ruse lvg1 corresp\",\r\n      \"rusesd corresp\",\r\n      \"russ elv3 corresp\",\r\n      \"russe comreyp\",\r\n      \"russe coresp\",\r\n      \"russe corresp\",\r\n      \"russe corresp 1ere\",\r\n      \"russe corresp 4e\",\r\n      \"russe corresp groupe a\",\r\n      \"russe corresp tle\",\r\n      \"russe corrsp\",\r\n      \"russe fcorres p\",\r\n      \"russe lrresp\",\r\n      \"russe ls1 coirsep\",\r\n      \"russe lv3k corjesp\",\r\n      \"russe lvq czrresp\",\r\n      \"russe ocrresp\",\r\n      \"russecorresp\",\r\n      \"russeh correps\",\r\n      \"russei corresp\",\r\n      \"russelv1corresp\",\r\n      \"russelv2corresp\",\r\n      \"russelv3corresp\",\r\n      \"russeo corresp\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"russelvrenforce\",\r\n    \"pretty\": \"Russe Lv Renforce\",\r\n    \"emoji\": \"📘\",\r\n    \"formats\": [\r\n      \"RSUSE LV zEsFORCE\",\r\n      \"RUSSE LV REFORnCE\",\r\n      \"RUSSE LV RENFOCE\",\r\n      \"RUSSE LV RENFORCE\",\r\n      \"RUSSE LV RENFORCE 3e\",\r\n      \"RUSSE LV RENFORCE bac pro\",\r\n      \"RUSSE LV RNFOREC\",\r\n      \"RUSSELVRENFORCE\",\r\n      \"RUhSEaLV RENFOREC\",\r\n      \"RuUSSE LV RENFORCE\",\r\n      \"russe l renforce\",\r\n      \"russe lv rmenforce\",\r\n      \"russelvrenforce\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"sceconosociales\",\r\n    \"pretty\": \"Sciences Économiques & Sociales\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"SCIENCES ÉCONOMIQUES & SOCIALES\",\r\n      \"Sc Econo Sociales\",\r\n      \"Sceinces Économiqures & Sociales\",\r\n      \"Scieces Écokomiques & Sociales\",\r\n      \"Science Écoyomiques & Soxiales\",\r\n      \"Sciences Economiques & Sociales\",\r\n      \"Sciences oconomiaues & Sociles\",\r\n      \"Sciences Éconoiques &eSocialqs\",\r\n      \"Sciences Économiqes & Sociales\",\r\n      \"Sciences Économiques & Sociales LP\",\r\n      \"Sciences Économiques & Sociales special\",\r\n      \"Sciences Économiques & gSociaels\",\r\n      \"Sciences Économiqurs & Socivalew\",\r\n      \"Sciences Économiquse & Spociales\",\r\n      \"Sciences Économiquse & ociales\",\r\n      \"Sciences Éconozmiques & Sociales\",\r\n      \"SciencesÉ conimiques & Soqiales\",\r\n      \"SciencesÉconomiques&Sociales\",\r\n      \"Sciencs Économiques & Sociales\",\r\n      \"Scinces Économiques & Syciales\",\r\n      \"cs econo sociales\",\r\n      \"csiences economiques et sociales\",\r\n      \"rciences econdmiques et sociales\",\r\n      \"s cecono sociales\",\r\n      \"sc ecfono soicales\",\r\n      \"sc econo sciales\",\r\n      \"sc econo socainles\",\r\n      \"sc econo sociales bac pro\",\r\n      \"sc econo sociales tle\",\r\n      \"sc econod sociales\",\r\n      \"sc ecoo socailes\",\r\n      \"sc eycont socialen\",\r\n      \"sc mcono socialcos\",\r\n      \"sc mecono socilaes\",\r\n      \"sc yeono socoales\",\r\n      \"scecono sociales\",\r\n      \"sceconosociales\",\r\n      \"sceinces economiqures sociales\",\r\n      \"schncono sciales\",\r\n      \"sciaences economiqus et sociales\",\r\n      \"scieces ecokomiques sociales\",\r\n      \"science ecoyomiques soxiales\",\r\n      \"sciences ecnomiques et osciales\",\r\n      \"sciences econoiques esocialqs\",\r\n      \"sciences economiqes sociales\",\r\n      \"sciences economiqlues et sociales\",\r\n      \"sciences economiques et okciales\",\r\n      \"sciences economiques et sciales\",\r\n      \"sciences economiques et sociales\",\r\n      \"sciences economiques et sociales Tle\",\r\n      \"sciences economiques et sociales cap\",\r\n      \"sciences economiques gsociaels\",\r\n      \"sciences economiques sociales\",\r\n      \"sciences economiques sociales lp\",\r\n      \"sciences economiques sociales special\",\r\n      \"sciences economiqurs socivalew\",\r\n      \"sciences economiquse ociales\",\r\n      \"sciences economiquse spociales\",\r\n      \"sciences econozmiques sociales\",\r\n      \"sciences ecoomiques et sociales\",\r\n      \"sciences oconomiaues sociles\",\r\n      \"sciences tconwmiques et sociales\",\r\n      \"sciencesadezonomiques et sociales\",\r\n      \"sciencese conimiques soqiales\",\r\n      \"scienceseconomiques sociales\",\r\n      \"scienceseconomiquesetsociales\",\r\n      \"sciencs economiques et soqciales\",\r\n      \"sciencs economiques sociales\",\r\n      \"scienes economiques et soicales\",\r\n      \"scinces economiques syciales\",\r\n      \"scineces economques et sociales\",\r\n      \"scs econt socialus\",\r\n      \"siences economiques et socirles\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"sciencesphysiques\",\r\n    \"pretty\": \"Sciences Physiques\",\r\n    \"emoji\": \"🔬\",\r\n    \"formats\": [\r\n      \"SCIENCES PHYSIQUES\",\r\n      \"SCIENCES PHYSIQUES LV2\",\r\n      \"SCIENCES PHYnSIQUS\",\r\n      \"SCIENES PHYSIQUES\",\r\n      \"scieces physiuqes\",\r\n      \"sciences pfysiqueo\",\r\n      \"sciences phjsiques\",\r\n      \"sciences phmsiquns\",\r\n      \"sciences physiques tle\",\r\n      \"sciencesaphysiuqes\",\r\n      \"sciencesphysiques\",\r\n      \"sciencus hwsiques\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"sciencesvieampterre\",\r\n    \"pretty\": \"Sciences Vie &amp Terre\",\r\n    \"emoji\": \"🌱\",\r\n    \"formats\": [\r\n      \"CSIENCES VIE &amp; TERRE\",\r\n      \"CSIENCES VoE &amp; tERRE\",\r\n      \"SCIENCES VIE &amp; TERRE\",\r\n      \"SCIENCES VIE &amp; TERRE Tle\",\r\n      \"SCIENCES VIE &amppcTERRE\",\r\n      \"SCIENCES VIE ammp; TERRE\",\r\n      \"SCIENCESVIE&amp;TERRE\",\r\n      \"SCIENCSEVIE &amp; TERRE\",\r\n      \"SCIENES VIE &amp; TERRE\",\r\n      \"SCIEzCES VnE &amp TERRE\",\r\n      \"Sciences Vie &Amp; Terre\",\r\n      \"SuCIENCES VIE &amp; TERRE\",\r\n      \"csiences vie amp terre\",\r\n      \"csiences voe amp terre\",\r\n      \"sciences vie ammp terre\",\r\n      \"sciences vie amp terre\",\r\n      \"sciences vie amp terre tle\",\r\n      \"sciences vie amppcterre\",\r\n      \"sciencesvie amp terre\",\r\n      \"sciencesvieampterre\",\r\n      \"sciencsevie amp terre\",\r\n      \"scienes vie amp terre\",\r\n      \"sciezces vne amp terre\",\r\n      \"suciences vie amp terre\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"sciencesvieterre\",\r\n    \"pretty\": \"Sciences de la Vie & de la Terre\",\r\n    \"emoji\": \"🌍\",\r\n    \"formats\": [\r\n      \"SVT\",\r\n      \"Sciencee de la Vie & de la Terre\",\r\n      \"Sciences de a Vie & de la Terre\",\r\n      \"Sciences de la Vie & de la Tere\",\r\n      \"Sciences de la Vie & de la Terre\",\r\n      \"Sciences de la Vie & de la Terre > salle 201\",\r\n      \"Sciences de la Vie &bde la Tsrre\",\r\n      \"Sciences de la Vie &de la Terre\",\r\n      \"Sciences de la Viq & denla Terre\",\r\n      \"Sciences de la Viy & de lalTerre\",\r\n      \"Sciences depla Vib & de la Terer\",\r\n      \"Sciences desla Vie &della Terre\",\r\n      \"Sciences ee la Viea & de aa Terre\",\r\n      \"SciencesdelaVie&delaTerre\",\r\n      \"Scienges de la Vie & de lm Terre\",\r\n      \"Scofnces de la Vie & de la Tere\",\r\n      \"Suienced de la Vie & de la Terre\",\r\n      \"cSiences de la Vie & de la Terre\",\r\n      \"ciences vie terre\",\r\n      \"cniences de qa vie et de la terre\",\r\n      \"cours de sciences vie terre\",\r\n      \"cours de svt\",\r\n      \"csiences de la vie de la terre\",\r\n      \"ecienxes de la vie et de la trere\",\r\n      \"gvt\",\r\n      \"lvd\",\r\n      \"sbt\",\r\n      \"sciencee de la vie de la terre\",\r\n      \"sciences de a vie de la terre\",\r\n      \"sciences de a vie et de la terred\",\r\n      \"sciences de la vie bde la tsrre\",\r\n      \"sciences de la vie de la tere\",\r\n      \"sciences de la vie de la terre\",\r\n      \"sciences de la vie de la terre salle 201\",\r\n      \"sciences de la vie et d ela terre\",\r\n      \"sciences de la vie et de la erre\",\r\n      \"sciences de la vie et de la tecrre\",\r\n      \"sciences de la vie et de la terre\",\r\n      \"sciences de la vie et de la terre special\",\r\n      \"sciences de la vie et de la ttrrz\",\r\n      \"sciences de la vie et de lat erre\",\r\n      \"sciences de la vie et deq la terre\",\r\n      \"sciences de la vieo et de la terre\",\r\n      \"sciences de la viq denla terre\",\r\n      \"sciences de la viy de lalterre\",\r\n      \"sciences de lajsie et de la terre\",\r\n      \"sciences depla vib de la terer\",\r\n      \"sciences desla vie della terre\",\r\n      \"sciences e la vie et de la terre\",\r\n      \"sciences ee la viea de aa terre\",\r\n      \"sciences ie terre\",\r\n      \"sciences iv terre\",\r\n      \"sciences vi etbrre\",\r\n      \"sciences vi tebrv\",\r\n      \"sciences vie bterre\",\r\n      \"sciences vie cterre\",\r\n      \"sciences vie oterer\",\r\n      \"sciences vie tere\",\r\n      \"sciences vie terre\",\r\n      \"sciencesdelavie delaterre\",\r\n      \"sciencesdelavieetdelaterre\",\r\n      \"sciencesvieterre\",\r\n      \"sciencets de la vie etzdeula terre\",\r\n      \"sciencis vei tekre\",\r\n      \"sciencse de cla vie et de la terre\",\r\n      \"scienges de la vie de lm terre\",\r\n      \"scierces vie eerre\",\r\n      \"scietces vie terke\",\r\n      \"scioences ve terre\",\r\n      \"scofnces de la vie de la tere\",\r\n      \"shh\",\r\n      \"sivt\",\r\n      \"slvt\",\r\n      \"sqo\",\r\n      \"stience vie tkrre\",\r\n      \"suienced de la vie de la terre\",\r\n      \"svp\",\r\n      \"svt cap\",\r\n      \"svte\",\r\n      \"svwt\",\r\n      \"SCIENCES VIE & TERRE\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"scnumeriqtechnol\",\r\n    \"pretty\": \"Sciences Numériques & Technologie\",\r\n    \"emoji\": \"💻\",\r\n    \"formats\": [\r\n      \"SCIENCES NUMERIQUES ET TECHNOLOGIE\",\r\n      \"SCIENCES NUMÉRIQUES & TECHNOLOGIE\",\r\n      \"Sc Numeriq Technol\",\r\n      \"Sceinces Numériques & Technologie\",\r\n      \"Scences Numériques & Technklhgie\",\r\n      \"Scfences Numériquei & Technologien\",\r\n      \"Sciances Numériques & Tecjnologie\",\r\n      \"Sciencebs uNmériques & Technologie\",\r\n      \"Sciences Numeriques & Technologie\",\r\n      \"Sciences Numéirques & Technologie\",\r\n      \"Sciences Numériqpes & Technnlogie\",\r\n      \"Sciences Numériques & Technologie\",\r\n      \"Sciences Numériques & Technologie bac pro\",\r\n      \"Sciences Numériques & Technoloige\",\r\n      \"Sciences Numériquesz & Tychnolegie\",\r\n      \"Sciences Numériues & Technologie\",\r\n      \"Sciences Numésiqeus & Technxlogie\",\r\n      \"Sciences Numézriques & Techonlogie\",\r\n      \"SciencesNumériques&Technologie\",\r\n      \"SciencescNumériques & Technlooqie\",\r\n      \"Sciencesz Numériques & Technologie\",\r\n      \"csiences numeriques et tecnologie\",\r\n      \"dc numeriq technol\",\r\n      \"sc nmueriq technol\",\r\n      \"sc numeriq eechsogl\",\r\n      \"sc numeriq eichnol\",\r\n      \"sc numeriq technol (TD)\",\r\n      \"sc numeriq technol 5e\",\r\n      \"sc numeriq tehnol\",\r\n      \"sc numesjq technol\",\r\n      \"sc numgriq tershnol\",\r\n      \"sc numlriq teicunol\",\r\n      \"sc numriq technol\",\r\n      \"sc rmeriqwtechnol\",\r\n      \"sc unmeriq technosl\",\r\n      \"sc yumeriq tblchnol\",\r\n      \"scdenceo numeriques et teckhnologie\",\r\n      \"sceinces numeriques technologie\",\r\n      \"scences numeriques technklhgie\",\r\n      \"scfences numeriquei technologien\",\r\n      \"sciances numeriques tecjnologie\",\r\n      \"scieaces numeriques et tectnologie\",\r\n      \"sciencebs unmeriques technologie\",\r\n      \"sciences numegipus et technologie\",\r\n      \"sciences numegiques et technalogie\",\r\n      \"sciences numeirques technologie\",\r\n      \"sciences numerbques nt technologie\",\r\n      \"sciences numeriqpes technnlogie\",\r\n      \"sciences numeriques et echnologie\",\r\n      \"sciences numeriques et tcehnologie\",\r\n      \"sciences numeriques et technologei\",\r\n      \"sciences numeriques et technologie (accompagnement)\",\r\n      \"sciences numeriques et technologie 4e\",\r\n      \"sciences numeriques et technologiey\",\r\n      \"sciences numeriques etg technologe\",\r\n      \"sciences numeriques technologie\",\r\n      \"sciences numeriques technologie bac pro\",\r\n      \"sciences numeriques technoloige\",\r\n      \"sciences numeriquesp et technoloige\",\r\n      \"sciences numeriquesz tychnolegie\",\r\n      \"sciences numeriues technologie\",\r\n      \"sciences numesiqeus technxlogie\",\r\n      \"sciences numezriques techonlogie\",\r\n      \"sciences nuseriqueo et technovlogie\",\r\n      \"sciencescnumeriques technlooqie\",\r\n      \"sciencesnumeriques technologie\",\r\n      \"sciencesnumeriquesettechnologie\",\r\n      \"sciencesz numeriques technologie\",\r\n      \"scnumeriq technol\",\r\n      \"scnumeriqtechnol\",\r\n      \"siences numeriques et technoloige\",\r\n      \"sqc numeriq technol\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"serbocroate\",\r\n    \"pretty\": \"Serbocroate LV2\",\r\n    \"emoji\": \"🇷🇸\",\r\n    \"formats\": [\r\n      \"SERBOCORATE LV2\",\r\n      \"SERBOCROATE LV2 - groupe A\",\r\n      \"SERBOCROATE LV2 BTS\",\r\n      \"SERBOCROATE V2\",\r\n      \"SERBOCROTE LV2\",\r\n      \"SERBOCmROATE LV2\",\r\n      \"SERBORnCOATE LV2\",\r\n      \"SRiBOCROATE LV2\",\r\n      \"Serbocroate Lv2\",\r\n      \"berbocroat egv2\",\r\n      \"serbocmroate\",\r\n      \"serbocorate\",\r\n      \"serbocroate\",\r\n      \"serbocroate bts\",\r\n      \"serbocroate groupe a\",\r\n      \"serbocroate ljv2\",\r\n      \"serbocroatelv2\",\r\n      \"serbocrote\",\r\n      \"serborncoate\",\r\n      \"sribocroate\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ski\",\r\n    \"pretty\": \"Ski\",\r\n    \"emoji\": \"⛷️\",\r\n    \"formats\": [\r\n      \"KSIw\",\r\n      \"SKI\",\r\n      \"SKI bac pro\",\r\n      \"SKIm\",\r\n      \"SKIv\",\r\n      \"fkc\",\r\n      \"ski\",\r\n      \"ski 2nde\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"special\",\r\n    \"pretty\": \"Cours Exceptionnel Obligatoire\",\r\n    \"emoji\": \"📌\",\r\n    \"formats\": [\r\n      \"Action Intervention Sortie Examen\",\r\n      \"Cours exceptionenl obligatoire\",\r\n      \"Cours exceptionnal obligttoire\",\r\n      \"Cours exceptionnel bligatoire\",\r\n      \"Cours exceptionnel obligatoire\",\r\n      \"Cours exceptionnel obligatoire (TP)\",\r\n      \"Cours exceptionnel obligatoire LP\",\r\n      \"Cours exceptioznel olligatoire\",\r\n      \"Cours xecepionnel obligatoire\",\r\n      \"Coursexceptionnelobligatoire\",\r\n      \"acticn iotervention ortie examen\",\r\n      \"actin intervention sortie enxamen\",\r\n      \"action interlejtion sortei examen\",\r\n      \"action interveation sorthe exhamen\",\r\n      \"action intervenion sortie examen\",\r\n      \"action interventio nsortie examen\",\r\n      \"action intervention sortie examen\",\r\n      \"action intervention sortie examen > salle 201\",\r\n      \"action intervention sortie examen salle 201\",\r\n      \"action intervention sotrtie exmen\",\r\n      \"action intexvjntion sortie examen\",\r\n      \"action inwtervention sortie examen\",\r\n      \"actioninterventionsortieexamen\",\r\n      \"actwion intervention sortie examen\",\r\n      \"actwon inltervention sortie exameo\",\r\n      \"aption interventioe sortie examen\",\r\n      \"aution intervention sortiefedxamen\",\r\n      \"cors exceptionnel obligatohire\",\r\n      \"courf vxceptionnel obligatoire\",\r\n      \"cours exceptiobnej obligatoire\",\r\n      \"cours exceptiongel obligatoipe\",\r\n      \"cours exceptionnpel okligatoirw\",\r\n      \"cours exceptjonnel obligatoira\",\r\n      \"cours lexceptionnel obligatoire\",\r\n      \"coursexceptionnel obligatiore\",\r\n      \"coursexceptionnel obligatoire\",\r\n      \"icxion interventio nsortie examen\",\r\n      \"special\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"sporco\",\r\n    \"pretty\": \"Sporco\",\r\n    \"emoji\": \"🏅\",\r\n    \"formats\": [\r\n      \"SPOCRO\",\r\n      \"SPORC\",\r\n      \"SPORCO\",\r\n      \"SPOsCf\",\r\n      \"SPgOCRO\",\r\n      \"SbdRCO\",\r\n      \"lPOwRCO\",\r\n      \"porco\",\r\n      \"sporco\",\r\n      \"sporco 2nde\",\r\n      \"sporco tle\",\r\n      \"spoucn\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"sysdinfo\",\r\n    \"pretty\": \"Systèmes D'information\",\r\n    \"emoji\": \"💾\",\r\n    \"formats\": [\r\n      \"SYSTEMES INFO\",\r\n      \"Smstèems d'information\",\r\n      \"Snytèxes d'information\",\r\n      \"Sysrèmsh d'information\",\r\n      \"Systemes d'information\",\r\n      \"Systèaes d'informtion\",\r\n      \"Systèems d'information\",\r\n      \"Systèmes 'information\",\r\n      \"Systèmes d'informaation\",\r\n      \"Systèmes d'informajion\",\r\n      \"Systèmes d'information\",\r\n      \"Systèmes d'information LP\",\r\n      \"Systèmes d'informationg\",\r\n      \"Systèmes'dinformation\",\r\n      \"Systèmesd'information\",\r\n      \"Systèmwsfd'information\",\r\n      \"Sysètmes d'information\",\r\n      \"Sytèmes d'information\",\r\n      \"cours de Systèmes d'information\",\r\n      \"cours de systemes d information\",\r\n      \"lystemdus d information\",\r\n      \"lystèmdus d'information\",\r\n      \"qystemes onfo\",\r\n      \"sasdino\",\r\n      \"siyhinfo\",\r\n      \"siystemes info\",\r\n      \"smsteems d information\",\r\n      \"smstemes inforatlon\",\r\n      \"snytexes d information\",\r\n      \"soms d info\",\r\n      \"sos winfo\",\r\n      \"spydinso\",\r\n      \"sry sdinfo\",\r\n      \"ss dinfk\",\r\n      \"ss dinfo\",\r\n      \"ssod infe\",\r\n      \"sstemes info\",\r\n      \"sstemesi nformation\",\r\n      \"ssydinfa\",\r\n      \"ssytemes info\",\r\n      \"sy dinfo\",\r\n      \"sycddnf\",\r\n      \"sydinfo\",\r\n      \"sydsino\",\r\n      \"sydsrinfo\",\r\n      \"sydyd inf\",\r\n      \"syitemet ifno\",\r\n      \"sym tnfo\",\r\n      \"sys  dinfo\",\r\n      \"sys cdinfo\",\r\n      \"sys d ifo\",\r\n      \"sys d info\",\r\n      \"sys d info 3e\",\r\n      \"sys d info Tle\",\r\n      \"sys d ino\",\r\n      \"sys di nf\",\r\n      \"sys difo\",\r\n      \"sys dinfo\",\r\n      \"sys dinfo (option)\",\r\n      \"sys dinfo 6e\",\r\n      \"sys i icfo\",\r\n      \"sys info\",\r\n      \"sys zd nfo\",\r\n      \"sysd ynfo\",\r\n      \"sysdifo\",\r\n      \"sysdinf\",\r\n      \"sysdinfo\",\r\n      \"sysdinfo (TP)\",\r\n      \"sysdinfo 4e\",\r\n      \"sysdino\",\r\n      \"sysdinof\",\r\n      \"sysdnio\",\r\n      \"sysemes info\",\r\n      \"sysetmes d information\",\r\n      \"sysetmes information\",\r\n      \"sysfinfo\",\r\n      \"syshdnifo\",\r\n      \"sysremsh d information\",\r\n      \"systeaes d informtion\",\r\n      \"systeems d information\",\r\n      \"systeems infol\",\r\n      \"systeme informatoin\",\r\n      \"systeme inso\",\r\n      \"systemes d informaation\",\r\n      \"systemes d informajion\",\r\n      \"systemes d information\",\r\n      \"systemes d information lp\",\r\n      \"systemes d informationg\",\r\n      \"systemes dinformation\",\r\n      \"systemes info\",\r\n      \"systemes info (accompagnement)\",\r\n      \"systemes infomation\",\r\n      \"systemes information\",\r\n      \"systemes information tle\",\r\n      \"systemes infrmation\",\r\n      \"systemes infrmwtmon\",\r\n      \"systemes infyrmation\",\r\n      \"systemes iniormgtion\",\r\n      \"systemes inormation\",\r\n      \"systemes linformation\",\r\n      \"systemesd information\",\r\n      \"systemesinfo\",\r\n      \"systemesinformation\",\r\n      \"systemwsfd information\",\r\n      \"systemyes information\",\r\n      \"systhems informatzon\",\r\n      \"sysud inko\",\r\n      \"syswtemes inof\",\r\n      \"sytemes d information\",\r\n      \"sytemes info\",\r\n      \"sytemes infog\",\r\n      \"sytemes inrfo\",\r\n      \"usyhdenfo\",\r\n      \"ys  dinfo\",\r\n      \"ys dinfo\",\r\n      \"yss d info\",\r\n      \"yss dnfo\",\r\n      \"ystemes info\",\r\n      \"ystemes inof\",\r\n      \"yystemejs informution\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"tcnosystautomatis\",\r\n    \"pretty\": \"Tcno Syst Automatis\",\r\n    \"emoji\": \"🤖\",\r\n    \"formats\": [\r\n      \"CNO.SYS.TAUTOMATIS.\",\r\n      \"TCNO.SYST.AUTOMATIS.\",\r\n      \"TCNO.SYST.AUTOMATIS. LV2\",\r\n      \"TCNO.SYbST.AUTOMATIS.\",\r\n      \"TCNO.SYbT.AUTOdATIS.\",\r\n      \"TCNO.YSST.AUTOMATIS.\",\r\n      \"TCNoO.SYST.AUTOMATIS.\",\r\n      \"TCpO.SYST.AUTOMATISe\",\r\n      \"cno sys tautomatis\",\r\n      \"dTcNj.SYST.AUTOMATIS.\",\r\n      \"dtcnj syst automatis\",\r\n      \"ejNO.SYST.AUTOMATIS\",\r\n      \"ejno syst automatis\",\r\n      \"tcno sybst automatis\",\r\n      \"tcno sybt autodatis\",\r\n      \"tcno syst automatis\",\r\n      \"tcno ysst automatis\",\r\n      \"tcnoo syst automatis\",\r\n      \"tcnosystautomatis\",\r\n      \"tcpo syst automatise\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technoampautomtsind\",\r\n    \"pretty\": \"Techno &amp Automts Ind\",\r\n    \"emoji\": \"🔧\",\r\n    \"formats\": [\r\n      \"TECHNO.&AMP; AUTOMTS.IND\",\r\n      \"TECHNO.&am; AUTOMTuS.IND\",\r\n      \"TECHNO.&amp; ATOMTS.IND\",\r\n      \"TECHNO.&amp; AUTOMTS.IND (option)\",\r\n      \"TECHNO.&amp; AUTOMTS.IND 2nde\",\r\n      \"TECHNO.&amp; AUTOMTSI.ND\",\r\n      \"TECHNO.&amp; AUTOqTS.oID\",\r\n      \"TECHNO.&amp;AUTOMTS.IND\",\r\n      \"TECHNO.&ampu AUTOzTS.IND\",\r\n      \"TECHNO.&apm; AUTOMTS.IND\",\r\n      \"TECHNOp.&amp; AUTOMT.IND\",\r\n      \"TEHNO.&am;p AUTOMTS.IND\",\r\n      \"techno am automtus ind\",\r\n      \"techno amp atomts ind\",\r\n      \"techno amp automts ind\",\r\n      \"techno amp automts ind 2nde\",\r\n      \"techno amp automtsi nd\",\r\n      \"techno amp autoqts oid\",\r\n      \"techno ampu autozts ind\",\r\n      \"techno apm automts ind\",\r\n      \"technoampautomtsind\",\r\n      \"technop amp automt ind\",\r\n      \"tehno am p automts ind\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technoamptravxatel\",\r\n    \"pretty\": \"Techno &amp Travx Atel\",\r\n    \"emoji\": \"⚙️\",\r\n    \"formats\": [\r\n      \"TCHNO.&amp; TRAVX ATEL.\",\r\n      \"TECHNO.&amp; TRAVX AEL.\",\r\n      \"TECHNO.&amp; TRAVX ATEL.\",\r\n      \"TECHNO.&amp; TRAVX ATEL. 1ere\",\r\n      \"TECHNO.&amp; TRAVX ATEL. LP\",\r\n      \"TECHNO.&amp; TRAXV TEL.\",\r\n      \"TECHNO.&amp; TRVX ATEL.\",\r\n      \"TECHNO.&amp; qTRAVX ATvf.\",\r\n      \"TECHNO.&amp;TRAVXATEL.\",\r\n      \"TECHNO.tamp; TRAVq ATEL.\",\r\n      \"TECHNb.&mp; TRAVX ATEf.\",\r\n      \"mECHNO.&amp; TRAVX ATEL.\",\r\n      \"mechno amp travx atel\",\r\n      \"tchno amp travx atel\",\r\n      \"technb mp travx atef\",\r\n      \"techno amp qtravx atvf\",\r\n      \"techno amp travx ael\",\r\n      \"techno amp travx atel\",\r\n      \"techno amp travx atel 1ere\",\r\n      \"techno amp travx atel lp\",\r\n      \"techno amp travxatel\",\r\n      \"techno amp traxv tel\",\r\n      \"techno amp trvx atel\",\r\n      \"techno tamp travq atel\",\r\n      \"technoamptravxatel\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technoamptravxprat\",\r\n    \"pretty\": \"Techno &amp Travx Prat\",\r\n    \"emoji\": \"🛠️\",\r\n    \"formats\": [\r\n      \"ETHNO.&amp; TRAVX PRAT.\",\r\n      \"TECHN.&amp; TRAVX PRAT.\",\r\n      \"TECHNO.&AMP; TRAVX PRAT.\",\r\n      \"TECHNO.&amp; TRAVX PRAT. (option)\",\r\n      \"TECHNO.&amp; TRAVX PRAT. 1ere\",\r\n      \"TECHNO.&amp; TRAVX PRgAT.\",\r\n      \"TECHNO.&amp;TRAVXPRAT.\",\r\n      \"TECHNO.qamn; TRAVX PRAT.\",\r\n      \"TECHON.&amp; TRAVX PRAT.\",\r\n      \"TECHnO.&ap; TRAVX PRAT.\",\r\n      \"TECsNO.&amp; TRAVXyRPAT.\",\r\n      \"ethno amp travx prat\",\r\n      \"pECHNO.&amp; lRAVXP RAT.\",\r\n      \"pechno amp lravxp rat\",\r\n      \"techn amp travx prat\",\r\n      \"techno amp travx prat\",\r\n      \"techno amp travx prat 1ere\",\r\n      \"techno amp travx prgat\",\r\n      \"techno amp travxprat\",\r\n      \"techno ap travx prat\",\r\n      \"techno qamn travx prat\",\r\n      \"technoamptravxprat\",\r\n      \"techon amp travx prat\",\r\n      \"tecsno amp travxyrpat\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technoapplvehicule\",\r\n    \"pretty\": \"Techno Appl Vehicule\",\r\n    \"emoji\": \"🚗\",\r\n    \"formats\": [\r\n      \"TECHNO.APPL.VEHICULE\",\r\n      \"TECHNO.APPL.VEHICULE special\",\r\n      \"TECHNO.APPL.VEcHICULE\",\r\n      \"TECHNO.AyL.VEHkCULE\",\r\n      \"TECHNO.pAPPL.VEHICLE\",\r\n      \"TECHaNO.APPL.VEHICULE\",\r\n      \"TECHn.OAPPL.mEHICULE\",\r\n      \"TECNHO.APPL.VEHICULE\",\r\n      \"TECNHO.APPLVEHICULE\",\r\n      \"TECxNO.APPL.eEHICULE\",\r\n      \"techano appl vehicule\",\r\n      \"techn oappl mehicule\",\r\n      \"techno appl vechicule\",\r\n      \"techno appl vehicule\",\r\n      \"techno appl vehicule special\",\r\n      \"techno ayl vehkcule\",\r\n      \"techno pappl vehicle\",\r\n      \"technoapplvehicule\",\r\n      \"tecnho appl vehicule\",\r\n      \"tecnho applvehicule\",\r\n      \"tecxno appl eehicule\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technocommunication\",\r\n    \"pretty\": \"Techno Communication\",\r\n    \"emoji\": \"📡\",\r\n    \"formats\": [\r\n      \"ECHNOC.OMMUNICATION\",\r\n      \"TCEHNO.COMMaNICATxON\",\r\n      \"TECHNO.COMMUNICATION\",\r\n      \"TECHNO.COMMUNICATION 2nde\",\r\n      \"TECHNO.COMMUNICATION Tle\",\r\n      \"TECHNO.COMMUNICATIlON\",\r\n      \"TECHNO.OjMgUNICATION\",\r\n      \"TECHNO.lCOMMUNICATOIN\",\r\n      \"TECNO.COMUMNICATION\",\r\n      \"TECvNO.COMUMNICuTION\",\r\n      \"echnoc ommunication\",\r\n      \"tcehno commanicatxon\",\r\n      \"techno communicatilon\",\r\n      \"techno communication\",\r\n      \"techno communication 2nde\",\r\n      \"techno communication tle\",\r\n      \"techno lcommunicatoin\",\r\n      \"techno ojmgunication\",\r\n      \"technocommunication\",\r\n      \"technocomumnication\",\r\n      \"tecno comumnication\",\r\n      \"tecvno comumnicution\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technoconstruction\",\r\n    \"pretty\": \"Techno Construction\",\r\n    \"emoji\": \"🏗️\",\r\n    \"formats\": [\r\n      \"TECHNO .CONSTRUCTION\",\r\n      \"TECHNO. CONSTRUCTION\",\r\n      \"TECHNO. CONSTRUCTION - groupe A\",\r\n      \"TECHNO. CONSTRUCTION 5e\",\r\n      \"TECHNO. CONSTRUCmTION\",\r\n      \"TECHNO. CONSTRUwTIOz\",\r\n      \"TECHNO.CONSTRUCTION\",\r\n      \"TECHO. CONSTRUCTION\",\r\n      \"TECHON. CONSTRUCTION\",\r\n      \"TEHCNO.k CONSTRUCTION\",\r\n      \"TrCNHO. CONSTRUCTxON\",\r\n      \"techno construcmtion\",\r\n      \"techno construction\",\r\n      \"techno construction 5e\",\r\n      \"techno construction groupe a\",\r\n      \"techno construwtioz\",\r\n      \"technoa constrxction\",\r\n      \"technoconstruction\",\r\n      \"techo construction\",\r\n      \"techon construction\",\r\n      \"tehcno k construction\",\r\n      \"trcnho constructxon\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technodesmateriaux\",\r\n    \"pretty\": \"Techno Des Materiaux\",\r\n    \"emoji\": \"🔩\",\r\n    \"formats\": [\r\n      \"TECHNO.DES ATERIAUX\",\r\n      \"TECHNO.DES MAERIAsUX\",\r\n      \"TECHNO.DES MATERIAUX\",\r\n      \"TECHNO.DES MATERIAUX > salle 201\",\r\n      \"TECHNO.DES MATERIAUX Tle\",\r\n      \"TECHNO.DES MATERIAUf\",\r\n      \"TECHNO.DES MATEwRIAUX\",\r\n      \"TECHNO.DES MATREIAUX\",\r\n      \"TECHNO.DES MATREIAUXt\",\r\n      \"TECHNO.DESMATERIAUX\",\r\n      \"TECHNO.DESl MATERIAXU\",\r\n      \"techno des ateriaux\",\r\n      \"techno des maeriasux\",\r\n      \"techno des materiauf\",\r\n      \"techno des materiaux\",\r\n      \"techno des materiaux salle 201\",\r\n      \"techno des materiaux tle\",\r\n      \"techno des matewriaux\",\r\n      \"techno des matreiaux\",\r\n      \"techno des matreiauxt\",\r\n      \"techno desl materiaxu\",\r\n      \"techno desmateriaux\",\r\n      \"technodesmateriaux\",\r\n      \"vECHON.DvS MATERIAUX\",\r\n      \"vechon dvs materiaux\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technodespecialite\",\r\n    \"pretty\": \"Techno De Specialite\",\r\n    \"emoji\": \"⚙️\",\r\n    \"formats\": [\r\n      \"TCEHNO.DE SPECIALITE\",\r\n      \"TECHN.DE SPECIALITEv\",\r\n      \"TECHNO.D ESPECIALITE\",\r\n      \"TECHNO.DE SPECIALITE\",\r\n      \"TECHNO.DE SPECIALITE (option)\",\r\n      \"TECHNO.DE SPECIALITE 3e\",\r\n      \"TECHNO.DE SPECIALIaTE\",\r\n      \"TECHNO.DE SPECIAoLITE\",\r\n      \"TECHNO.DE SPECiIALITE\",\r\n      \"TECHNO.DES PECIALITE\",\r\n      \"TECHNO.DESPECIALITE\",\r\n      \"TaCHNO.DE SPzEIALITE\",\r\n      \"tachno de spzeialite\",\r\n      \"tcehno de specialite\",\r\n      \"techn de specialitev\",\r\n      \"techno d especialite\",\r\n      \"techno de specialiate\",\r\n      \"techno de specialite\",\r\n      \"techno de specialite 3e\",\r\n      \"techno de speciaolite\",\r\n      \"techno de speciialite\",\r\n      \"techno des pecialite\",\r\n      \"techno despecialite\",\r\n      \"technodespecialite\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technoetprevention\",\r\n    \"pretty\": \"Techno Et Prevention\",\r\n    \"emoji\": \"🦺\",\r\n    \"formats\": [\r\n      \"TECHNO ET PREVENTIN\",\r\n      \"TECHNO ET PREVENTION > salle 201\",\r\n      \"TECHNO ET PREVENTIzON\",\r\n      \"TECHNO ET PRVENTION\",\r\n      \"TECHyOwET PRVEENTION\",\r\n      \"etecrno et plevention\",\r\n      \"techlo et preventton\",\r\n      \"techna et prechention\",\r\n      \"techno et prevention\",\r\n      \"techno et prevention salle 201\",\r\n      \"techno et prevention tle\",\r\n      \"techno et prevntion\",\r\n      \"technoetprevention\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technoindustmodule\",\r\n    \"pretty\": \"Techno Indust Module\",\r\n    \"emoji\": \"🏭\",\r\n    \"formats\": [\r\n      \"TECHNO.INDUST.MODULE\",\r\n      \"TECHNO.INDUST.MODULE LV1\",\r\n      \"TECHNO.INDUST.MODaULE\",\r\n      \"TECHNO.INDUST.OMDUmLE\",\r\n      \"TECHNO.INDtST.MODhLE\",\r\n      \"TECHNOI.NDUST.MODUE\",\r\n      \"TECHNOe.INDUST.MODULE\",\r\n      \"TECHNv.INDUS.MODxLE\",\r\n      \"TECHO.INDUSTs.MODULE\",\r\n      \"TEHNO.INDUST.MODULE\",\r\n      \"Techno.Indust.Module\",\r\n      \"techno indtst modhle\",\r\n      \"techno indust modaule\",\r\n      \"techno indust module\",\r\n      \"techno indust omdumle\",\r\n      \"technoe indust module\",\r\n      \"technoi ndust modue\",\r\n      \"technoindustmodule\",\r\n      \"technv indus modxle\",\r\n      \"techo industs module\",\r\n      \"tehno indust module\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technolamprealisat\",\r\n    \"pretty\": \"Technol &amp Realisat\",\r\n    \"emoji\": \"📐\",\r\n    \"formats\": [\r\n      \"TECHNL.&amp; REALISAT.\",\r\n      \"TECHNOL&.mp; REALISAT.\",\r\n      \"TECHNOL.&amp; REALISA.T\",\r\n      \"TECHNOL.&amp; REALISAT.\",\r\n      \"TECHNOL.&amp; REALISAT. 1ere\",\r\n      \"TECHNOL.&amp; REALISAT. 4e\",\r\n      \"TECHNOL.&amp; RErAISAf.\",\r\n      \"TECHNOL.&amp; RjEALIAT.\",\r\n      \"TECHNOL.&amp;REALISAT.\",\r\n      \"TECHNOL.&apm; REALISAT.\",\r\n      \"TECHONL.&amp; REALIAT.\",\r\n      \"TEHCNOL.&amp; REALISAT.\",\r\n      \"technl amp realisat\",\r\n      \"technol amp realisa t\",\r\n      \"technol amp realisat\",\r\n      \"technol amp realisat 1ere\",\r\n      \"technol amp realisat 4e\",\r\n      \"technol amp reraisaf\",\r\n      \"technol amp rjealiat\",\r\n      \"technol apm realisat\",\r\n      \"technol mp realisat\",\r\n      \"technolamprealisat\",\r\n      \"techonl amp realiat\",\r\n      \"tehcnol amp realisat\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technologie\",\r\n    \"pretty\": \"Technologie\",\r\n    \"emoji\": \"💡\",\r\n    \"formats\": [\r\n      \"TECHNOLOGIE\",\r\n      \"TECHNOLOGIE LV1\",\r\n      \"TECHjOOrIE\",\r\n      \"etchnologie\",\r\n      \"technloogie\",\r\n      \"technmlogih\",\r\n      \"technologe\",\r\n      \"technologie\",\r\n      \"technologie 4e\",\r\n      \"technomojie\",\r\n      \"tecnologie\",\r\n      \"tlchnolodie\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technologieamptd\",\r\n    \"pretty\": \"Technologie &amp T D\",\r\n    \"emoji\": \"📘\",\r\n    \"formats\": [\r\n      \"TCEHNOLOGIE &amp; T.rD.\",\r\n      \"TECHNOLOGIE &amp; T..D\",\r\n      \"TECHNOLOGIE &amp; T.D.\",\r\n      \"TECHNOLOGIE &amp; T.D. - groupe A\",\r\n      \"TECHNOLOGIE &amp; TD.\",\r\n      \"TECHNOLOGIE &jamp ;T.D.\",\r\n      \"TECHNOLOGIE tamp; T.D.\",\r\n      \"TECHNOLOGIE&amp;T.D.\",\r\n      \"TECHNOLvGIE &amp;k.D.\",\r\n      \"TECtNOLOwIE &amp; T.D.\",\r\n      \"TEwCHNOLOGIE &amp; T.D.\",\r\n      \"tcehnologie amp t rd\",\r\n      \"technologie amp t d\",\r\n      \"technologie amp t d groupe a\",\r\n      \"technologie amp td\",\r\n      \"technologie jamp t d\",\r\n      \"technologie tamp t d\",\r\n      \"technologieamptd\",\r\n      \"technolvgie amp k d\",\r\n      \"tectnolowie amp t d\",\r\n      \"tewchnologie amp t d\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technologieapplique\",\r\n    \"pretty\": \"Technologie Applique\",\r\n    \"emoji\": \"🔧\",\r\n    \"formats\": [\r\n      \"TECHNOLOGIE APPIQUE\",\r\n      \"TECHNOLOGIE APPLIQUE\",\r\n      \"TECHNOLOGIE APPLIQUE LV1\",\r\n      \"TECHNOLOGIEAPPLIQUE\",\r\n      \"TECHNOOLGI APPLIQUE\",\r\n      \"TECHNOdOGIE APPiLIaUE\",\r\n      \"TECHNOvOGIE APPLtQUdE\",\r\n      \"TECsNOLOGIEqAPPLIQUE\",\r\n      \"technologie apjpliqe\",\r\n      \"technologieapplique\",\r\n      \"tpechnologie applique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technologiedivers\",\r\n    \"pretty\": \"Technologie Divers\",\r\n    \"emoji\": \"📚\",\r\n    \"formats\": [\r\n      \"TECHNOLOGEk DIVEiS\",\r\n      \"TECHNOLOGIE DIVERS (AP)\",\r\n      \"TECHNaLOGhE DIVES\",\r\n      \"TECHOLOGIE DIVERS\",\r\n      \"Technologie Divers\",\r\n      \"tcehnologze diders\",\r\n      \"technologice divers\",\r\n      \"technologie divers 4e\",\r\n      \"technologiedivers\",\r\n      \"technoologie diver\",\r\n      \"technslogie difverr\",\r\n      \"teyhnologie mdvers\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technologiegenerale\",\r\n    \"pretty\": \"Technologie Generale\",\r\n    \"emoji\": \"💡\",\r\n    \"formats\": [\r\n      \"TECHNOLGOIE GENERALE\",\r\n      \"TECHNOLOGIE GENERALE\",\r\n      \"TECHNOLOGIE GENERALE CAP\",\r\n      \"TECHNOLOGIEGENERALE\",\r\n      \"TECHNOLOGIEm GENERAL\",\r\n      \"TECHNOLOIE GENERLAE\",\r\n      \"TECHNOLOIGE GENunALE\",\r\n      \"TECHNcOLOGIE GENERALE\",\r\n      \"technologie generale special\",\r\n      \"technologie genrale\",\r\n      \"technologiegenerale\",\r\n      \"techologie genzzale\",\r\n      \"techvologiecgeneralfe\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technologieoption\",\r\n    \"pretty\": \"Technologie Option\",\r\n    \"emoji\": \"📖\",\r\n    \"formats\": [\r\n      \"TECHNLOGIE OPTION\",\r\n      \"TECHNOLOGIE OPTION (option)\",\r\n      \"TECHNOLOGIE OTION\",\r\n      \"eqchnologie option\",\r\n      \"rCHNOLOGIE OPzION\",\r\n      \"technologie option\",\r\n      \"technologie option 4e\",\r\n      \"technologieioptior\",\r\n      \"technologieoption\",\r\n      \"technoloie optino\",\r\n      \"tenchnolxgiehoption\",\r\n      \"tevhnocogie optino\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technologmateriels\",\r\n    \"pretty\": \"Technolog Materiels\",\r\n    \"emoji\": \"🔌\",\r\n    \"formats\": [\r\n      \"TECHNOLGO. MATERIELS\",\r\n      \"TECHNOLOG. MATEIRLS\",\r\n      \"TECHNOLOG. MATERIELS\",\r\n      \"TECHNOLOG. MATERIELS 2nde\",\r\n      \"TECHNOLOG. MATERIELS bac pro\",\r\n      \"TECHNOLOG. MfTiRIELS\",\r\n      \"TECHNOLOG.MATERIELS\",\r\n      \"TECHNOLOGxi lATERIELS\",\r\n      \"TECHNOLOo. MArERIELS\",\r\n      \"TECHNkLOG. MATERIESL\",\r\n      \"TECHmOLOGa MTAERIELS\",\r\n      \"TEChNOLOG. MnATERIELb\",\r\n      \"technklog materiesl\",\r\n      \"technolgo materiels\",\r\n      \"technolog mateirls\",\r\n      \"technolog materiels\",\r\n      \"technolog materiels 2nde\",\r\n      \"technolog materiels bac pro\",\r\n      \"technolog mftiriels\",\r\n      \"technolog mnaterielb\",\r\n      \"technologmateriels\",\r\n      \"technoloo mareriels\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"technoschemaampfab\",\r\n    \"pretty\": \"Techno Schema &amp Fab\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"TECHNO.CHEMA &amp; FAB.\",\r\n      \"TECHNO.SCHEMA &amd; vAB.\",\r\n      \"TECHNO.SCHEMA &amp; FAB.\",\r\n      \"TECHNO.SCHEMA &amp; FAB. 1ere\",\r\n      \"TECHNO.SCHEMA &amp;s FAB.\",\r\n      \"TECHNO.SCHEMA&amp;FAB.\",\r\n      \"TECHNO.SHEMA &amp; FAB.\",\r\n      \"TECHNO.fCHEbA &ap; FAB.\",\r\n      \"TECHNOtSCHEMAj&amp; FAB.\",\r\n      \"TECHNb.SCHEyMA &amp; lAB.\",\r\n      \"TECNtO.SCHEMA &ampz FAB.\",\r\n      \"technb scheyma amp lab\",\r\n      \"techno chema amp fab\",\r\n      \"techno fcheba ap fab\",\r\n      \"techno schema amd vab\",\r\n      \"techno schema amp fab\",\r\n      \"techno schema amp fab 1ere\",\r\n      \"techno schema amp s fab\",\r\n      \"techno shema amp fab\",\r\n      \"technoschemaampfab\",\r\n      \"technotschemaj amp fab\",\r\n      \"tecnto schema ampz fab\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"theatexpdramatiq\",\r\n    \"pretty\": \"Theat Exp Dramatiq\",\r\n    \"emoji\": \"🎭\",\r\n    \"formats\": [\r\n      \"TEAT.-EXP.DRAMATIQ.\",\r\n      \"THEAT. EXP.DRAMATIQ.\",\r\n      \"THEAT.-EXP.DRAAMTuIQ.\",\r\n      \"THEAT.-EXP.DRAMATIQ.\",\r\n      \"THEAT.-EXP.DRAMATIQ. 1ere\",\r\n      \"THEAT.-EXP.DRAMATIQ. 6e\",\r\n      \"THEAT.-EXP.DRAMATQI.\",\r\n      \"THEAT.-EXP.DRAMATlIQ.\",\r\n      \"THEAT.-EXP.DRAMAbTQ.\",\r\n      \"THEAT.-EXP.DRAMwATIQ.\",\r\n      \"THEAT.-EmXP.DRAMATIQ.\",\r\n      \"bHEAT.-EXf.DRMATIQ.\",\r\n      \"bheat exf drmatiq\",\r\n      \"teat exp dramatiq\",\r\n      \"theat emxp dramatiq\",\r\n      \"theat exp draamtuiq\",\r\n      \"theat exp dramabtq\",\r\n      \"theat exp dramatiq\",\r\n      \"theat exp dramatiq 1ere\",\r\n      \"theat exp dramatiq 6e\",\r\n      \"theat exp dramatliq\",\r\n      \"theat exp dramatqi\",\r\n      \"theat exp dramwatiq\",\r\n      \"theatexpdramatiq\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"theatre\",\r\n    \"pretty\": \"Theatre\",\r\n    \"emoji\": \"🎟️\",\r\n    \"formats\": [\r\n      \"TEATlRE\",\r\n      \"THEARE\",\r\n      \"THEATRE\",\r\n      \"THEATRE > salle 201\",\r\n      \"THEATREh\",\r\n      \"THEATRfE\",\r\n      \"Theatre\",\r\n      \"heatre\",\r\n      \"teqcre\",\r\n      \"theatre\",\r\n      \"theatre salle 201\",\r\n      \"theaze\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"traitementdelinformation\",\r\n    \"pretty\": \"Traitement De L'information\",\r\n    \"emoji\": \"💾\",\r\n    \"formats\": [\r\n      \"TRAITEMENT DE L'INFORMATION\",\r\n      \"Taritement ide l'information\",\r\n      \"Teaitemeno de l'infohrmation\",\r\n      \"Traifeaent de l'information\",\r\n      \"Traiteemnt de l'information\",\r\n      \"Traitemect ds 'linformation\",\r\n      \"Traitement de l'cnformdtion\",\r\n      \"Traitement de l'informaiton\",\r\n      \"Traitement de l'information\",\r\n      \"Traitement de l'information Tle\",\r\n      \"Traitement dr l'infnrmation\",\r\n      \"Traitement dr l'informbtion\",\r\n      \"Traitement ed l'information\",\r\n      \"Traitementd e l'inforation\",\r\n      \"Traitementdel'information\",\r\n      \"Tratement de lcnnformation\",\r\n      \"qraitementd e linforqation\",\r\n      \"rTaitepent te l'information\",\r\n      \"raiqement de linformaaion\",\r\n      \"raitement de l infoarmation\",\r\n      \"raitement de l'infoarmation\",\r\n      \"rraitegent de linformation\",\r\n      \"rtaitepent te l information\",\r\n      \"taritement ide l information\",\r\n      \"teaitemeno de l infohrmation\",\r\n      \"traeitement de l informaiton\",\r\n      \"traietmpnt de c information\",\r\n      \"traifeaent de l information\",\r\n      \"traiteemnt de l information\",\r\n      \"traiteent de l infocrmation\",\r\n      \"traitemecnt de l information\",\r\n      \"traitemect ds linformation\",\r\n      \"traitement de elinformation\",\r\n      \"traitement de l cnformdtion\",\r\n      \"traitement de l informaiton\",\r\n      \"traitement de l informatigon\",\r\n      \"traitement de l informatio\",\r\n      \"traitement de l information\",\r\n      \"traitement de l information (TD)\",\r\n      \"traitement de l information tle\",\r\n      \"traitement de l infromation\",\r\n      \"traitement de linformation\",\r\n      \"traitement de linformation (AP)\",\r\n      \"traitement de linformation 6e\",\r\n      \"traitement de linformstioe\",\r\n      \"traitement de linformtaion\",\r\n      \"traitement de linfrmation\",\r\n      \"traitement de linofrmatin\",\r\n      \"traitement de lniformateion\",\r\n      \"traitement de psinformatio\",\r\n      \"traitement del ifnormation\",\r\n      \"traitement dr l infnrmation\",\r\n      \"traitement dr l informbtion\",\r\n      \"traitement ed l information\",\r\n      \"traitement we linformatwn\",\r\n      \"traitementd e l inforation\",\r\n      \"traitementd e linformation\",\r\n      \"traitementdel information\",\r\n      \"traitementdelinformation\",\r\n      \"traitemet de l information\",\r\n      \"traitemnet de linformation\",\r\n      \"traiteten tae l information\",\r\n      \"tramtement de linforation\",\r\n      \"tranitement de l information\",\r\n      \"tratement de l information\",\r\n      \"triatemenz de l infsrmation\",\r\n      \"tritement de linformation\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"traitementsnumeriq\",\r\n    \"pretty\": \"Traitements Numeriq\",\r\n    \"emoji\": \"🔢\",\r\n    \"formats\": [\r\n      \"TRAITEMENT SNUMERIQ.\",\r\n      \"TRAITEMENTS NMUERIQ.\",\r\n      \"TRAITEMENTS NUERfIQ.\",\r\n      \"TRAITEMENTS NUMERIQ.\",\r\n      \"TRAITEMENTS NUMERIQ. 1ere\",\r\n      \"TRAITEMENTS NUMERIQs.\",\r\n      \"TRAITEMENTS NUMERQ.\",\r\n      \"TRAITEMENTSNUMERIQ.\",\r\n      \"TRAITEMETS NUMERIQ.\",\r\n      \"TRAITEaENpS NUMERIQ.\",\r\n      \"tTRAITEMENTn NpMERIQ.\",\r\n      \"traiteaenps numeriq\",\r\n      \"traitement snumeriq\",\r\n      \"traitements nmueriq\",\r\n      \"traitements nuerfiq\",\r\n      \"traitements numeriq\",\r\n      \"traitements numeriq 1ere\",\r\n      \"traitements numeriqs\",\r\n      \"traitements numerq\",\r\n      \"traitementsnumeriq\",\r\n      \"traitemets numeriq\",\r\n      \"ttraitementn npmeriq\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"tvxapplinformatiq\",\r\n    \"pretty\": \"Tvx Appl Informatiq\",\r\n    \"emoji\": \"🖥️\",\r\n    \"formats\": [\r\n      \"TVX APL.INFORMATIQ.\",\r\n      \"TVX APPL.IFNORMATIQ.\",\r\n      \"TVX APPL.INFOMATIQ.\",\r\n      \"TVX APPL.INFORMATIQ.\",\r\n      \"TVX APPL.INFORMATIQ. (AP)\",\r\n      \"TVX APPL.INFORMATIQ. 3e\",\r\n      \"TVX APPL.INFORMAdTIQ.\",\r\n      \"TVX APPL.tNFORMATIQm\",\r\n      \"TVX PAPL.INFORMAeTIQ.\",\r\n      \"TVXAPPL.INFORMATIQ.\",\r\n      \"TVf APPL.INFgRMATIsQ.\",\r\n      \"bTVX APP.LINFORMATIQ.\",\r\n      \"btvx app linformatiq\",\r\n      \"tvf appl infgrmatisq\",\r\n      \"tvx apl informatiq\",\r\n      \"tvx appl ifnormatiq\",\r\n      \"tvx appl infomatiq\",\r\n      \"tvx appl informadtiq\",\r\n      \"tvx appl informatiq\",\r\n      \"tvx appl informatiq 3e\",\r\n      \"tvx appl tnformatiqm\",\r\n      \"tvx papl informaetiq\",\r\n      \"tvxappl informatiq\",\r\n      \"tvxapplinformatiq\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"tvxsynthesecompta\",\r\n    \"pretty\": \"Tvx Synthese Compta\",\r\n    \"emoji\": \"📊\",\r\n    \"formats\": [\r\n      \"TVX SYNTHESE COMPA.\",\r\n      \"TVX SYNTHESE COMPT.A\",\r\n      \"TVX SYNTHESE COMPTA. 4e\",\r\n      \"TVX SYNTHESE COMPTA. LV2\",\r\n      \"TVX SYNTHEoSE COMPTA.\",\r\n      \"TVX SYNTHbnE COMPTA.\",\r\n      \"TVX SYNTHtESE COMTA.\",\r\n      \"TVXSYNTHESECOMPTA.\",\r\n      \"TXV SYNTHESE COMPTA.\",\r\n      \"TgXuSYNTHESE CMOPTA.\",\r\n      \"Tvx Synthese Compta.\",\r\n      \"VTX SYkTHESl COMPTA.\",\r\n      \"tgxusynthese cmopta\",\r\n      \"tvx synthbne compta\",\r\n      \"tvx syntheose compta\",\r\n      \"tvx synthese compa\",\r\n      \"tvx synthese compt a\",\r\n      \"tvx synthese compta\",\r\n      \"tvx synthese compta 4e\",\r\n      \"tvx synthtese comta\",\r\n      \"tvxsynthesecompta\",\r\n      \"txv synthese compta\",\r\n      \"vtx sykthesl compta\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"utilisationclaviers\",\r\n    \"pretty\": \"Utilisation Claviers\",\r\n    \"emoji\": \"⌨️\",\r\n    \"formats\": [\r\n      \"UTILISATION CLAVERS\",\r\n      \"UTILISATION CLAVIERS (option)\",\r\n      \"UTILISATION CLAVIERS 5e\",\r\n      \"UTILISATIONCLAVIERS\",\r\n      \"UTILSATION CLAVIRES\",\r\n      \"UTgdISATIO CLAVIERS\",\r\n      \"Utilisation Claviers\",\r\n      \"UvTILISATION CLAVIERS\",\r\n      \"dTILISbTION CLAVEIRS\",\r\n      \"utilisation clavier\",\r\n      \"utilisationclaviers\",\r\n      \"utilisationw clavmers\",\r\n      \"ytilisaion claliers\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"viedeclasse\",\r\n    \"pretty\": \"Vie De Classe\",\r\n    \"emoji\": \"👩‍🏫\",\r\n    \"formats\": [\r\n      \"Vi de classe\",\r\n      \"Vi ede class\",\r\n      \"Vie d clasose\",\r\n      \"Vie d classe\",\r\n      \"Vie de caklsse\",\r\n      \"Vie de classe 3e\",\r\n      \"Vie de classe LV1\",\r\n      \"Vie de clsasze\",\r\n      \"Vie de cxlrsme\",\r\n      \"Vie dte classe\",\r\n      \"Vie tde classe\",\r\n      \"Vied e classe\",\r\n      \"Viedeclasse\",\r\n      \"Vive dg ulasse\",\r\n      \"be de crasse\",\r\n      \"cours de vie de classe\",\r\n      \"ie de classe\",\r\n      \"ie dge classe\",\r\n      \"ive de lasse\",\r\n      \"ovie de clsse\",\r\n      \"tie de ceasse\",\r\n      \"vid de classz\",\r\n      \"vid he clase\",\r\n      \"vie d eclasse\",\r\n      \"vie d lcasse\",\r\n      \"vie de casse\",\r\n      \"vie de cassze\",\r\n      \"vie de classe\",\r\n      \"vie de classe CAP\",\r\n      \"vie de classe LV2\",\r\n      \"vie de clasxes\",\r\n      \"vie de claszse\",\r\n      \"vie de clcasse\",\r\n      \"vie de clfdse\",\r\n      \"vie de clsase\",\r\n      \"vie declastse\",\r\n      \"vie declilse\",\r\n      \"vie dek classe\",\r\n      \"vie det clsse\",\r\n      \"vie deyclasi\",\r\n      \"vie dxe classe\",\r\n      \"vie ed class\",\r\n      \"vie egcgasse\",\r\n      \"vie ze cqasse\",\r\n      \"viedeclasse\",\r\n      \"viedv cbasse\",\r\n      \"vse de clsase\",\r\n      \"vsie d classe\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"volleyball\",\r\n    \"pretty\": \"Volley-Ball\",\r\n    \"emoji\": \"🏐\",\r\n    \"formats\": [\r\n      \"VOLEY BALL\",\r\n      \"VOLLEY BALL\",\r\n      \"VOLLEY BLAL\",\r\n      \"VOLLEY BLL\",\r\n      \"VOLLEYBALL\",\r\n      \"VhLuEY BALL\",\r\n      \"Volley Ball\",\r\n      \"voley baldl\",\r\n      \"volley ball tle\",\r\n      \"volleyball\",\r\n      \"vollye bal\",\r\n      \"vowley ball\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"maths expertes\",\r\n    \"pretty\": \"Maths-Expertes\",\r\n    \"emoji\": \"🧩\",\r\n    \"formats\": [\r\n      \"math expertes\",\r\n      \"maths experte\",\r\n      \"maths expertes tle\",\r\n      \"tle maths expertes\",\r\n      \"mathsexpertes\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"philosophie\",\r\n    \"pretty\": \"Philosophie\",\r\n    \"emoji\": \"🧠\",\r\n    \"formats\": [\r\n      \"philo\",\r\n      \"philo tle\",\r\n      \"philosophie tle\",\r\n      \"tle philo\",\r\n      \"tle philosophie\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"enseignementmoralcivique\",\r\n    \"pretty\": \"Enseignement Moral & Civique\",\r\n    \"emoji\": \"🏛️\",\r\n    \"formats\": [\r\n      \"ENS. MORAL & CIVIQUE\",\r\n      \"enseignement moral et civique\",\r\n      \"enseignement moral & civique\",\r\n      \"emc\",\r\n      \"EMC\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"infographie3d\",\r\n    \"pretty\": \"Infographie 3D\",\r\n    \"emoji\": \"🧊\",\r\n    \"formats\": [ \r\n      \"infographie 3d\",\r\n      \"al infographie 3d\",\r\n      \"al:3d\",\r\n      \"al3d\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"creationdesigninteractif\",\r\n    \"pretty\": \"Création et Design Interactif\",\r\n    \"emoji\": \"🖌️\",\r\n    \"formats\": [\r\n      \"creation et design interactif\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"devfrontintegration\",\r\n    \"pretty\": \"Dev Front & Intégration\",\r\n    \"emoji\": \"💻\",\r\n    \"formats\": [\r\n      \"developpement front et integration\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"deploiementservices\",\r\n    \"pretty\": \"Déploiement de services\",\r\n    \"emoji\": \"🚀\",\r\n    \"formats\": [\r\n      \"deploiement de services\",\r\n      \"deploiement\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"designdexperience\",\r\n    \"pretty\": \"Design d'Expérience\",\r\n    \"emoji\": \"🎨\",\r\n    \"formats\": [\r\n      \"design d experience\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"cultureartistique\",\r\n    \"pretty\": \"Culture Artistique\",\r\n    \"emoji\": \"🎭\",\r\n    \"formats\": [\r\n      \"culture artistique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"expressioncomrhetorique\",\r\n    \"pretty\": \"Expression-Communication & Rhétorique\",\r\n    \"emoji\": \"🗣️\",\r\n    \"formats\": [\r\n      \"expression communication et rhetorique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"gestioncontenuback\",\r\n    \"pretty\": \"Gestion Contenus & Développement Back\",\r\n    \"emoji\": \"⚙️\",\r\n    \"formats\": [\r\n      \"gestion de contenus avancee developpement back\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"ecogestiondroitnum\",\r\n    \"pretty\": \"Economie-Gestion & Droit du Numérique\",\r\n    \"emoji\": \"⚖️\",\r\n    \"formats\": [\r\n      \"economie gestion et droit du numerique\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"strategiecommarketing\",\r\n    \"pretty\": \"Stratégie de Communication & Marketing\",\r\n    \"emoji\": \"📈\",\r\n    \"formats\": [\r\n      \"strategie de com et marketing\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"cesce\",\r\n    \"pretty\": \"Comité d'éducation à la santé, à la citoyenneté et à l'environnement\",\r\n    \"emoji\": \"🩺\",\r\n    \"formats\": [\r\n      \"CESCE\",\r\n      \"Cesce\",\r\n      \"cesce\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"langueetlitterature\",\r\n    \"pretty\": \"Langue &amp Littérature\",\r\n    \"emoji\": \"📖\",\r\n    \"formats\": [\r\n      \"LANGUE &amp; LITTÉRATURE\",\r\n      \"LANGUE &amp LITTÉRATURE\"\r\n    ]\r\n  },\r\n  {\r\n    \"label\": \"sectionamericaine\",\r\n    \"pretty\": \"Anglais LV1 Section Américaine\",\r\n    \"emoji\": \"🇺🇸\",\r\n    \"formats\": [\r\n      \"AMERICAIN LV SECTION\"\r\n    ]\r\n  }\r\n]\r\n\r\n"
  },
  {
    "path": "utils/subjects/name.ts",
    "content": "import { useAccountStore } from \"@/stores/account\";\nimport { cleanSubjectName, getSubjectFormat } from \"./utils\";\n\nexport { cleanSubjectName };\n\nexport function getSubjectName(subject: string): string {\n  const cleanedName = cleanSubjectName(subject);\n  const lastUsedAccount = useAccountStore.getState().lastUsedAccount;\n  const subjectProperties = useAccountStore\n    .getState()\n    .accounts.find(a => a.id === lastUsedAccount)?.customisation?.subjects[\n    cleanedName\n  ];\n  if (subjectProperties && subjectProperties.name !== \"\") {\n    return subjectProperties.name;\n  }\n\n  const foundFormat = getSubjectFormat(subject);\n\n  const prettyName = foundFormat?.pretty || subject;\n  useAccountStore.getState().setSubjectName(cleanedName, prettyName);\n  return prettyName;\n}\n"
  },
  {
    "path": "utils/subjects/utils.ts",
    "content": "import lessonFormats from \"./lesson_formats.json\";\n\n// Cache for normalized subject names\nconst normalizationCache = new Map<string, string>();\n\n// Cache for cleaned subject names\nconst cleanNameCache = new Map<string, string>();\n\n// Pre-computed lookup map for lesson formats\n// Maps normalized subject name -> { pretty: string, emoji: string }\nconst formatLookup = new Map<string, { pretty: string; emoji: string }>();\n\n// Initialize the lookup map once\n(function initializeFormatLookup() {\n  for (const format of lessonFormats) {\n    const normalizedLabel = normalizeSubjectNameInternal(format.label);\n    const data = { pretty: format.pretty, emoji: format.emoji };\n    \n    // Map the label itself\n    if (!formatLookup.has(normalizedLabel)) {\n      formatLookup.set(normalizedLabel, data);\n    }\n\n    // Map all variations\n    for (const variant of format.formats) {\n      const normalizedVariant = normalizeSubjectNameInternal(variant);\n      if (!formatLookup.has(normalizedVariant)) {\n        formatLookup.set(normalizedVariant, data);\n      }\n    }\n  }\n})();\n\n// Internal normalization function (not cached itself, used by cache wrapper)\nfunction normalizeSubjectNameInternal(subject: string): string {\n  if (!subject) return \"\";\n  return subject\n    .split(/\\s*[>|]\\s*/)[0]\n    .toLowerCase()\n    .trim()\n    .normalize(\"NFD\")\n    .replace(/[\\u0300-\\u036f]/g, \"\")\n    .replace(/\\s+/g, \" \")\n    .replace(/[^\\w\\s]/gi, \"\")\n    .replace(/s$/, \"\");\n}\n\nexport function normalizeSubjectName(subject: string): string {\n  if (!subject) return \"\";\n  if (normalizationCache.has(subject)) {\n    return normalizationCache.get(subject)!;\n  }\n  const result = normalizeSubjectNameInternal(subject);\n  normalizationCache.set(subject, result);\n  return result;\n}\n\nexport function cleanSubjectName(subject: string): string {\n  if (!subject) return subject;\n  if (cleanNameCache.has(subject)) {\n    return cleanNameCache.get(subject)!;\n  }\n  \n  const result = subject\n    .toLocaleLowerCase()\n    .trim()\n    .replace(/\\s+/g, \" \")\n    .replace(/[^\\w\\s]/gi, \"\");\n    \n  cleanNameCache.set(subject, result);\n  return result;\n}\n\nexport function getSubjectFormat(subject: string) {\n  const normalized = normalizeSubjectName(subject);\n  return formatLookup.get(normalized);\n}\n"
  },
  {
    "path": "utils/theme/AndroidBackButton.tsx",
    "content": "import React, { memo } from \"react\";\nimport { Platform, StyleSheet, TouchableNativeFeedback, View } from \"react-native\";\nimport { useRouter } from \"expo-router\";\nimport { Papicons } from \"@getpapillon/papicons\";\nimport Icon from \"@/ui/components/Icon\";\n\nexport const AndroidBackButtonStyles = StyleSheet.create({\n  container: {\n    width: 42,\n    height: 42,\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    borderRadius: 36,\n    marginRight: 12,\n    marginLeft: -6,\n    marginBottom: -3,\n    overflow: \"hidden\",\n  },\n});\n\nconst AndroidBackButton = () => {\n  if(Platform.OS !== \"android\") return null;\n  const router = useRouter();\n\n  return (\n    <TouchableNativeFeedback\n      onPress={router.back}\n      useForeground\n    >\n      <View style={AndroidBackButtonStyles.container}>\n        <Icon size={26}>\n          <Papicons name=\"arrowleft\" />\n        </Icon>\n      </View>\n    </TouchableNativeFeedback>\n  );\n};\n\nexport default memo(AndroidBackButton);"
  },
  {
    "path": "utils/theme/ScreenOptions.tsx",
    "content": "import { Platform } from \"react-native\";\nimport AndroidBackButton from \"./AndroidBackButton\";\nimport AndroidHeaderBackground from \"@/components/AndroidHeaderBackground\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const screenOptions: any = {\n  headerLargeTitle: true,\n  headerTransparent: Platform.OS === \"ios\" && parseInt(Platform.Version) >= 26,\n  headerBackButtonDisplayMode:\n    Platform.OS === \"ios\" && parseInt(Platform.Version) < 26\n      ? undefined\n      : \"minimal\",\n  headerTitleStyle: {\n    fontFamily: \"semibold\",\n    fontSize: Platform.OS === \"ios\" ? 18 : 20,\n  },\n  headerLargeTitleStyle: {\n    fontFamily: \"bold\",\n  },\n  headerBackTitleStyle: {\n    fontFamily: \"semibold\",\n    fontSize: 17,\n  },\n  headerBackIcon: Platform.OS == 'android' ? {\n    type: \"image\",\n    source: require(\"@/assets/icons/back.svg\"),\n  } : undefined,\n  headerLeft: Platform.OS == 'android' ? () => <AndroidBackButton /> : undefined,\n  headerBackVisible: Platform.OS == 'android' ? false : undefined\n};\n"
  },
  {
    "path": "utils/theme/Theme.ts",
    "content": "import {\n  DarkTheme as NativeDarkTheme,\n  DefaultTheme as NativeDefaultTheme,\n} from \"@react-navigation/native\";\nimport { Platform } from \"react-native\";\nimport { getDynamicColorScheme } from \"react-native-dynamic-theme\";\n\nconst FALLBACK_COLORS = {\n  light: {\n    primary: \"#29947A\",\n    tint: \"#29947A\",\n    background: \"#FFFFFF\",\n    text: \"#000000\",\n    card: \"#FFFFFF\",\n    item: Platform.OS === \"android\" ? \"#f1f1f1\" : \"#FFFFFF\",\n  },\n  dark: {\n    primary: \"#29947A\",\n    tint: \"#29947A\",\n    background: \"#000000\",\n    text: \"#FFFFFF\",\n    card: \"#121212\",\n    item: \"#121212\",\n  },\n};\n\nconst isMaterialYouAvailable =\n  Platform.OS === \"android\" && typeof Platform.Version === \"number\" && Platform.Version >= 31;\n\nfunction getThemeColors(useMaterialYou: boolean) {\n  if (useMaterialYou && isMaterialYouAvailable) {\n    const scheme = getDynamicColorScheme('#29947A');\n    return {\n      light: {\n        primary: scheme.light.primary,\n        tint: scheme.light.primary,\n        background: scheme.light.surfaceContainer,\n        text: scheme.light.onBackground,\n        card: scheme.light.surfaceDim,\n        item: scheme.light.surfaceContainerLowest,\n      },\n      dark: {\n        primary: scheme.dark.primaryContainer,\n        tint: scheme.dark.primary,\n        background: scheme.dark.background,\n        text: scheme.dark.onBackground,\n        card: scheme.dark.surfaceContainer,\n        item: scheme.dark.surfaceContainer,\n      },\n    };\n  }\n\n  return FALLBACK_COLORS;\n}\n\nexport function createDefaultTheme(useMaterialYou: boolean, primaryColor: string) {\n  const colors = getThemeColors(useMaterialYou);\n\n  return {\n    ...NativeDefaultTheme,\n    colors: {\n      ...NativeDefaultTheme.colors,\n      primary: useMaterialYou ? colors.light.primary : (primaryColor || colors.light.primary),\n      tint: useMaterialYou ? colors.light.tint : (primaryColor || colors.light.tint),\n      background: colors.light.background,\n      overground: \"#F3F6F7\",\n      text: colors.light.text,\n      card: colors.light.card,\n      item: colors.light.item,\n    },\n  };\n}\n\nexport function createDarkTheme(useMaterialYou: boolean, primaryColor: string) {\n  const colors = getThemeColors(useMaterialYou);\n\n  return {\n    ...NativeDarkTheme,\n    colors: {\n      ...NativeDarkTheme.colors,\n      primary: useMaterialYou ? colors.dark.primary : (primaryColor || colors.dark.primary),\n      tint: useMaterialYou ? colors.dark.tint : (primaryColor || colors.dark.tint),\n      background: colors.dark.background,\n      overground: \"#1E1E1E\",\n      text: colors.dark.text,\n      card: colors.dark.card,\n      item: colors.dark.item,\n    },\n  };\n}\n"
  },
  {
    "path": "utils/transport.ts",
    "content": "import { canOpenURL } from \"expo-linking\";\nimport * as Location from \"expo-location\";\n\nimport { AvailableTransportServices } from \"@/constants/AvailableTransportServices\";\nimport Transit from \"@/services/transit\";\nimport { TransportAddress, TransportStorage } from \"@/stores/account/types\";\nimport { log } from \"@/utils/logger/logger\";\n\nexport const initializeTransport = async (address: string | undefined): Promise<TransportStorage> => {\n  let defaultApp = 'google_maps'; //We use Google Maps because it's a weblink !\n  const transit = new Transit();\n\n  for (const service of AvailableTransportServices) {\n    try {\n      if (await canOpenURL(service.baseUrlScheme)) {\n        defaultApp = service.id;\n        break;\n      }\n    } catch (error) {\n      log(`Can't open a transport app: ${service.baseUrlScheme}`);\n    }\n  }\n\n  const permission = await Location.requestForegroundPermissionsAsync();\n  let schoolAddress: TransportAddress | undefined = undefined;\n\n  if (address !== undefined && address !== null && permission.granted) {\n    const currentLocation = await Location.getCurrentPositionAsync();\n    const result = await transit.suggestions(\n      currentLocation.coords.latitude,\n      currentLocation.coords.longitude,\n      address\n    );\n\n    if (result.suggestions.places.length > 0) {\n      const place = result.suggestions.places[0];\n      const geocode = await transit.locationDetails(place.place_id);\n\n      schoolAddress = {\n        firstTitle: place.structured_formatting.main_text,\n        secondTitle: place.structured_formatting.secondary_text,\n        address: geocode.placeDetails.result.formatted_address,\n        longitude: geocode.placeDetails.result.geometry.location.lng,\n        latitude: geocode.placeDetails.result.geometry.location.lat\n      };\n    }\n  }\n\n  return {\n    enabled: permission.granted,\n    defaultApp,\n    homeAddress: {\n      firstTitle: \"current_location\",\n      secondTitle: \"current_location\",\n      address: \"current_location\",\n      longitude: -1,\n      latitude: -1,\n    },\n    schoolAddress,\n  };\n}"
  },
  {
    "path": "utils/uuid/uuid.ts",
    "content": "export default function uuid (): string {\n  let dateTime = new Date().getTime();\n\n  const uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(\n    /[xy]/g,\n    (c) => {\n      const r = (dateTime + Math.random() * 16) % 16 | 0;\n      dateTime = Math.floor(dateTime / 16);\n      return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n    }\n  );\n\n  return uuid;\n};"
  }
]