diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d3974a5..5964fc6 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -22,9 +22,13 @@ + + diff --git a/android/app/src/main/java/com/anonymous/lumicheck/FloatingBubbleService.kt b/android/app/src/main/java/com/anonymous/lumicheck/FloatingBubbleService.kt index 4ca46e6..d0bd90b 100644 --- a/android/app/src/main/java/com/anonymous/lumicheck/FloatingBubbleService.kt +++ b/android/app/src/main/java/com/anonymous/lumicheck/FloatingBubbleService.kt @@ -104,7 +104,7 @@ class FloatingBubbleService : Service() { closeView?.visibility = View.GONE if (isOverCloseArea()) { stopSelf() - } else { + } else if (isDragging) { snapToEdge(params) } diff --git a/android/app/src/main/java/com/anonymous/lumicheck/MyWorker.kt b/android/app/src/main/java/com/anonymous/lumicheck/MyWorker.kt index 1ea984d..a68e103 100644 --- a/android/app/src/main/java/com/anonymous/lumicheck/MyWorker.kt +++ b/android/app/src/main/java/com/anonymous/lumicheck/MyWorker.kt @@ -24,9 +24,12 @@ class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(contex return try { val userId = prefs.getInt("USER_ID", -1).takeIf { it != -1 } ?: return Result.success() + + val token = prefs.getString("AUTH_TOKEN", null) + ?: return Result.success() val screenData = getScreenTimeData() - val success = sendToApi(userId, screenData) + val success = sendToApi(userId, token, screenData) if (success) Result.success() else Result.retry() } catch (e: Exception) { @@ -46,13 +49,14 @@ class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(contex } } - private fun sendToApi(userId: Int, data: ScreenTimeData): Boolean { + private fun sendToApi(userId: Int, token: String, data: ScreenTimeData): Boolean { return try { val jsonBody = createRequestBody(userId, data) val request = Request.Builder() .url("https://king-prawn-app-3re4n.ondigitalocean.app/screentime/") .post(jsonBody) .addHeader("Content-Type", "application/json") + .addHeader("Authorization", "Bearer ${token}") .build() client.newCall(request).execute().use { response -> diff --git a/android/app/src/main/java/com/anonymous/lumicheck/WorkManagerModule.kt b/android/app/src/main/java/com/anonymous/lumicheck/WorkManagerModule.kt index 79e2f20..30bd939 100644 --- a/android/app/src/main/java/com/anonymous/lumicheck/WorkManagerModule.kt +++ b/android/app/src/main/java/com/anonymous/lumicheck/WorkManagerModule.kt @@ -25,6 +25,11 @@ class WorkManagerModule(reactContext: ReactApplicationContext) : ReactContextBas prefs.edit().putInt("USER_ID", userId).apply() } + @ReactMethod + fun setAuthToken(token: String) { + prefs.edit().putString("AUTH_TOKEN", token).apply() + } + @ReactMethod fun startWork() { try { diff --git a/android/app/src/main/res/drawable-hdpi/ic_notification.png b/android/app/src/main/res/drawable-hdpi/ic_notification.png new file mode 100644 index 0000000..eed1d5f Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/ic_notification.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_notification.png b/android/app/src/main/res/drawable-mdpi/ic_notification.png new file mode 100644 index 0000000..2b2b88e Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/ic_notification.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_notification.png b/android/app/src/main/res/drawable-xhdpi/ic_notification.png new file mode 100644 index 0000000..ab445dd Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/ic_notification.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_notification.png b/android/app/src/main/res/drawable-xxhdpi/ic_notification.png new file mode 100644 index 0000000..6222f5c Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/ic_notification.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_notification.png b/android/app/src/main/res/drawable-xxxhdpi/ic_notification.png new file mode 100644 index 0000000..5a1fa75 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_notification.png differ diff --git a/android/app/src/main/res/drawable/ic_notification.png b/android/app/src/main/res/drawable/ic_notification.png new file mode 100644 index 0000000..37bd340 Binary files /dev/null and b/android/app/src/main/res/drawable/ic_notification.png differ diff --git a/android/app/src/main/res/drawable/ic_notification.xml b/android/app/src/main/res/drawable/ic_notification2.xml similarity index 100% rename from android/app/src/main/res/drawable/ic_notification.xml rename to android/app/src/main/res/drawable/ic_notification2.xml diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 3941bea..25625ec 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 3941bea..25625ec 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..674df1d Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index 3e229e3..0000000 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d974c32 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp deleted file mode 100644 index 575b837..0000000 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..0b1acad Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b67f9be..0000000 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..97dbb10 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 6fc11dc..0000000 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..61a13ce Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp deleted file mode 100644 index df80221..0000000 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..e02eccb Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index 25b3bc7..0000000 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..279cc04 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 55fd016..0000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..65d5f82 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp deleted file mode 100644 index 13addd1..0000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..5821f57 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index b9e524d..0000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..200b602 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index d918c8d..0000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..80a5076 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp deleted file mode 100644 index 5ddf0aa..0000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..269e3a9 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 47e0d13..0000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..24fe391 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index 5ea54e9..0000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..3e97d03 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp deleted file mode 100644 index 523cfc0..0000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..ef91b85 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9622999..0000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/app.json b/app.json index 5c8ebb5..a7a6dbc 100644 --- a/app.json +++ b/app.json @@ -4,12 +4,12 @@ "slug": "lumicheck", "version": "1.0.0", "orientation": "portrait", - "icon": "./assets/lumis/Lumi4k.png", + "icon": "./assets/icons/icon.png", "userInterfaceStyle": "automatic", "newArchEnabled": true, "scheme": "lumicheck", "splash": { - "image": "./assets/lumis/Lumi4k.png", + "image": "./assets/icons/icon.png", "resizeMode": "contain", "backgroundColor": "#ffffff" }, @@ -43,7 +43,14 @@ }, "plugins": [ "expo-font", - "expo-dev-client" + "expo-dev-client", + "@react-native-firebase/app", + [ + "@react-native-firebase/messaging", + { + "backgroundMessageHandler": "./src/firebase-messaging.js" + } + ] ] } } diff --git a/assets/trophies/apenantes.svg b/assets/trophies/apenantes.svg deleted file mode 100644 index 725b43f..0000000 --- a/assets/trophies/apenantes.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/trophies/aprocuradeajuda.svg b/assets/trophies/aprocuradeajuda.svg new file mode 100644 index 0000000..3dd74c5 --- /dev/null +++ b/assets/trophies/aprocuradeajuda.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/trophies/autoconsciente.svg b/assets/trophies/autoconsciente.svg index f71e709..f267ac6 100644 --- a/assets/trophies/autoconsciente.svg +++ b/assets/trophies/autoconsciente.svg @@ -1 +1,12 @@ - \ No newline at end of file + + + + + + + + + + + + diff --git a/assets/trophies/bomdiaalegria.svg b/assets/trophies/bomdiaalegria.svg deleted file mode 100644 index 805f742..0000000 --- a/assets/trophies/bomdiaalegria.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/trophies/bomprogresso.svg b/assets/trophies/bomprogresso.svg deleted file mode 100644 index 6cfbfc6..0000000 --- a/assets/trophies/bomprogresso.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/trophies/chest.png b/assets/trophies/chest.png deleted file mode 100644 index 3acb1e7..0000000 Binary files a/assets/trophies/chest.png and /dev/null differ diff --git a/assets/trophies/curioso.svg b/assets/trophies/curioso.svg new file mode 100644 index 0000000..1f601fd --- /dev/null +++ b/assets/trophies/curioso.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/trophies/dedicado.svg b/assets/trophies/dedicado.svg index 24262d9..65fe69f 100644 --- a/assets/trophies/dedicado.svg +++ b/assets/trophies/dedicado.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + diff --git a/assets/trophies/detox.svg b/assets/trophies/detox.svg deleted file mode 100644 index a7869a2..0000000 --- a/assets/trophies/detox.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/trophies/diadedetox.svg b/assets/trophies/diadedetox.svg new file mode 100644 index 0000000..d27260a --- /dev/null +++ b/assets/trophies/diadedetox.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/trophies/horaderecolher.svg b/assets/trophies/horaderecolher.svg new file mode 100644 index 0000000..3f654de --- /dev/null +++ b/assets/trophies/horaderecolher.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/trophies/index.js b/assets/trophies/index.js new file mode 100644 index 0000000..9794045 --- /dev/null +++ b/assets/trophies/index.js @@ -0,0 +1,51 @@ +import React from 'react'; +import AProcuradeAjuda from './aprocuradeajuda.svg'; +import Autoconsciente from './autoconsciente.svg'; +import Curioso from './curioso.svg'; +import Dedicado from './dedicado.svg'; +import DiaDeDetox from './diadedetox.svg'; +import HoraDeRecolher from './horaderecolher.svg'; +import Marcodos20 from './marcodos20.svg'; +import ModoZen from './modozen.svg'; +import Perfecionista from './perfecionista.svg'; +import PrimeiroPasso from './primeiropasso.svg'; +import BlockedTrophy from './trophyblocked.svg'; + +const trophies = { + aprocuradeajuda: AProcuradeAjuda, + autoconsciente: Autoconsciente, + curioso: Curioso, + dedicado: Dedicado, + diadedetox: DiaDeDetox, + horaderecolher: HoraDeRecolher, + marcodos20: Marcodos20, + modozen: ModoZen, + perfecionista: Perfecionista, + primeiropasso: PrimeiroPasso, + blocked: BlockedTrophy, +}; + +export const getTrophyIcon = (iconName) => { + if (!iconName) return BlockedTrophy; + + // Remove a extensão .svg se existir e converte para chave do objeto + const key = iconName.replace('.svg', '').toLowerCase(); + return trophies[key] || BlockedTrophy; +}; + +// Exporta os componentes individuais também +export { + AProcuradeAjuda, + Autoconsciente, + Curioso, + Dedicado, + DiaDeDetox, + HoraDeRecolher, + Marcodos20, + ModoZen, + Perfecionista, + PrimeiroPasso, + BlockedTrophy as DefaultTrophy, +}; + +export default trophies; diff --git a/assets/trophies/iniciopromissor.svg b/assets/trophies/iniciopromissor.svg deleted file mode 100644 index 9173983..0000000 --- a/assets/trophies/iniciopromissor.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/trophies/marcodos20.svg b/assets/trophies/marcodos20.svg index fe36f6f..7130b98 100644 --- a/assets/trophies/marcodos20.svg +++ b/assets/trophies/marcodos20.svg @@ -1 +1,22 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/trophies/modozen.svg b/assets/trophies/modozen.svg new file mode 100644 index 0000000..8cf9919 --- /dev/null +++ b/assets/trophies/modozen.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/trophies/perfeccionista.svg b/assets/trophies/perfeccionista.svg deleted file mode 100644 index fb97d96..0000000 --- a/assets/trophies/perfeccionista.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/trophies/perfecionista.svg b/assets/trophies/perfecionista.svg new file mode 100644 index 0000000..74fb098 --- /dev/null +++ b/assets/trophies/perfecionista.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/trophies/primeiropasso.svg b/assets/trophies/primeiropasso.svg index 5e63465..e54d3ff 100644 --- a/assets/trophies/primeiropasso.svg +++ b/assets/trophies/primeiropasso.svg @@ -1 +1,12 @@ - \ No newline at end of file + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index 94310ad..c1ee999 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "@react-navigation/native": "^7.0.14", "@react-navigation/native-stack": "^7.2.0", "@reduxjs/toolkit": "^2.6.1", + "events": "^3.3.0", "expo": "^53.0.9", "expo-blur": "~14.1.4", "expo-dev-client": "~5.2.0", @@ -28,7 +29,6 @@ "expo-linear-gradient": "~14.1.4", "expo-linking": "^7.1.5", "expo-location": "~18.1.5", - "expo-notifications": "~0.31.2", "expo-splash-screen": "~0.30.8", "expo-status-bar": "~2.2.3", "jwt-decode": "^4.0.0", @@ -115,30 +115,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -154,13 +154,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -170,25 +170,25 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -219,12 +219,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, @@ -236,9 +236,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", - "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -290,14 +290,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -328,14 +328,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -402,27 +402,27 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" @@ -515,12 +515,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", - "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -583,12 +583,12 @@ } }, "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz", - "integrity": "sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", + "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -765,12 +765,12 @@ } }, "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.9.tgz", - "integrity": "sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", + "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -780,12 +780,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", - "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -795,12 +795,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -951,12 +951,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -966,12 +966,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -981,14 +981,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -998,14 +998,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1030,12 +1030,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", + "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1045,13 +1045,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1061,16 +1061,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", "globals": "^11.1.0" }, "engines": { @@ -1081,13 +1081,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1097,12 +1097,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1112,12 +1112,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1127,13 +1127,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", - "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-flow": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1143,13 +1143,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1159,14 +1159,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1176,12 +1176,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1191,12 +1191,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1221,13 +1221,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1237,13 +1237,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1253,12 +1253,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1268,12 +1268,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1283,14 +1283,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", + "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.3", + "@babel/plugin-transform-parameters": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1316,12 +1317,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1331,13 +1332,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1347,12 +1348,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1362,13 +1363,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1378,14 +1379,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1459,12 +1460,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1474,12 +1475,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1505,13 +1506,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", + "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1521,15 +1521,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz", + "integrity": "sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, @@ -1541,12 +1541,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1556,13 +1556,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1572,12 +1572,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1587,12 +1587,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1602,16 +1602,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1621,13 +1621,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1657,16 +1657,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", - "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-typescript": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1676,13 +1676,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } @@ -1702,16 +1699,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1721,16 +1718,16 @@ }, "node_modules/@babel/traverse--for-generate-function-map": { "name": "@babel/traverse", - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1739,9 +1736,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1770,29 +1767,29 @@ "license": "MIT" }, "node_modules/@expo/cli": { - "version": "0.24.13", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.24.13.tgz", - "integrity": "sha512-2LSdbvYs+WmUljnplQXMCUyNzyX4H+F4l8uExfA1hud25Bl5kyaGrx1jjtgNxMTXmfmMjvgBdK798R50imEhkA==", + "version": "0.24.15", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.24.15.tgz", + "integrity": "sha512-RDZS30OSnbXkSPnBXdyPL29KbltjOmegE23bZZDiGV23WOReWcPgRc5U7Fd8eLPhtRjHBKlBpNJMTed5Ntr/uw==", "license": "MIT", "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@babel/runtime": "^7.20.0", "@expo/code-signing-certificates": "^0.0.5", "@expo/config": "~11.0.10", - "@expo/config-plugins": "~10.0.2", + "@expo/config-plugins": "~10.0.3", "@expo/devcert": "^1.1.2", "@expo/env": "~1.0.5", "@expo/image-utils": "^0.7.4", "@expo/json-file": "^9.1.4", - "@expo/metro-config": "~0.20.14", + "@expo/metro-config": "~0.20.15", "@expo/osascript": "^2.2.4", "@expo/package-manager": "^1.8.4", "@expo/plist": "^0.3.4", - "@expo/prebuild-config": "^9.0.6", + "@expo/prebuild-config": "^9.0.7", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.79.2", + "@react-native/dev-middleware": "0.79.4", "@urql/core": "^5.0.6", "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", @@ -1807,7 +1804,7 @@ "debug": "^4.3.4", "env-editor": "^0.4.1", "freeport-async": "^2.0.0", - "getenv": "^1.0.0", + "getenv": "^2.0.0", "glob": "^10.4.2", "lan-network": "^0.1.6", "minimatch": "^9.0.0", @@ -1841,30 +1838,6 @@ "expo-internal": "build/bin/cli" } }, - "node_modules/@expo/cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@expo/cli/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@expo/cli/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -1909,18 +1882,18 @@ } }, "node_modules/@expo/config-plugins": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-10.0.2.tgz", - "integrity": "sha512-TzUn3pPdpwCS0yYaSlZOClgDmCX8N4I2lfgitX5oStqmvpPtB+vqtdyqsVM02fQ2tlJIAqwBW+NHaHqqy8Jv7g==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-10.0.3.tgz", + "integrity": "sha512-fjCckkde67pSDf48x7wRuPsgQVIqlDwN7NlOk9/DFgQ1hCH0L5pGqoSmikA1vtAyiA83MOTpkGl3F3wyATyUog==", "license": "MIT", "dependencies": { - "@expo/config-types": "^53.0.3", + "@expo/config-types": "^53.0.4", "@expo/json-file": "~9.1.4", "@expo/plist": "^0.3.4", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", - "getenv": "^1.0.0", + "getenv": "^2.0.0", "glob": "^10.4.2", "resolve-from": "^5.0.0", "semver": "^7.5.4", @@ -1957,6 +1930,15 @@ "@babel/highlight": "^7.10.4" } }, + "node_modules/@expo/config/node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@expo/config/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -2002,10 +1984,19 @@ "getenv": "^1.0.0" } }, + "node_modules/@expo/env/node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@expo/fingerprint": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.12.4.tgz", - "integrity": "sha512-HOJVvjiQYVHIouCOfFf4JRrQvBDIV/12GVG2iwbw1iGwmpQVkPgEXa9lN0f2yuS4J3QXHs73wr9jvuCjMmJlfw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.13.1.tgz", + "integrity": "sha512-MgZ5uIvvwAnjWeQoj4D3RnBXjD1GNOpCvhp2jtZWdQ8yEokhDEJGoHjsMT8/NCB5m2fqP5sv2V5nPzC7CN1YjQ==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -2013,7 +2004,9 @@ "chalk": "^4.1.2", "debug": "^4.3.4", "find-up": "^5.0.0", - "getenv": "^1.0.0", + "getenv": "^2.0.0", + "glob": "^10.4.2", + "ignore": "^5.3.1", "minimatch": "^9.0.0", "p-limit": "^3.1.0", "resolve-from": "^5.0.0", @@ -2023,30 +2016,6 @@ "fingerprint": "bin/cli.js" } }, - "node_modules/@expo/fingerprint/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@expo/fingerprint/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@expo/fingerprint/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -2076,6 +2045,15 @@ "unique-string": "~2.0.0" } }, + "node_modules/@expo/image-utils/node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@expo/image-utils/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -2108,16 +2086,16 @@ } }, "node_modules/@expo/metro-config": { - "version": "0.20.14", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.20.14.tgz", - "integrity": "sha512-tYDDubuZycK+NX00XN7BMu73kBur/evOPcKfxc+UBeFfgN2EifOITtdwSUDdRsbtJ2OnXwMY1HfRUG3Lq3l4cw==", + "version": "0.20.15", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.20.15.tgz", + "integrity": "sha512-m8i58IQ7I8iOdVRfOhFmhPMHuhgeTVfQp1+mxW7URqPZaeVbuDVktPqOiNoHraKBoGPLKMUSsD+qdUuJVL3wMg==", "license": "MIT", "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", "@babel/parser": "^7.20.0", "@babel/types": "^7.20.0", - "@expo/config": "~11.0.9", + "@expo/config": "~11.0.10", "@expo/env": "~1.0.5", "@expo/json-file": "~9.1.4", "@expo/spawn-async": "^1.7.2", @@ -2125,7 +2103,7 @@ "debug": "^4.3.2", "dotenv": "~16.4.5", "dotenv-expand": "~11.0.6", - "getenv": "^1.0.0", + "getenv": "^2.0.0", "glob": "^10.4.2", "jsc-safe-url": "^0.2.4", "lightningcss": "~1.27.0", @@ -2134,28 +2112,32 @@ "resolve-from": "^5.0.0" } }, - "node_modules/@expo/metro-config/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@expo/metro-config/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@expo/metro-config/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^10 || ^12 || >=14" } }, "node_modules/@expo/metro-runtime": { @@ -2206,17 +2188,17 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-9.0.6.tgz", - "integrity": "sha512-HDTdlMkTQZ95rd6EpvuLM+xkZV03yGLc38FqI37qKFLJtUN1WnYVaWsuXKoljd1OrVEVsHe6CfqKwaPZ52D56Q==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-9.0.7.tgz", + "integrity": "sha512-1w5MBp6NdF51gPGp0HsCZt0QC82hZWo37wI9HfxhdQF/sN/92Mh4t30vaY7gjHe71T5QNyab00oxZH/wP0MDgQ==", "license": "MIT", "dependencies": { - "@expo/config": "~11.0.9", - "@expo/config-plugins": "~10.0.2", + "@expo/config": "~11.0.10", + "@expo/config-plugins": "~10.0.3", "@expo/config-types": "^53.0.4", "@expo/image-utils": "^0.7.4", "@expo/json-file": "^9.1.4", - "@react-native/normalize-colors": "0.79.2", + "@react-native/normalize-colors": "0.79.4", "debug": "^4.3.1", "resolve-from": "^5.0.0", "semver": "^7.6.0", @@ -2260,12 +2242,14 @@ "license": "MIT" }, "node_modules/@expo/vector-icons": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-14.0.4.tgz", - "integrity": "sha512-+yKshcbpDfbV4zoXOgHxCwh7lkE9VVTT5T03OUlBsqfze1PLy6Hi4jp1vSb1GVbY6eskvMIivGVc9SKzIv0oEQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-14.1.0.tgz", + "integrity": "sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ==", "license": "MIT", - "dependencies": { - "prop-types": "^15.8.1" + "peerDependencies": { + "expo-font": "*", + "react": "*", + "react-native": "*" } }, "node_modules/@expo/ws-tunnel": { @@ -2298,24 +2282,6 @@ "@babel/highlight": "^7.10.4" } }, - "node_modules/@expo/xcpretty/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/@expo/xcpretty/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@firebase/analytics": { "version": "0.10.11", "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.11.tgz", @@ -2968,12 +2934,6 @@ "node": ">=6" } }, - "node_modules/@ide/backoff": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@ide/backoff/-/backoff-1.0.0.tgz", - "integrity": "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==", - "license": "MIT" - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3057,6 +3017,15 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -3070,6 +3039,19 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3200,25 +3182,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/@jest/transform/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -3404,9 +3367,9 @@ "license": "BSD-3-Clause" }, "node_modules/@react-native-async-storage/async-storage": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.1.2.tgz", - "integrity": "sha512-dvlNq4AlGWC+ehtH12p65+17V0Dx7IecOWl6WanF2ja38O1Dcjjvn7jVzkUHJ5oWkQBlyASurTPlTHgKXyYiow==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz", + "integrity": "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==", "license": "MIT", "dependencies": { "merge-options": "^3.0.4" @@ -3487,10 +3450,82 @@ "node": ">=18" } }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.4.tgz", + "integrity": "sha512-quhytIlDedR3ircRwifa22CaWVUVnkxccrrgztroCZaemSJM+HLurKJrjKWm0J5jV9ed+d+9Qyb1YB0syTHDjg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.79.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.79.4.tgz", + "integrity": "sha512-El9JvYKiNfnkQ3qR7zJvvRdP3DX2i4BGYlIricWQishI3gWAfm88FQYFC2CcGoMQWJQEPN4jnDMpoISAJDEN4g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.79.4", + "babel-plugin-syntax-hermes-parser": "0.25.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, "node_modules/@react-native/codegen": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.79.2.tgz", - "integrity": "sha512-8JTlGLuLi1p8Jx2N/enwwEd7/2CfrqJpv90Cp77QLRX3VHF2hdyavRIxAmXMwN95k+Me7CUuPtqn2X3IBXOWYg==", + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.79.4.tgz", + "integrity": "sha512-K0moZDTJtqZqSs+u9tnDPSxNsdxi5irq8Nu4mzzOYlJTVNGy5H9BiIDg/NeKGfjAdo43yTDoaPSbUCvVV8cgIw==", "license": "MIT", "dependencies": { "glob": "^7.1.1", @@ -3506,6 +3541,16 @@ "@babel/core": "*" } }, + "node_modules/@react-native/codegen/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@react-native/codegen/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3527,6 +3572,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@react-native/codegen/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@react-native/community-cli-plugin": { "version": "0.79.2", "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.79.2.tgz", @@ -3554,6 +3611,37 @@ } } }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { + "version": "0.79.2", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.79.2.tgz", + "integrity": "sha512-cGmC7X6kju76DopSBNc+PRAEetbd7TWF9J9o84hOp/xL3ahxR2kuxJy0oJX8Eg8oehhGGEXTuMKHzNa3rDBeSg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { + "version": "0.79.2", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.79.2.tgz", + "integrity": "sha512-9q4CpkklsAs1L0Bw8XYCoqqyBSrfRALGEw4/r0EkR38Y/6fVfNfdsjSns0pTLO6h0VpxswK34L/hm4uK3MoLHw==", + "license": "MIT", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.79.2", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "serve-static": "^1.16.2", + "ws": "^6.2.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@react-native/community-cli-plugin/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3581,23 +3669,32 @@ "node": ">=10" } }, + "node_modules/@react-native/community-cli-plugin/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, "node_modules/@react-native/debugger-frontend": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.79.2.tgz", - "integrity": "sha512-cGmC7X6kju76DopSBNc+PRAEetbd7TWF9J9o84hOp/xL3ahxR2kuxJy0oJX8Eg8oehhGGEXTuMKHzNa3rDBeSg==", + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.79.4.tgz", + "integrity": "sha512-Gg4LhxHIK86Bi2RiT1rbFAB6fuwANRsaZJ1sFZ1OZEMQEx6stEnzaIrmfgzcv4z0bTQdQ8lzCrpsz0qtdaD4eA==", "license": "BSD-3-Clause", "engines": { "node": ">=18" } }, "node_modules/@react-native/dev-middleware": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.79.2.tgz", - "integrity": "sha512-9q4CpkklsAs1L0Bw8XYCoqqyBSrfRALGEw4/r0EkR38Y/6fVfNfdsjSns0pTLO6h0VpxswK34L/hm4uK3MoLHw==", + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.79.4.tgz", + "integrity": "sha512-OWRDNkgrFEo+OSC5QKfiiBmGXKoU8gmIABK8rj2PkgwisFQ/22p7MzE5b6oB2lxWaeJT7jBX5KVniNqO46VhHA==", "license": "MIT", "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.79.2", + "@react-native/debugger-frontend": "0.79.4", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", @@ -3655,45 +3752,22 @@ } }, "node_modules/@react-native/normalize-colors": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.79.2.tgz", - "integrity": "sha512-+b+GNrupWrWw1okHnEENz63j7NSMqhKeFMOyzYLBwKcprG8fqJQhDIGXfizKdxeIa5NnGSAevKL1Ev1zJ56X8w==", + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.79.4.tgz", + "integrity": "sha512-247/8pHghbYY2wKjJpUsY6ZNbWcdUa5j5517LZMn6pXrbSSgWuj3JA4OYibNnocCHBaVrt+3R8XC3VEJqLlHFg==", "license": "MIT" }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.79.2.tgz", - "integrity": "sha512-9G6ROJeP+rdw9Bvr5ruOlag11ET7j1z/En1riFFNo6W3xZvJY+alCuH1ttm12y9+zBm4n8jwCk4lGhjYaV4dKw==", - "license": "MIT", - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^19.0.0", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@react-navigation/bottom-tabs": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-7.2.0.tgz", - "integrity": "sha512-1LxjgnbPyFINyf9Qr5d1YE0pYhuJayg5TCIIFQmbcX4PRhX7FKUXV7cX8OzrKXEdZi/UE/VNXugtozPAR9zgvA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-7.4.2.tgz", + "integrity": "sha512-jyBux5l3qqEucY5M/ZWxVvfA8TQu7DVl2gK+xB6iKqRUfLf7dSumyVxc7HemDwGFoz3Ug8dVZFvSMEs+mfrieQ==", "license": "MIT", "dependencies": { - "@react-navigation/elements": "^2.2.5", + "@react-navigation/elements": "^2.5.2", "color": "^4.2.3" }, "peerDependencies": { - "@react-navigation/native": "^7.0.14", + "@react-navigation/native": "^7.1.14", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", @@ -3701,40 +3775,36 @@ } }, "node_modules/@react-navigation/core": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-7.9.2.tgz", - "integrity": "sha512-lqCyKMWWaSwGK4VV3wRXXEKvl5IKrVH207Kp77TLCnITnd4KQIdgjzzJ/Pr62ugki3VTAErq1vg0yRlcXciCbg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-7.12.1.tgz", + "integrity": "sha512-ir6s25CDkReufi0vQhSIAe+AAHHJN9zTgGlS6iDS1yqbwgl2MiBAZzpaOL1T5llYujie2jF/bODeLz2j4k80zw==", "license": "MIT", "dependencies": { - "@react-navigation/routers": "^7.3.7", + "@react-navigation/routers": "^7.4.1", "escape-string-regexp": "^4.0.0", "nanoid": "^3.3.11", "query-string": "^7.1.3", "react-is": "^19.1.0", - "use-latest-callback": "^0.2.3", + "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "react": ">= 18.2.0" } }, - "node_modules/@react-navigation/core/node_modules/react-is": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", - "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", - "license": "MIT" - }, "node_modules/@react-navigation/elements": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.4.2.tgz", - "integrity": "sha512-cudKLsRtOB+i8iDzfBKypdqiHsDy1ruqCfYAtwKEclDmLsxu3/90YXoBtoPyFNyIpsn3GtsJzZsrYWQh78xSWg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.5.2.tgz", + "integrity": "sha512-aGC3ukF5+lXuiF5bK7bJyRuWCE+Tk4MZ3GoQpAb7u7+m0KmsquliDhj4UCWEUU5kUoCeoRAUvv+1lKcYKf+WTQ==", "license": "MIT", "dependencies": { - "color": "^4.2.3" + "color": "^4.2.3", + "use-latest-callback": "^0.2.4", + "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", - "@react-navigation/native": "^7.1.9", + "@react-navigation/native": "^7.1.14", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" @@ -3746,16 +3816,16 @@ } }, "node_modules/@react-navigation/native": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.9.tgz", - "integrity": "sha512-/A0oBwZIeD23o4jsnB0fEyKmKS+l4LAbJP/ioVvsGEubGp+sc5ouQNranOh7JwR0R1eX0MjcsLKprEwB+nztdw==", + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.14.tgz", + "integrity": "sha512-X233/CNx41FpshlWe4uEAUN8CNem3ju4t5pnVKcdhDR0cTQT1rK6P0ZwjSylD9zXdnHvJttFjBhKTot6TcvSqA==", "license": "MIT", "dependencies": { - "@react-navigation/core": "^7.9.2", + "@react-navigation/core": "^7.12.1", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.3.11", - "use-latest-callback": "^0.2.3" + "use-latest-callback": "^0.2.4" }, "peerDependencies": { "react": ">= 18.2.0", @@ -3763,16 +3833,16 @@ } }, "node_modules/@react-navigation/native-stack": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-7.2.0.tgz", - "integrity": "sha512-mw7Nq9qQrGsmJmCTwIIWB7yY/3tWYXvQswx+HJScGAadIjemvytJXm1fcl3+YZ9T9Ym0aERcVe5kDs+ny3X4vA==", + "version": "7.3.21", + "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-7.3.21.tgz", + "integrity": "sha512-oNNZHzkxILEibesamRKLodfXAaDOUvMBITKXLLeblDxnTAyIB/Kf7CmV+8nwkdAgV04kURTxV0SQI+d8gLUm6g==", "license": "MIT", "dependencies": { - "@react-navigation/elements": "^2.2.5", + "@react-navigation/elements": "^2.5.2", "warn-once": "^0.1.1" }, "peerDependencies": { - "@react-navigation/native": "^7.0.14", + "@react-navigation/native": "^7.1.14", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", @@ -3780,20 +3850,22 @@ } }, "node_modules/@react-navigation/routers": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-7.3.7.tgz", - "integrity": "sha512-5ffgrefOs2zWqcCVX+OKn+RDx0puopQtxqetegFrTfWQ6pGXdY/5v4kBpPwaOFrNEeE/LPbHt9IJaJuvyhB7RA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-7.4.1.tgz", + "integrity": "sha512-42mZrMzQ0LfKxUb5OHIurYrPYyRsXFLolucILrvm21f0O40Sw0Ufh1bnn/jRqnxZZu7wvpUGIGYM8nS9zVE1Aw==", "license": "MIT", "dependencies": { "nanoid": "^3.3.11" } }, "node_modules/@reduxjs/toolkit": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.6.1.tgz", - "integrity": "sha512-SSlIqZNYhqm/oMkXbtofwZSt9lrncblzo6YcZ9zoX+zLngRBrCOjK4lNLdkNucJF58RHOWrD9txT3bT3piH7Zw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", + "integrity": "sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A==", "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", "immer": "^10.0.3", "redux": "^5.0.1", "redux-thunk": "^3.1.0", @@ -3842,6 +3914,18 @@ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "license": "MIT" }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", @@ -4016,12 +4100,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/core/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, "node_modules/@svgr/core/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -4061,9 +4139,9 @@ } }, "node_modules/@svgr/core/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -4076,18 +4154,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@svgr/core/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@svgr/core/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -4175,12 +4241,6 @@ "@svgr/core": "*" } }, - "node_modules/@svgr/plugin-svgo/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -4208,9 +4268,9 @@ } }, "node_modules/@svgr/plugin-svgo/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -4223,18 +4283,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@svgr/plugin-svgo/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@svgr/plugin-svgo/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -4285,9 +4333,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" @@ -4304,18 +4352,18 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/geojson": { - "version": "7946.0.15", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", - "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "license": "MIT" }, "node_modules/@types/graceful-fs": { @@ -4358,18 +4406,18 @@ } }, "node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "version": "24.0.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.4.tgz", + "integrity": "sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~7.8.0" } }, "node_modules/@types/react": { - "version": "19.1.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.5.tgz", - "integrity": "sha512-piErsCVVbpMMT2r7wbawdZsq4xMvIAhQuac2gedQHysu1TZYEigE6pnFfgZT+/jQnrRuF5r+SHzuehFjfRjr4g==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", + "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -4479,9 +4527,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4536,6 +4584,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -4598,13 +4658,10 @@ "license": "MIT" }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/array-timsort": { "version": "1.0.3", @@ -4618,19 +4675,6 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "license": "MIT" }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -4638,9 +4682,9 @@ "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, "funding": [ { @@ -4658,11 +4702,11 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -4675,21 +4719,6 @@ "postcss": "^8.1.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -4743,13 +4772,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", - "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", + "@babel/helper-define-polyfill-provider": "^0.6.4", "semver": "^6.3.1" }, "peerDependencies": { @@ -4757,25 +4786,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", - "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3" + "@babel/helper-define-polyfill-provider": "^0.6.4" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4838,9 +4867,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "13.1.11", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-13.1.11.tgz", - "integrity": "sha512-jigWjvhRVdm9UTPJ1wjLYJ0OJvD5vLZ8YYkEknEl6+9S1JWORO/y3xtHr/hNj5n34nOilZqdXrmNFcqKc8YTsg==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-13.2.1.tgz", + "integrity": "sha512-Ol3w0uLJNQ5tDfCf4L+IDTDMgJkVMQHhvYqMxs18Ib0DcaBQIfE8mneSSk7FcuI6FS0phw/rZhoEquQh1/Q3wA==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", @@ -4857,7 +4886,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.79.2", + "@react-native/babel-preset": "0.79.4", "babel-plugin-react-native-web": "~0.19.13", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", @@ -4874,78 +4903,6 @@ } } }, - "node_modules/babel-preset-expo/node_modules/@react-native/babel-plugin-codegen": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.2.tgz", - "integrity": "sha512-d+NB7Uosn2ZWd4O4+7ZkB6q1a+0z2opD/4+Bzhk/Tv6fc5FrSftK2Noqxvo3/bhbdGFVPxf0yvLE8et4W17x/Q==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.79.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/babel-preset-expo/node_modules/@react-native/babel-preset": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.79.2.tgz", - "integrity": "sha512-/HNu869oUq4FUXizpiNWrIhucsYZqu0/0spudJEzk9SEKar0EjVDP7zkg/sKK+KccNypDQGW7nFXT8onzvQ3og==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.79.2", - "babel-plugin-syntax-hermes-parser": "0.25.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, "node_modules/babel-preset-fbjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", @@ -5000,12 +4957,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/badgin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/badgin/-/badgin-1.2.3.tgz", - "integrity": "sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==", - "license": "MIT" - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5110,13 +5061,12 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -5132,9 +5082,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "funding": [ { "type": "opencollective", @@ -5151,10 +5101,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -5211,53 +5161,6 @@ "node": ">= 0.8" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -5310,9 +5213,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001724", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", + "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", "funding": [ { "type": "opencollective", @@ -5369,6 +5272,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -5410,18 +5325,6 @@ "rimraf": "^3.0.2" } }, - "node_modules/chromium-edge-launcher/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -5679,12 +5582,12 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", + "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.25.0" }, "funding": { "type": "opencollective", @@ -5712,6 +5615,28 @@ "node": ">=4" } }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/cross-fetch": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", @@ -5855,9 +5780,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5910,23 +5835,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -5936,23 +5844,6 @@ "node": ">=8" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -6038,9 +5929,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -6088,20 +5979,6 @@ "url": "https://dotenvx.com" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -6115,9 +5992,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.173", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.173.tgz", + "integrity": "sha512-2bFhXP2zqSfQHugjqJIDFVwa+qIxyNApenmXTp9EjaKtdPrES5Qcn9/aSFy/NaP2E+fWG/zxKu/LBvY36p5VNQ==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -6135,17 +6012,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/engine.io-client": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", @@ -6245,36 +6111,6 @@ "stackframe": "^1.3.4" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -6333,6 +6169,15 @@ "node": ">=6" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/exec-async": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", @@ -6340,26 +6185,26 @@ "license": "MIT" }, "node_modules/expo": { - "version": "53.0.9", - "resolved": "https://registry.npmjs.org/expo/-/expo-53.0.9.tgz", - "integrity": "sha512-UFG68aVOpccg3s++S3pbtI3YCQCnlu/TFvhnQ5vaD3vhOox1Uk/f2O2T95jmwA/EvKvetqGj34lys3DNXvPqgQ==", + "version": "53.0.12", + "resolved": "https://registry.npmjs.org/expo/-/expo-53.0.12.tgz", + "integrity": "sha512-dtmED749hkxDWCcvtD++tb8bAm3Twv8qnUOXzVyXA5owNG0mwDIz0HveJTpWK1UzkY4HcTVRezDf0tflZJ+JXQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.24.13", + "@expo/cli": "0.24.15", "@expo/config": "~11.0.10", - "@expo/config-plugins": "~10.0.2", - "@expo/fingerprint": "0.12.4", - "@expo/metro-config": "0.20.14", + "@expo/config-plugins": "~10.0.3", + "@expo/fingerprint": "0.13.1", + "@expo/metro-config": "0.20.15", "@expo/vector-icons": "^14.0.0", - "babel-preset-expo": "~13.1.11", + "babel-preset-expo": "~13.2.1", "expo-asset": "~11.1.5", "expo-constants": "~17.1.6", "expo-file-system": "~18.1.10", "expo-font": "~13.3.1", "expo-keep-awake": "~14.1.4", - "expo-modules-autolinking": "2.1.10", - "expo-modules-core": "2.3.13", + "expo-modules-autolinking": "2.1.12", + "expo-modules-core": "2.4.0", "react-native-edge-to-edge": "1.6.0", "whatwg-url-without-unicode": "8.0.0-3" }, @@ -6387,15 +6232,6 @@ } } }, - "node_modules/expo-application": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-6.1.4.tgz", - "integrity": "sha512-jXVZb3llTQ5j4C/I03GxKjujmhKex9Xo5JDZo/pRjScHSr4NoeMjPKWThyWVlWDM1v5YSEcsRJebVfTvq9SR5Q==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, "node_modules/expo-asset": { "version": "11.1.5", "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.1.5.tgz", @@ -6412,9 +6248,9 @@ } }, "node_modules/expo-blur": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-14.1.4.tgz", - "integrity": "sha512-55P9tK/RjJZEcu2tU7BqX3wmIOrGMOOkmHztJMMws+ZGHzvtjnPmT7dsQxhOU9vPj77oHnKetYHU2sik3iBcCw==", + "version": "14.1.5", + "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-14.1.5.tgz", + "integrity": "sha512-CCLJHxN4eoAl06ESKT3CbMasJ98WsjF9ZQEJnuxtDb9ffrYbZ+g9ru84fukjNUOTtc8A8yXE5z8NgY1l0OMrmQ==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -6437,13 +6273,13 @@ } }, "node_modules/expo-dev-client": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-5.2.0.tgz", - "integrity": "sha512-7GgO3BGlFM016Zkp3c9bUbi35pubqKh8Z/iHC1arIvckEjDrLER+92zfUTFr49XLk2o64arItRPJyQL49pA/hg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-5.2.1.tgz", + "integrity": "sha512-SzrHvXeyTGawzc/7ZIHFmaUYiCeRJagL9bJo/yTPmxdycFFOOdLs1FNMFXyYhB6YY4u5EKTCO6g1fug+0GV9sQ==", "license": "MIT", "dependencies": { - "expo-dev-launcher": "5.1.12", - "expo-dev-menu": "6.1.11", + "expo-dev-launcher": "5.1.13", + "expo-dev-menu": "6.1.12", "expo-dev-menu-interface": "1.10.0", "expo-manifests": "~0.16.5", "expo-updates-interface": "~1.1.0" @@ -6453,13 +6289,13 @@ } }, "node_modules/expo-dev-launcher": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-5.1.12.tgz", - "integrity": "sha512-ALedYerjJtSiPa95l41zMAO/m1m1kgS39i2H0io+6Ix4OksYNhILNzMNB1qDht/oWt2yjLBvXfWULfs5+3vnaA==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-5.1.13.tgz", + "integrity": "sha512-EAxkI0MOZk1E9tkk+QpyDhqlCjUqAr8q+mobcC3ZJIIi7KejhaQlGVlF1kUUITsYLvFvbT8egRgrsMO57T6uDA==", "license": "MIT", "dependencies": { "ajv": "8.11.0", - "expo-dev-menu": "6.1.11", + "expo-dev-menu": "6.1.12", "expo-manifests": "~0.16.5", "resolve-from": "^5.0.0" }, @@ -6468,9 +6304,9 @@ } }, "node_modules/expo-dev-menu": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-6.1.11.tgz", - "integrity": "sha512-yrlDXGcqlbQX3Pgw/iPLRea7+pHFC17MdtkNaXYQ5K5u64mn9l4KZ2ZYUeQ8cKDG5l8ZdC4F9R9vfCJYFi82AA==", + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-6.1.12.tgz", + "integrity": "sha512-Bz8yjZ6a+u7ZrZWzfn3aCgBwAX+QB0ktQyV7QMS5/agyesKiqM43+VdwNQqrm8w9tS8HZ2sf6RTvdek8YgOEHg==", "license": "MIT", "dependencies": { "expo-dev-menu-interface": "1.10.0" @@ -6549,9 +6385,9 @@ } }, "node_modules/expo-linear-gradient": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-14.1.4.tgz", - "integrity": "sha512-bImj2qqIjnl+VHYGnIwan9LxmGvb8e4hFqHpxsPzUiK7Ady7uERrXPhJcyTKTxRf4RL2sQRDpoOKzBYNdQDmuw==", + "version": "14.1.5", + "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-14.1.5.tgz", + "integrity": "sha512-BSN3MkSGLZoHMduEnAgfhoj3xqcDWaoICgIr4cIYEx1GcHfKMhzA/O4mpZJ/WC27BP1rnAqoKfbclk1eA70ndQ==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -6596,9 +6432,9 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.1.10.tgz", - "integrity": "sha512-k93fzoszrYTKbZ51DSVnewYIGUV6Gi22Su8qySXPFJEfvtDs2NUUNRHBZNKgLHvwc6xPzVC5j7JYbrpXNuY44A==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.1.12.tgz", + "integrity": "sha512-rW5YSW66pUx1nLqn7TO0eWRnP4LDvySW1Tom0wjexk3Tx/upg9LYE5tva7p5AX/cdFfiZcEqPcOxP4RyT++Xlg==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -6614,41 +6450,21 @@ } }, "node_modules/expo-modules-core": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.3.13.tgz", - "integrity": "sha512-vmKHv7tEo2wUQoYDV6grhsLsQfD3DUnew5Up3yNnOE1gHGQE+zhV1SBYqaPMPB12OvpyD1mlfzGhu6r9PODnng==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.4.0.tgz", + "integrity": "sha512-Ko5eHBdvuMykjw9P9C9PF54/wBSsGOxaOjx92I5BwgKvEmUwN3UrXFV4CXzlLVbLfSYUQaLcB220xmPfgvT7Fg==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" } }, - "node_modules/expo-notifications": { - "version": "0.31.2", - "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-0.31.2.tgz", - "integrity": "sha512-p73VIECCULm9XkHE6WNweZDw9G62Tz9OpOOQ2tCF/QLpDW8W1q4PEUZUdbrTJREB4Q0VHegVNDJmKUkSOp7bfA==", - "license": "MIT", - "dependencies": { - "@expo/image-utils": "^0.7.4", - "@ide/backoff": "^1.0.0", - "abort-controller": "^3.0.0", - "assert": "^2.0.0", - "badgin": "^1.1.5", - "expo-application": "~6.1.4", - "expo-constants": "~17.1.6" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, "node_modules/expo-splash-screen": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.30.8.tgz", - "integrity": "sha512-2eh+uA543brfeG5HILXmtNKA7E2/pfywKzNumzy3Ef6OtDjYy6zJUGNSbhnZRbVEjUZo3/QNRs0JRBfY80okZg==", + "version": "0.30.9", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.30.9.tgz", + "integrity": "sha512-curHUaZxUTZ2dWvz32ao3xPv5mJr1LBqn5V8xm/IULAehB9RGCn8iKiROMN1PYebSG+56vPMuJmBm9P+ayvJpA==", "license": "MIT", "dependencies": { - "@expo/prebuild-config": "^9.0.5" + "@expo/prebuild-config": "^9.0.6" }, "peerDependencies": { "expo": "*" @@ -6690,21 +6506,33 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -6712,9 +6540,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -6762,6 +6590,15 @@ "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", "license": "MIT" }, + "node_modules/fbjs/node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -6916,24 +6753,15 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "license": "BSD-2-Clause" - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } + "license": "BSD-2-Clause" }, "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -7022,30 +6850,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -7055,23 +6859,10 @@ "node": ">=8.0.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/getenv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", - "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "license": "MIT", "engines": { "node": ">=6" @@ -7098,39 +6889,15 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10.13.0" } }, "node_modules/globals": { @@ -7142,18 +6909,6 @@ "node": ">=4" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -7178,45 +6933,6 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -7327,20 +7043,6 @@ "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", "license": "BSD-3-Clause" }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", @@ -7367,6 +7069,15 @@ ], "license": "BSD-3-Clause" }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/image-size": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", @@ -7464,22 +7175,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -7498,18 +7193,6 @@ "node": ">=8" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -7567,24 +7250,6 @@ "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7597,22 +7262,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -7631,39 +7280,6 @@ "node": ">=8" } }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -7926,13 +7542,12 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -8330,6 +7945,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", "license": "MIT" }, "node_modules/lodash.throttle": { @@ -8467,20 +8083,11 @@ } }, "node_modules/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", + "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "license": "Apache-2.0" }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", @@ -9019,15 +8626,18 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -9060,6 +8670,18 @@ "node": ">= 18" } }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -9272,51 +8894,6 @@ "node": ">= 6" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -9690,10 +9267,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "license": "MIT", "engines": { "node": ">= 6" @@ -9727,20 +9313,11 @@ "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==", "license": "MIT" - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -9757,7 +9334,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -9881,9 +9458,9 @@ "license": "MIT" }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.0.tgz", + "integrity": "sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw==", "dev": true, "license": "MIT", "bin": { @@ -9934,6 +9511,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, "node_modules/proc-log": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", @@ -9953,12 +9536,12 @@ } }, "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "license": "MIT", "dependencies": { - "asap": "~2.0.3" + "asap": "~2.0.6" } }, "node_modules/prompts": { @@ -10168,9 +9751,9 @@ } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", + "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", "license": "MIT" }, "node_modules/react-native": { @@ -10481,9 +10064,9 @@ } }, "node_modules/react-native-svg-transformer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-1.5.0.tgz", - "integrity": "sha512-RG5fSWJT7mjCQYocgYFUo1KYPLOoypPVG5LQab+pZZO7m4ciGaQIe0mhok3W4R5jLQsEXKo0u+aQGkZV/bZG7w==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-1.5.1.tgz", + "integrity": "sha512-dFvBNR8A9VPum9KCfh+LE49YiJEF8zUSnEFciKQroR/bEOhlPoZA0SuQ0qNk7m2iZl2w59FYjdRe0pMHWMDl0Q==", "license": "MIT", "dependencies": { "@svgr/core": "^8.1.0", @@ -10613,9 +10196,9 @@ } }, "node_modules/react-native-web/node_modules/@react-native/normalize-colors": { - "version": "0.74.88", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.88.tgz", - "integrity": "sha512-He5oTwPBxvXrxJ91dZzpxR7P+VYmc9IkJfhuH8zUiU50ckrt+xWNjtVugPdUv4LuVjmZ36Vk2EX8bl1gVn2dVA==", + "version": "0.74.89", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz", + "integrity": "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==", "license": "MIT" }, "node_modules/react-native-web/node_modules/memoize-one": { @@ -10624,6 +10207,64 @@ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", "license": "MIT" }, + "node_modules/react-native/node_modules/@react-native/codegen": { + "version": "0.79.2", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.79.2.tgz", + "integrity": "sha512-8JTlGLuLi1p8Jx2N/enwwEd7/2CfrqJpv90Cp77QLRX3VHF2hdyavRIxAmXMwN95k+Me7CUuPtqn2X3IBXOWYg==", + "license": "MIT", + "dependencies": { + "glob": "^7.1.1", + "hermes-parser": "0.25.1", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/react-native/node_modules/@react-native/normalize-colors": { + "version": "0.79.2", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.79.2.tgz", + "integrity": "sha512-+b+GNrupWrWw1okHnEENz63j7NSMqhKeFMOyzYLBwKcprG8fqJQhDIGXfizKdxeIa5NnGSAevKL1Ev1zJ56X8w==", + "license": "MIT" + }, + "node_modules/react-native/node_modules/@react-native/virtualized-lists": { + "version": "0.79.2", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.79.2.tgz", + "integrity": "sha512-9G6ROJeP+rdw9Bvr5ruOlag11ET7j1z/En1riFFNo6W3xZvJY+alCuH1ttm12y9+zBm4n8jwCk4lGhjYaV4dKw==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^19.0.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/react-native/node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", @@ -10654,25 +10295,22 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/react-native/node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "license": "MIT", + "node_modules/react-native/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { - "asap": "~2.0.6" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/react-native/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" - }, "node_modules/react-native/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -10731,15 +10369,6 @@ "pify": "^2.3.0" } }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -10798,20 +10427,11 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "license": "MIT" }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexpu-core": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", @@ -10978,9 +10598,9 @@ "license": "ISC" }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -11003,6 +10623,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -11024,6 +10654,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -11067,31 +10709,6 @@ ], "license": "MIT" }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", @@ -11284,23 +10901,6 @@ "node": ">= 0.8" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -11335,9 +10935,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -11572,9 +11172,9 @@ "license": "MIT" }, "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "license": "MIT", "dependencies": { "type-fest": "^0.7.1" @@ -11583,15 +11183,6 @@ "node": ">=6" } }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -11885,18 +11476,6 @@ "node": ">=14.0.0" } }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/tar": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", @@ -11964,9 +11543,9 @@ } }, "node_modules/terser": { - "version": "5.39.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.2.tgz", - "integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -12001,6 +11580,16 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -12022,6 +11611,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -12104,15 +11705,12 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/typescript": { @@ -12165,9 +11763,9 @@ } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -12232,9 +11830,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -12252,7 +11850,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -12271,9 +11869,9 @@ } }, "node_modules/use-latest-callback": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.3.tgz", - "integrity": "sha512-7vI3fBuyRcP91pazVboc4qu+6ZqM8izPWX9k7cRnT8hbD5svslcknsh3S9BUhaK11OmgTV4oWZZVSeQAiV53SQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.4.tgz", + "integrity": "sha512-LS2s2n1usUUnDq4oVh1ca6JFX9uSqUncTfAm44WMg0v6TxL7POUTk1B044NH8TeLkFbNajIsgDHcgNpNzZucdg==", "license": "MIT", "peerDependencies": { "react": ">=16.8" @@ -12288,19 +11886,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -12316,6 +11901,15 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/validate-npm-package-name": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", @@ -12453,26 +12047,6 @@ "node": ">= 8" } }, - "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wonka": { "version": "6.3.5", "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", @@ -12584,6 +12158,25 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/ws": { "version": "8.18.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", @@ -12618,15 +12211,6 @@ "node": ">=10.0.0" } }, - "node_modules/xcode/node_modules/uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/xml2js": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", @@ -12682,15 +12266,15 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yargs": { diff --git a/package.json b/package.json index 3ee6dcb..2b1c279 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@react-navigation/native": "^7.0.14", "@react-navigation/native-stack": "^7.2.0", "@reduxjs/toolkit": "^2.6.1", + "events": "^3.3.0", "expo": "^53.0.9", "expo-blur": "~14.1.4", "expo-dev-client": "~5.2.0", @@ -31,7 +32,6 @@ "expo-linear-gradient": "~14.1.4", "expo-linking": "^7.1.5", "expo-location": "~18.1.5", - "expo-notifications": "~0.31.2", "expo-splash-screen": "~0.30.8", "expo-status-bar": "~2.2.3", "jwt-decode": "^4.0.0", diff --git a/src/App.js b/src/App.js index d3f4c13..debd9ab 100644 --- a/src/App.js +++ b/src/App.js @@ -7,6 +7,7 @@ import { useEffect } from 'react'; import { useDispatch } from 'react-redux'; import { setTokenFromStorage } from './redux/authSlice'; import { NavigationRef } from './NavigationRef'; +import eventEmitter from './eventEmitter'; // Importar os ícones personalizados import HomeIcon from '../assets/icons/home.svg'; @@ -41,7 +42,7 @@ import messaging from '@react-native-firebase/messaging'; const { FloatingBubble } = NativeModules; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; export default function App() { const linking = { @@ -65,7 +66,24 @@ export default function App() { FloatingBubble.showMessage(remoteMessage.notification.body); } }); - return ForegroundMessage; + + const OnClickNotificationOpen = messaging().onNotificationOpenedApp( + (remoteMessage) => { + console.log( + 'Notification caused app to open from background:', + remoteMessage + ); + // Pequeno delay para garantir que a navegação está pronta + setTimeout(() => { + NavigationRef.current?.navigate('QuestionPage'); + }, 500); + } + ); + + return () => { + ForegroundMessage; + OnClickNotificationOpen; + }; }, []); useEffect(() => { @@ -89,6 +107,7 @@ export default function App() { if (response.ok) { const data = await response.json(); await AsyncStorage.setItem('token', data.access_token); + eventEmitter.emit('tokenChanged'); dispatch( setTokenFromStorage({ token: data.access_token, @@ -98,6 +117,7 @@ export default function App() { setInitialRoute('HomeTabs'); } else { await AsyncStorage.multiRemove(['token', 'refresh_token', 'user']); + eventEmitter.emit('tokenChanged'); setInitialRoute('Welcome'); } } else { diff --git a/src/FontDefiner.js b/src/FontDefiner.js index c5df2b2..a1fe2be 100644 --- a/src/FontDefiner.js +++ b/src/FontDefiner.js @@ -9,6 +9,7 @@ import App from './App'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { jwtDecode } from 'jwt-decode'; import useSocket from './useSocket'; +import eventEmitter from './eventEmitter'; export default function FontDefiner() { const [fontsLoaded] = useFonts({ @@ -19,19 +20,24 @@ export default function FontDefiner() { const [userId, setUserId] = useState(null); useEffect(() => { - async function loadUserId() { + const handleTokenChange = async () => { try { const token = await AsyncStorage.getItem('token'); if (token) { const decoded = jwtDecode(token); setUserId(decoded.sub); + } else { + setUserId(null); } } catch (error) { console.error('Erro ao carregar token:', error); } - } + }; - loadUserId(); + eventEmitter.on('tokenChanged', handleTokenChange); + return () => { + eventEmitter.off('tokenChanged', handleTokenChange); + }; }, []); useSocket(userId); diff --git a/src/components/CardForOptions.js b/src/components/CardForOptions.js index e1ffd32..2b7d502 100644 --- a/src/components/CardForOptions.js +++ b/src/components/CardForOptions.js @@ -11,7 +11,13 @@ export default function CardForOptions({ options }) { navigation.navigate(option.link)} + onPress={() => { + if (option.action) { + option.action(); + } else if (option.link && option.link !== 'null') { + navigation.navigate(option.link); + } + }} > {/* Ícone */} {option.icon && ( diff --git a/src/components/MonotorizationModal.js b/src/components/MonotorizationModal.js index 8d938f1..1e77897 100644 --- a/src/components/MonotorizationModal.js +++ b/src/components/MonotorizationModal.js @@ -8,19 +8,27 @@ import { AppState, } from 'react-native'; import { FontAwesome } from '@expo/vector-icons'; -import { useDispatch } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; -import {updateIsMonitoringStatus} from '../redux/isMonitoringSlice' +import { updateIsMonitoringStatus } from '../redux/isMonitoringSlice'; //import react-native modules import { NativeModules } from 'react-native'; -export default function MonotorizationModal({ modalVisible, setModalVisible }) { +export default function MonotorizationModal({ + modalVisible, + setModalVisible, + buttonText, +}) { //importar os módulos nativos de screen time e work manager const { ScreenTimeModule } = NativeModules; const { FloatingBubble } = NativeModules; const { WorkManagerModule } = NativeModules; + const { isMonitoringState, loading, error } = useSelector( + (status) => status.isMonitoring + ); + const dispatch = useDispatch(); const [isSTenabled, setIsSTenabled] = useState(false); @@ -42,7 +50,6 @@ export default function MonotorizationModal({ modalVisible, setModalVisible }) { try { const hasPermission = await FloatingBubble.checkOverlayPermission(); setIsFGenabled(hasPermission); - console.log(hasPermission); } catch (error) { console.log('Error checking screen time permission:', error); } @@ -81,14 +88,12 @@ export default function MonotorizationModal({ modalVisible, setModalVisible }) { }; const StartMonotoring = () => { - if (isSTenabled && isFGenabled) { - console.log('Iniciando monitorização com as seguintes permissões:'); + if (!isMonitoringState) { WorkManagerModule.startWork(); - dispatch(updateIsMonitoringStatus()) - setModalVisible(false); - } else { - alert('Por favor, ativa todas as opções para iniciar a monitorização.'); + dispatch(updateIsMonitoringStatus()); + FloatingBubble.showBubble(); } + setModalVisible(false); }; return ( @@ -116,9 +121,10 @@ export default function MonotorizationModal({ modalVisible, setModalVisible }) { situação em que encontras! - Para isso, vamos precisar que nos dês permissão para aceder aos teus - dados de screenTime e para a Lumicheck possa trabalhar em Background - e Foreground. + Para isso, se quiseres uma análise mais completa, e uma interação + mais dinâmica, vamos precisar que nos dês permissão para aceder aos + teus dados de screenTime e para a Lumicheck possa trabalhar em + Background e Foreground. @@ -146,7 +152,7 @@ export default function MonotorizationModal({ modalVisible, setModalVisible }) { onPress={StartMonotoring} > - Começar Moniterização + {buttonText} diff --git a/src/components/MostUsedApps.js b/src/components/MostUsedApps.js index 810b307..d994759 100644 --- a/src/components/MostUsedApps.js +++ b/src/components/MostUsedApps.js @@ -1,18 +1,24 @@ import React from 'react'; import { View, Text, Image } from 'react-native'; import { useEffect, useState } from 'react'; -import { getAppIcon } from "../sevices/AppIconService"; - - -export default function MostUsedApps({appTime}) { +import { getAppIcon } from '../sevices/AppIconService'; +export default function MostUsedApps({ appTime }) { // Filter out specific apps from the appTime array appTime.map((app) => { - if(app.appName == "home" || app.appName == "deskclock" || app.appName == "settings" || app.appName == "phone" || app.appName == "messages" || app.appName == "contacts" || app.appName == "cleaner"){ + if ( + app.appName == 'home' || + app.appName == 'deskclock' || + app.appName == 'settings' || + app.appName == 'phone' || + app.appName == 'messages' || + app.appName == 'contacts' || + app.appName == 'cleaner' + ) { appTime.splice(appTime.indexOf(app), 1); } - }) - + }); + const Data_time_ordered = [...appTime] .sort((a, b) => b.time - a.time) // Sort by descending `hours` .slice(0, 6); // Take only the top 6 elements @@ -22,15 +28,15 @@ export default function MostUsedApps({appTime}) { {Data_time_ordered.map((Data, index) => { let Time_percentage; - if(Data.time < 60){ - Time_percentage = '0%'; - }else{ - if(Data.time >= 60){ + if (Data.time < 60) { + Time_percentage = `${Math.floor(Math.random() * 10) + 1}%`; + } else { + if (Data.time >= 60) { const hours = Math.floor(Data.time / 60); if (hours >= 5) { Time_percentage = '100%'; - }else { - Time_percentage = `${(hours * 100) / 6 + 10}%` + } else { + Time_percentage = `${(hours * 100) / 6 + 10}%`; } } } @@ -38,13 +44,13 @@ export default function MostUsedApps({appTime}) { const [iconUrl, setIconUrl] = useState(null); useEffect(() => { - (async () => { - const icon = await getAppIcon(Data.id); - if (icon) { - setIconUrl(icon); - } - })(); - }, [Data.id]); + (async () => { + const icon = await getAppIcon(Data.id); + if (icon) { + setIconUrl(icon); + } + })(); + }, [Data.id]); return ( state.screentime + ); + + useEffect(() => { + dispatch(fetchLast7DaysScreenTime()); + }, [dispatch]); + + if (loading) { + return ( + + + A carregar dados do gráfico... + + + ); + } + + if (error || !last7Days || last7Days.length <= 1) { + return ( + + + Dentro de 2 dias, vais poder ver o gráfico de comparação de + screentime. + + + ); + } + + // Preparar dados para o gráfico + const chartData = { + labels: last7Days.map((item) => item.date), + datasets: [ + { + data: last7Days.map((item) => { + const minutes = item.total_minutes || 0; + return Math.round(minutes / 60); // Convertendo minutos para horas + }), + }, + ], + }; + return ( <> {/* Line Chart */} - + Termos e Condições - - Lorem ipsum - - Dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor - incididunt ut labore et dolore magna aliqua. Ut enim ad minim - veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip - ex ea commodo consequat. Duis aute irure dolor in reprehenderit in - voluptate velit esse cillum dolore eu fugiat nulla pariatur. - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui - officia deserunt mollit anim id est laborum. - - Lorem ipsum - - Dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor - incididunt ut labore et dolore magna aliqua. Ut enim ad minim - veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip - ex ea commodo consequat. Duis aute irure dolor in reprehenderit in - voluptate velit esse cillum dolore eu fugiat nulla pariatur. - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui - officia deserunt mollit anim id est laborum. - - Lorem ipsum - - Dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor - incididunt ut labore et dolore magna aliqua. Ut enim ad minim - veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip - ex ea commodo consequat. Duis aute irure dolor in reprehenderit in - voluptate velit esse cillum dolore eu fugiat nulla pariatur. - Excepteur sint occaecat cupidatat non proident, sunt in culpa qui - officia deserunt mollit anim id est laborum. + + + Última atualização a 06 de junho de 2025 + + {' '} + ACORDO COM OS NOSSOS TERMOS LEGAIS + + + Nós somos a Lumicheck ("Companhia, " "nós, " "nós, " "nosso"), + sociedade registada em Aveiro, Portugal. Operamos a aplicação + móvel Lumicheck (o "Aplicativo"), bem como quaisquer outros + produtos e serviços relacionados que se refiram ou tenham ligações + para estes termos legais (o "Termos legais") (coletivamente, o + "Serviços"). O Lumicheck é uma aplicação desenvolvida com o + objetivo de promover a autoconsciência e o equilíbrio na + utilização do telemóvel. Inspirados pelos efeitos negativos do uso + abusivo das redes sociais, dos jogos, das apostas e das compras + online, decidimos criar uma solução que permitisse aos + utilizadores monitorizar a sua rotina digital de forma simples e + eficaz, promover conteúdos literários para educar o utilizador, + fazer a ponte entre a ajuda profissional e os utilizadores e + tarefas que permite ao utilizador ganhar troféus e melhorar os + seus hábitos de uma forma dinâmica. Poderá contactar-nos por email + para lumicheck.app@gmail.com. Estes Termos Legais constituem um + acordo legalmente vinculativo celebrado entre si, seja + pessoalmente ou em nome de uma entidade ("tu") e Lumicheck, + referentes ao seu acesso e utilização dos Serviços. Concorda que, + ao aceder aos Serviços, leu, compreendeu e concordou em + comprometer-se com todos estes Termos Legais. SE NÃO CONCORDAR COM + TODOS ESTES TERMOS LEGAIS, ESTÁ EXPRESSAMENTE PROIBIDO DE UTILIZAR + OS SERVIÇOS E DEVERÁ INTERROMPER A UTILIZAÇÃO IMEDIATAMENTE. + Iremos notificá-lo com antecedência sobre quaisquer alterações + programadas nos Serviços que estiver a utilizar. Os Termos Legais + modificados entrarão em vigor após a publicação ou notificação + através do e-mail lumicheck.app@gmail.com , conforme indicado na + mensagem de e-mail. Ao continuar a utilizar os Serviços após a + data de entrada em vigor de quaisquer alterações, concorda em + comprometer-se com os termos modificados. Todos os utilizadores + menores de idade na jurisdição em que residem (geralmente menores + de 18 anos) devem ter a permissão e ser supervisionados + diretamente pelos seus pais ou tutores para utilizar os Serviços. + Se for menor de idade, peça aos seus pais ou tutores que leiam e + concordem com estes Termos Legais antes de utilizar os Serviços. + Recomendamos que imprima uma cópia destes Termos Legais para os + seus registos. + + + ÍNDICE + + 1. OS NOSSOS SERVIÇOS + + 2. DIREITOS DE PROPRIEDADE INTELECTUAL + + + 3. REPRESENTAÇÕES DO UTILIZADOR + + 4. REGISTO DO UTILIZADOR + 5. ATIVIDADES PROIBIDAS + + 6. CONTRIBUIÇÕES GERADAS PELO UTILIZADOR + + + 7. LICENÇA DE CONTRIBUIÇÃO + + + 8. LICENÇA DE APLICAÇÃO MÓVEL + + + 9. SITES E CONTEÚDOS DE TERCEIROS + + 10. GESTÃO DE SERVIÇOS + + 11. POLÍTICA DE PRIVACIDADE + + 12. PRAZO E RESCISÃO + + 13. MODIFICAÇÕES E INTERRUPÇÕES + + 14. LEI APLICÁVEL + 15. RESOLUÇÃO DE LITÍGIOS + 16. CORREÇÕES + + 17. ISENÇÃO DE RESPONSABILIDADE + + + 18. LIMITAÇÕES DE RESPONSABILIDADE + + 19. INDEMNIZAÇÃO + 20. DADOS DO UTILIZADOR + + 21. COMUNICAÇÕES ELECTRÓNICAS, TRANSACÇÕES E ASSINATURAS + + 22. DIVERSOS + + 23. A PONTUAÇÃO NÃO É UM DIAGNÓSTICO + + 24. CONTACTE-NOS + + + 1. OS NOSSOS SERVIÇOS + + + + As informações fornecidas durante a utilização dos Serviços não se + destinam à distribuição ou utilização por qualquer pessoa ou + entidade em qualquer jurisdição ou país onde tal distribuição ou + utilização seja contrária à lei ou regulamento ou que nos sujeite + a qualquer exigência de registo em tal jurisdição ou país. + Consequentemente, as pessoas que optarem por aceder aos Serviços a + partir de outras localidades, fá-lo-ão por sua iniciativa e serão + as únicas responsáveis pelo cumprimento das leis locais, se e na + medida em que as leis locais forem aplicáveis. + + + + 2. DIREITOS DE PROPRIEDADE INTELECTUAL + + + + A nossa propriedade intelectual Somos o proprietário ou licenciado + de todos os direitos de propriedade intelectual dos nossos + Serviços, incluindo todo o código-fonte, bases de dados, + funcionalidades, software, designs de websites, áudio, vídeo, + texto, fotografias e gráficos nos Serviços (coletivamente, o + "Conteúdo"), bem como as marcas comerciais, marcas de serviço e + logótipos neles contidos (as "Marcas"). O nosso Conteúdo e Marcas + são protegidos por leis de direitos de autor e marcas registadas + (e vários outros direitos de propriedade intelectual e leis de + concorrência desleal) e tratados em todo o mundo. O Conteúdo e as + Marcas são fornecidos nos Serviços ou através dos mesmos "NO + ESTADO EM QUE SE ENCONTRAM", apenas para o seu uso pessoal, não + comercial ou para fins comerciais internos. A sua utilização de + nossos serviços Sujeito à sua conformidade com estes Termos + Legais, incluindo o "ATIVIDADES PROIBIDAS " secção abaixo, + concedemos-lhe uma licença não exclusiva, intransmissível e + revogável para: aceder aos Serviços; e descarregar ou imprimir uma + cópia de qualquer parte do Conteúdo a que tenha obtido o acesso + adequado, exclusivamente para o seu uso pessoal, não comercial ou + para fins comerciais internos. Exceto conforme estabelecido nesta + secção ou em qualquer outro lugar nos nossos Termos Legais, + nenhuma parte dos Serviços e nenhum Conteúdo ou Marcas podem ser + copiados, reproduzidos, agregados, republicados, carregados, + publicados, exibidos publicamente, codificados, traduzidos, + transmitidos, distribuídos, vendidos, licenciados ou de outra + forma explorados para qualquer fim comercial, sem a nossa + autorização prévia expressa por escrito. Caso deseje fazer + qualquer utilização dos Serviços, Conteúdo ou Marcas diferente da + estabelecida nesta secção ou em qualquer outro local dos nossos + Termos Legais, envie o seu pedido para: lumicheck.app@gmail.com . + Se lhe concedermos permissão para publicar, reproduzir ou exibir + publicamente qualquer parte dos nossos Serviços ou Conteúdo, + deverá identificar-nos como proprietários ou licenciadores dos + Serviços, Conteúdo ou Marcas e garantir que qualquer aviso de + direitos de autor ou de propriedade aparece ou é visível na + publicação, reprodução ou exibição do nosso Conteúdo. Reservamos + todos os direitos que não lhe sejam expressamente concedidos em + relação aos Serviços, Conteúdo e Marcas. Qualquer violação destes + Direitos de Propriedade Intelectual constituirá uma violação + material dos nossos Termos Legais e o seu direito de utilizar os + nossos Serviços será rescindido imediatamente. Os seus envios Por + favor, reveja esta secção e o "ATIVIDADES PROIBIDAS " secção + cuidadosamente antes de utilizar os nossos Serviços para + compreender (a) os direitos que nos concede e (b) as obrigações + que tem ao publicar ou carregar qualquer conteúdo através dos + Serviços. Submissões:Ao enviar-nos diretamente qualquer pergunta, + comentário, sugestão, ideia, feedback ou outra informação sobre os + Serviços ("Submissões"), concorda em ceder-nos todos os direitos + de propriedade intelectual sobre tal Envio. Concorda que seremos + os proprietários deste Envio e teremos o direito ao seu uso e + divulgação irrestritos para qualquer fim lícito, comercial ou + outro, sem reconhecimento ou compensação para si. É responsável + pelo que publica ou carrega:Ao enviar-nos Envios através de + qualquer parte dos Serviços, você: confirme que leu e concorda com + os nossos "ATIVIDADES PROIBIDAS " e não publicará, enviará, + carregará ou transmitirá através dos Serviços qualquer Envio que + seja ilegal, assediante, odioso, prejudicial, difamatório, + obsceno, intimidante, abusivo, discriminatório, ameaçador para + qualquer pessoa ou grupo, sexualmente explícito, falso, impreciso, + enganoso ou enganoso; na medida do permitido pela lei aplicável, + renunciar a todos e quaisquer direitos morais sobre tal Envio; + garante que tais Envio são originais seus ou que tem os direitos e + licenças necessários para enviar tais Envio e que tem plena + autoridade para nos conceder os direitos acima mencionados em + relação aos seus Envio; e garante e declara que os seus Envio não + constituem informação confidencial. É o único responsável pelos + seus Envio e concorda expressamente em reembolsar-nos por todas e + quaisquer perdas que possamos sofrer devido à sua violação (a) + desta secção, (b) de quaisquer direitos de propriedade intelectual + de terceiros ou (c) da lei aplicável. + + + + 3. REPRESENTAÇÕES DO UTILIZADOR + + + + Ao utilizar os Serviços, declara e garante que: (1) todas as + informações de registo que enviar serão verdadeiras, precisas, + atuais e completas; (2) manterá a precisão dessas informações e + atualizá-las-á prontamente conforme necessário; (3) tem capacidade + legal e concorda em cumprir estes Termos Legais; (4) não é menor + de idade na jurisdição em que reside ou, se menor de idade, + recebeu autorização dos pais para utilizar os Serviços; (5) não + acederá aos Serviços por meios automatizados ou não humanos, seja + através de um bot, script ou de outra forma; (6) não utilizará os + Serviços para qualquer fim ilegal ou não autorizado; e (7) a sua + utilização dos Serviços não violará qualquer lei ou regulamento + aplicável. Se fornecer qualquer informação falsa, imprecisa, + desatualizada ou incompleta, temos o direito de suspender ou + encerrar a sua conta e recusar toda e qualquer utilização atual ou + futura dos Serviços (ou qualquer parte dos mesmos). + + + + 4. REGISTO DO UTILIZADOR + + + + Poderá ser necessário que se registe para utilizar os Serviços. + Concorda em manter a sua palavra-passe confidencial e será + responsável por toda a utilização da sua conta e palavra-passe. + Reservamo-nos o direito de remover, recuperar ou alterar um nome + de utilizador que selecione se determinarmos, a nosso exclusivo + critério, que tal nome de utilizador é inapropriado, obsceno ou de + outra forma censurável. + + + + 5. ATIVIDADES PROIBIDAS + + + + Não poderá aceder ou utilizar os Serviços para qualquer outra + finalidade que não aquela para a qual os disponibilizamos. Os + Serviços não poderão ser utilizados em relação a quaisquer + empreendimentos comerciais, exceto aqueles especificamente + endossados ou aprovados por nós. Como utilizador dos Serviços, + concorda em não: + + + - Recuperar sistematicamente dados ou outro conteúdo dos Serviços + para criar ou compilar, direta ou indiretamente, uma coleção, + compilação, base de dados ou diretório sem a nossa autorização por + escrito. Enganar, defraudar ou induzir em erro + + + - A nós e a outros utilizadores, especialmente em qualquer + tentativa de obter informações confidenciais da conta, como + palavras-passe de utilizadores. + + + - Contornar, desativar ou de qualquer outra forma interferir com + características de segurança dos Serviços, incluindo + características que impeçam ou restrinjam a utilização ou cópia de + qualquer Conteúdo ou imponham limitações à utilização dos Serviços + e/ou do Conteúdo neles contido. Denegrir, denegrir ou de qualquer + outra forma prejudicar, na nossa opinião, a nós e/ou aos Serviços. + + + - Utilizar quaisquer informações obtidas nos Serviços para + assediar, abusar ou prejudicar outra pessoa. + + + - Fazer um uso indevido dos nossos serviços de apoio ou enviar + denúncias falsas de abuso ou má conduta. + + + - Utilizar os Serviços de forma incompatível com quaisquer leis ou + regulamentos aplicáveis. + + + - Envolver-se em enquadramentos ou vinculação não autorizados dos + Serviços. + + + - Carregar ou transmitir (ou tentar carregar ou transmitir) vírus, + cavalos de Troia ou outro material, incluindo o uso excessivo de + letras maiúsculas e spam (publicação contínua de texto + repetitivo), que interfira com a utilização e aproveitamento + ininterrupto dos Serviços por qualquer parte ou modifique, + prejudique, interrompa, altere ou interfira com a utilização, + recursos, funções, operação ou manutenção dos Serviços. + + + - Fazer qualquer utilização automatizada do sistema, como utilizar + scripts para enviar comentários ou mensagens, ou utilizar data + mining, robots ou ferramentas semelhantes de recolha e extração de + dados. + + + - Apagar o aviso de direitos de autor ou outros direitos de + propriedade de qualquer Conteúdo. + + + - Tentar representar outro utilizador ou pessoa ou utilizar o nome + de utilizador de outro utilizador. + + + - Carregar ou transmitir (ou tentar carregar ou transmitir) + qualquer material que atue como um mecanismo passivo ou ativo de + recolha ou transmissão de informações, incluindo, sem limitação, + formatos de intercâmbio gráfico transparentes ("gifs"), pixels + 1×1, web bugs, cookies ou outros dispositivos semelhantes (por + vezes designados por "spyware" ou "mecanismos de recolha passiva" + ou "pcms"). + + + - Interferir, interromper ou criar uma sobrecarga indevida nos + Serviços ou nas redes ou serviços ligados aos Serviços. + + + - Assediar, incomodar, intimidar ou ameaçar qualquer um dos nossos + funcionários ou agentes envolvidos na prestação de qualquer parte + dos Serviços a si. + + + - Tentar contornar quaisquer medidas dos Serviços destinadas a + impedir ou restringir o acesso aos Serviços, ou a qualquer parte + dos Serviços. + + + - Copiar ou adaptar o software dos Serviços, incluindo, entre + outros, Flash, PHP, HTML, JavaScript ou outro código. + + + - Exceto conforme permitido pela lei aplicável, decifrar, + descompilar, desmontar ou fazer engenharia reversa de qualquer + software que componha ou de qualquer forma faça parte dos + Serviços. + + + - Exceto quando for o resultado da utilização de motores de busca + padrão ou de navegadores de Internet, utilize, inicie, desenvolva + ou distribua qualquer sistema automatizado, incluindo, sem + limitação, qualquer spider, robô, utilitário de batota, scraper ou + leitor offline que aceda aos Serviços, ou utilize ou inicie + qualquer script não autorizado ou outro software. + + + - Utilize um agente de compras ou agente de compras para fazer + compras nos Serviços. + + + - Fazer qualquer utilização não autorizada dos Serviços, incluindo + a recolha de nomes de utilizador e/ou endereços de e-mail dos + utilizadores por meios eletrónicos ou outros para o envio de + e-mails não solicitados, ou a criação de contas de utilizador por + meios automatizados ou sob falsos pretextos. + + + - Utilizar os Serviços como parte de qualquer esforço para + competir connosco ou de outra forma utilizar os Serviços e/ou o + Conteúdo para qualquer empreendimento ou empreendimento comercial + de geração de receitas. + + + - Utilizar os Serviços como parte de qualquer esforço para + competir connosco ou de outra forma utilizar os Serviços e/ou o + Conteúdo para qualquer empreendimento ou empreendimento comercial + de geração de receitas. + + + + 6. CONTRIBUIÇÕES GERADAS PELO UTILIZADOR + + + + Os Serviços não oferecem aos utilizadores a possibilidade de + enviar ou publicar conteúdos. + + + + 7. LICENÇA DE CONTRIBUIÇÃO + + + + O Utilizador e os Serviços concordam que podemos aceder, + armazenar, processar e utilizar quaisquer informações e dados + pessoais que nos forneça e as suas escolhas (incluindo + definições). Ao enviar sugestões ou outros comentários sobre os + Serviços, concorda que podemos utilizar e partilhar tais + comentários para qualquer fim sem compensação para si. + + + + 8. LICENÇA DE APLICAÇÃO MÓVEL + + + Licença de utilização + + Se aceder aos Serviços através da Aplicação, concedemos-lhe um + direito revogável, não exclusivo, intransmissível e limitado de + instalar e utilizar a Aplicação em dispositivos eletrónicos sem + fios de sua propriedade ou controlados por si, e de aceder e + utilizar a Aplicação em tais dispositivos estritamente de acordo + com os termos e condições desta licença de aplicação móvel contida + nestes Termos Legais. Não deverá: (1) exceto conforme permitido + pela lei aplicável, descompilar, fazer engenharia reversa, + desmontar, tentar derivar o código-fonte ou desencriptar a + Aplicação; (2) fazer qualquer modificação, adaptação, melhoria, + aperfeiçoamento, tradução ou trabalho derivado da Aplicação; (3) + violar quaisquer leis, regras ou regulamentos aplicáveis + relacionados com o seu acesso ou utilização da Aplicação; (4) + remover, alterar ou ocultar qualquer aviso de propriedade + (incluindo qualquer aviso de direitos de autor ou marca comercial) + publicado por nós ou pelos licenciadores da Aplicação; (5) + utilizar o Aplicativo para qualquer empreendimento de geração de + receitas, empreendimento comercial ou outro fim para o qual não + foi concebido ou pretendido; (6) disponibilizar a aplicação numa + rede ou noutro ambiente que permita o acesso ou a utilização por + vários dispositivos ou utilizadores ao mesmo tempo; (7) utilizar a + aplicação para criar um produto, serviço ou software que seja, + direta ou indiretamente, competitivo ou de alguma forma um + substituto da aplicação; (8) utilizar a aplicação para enviar + consultas automatizadas a qualquer site ou para enviar qualquer + e-mail comercial não solicitado; ou (9) utilizar qualquer + informação proprietária ou qualquer uma das nossas interfaces ou a + nossa outra propriedade intelectual no design, desenvolvimento, + fabrico, licenciamento ou distribuição de quaisquer aplicações, + acessórios ou dispositivos para utilização com a aplicação. + + + + Dispositivos Apple e Android + + + Os seguintes termos aplicam-se quando utiliza a aplicação obtida + na Apple Store ou no Google Play (cada um deles um "Distribuidor + de Aplicações") para aceder aos Serviços: (1) a licença que lhe + foi concedida para a nossa aplicação está limitada a uma licença + não transferível para utilizar a aplicação num dispositivo que + utilize os sistemas operativos Apple iOS ou Android, conforme + aplicável, e de acordo com as regras de utilização estabelecidas + nos termos de serviço do Distribuidor de Aplicações aplicável; (2) + somos responsáveis por prestar quaisquer serviços de manutenção e + suporte relativamente à aplicação, conforme especificado nos + termos e condições desta licença de aplicação móvel contida nestes + Termos Legais ou conforme exigido pela lei aplicável, e reconhece + que cada Distribuidor de Aplicações não tem qualquer obrigação de + prestar quaisquer serviços de manutenção e suporte relativamente à + aplicação; (3) no caso de qualquer falha da aplicação em + conformidade com qualquer garantia aplicável, poderá notificar o + distribuidor da aplicação aplicável, e o distribuidor da + aplicação, de acordo com os seus termos e políticas, poderá + reembolsar o preço de compra, se existir, pago pela aplicação e, + na medida do permitido pela lei aplicável, o distribuidor da + aplicação não terá qualquer outra obrigação de garantia + relativamente à aplicação; (4) declara e garante que (i) não está + localizado num país sujeito a um embargo do governo dos EUA ou que + foi designado pelo governo dos EUA como um país "que apoia o + terrorismo" e (ii) não está listado em nenhuma lista do governo + dos EUA de partes proibidas ou restritas; (5) deve cumprir os + termos de acordo de terceiros aplicáveis ao utilizar a aplicação, + por exemplo, se tiver uma aplicação VoIP, não deverá estar a + violar o seu acordo de serviço de dados sem fios ao utilizar a + aplicação; e (6) reconhece e concorda que os Distribuidores de + Aplicações são terceiros beneficiários dos termos e condições + desta licença de aplicação móvel contida nestes Termos Legais, e + que cada Distribuidor de Aplicações terá o direito (e será + considerado como tendo aceite o direito) de fazer cumprir os + termos e condições desta licença de aplicação móvel contida nestes + Termos Legais contra si como terceiro beneficiário. + + + + 9. SITES E CONTEÚDOS DE TERCEIROS + + + Os Serviços podem conter ou podem receber links para outros sites + ("Sites de Terceiros"), bem como artigos, fotografias, textos, + gráficos, imagens, designs, música, sons, vídeos, informações, + aplicações, software e outros conteúdos ou itens pertencentes ou + originários de terceiros ("Conteúdo de Terceiros"). Tais Sites de + Terceiros e Conteúdos de Terceiros não são investigados, + monitorizados ou verificados quanto à sua precisão, adequação ou + integralidade, e não somos responsáveis por quaisquer Sites de + Terceiros acedidos através dos Serviços ou por qualquer Conteúdo + de Terceiros publicado, disponibilizado ou instalado a partir dos + Serviços, incluindo o conteúdo, a precisão, a ofensividade, as + opiniões, a fiabilidade, as práticas de privacidade ou outras + políticas contidas nos Sites de Terceiros ou no Conteúdo de + Terceiros. dos Serviços e aceder aos Sites de Terceiros ou + utilizar ou instalar qualquer Conteúdo de Terceiros, fá-lo por sua + conta e risco, e deve estar ciente de que estes Termos Legais já + não prevalecem. Deverá rever os termos e políticas aplicáveis, + incluindo as práticas de privacidade e recolha de dados, de + qualquer site para o qual navegue a partir dos Serviços ou + relacionados com quaisquer aplicações que utilize ou instale a + partir dos Serviços. assumimos qualquer responsabilidade em + relação a tais compras que são exclusivamente entre si e o + terceiro aplicável. Concorda e reconhece que não endossamos os + produtos ou serviços oferecidos em Sites de Terceiros e isentará + de qualquer responsabilidade por qualquer dano causado pela sua + compra de tais produtos ou serviços. + + + + 10. GESTÃO DE SERVIÇOS + + + Reservamo-nos o direito, mas não a obrigação, de: (1) monitorizar + os Serviços em busca de violações dos presentes Termos Legais; (2) + tomar as medidas legais adequadas contra qualquer pessoa que, a + nosso exclusivo critério, viole a lei ou os presentes Termos + Legais, incluindo, sem limitação, denunciar tal utilizador às + autoridades policiais; (3) a nosso exclusivo critério e sem + limitação, recusar, restringir o acesso, limitar a disponibilidade + ou desativar (na medida em que seja tecnologicamente viável) + qualquer das suas Contribuições ou qualquer parte das mesmas; (4) + a nosso exclusivo critério e sem limitação, aviso ou + responsabilidade, remover dos Serviços ou de outra forma desativar + todos os ficheiros e conteúdos que sejam excessivos em tamanho ou + que sejam de alguma forma onerosos para os nossos sistemas; e (5) + gerir os Serviços de outra forma, de forma a proteger os nossos + direitos e propriedade e a facilitar o funcionamento adequado dos + Serviços. + + + + 11. POLÍTICA DE PRIVACIDADE + + + Preocupamo-nos com a privacidade e a segurança dos dados. Ao + utilizar os Serviços, concorda em ficar vinculado à nossa Política + de Privacidade publicada nos Serviços, a qual está incorporada + nestes Termos Legais. Informamos que os Serviços estão alojados em + Portugal. Se aceder aos Serviços a partir de qualquer outra região + do mundo com leis ou outros requisitos que regem a recolha, + utilização ou divulgação de dados pessoais diferentes das leis + aplicáveis em Portugal, então, através da sua utilização contínua + dos Serviços, estará a transferir os seus dados para Portugal e + consente expressamente que os seus dados sejam transferidos e + processados em Portugal. + + + + 12. PRAZO E RESCISÃO + + + Estes Termos Legais permanecerão em pleno vigor e efeito enquanto + utilizar os Serviços. SEM LIMITAR QUALQUER OUTRA DISPOSIÇÃO DESTES + TERMOS LEGAIS, RESERVAMO-NOS O DIREITO DE, A NOSSO EXCLUSIVO + CRITÉRIO E SEM AVISO PRÉVIO OU RESPONSABILIDADE, NEGAR O ACESSO E + O USO DOS SERVIÇOS (INCLUINDO O BLOQUEIO DE CERTOS ENDEREÇOS IP) A + QUALQUER PESSOA, POR QUALQUER MOTIVO OU SEM MOTIVO, INCLUINDO, SEM + LIMITAÇÃO, A VIOLAÇÃO DE QUALQUER REPRESENTAÇÃO, GARANTIA OU + ACORDO CONTIDO NESTES TERMOS LEGAIS OU DE QUALQUER LEI OU + REGULAMENTO APLICÁVEL. PODEMOS ENCERRAR A SUA UTILIZAÇÃO OU + PARTICIPAÇÃO NOS SERVIÇOS OU APAGAR A SUA CONTA E QUALQUER + CONTEÚDO OU INFORMAÇÃO QUE TENHA PUBLICADO A QUALQUER MOMENTO, SEM + AVISO PRÉVIO, A NOSSO EXCLUSIVO CRITÉRIO. Se encerrarmos ou + suspendermos a sua conta por qualquer motivo, estará proibido de + se registar e criar uma nova conta em seu nome, com um nome falso + ou emprestado, ou em nome de terceiros, mesmo que esteja a agir em + nome desses terceiros. Além de encerrar ou suspender a sua conta, + reservamo-nos o direito de tomar as medidas legais adequadas, + incluindo, entre outras, ações cíveis, criminais e injuntivas. + + + + 12. PRAZO E RESCISÃO + + + Estes Termos Legais permanecerão em pleno vigor e efeito enquanto + utilizar os Serviços. SEM LIMITAR QUALQUER OUTRA DISPOSIÇÃO DESTES + TERMOS LEGAIS, RESERVAMO-NOS O DIREITO DE, A NOSSO EXCLUSIVO + CRITÉRIO E SEM AVISO PRÉVIO OU RESPONSABILIDADE, NEGAR O ACESSO E + O USO DOS SERVIÇOS (INCLUINDO O BLOQUEIO DE CERTOS ENDEREÇOS IP) A + QUALQUER PESSOA, POR QUALQUER MOTIVO OU SEM MOTIVO, INCLUINDO, SEM + LIMITAÇÃO, A VIOLAÇÃO DE QUALQUER REPRESENTAÇÃO, GARANTIA OU + ACORDO CONTIDO NESTES TERMOS LEGAIS OU DE QUALQUER LEI OU + REGULAMENTO APLICÁVEL. PODEMOS ENCERRAR A SUA UTILIZAÇÃO OU + PARTICIPAÇÃO NOS SERVIÇOS OU APAGAR A SUA CONTA E QUALQUER + CONTEÚDO OU INFORMAÇÃO QUE TENHA PUBLICADO A QUALQUER MOMENTO, SEM + AVISO PRÉVIO, A NOSSO EXCLUSIVO CRITÉRIO. Se encerrarmos ou + suspendermos a sua conta por qualquer motivo, estará proibido de + se registar e criar uma nova conta em seu nome, com um nome falso + ou emprestado, ou em nome de terceiros, mesmo que esteja a agir em + nome desses terceiros. Além de encerrar ou suspender a sua conta, + reservamo-nos o direito de tomar as medidas legais adequadas, + incluindo, entre outras, ações cíveis, criminais e injuntivas. + + + + 13. MODIFICAÇÕES E INTERRUPÇÕES + + + Reservamo-nos o direito de alterar, modificar ou remover o + conteúdo dos Serviços a qualquer momento ou por qualquer motivo, a + nosso exclusivo critério, sem aviso prévio. No entanto, não temos + qualquer obrigação de atualizar qualquer informação nos nossos + Serviços. Não seremos responsáveis perante si ou terceiros por + qualquer modificação, alteração de preço, suspensão ou + descontinuação dos Serviços. Não podemos garantir que os Serviços + estejam disponíveis em todos os momentos. Poderemos enfrentar + problemas de hardware, software ou outros, ou necessitar de + realizar manutenção relacionada com os Serviços, resultando em + interrupções, atrasos ou erros. Reservamo-nos o direito de + alterar, rever, atualizar, suspender, descontinuar ou modificar os + Serviços a qualquer momento ou por qualquer motivo, sem aviso + prévio. Concorda que não temos qualquer responsabilidade por + qualquer perda, dano ou incómodo causado pela sua incapacidade de + aceder ou utilizar os Serviços durante qualquer período de + inatividade ou descontinuação dos Serviços. Nada nestes Termos + Legais será interpretado como uma obrigação para nós de manter e + suportar os Serviços ou de fornecer quaisquer correções, + atualizações ou lançamentos relacionados com os mesmos. + + + + 14. LEI APLICÁVEL + + + Os presentes Termos Legais são regidos e interpretados de acordo + com as leis de Portugal, estando expressamente excluída a + utilização da Convenção das Nações Unidas sobre Contratos de + Compra e Venda Internacional de Mercadorias. Se a sua residência + habitual for na UE e for um consumidor, tem também a proteção que + lhe é conferida pelas disposições obrigatórias da lei do seu país + de residência. A Lumicheck e o utilizador concordam em submeter-se + à jurisdição não exclusiva dos tribunais de Aveiro, o que + significa que poderá apresentar uma reclamação para defender os + seus direitos de proteção do consumidor relativamente a estes + Termos Legais em Portugal ou no país da UE em que reside. + + + + 15. RESOLUÇÃO DE LITÍGIOS + + Negociações informais + + Para agilizar a resolução e controlar os custos de qualquer + litígio, controvérsia ou reclamação relacionada com estes Termos + Legais (cada uma, uma "Disputa" e, coletivamente, as "Disputas") + movidas por si ou por nós (individualmente, uma "Parte" e, + coletivamente, as "Partes"), as Partes concordam em tentar + negociar qualquer Disputa (exceto as Disputas expressamente + previstas abaixo) informalmente durante pelo menos trinta (30) + dias antes de iniciar a arbitragem. Tais negociações informais + terão início mediante notificação escrita de uma Parte à outra. + + Arbitragem Vinculativa + + Qualquer litígio decorrente das relações entre as Partes dos + presentes Termos Legais será resolvido por um árbitro, escolhido + de acordo com o Regulamento de Arbitragem e o Regulamento Interno + do Tribunal Europeu de Arbitragem, que faz parte do Centro Europeu + de Arbitragem, com sede em Estrasburgo, em vigor no momento da + apresentação do pedido de arbitragem, e cuja adoção desta cláusula + constitui aceitação. A sede da arbitragem será Aveiro, Portugal. O + idioma do processo será o português. As regras de direito + substantivo aplicáveis serão a lei de Portugal. + + Restrições + + As Partes concordam que qualquer arbitragem será limitada ao + Litígio entre as Partes individualmente. Na medida máxima + permitida por lei, (a) nenhuma arbitragem será agregada a qualquer + outro processo; (b) não existe o direito ou a autoridade para que + qualquer Litígio seja arbitrado com base numa ação coletiva ou + para utilizar procedimentos de ação coletiva; e (c) não existe o + direito ou a autoridade para que qualquer Litígio seja apresentado + numa suposta qualidade representativa em nome do público em geral + ou de quaisquer outras pessoas. + + + Exceções às Negociações Informais e Arbitragem + + + As Partes concordam que os seguintes Litígios não estão sujeitos + às disposições acima referidas relativas a negociações informais e + arbitragem vinculativa: (a) quaisquer Litígios que visem fazer + cumprir ou proteger, ou relativos à validade de, quaisquer + direitos de propriedade intelectual de uma Parte; (b) qualquer + Litígio relacionado com, ou decorrente de, alegações de roubo, + pirataria, invasão de privacidade ou utilização não autorizada; e + (c) qualquer pedido de providência cautelar. Se esta disposição + for considerada ilegal ou inexequível, nenhuma das Partes optará + por arbitrar qualquer Litígio que se enquadre na parte desta + disposição considerada ilegal ou inexequível, e tal Litígio será + decidido por um tribunal de jurisdição competente de entre os + tribunais listados para a jurisdição acima, e as Partes concordam + em submeter-se à jurisdição pessoal desse tribunal. + + + 16. CORREÇÕES + + Poderão existir informações nos Serviços que contenham erros + tipográficos, imprecisões ou omissões, incluindo descrições, + preços, disponibilidade e diversas outras informações. + Reservamo-nos o direito de corrigir quaisquer erros, imprecisões + ou omissões e de alterar ou atualizar as informações contidas nos + Serviços a qualquer momento, sem aviso prévio. + + + + 17. ISENÇÃO DE RESPONSABILIDADE + + + OS SERVIÇOS SÃO FORNECIDOS NO ESTADO EM QUE SE ENCONTRAM E + CONFORME DISPONÍVEIS. CONCORDA QUE A UTILIZAÇÃO DOS SERVIÇOS SERÁ + POR SUA CONTA E RISCO. ATÉ AO LIMITE MÁXIMO PERMITIDO POR LEI, + ISENTAMOS TODAS AS GARANTIAS, EXPRESSAS OU IMPLÍCITAS, RELATIVAS + AOS SERVIÇOS E À SUA UTILIZAÇÃO, INCLUINDO, SEM LIMITAÇÃO, AS + GARANTIAS IMPLÍCITAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM + DETERMINADO FIM E NÃO INFRACÇÃO. NÃO OFERECEMOS NENHUMA GARANTIA + OU REPRESENTAÇÃO SOBRE A PRECISÃO OU INTEGRIDADE DO CONTEÚDO DOS + SERVIÇOS OU DO CONTEÚDO DE QUAISQUER SITES OU APLICAÇÕES MÓVEIS + VINCULADAS AOS SERVIÇOS E NÃO ASSUMIMOS NENHUMA RESPONSABILIDADE + POR QUAISQUER (1) ERROS, ENGANOS OU IMPRECISÕES DE CONTEÚDO E + MATERIAIS, (2) LESÕES PESSOAIS OU DANOS À PROPRIEDADE, DE QUALQUER + NATUREZA, RESULTANTES DO SEU ACESSO E UTILIZAÇÃO DOS SERVIÇOS, (3) + QUALQUER ACESSO OU UTILIZAÇÃO NÃO AUTORIZADA DOS NOSSOS SERVIDORES + SEGUROS E/OU DE QUALQUER E TODA A INFORMAÇÃO PESSOAL E/OU + INFORMAÇÃO FINANCEIRA ARMAZENADA NELES, (4) QUALQUER INTERRUPÇÃO + OU CESSAÇÃO DE TRANSMISSÃO DE OU PARA OS SERVIÇOS, (5) QUALQUER + BUGS, VÍRUS, CAVALOS DE TROIA OU SIMILARES QUE POSSAM SER + TRANSMITIDOS PARA OU ATRAVÉS DOS SERVIÇOS POR TERCEIROS E/OU (6) + QUAISQUER ERROS OU OMISSÕES EM QUALQUER CONTEÚDO E MATERIAIS OU + POR QUALQUER PERDA OU DANO DE QUALQUER TIPO INCORRIDO EM RESULTADO + DA UTILIZAÇÃO DE QUALQUER CONTEÚDO PUBLICADO, TRANSMITIDO OU DE + OUTRA FORMA DISPONIBILIZADO ATRAVÉS DOS SERVIÇOS. NÃO GARANTIMOS, + ENDOSSAMOS, GARANTEMOS OU ASSUMIMOS RESPONSABILIDADE POR QUALQUER + PRODUTO OU SERVIÇO ANUNCIADO OU OFERECIDO POR TERCEIROS ATRAVÉS + DOS SERVIÇOS, QUALQUER SITE COM HIPERLINK, OU QUALQUER SITE OU + APLICAÇÃO MÓVEL APRESENTADO EM QUALQUER BANNER OU OUTRA + PUBLICIDADE, E NÃO SEREMOS PARTE OU DE QUALQUER FORMA RESPONSÁVEIS + POR MONITORIZAR QUALQUER TRANSAÇÃO ENTRE SI E QUAISQUER TERCEIROS + FORNECEDORES DE PRODUTOS OU SERVIÇOS. ASSIM COMO NA COMPRA DE UM + PRODUTO OU SERVIÇO ATRAVÉS DE QUALQUER MEIO OU EM QUALQUER + AMBIENTE, DEVE UTILIZAR O SEU MELHOR JULGAMENTO E TER CAUTELA + QUANDO APROPRIADO. + + + + 18. LIMITAÇÕES DE RESPONSABILIDADE + + + EM NENHUMA HIPÓTESE NÓS OU OS NOSSOS ADMINISTRADORES, FUNCIONÁRIOS + OU AGENTES SEREMOS RESPONSÁVEIS PERANTE SI OU QUALQUER TERCEIRO + POR QUAISQUER DANOS DIRETOS, INDIRETOS, CONSEQUENCIAIS, + EXEMPLARES, ACIDENTAIS, ESPECIAIS OU PUNITIVOS, INCLUINDO LUCROS + CESSANTES, PERDA DE RECEITA, PERDA DE DADOS OU OUTROS DANOS + DECORRENTES DA SUA UTILIZAÇÃO DOS SERVIÇOS, MESMO QUE TENHAMOS + SIDO AVISADOS DA POSSIBILIDADE DE TAIS DANOS. + + + 19. INDEMNIZAÇÃO + + + Concorda em defender, indemnizar e isentar-nos, incluindo as + nossas subsidiárias, afiliadas e todos os nossos respetivos + executivos, agentes, parceiros e funcionários, de e contra + qualquer perda, dano, responsabilidade, reclamação ou exigência, + incluindo honorários de advogados e despesas razoáveis, feitas por + terceiros devido a ou decorrentes de: (1) utilização dos Serviços; + (2) violação dos presentes Termos Legais; (3) qualquer violação + das suas representações e garantias estabelecidas nos presentes + Termos Legais; (4) a sua violação dos direitos de terceiros, + incluindo, mas não limitado a, direitos de propriedade + intelectual; ou (5) qualquer ato nocivo manifesto contra qualquer + outro utilizador dos Serviços com o qual se tenha ligado através + dos Serviços. Não obstante o acima exposto, reservamo-nos o + direito de, a suas expensas, assumir a defesa e o controlo + exclusivos de qualquer assunto para o qual seja obrigado a + indemnizar-nos, e concorda em cooperar, a suas expensas, com a + nossa defesa de tais reclamações. Faremos todos os esforços + razoáveis para o notificar de qualquer reclamação, ação ou + processo sujeito a esta indemnização assim que tomarmos + conhecimento da mesma. + + + 20. DADOS DO UTILIZADOR + + + Conservaremos determinados dados que transmita aos Serviços com a + finalidade de gerir o desempenho dos Serviços, bem como dados + relacionados com a sua utilização dos Serviços. Embora realizemos + cópias de segurança regulares dos dados, é o único responsável por + todos os dados que transmitir ou que estejam relacionados com + qualquer atividade que tenha realizado com recurso aos Serviços. + Concorda que não teremos qualquer responsabilidade perante si por + qualquer perda ou corrupção de tais dados e, por este meio, + renuncia a qualquer direito de ação contra nós decorrente de tal + perda ou corrupção de tais dados. + + + 21. COMUNICAÇÕES ELECTRÓNICAS, TRANSACÇÕES E ASSINATURAS + + + Visitar os Serviços, enviar e-mails e preencher formulários online + constituem comunicações eletrónicas. Consente em receber + comunicações eletrónicas e concorda que todos os contratos, + avisos, divulgações e outras comunicações que lhe fornecemos por + via eletrónica, por e-mail e nos Serviços, cumprem qualquer + requisito legal de que tal comunicação seja feita por escrito. + CONCORDA COM A UTILIZAÇÃO DE ASSINATURAS ELETRÓNICAS, CONTRATOS, + ENCOMENDAS E OUTROS REGISTOS, BEM COMO COM A ENTREGA ELETRÓNICA DE + AVISOS, POLÍTICAS E REGISTOS DE TRANSAÇÕES INICIADAS OU CONCLUÍDAS + POR NÓS OU ATRAVÉS DOS SERVIÇOS. Renuncia a quaisquer direitos ou + requisitos ao abrigo de quaisquer estatutos, regulamentos, regras, + portarias ou outras leis em qualquer jurisdição que exijam uma + assinatura original ou entrega ou retenção de registos não + eletrónicos, ou pagamentos ou a concessão de créditos por + quaisquer meios que não sejam eletrónicos. + + 22. DIVERSOS + + Estes Termos Legais e quaisquer políticas ou regras operacionais + publicadas por nós nos Serviços ou em relação aos Serviços + constituem o acordo e entendimento integral entre si e nós. A + nossa falha em exercer ou executar qualquer direito ou disposição + destes Termos Legais não operará como uma renúncia a tal direito + ou disposição. Estes Termos Legais operam na máxima extensão + permitida por lei. Podemos ceder qualquer ou todos os nossos + direitos e obrigações a terceiros a qualquer momento. Não seremos + responsáveis por qualquer perda, dano, atraso ou omissão de ação + causados por qualquer causa fora do nosso controlo razoável. Se + qualquer disposição ou parte de uma disposição destes Termos + Legais for determinada ilegal, nula ou inexequível, essa + disposição ou parte da disposição será considerada separável + destes Termos Legais e não afetará a validade e a exequibilidade + de quaisquer disposições restantes. Não existe qualquer relação de + joint venture, parceria, emprego ou agência criada entre si e nós + como resultado destes Termos Legais ou da utilização dos Serviços. + Concorda que estes Termos Legais não serão interpretados contra + nós em virtude de os ter elaborado. Renuncia a toda e qualquer + defesa que possa ter com base no formato eletrónico destes Termos + Legais e na falta de assinatura pelas partes para executar estes + Termos Legais. + + + 23.º A PONTUAÇÃO NÃO É UM DIAGNÓSTICO + + + No Lumicheck, utilizamos o Teste de Dependência da Internet para + dar uma pontuação ao utilizador e verificar a potencial influência + que o telemóvel tem na sua vida. Mas não é um diagnóstico. O + Lumicheck é uma aplicação e não consegue diagnosticar pessoas, + apenas os profissionais de saúde conseguem. + + + 24. CONTACTE-NOS + + + Para resolver uma reclamação sobre os Serviços ou receber mais + informações sobre a utilização dos Serviços, contacte-nos através + do endereço: + + Lumicheck + Aveiro + Portugal + lumicheck.app@gmail.com { const progressWidth = `${(progress / total) * 100}%`; let IconComponent = icon || BlockedTrophy; - if (icon === 'Chest') { - IconComponent = ChestIcon; - } - const descriptionCutted = - description.length > 32 + description?.length > 32 ? `${description.substring(0, 30)}...` : description; + // Check if IconComponent is valid + if (!IconComponent) { + console.error('IconComponent is undefined for icon:', icon); + return null; // or return a placeholder + } + return ( {/* Ícone */} - - {/* se for chest mete Image se for outro mete o svg */} - {icon === 'Chest' ? ( - - ) : ( - - )} + + - - {/* Conteúdo de progresso */} {/* Texto */} @@ -40,15 +32,18 @@ const TrophyProgress = ({ text, description, progress, total, icon }) => { {/* Barra de progresso */} - - - - - {/* Contador */} - {`${progress}/${total}`} + {progress !== undefined && total !== undefined && ( + <> + + + + + {`${progress}/${total}`} + + )} ); diff --git a/src/eventEmitter.js b/src/eventEmitter.js new file mode 100644 index 0000000..284d9eb --- /dev/null +++ b/src/eventEmitter.js @@ -0,0 +1,2 @@ +import { EventEmitter } from 'events'; +export default new EventEmitter(); diff --git a/src/index.js b/src/index.js index 6ced880..dfdefeb 100644 --- a/src/index.js +++ b/src/index.js @@ -16,7 +16,14 @@ messaging().setBackgroundMessageHandler(async remoteMessage => { FloatingBubble.showBubble(); FloatingBubble.showMessage(remoteMessage.notification.body); } - }); +}); + +messaging().onNotificationOpenedApp(remoteMessage => { + console.log('Notification caused app to open from background:', remoteMessage); + // Pequeno delay para garantir que a navegação está pronta + setTimeout(() => { + NavigationRef.current?.navigate('QuestionPage'); + }, 10000);}) function ReduxWrapper() { return ( diff --git a/src/pages/AllLumiQuestions.js b/src/pages/AllLumiQuestions.js index 11280bf..dac3dbf 100644 --- a/src/pages/AllLumiQuestions.js +++ b/src/pages/AllLumiQuestions.js @@ -7,6 +7,9 @@ import Lumi3Colors from '../components/Lumi3Colors.js'; import { useDispatch, useSelector } from 'react-redux'; import { fetchUserAnswers } from '../redux/userAnswersSlice'; +import Lumi from '../../assets/lumis/Lumi.svg'; +import RedLumi from '../../assets/lumis/LumiVermelha.svg' + export default function AllLumiQuestions({ navigation }) { const dispatch = useDispatch(); const { @@ -19,8 +22,32 @@ export default function AllLumiQuestions({ navigation }) { dispatch(fetchUserAnswers()); }, [dispatch]); - if (loading) return A carregar...; - if (error) return Erro: {error}; + if (loading) + return ( + + + + A carregar... + + + ); + if (error) return( + + + + Erro: {error} + + ); // Função para obter a legenda com base na pontuação const getCaptionFromScore = (score) => { diff --git a/src/pages/AllTrophies.js b/src/pages/AllTrophies.js index 1d72f37..f0215cd 100644 --- a/src/pages/AllTrophies.js +++ b/src/pages/AllTrophies.js @@ -1,47 +1,32 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { View, Text, TouchableOpacity, ScrollView } from 'react-native'; import BackgroundGradient from '../components/BackgroundGradient'; import { Ionicons } from '@expo/vector-icons'; import Achievements from '../components/Achievements'; -import PrimeiroPasso from '../../assets/trophies/primeiropasso.svg'; -import BomDiaAlegria from '../../assets/trophies/bomdiaalegria.svg'; -import BomProgresso from '../../assets/trophies/bomprogresso.svg'; +import TrophyProgress from '../components/TrophyProgress'; + +import { useDispatch, useSelector } from 'react-redux'; + +import { fetchUnlockedAchievements } from '../redux/unlockedAchievementsSlice'; +import { fetchLockedAchievements } from '../redux/lockedAchievementsSlice'; +import { checkModoZenProgress } from '../redux/modoZenSlice'; + +import { getTrophyIcon } from '../../assets/trophies'; export default function AllTrophies({ navigation }) { - const trophieswon = [ - { - text: 'Primeiro Passo', - description: 'Completar o teste inicial', - icon: PrimeiroPasso, - }, - { - text: 'Bom Dia Alegria', - description: - 'Não usar o telemóvel nos primeiros 30 minutos após acordar durante 3 dias consecutivos', - icon: BomDiaAlegria, - }, + const dispatch = useDispatch(); + + useEffect(() => { + dispatch(checkModoZenProgress()); + dispatch(fetchUnlockedAchievements()); + dispatch(fetchLockedAchievements()); + }, [dispatch]); - { - text: 'Bom Progresso', - description: - 'Reduzir o uso médio de uma app considerada viciante em 1h por dia durante a semana', - icon: BomProgresso, - }, - ]; + const trophieswon = + useSelector((state) => state.unlockedAchievements.achievements) || []; - const trophiesblocked = [ - { - text: 'Autoconsciênte', - description: - 'Ver o relatório das apps mais usadas todos os dias de uma semana', - icon: null, - }, - { - text: 'Marco das 20', - description: 'Responder a 20 perguntas da Lumi', - icon: null, - }, - ]; + const trophieslocked = + useSelector((state) => state.lockedAchievements.achievements) || []; return ( @@ -69,14 +54,18 @@ export default function AllTrophies({ navigation }) { - navigation.navigate('TrophyDetail', { trophy }) + navigation.navigate('TrophyDetail', { + trophy, + image: getTrophyIcon(trophy.image), + unlocked: true, + }) } > ))} @@ -89,11 +78,15 @@ export default function AllTrophies({ navigation }) { - {trophiesblocked.map((trophy, index) => ( + {trophieslocked.map((trophy, index) => ( - navigation.navigate('TrophyDetail', { trophy }) + navigation.navigate('TrophyDetail', { + trophy, + image: getTrophyIcon(trophy.image), + unlocked: false, + }) } > state.updateUserCredentials + ); + const user = useSelector((state) => state.user.data); + + // Estados inicializados de forma mais segura + const [username, setUsername] = useState(''); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); const [profileImage, setProfileImage] = useState( require('../../assets/user.png') ); - const [newImage, setNewImage] = useState(null); - - const pickImage = async () => { - const result = await ImagePicker.launchImageLibraryAsync({ - mediaTypes: ['images'], - allowsEditing: true, - aspect: [1, 1], - quality: 1, - }); - - if (!result.canceled) { - setNewImage(result.assets[0].uri); + + // Carrega dados do usuário quando disponível + useEffect(() => { + if (user) { + setUsername(user.username || ''); + setEmail(user.email || ''); + } + }, [user]); + + useEffect(() => { + dispatch(loadUserFromStorage()); + }, [dispatch]); + + useEffect(() => { + if (success) { + Alert.alert('Sucesso', 'Dados atualizados com sucesso!', [ + { text: 'OK', onPress: () => navigation.goBack() }, + ]); + } + }, [success, navigation]); + + // Resetar estado quando sair da tela + useEffect(() => { + return () => { + dispatch(resetCredentialsState()); + }; + }, [dispatch]); + + const handleSaveChanges = async () => { + // Validações básicas + if (!password.trim()) { + Alert.alert( + 'Erro', + 'Por favor, insira sua senha para confirmar as alterações' + ); + return; + } + + if (!user) { + Alert.alert('Erro', 'Dados do usuário não carregados'); + return; + } + + // Validação de formato de email se foi alterado + if (email !== user.email && email && !isValidEmail(email)) { + Alert.alert('Erro', 'Por favor, insira um email válido'); + return; + } + + // Validação de username se foi alterado + if (username !== user.username && username && username.length < 3) { + Alert.alert('Erro', 'Username deve ter pelo menos 3 caracteres'); + return; + } + + const updates = {}; + + // Comparar com os valores originais do usuário + if (username !== user.username && username.trim()) { + updates.newUsername = username.trim(); + } + if (email !== user.email && email.trim()) { + updates.newEmail = email.trim(); + } + + if (Object.keys(updates).length === 0) { + Alert.alert('Aviso', 'Nenhuma alteração foi feita'); + return; } - }; - const handleSaveChanges = () => { - if (newImage) { - setProfileImage({ uri: newImage }); - setNewImage(null); + try { + await dispatch( + updateUserCredentials({ + currentPassword: password, + ...updates, + }) + ).unwrap(); + } catch (err) { + // O erro já é tratado pelo Redux, mas podemos adicionar log aqui se necessário + console.log('Erro ao atualizar credenciais:', err); } - alert('Alterações guardadas com sucesso!'); }; + // Função auxiliar para validar email + const isValidEmail = (email) => { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(email); + }; + + // Função para mapear erros do backend para mensagens em português + const getErrorMessage = (error) => { + if (typeof error !== 'string') return 'Erro desconhecido'; + + const errorMap = { + 'Incorrect password': 'Senha incorreta', + 'Username already taken': 'Username já está em uso', + 'Email already in use': 'Email já está em uso', + 'User not found': 'Usuário não encontrado', + }; + + return errorMap[error] || error; + }; + + // Mostrar loading se user ainda não carregou + if (!user) { + return ( + + + Carregando... + + + ); + } + return ( @@ -53,35 +158,25 @@ export default function EditProfile({ navigation }) { - + - - - - - + Username @@ -90,20 +185,53 @@ export default function EditProfile({ navigation }) { Email + + + Confirmar alterações com password + + + + + {/* Mensagem de erro */} + {error && ( + + + {getErrorMessage(error)} + + + )} + - - Guardar Alterações - + {loading ? ( + + Processando... + + ) : ( + + Guardar Alterações + + )} diff --git a/src/pages/HelpPage.js b/src/pages/HelpPage.js index 173c0e6..ab224ec 100644 --- a/src/pages/HelpPage.js +++ b/src/pages/HelpPage.js @@ -16,6 +16,9 @@ import * as Location from 'expo-location'; import { markersOnMap } from '../psicologos_fakes'; import { Linking } from 'react-native'; +import { useDispatch, useSelector } from 'react-redux'; +import { unlockAchievement } from '../redux/achievementSlice'; + const distritos = [ 'Aveiro', 'Beja', @@ -52,6 +55,11 @@ export default function HelpPage() { const [selectedMarker, setSelectedMarker] = useState(null); const [visibleCount, setVisibleCount] = useState(5); + const dispatch = useDispatch(); + const { loading, error, lastUnlocked } = useSelector( + (state) => state.achievement + ); + const [posts] = useState([ { id: 1, @@ -185,7 +193,10 @@ export default function HelpPage() { coordinate={{ latitude: lat, longitude: lng }} title={Nome} description={Telefone} - onPress={() => setSelectedMarker(marker)} + onPress={() => { + dispatch(unlockAchievement({ achievementId: 8 })), + setSelectedMarker(marker); + }} /> ); })} @@ -207,7 +218,7 @@ export default function HelpPage() { makeCall(marker.Telefone)} + onPress={() => makeCall(selectedMarker.Telefone)} accessibilityRole="button" > Linking.openURL(item.link)} + onPress={() => { + dispatch(unlockAchievement({ achievementId: 7 })), + Linking.openURL(item.link); + }} > status.isMonitoring ); const questionCount = perguntas.length; + const trophieswon = + useSelector((state) => state.unlockedAchievements.achievements) || []; + const trophiesCount = trophieswon.length; const [modalVisible, setModalVisible] = useState(false); const user = useSelector((state) => state.user.data); @@ -66,6 +70,7 @@ export default function HomePage() { }, []); useEffect(() => { + dispatch(fetchUnlockedAchievements()); dispatch(loadUserFromStorage()); dispatch(fetchUserAnswers()); dispatch(getIsMonitoringStatus()); @@ -173,7 +178,7 @@ export default function HomePage() { }} className="flex-row items-center" > - 0 + {trophiesCount} @@ -215,6 +220,7 @@ export default function HomePage() { {/* Mostrar o botão ou o card baseado no estado */} @@ -234,18 +240,20 @@ export default function HomePage() { - + - O seu relatório está quase terminado! + {perguntas.length * 5 <= 50 + ? 'Responda a mais algumas perguntas para ter uma pontuação mais precisa.' + : 'O seu relatório está quase terminado.'} - + {/* - + */} )} @@ -289,8 +297,8 @@ export default function HomePage() { - Existem 4270 profissionais de saúde à tua disposição. Não - hesites em contacta-los. + Existem 48 profissionais de saúde à tua disposição. Não hesites + em contacta-los. diff --git a/src/pages/ProfilePage.js b/src/pages/ProfilePage.js index f79d7c9..86fc40c 100644 --- a/src/pages/ProfilePage.js +++ b/src/pages/ProfilePage.js @@ -10,15 +10,15 @@ import { Feather } from '@expo/vector-icons'; import { useNavigation } from '@react-navigation/native'; import { logoutUser } from '../redux/authSlice'; -import PrimeiroPasso from '../../assets/trophies/primeiropasso.svg'; -import BomDiaAlegria from '../../assets/trophies/bomdiaalegria.svg'; -import BomProgresso from '../../assets/trophies/bomprogresso.svg'; -import BlockedTrophy from '../../assets/trophies/trophyblocked.svg'; - import { useDispatch, useSelector } from 'react-redux'; import { fetchUserAnswers } from '../redux/userAnswersSlice'; import { loadUserFromStorage } from '../redux/userSlice'; +import { fetchUnlockedAchievements } from '../redux/unlockedAchievementsSlice'; + +import { getTrophyIcon } from '../../assets/trophies'; +import BlockedTrophy from '../../assets/trophies/trophyblocked.svg'; + export default function ProfilePage() { const navigation = useNavigation(); @@ -26,33 +26,18 @@ export default function ProfilePage() { const { answers: perguntas } = useSelector((state) => state.userAnswers); const user = useSelector((state) => state.user.data); + const trophieswon = + useSelector((state) => state.unlockedAchievements.achievements) || []; + const trophiesCount = trophieswon.length; + useEffect(() => { + dispatch(fetchUnlockedAchievements()); dispatch(loadUserFromStorage()); dispatch(fetchUserAnswers()); }, [dispatch]); const questionCount = perguntas.length; - const trophieswon = [ - { - text: 'Primeiro Passo', - description: 'Completar o teste inicial', - icon: PrimeiroPasso, - }, - { - text: 'Bom Dia Alegria', - description: - 'Não usar o telemóvel nos primeiros 30 minutos após acordar durante 3 dias consecutivos', - icon: BomDiaAlegria, - }, - { - text: 'Bom Progresso', - description: - 'Reduzir o uso médio de uma app considerada viciante em 1h por dia durante a semana', - icon: BomProgresso, - }, - ]; - const handleLogout = async () => { try { await dispatch(logoutUser()).unwrap(); @@ -106,7 +91,9 @@ export default function ProfilePage() { {/* Linha superior: Ícone e número */} - 0 + + {trophiesCount} + {/* Linha inferior: Texto */} @@ -125,25 +112,32 @@ export default function ProfilePage() { {/* Troféus disponíveis */} - {trophieswon.slice(0, 3).map((trophy, index) => ( - - - navigation.navigate('TrophyDetail', { trophy }) - } - > - - + {trophieswon.slice(0, 3).map((trophy, index) => { + const TrophyIcon = getTrophyIcon(trophy.image); + return ( + + + navigation.navigate('TrophyDetail', { + trophy, + image: getTrophyIcon(trophy.image), + unlocked: true, + }) + } + > + + - {index < 2 && ( - - )} - - ))} + {index < 2 && ( + + )} + + ); + })} {/* Troféu bloqueado caso não hajam 3 trofeus */} {Array.from({ length: 3 - trophieswon.length }).map( diff --git a/src/pages/QuestionPage.js b/src/pages/QuestionPage.js index 6e79e65..fa485d5 100644 --- a/src/pages/QuestionPage.js +++ b/src/pages/QuestionPage.js @@ -9,6 +9,10 @@ import { } from '../redux/answerQuestionSlice'; import Ionicons from 'react-native-vector-icons/Ionicons'; +import { NativeModules } from 'react-native'; + +const { FloatingBubble } = NativeModules; + export default function QuestionPage() { const navigation = useNavigation(); const dispatch = useDispatch(); @@ -24,6 +28,10 @@ export default function QuestionPage() { (state) => state.answerQuestion ); + useEffect(()=>{ + FloatingBubble.hideBubble() + },[]) + useEffect(() => { dispatch(getRandomUnansweredQuestion()); }, [dispatch]); diff --git a/src/pages/ReportPage.js b/src/pages/ReportPage.js index 9850334..c1d5d52 100644 --- a/src/pages/ReportPage.js +++ b/src/pages/ReportPage.js @@ -6,6 +6,7 @@ import { Image, TouchableOpacity, Animated, + AppState, } from 'react-native'; import { FontAwesome } from '@expo/vector-icons'; import { LinearGradient } from 'expo-linear-gradient'; @@ -17,6 +18,7 @@ import Lumi3Colors from '../components/Lumi3Colors'; import LumiQuestion from '../components/LumiQuestion'; import { useNavigation } from '@react-navigation/native'; import Lumi from '../../assets/lumis/Lumi.svg'; +import RedLumi from '../../assets/lumis/LumiVermelha.svg'; import ScoreIcon from '../../assets/icons/scoreicon.svg'; import { useDispatch, useSelector } from 'react-redux'; import { fetchUserAnswers } from '../redux/userAnswersSlice'; @@ -25,69 +27,80 @@ import { fetchUserAnswers } from '../redux/userAnswersSlice'; import { NativeModules } from 'react-native'; export default function ReportPage() { - - //importar os módulos nativos de screen time e work manager + //importar os módulos nativos de screen time const { ScreenTimeModule } = NativeModules; + const [isSTenabled, setIsSTenabled] = useState(false); + //Variaveis para o tempo de ecrã e uso de apps - const [screenTime, setScreenTime] = useState(null); - const [appUsage, setAppUsage] = useState([]); - - //formata o tempo de screen time - function formatTime(minutes) { - if (minutes >= 60) { - const hours = Math.floor(minutes / 60); - const remainingMinutes = minutes % 60; - return remainingMinutes > 0 - ? `${hours}h ${remainingMinutes}min` - : `${hours}h`; + const [screenTime, setScreenTime] = useState(null); + const [appUsage, setAppUsage] = useState([]); + + //função de ir buscar o tempo de ecrã + const fetchScreenTime = async () => { + try { + const response = await ScreenTimeModule.getScreenTime(); + setScreenTime(Math.floor(response.screenTimeMinutes / 60)); + setAppUsage(response.appScreenTime || {}); + let appUsageData = []; + Object.entries(response.appScreenTime).forEach(([app, time]) => { + if (time > 0) { + let appName; + if (app.split('.').pop() === 'android') { + let splitedAppNames = app.split('.'); + appName = splitedAppNames[splitedAppNames.length - 2]; + } else { + appName = app.split('.').pop(); + } + appUsageData.push({ + id: app, + appName: appName, + time: time, + }); + } + }); + + setAppUsage(appUsageData || []); + //console.log(screenTime); + } catch (error) { + console.error('Error fetching screen time:', error); + // Narrow the type of 'error' + const errorMessage = + error instanceof Error ? error.message : 'Could not fetch screen time.'; + + Alert.alert('Error', errorMessage); + } + }; + + const checkScreenTimePermission = async () => { + try { + const hasPermission = await ScreenTimeModule.hasUsageAccess(); + setIsSTenabled(hasPermission); + if (hasPermission) { + fetchScreenTime(); } - return `${minutes}min`; + } catch (error) { + console.log('Error checking screen time permission:', error); } + }; - - //função de ir buscar o tempo de ecrã - const fetchScreenTime = async () => { - try { - const response = await ScreenTimeModule.getScreenTime(); - //console.log('Screen Time Data:', response); - setScreenTime(Math.floor(response.screenTimeMinutes / 60)); - setAppUsage(response.appScreenTime || {}); - let appUsageData = []; - Object.entries(response.appScreenTime).forEach(([app, time]) => { - if (time > 0) { - let appName; - if (app.split('.').pop() === 'android') { - let splitedAppNames = app.split('.'); - appName = splitedAppNames[splitedAppNames.length - 2]; - } else { - appName = app.split('.').pop(); - } - appUsageData.push({ - id: app, - appName: appName, - time: time, - }); - } - }); - - setAppUsage(appUsageData || []); - //console.log(screenTime); - - } catch (error) { - console.error('Error fetching screen time:', error); - // Narrow the type of 'error' - const errorMessage = - error instanceof Error - ? error.message - : 'Could not fetch screen time.'; - - Alert.alert('Error', errorMessage); - } - }; - useEffect(() => { - fetchScreenTime(); + checkScreenTimePermission(); + + const handleAppStateChange = (nextAppState) => { + if (nextAppState === 'active') { + checkScreenTimePermission(); + } + }; + + const subscription = AppState.addEventListener( + 'change', + handleAppStateChange + ); + + return () => { + subscription?.remove(); + }; }, []); const navigation = useNavigation(); @@ -104,8 +117,34 @@ export default function ReportPage() { dispatch(fetchUserAnswers()); }, [dispatch]); - if (loading) return A carregar...; - if (error) return Erro: {error}; + if (loading) + return ( + + + + A carregar... + + + ); + if (error) + return ( + + + + Erro: {error} + + + ); // Função para obter a legenda com base na pontuação const getCaptionFromScore = (score) => { @@ -373,46 +412,86 @@ export default function ReportPage() { accessibilityLabel="Arco de progresso" /> - O seu relatório está quase terminado. + {perguntas.length * 5 <= 50 + ? 'Responda a mais algumas perguntas para ter uma pontuação mais precisa.' + : 'O seu relatório está quase terminado.'} O LumiScore é apenas uma previsão! - - - - - - - - Tempo de ecrã - - - - - - - - Apps mais usadas - - + */} + {isSTenabled ? ( + <> + + + + Tempo de ecrã + + + + + + + + Apps mais usadas + + + + + + ) : ( + <> + + { + navigation.navigate('Perfil', { screen: 'Settings' }) + }}> + + + + + Ativa a opção de ScreenTime nas definições para teres acesso + á tua atividade com mais detalhe + + + + + + )} setMonitorizationModalVisible(true), text: 'Opções de Monitorização', textColor: 'text-black', arrowColor: '#000000', icon: null, }, { - link: 'EditProfile', + action: ()=> setTermsAndConModalVisible(true), text: 'Termos e Condições', textColor: 'text-black', arrowColor: '#000000', @@ -32,7 +54,7 @@ export default function Settings({ navigation }) { const Suporte = [ { - link: 'EditProfile', + link: 'Onboarding', text: 'Onboarding', textColor: 'text-black', arrowColor: '#000000', @@ -59,14 +81,32 @@ export default function Settings({ navigation }) { const DeleteAccount = [ { - link: 'Login', + action: () => setIsDeleteModalVisible(true), text: 'Apagar Conta', textColor: 'text-red', arrowColor: '#da6f6f', - icon: , + icon: , }, ]; + const handleDeleteAccount = async () => { + if (!password) { + Alert.alert('Erro', 'Por favor insira a sua password'); + return; + } + + try { + await dispatch(deleteUserAccount(password)).unwrap(); + Alert.alert('Sucesso', 'A sua conta foi apagada com sucesso'); + navigation.navigate('Login'); + } catch (error) { + Alert.alert('Erro', error.message || 'Ocorreu um erro ao apagar a conta'); + } finally { + setIsDeleteModalVisible(false); + setPassword(''); + } + }; + return ( @@ -79,18 +119,6 @@ export default function Settings({ navigation }) { - {/* - - - Rodrigo - - - rodrigograca@gmail.com - */} Conta @@ -105,13 +133,78 @@ export default function Settings({ navigation }) { - + - + + + {/* Modal para apagar conta */} + setIsDeleteModalVisible(false)} + > + + + { + setIsDeleteModalVisible(false); + setPassword(''); + }} + > + + + + Apagar conta + + + Tens a certeza que queres apagar a tua conta? Esta ação é + irreversível. + + + + + Confirmar alterações com password + + + + + + + + Apagar Conta + + + + + + + + {/* Modal para as settings de monitorização */} + + + ); } diff --git a/src/pages/TrophiesPage.js b/src/pages/TrophiesPage.js index 8f73764..f00c3de 100644 --- a/src/pages/TrophiesPage.js +++ b/src/pages/TrophiesPage.js @@ -1,65 +1,42 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { Text, View, TouchableOpacity, ScrollView } from 'react-native'; import BackgroundGradient from '../components/BackgroundGradient'; import { useNavigation } from '@react-navigation/native'; -import Task from '../components/Task'; import TrophyProgress from '../components/TrophyProgress'; import Achievements from '../components/Achievements'; import DailyTasks from '../components/DailyTasks'; -import PrimeiroPasso from '../../assets/trophies/primeiropasso.svg'; -import BomDiaAlegria from '../../assets/trophies/bomdiaalegria.svg'; -import BomProgresso from '../../assets/trophies/bomprogresso.svg'; +import { useDispatch, useSelector } from 'react-redux'; + +import { fetchUnlockedAchievements } from '../redux/unlockedAchievementsSlice'; +import { fetchLockedAchievements } from '../redux/lockedAchievementsSlice'; +import { checkModoZenProgress } from '../redux/modoZenSlice'; + +import { getTrophyIcon } from '../../assets/trophies'; export default function TrophiesPage() { const navigation = useNavigation(); + const dispatch = useDispatch(); - const trophieswon = [ - { - text: 'Primeiro Passo', - description: 'Completar o teste inicial', - icon: PrimeiroPasso, - }, - { - text: 'Bom Dia Alegria', - description: - 'Não usar o telemóvel nos primeiros 30 minutos após acordar durante 3 dias consecutivos', - icon: BomDiaAlegria, - }, + useEffect(() => { + dispatch(checkModoZenProgress()); + dispatch(fetchUnlockedAchievements()); + dispatch(fetchLockedAchievements()); + }, [dispatch]); - { - text: 'Bom Progresso', - description: - 'Reduzir o uso médio de uma app considerada viciante em 1h por dia durante a semana', - icon: BomProgresso, - }, - ]; + const modoZen = useSelector((state) => state.modoZen.data) || {}; - const trophiesblocked = [ - { - text: 'Autoconsciênte', - description: - 'Ver o relatório das apps mais usadas todos os dias de uma semana', - progress: 4, - total: 7, - icon: null, - }, - { - text: 'Marco das 20', - description: 'Responder a 20 perguntas da Lumi', - progress: 7, - total: 20, - icon: null, - }, - ]; + const trophiesunlocked = + useSelector((state) => state.unlockedAchievements.achievements) || []; + const trophieswon = trophiesunlocked.filter( + (trophy) => trophy.tag !== 'modozen' + ); - const chest = { - text: 'Icon Exclusivo', - description: 'Complete 30 Tarefas Diárias', - progress: 6, - total: 30, - icon: 'Chest', - }; + const trophiesnotwon = + useSelector((state) => state.lockedAchievements.achievements) || []; + const trophieslocked = trophiesnotwon.filter( + (trophy) => trophy.tag !== 'modozen' + ); return ( @@ -95,7 +72,7 @@ export default function TrophiesPage() { {/* Cabeçalho */} - Icon Exclusivo + Troféu Especial @@ -103,39 +80,47 @@ export default function TrophiesPage() { - navigation.navigate('TrophyDetail', { trophy: chest }) + navigation.navigate('TrophyDetail', { + trophy: modoZen.achievement, + image: getTrophyIcon(modoZen.achievement.image), + unlocked: modoZen.unlocked, + }) } > - - Outros Prémios + Outros Troféus - {trophiesblocked.map((trophy, index) => ( + {trophieslocked.slice(0, 3).map((trophy, index) => ( - navigation.navigate('TrophyDetail', { trophy }) + navigation.navigate('TrophyDetail', { + trophy, + image: getTrophyIcon(trophy.image), + unlocked: false, + }) } className="mb-4" > ))} @@ -149,17 +134,21 @@ export default function TrophiesPage() { Sala de Troféus - {trophieswon.map((trophy, index) => ( + {trophieswon.slice(0, 3).map((trophy, index) => ( - navigation.navigate('TrophyDetail', { trophy }) + navigation.navigate('TrophyDetail', { + trophy, + image: getTrophyIcon(trophy.image), + unlocked: true, + }) } > ))} diff --git a/src/pages/TrophyDetail.js b/src/pages/TrophyDetail.js index f1556cb..f6ce44b 100644 --- a/src/pages/TrophyDetail.js +++ b/src/pages/TrophyDetail.js @@ -3,23 +3,22 @@ import { View, Text, TouchableOpacity, ScrollView, Image } from 'react-native'; import BackgroundGradient from '../components/BackgroundGradient'; import { Ionicons } from '@expo/vector-icons'; import BlockedTrophy from '../../assets/trophies/trophyblocked.svg'; -import ChestIcon from '../../assets/trophies/chest.png'; export default function TrophyDetail({ route, navigation }) { - const { trophy } = route.params; - let text, description, IconComponent; + const { trophy, image, unlocked } = route.params; + let name, description, IconComponent; - if (trophy.icon === 'Chest') { - IconComponent = ChestIcon; + if (unlocked) { + IconComponent = image; } else { - IconComponent = trophy.icon || BlockedTrophy; + IconComponent = BlockedTrophy; } if (IconComponent === BlockedTrophy) { - text = '????????'; + name = '????????'; description = trophy.description; } else { - text = trophy.text; + name = trophy.name; description = trophy.description; } @@ -36,21 +35,13 @@ export default function TrophyDetail({ route, navigation }) { - {trophy.icon === 'Chest' ? ( - - ) : ( - - )} + - {text} + {name} {description} @@ -58,7 +49,7 @@ export default function TrophyDetail({ route, navigation }) { - {IconComponent !== BlockedTrophy && IconComponent !== ChestIcon && ( + {IconComponent !== BlockedTrophy && ( { + try { + const token = await AsyncStorage.getItem('token'); + const user = await AsyncStorage.getItem('user'); + if (!token || !user) { + return thunkAPI.rejectWithValue('Usuário não autenticado'); + } + const parsedUser = JSON.parse(user); + const userId = parsedUser.id; + + const response = await fetch( + `${API_URL}/achievement/${userId}/${achievementId}/unlock`, + { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + } + ); + + if (!response.ok) { + const err = await response.json(); + throw new Error(err.detail || 'Erro ao desbloquear troféu'); + } + + const result = await response.json(); + + return { + userId, + achievementId, + message: result.message, + }; + } catch (error) { + return thunkAPI.rejectWithValue(error.message); + } + } +); + +const achievementSlice = createSlice({ + name: 'achievement', + initialState: { + loading: false, + error: null, + lastUnlocked: null, + }, + reducers: {}, + extraReducers: (builder) => { + builder + .addCase(unlockAchievement.pending, (state) => { + state.loading = true; + state.error = null; + }) + .addCase(unlockAchievement.fulfilled, (state, action) => { + state.loading = false; + state.lastUnlocked = action.payload; + }) + .addCase(unlockAchievement.rejected, (state, action) => { + state.loading = false; + state.error = action.payload; + }); + }, +}); + +export const { clearError, clearLastUnlocked } = achievementSlice.actions; +export default achievementSlice.reducer; diff --git a/src/redux/answerQuestionSlice.js b/src/redux/answerQuestionSlice.js index 7ca1491..063a4f0 100644 --- a/src/redux/answerQuestionSlice.js +++ b/src/redux/answerQuestionSlice.js @@ -1,7 +1,7 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; // Submete uma resposta individual para o backend export const submitSingleAnswer = createAsyncThunk( diff --git a/src/redux/authSlice.js b/src/redux/authSlice.js index 0fe45de..ce9ee7b 100644 --- a/src/redux/authSlice.js +++ b/src/redux/authSlice.js @@ -1,8 +1,9 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { NativeModules } from 'react-native'; +import eventEmitter from '../eventEmitter'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; export const loginUser = createAsyncThunk( 'auth/loginUser', @@ -13,22 +14,23 @@ export const loginUser = createAsyncThunk( headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }), }); + const data = await response.json(); - if (response.ok) { - await AsyncStorage.setItem('token', data.access_token); - await AsyncStorage.setItem('refresh_token', data.refresh_token); - await AsyncStorage.setItem('user', JSON.stringify(data.user)); + if (!response.ok) { + return thunkAPI.rejectWithValue(data.detail || 'Login failed'); + } - const { WorkManagerModule } = NativeModules; - WorkManagerModule.setUserId(data.user.id); + await AsyncStorage.setItem('token', data.access_token); + await AsyncStorage.setItem('refresh_token', data.refresh_token); + await AsyncStorage.setItem('user', JSON.stringify(data.user)); + eventEmitter.emit('tokenChanged'); - console.log('User ID set in WorkManager:', data.user.id); + const { WorkManagerModule } = NativeModules; + WorkManagerModule.setUserId(data.user.id); + WorkManagerModule.setAuthToken(data.access_token); - return { token: data.access_token, user: data.user }; - } else { - return thunkAPI.rejectWithValue(data.message); - } + return { token: data.access_token, user: data.user }; } catch (error) { return thunkAPI.rejectWithValue(error.message); } @@ -40,7 +42,9 @@ export const logoutUser = createAsyncThunk( async (_, thunkAPI) => { try { await AsyncStorage.removeItem('token'); + await AsyncStorage.removeItem('refresh_token'); await AsyncStorage.removeItem('user'); + eventEmitter.emit('tokenChanged'); const { WorkManagerModule } = NativeModules; WorkManagerModule.setUserId(-1); diff --git a/src/redux/completedTasksSlice.js b/src/redux/completedTasksSlice.js index 0b24660..f165d93 100644 --- a/src/redux/completedTasksSlice.js +++ b/src/redux/completedTasksSlice.js @@ -1,18 +1,23 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; // Thunk para buscar tarefas concluídas export const fetchCompletedTasks = createAsyncThunk( 'completedTasks/fetchCompletedTasks', async (_, thunkAPI) => { try { + const token = await AsyncStorage.getItem('token'); const userString = await AsyncStorage.getItem('user'); const user = JSON.parse(userString); const userId = user.id; - const response = await fetch(`${API_URL}/task/${userId}/completed`); + const response = await fetch(`${API_URL}/task/${userId}/completed`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); if (!response.ok) { const err = await response.json(); diff --git a/src/redux/dailyTasksSlice.js b/src/redux/dailyTasksSlice.js index 3f0bbad..aba7469 100644 --- a/src/redux/dailyTasksSlice.js +++ b/src/redux/dailyTasksSlice.js @@ -1,17 +1,22 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; export const fetchDailyTasks = createAsyncThunk( 'dailyTasks/fetchDailyTasks', async (_, thunkAPI) => { try { + const token = await AsyncStorage.getItem('token'); const userString = await AsyncStorage.getItem('user'); const user = JSON.parse(userString); const userId = user.id; - const response = await fetch(`${API_URL}/task/${userId}/dailystatus`); + const response = await fetch(`${API_URL}/task/${userId}/dailystatus`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); if (!response.ok) { throw new Error('Failed to fetch daily tasks'); } @@ -27,6 +32,7 @@ export const toggleTaskStatus = createAsyncThunk( 'dailyTasks/toggleTaskStatus', async ({ taskId }, thunkAPI) => { try { + const token = await AsyncStorage.getItem('token'); const userString = await AsyncStorage.getItem('user'); const user = JSON.parse(userString); const userId = user.id; @@ -35,6 +41,9 @@ export const toggleTaskStatus = createAsyncThunk( `${API_URL}/task/${taskId}/${userId}/toggle`, { method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + }, } ); diff --git a/src/redux/deleteAccountSlice.js b/src/redux/deleteAccountSlice.js new file mode 100644 index 0000000..f05ba25 --- /dev/null +++ b/src/redux/deleteAccountSlice.js @@ -0,0 +1,80 @@ +import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; + +export const deleteUserAccount = createAsyncThunk( + 'user/deleteAccount', + async (password, thunkAPI) => { + try { + const token = await AsyncStorage.getItem('token'); + const userData = await AsyncStorage.getItem('user'); + const user = JSON.parse(userData); + const userId = user.id; + + const res = await fetch(`${API_URL}/user/${userId}`, { + method: 'DELETE', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + password: password, + }), + }); + + const data = await res.json(); + + if (!res.ok) { + if (data.detail) { + throw new Error(data.detail); + } + throw new Error('Failed to delete account'); + } + + // Limpar dados do usuário do AsyncStorage + await AsyncStorage.multiRemove(['token', 'user', 'refresh_token']); + + return data; + } catch (error) { + return thunkAPI.rejectWithValue(error.message); + } + } +); + +const deleteAccountSlice = createSlice({ + name: 'deleteAccount', + initialState: { + loading: false, + error: null, + success: false, + }, + reducers: { + resetDeleteAccountState: (state) => { + state.loading = false; + state.error = null; + state.success = false; + }, + }, + extraReducers: (builder) => { + builder + .addCase(deleteUserAccount.pending, (state) => { + state.loading = true; + state.error = null; + state.success = false; + }) + .addCase(deleteUserAccount.fulfilled, (state) => { + state.loading = false; + state.success = true; + state.error = null; + }) + .addCase(deleteUserAccount.rejected, (state, action) => { + state.loading = false; + state.error = action.payload; + state.success = false; + }); + }, +}); + +export const { resetDeleteAccountState } = deleteAccountSlice.actions; +export default deleteAccountSlice.reducer; diff --git a/src/redux/firebaseTokenSlice.js b/src/redux/firebaseTokenSlice.js index 9797b69..5ffab04 100644 --- a/src/redux/firebaseTokenSlice.js +++ b/src/redux/firebaseTokenSlice.js @@ -1,7 +1,7 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; export const getFirebaseToken = createAsyncThunk( 'user/getFirebaseToken', diff --git a/src/redux/fiveQuestionsSlice.js b/src/redux/fiveQuestionsSlice.js index 30571cd..46ba16c 100644 --- a/src/redux/fiveQuestionsSlice.js +++ b/src/redux/fiveQuestionsSlice.js @@ -1,7 +1,7 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; // Envia as 5 respostas para o backend export const submitAnswers = createAsyncThunk( diff --git a/src/redux/isMonitoringSlice.js b/src/redux/isMonitoringSlice.js index b75f3a5..48e1f00 100644 --- a/src/redux/isMonitoringSlice.js +++ b/src/redux/isMonitoringSlice.js @@ -1,7 +1,7 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; // thunk para atualizar is monitoring status do usuário export const updateIsMonitoringStatus = createAsyncThunk( diff --git a/src/redux/lockedAchievementsSlice.js b/src/redux/lockedAchievementsSlice.js new file mode 100644 index 0000000..f6892e5 --- /dev/null +++ b/src/redux/lockedAchievementsSlice.js @@ -0,0 +1,59 @@ +import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; + +// Thunk para buscar troféus bloqueados do utilizador autenticado +export const fetchLockedAchievements = createAsyncThunk( + 'achievements/fetchLocked', + async (_, thunkAPI) => { + try { + const token = await AsyncStorage.getItem('token'); + const userString = await AsyncStorage.getItem('user'); + const user = JSON.parse(userString); + const userId = user.id; + + const response = await fetch(`${API_URL}/achievement/${userId}/locked`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + + if (!response.ok) { + const err = await response.json(); + throw new Error(err.detail || 'Erro ao buscar troféus desbloqueados'); + } + + return await response.json(); + } catch (error) { + return thunkAPI.rejectWithValue(error.message); + } + } +); + +const lockedAchievementsSlice = createSlice({ + name: 'lockedAchievements', + initialState: { + achievements: [], + loading: false, + error: null, + }, + reducers: {}, + extraReducers: (builder) => { + builder + .addCase(fetchLockedAchievements.pending, (state) => { + state.loading = true; + state.error = null; + }) + .addCase(fetchLockedAchievements.fulfilled, (state, action) => { + state.loading = false; + state.achievements = action.payload; + }) + .addCase(fetchLockedAchievements.rejected, (state, action) => { + state.loading = false; + state.error = action.payload; + }); + }, +}); + +export default lockedAchievementsSlice.reducer; diff --git a/src/redux/modoZenSlice.js b/src/redux/modoZenSlice.js new file mode 100644 index 0000000..3613eb6 --- /dev/null +++ b/src/redux/modoZenSlice.js @@ -0,0 +1,71 @@ +import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; + +// Thunk para verificar o progresso do Modo Zen +export const checkModoZenProgress = createAsyncThunk( + 'modoZen/checkProgress', + async (_, thunkAPI) => { + try { + const token = await AsyncStorage.getItem('token'); + const userString = await AsyncStorage.getItem('user'); + const user = JSON.parse(userString); + const userId = user.id; + + const response = await fetch( + `${API_URL}/achievement/${userId}/checkModoZen`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + + if (!response.ok) { + const err = await response.json(); + throw new Error(err.detail || 'Erro ao verificar progresso Modo Zen'); + } + + const data = await response.json(); + + return data; + } catch (error) { + return thunkAPI.rejectWithValue(error.message); + } + } +); + +const modoZenSlice = createSlice({ + name: 'modoZen', + initialState: { + data: {}, + loading: false, + error: null, + }, + reducers: { + resetModoZenState: (state) => { + state.data = {}; + state.loading = false; + state.error = null; + }, + }, + extraReducers: (builder) => { + builder + .addCase(checkModoZenProgress.pending, (state) => { + state.loading = true; + state.error = null; + }) + .addCase(checkModoZenProgress.fulfilled, (state, action) => { + state.loading = false; + state.data = action.payload; + }) + .addCase(checkModoZenProgress.rejected, (state, action) => { + state.loading = false; + state.error = action.payload; + }); + }, +}); + +export const { resetModoZenState } = modoZenSlice.actions; +export default modoZenSlice.reducer; diff --git a/src/redux/onBoardingSlice.js b/src/redux/onBoardingSlice.js index cda7979..59b2c67 100644 --- a/src/redux/onBoardingSlice.js +++ b/src/redux/onBoardingSlice.js @@ -1,7 +1,7 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; // thunk para atualizar onboarding do usuário export const updateOnboardingStatus = createAsyncThunk( diff --git a/src/redux/registerSlice.js b/src/redux/registerSlice.js index 172aba8..e641900 100644 --- a/src/redux/registerSlice.js +++ b/src/redux/registerSlice.js @@ -1,6 +1,6 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; export const registerUser = createAsyncThunk( 'auth/registerUser', diff --git a/src/redux/screentimeSlice.js b/src/redux/screentimeSlice.js new file mode 100644 index 0000000..f29dfa6 --- /dev/null +++ b/src/redux/screentimeSlice.js @@ -0,0 +1,64 @@ +import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; + +// Thunk para buscar screentime dos últimos 7 dias +export const fetchLast7DaysScreenTime = createAsyncThunk( + 'screentime/fetchLast7DaysScreenTime', + async (_, thunkAPI) => { + try { + const token = await AsyncStorage.getItem('token'); + const userString = await AsyncStorage.getItem('user'); + const user = JSON.parse(userString); + const userId = user.id; + + const response = await fetch( + `${API_URL}/screentime/last7days/${userId}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + + if (!response.ok) { + const err = await response.json(); + throw new Error( + err.detail || 'Erro ao buscar screentime dos últimos 7 dias' + ); + } + + return await response.json(); + } catch (error) { + return thunkAPI.rejectWithValue(error.message); + } + } +); + +const screentimeSlice = createSlice({ + name: 'screentime', + initialState: { + last7Days: [], + loading: false, + error: null, + }, + reducers: {}, + extraReducers: (builder) => { + builder + .addCase(fetchLast7DaysScreenTime.pending, (state) => { + state.loading = true; + state.error = null; + }) + .addCase(fetchLast7DaysScreenTime.fulfilled, (state, action) => { + state.loading = false; + state.last7Days = action.payload; + }) + .addCase(fetchLast7DaysScreenTime.rejected, (state, action) => { + state.loading = false; + state.error = action.payload; + }); + }, +}); + +export default screentimeSlice.reducer; diff --git a/src/redux/store.js b/src/redux/store.js index 976f7e7..5cc2f53 100644 --- a/src/redux/store.js +++ b/src/redux/store.js @@ -11,8 +11,14 @@ import isMonitoringReducer from './isMonitoringSlice'; import firebaseTokenReducer from './firebaseTokenSlice'; import answerQuestionReducer from './answerQuestionSlice'; import userReducer from './userSlice'; -` -`; +import screentimeReducer from './screentimeSlice'; +import updateUserCredentialsReducer from './updateUserCredentialsSlice'; +import deleteAccountReducer from './deleteAccountSlice'; +import unlockedAchievementsReducer from './unlockedAchievementsSlice'; +import lockedAchievementsReducer from './lockedAchievementsSlice'; +import modoZenReducer from './modoZenSlice'; +import achievementReducer from './achievementSlice'; + export const store = configureStore({ reducer: { auth: authReducer, @@ -27,5 +33,12 @@ export const store = configureStore({ firebaseToken: firebaseTokenReducer, answerQuestion: answerQuestionReducer, user: userReducer, + screentime: screentimeReducer, + updateUserCredentials: updateUserCredentialsReducer, + deleteAccount: deleteAccountReducer, + unlockedAchievements: unlockedAchievementsReducer, + lockedAchievements: lockedAchievementsReducer, + modoZen: modoZenReducer, + achievement: achievementReducer, }, }); diff --git a/src/redux/unlockedAchievementsSlice.js b/src/redux/unlockedAchievementsSlice.js new file mode 100644 index 0000000..783fed3 --- /dev/null +++ b/src/redux/unlockedAchievementsSlice.js @@ -0,0 +1,62 @@ +import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; + +// Thunk para buscar troféus desbloqueados do utilizador autenticado +export const fetchUnlockedAchievements = createAsyncThunk( + 'achievements/fetchUnlocked', + async (_, thunkAPI) => { + try { + const token = await AsyncStorage.getItem('token'); + const userString = await AsyncStorage.getItem('user'); + const user = JSON.parse(userString); + const userId = user.id; + + const response = await fetch( + `${API_URL}/achievement/${userId}/unlocked`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + + if (!response.ok) { + const err = await response.json(); + throw new Error(err.detail || 'Erro ao buscar troféus desbloqueados'); + } + + return await response.json(); + } catch (error) { + return thunkAPI.rejectWithValue(error.message); + } + } +); + +const unlockedAchievementsSlice = createSlice({ + name: 'unlockedAchievements', + initialState: { + achievements: [], + loading: false, + error: null, + }, + reducers: {}, + extraReducers: (builder) => { + builder + .addCase(fetchUnlockedAchievements.pending, (state) => { + state.loading = true; + state.error = null; + }) + .addCase(fetchUnlockedAchievements.fulfilled, (state, action) => { + state.loading = false; + state.achievements = action.payload; + }) + .addCase(fetchUnlockedAchievements.rejected, (state, action) => { + state.loading = false; + state.error = action.payload; + }); + }, +}); + +export default unlockedAchievementsSlice.reducer; diff --git a/src/redux/updateUserCredentialsSlice.js b/src/redux/updateUserCredentialsSlice.js new file mode 100644 index 0000000..015bc1a --- /dev/null +++ b/src/redux/updateUserCredentialsSlice.js @@ -0,0 +1,87 @@ +import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; + +export const updateUserCredentials = createAsyncThunk( + 'user/updateCredentials', + async ({ currentPassword, newUsername, newEmail }, thunkAPI) => { + try { + const token = await AsyncStorage.getItem('token'); + const userData = await AsyncStorage.getItem('user'); + const user = JSON.parse(userData); + const userId = user.id; + + const res = await fetch(`${API_URL}/user/${userId}/updatecredentials`, { + method: 'PUT', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + current_password: currentPassword, + new_username: newUsername, + new_email: newEmail, + }), + }); + + const data = await res.json(); + + if (!res.ok) { + if (data.detail) { + throw new Error(data.detail); + } + throw new Error('Failed to update credentials'); + } + + // Atualizar localStorage + await AsyncStorage.setItem('user', JSON.stringify(data.user)); + + return data; + } catch (error) { + return thunkAPI.rejectWithValue(error.message); + } + } +); + +const userCredentialsSlice = createSlice({ + name: 'userCredentials', + initialState: { + loading: false, + error: null, + success: false, + updatedFields: null, + }, + reducers: { + resetCredentialsState: (state) => { + state.loading = false; + state.error = null; + state.success = false; + state.updatedFields = null; + }, + }, + extraReducers: (builder) => { + builder + .addCase(updateUserCredentials.pending, (state) => { + state.loading = true; + state.error = null; + state.success = false; + state.updatedFields = null; + }) + .addCase(updateUserCredentials.fulfilled, (state, action) => { + state.loading = false; + state.success = true; + state.updatedFields = action.payload.updated_fields; + state.error = null; + }) + .addCase(updateUserCredentials.rejected, (state, action) => { + state.loading = false; + state.error = action.payload; + state.success = false; + state.updatedFields = null; + }); + }, +}); + +export const { resetCredentialsState } = userCredentialsSlice.actions; +export default userCredentialsSlice.reducer; diff --git a/src/redux/userAnswersSlice.js b/src/redux/userAnswersSlice.js index fa54988..fcedde5 100644 --- a/src/redux/userAnswersSlice.js +++ b/src/redux/userAnswersSlice.js @@ -1,7 +1,7 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; // Thunk para buscar respostas do utilizador autenticado export const fetchUserAnswers = createAsyncThunk( diff --git a/src/redux/userDigitalHabitsSlice.js b/src/redux/userDigitalHabitsSlice.js index a483d92..8c6cdf6 100644 --- a/src/redux/userDigitalHabitsSlice.js +++ b/src/redux/userDigitalHabitsSlice.js @@ -1,7 +1,7 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; // thunk para associar hábitos ao user export const submitDigitalHabits = createAsyncThunk( diff --git a/src/redux/userSlice.js b/src/redux/userSlice.js index 9ccb4fe..cc21e61 100644 --- a/src/redux/userSlice.js +++ b/src/redux/userSlice.js @@ -2,11 +2,6 @@ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; import AsyncStorage from '@react-native-async-storage/async-storage'; -const firstCapitalize = (str) => { - if (!str) return ''; - return str.charAt(0).toUpperCase() + str.slice(1); -}; - // AsyncThunk para carregar e processar o user do AsyncStorage export const loadUserFromStorage = createAsyncThunk( 'user/loadUserFromStorage', @@ -14,10 +9,7 @@ export const loadUserFromStorage = createAsyncThunk( const userJson = await AsyncStorage.getItem('user'); if (userJson) { const user = JSON.parse(userJson); - return { - ...user, - username: firstCapitalize(user.username), - }; + return user; } return null; } diff --git a/src/toastConfig.js b/src/toastConfig.js index 5a65813..7f358ce 100644 --- a/src/toastConfig.js +++ b/src/toastConfig.js @@ -1,11 +1,20 @@ import React from 'react'; import { View, Text, TouchableWithoutFeedback } from 'react-native'; -import { useNavigation } from '@react-navigation/native'; -import TrophyGoldIcon from '../assets/icons/trophygold.svg'; + import { navigate } from './NavigationRef'; +import { getTrophyIcon } from '../assets/trophies'; + +const IconComponent = ({ svg, width = 40, height = 40 }) => { + const SvgIcon = getTrophyIcon(svg); + if (!SvgIcon) { + return null; + } + + return ; +}; const toastConfig = { - success: ({ text1, text2 }) => { + success: ({ text1, text2, props }) => { const handlePress = () => { navigate('Troféus', { screen: 'AllTrophies', @@ -32,7 +41,7 @@ const toastConfig = { }} > - + diff --git a/src/useSocket.js b/src/useSocket.js index 75c0651..1949162 100644 --- a/src/useSocket.js +++ b/src/useSocket.js @@ -2,7 +2,7 @@ import { useEffect } from 'react'; import { io } from 'socket.io-client'; import Toast from 'react-native-toast-message'; -const API_URL = 'https://king-prawn-app-3re4n.ondigitalocean.app'; +const API_URL = process.env.EXPO_PUBLIC_BACKEND_URL_PROD; export default function useSocket(userId) { useEffect(() => { @@ -24,6 +24,7 @@ export default function useSocket(userId) { position: 'top', visibilityTime: 3000, autoHide: true, + props: { svg: data.image }, }); });