commit 8f7a235c93ee9c90666373c3ceadaddc1a7ff36e Author: Siphonight Date: Sat Sep 5 16:32:44 2026 +0200 v1.1.0 : suivi THS avec courbes E2/T, modèles Estrannaise & Transfem Science, calibration labs, rappels (GT 3), backup JSON, FR/EN - Moteur PK par tables horaires (8001 h) extraites de Estrogen.ods + Bateman fallback - Lookup profils insensible à la casse (fix courbes EEn plates) - Conversion unités T (ng/dL, ng/L, nmol/L -> ng/mL) - Édition des doses + override d'ester par injection - 30 tests unitaires dont régression sur données réelles - UI Compose Material 3, i18n FR/EN, sauvegarde JSON SAF diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a045cac --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# Gradle +.gradle/ +build/ + +# Local configuration (machine-specific, never commit) +local.properties + +# IntelliJ / Android Studio +.idea/ +*.iml +*.ipr +*.iws + +# Build outputs +app/build/ +captures/ +.externalNativeBuild/ +.cxx/ +*.apk.idsig +*.hprof + +# Kotlin / Java +.kotlin/ + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log diff --git a/README.md b/README.md new file mode 100644 index 0000000..f83420a --- /dev/null +++ b/README.md @@ -0,0 +1,123 @@ +# HormoneTrack + +Suivi de thérapie hormonale (THS) sur Android, avec courbes estimées **heure par heure** +d'estradiol (E2) et de testostérone (T), calibration sur les prises de sang, rappels +affichés sur smartwatch (Huawei Watch GT 3 via Gadgetbridge ou Huawei Health) et +sauvegarde JSON. **100 % local, aucun compte, aucun serveur.** + +> **⚠️ Avertissement médical** : les courbes sont des **estimations pharmacocinétiques** +> à titre informatif — ce ne sont pas des mesures. Fie-toi toujours à tes analyses de +> sang et aux consignes de ton endocrinologue. + +- **Statut** : v1.1.0 — build Android ✅, 30 tests unitaires ✅ (dont régression sur données réelles), intégration montre = notifications ✅ +- **Journal des versions** : [docs/CHANGELOG.md](docs/CHANGELOG.md) +- **Guide utilisateur** : [docs/GUIDE_INSTALLATION.md](docs/GUIDE_INSTALLATION.md) +- **Doc de développement** (architecture, maths, décisions, bugs) : [docs/DEVELOPPEMENT.md](docs/DEVELOPPEMENT.md) +- **Montre / Gadgetbridge** : [docs/MONTRE-GADGETBRIDGE.md](docs/MONTRE-GADGETBRIDGE.md) + +## Fonctionnalités + +- **Courbes estimées heure par heure** : E2 (pg/mL) et T (ng/mL), vue 24 h / 7 j / 30 j +- **Deux modèles PK au choix** (issus de la feuille `Estrogen.ods` de l'autrice) : + **Estrannaise (EstraNase)** et **Transfem Science**, pour les injections EV / EU / EEn +- **Modèle Bateman** paramétrable (temps au pic, demi-vie, biodisponibilité) pour gel, + patch et voie orale +- **Log des doses** avec date/heure exacte, dose en mg, **ester par injection** + (switch EV↔EU↔EEn comme dans le tableur), **éditable** (tap sur une ligne dans Doses) +- **Analyses de sang** (E2, T, PRL…) tracées sur les courbes comme points de calibration +- **Calibration** : facteur d'échelle par traitement = médiane(lab ÷ prédiction du modèle), + calculé automatiquement (« Scale factor » du `.ods`, automatisé) +- **Estimation T** empirique `T = plancher + (base − plancher) ÷ (1 + k·E2)`, calibrable + avec tes résultats T +- **Rappels quotidiens** avec actions **« Pris » / « Reporter 1 h »** dans la notification ; + les notifications remontent sur la Watch GT 3 (Gadgetbridge ou Huawei Health) +- **Sauvegarde/Restauration JSON** complète (traitements + doses + analyses + réglages T) +- **FR + EN** (langue par app, indépendante du système) + +## Démarrage rapide (build depuis les sources) + +Prérequis : JDK 17+ (Java 21 OK), Android SDK (API 34). Le wrapper télécharge Gradle 8.9. + +```bash +git clone && cd HormoneTrack +echo "sdk.dir=/chemin/vers/android-sdk" > local.properties # ou ANDROID_HOME +./gradlew assembleDebug # APK : app/build/outputs/apk/debug/app-debug.apk +./gradlew testDebugUnitTest # 24 tests (moteur PK, profils, backup) +``` + +Installation sur un téléphone : mode développeur + Débogage USB, puis Android Studio +(**Run ▶️**) ou `adb install -r app/build/outputs/apk/debug/app-debug.apk`. +Pas de Play Store : l'app est sideloadée. Détails pas-à-pas : [docs/GUIDE_INSTALLATION.md](docs/GUIDE_INSTALLATION.md). + +## Les modèles en bref + +Chaque injection contribue `dose_mg × profil(dt)` où `profil` est la réponse normalisée +(pg/mL par mg) issue des tables horaires d'Estrannaise / Transfem Science (8001 h) ; +les contributions se superposent. Pics de référence : + +| Profil | Modèle | Pic (pg/mL/mg) | Tmax | +|----------|------------------|----------------|--------| +| EV | Estrannaise | 61,1 | ~45 h | +| EU | Estrannaise | 3,4 | ~55 h (plateau long) | +| EEn | Estrannaise | 31,4 | ~152 h | +| EV | Transfem Science | 59,0 | ~51 h | +| EU | Transfem Science | 10,1 | ~198 h | +| EEn | Transfem Science | 32,0 | ~156 h | + +La calibration (facteur d'échelle par traitement, calibré par tes labs) ajuste le modèle +à ton corps, exactement comme la colonne « Scale factor » de la feuille d'origine. + +## Vie privée + +- Base de données **Room locale** sur le téléphone ; **aucune** télémétrie, aucun réseau +- Sauvegarde = fichier JSON que tu stockes où tu veux (Owncloud, etc.) +- `allowBackup=false` (données sensibles) ; verrou biométrique prévu en Phase 2 +- Compat **Gadgetbridge** (FOSS) : aucune dépendance à Huawei Health ni aux services Huawei + +## Structure du dépôt + +``` +HormoneTrack/ +├── README.md ← ce fichier +├── docs/ +│ ├── GUIDE_INSTALLATION.md guide utilisateur (téléphone + montre) +│ ├── DEVELOPPEMENT.md doc de dev complète (architecture, maths, bugs, tests) +│ └── MONTRE-GADGETBRIDGE.md montre Huawei GT 3 : options + limites +├── build.gradle.kts config Gradle racine (AGP/Kotlin/KSP épinglés) +├── settings.gradle.kts +├── gradle.properties +├── gradle/wrapper/ wrapper Gradle 8.9 (jar + properties) +├── gradlew / gradlew.bat +└── app/ + ├── build.gradle.kts dépendances (Compose, Room, DataStore, Gson…) + ├── proguard-rules.pro + └── src/ + ├── main/ + │ ├── AndroidManifest.xml + │ ├── assets/pk_profiles.json ← tables horaires (Estrannaise/TFS) + │ ├── java/com/hormonetrack/ + │ │ ├── data/ (Room : models, DAOs, repository, backup) + │ │ ├── pk/ (moteur pharmacocinétique + profils) + │ │ ├── reminder/ (alarmes exactes, notifs + actions, boot) + │ │ ├── settings/ (DataStore : TConfig, langue) + │ │ ├── ui/ (Compose : screens, components, theme) + │ │ ├── HormoneTrackApp.kt + │ │ └── MainActivity.kt + │ └── res/ (strings FR/EN, thème, icônes) + └── test/java/com/hormonetrack/ ← tests unitaires JVM + ├── pk/ (moteur + profils) + └── data/backup/ (round-trip Gson) +``` + +## Feuille de route + +- [x] v1 : courbes E2/T, log doses, labs + calibration, rappels, backup JSON, FR/EN +- [ ] Tests UI Compose + compilation release signée +- [ ] Verrou biométrique, widget, export CSV +- [ ] Phase 2 montre : watchface personnalisée et/ou mini-app Lite Wearable (voir [docs/MONTRE-GADGETBRIDGE.md](docs/MONTRE-GADGETBRIDGE.md)) + +## Licence + +À définir avant le premier push public (suggestion : GPL-3.0, cohérent avec l'écosystème +Gadgetbridge). Les modèles PK appartiennent à leurs autrices respectives +([Estrannaise](https://estrannaise.github.io/), [Transfem Science](https://transfemscience.org)). diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..c2af913 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,101 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("org.jetbrains.kotlin.plugin.compose") + id("com.google.devtools.ksp") +} + +android { + namespace = "com.hormonetrack" + compileSdk = 34 + + defaultConfig { + applicationId = "com.hormonetrack" + minSdk = 26 + targetSdk = 34 + versionCode = 2 + versionName = "1.1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } + + buildFeatures { + compose = true + } + + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + // Compose BOM + val composeBom = platform("androidx.compose:compose-bom:2024.06.00") + implementation(composeBom) + + // Core + implementation("androidx.core:core-ktx:1.13.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.3") + implementation("androidx.activity:activity-compose:1.9.0") + + // Compose UI + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material3:material3") + implementation("androidx.compose.material:material-icons-extended") + + // Navigation + implementation("androidx.navigation:navigation-compose:2.7.7") + + // AppCompat (per-app language on API < 33) + implementation("androidx.appcompat:appcompat:1.7.0") + + // Room + implementation("androidx.room:room-runtime:2.6.1") + implementation("androidx.room:room-ktx:2.6.1") + ksp("androidx.room:room-compiler:2.6.1") + + // DataStore (preferences) + implementation("androidx.datastore:datastore-preferences:1.1.1") + + // Work Manager (for periodic tasks) + implementation("androidx.work:work-runtime-ktx:2.9.1") + + // Coroutines + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1") + + // Gson for export + implementation("com.google.code.gson:gson:2.11.0") + + // Debug + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") + + // Unit tests (JVM) + testImplementation("junit:junit:4.13.2") +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..3f566de --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,2 @@ +# Keep Room entities' enum fields (auto-converters use enum names via reflection in Gson backup) +-keepclassmembers enum com.hormonetrack.data.model.** { *; } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ce81ee2 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/assets/pk_profiles.json b/app/src/main/assets/pk_profiles.json new file mode 100644 index 0000000..92f2622 --- /dev/null +++ b/app/src/main/assets/pk_profiles.json @@ -0,0 +1,48048 @@ +{ + "params": { + "EV_ese_D": 478.0, + "EU_ese_D": 471.5, + "EEn_ese_D": 191.4, + "EV_tfs_D": 519.211912, + "EU_tfs_D": 13.18986748, + "EEn_tfs_D": 66.7748362, + "EV_ese_k1": 0.236, + "EU_ese_k1": 0.01729, + "EEn_ese_k1": 0.119, + "EV_tfs_k1": 2.38229125, + "EU_tfs_k1": 0.29634323, + "EEn_tfs_k1": 0.42412968, + "EV_ese_k2": 4.85, + "EU_ese_k2": 6.528, + "EEn_ese_k2": 0.601, + "EV_tfs_k2": 0.23345814, + "EU_tfs_k2": 4799337.57, + "EEn_tfs_k2": 0.4345298, + "EV_ese_k3": 1.24, + "EU_ese_k3": 2.285, + "EEn_ese_k3": 0.402, + "EV_tfs_k3": 1.37642769, + "EU_tfs_k3": 0.03141554, + "EEn_tfs_k3": 0.15291485 + }, + "profiles": { + "EV_ese": [ + 0.0, + 0.44, + 1.6, + 3.31, + 5.42, + 7.81, + 10.39, + 13.09, + 15.85, + 18.61, + 21.35, + 24.04, + 26.66, + 29.19, + 31.62, + 33.95, + 36.16, + 38.27, + 40.25, + 42.12, + 43.88, + 45.53, + 47.08, + 48.51, + 49.85, + 51.09, + 52.24, + 53.3, + 54.27, + 55.16, + 55.97, + 56.71, + 57.38, + 57.98, + 58.52, + 59.0, + 59.42, + 59.79, + 60.1, + 60.37, + 60.6, + 60.78, + 60.92, + 61.02, + 61.09, + 61.12, + 61.12, + 61.09, + 61.03, + 60.94, + 60.84, + 60.7, + 60.55, + 60.37, + 60.18, + 59.96, + 59.73, + 59.49, + 59.23, + 58.96, + 58.67, + 58.37, + 58.06, + 57.74, + 57.41, + 57.08, + 56.73, + 56.38, + 56.02, + 55.65, + 55.28, + 54.9, + 54.52, + 54.14, + 53.75, + 53.36, + 52.96, + 52.57, + 52.17, + 51.76, + 51.36, + 50.96, + 50.55, + 50.14, + 49.74, + 49.33, + 48.92, + 48.52, + 48.11, + 47.71, + 47.3, + 46.9, + 46.49, + 46.09, + 45.69, + 45.29, + 44.89, + 44.5, + 44.1, + 43.71, + 43.32, + 42.93, + 42.54, + 42.16, + 41.77, + 41.39, + 41.02, + 40.64, + 40.27, + 39.9, + 39.53, + 39.16, + 38.8, + 38.44, + 38.08, + 37.72, + 37.37, + 37.02, + 36.67, + 36.33, + 35.98, + 35.65, + 35.31, + 34.97, + 34.64, + 34.31, + 33.99, + 33.66, + 33.34, + 33.03, + 32.71, + 32.4, + 32.09, + 31.78, + 31.48, + 31.17, + 30.87, + 30.58, + 30.28, + 29.99, + 29.7, + 29.42, + 29.13, + 28.85, + 28.57, + 28.3, + 28.02, + 27.75, + 27.48, + 27.22, + 26.96, + 26.69, + 26.44, + 26.18, + 25.92, + 25.67, + 25.42, + 25.18, + 24.93, + 24.69, + 24.45, + 24.21, + 23.98, + 23.74, + 23.51, + 23.28, + 23.06, + 22.83, + 22.61, + 22.39, + 22.17, + 21.96, + 21.74, + 21.53, + 21.32, + 21.11, + 20.91, + 20.7, + 20.5, + 20.3, + 20.1, + 19.91, + 19.71, + 19.52, + 19.33, + 19.14, + 18.95, + 18.77, + 18.59, + 18.4, + 18.22, + 18.05, + 17.87, + 17.7, + 17.52, + 17.35, + 17.18, + 17.01, + 16.85, + 16.68, + 16.52, + 16.36, + 16.2, + 16.04, + 15.88, + 15.73, + 15.58, + 15.42, + 15.27, + 15.12, + 14.98, + 14.83, + 14.68, + 14.54, + 14.4, + 14.26, + 14.12, + 13.98, + 13.84, + 13.71, + 13.57, + 13.44, + 13.31, + 13.18, + 13.05, + 12.92, + 12.8, + 12.67, + 12.55, + 12.42, + 12.3, + 12.18, + 12.06, + 11.95, + 11.83, + 11.71, + 11.6, + 11.48, + 11.37, + 11.26, + 11.15, + 11.04, + 10.93, + 10.83, + 10.72, + 10.62, + 10.51, + 10.41, + 10.31, + 10.21, + 10.11, + 10.01, + 9.91, + 9.81, + 9.72, + 9.62, + 9.53, + 9.43, + 9.34, + 9.25, + 9.16, + 9.07, + 8.98, + 8.89, + 8.81, + 8.72, + 8.64, + 8.55, + 8.47, + 8.38, + 8.3, + 8.22, + 8.14, + 8.06, + 7.98, + 7.9, + 7.83, + 7.75, + 7.67, + 7.6, + 7.53, + 7.45, + 7.38, + 7.31, + 7.23, + 7.16, + 7.09, + 7.02, + 6.96, + 6.89, + 6.82, + 6.75, + 6.69, + 6.62, + 6.56, + 6.49, + 6.43, + 6.37, + 6.3, + 6.24, + 6.18, + 6.12, + 6.06, + 6.0, + 5.94, + 5.89, + 5.83, + 5.77, + 5.71, + 5.66, + 5.6, + 5.55, + 5.49, + 5.44, + 5.39, + 5.33, + 5.28, + 5.23, + 5.18, + 5.13, + 5.08, + 5.03, + 4.98, + 4.93, + 4.88, + 4.83, + 4.79, + 4.74, + 4.69, + 4.65, + 4.6, + 4.56, + 4.51, + 4.47, + 4.42, + 4.38, + 4.34, + 4.3, + 4.25, + 4.21, + 4.17, + 4.13, + 4.09, + 4.05, + 4.01, + 3.97, + 3.93, + 3.89, + 3.86, + 3.82, + 3.78, + 3.74, + 3.71, + 3.67, + 3.63, + 3.6, + 3.56, + 3.53, + 3.49, + 3.46, + 3.43, + 3.39, + 3.36, + 3.33, + 3.29, + 3.26, + 3.23, + 3.2, + 3.17, + 3.14, + 3.11, + 3.08, + 3.05, + 3.02, + 2.99, + 2.96, + 2.93, + 2.9, + 2.87, + 2.84, + 2.81, + 2.79, + 2.76, + 2.73, + 2.71, + 2.68, + 2.65, + 2.63, + 2.6, + 2.58, + 2.55, + 2.53, + 2.5, + 2.48, + 2.45, + 2.43, + 2.41, + 2.38, + 2.36, + 2.34, + 2.31, + 2.29, + 2.27, + 2.25, + 2.22, + 2.2, + 2.18, + 2.16, + 2.14, + 2.12, + 2.1, + 2.08, + 2.05, + 2.03, + 2.01, + 2.0, + 1.98, + 1.96, + 1.94, + 1.92, + 1.9, + 1.88, + 1.86, + 1.84, + 1.83, + 1.81, + 1.79, + 1.77, + 1.76, + 1.74, + 1.72, + 1.7, + 1.69, + 1.67, + 1.66, + 1.64, + 1.62, + 1.61, + 1.59, + 1.58, + 1.56, + 1.55, + 1.53, + 1.51, + 1.5, + 1.49, + 1.47, + 1.46, + 1.44, + 1.43, + 1.41, + 1.4, + 1.39, + 1.37, + 1.36, + 1.35, + 1.33, + 1.32, + 1.31, + 1.29, + 1.28, + 1.27, + 1.26, + 1.24, + 1.23, + 1.22, + 1.21, + 1.2, + 1.18, + 1.17, + 1.16, + 1.15, + 1.14, + 1.13, + 1.12, + 1.11, + 1.1, + 1.08, + 1.07, + 1.06, + 1.05, + 1.04, + 1.03, + 1.02, + 1.01, + 1.0, + 0.99, + 0.98, + 0.97, + 0.96, + 0.95, + 0.94, + 0.94, + 0.93, + 0.92, + 0.91, + 0.9, + 0.89, + 0.88, + 0.87, + 0.86, + 0.86, + 0.85, + 0.84, + 0.83, + 0.82, + 0.82, + 0.81, + 0.8, + 0.79, + 0.78, + 0.78, + 0.77, + 0.76, + 0.75, + 0.75, + 0.74, + 0.73, + 0.72, + 0.72, + 0.71, + 0.7, + 0.7, + 0.69, + 0.68, + 0.68, + 0.67, + 0.66, + 0.66, + 0.65, + 0.64, + 0.64, + 0.63, + 0.63, + 0.62, + 0.61, + 0.61, + 0.6, + 0.6, + 0.59, + 0.58, + 0.58, + 0.57, + 0.57, + 0.56, + 0.56, + 0.55, + 0.54, + 0.54, + 0.53, + 0.53, + 0.52, + 0.52, + 0.51, + 0.51, + 0.5, + 0.5, + 0.49, + 0.49, + 0.48, + 0.48, + 0.47, + 0.47, + 0.47, + 0.46, + 0.46, + 0.45, + 0.45, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.41, + 0.41, + 0.41, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "EU_ese": [ + 0.0, + 0.04, + 0.15, + 0.29, + 0.46, + 0.65, + 0.84, + 1.03, + 1.22, + 1.4, + 1.57, + 1.73, + 1.88, + 2.02, + 2.15, + 2.27, + 2.38, + 2.48, + 2.58, + 2.66, + 2.74, + 2.81, + 2.87, + 2.93, + 2.98, + 3.03, + 3.07, + 3.11, + 3.15, + 3.18, + 3.21, + 3.24, + 3.26, + 3.28, + 3.3, + 3.32, + 3.33, + 3.35, + 3.36, + 3.37, + 3.38, + 3.39, + 3.4, + 3.4, + 3.41, + 3.41, + 3.42, + 3.42, + 3.42, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.44, + 3.44, + 3.44, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.43, + 3.42, + 3.42, + 3.42, + 3.42, + 3.42, + 3.41, + 3.41, + 3.41, + 3.41, + 3.41, + 3.4, + 3.4, + 3.4, + 3.4, + 3.4, + 3.39, + 3.39, + 3.39, + 3.39, + 3.38, + 3.38, + 3.38, + 3.38, + 3.37, + 3.37, + 3.37, + 3.37, + 3.37, + 3.36, + 3.36, + 3.36, + 3.36, + 3.35, + 3.35, + 3.35, + 3.35, + 3.34, + 3.34, + 3.34, + 3.34, + 3.33, + 3.33, + 3.33, + 3.33, + 3.32, + 3.32, + 3.32, + 3.32, + 3.32, + 3.31, + 3.31, + 3.31, + 3.31, + 3.3, + 3.3, + 3.3, + 3.3, + 3.29, + 3.29, + 3.29, + 3.29, + 3.28, + 3.28, + 3.28, + 3.28, + 3.28, + 3.27, + 3.27, + 3.27, + 3.27, + 3.26, + 3.26, + 3.26, + 3.26, + 3.25, + 3.25, + 3.25, + 3.25, + 3.24, + 3.24, + 3.24, + 3.24, + 3.24, + 3.23, + 3.23, + 3.23, + 3.23, + 3.22, + 3.22, + 3.22, + 3.22, + 3.21, + 3.21, + 3.21, + 3.21, + 3.21, + 3.2, + 3.2, + 3.2, + 3.2, + 3.19, + 3.19, + 3.19, + 3.19, + 3.18, + 3.18, + 3.18, + 3.18, + 3.18, + 3.17, + 3.17, + 3.17, + 3.17, + 3.16, + 3.16, + 3.16, + 3.16, + 3.15, + 3.15, + 3.15, + 3.15, + 3.15, + 3.14, + 3.14, + 3.14, + 3.14, + 3.13, + 3.13, + 3.13, + 3.13, + 3.13, + 3.12, + 3.12, + 3.12, + 3.12, + 3.11, + 3.11, + 3.11, + 3.11, + 3.11, + 3.1, + 3.1, + 3.1, + 3.1, + 3.09, + 3.09, + 3.09, + 3.09, + 3.09, + 3.08, + 3.08, + 3.08, + 3.08, + 3.07, + 3.07, + 3.07, + 3.07, + 3.07, + 3.06, + 3.06, + 3.06, + 3.06, + 3.05, + 3.05, + 3.05, + 3.05, + 3.05, + 3.04, + 3.04, + 3.04, + 3.04, + 3.03, + 3.03, + 3.03, + 3.03, + 3.03, + 3.02, + 3.02, + 3.02, + 3.02, + 3.01, + 3.01, + 3.01, + 3.01, + 3.01, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 2.99, + 2.99, + 2.99, + 2.99, + 2.98, + 2.98, + 2.98, + 2.98, + 2.98, + 2.97, + 2.97, + 2.97, + 2.97, + 2.97, + 2.96, + 2.96, + 2.96, + 2.96, + 2.95, + 2.95, + 2.95, + 2.95, + 2.95, + 2.94, + 2.94, + 2.94, + 2.94, + 2.94, + 2.93, + 2.93, + 2.93, + 2.93, + 2.92, + 2.92, + 2.92, + 2.92, + 2.92, + 2.91, + 2.91, + 2.91, + 2.91, + 2.91, + 2.9, + 2.9, + 2.9, + 2.9, + 2.9, + 2.89, + 2.89, + 2.89, + 2.89, + 2.89, + 2.88, + 2.88, + 2.88, + 2.88, + 2.87, + 2.87, + 2.87, + 2.87, + 2.87, + 2.86, + 2.86, + 2.86, + 2.86, + 2.86, + 2.85, + 2.85, + 2.85, + 2.85, + 2.85, + 2.84, + 2.84, + 2.84, + 2.84, + 2.84, + 2.83, + 2.83, + 2.83, + 2.83, + 2.83, + 2.82, + 2.82, + 2.82, + 2.82, + 2.82, + 2.81, + 2.81, + 2.81, + 2.81, + 2.81, + 2.8, + 2.8, + 2.8, + 2.8, + 2.8, + 2.79, + 2.79, + 2.79, + 2.79, + 2.79, + 2.78, + 2.78, + 2.78, + 2.78, + 2.78, + 2.77, + 2.77, + 2.77, + 2.77, + 2.77, + 2.76, + 2.76, + 2.76, + 2.76, + 2.76, + 2.75, + 2.75, + 2.75, + 2.75, + 2.75, + 2.74, + 2.74, + 2.74, + 2.74, + 2.74, + 2.73, + 2.73, + 2.73, + 2.73, + 2.73, + 2.72, + 2.72, + 2.72, + 2.72, + 2.72, + 2.71, + 2.71, + 2.71, + 2.71, + 2.71, + 2.7, + 2.7, + 2.7, + 2.7, + 2.7, + 2.69, + 2.69, + 2.69, + 2.69, + 2.69, + 2.68, + 2.68, + 2.68, + 2.68, + 2.68, + 2.67, + 2.67, + 2.67, + 2.67, + 2.67, + 2.67, + 2.66, + 2.66, + 2.66, + 2.66, + 2.66, + 2.65, + 2.65, + 2.65, + 2.65, + 2.65, + 2.64, + 2.64, + 2.64, + 2.64, + 2.64, + 2.63, + 2.63, + 2.63, + 2.63, + 2.63, + 2.63, + 2.62, + 2.62, + 2.62, + 2.62, + 2.62, + 2.61, + 2.61, + 2.61, + 2.61, + 2.61, + 2.6, + 2.6, + 2.6, + 2.6, + 2.6, + 2.6, + 2.59, + 2.59, + 2.59, + 2.59, + 2.59, + 2.58, + 2.58, + 2.58, + 2.58, + 2.58, + 2.57, + 2.57, + 2.57, + 2.57, + 2.57, + 2.57, + 2.56, + 2.56, + 2.56, + 2.56, + 2.56, + 2.55, + 2.55, + 2.55, + 2.55, + 2.55, + 2.55, + 2.54, + 2.54, + 2.54, + 2.54, + 2.54, + 2.53, + 2.53, + 2.53, + 2.53, + 2.53, + 2.53, + 2.52, + 2.52, + 2.52, + 2.52, + 2.52, + 2.51, + 2.51, + 2.51, + 2.51, + 2.51, + 2.51, + 2.5, + 2.5, + 2.5, + 2.5, + 2.5, + 2.49, + 2.49, + 2.49, + 2.49, + 2.49, + 2.49, + 2.48, + 2.48, + 2.48, + 2.48, + 2.48, + 2.47, + 2.47, + 2.47, + 2.47, + 2.47, + 2.47, + 2.46, + 2.46, + 2.46, + 2.46, + 2.46, + 2.46, + 2.45, + 2.45, + 2.45, + 2.45, + 2.45, + 2.44, + 2.44, + 2.44, + 2.44, + 2.44, + 2.44, + 2.43, + 2.43, + 2.43, + 2.43, + 2.43, + 2.43, + 2.42, + 2.42, + 2.42, + 2.42, + 2.42, + 2.41, + 2.41, + 2.41, + 2.41, + 2.41, + 2.41, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.4, + 2.39, + 2.39, + 2.39, + 2.39, + 2.39, + 2.39, + 2.38, + 2.38, + 2.38, + 2.38, + 2.38, + 2.38, + 2.37, + 2.37, + 2.37, + 2.37, + 2.37, + 2.36, + 2.36, + 2.36, + 2.36, + 2.36, + 2.36, + 2.35, + 2.35, + 2.35, + 2.35, + 2.35, + 2.35, + 2.34, + 2.34, + 2.34, + 2.34, + 2.34, + 2.34, + 2.33, + 2.33, + 2.33, + 2.33, + 2.33, + 2.33, + 2.32, + 2.32, + 2.32, + 2.32, + 2.32, + 2.32, + 2.31, + 2.31, + 2.31, + 2.31, + 2.31, + 2.31, + 2.3, + 2.3, + 2.3, + 2.3, + 2.3, + 2.3, + 2.29, + 2.29, + 2.29, + 2.29, + 2.29, + 2.29, + 2.28, + 2.28, + 2.28, + 2.28, + 2.28, + 2.28, + 2.27, + 2.27, + 2.27, + 2.27, + 2.27, + 2.27, + 2.26, + 2.26, + 2.26, + 2.26, + 2.26, + 2.26, + 2.26, + 2.25, + 2.25, + 2.25, + 2.25, + 2.25, + 2.25, + 2.24, + 2.24, + 2.24, + 2.24, + 2.24, + 2.24, + 2.23, + 2.23, + 2.23, + 2.23, + 2.23, + 2.23, + 2.22, + 2.22, + 2.22, + 2.22, + 2.22, + 2.22, + 2.21, + 2.21, + 2.21, + 2.21, + 2.21, + 2.21, + 2.21, + 2.2, + 2.2, + 2.2, + 2.2, + 2.2, + 2.2, + 2.19, + 2.19, + 2.19, + 2.19, + 2.19, + 2.19, + 2.18, + 2.18, + 2.18, + 2.18, + 2.18, + 2.18, + 2.18, + 2.17, + 2.17, + 2.17, + 2.17, + 2.17, + 2.17, + 2.16, + 2.16, + 2.16, + 2.16, + 2.16, + 2.16, + 2.16, + 2.15, + 2.15, + 2.15, + 2.15, + 2.15, + 2.15, + 2.14, + 2.14, + 2.14, + 2.14, + 2.14, + 2.14, + 2.13, + 2.13, + 2.13, + 2.13, + 2.13, + 2.13, + 2.13, + 2.12, + 2.12, + 2.12, + 2.12, + 2.12, + 2.12, + 2.12, + 2.11, + 2.11, + 2.11, + 2.11, + 2.11, + 2.11, + 2.1, + 2.1, + 2.1, + 2.1, + 2.1, + 2.1, + 2.1, + 2.09, + 2.09, + 2.09, + 2.09, + 2.09, + 2.09, + 2.08, + 2.08, + 2.08, + 2.08, + 2.08, + 2.08, + 2.08, + 2.07, + 2.07, + 2.07, + 2.07, + 2.07, + 2.07, + 2.07, + 2.06, + 2.06, + 2.06, + 2.06, + 2.06, + 2.06, + 2.05, + 2.05, + 2.05, + 2.05, + 2.05, + 2.05, + 2.05, + 2.04, + 2.04, + 2.04, + 2.04, + 2.04, + 2.04, + 2.04, + 2.03, + 2.03, + 2.03, + 2.03, + 2.03, + 2.03, + 2.03, + 2.02, + 2.02, + 2.02, + 2.02, + 2.02, + 2.02, + 2.02, + 2.01, + 2.01, + 2.01, + 2.01, + 2.01, + 2.01, + 2.01, + 2.0, + 2.0, + 2.0, + 2.0, + 2.0, + 2.0, + 2.0, + 1.99, + 1.99, + 1.99, + 1.99, + 1.99, + 1.99, + 1.99, + 1.98, + 1.98, + 1.98, + 1.98, + 1.98, + 1.98, + 1.98, + 1.97, + 1.97, + 1.97, + 1.97, + 1.97, + 1.97, + 1.97, + 1.96, + 1.96, + 1.96, + 1.96, + 1.96, + 1.96, + 1.96, + 1.95, + 1.95, + 1.95, + 1.95, + 1.95, + 1.95, + 1.95, + 1.94, + 1.94, + 1.94, + 1.94, + 1.94, + 1.94, + 1.94, + 1.93, + 1.93, + 1.93, + 1.93, + 1.93, + 1.93, + 1.93, + 1.92, + 1.92, + 1.92, + 1.92, + 1.92, + 1.92, + 1.92, + 1.91, + 1.91, + 1.91, + 1.91, + 1.91, + 1.91, + 1.91, + 1.91, + 1.9, + 1.9, + 1.9, + 1.9, + 1.9, + 1.9, + 1.9, + 1.89, + 1.89, + 1.89, + 1.89, + 1.89, + 1.89, + 1.89, + 1.88, + 1.88, + 1.88, + 1.88, + 1.88, + 1.88, + 1.88, + 1.88, + 1.87, + 1.87, + 1.87, + 1.87, + 1.87, + 1.87, + 1.87, + 1.86, + 1.86, + 1.86, + 1.86, + 1.86, + 1.86, + 1.86, + 1.86, + 1.85, + 1.85, + 1.85, + 1.85, + 1.85, + 1.85, + 1.85, + 1.84, + 1.84, + 1.84, + 1.84, + 1.84, + 1.84, + 1.84, + 1.84, + 1.83, + 1.83, + 1.83, + 1.83, + 1.83, + 1.83, + 1.83, + 1.82, + 1.82, + 1.82, + 1.82, + 1.82, + 1.82, + 1.82, + 1.82, + 1.81, + 1.81, + 1.81, + 1.81, + 1.81, + 1.81, + 1.81, + 1.81, + 1.8, + 1.8, + 1.8, + 1.8, + 1.8, + 1.8, + 1.8, + 1.79, + 1.79, + 1.79, + 1.79, + 1.79, + 1.79, + 1.79, + 1.79, + 1.78, + 1.78, + 1.78, + 1.78, + 1.78, + 1.78, + 1.78, + 1.78, + 1.77, + 1.77, + 1.77, + 1.77, + 1.77, + 1.77, + 1.77, + 1.77, + 1.76, + 1.76, + 1.76, + 1.76, + 1.76, + 1.76, + 1.76, + 1.76, + 1.75, + 1.75, + 1.75, + 1.75, + 1.75, + 1.75, + 1.75, + 1.74, + 1.74, + 1.74, + 1.74, + 1.74, + 1.74, + 1.74, + 1.74, + 1.73, + 1.73, + 1.73, + 1.73, + 1.73, + 1.73, + 1.73, + 1.73, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.71, + 1.71, + 1.71, + 1.71, + 1.71, + 1.71, + 1.71, + 1.71, + 1.7, + 1.7, + 1.7, + 1.7, + 1.7, + 1.7, + 1.7, + 1.7, + 1.69, + 1.69, + 1.69, + 1.69, + 1.69, + 1.69, + 1.69, + 1.69, + 1.68, + 1.68, + 1.68, + 1.68, + 1.68, + 1.68, + 1.68, + 1.68, + 1.67, + 1.67, + 1.67, + 1.67, + 1.67, + 1.67, + 1.67, + 1.67, + 1.67, + 1.66, + 1.66, + 1.66, + 1.66, + 1.66, + 1.66, + 1.66, + 1.66, + 1.65, + 1.65, + 1.65, + 1.65, + 1.65, + 1.65, + 1.65, + 1.65, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.63, + 1.63, + 1.63, + 1.63, + 1.63, + 1.63, + 1.63, + 1.63, + 1.62, + 1.62, + 1.62, + 1.62, + 1.62, + 1.62, + 1.62, + 1.62, + 1.62, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.6, + 1.6, + 1.6, + 1.6, + 1.6, + 1.6, + 1.6, + 1.6, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.56, + 1.56, + 1.56, + 1.56, + 1.56, + 1.56, + 1.56, + 1.56, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01 + ], + "EEn_ese": [ + 0.0, + 0.01, + 0.05, + 0.1, + 0.18, + 0.27, + 0.39, + 0.52, + 0.67, + 0.84, + 1.02, + 1.21, + 1.42, + 1.64, + 1.88, + 2.12, + 2.38, + 2.64, + 2.92, + 3.2, + 3.49, + 3.79, + 4.1, + 4.41, + 4.73, + 5.06, + 5.39, + 5.72, + 6.06, + 6.41, + 6.75, + 7.1, + 7.45, + 7.81, + 8.17, + 8.53, + 8.89, + 9.25, + 9.61, + 9.97, + 10.33, + 10.7, + 11.06, + 11.42, + 11.78, + 12.14, + 12.5, + 12.86, + 13.22, + 13.57, + 13.92, + 14.27, + 14.62, + 14.97, + 15.31, + 15.66, + 15.99, + 16.33, + 16.66, + 16.99, + 17.32, + 17.64, + 17.96, + 18.28, + 18.6, + 18.91, + 19.21, + 19.51, + 19.81, + 20.11, + 20.4, + 20.69, + 20.97, + 21.25, + 21.53, + 21.8, + 22.07, + 22.33, + 22.59, + 22.85, + 23.1, + 23.34, + 23.59, + 23.83, + 24.06, + 24.29, + 24.52, + 24.74, + 24.96, + 25.17, + 25.38, + 25.59, + 25.79, + 25.99, + 26.18, + 26.37, + 26.56, + 26.74, + 26.92, + 27.09, + 27.26, + 27.42, + 27.59, + 27.74, + 27.9, + 28.05, + 28.19, + 28.34, + 28.47, + 28.61, + 28.74, + 28.87, + 28.99, + 29.11, + 29.23, + 29.34, + 29.45, + 29.56, + 29.66, + 29.76, + 29.85, + 29.95, + 30.03, + 30.12, + 30.2, + 30.28, + 30.36, + 30.43, + 30.5, + 30.57, + 30.63, + 30.69, + 30.75, + 30.81, + 30.86, + 30.91, + 30.95, + 31.0, + 31.04, + 31.08, + 31.11, + 31.15, + 31.18, + 31.2, + 31.23, + 31.25, + 31.27, + 31.29, + 31.31, + 31.32, + 31.33, + 31.34, + 31.35, + 31.35, + 31.35, + 31.35, + 31.35, + 31.35, + 31.34, + 31.33, + 31.32, + 31.31, + 31.3, + 31.28, + 31.27, + 31.25, + 31.22, + 31.2, + 31.18, + 31.15, + 31.12, + 31.09, + 31.06, + 31.03, + 31.0, + 30.96, + 30.92, + 30.88, + 30.84, + 30.8, + 30.76, + 30.72, + 30.67, + 30.62, + 30.58, + 30.53, + 30.48, + 30.42, + 30.37, + 30.32, + 30.26, + 30.2, + 30.15, + 30.09, + 30.03, + 29.97, + 29.91, + 29.85, + 29.78, + 29.72, + 29.65, + 29.59, + 29.52, + 29.45, + 29.38, + 29.31, + 29.24, + 29.17, + 29.1, + 29.03, + 28.96, + 28.88, + 28.81, + 28.73, + 28.66, + 28.58, + 28.5, + 28.43, + 28.35, + 28.27, + 28.19, + 28.11, + 28.03, + 27.95, + 27.87, + 27.79, + 27.7, + 27.62, + 27.54, + 27.46, + 27.37, + 27.29, + 27.2, + 27.12, + 27.03, + 26.95, + 26.86, + 26.78, + 26.69, + 26.6, + 26.52, + 26.43, + 26.34, + 26.25, + 26.17, + 26.08, + 25.99, + 25.9, + 25.81, + 25.72, + 25.63, + 25.55, + 25.46, + 25.37, + 25.28, + 25.19, + 25.1, + 25.01, + 24.92, + 24.83, + 24.74, + 24.65, + 24.56, + 24.47, + 24.38, + 24.29, + 24.2, + 24.11, + 24.02, + 23.93, + 23.83, + 23.74, + 23.65, + 23.56, + 23.47, + 23.38, + 23.29, + 23.2, + 23.11, + 23.02, + 22.93, + 22.84, + 22.75, + 22.66, + 22.57, + 22.48, + 22.39, + 22.31, + 22.22, + 22.13, + 22.04, + 21.95, + 21.86, + 21.77, + 21.68, + 21.59, + 21.51, + 21.42, + 21.33, + 21.24, + 21.15, + 21.07, + 20.98, + 20.89, + 20.8, + 20.72, + 20.63, + 20.54, + 20.46, + 20.37, + 20.29, + 20.2, + 20.11, + 20.03, + 19.94, + 19.86, + 19.77, + 19.69, + 19.61, + 19.52, + 19.44, + 19.35, + 19.27, + 19.19, + 19.1, + 19.02, + 18.94, + 18.86, + 18.77, + 18.69, + 18.61, + 18.53, + 18.45, + 18.37, + 18.29, + 18.2, + 18.12, + 18.04, + 17.96, + 17.88, + 17.81, + 17.73, + 17.65, + 17.57, + 17.49, + 17.41, + 17.33, + 17.26, + 17.18, + 17.1, + 17.03, + 16.95, + 16.87, + 16.8, + 16.72, + 16.65, + 16.57, + 16.5, + 16.42, + 16.35, + 16.27, + 16.2, + 16.12, + 16.05, + 15.98, + 15.9, + 15.83, + 15.76, + 15.69, + 15.61, + 15.54, + 15.47, + 15.4, + 15.33, + 15.26, + 15.19, + 15.12, + 15.05, + 14.98, + 14.91, + 14.84, + 14.77, + 14.7, + 14.64, + 14.57, + 14.5, + 14.43, + 14.37, + 14.3, + 14.23, + 14.17, + 14.1, + 14.03, + 13.97, + 13.9, + 13.84, + 13.77, + 13.71, + 13.64, + 13.58, + 13.52, + 13.45, + 13.39, + 13.33, + 13.26, + 13.2, + 13.14, + 13.08, + 13.02, + 12.95, + 12.89, + 12.83, + 12.77, + 12.71, + 12.65, + 12.59, + 12.53, + 12.47, + 12.41, + 12.35, + 12.3, + 12.24, + 12.18, + 12.12, + 12.06, + 12.01, + 11.95, + 11.89, + 11.84, + 11.78, + 11.72, + 11.67, + 11.61, + 11.56, + 11.5, + 11.45, + 11.39, + 11.34, + 11.28, + 11.23, + 11.17, + 11.12, + 11.07, + 11.01, + 10.96, + 10.91, + 10.86, + 10.8, + 10.75, + 10.7, + 10.65, + 10.6, + 10.55, + 10.5, + 10.45, + 10.4, + 10.35, + 10.3, + 10.25, + 10.2, + 10.15, + 10.1, + 10.05, + 10.0, + 9.95, + 9.91, + 9.86, + 9.81, + 9.76, + 9.72, + 9.67, + 9.62, + 9.58, + 9.53, + 9.48, + 9.44, + 9.39, + 9.35, + 9.3, + 9.26, + 9.21, + 9.17, + 9.12, + 9.08, + 9.03, + 8.99, + 8.95, + 8.9, + 8.86, + 8.82, + 8.77, + 8.73, + 8.69, + 8.65, + 8.6, + 8.56, + 8.52, + 8.48, + 8.44, + 8.4, + 8.36, + 8.31, + 8.27, + 8.23, + 8.19, + 8.15, + 8.11, + 8.07, + 8.04, + 8.0, + 7.96, + 7.92, + 7.88, + 7.84, + 7.8, + 7.76, + 7.73, + 7.69, + 7.65, + 7.61, + 7.58, + 7.54, + 7.5, + 7.47, + 7.43, + 7.39, + 7.36, + 7.32, + 7.29, + 7.25, + 7.21, + 7.18, + 7.14, + 7.11, + 7.07, + 7.04, + 7.01, + 6.97, + 6.94, + 6.9, + 6.87, + 6.84, + 6.8, + 6.77, + 6.74, + 6.7, + 6.67, + 6.64, + 6.6, + 6.57, + 6.54, + 6.51, + 6.48, + 6.44, + 6.41, + 6.38, + 6.35, + 6.32, + 6.29, + 6.26, + 6.23, + 6.2, + 6.17, + 6.13, + 6.1, + 6.07, + 6.04, + 6.02, + 5.99, + 5.96, + 5.93, + 5.9, + 5.87, + 5.84, + 5.81, + 5.78, + 5.75, + 5.73, + 5.7, + 5.67, + 5.64, + 5.61, + 5.59, + 5.56, + 5.53, + 5.5, + 5.48, + 5.45, + 5.42, + 5.4, + 5.37, + 5.34, + 5.32, + 5.29, + 5.27, + 5.24, + 5.21, + 5.19, + 5.16, + 5.14, + 5.11, + 5.09, + 5.06, + 5.04, + 5.01, + 4.99, + 4.96, + 4.94, + 4.91, + 4.89, + 4.87, + 4.84, + 4.82, + 4.79, + 4.77, + 4.75, + 4.72, + 4.7, + 4.68, + 4.65, + 4.63, + 4.61, + 4.59, + 4.56, + 4.54, + 4.52, + 4.5, + 4.47, + 4.45, + 4.43, + 4.41, + 4.39, + 4.37, + 4.34, + 4.32, + 4.3, + 4.28, + 4.26, + 4.24, + 4.22, + 4.2, + 4.18, + 4.15, + 4.13, + 4.11, + 4.09, + 4.07, + 4.05, + 4.03, + 4.01, + 3.99, + 3.97, + 3.95, + 3.93, + 3.92, + 3.9, + 3.88, + 3.86, + 3.84, + 3.82, + 3.8, + 3.78, + 3.76, + 3.74, + 3.73, + 3.71, + 3.69, + 3.67, + 3.65, + 3.64, + 3.62, + 3.6, + 3.58, + 3.56, + 3.55, + 3.53, + 3.51, + 3.49, + 3.48, + 3.46, + 3.44, + 3.43, + 3.41, + 3.39, + 3.38, + 3.36, + 3.34, + 3.33, + 3.31, + 3.29, + 3.28, + 3.26, + 3.24, + 3.23, + 3.21, + 3.2, + 3.18, + 3.16, + 3.15, + 3.13, + 3.12, + 3.1, + 3.09, + 3.07, + 3.06, + 3.04, + 3.03, + 3.01, + 3.0, + 2.98, + 2.97, + 2.95, + 2.94, + 2.92, + 2.91, + 2.89, + 2.88, + 2.87, + 2.85, + 2.84, + 2.82, + 2.81, + 2.8, + 2.78, + 2.77, + 2.76, + 2.74, + 2.73, + 2.71, + 2.7, + 2.69, + 2.67, + 2.66, + 2.65, + 2.63, + 2.62, + 2.61, + 2.6, + 2.58, + 2.57, + 2.56, + 2.55, + 2.53, + 2.52, + 2.51, + 2.5, + 2.48, + 2.47, + 2.46, + 2.45, + 2.43, + 2.42, + 2.41, + 2.4, + 2.39, + 2.37, + 2.36, + 2.35, + 2.34, + 2.33, + 2.32, + 2.31, + 2.29, + 2.28, + 2.27, + 2.26, + 2.25, + 2.24, + 2.23, + 2.22, + 2.2, + 2.19, + 2.18, + 2.17, + 2.16, + 2.15, + 2.14, + 2.13, + 2.12, + 2.11, + 2.1, + 2.09, + 2.08, + 2.07, + 2.06, + 2.05, + 2.04, + 2.03, + 2.02, + 2.01, + 2.0, + 1.99, + 1.98, + 1.97, + 1.96, + 1.95, + 1.94, + 1.93, + 1.92, + 1.91, + 1.9, + 1.89, + 1.88, + 1.87, + 1.86, + 1.85, + 1.84, + 1.84, + 1.83, + 1.82, + 1.81, + 1.8, + 1.79, + 1.78, + 1.77, + 1.76, + 1.76, + 1.75, + 1.74, + 1.73, + 1.72, + 1.71, + 1.7, + 1.7, + 1.69, + 1.68, + 1.67, + 1.66, + 1.65, + 1.65, + 1.64, + 1.63, + 1.62, + 1.61, + 1.61, + 1.6, + 1.59, + 1.58, + 1.57, + 1.57, + 1.56, + 1.55, + 1.54, + 1.54, + 1.53, + 1.52, + 1.51, + 1.51, + 1.5, + 1.49, + 1.48, + 1.48, + 1.47, + 1.46, + 1.45, + 1.45, + 1.44, + 1.43, + 1.43, + 1.42, + 1.41, + 1.4, + 1.4, + 1.39, + 1.38, + 1.38, + 1.37, + 1.36, + 1.36, + 1.35, + 1.34, + 1.34, + 1.33, + 1.32, + 1.32, + 1.31, + 1.3, + 1.3, + 1.29, + 1.28, + 1.28, + 1.27, + 1.27, + 1.26, + 1.25, + 1.25, + 1.24, + 1.23, + 1.23, + 1.22, + 1.22, + 1.21, + 1.2, + 1.2, + 1.19, + 1.19, + 1.18, + 1.17, + 1.17, + 1.16, + 1.16, + 1.15, + 1.15, + 1.14, + 1.13, + 1.13, + 1.12, + 1.12, + 1.11, + 1.11, + 1.1, + 1.1, + 1.09, + 1.09, + 1.08, + 1.07, + 1.07, + 1.06, + 1.06, + 1.05, + 1.05, + 1.04, + 1.04, + 1.03, + 1.03, + 1.02, + 1.02, + 1.01, + 1.01, + 1.0, + 1.0, + 0.99, + 0.99, + 0.98, + 0.98, + 0.97, + 0.97, + 0.96, + 0.96, + 0.95, + 0.95, + 0.94, + 0.94, + 0.94, + 0.93, + 0.93, + 0.92, + 0.92, + 0.91, + 0.91, + 0.9, + 0.9, + 0.89, + 0.89, + 0.89, + 0.88, + 0.88, + 0.87, + 0.87, + 0.86, + 0.86, + 0.86, + 0.85, + 0.85, + 0.84, + 0.84, + 0.83, + 0.83, + 0.83, + 0.82, + 0.82, + 0.81, + 0.81, + 0.81, + 0.8, + 0.8, + 0.79, + 0.79, + 0.79, + 0.78, + 0.78, + 0.77, + 0.77, + 0.77, + 0.76, + 0.76, + 0.76, + 0.75, + 0.75, + 0.74, + 0.74, + 0.74, + 0.73, + 0.73, + 0.73, + 0.72, + 0.72, + 0.72, + 0.71, + 0.71, + 0.7, + 0.7, + 0.7, + 0.69, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.67, + 0.66, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.64, + 0.64, + 0.63, + 0.63, + 0.63, + 0.62, + 0.62, + 0.62, + 0.61, + 0.61, + 0.61, + 0.6, + 0.6, + 0.6, + 0.6, + 0.59, + 0.59, + 0.59, + 0.58, + 0.58, + 0.58, + 0.58, + 0.57, + 0.57, + 0.57, + 0.56, + 0.56, + 0.56, + 0.56, + 0.55, + 0.55, + 0.55, + 0.54, + 0.54, + 0.54, + 0.54, + 0.53, + 0.53, + 0.53, + 0.53, + 0.52, + 0.52, + 0.52, + 0.52, + 0.51, + 0.51, + 0.51, + 0.51, + 0.5, + 0.5, + 0.5, + 0.5, + 0.49, + 0.49, + 0.49, + 0.49, + 0.48, + 0.48, + 0.48, + 0.48, + 0.47, + 0.47, + 0.47, + 0.47, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.45, + 0.45, + 0.45, + 0.45, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.42, + 0.42, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "EV_tfs": [ + 0.0, + 0.24, + 0.9, + 1.91, + 3.22, + 4.77, + 6.51, + 8.4, + 10.41, + 12.5, + 14.64, + 16.82, + 19.01, + 21.2, + 23.36, + 25.49, + 27.59, + 29.62, + 31.61, + 33.52, + 35.37, + 37.14, + 38.84, + 40.47, + 42.01, + 43.48, + 44.87, + 46.18, + 47.42, + 48.58, + 49.66, + 50.68, + 51.62, + 52.49, + 53.3, + 54.04, + 54.72, + 55.34, + 55.9, + 56.41, + 56.86, + 57.27, + 57.62, + 57.93, + 58.19, + 58.41, + 58.59, + 58.73, + 58.84, + 58.91, + 58.95, + 58.96, + 58.93, + 58.89, + 58.81, + 58.71, + 58.59, + 58.44, + 58.28, + 58.09, + 57.89, + 57.67, + 57.44, + 57.19, + 56.92, + 56.65, + 56.36, + 56.06, + 55.75, + 55.43, + 55.1, + 54.77, + 54.43, + 54.08, + 53.72, + 53.36, + 52.99, + 52.62, + 52.25, + 51.87, + 51.49, + 51.1, + 50.71, + 50.33, + 49.93, + 49.54, + 49.15, + 48.75, + 48.36, + 47.96, + 47.57, + 47.17, + 46.78, + 46.38, + 45.99, + 45.59, + 45.2, + 44.81, + 44.42, + 44.03, + 43.64, + 43.26, + 42.87, + 42.49, + 42.11, + 41.73, + 41.36, + 40.98, + 40.61, + 40.24, + 39.87, + 39.51, + 39.15, + 38.79, + 38.43, + 38.07, + 37.72, + 37.37, + 37.02, + 36.68, + 36.33, + 35.99, + 35.66, + 35.32, + 34.99, + 34.66, + 34.33, + 34.01, + 33.69, + 33.37, + 33.05, + 32.74, + 32.43, + 32.12, + 31.82, + 31.51, + 31.21, + 30.92, + 30.62, + 30.33, + 30.04, + 29.75, + 29.47, + 29.19, + 28.91, + 28.63, + 28.36, + 28.08, + 27.81, + 27.55, + 27.28, + 27.02, + 26.76, + 26.5, + 26.25, + 26.0, + 25.75, + 25.5, + 25.25, + 25.01, + 24.77, + 24.53, + 24.3, + 24.06, + 23.83, + 23.6, + 23.37, + 23.15, + 22.92, + 22.7, + 22.48, + 22.27, + 22.05, + 21.84, + 21.63, + 21.42, + 21.21, + 21.01, + 20.8, + 20.6, + 20.4, + 20.21, + 20.01, + 19.82, + 19.63, + 19.44, + 19.25, + 19.06, + 18.88, + 18.7, + 18.52, + 18.34, + 18.16, + 17.98, + 17.81, + 17.64, + 17.47, + 17.3, + 17.13, + 16.96, + 16.8, + 16.64, + 16.48, + 16.32, + 16.16, + 16.0, + 15.85, + 15.7, + 15.54, + 15.39, + 15.24, + 15.1, + 14.95, + 14.81, + 14.66, + 14.52, + 14.38, + 14.24, + 14.1, + 13.97, + 13.83, + 13.7, + 13.57, + 13.43, + 13.3, + 13.18, + 13.05, + 12.92, + 12.8, + 12.67, + 12.55, + 12.43, + 12.31, + 12.19, + 12.07, + 11.95, + 11.84, + 11.72, + 11.61, + 11.5, + 11.39, + 11.28, + 11.17, + 11.06, + 10.95, + 10.85, + 10.74, + 10.64, + 10.53, + 10.43, + 10.33, + 10.23, + 10.13, + 10.03, + 9.94, + 9.84, + 9.75, + 9.65, + 9.56, + 9.47, + 9.37, + 9.28, + 9.19, + 9.1, + 9.02, + 8.93, + 8.84, + 8.76, + 8.67, + 8.59, + 8.51, + 8.42, + 8.34, + 8.26, + 8.18, + 8.1, + 8.02, + 7.95, + 7.87, + 7.79, + 7.72, + 7.64, + 7.57, + 7.49, + 7.42, + 7.35, + 7.28, + 7.21, + 7.14, + 7.07, + 7.0, + 6.93, + 6.87, + 6.8, + 6.73, + 6.67, + 6.6, + 6.54, + 6.48, + 6.41, + 6.35, + 6.29, + 6.23, + 6.17, + 6.11, + 6.05, + 5.99, + 5.93, + 5.88, + 5.82, + 5.76, + 5.71, + 5.65, + 5.6, + 5.54, + 5.49, + 5.44, + 5.38, + 5.33, + 5.28, + 5.23, + 5.18, + 5.13, + 5.08, + 5.03, + 4.98, + 4.93, + 4.89, + 4.84, + 4.79, + 4.74, + 4.7, + 4.65, + 4.61, + 4.56, + 4.52, + 4.48, + 4.43, + 4.39, + 4.35, + 4.3, + 4.26, + 4.22, + 4.18, + 4.14, + 4.1, + 4.06, + 4.02, + 3.98, + 3.94, + 3.91, + 3.87, + 3.83, + 3.79, + 3.76, + 3.72, + 3.68, + 3.65, + 3.61, + 3.58, + 3.54, + 3.51, + 3.48, + 3.44, + 3.41, + 3.38, + 3.34, + 3.31, + 3.28, + 3.25, + 3.22, + 3.18, + 3.15, + 3.12, + 3.09, + 3.06, + 3.03, + 3.0, + 2.97, + 2.95, + 2.92, + 2.89, + 2.86, + 2.83, + 2.81, + 2.78, + 2.75, + 2.73, + 2.7, + 2.67, + 2.65, + 2.62, + 2.6, + 2.57, + 2.55, + 2.52, + 2.5, + 2.47, + 2.45, + 2.42, + 2.4, + 2.38, + 2.36, + 2.33, + 2.31, + 2.29, + 2.27, + 2.24, + 2.22, + 2.2, + 2.18, + 2.16, + 2.14, + 2.12, + 2.1, + 2.08, + 2.06, + 2.04, + 2.02, + 2.0, + 1.98, + 1.96, + 1.94, + 1.92, + 1.9, + 1.88, + 1.86, + 1.85, + 1.83, + 1.81, + 1.79, + 1.78, + 1.76, + 1.74, + 1.73, + 1.71, + 1.69, + 1.68, + 1.66, + 1.64, + 1.63, + 1.61, + 1.6, + 1.58, + 1.57, + 1.55, + 1.54, + 1.52, + 1.51, + 1.49, + 1.48, + 1.46, + 1.45, + 1.43, + 1.42, + 1.41, + 1.39, + 1.38, + 1.37, + 1.35, + 1.34, + 1.33, + 1.31, + 1.3, + 1.29, + 1.28, + 1.26, + 1.25, + 1.24, + 1.23, + 1.22, + 1.2, + 1.19, + 1.18, + 1.17, + 1.16, + 1.15, + 1.14, + 1.12, + 1.11, + 1.1, + 1.09, + 1.08, + 1.07, + 1.06, + 1.05, + 1.04, + 1.03, + 1.02, + 1.01, + 1.0, + 0.99, + 0.98, + 0.97, + 0.96, + 0.95, + 0.94, + 0.93, + 0.93, + 0.92, + 0.91, + 0.9, + 0.89, + 0.88, + 0.87, + 0.86, + 0.86, + 0.85, + 0.84, + 0.83, + 0.82, + 0.82, + 0.81, + 0.8, + 0.79, + 0.78, + 0.78, + 0.77, + 0.76, + 0.75, + 0.75, + 0.74, + 0.73, + 0.73, + 0.72, + 0.71, + 0.71, + 0.7, + 0.69, + 0.68, + 0.68, + 0.67, + 0.67, + 0.66, + 0.65, + 0.65, + 0.64, + 0.63, + 0.63, + 0.62, + 0.62, + 0.61, + 0.6, + 0.6, + 0.59, + 0.59, + 0.58, + 0.57, + 0.57, + 0.56, + 0.56, + 0.55, + 0.55, + 0.54, + 0.54, + 0.53, + 0.53, + 0.52, + 0.52, + 0.51, + 0.51, + 0.5, + 0.5, + 0.49, + 0.49, + 0.48, + 0.48, + 0.47, + 0.47, + 0.46, + 0.46, + 0.46, + 0.45, + 0.45, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.41, + 0.41, + 0.4, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "EU_tfs": [ + 0.0, + 0.16, + 0.32, + 0.48, + 0.63, + 0.79, + 0.94, + 1.09, + 1.23, + 1.38, + 1.52, + 1.66, + 1.8, + 1.94, + 2.07, + 2.21, + 2.34, + 2.47, + 2.6, + 2.72, + 2.85, + 2.97, + 3.09, + 3.21, + 3.33, + 3.44, + 3.56, + 3.67, + 3.78, + 3.89, + 4.0, + 4.11, + 4.21, + 4.31, + 4.42, + 4.52, + 4.62, + 4.71, + 4.81, + 4.9, + 5.0, + 5.09, + 5.18, + 5.27, + 5.36, + 5.45, + 5.53, + 5.62, + 5.7, + 5.78, + 5.86, + 5.94, + 6.02, + 6.1, + 6.17, + 6.25, + 6.32, + 6.39, + 6.47, + 6.54, + 6.61, + 6.67, + 6.74, + 6.81, + 6.87, + 6.94, + 7.0, + 7.06, + 7.13, + 7.19, + 7.25, + 7.3, + 7.36, + 7.42, + 7.48, + 7.53, + 7.58, + 7.64, + 7.69, + 7.74, + 7.79, + 7.84, + 7.89, + 7.94, + 7.99, + 8.04, + 8.08, + 8.13, + 8.17, + 8.22, + 8.26, + 8.3, + 8.34, + 8.38, + 8.42, + 8.46, + 8.5, + 8.54, + 8.58, + 8.62, + 8.65, + 8.69, + 8.72, + 8.76, + 8.79, + 8.82, + 8.86, + 8.89, + 8.92, + 8.95, + 8.98, + 9.01, + 9.04, + 9.07, + 9.1, + 9.13, + 9.15, + 9.18, + 9.21, + 9.23, + 9.26, + 9.28, + 9.31, + 9.33, + 9.35, + 9.37, + 9.4, + 9.42, + 9.44, + 9.46, + 9.48, + 9.5, + 9.52, + 9.54, + 9.56, + 9.58, + 9.6, + 9.61, + 9.63, + 9.65, + 9.66, + 9.68, + 9.7, + 9.71, + 9.73, + 9.74, + 9.76, + 9.77, + 9.78, + 9.8, + 9.81, + 9.82, + 9.83, + 9.85, + 9.86, + 9.87, + 9.88, + 9.89, + 9.9, + 9.91, + 9.92, + 9.93, + 9.94, + 9.95, + 9.96, + 9.96, + 9.97, + 9.98, + 9.99, + 10.0, + 10.0, + 10.01, + 10.02, + 10.02, + 10.03, + 10.03, + 10.04, + 10.04, + 10.05, + 10.05, + 10.06, + 10.06, + 10.07, + 10.07, + 10.07, + 10.08, + 10.08, + 10.08, + 10.09, + 10.09, + 10.09, + 10.09, + 10.1, + 10.1, + 10.1, + 10.1, + 10.1, + 10.1, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.11, + 10.1, + 10.1, + 10.1, + 10.1, + 10.1, + 10.1, + 10.1, + 10.09, + 10.09, + 10.09, + 10.09, + 10.08, + 10.08, + 10.08, + 10.08, + 10.07, + 10.07, + 10.07, + 10.06, + 10.06, + 10.06, + 10.05, + 10.05, + 10.04, + 10.04, + 10.04, + 10.03, + 10.03, + 10.02, + 10.02, + 10.01, + 10.01, + 10.0, + 10.0, + 9.99, + 9.99, + 9.98, + 9.98, + 9.97, + 9.97, + 9.96, + 9.96, + 9.95, + 9.95, + 9.94, + 9.93, + 9.93, + 9.92, + 9.92, + 9.91, + 9.9, + 9.9, + 9.89, + 9.88, + 9.88, + 9.87, + 9.86, + 9.86, + 9.85, + 9.84, + 9.84, + 9.83, + 9.82, + 9.81, + 9.81, + 9.8, + 9.79, + 9.78, + 9.78, + 9.77, + 9.76, + 9.75, + 9.75, + 9.74, + 9.73, + 9.72, + 9.71, + 9.71, + 9.7, + 9.69, + 9.68, + 9.67, + 9.67, + 9.66, + 9.65, + 9.64, + 9.63, + 9.62, + 9.62, + 9.61, + 9.6, + 9.59, + 9.58, + 9.57, + 9.56, + 9.56, + 9.55, + 9.54, + 9.53, + 9.52, + 9.51, + 9.5, + 9.49, + 9.48, + 9.48, + 9.47, + 9.46, + 9.45, + 9.44, + 9.43, + 9.42, + 9.41, + 9.4, + 9.39, + 9.38, + 9.37, + 9.37, + 9.36, + 9.35, + 9.34, + 9.33, + 9.32, + 9.31, + 9.3, + 9.29, + 9.28, + 9.27, + 9.26, + 9.25, + 9.24, + 9.23, + 9.22, + 9.21, + 9.2, + 9.19, + 9.18, + 9.17, + 9.16, + 9.15, + 9.15, + 9.14, + 9.13, + 9.12, + 9.11, + 9.1, + 9.09, + 9.08, + 9.07, + 9.06, + 9.05, + 9.04, + 9.03, + 9.02, + 9.01, + 9.0, + 8.99, + 8.98, + 8.97, + 8.96, + 8.95, + 8.94, + 8.93, + 8.92, + 8.91, + 8.9, + 8.89, + 8.88, + 8.87, + 8.86, + 8.85, + 8.84, + 8.83, + 8.82, + 8.81, + 8.8, + 8.79, + 8.78, + 8.77, + 8.76, + 8.75, + 8.74, + 8.73, + 8.72, + 8.71, + 8.7, + 8.69, + 8.67, + 8.66, + 8.65, + 8.64, + 8.63, + 8.62, + 8.61, + 8.6, + 8.59, + 8.58, + 8.57, + 8.56, + 8.55, + 8.54, + 8.53, + 8.52, + 8.51, + 8.5, + 8.49, + 8.48, + 8.47, + 8.46, + 8.45, + 8.44, + 8.43, + 8.42, + 8.41, + 8.4, + 8.39, + 8.38, + 8.37, + 8.36, + 8.35, + 8.34, + 8.33, + 8.32, + 8.31, + 8.3, + 8.29, + 8.28, + 8.27, + 8.26, + 8.25, + 8.24, + 8.23, + 8.22, + 8.21, + 8.2, + 8.19, + 8.18, + 8.17, + 8.16, + 8.15, + 8.14, + 8.13, + 8.12, + 8.11, + 8.1, + 8.09, + 8.08, + 8.07, + 8.06, + 8.05, + 8.04, + 8.03, + 8.02, + 8.01, + 8.0, + 7.99, + 7.98, + 7.97, + 7.96, + 7.95, + 7.94, + 7.93, + 7.92, + 7.91, + 7.9, + 7.89, + 7.88, + 7.87, + 7.86, + 7.85, + 7.84, + 7.83, + 7.82, + 7.81, + 7.8, + 7.79, + 7.78, + 7.77, + 7.76, + 7.75, + 7.74, + 7.73, + 7.72, + 7.71, + 7.7, + 7.7, + 7.69, + 7.68, + 7.67, + 7.66, + 7.65, + 7.64, + 7.63, + 7.62, + 7.61, + 7.6, + 7.59, + 7.58, + 7.57, + 7.56, + 7.55, + 7.54, + 7.53, + 7.52, + 7.51, + 7.5, + 7.49, + 7.48, + 7.47, + 7.46, + 7.46, + 7.45, + 7.44, + 7.43, + 7.42, + 7.41, + 7.4, + 7.39, + 7.38, + 7.37, + 7.36, + 7.35, + 7.34, + 7.33, + 7.32, + 7.31, + 7.3, + 7.3, + 7.29, + 7.28, + 7.27, + 7.26, + 7.25, + 7.24, + 7.23, + 7.22, + 7.21, + 7.2, + 7.19, + 7.18, + 7.17, + 7.17, + 7.16, + 7.15, + 7.14, + 7.13, + 7.12, + 7.11, + 7.1, + 7.09, + 7.08, + 7.07, + 7.06, + 7.06, + 7.05, + 7.04, + 7.03, + 7.02, + 7.01, + 7.0, + 6.99, + 6.98, + 6.97, + 6.97, + 6.96, + 6.95, + 6.94, + 6.93, + 6.92, + 6.91, + 6.9, + 6.89, + 6.89, + 6.88, + 6.87, + 6.86, + 6.85, + 6.84, + 6.83, + 6.82, + 6.81, + 6.81, + 6.8, + 6.79, + 6.78, + 6.77, + 6.76, + 6.75, + 6.74, + 6.74, + 6.73, + 6.72, + 6.71, + 6.7, + 6.69, + 6.68, + 6.67, + 6.67, + 6.66, + 6.65, + 6.64, + 6.63, + 6.62, + 6.61, + 6.61, + 6.6, + 6.59, + 6.58, + 6.57, + 6.56, + 6.55, + 6.55, + 6.54, + 6.53, + 6.52, + 6.51, + 6.5, + 6.5, + 6.49, + 6.48, + 6.47, + 6.46, + 6.45, + 6.44, + 6.44, + 6.43, + 6.42, + 6.41, + 6.4, + 6.39, + 6.39, + 6.38, + 6.37, + 6.36, + 6.35, + 6.35, + 6.34, + 6.33, + 6.32, + 6.31, + 6.3, + 6.3, + 6.29, + 6.28, + 6.27, + 6.26, + 6.26, + 6.25, + 6.24, + 6.23, + 6.22, + 6.21, + 6.21, + 6.2, + 6.19, + 6.18, + 6.17, + 6.17, + 6.16, + 6.15, + 6.14, + 6.13, + 6.13, + 6.12, + 6.11, + 6.1, + 6.09, + 6.09, + 6.08, + 6.07, + 6.06, + 6.05, + 6.05, + 6.04, + 6.03, + 6.02, + 6.02, + 6.01, + 6.0, + 5.99, + 5.98, + 5.98, + 5.97, + 5.96, + 5.95, + 5.95, + 5.94, + 5.93, + 5.92, + 5.91, + 5.91, + 5.9, + 5.89, + 5.88, + 5.88, + 5.87, + 5.86, + 5.85, + 5.85, + 5.84, + 5.83, + 5.82, + 5.81, + 5.81, + 5.8, + 5.79, + 5.78, + 5.78, + 5.77, + 5.76, + 5.75, + 5.75, + 5.74, + 5.73, + 5.72, + 5.72, + 5.71, + 5.7, + 5.69, + 5.69, + 5.68, + 5.67, + 5.67, + 5.66, + 5.65, + 5.64, + 5.64, + 5.63, + 5.62, + 5.61, + 5.61, + 5.6, + 5.59, + 5.58, + 5.58, + 5.57, + 5.56, + 5.56, + 5.55, + 5.54, + 5.53, + 5.53, + 5.52, + 5.51, + 5.5, + 5.5, + 5.49, + 5.48, + 5.48, + 5.47, + 5.46, + 5.45, + 5.45, + 5.44, + 5.43, + 5.43, + 5.42, + 5.41, + 5.4, + 5.4, + 5.39, + 5.38, + 5.38, + 5.37, + 5.36, + 5.36, + 5.35, + 5.34, + 5.33, + 5.33, + 5.32, + 5.31, + 5.31, + 5.3, + 5.29, + 5.29, + 5.28, + 5.27, + 5.27, + 5.26, + 5.25, + 5.24, + 5.24, + 5.23, + 5.22, + 5.22, + 5.21, + 5.2, + 5.2, + 5.19, + 5.18, + 5.18, + 5.17, + 5.16, + 5.16, + 5.15, + 5.14, + 5.14, + 5.13, + 5.12, + 5.12, + 5.11, + 5.1, + 5.1, + 5.09, + 5.08, + 5.08, + 5.07, + 5.06, + 5.06, + 5.05, + 5.04, + 5.04, + 5.03, + 5.02, + 5.02, + 5.01, + 5.0, + 5.0, + 4.99, + 4.98, + 4.98, + 4.97, + 4.96, + 4.96, + 4.95, + 4.95, + 4.94, + 4.93, + 4.93, + 4.92, + 4.91, + 4.91, + 4.9, + 4.89, + 4.89, + 4.88, + 4.87, + 4.87, + 4.86, + 4.86, + 4.85, + 4.84, + 4.84, + 4.83, + 4.82, + 4.82, + 4.81, + 4.8, + 4.8, + 4.79, + 4.79, + 4.78, + 4.77, + 4.77, + 4.76, + 4.75, + 4.75, + 4.74, + 4.74, + 4.73, + 4.72, + 4.72, + 4.71, + 4.71, + 4.7, + 4.69, + 4.69, + 4.68, + 4.67, + 4.67, + 4.66, + 4.66, + 4.65, + 4.64, + 4.64, + 4.63, + 4.63, + 4.62, + 4.61, + 4.61, + 4.6, + 4.6, + 4.59, + 4.58, + 4.58, + 4.57, + 4.57, + 4.56, + 4.55, + 4.55, + 4.54, + 4.54, + 4.53, + 4.52, + 4.52, + 4.51, + 4.51, + 4.5, + 4.49, + 4.49, + 4.48, + 4.48, + 4.47, + 4.47, + 4.46, + 4.45, + 4.45, + 4.44, + 4.44, + 4.43, + 4.42, + 4.42, + 4.41, + 4.41, + 4.4, + 4.4, + 4.39, + 4.38, + 4.38, + 4.37, + 4.37, + 4.36, + 4.36, + 4.35, + 4.34, + 4.34, + 4.33, + 4.33, + 4.32, + 4.32, + 4.31, + 4.3, + 4.3, + 4.29, + 4.29, + 4.28, + 4.28, + 4.27, + 4.27, + 4.26, + 4.25, + 4.25, + 4.24, + 4.24, + 4.23, + 4.23, + 4.22, + 4.22, + 4.21, + 4.2, + 4.2, + 4.19, + 4.19, + 4.18, + 4.18, + 4.17, + 4.17, + 4.16, + 4.16, + 4.15, + 4.14, + 4.14, + 4.13, + 4.13, + 4.12, + 4.12, + 4.11, + 4.11, + 4.1, + 4.1, + 4.09, + 4.09, + 4.08, + 4.07, + 4.07, + 4.06, + 4.06, + 4.05, + 4.05, + 4.04, + 4.04, + 4.03, + 4.03, + 4.02, + 4.02, + 4.01, + 4.01, + 4.0, + 4.0, + 3.99, + 3.98, + 3.98, + 3.97, + 3.97, + 3.96, + 3.96, + 3.95, + 3.95, + 3.94, + 3.94, + 3.93, + 3.93, + 3.92, + 3.92, + 3.91, + 3.91, + 3.9, + 3.9, + 3.89, + 3.89, + 3.88, + 3.88, + 3.87, + 3.87, + 3.86, + 3.86, + 3.85, + 3.85, + 3.84, + 3.84, + 3.83, + 3.83, + 3.82, + 3.82, + 3.81, + 3.81, + 3.8, + 3.8, + 3.79, + 3.79, + 3.78, + 3.78, + 3.77, + 3.77, + 3.76, + 3.76, + 3.75, + 3.75, + 3.74, + 3.74, + 3.73, + 3.73, + 3.72, + 3.72, + 3.71, + 3.71, + 3.7, + 3.7, + 3.69, + 3.69, + 3.68, + 3.68, + 3.67, + 3.67, + 3.66, + 3.66, + 3.66, + 3.65, + 3.65, + 3.64, + 3.64, + 3.63, + 3.63, + 3.62, + 3.62, + 3.61, + 3.61, + 3.6, + 3.6, + 3.59, + 3.59, + 3.58, + 3.58, + 3.57, + 3.57, + 3.57, + 3.56, + 3.56, + 3.55, + 3.55, + 3.54, + 3.54, + 3.53, + 3.53, + 3.52, + 3.52, + 3.51, + 3.51, + 3.51, + 3.5, + 3.5, + 3.49, + 3.49, + 3.48, + 3.48, + 3.47, + 3.47, + 3.46, + 3.46, + 3.46, + 3.45, + 3.45, + 3.44, + 3.44, + 3.43, + 3.43, + 3.42, + 3.42, + 3.41, + 3.41, + 3.41, + 3.4, + 3.4, + 3.39, + 3.39, + 3.38, + 3.38, + 3.37, + 3.37, + 3.37, + 3.36, + 3.36, + 3.35, + 3.35, + 3.34, + 3.34, + 3.34, + 3.33, + 3.33, + 3.32, + 3.32, + 3.31, + 3.31, + 3.3, + 3.3, + 3.3, + 3.29, + 3.29, + 3.28, + 3.28, + 3.27, + 3.27, + 3.27, + 3.26, + 3.26, + 3.25, + 3.25, + 3.24, + 3.24, + 3.24, + 3.23, + 3.23, + 3.22, + 3.22, + 3.22, + 3.21, + 3.21, + 3.2, + 3.2, + 3.19, + 3.19, + 3.19, + 3.18, + 3.18, + 3.17, + 3.17, + 3.16, + 3.16, + 3.16, + 3.15, + 3.15, + 3.14, + 3.14, + 3.14, + 3.13, + 3.13, + 3.12, + 3.12, + 3.12, + 3.11, + 3.11, + 3.1, + 3.1, + 3.1, + 3.09, + 3.09, + 3.08, + 3.08, + 3.08, + 3.07, + 3.07, + 3.06, + 3.06, + 3.06, + 3.05, + 3.05, + 3.04, + 3.04, + 3.04, + 3.03, + 3.03, + 3.02, + 3.02, + 3.02, + 3.01, + 3.01, + 3.0, + 3.0, + 3.0, + 2.99, + 2.99, + 2.98, + 2.98, + 2.98, + 2.97, + 2.97, + 2.96, + 2.96, + 2.96, + 2.95, + 2.95, + 2.95, + 2.94, + 2.94, + 2.93, + 2.93, + 2.93, + 2.92, + 2.92, + 2.91, + 2.91, + 2.91, + 2.9, + 2.9, + 2.9, + 2.89, + 2.89, + 2.88, + 2.88, + 2.88, + 2.87, + 2.87, + 2.87, + 2.86, + 2.86, + 2.85, + 2.85, + 2.85, + 2.84, + 2.84, + 2.84, + 2.83, + 2.83, + 2.82, + 2.82, + 2.82, + 2.81, + 2.81, + 2.81, + 2.8, + 2.8, + 2.79, + 2.79, + 2.79, + 2.78, + 2.78, + 2.78, + 2.77, + 2.77, + 2.77, + 2.76, + 2.76, + 2.75, + 2.75, + 2.75, + 2.74, + 2.74, + 2.74, + 2.73, + 2.73, + 2.73, + 2.72, + 2.72, + 2.72, + 2.71, + 2.71, + 2.7, + 2.7, + 2.7, + 2.69, + 2.69, + 2.69, + 2.68, + 2.68, + 2.68, + 2.67, + 2.67, + 2.67, + 2.66, + 2.66, + 2.66, + 2.65, + 2.65, + 2.65, + 2.64, + 2.64, + 2.64, + 2.63, + 2.63, + 2.62, + 2.62, + 2.62, + 2.61, + 2.61, + 2.61, + 2.6, + 2.6, + 2.6, + 2.59, + 2.59, + 2.59, + 2.58, + 2.58, + 2.58, + 2.57, + 2.57, + 2.57, + 2.56, + 2.56, + 2.56, + 2.55, + 2.55, + 2.55, + 2.54, + 2.54, + 2.54, + 2.53, + 2.53, + 2.53, + 2.52, + 2.52, + 2.52, + 2.51, + 2.51, + 2.51, + 2.5, + 2.5, + 2.5, + 2.49, + 2.49, + 2.49, + 2.48, + 2.48, + 2.48, + 2.47, + 2.47, + 2.47, + 2.46, + 2.46, + 2.46, + 2.46, + 2.45, + 2.45, + 2.45, + 2.44, + 2.44, + 2.44, + 2.43, + 2.43, + 2.43, + 2.42, + 2.42, + 2.42, + 2.41, + 2.41, + 2.41, + 2.4, + 2.4, + 2.4, + 2.39, + 2.39, + 2.39, + 2.39, + 2.38, + 2.38, + 2.38, + 2.37, + 2.37, + 2.37, + 2.36, + 2.36, + 2.36, + 2.35, + 2.35, + 2.35, + 2.35, + 2.34, + 2.34, + 2.34, + 2.33, + 2.33, + 2.33, + 2.32, + 2.32, + 2.32, + 2.31, + 2.31, + 2.31, + 2.31, + 2.3, + 2.3, + 2.3, + 2.29, + 2.29, + 2.29, + 2.28, + 2.28, + 2.28, + 2.28, + 2.27, + 2.27, + 2.27, + 2.26, + 2.26, + 2.26, + 2.25, + 2.25, + 2.25, + 2.25, + 2.24, + 2.24, + 2.24, + 2.23, + 2.23, + 2.23, + 2.23, + 2.22, + 2.22, + 2.22, + 2.21, + 2.21, + 2.21, + 2.21, + 2.2, + 2.2, + 2.2, + 2.19, + 2.19, + 2.19, + 2.19, + 2.18, + 2.18, + 2.18, + 2.17, + 2.17, + 2.17, + 2.17, + 2.16, + 2.16, + 2.16, + 2.15, + 2.15, + 2.15, + 2.15, + 2.14, + 2.14, + 2.14, + 2.13, + 2.13, + 2.13, + 2.13, + 2.12, + 2.12, + 2.12, + 2.11, + 2.11, + 2.11, + 2.11, + 2.1, + 2.1, + 2.1, + 2.1, + 2.09, + 2.09, + 2.09, + 2.08, + 2.08, + 2.08, + 2.08, + 2.07, + 2.07, + 2.07, + 2.07, + 2.06, + 2.06, + 2.06, + 2.05, + 2.05, + 2.05, + 2.05, + 2.04, + 2.04, + 2.04, + 2.04, + 2.03, + 2.03, + 2.03, + 2.03, + 2.02, + 2.02, + 2.02, + 2.01, + 2.01, + 2.01, + 2.01, + 2.0, + 2.0, + 2.0, + 2.0, + 1.99, + 1.99, + 1.99, + 1.99, + 1.98, + 1.98, + 1.98, + 1.98, + 1.97, + 1.97, + 1.97, + 1.97, + 1.96, + 1.96, + 1.96, + 1.96, + 1.95, + 1.95, + 1.95, + 1.94, + 1.94, + 1.94, + 1.94, + 1.93, + 1.93, + 1.93, + 1.93, + 1.92, + 1.92, + 1.92, + 1.92, + 1.91, + 1.91, + 1.91, + 1.91, + 1.9, + 1.9, + 1.9, + 1.9, + 1.89, + 1.89, + 1.89, + 1.89, + 1.88, + 1.88, + 1.88, + 1.88, + 1.87, + 1.87, + 1.87, + 1.87, + 1.87, + 1.86, + 1.86, + 1.86, + 1.86, + 1.85, + 1.85, + 1.85, + 1.85, + 1.84, + 1.84, + 1.84, + 1.84, + 1.83, + 1.83, + 1.83, + 1.83, + 1.82, + 1.82, + 1.82, + 1.82, + 1.81, + 1.81, + 1.81, + 1.81, + 1.81, + 1.8, + 1.8, + 1.8, + 1.8, + 1.79, + 1.79, + 1.79, + 1.79, + 1.78, + 1.78, + 1.78, + 1.78, + 1.77, + 1.77, + 1.77, + 1.77, + 1.77, + 1.76, + 1.76, + 1.76, + 1.76, + 1.75, + 1.75, + 1.75, + 1.75, + 1.74, + 1.74, + 1.74, + 1.74, + 1.74, + 1.73, + 1.73, + 1.73, + 1.73, + 1.72, + 1.72, + 1.72, + 1.72, + 1.72, + 1.71, + 1.71, + 1.71, + 1.71, + 1.7, + 1.7, + 1.7, + 1.7, + 1.7, + 1.69, + 1.69, + 1.69, + 1.69, + 1.68, + 1.68, + 1.68, + 1.68, + 1.68, + 1.67, + 1.67, + 1.67, + 1.67, + 1.66, + 1.66, + 1.66, + 1.66, + 1.66, + 1.65, + 1.65, + 1.65, + 1.65, + 1.64, + 1.64, + 1.64, + 1.64, + 1.64, + 1.63, + 1.63, + 1.63, + 1.63, + 1.63, + 1.62, + 1.62, + 1.62, + 1.62, + 1.61, + 1.61, + 1.61, + 1.61, + 1.61, + 1.6, + 1.6, + 1.6, + 1.6, + 1.6, + 1.59, + 1.59, + 1.59, + 1.59, + 1.59, + 1.58, + 1.58, + 1.58, + 1.58, + 1.58, + 1.57, + 1.57, + 1.57, + 1.57, + 1.57, + 1.56, + 1.56, + 1.56, + 1.56, + 1.55, + 1.55, + 1.55, + 1.55, + 1.55, + 1.54, + 1.54, + 1.54, + 1.54, + 1.54, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.52, + 1.52, + 1.52, + 1.52, + 1.52, + 1.51, + 1.51, + 1.51, + 1.51, + 1.51, + 1.5, + 1.5, + 1.5, + 1.5, + 1.5, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 1.48, + 1.48, + 1.48, + 1.48, + 1.48, + 1.47, + 1.47, + 1.47, + 1.47, + 1.47, + 1.46, + 1.46, + 1.46, + 1.46, + 1.46, + 1.45, + 1.45, + 1.45, + 1.45, + 1.45, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.44, + 1.43, + 1.43, + 1.43, + 1.43, + 1.43, + 1.42, + 1.42, + 1.42, + 1.42, + 1.42, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.41, + 1.4, + 1.4, + 1.4, + 1.4, + 1.4, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.39, + 1.38, + 1.38, + 1.38, + 1.38, + 1.38, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.37, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.36, + 1.35, + 1.35, + 1.35, + 1.35, + 1.35, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.34, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.33, + 1.32, + 1.32, + 1.32, + 1.32, + 1.32, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.31, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.3, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.29, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.28, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.27, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.26, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.25, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.24, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.23, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.22, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.21, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.2, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.19, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.18, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.17, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.16, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.15, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.14, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.12, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.11, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.09, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.08, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.07, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.06, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.04, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.03, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.02, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.01, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.99, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.98, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.97, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.96, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.95, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.94, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.93, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.92, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.91, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.9, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.89, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.88, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.87, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.86, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.85, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.84, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.82, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.81, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.79, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.78, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.77, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.76, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.75, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.74, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.73, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.72, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.71, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.67, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.64, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.63, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.62, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.61, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.59, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.58, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.57, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.56, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.55, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.54, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.53, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.52, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.51, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.49, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.48, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.47, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.46, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.45, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.42, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.41, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "EEn_tfs": [ + 0.0, + 0.01, + 0.04, + 0.09, + 0.16, + 0.25, + 0.35, + 0.47, + 0.61, + 0.76, + 0.93, + 1.11, + 1.3, + 1.5, + 1.72, + 1.95, + 2.19, + 2.43, + 2.69, + 2.96, + 3.23, + 3.51, + 3.8, + 4.1, + 4.4, + 4.71, + 5.02, + 5.34, + 5.67, + 6.0, + 6.33, + 6.67, + 7.0, + 7.35, + 7.69, + 8.04, + 8.39, + 8.74, + 9.09, + 9.45, + 9.8, + 10.16, + 10.51, + 10.87, + 11.23, + 11.58, + 11.94, + 12.29, + 12.65, + 13.0, + 13.35, + 13.71, + 14.06, + 14.4, + 14.75, + 15.09, + 15.44, + 15.78, + 16.11, + 16.45, + 16.78, + 17.11, + 17.44, + 17.76, + 18.08, + 18.4, + 18.72, + 19.03, + 19.34, + 19.64, + 19.95, + 20.25, + 20.54, + 20.83, + 21.12, + 21.4, + 21.69, + 21.96, + 22.24, + 22.5, + 22.77, + 23.03, + 23.29, + 23.54, + 23.79, + 24.04, + 24.28, + 24.52, + 24.75, + 24.98, + 25.21, + 25.43, + 25.65, + 25.86, + 26.07, + 26.28, + 26.48, + 26.68, + 26.87, + 27.06, + 27.24, + 27.43, + 27.6, + 27.78, + 27.95, + 28.11, + 28.27, + 28.43, + 28.59, + 28.74, + 28.88, + 29.03, + 29.16, + 29.3, + 29.43, + 29.56, + 29.68, + 29.8, + 29.92, + 30.03, + 30.14, + 30.25, + 30.35, + 30.45, + 30.54, + 30.64, + 30.72, + 30.81, + 30.89, + 30.97, + 31.05, + 31.12, + 31.19, + 31.25, + 31.31, + 31.37, + 31.43, + 31.48, + 31.53, + 31.58, + 31.63, + 31.67, + 31.71, + 31.74, + 31.77, + 31.81, + 31.83, + 31.86, + 31.88, + 31.9, + 31.92, + 31.93, + 31.94, + 31.95, + 31.96, + 31.96, + 31.97, + 31.97, + 31.96, + 31.96, + 31.95, + 31.94, + 31.93, + 31.92, + 31.9, + 31.88, + 31.86, + 31.84, + 31.82, + 31.79, + 31.76, + 31.73, + 31.7, + 31.67, + 31.63, + 31.6, + 31.56, + 31.52, + 31.47, + 31.43, + 31.39, + 31.34, + 31.29, + 31.24, + 31.19, + 31.13, + 31.08, + 31.02, + 30.97, + 30.91, + 30.85, + 30.79, + 30.72, + 30.66, + 30.59, + 30.53, + 30.46, + 30.39, + 30.32, + 30.25, + 30.18, + 30.1, + 30.03, + 29.95, + 29.88, + 29.8, + 29.72, + 29.64, + 29.56, + 29.48, + 29.4, + 29.32, + 29.23, + 29.15, + 29.06, + 28.98, + 28.89, + 28.8, + 28.71, + 28.62, + 28.53, + 28.44, + 28.35, + 28.26, + 28.17, + 28.08, + 27.98, + 27.89, + 27.8, + 27.7, + 27.61, + 27.51, + 27.41, + 27.32, + 27.22, + 27.12, + 27.02, + 26.93, + 26.83, + 26.73, + 26.63, + 26.53, + 26.43, + 26.33, + 26.23, + 26.13, + 26.03, + 25.92, + 25.82, + 25.72, + 25.62, + 25.52, + 25.41, + 25.31, + 25.21, + 25.11, + 25.0, + 24.9, + 24.8, + 24.69, + 24.59, + 24.49, + 24.38, + 24.28, + 24.17, + 24.07, + 23.97, + 23.86, + 23.76, + 23.65, + 23.55, + 23.45, + 23.34, + 23.24, + 23.13, + 23.03, + 22.93, + 22.82, + 22.72, + 22.62, + 22.51, + 22.41, + 22.31, + 22.2, + 22.1, + 22.0, + 21.89, + 21.79, + 21.69, + 21.59, + 21.48, + 21.38, + 21.28, + 21.18, + 21.08, + 20.97, + 20.87, + 20.77, + 20.67, + 20.57, + 20.47, + 20.37, + 20.27, + 20.17, + 20.07, + 19.97, + 19.87, + 19.77, + 19.67, + 19.57, + 19.48, + 19.38, + 19.28, + 19.18, + 19.08, + 18.99, + 18.89, + 18.79, + 18.7, + 18.6, + 18.51, + 18.41, + 18.32, + 18.22, + 18.13, + 18.03, + 17.94, + 17.84, + 17.75, + 17.66, + 17.57, + 17.47, + 17.38, + 17.29, + 17.2, + 17.11, + 17.01, + 16.92, + 16.83, + 16.74, + 16.65, + 16.57, + 16.48, + 16.39, + 16.3, + 16.21, + 16.12, + 16.04, + 15.95, + 15.86, + 15.78, + 15.69, + 15.6, + 15.52, + 15.43, + 15.35, + 15.26, + 15.18, + 15.1, + 15.01, + 14.93, + 14.85, + 14.77, + 14.68, + 14.6, + 14.52, + 14.44, + 14.36, + 14.28, + 14.2, + 14.12, + 14.04, + 13.96, + 13.88, + 13.8, + 13.73, + 13.65, + 13.57, + 13.49, + 13.42, + 13.34, + 13.27, + 13.19, + 13.12, + 13.04, + 12.97, + 12.89, + 12.82, + 12.75, + 12.67, + 12.6, + 12.53, + 12.46, + 12.38, + 12.31, + 12.24, + 12.17, + 12.1, + 12.03, + 11.96, + 11.89, + 11.82, + 11.75, + 11.69, + 11.62, + 11.55, + 11.48, + 11.42, + 11.35, + 11.28, + 11.22, + 11.15, + 11.09, + 11.02, + 10.96, + 10.89, + 10.83, + 10.77, + 10.7, + 10.64, + 10.58, + 10.51, + 10.45, + 10.39, + 10.33, + 10.27, + 10.21, + 10.15, + 10.09, + 10.03, + 9.97, + 9.91, + 9.85, + 9.79, + 9.73, + 9.68, + 9.62, + 9.56, + 9.5, + 9.45, + 9.39, + 9.33, + 9.28, + 9.22, + 9.17, + 9.11, + 9.06, + 9.0, + 8.95, + 8.9, + 8.84, + 8.79, + 8.74, + 8.68, + 8.63, + 8.58, + 8.53, + 8.48, + 8.43, + 8.38, + 8.32, + 8.27, + 8.22, + 8.17, + 8.13, + 8.08, + 8.03, + 7.98, + 7.93, + 7.88, + 7.83, + 7.79, + 7.74, + 7.69, + 7.65, + 7.6, + 7.55, + 7.51, + 7.46, + 7.42, + 7.37, + 7.33, + 7.28, + 7.24, + 7.19, + 7.15, + 7.11, + 7.06, + 7.02, + 6.98, + 6.93, + 6.89, + 6.85, + 6.81, + 6.76, + 6.72, + 6.68, + 6.64, + 6.6, + 6.56, + 6.52, + 6.48, + 6.44, + 6.4, + 6.36, + 6.32, + 6.28, + 6.24, + 6.21, + 6.17, + 6.13, + 6.09, + 6.05, + 6.02, + 5.98, + 5.94, + 5.91, + 5.87, + 5.83, + 5.8, + 5.76, + 5.73, + 5.69, + 5.66, + 5.62, + 5.59, + 5.55, + 5.52, + 5.48, + 5.45, + 5.42, + 5.38, + 5.35, + 5.32, + 5.28, + 5.25, + 5.22, + 5.18, + 5.15, + 5.12, + 5.09, + 5.06, + 5.03, + 4.99, + 4.96, + 4.93, + 4.9, + 4.87, + 4.84, + 4.81, + 4.78, + 4.75, + 4.72, + 4.69, + 4.66, + 4.63, + 4.61, + 4.58, + 4.55, + 4.52, + 4.49, + 4.46, + 4.44, + 4.41, + 4.38, + 4.35, + 4.33, + 4.3, + 4.27, + 4.25, + 4.22, + 4.19, + 4.17, + 4.14, + 4.11, + 4.09, + 4.06, + 4.04, + 4.01, + 3.99, + 3.96, + 3.94, + 3.91, + 3.89, + 3.86, + 3.84, + 3.82, + 3.79, + 3.77, + 3.75, + 3.72, + 3.7, + 3.68, + 3.65, + 3.63, + 3.61, + 3.58, + 3.56, + 3.54, + 3.52, + 3.5, + 3.47, + 3.45, + 3.43, + 3.41, + 3.39, + 3.37, + 3.34, + 3.32, + 3.3, + 3.28, + 3.26, + 3.24, + 3.22, + 3.2, + 3.18, + 3.16, + 3.14, + 3.12, + 3.1, + 3.08, + 3.06, + 3.04, + 3.02, + 3.0, + 2.99, + 2.97, + 2.95, + 2.93, + 2.91, + 2.89, + 2.87, + 2.86, + 2.84, + 2.82, + 2.8, + 2.79, + 2.77, + 2.75, + 2.73, + 2.72, + 2.7, + 2.68, + 2.66, + 2.65, + 2.63, + 2.61, + 2.6, + 2.58, + 2.57, + 2.55, + 2.53, + 2.52, + 2.5, + 2.49, + 2.47, + 2.45, + 2.44, + 2.42, + 2.41, + 2.39, + 2.38, + 2.36, + 2.35, + 2.33, + 2.32, + 2.3, + 2.29, + 2.28, + 2.26, + 2.25, + 2.23, + 2.22, + 2.2, + 2.19, + 2.18, + 2.16, + 2.15, + 2.14, + 2.12, + 2.11, + 2.1, + 2.08, + 2.07, + 2.06, + 2.04, + 2.03, + 2.02, + 2.0, + 1.99, + 1.98, + 1.97, + 1.95, + 1.94, + 1.93, + 1.92, + 1.91, + 1.89, + 1.88, + 1.87, + 1.86, + 1.85, + 1.83, + 1.82, + 1.81, + 1.8, + 1.79, + 1.78, + 1.77, + 1.75, + 1.74, + 1.73, + 1.72, + 1.71, + 1.7, + 1.69, + 1.68, + 1.67, + 1.66, + 1.65, + 1.64, + 1.63, + 1.62, + 1.61, + 1.6, + 1.59, + 1.58, + 1.57, + 1.56, + 1.55, + 1.54, + 1.53, + 1.52, + 1.51, + 1.5, + 1.49, + 1.48, + 1.47, + 1.46, + 1.45, + 1.44, + 1.43, + 1.42, + 1.41, + 1.4, + 1.4, + 1.39, + 1.38, + 1.37, + 1.36, + 1.35, + 1.34, + 1.34, + 1.33, + 1.32, + 1.31, + 1.3, + 1.29, + 1.29, + 1.28, + 1.27, + 1.26, + 1.25, + 1.25, + 1.24, + 1.23, + 1.22, + 1.21, + 1.21, + 1.2, + 1.19, + 1.18, + 1.18, + 1.17, + 1.16, + 1.15, + 1.15, + 1.14, + 1.13, + 1.12, + 1.12, + 1.11, + 1.1, + 1.1, + 1.09, + 1.08, + 1.08, + 1.07, + 1.06, + 1.06, + 1.05, + 1.04, + 1.04, + 1.03, + 1.02, + 1.02, + 1.01, + 1.0, + 1.0, + 0.99, + 0.98, + 0.98, + 0.97, + 0.97, + 0.96, + 0.95, + 0.95, + 0.94, + 0.94, + 0.93, + 0.92, + 0.92, + 0.91, + 0.91, + 0.9, + 0.89, + 0.89, + 0.88, + 0.88, + 0.87, + 0.87, + 0.86, + 0.86, + 0.85, + 0.84, + 0.84, + 0.83, + 0.83, + 0.82, + 0.82, + 0.81, + 0.81, + 0.8, + 0.8, + 0.79, + 0.79, + 0.78, + 0.78, + 0.77, + 0.77, + 0.76, + 0.76, + 0.75, + 0.75, + 0.74, + 0.74, + 0.73, + 0.73, + 0.73, + 0.72, + 0.72, + 0.71, + 0.71, + 0.7, + 0.7, + 0.69, + 0.69, + 0.68, + 0.68, + 0.68, + 0.67, + 0.67, + 0.66, + 0.66, + 0.65, + 0.65, + 0.65, + 0.64, + 0.64, + 0.63, + 0.63, + 0.63, + 0.62, + 0.62, + 0.61, + 0.61, + 0.61, + 0.6, + 0.6, + 0.6, + 0.59, + 0.59, + 0.58, + 0.58, + 0.58, + 0.57, + 0.57, + 0.57, + 0.56, + 0.56, + 0.55, + 0.55, + 0.55, + 0.54, + 0.54, + 0.54, + 0.53, + 0.53, + 0.53, + 0.52, + 0.52, + 0.52, + 0.51, + 0.51, + 0.51, + 0.5, + 0.5, + 0.5, + 0.49, + 0.49, + 0.49, + 0.49, + 0.48, + 0.48, + 0.48, + 0.47, + 0.47, + 0.47, + 0.46, + 0.46, + 0.46, + 0.46, + 0.45, + 0.45, + 0.45, + 0.44, + 0.44, + 0.44, + 0.44, + 0.43, + 0.43, + 0.43, + 0.42, + 0.42, + 0.42, + 0.42, + 0.41, + 0.41, + 0.41, + 0.41, + 0.4, + 0.4, + 0.4, + 0.4, + 0.39, + 0.39, + 0.39, + 0.39, + 0.38, + 0.38, + 0.38, + 0.38, + 0.37, + 0.37, + 0.37, + 0.37, + 0.36, + 0.36, + 0.36, + 0.36, + 0.36, + 0.35, + 0.35, + 0.35, + 0.35, + 0.34, + 0.34, + 0.34, + 0.34, + 0.34, + 0.33, + 0.33, + 0.33, + 0.33, + 0.33, + 0.32, + 0.32, + 0.32, + 0.32, + 0.31, + 0.31, + 0.31, + 0.31, + 0.31, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.29, + 0.29, + 0.29, + 0.29, + 0.29, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.28, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.27, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.26, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.25, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.24, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.23, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.22, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.21, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.19, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.18, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.16, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.14, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.13, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.12, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.11, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.09, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.07, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hormonetrack/HormoneTrackApp.kt b/app/src/main/java/com/hormonetrack/HormoneTrackApp.kt new file mode 100644 index 0000000..143cbe9 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/HormoneTrackApp.kt @@ -0,0 +1,32 @@ +package com.hormonetrack + +import android.app.Application +import android.content.Context +import com.hormonetrack.data.AppDatabase +import com.hormonetrack.data.repository.HormoneRepository +import com.hormonetrack.pk.PKProfileStore +import com.hormonetrack.reminder.createNotificationChannel +import com.hormonetrack.settings.AppSettings + +class HormoneTrackApp : Application() { + + lateinit var container: AppContainer + private set + + override fun onCreate() { + super.onCreate() + container = AppContainer(this) + PKProfileStore.init(this) + createNotificationChannel(this) + } +} + +class AppContainer(appContext: Context) { + private val database = AppDatabase.getInstance(appContext) + val repository = HormoneRepository( + database.treatmentDao(), + database.doseLogDao(), + database.labResultDao() + ) + val settings = AppSettings(appContext) +} diff --git a/app/src/main/java/com/hormonetrack/MainActivity.kt b/app/src/main/java/com/hormonetrack/MainActivity.kt new file mode 100644 index 0000000..0d9ccf9 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/MainActivity.kt @@ -0,0 +1,65 @@ +package com.hormonetrack + +import android.Manifest +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import androidx.lifecycle.lifecycleScope +import com.hormonetrack.ui.HormoneTrackRoot +import com.hormonetrack.ui.theme.HormoneTrackTheme +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch + +class MainActivity : AppCompatActivity() { + + private val notificationPermissionLauncher = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val container = (application as HormoneTrackApp).container + + lifecycleScope.launch { + val lang = container.settings.language.first() + val locales = if (lang == "system") { + LocaleListCompat.getEmptyLocaleList() + } else { + LocaleListCompat.forLanguageTags(lang) + } + if (AppCompatDelegate.getApplicationLocales() != locales) { + AppCompatDelegate.setApplicationLocales(locales) + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) != + PackageManager.PERMISSION_GRANTED + ) { + notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } + } + + val openLogDose = intent?.getBooleanExtra("open_log_dose", false) ?: false + val treatmentId = intent?.getLongExtra("treatment_id", -1L) ?: -1L + + setContent { + HormoneTrackTheme { + HormoneTrackRoot( + initialOpenLogDose = openLogDose, + initialTreatmentId = treatmentId + ) + } + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + } +} diff --git a/app/src/main/java/com/hormonetrack/data/AppDatabase.kt b/app/src/main/java/com/hormonetrack/data/AppDatabase.kt new file mode 100644 index 0000000..7c98dfa --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/AppDatabase.kt @@ -0,0 +1,42 @@ +package com.hormonetrack.data + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import com.hormonetrack.data.dao.DoseLogDao +import com.hormonetrack.data.dao.LabResultDao +import com.hormonetrack.data.dao.TreatmentDao +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.Treatment + +@Database( + entities = [Treatment::class, DoseLog::class, LabResult::class], + version = 1, + exportSchema = false +) +abstract class AppDatabase : RoomDatabase() { + abstract fun treatmentDao(): TreatmentDao + abstract fun doseLogDao(): DoseLogDao + abstract fun labResultDao(): LabResultDao + + companion object { + @Volatile + private var INSTANCE: AppDatabase? = null + + fun getInstance(context: Context): AppDatabase { + return INSTANCE ?: synchronized(this) { + val instance = Room.databaseBuilder( + context.applicationContext, + AppDatabase::class.java, + "hormonetrack.db" + ) + .fallbackToDestructiveMigration() + .build() + INSTANCE = instance + instance + } + } + } +} diff --git a/app/src/main/java/com/hormonetrack/data/backup/BackupManager.kt b/app/src/main/java/com/hormonetrack/data/backup/BackupManager.kt new file mode 100644 index 0000000..12eb6bb --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/backup/BackupManager.kt @@ -0,0 +1,71 @@ +package com.hormonetrack.data.backup + +import android.content.Context +import android.net.Uri +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.data.repository.HormoneRepository +import com.hormonetrack.pk.TConfig + +data class BackupData( + val version: Int = 1, + val exportedAt: Long = System.currentTimeMillis(), + val treatments: List = emptyList(), + val doseLogs: List = emptyList(), + val labResults: List = emptyList(), + val tConfig: TConfig = TConfig() +) + +object BackupManager { + + suspend fun exportJson(repo: HormoneRepository, tConfig: TConfig): String { + val data = BackupData( + treatments = repo.allTreatmentsOnce(), + doseLogs = repo.allDoseLogsOnce(), + labResults = repo.allLabResultsOnce(), + tConfig = tConfig + ) + return Gson().toJson(data) + } + + data class ImportResult(val treatments: Int, val doseLogs: Int, val labResults: Int) + + suspend fun importJson( + repo: HormoneRepository, + json: String + ): ImportResult { + val type = object : TypeToken() {}.type + val data: BackupData = Gson().fromJson(json, type) + + data.treatments.forEach { repo.insertTreatment(it) } + data.doseLogs.forEach { repo.insertDoseLog(it) } + data.labResults.forEach { repo.insertLabResult(it) } + + return ImportResult( + data.treatments.size, + data.doseLogs.size, + data.labResults.size + ) + } + + suspend fun writeBackup(context: Context, uri: Uri, json: String): Boolean { + return try { + context.contentResolver.openOutputStream(uri, "wt")?.use { os -> + os.write(json.toByteArray(Charsets.UTF_8)) + os.flush() + } ?: return false + true + } catch (e: Exception) { + false + } + } + + suspend fun readBackup(context: Context, uri: Uri): String? = try { + context.contentResolver.openInputStream(uri)?.use { it.readBytes().toString(Charsets.UTF_8) } + } catch (e: Exception) { + null + } +} diff --git a/app/src/main/java/com/hormonetrack/data/dao/DoseLogDao.kt b/app/src/main/java/com/hormonetrack/data/dao/DoseLogDao.kt new file mode 100644 index 0000000..003f8dc --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/dao/DoseLogDao.kt @@ -0,0 +1,35 @@ +package com.hormonetrack.data.dao + +import androidx.room.* +import com.hormonetrack.data.model.DoseLog +import kotlinx.coroutines.flow.Flow + +@Dao +interface DoseLogDao { + @Query("SELECT * FROM dose_logs ORDER BY timestamp DESC") + fun getAll(): Flow> + + @Query("SELECT * FROM dose_logs WHERE treatmentId = :treatmentId ORDER BY timestamp DESC") + fun getByTreatment(treatmentId: Long): Flow> + + @Query("SELECT * FROM dose_logs WHERE timestamp BETWEEN :start AND :end ORDER BY timestamp ASC") + fun getByTimeRange(start: Long, end: Long): Flow> + + @Query("SELECT * FROM dose_logs WHERE treatmentId = :treatmentId AND timestamp BETWEEN :start AND :end ORDER BY timestamp ASC") + fun getByTreatmentAndTimeRange(treatmentId: Long, start: Long, end: Long): Flow> + + @Query("SELECT * FROM dose_logs ORDER BY timestamp DESC LIMIT 1") + fun getLatest(): Flow + + @Query("SELECT * FROM dose_logs ORDER BY timestamp ASC") + suspend fun getAllOnce(): List + + @Insert + suspend fun insert(log: DoseLog): Long + + @Update + suspend fun update(log: DoseLog) + + @Delete + suspend fun delete(log: DoseLog) +} diff --git a/app/src/main/java/com/hormonetrack/data/dao/LabResultDao.kt b/app/src/main/java/com/hormonetrack/data/dao/LabResultDao.kt new file mode 100644 index 0000000..ed0341f --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/dao/LabResultDao.kt @@ -0,0 +1,29 @@ +package com.hormonetrack.data.dao + +import androidx.room.* +import com.hormonetrack.data.model.LabResult +import kotlinx.coroutines.flow.Flow + +@Dao +interface LabResultDao { + @Query("SELECT * FROM lab_results ORDER BY timestamp DESC") + fun getAll(): Flow> + + @Query("SELECT * FROM lab_results WHERE marker = :marker ORDER BY timestamp DESC") + fun getByMarker(marker: String): Flow> + + @Query("SELECT * FROM lab_results WHERE timestamp BETWEEN :start AND :end ORDER BY timestamp ASC") + fun getByTimeRange(start: Long, end: Long): Flow> + + @Query("SELECT * FROM lab_results ORDER BY timestamp ASC") + suspend fun getAllOnce(): List + + @Insert + suspend fun insert(result: LabResult): Long + + @Update + suspend fun update(result: LabResult) + + @Delete + suspend fun delete(result: LabResult) +} diff --git a/app/src/main/java/com/hormonetrack/data/dao/TreatmentDao.kt b/app/src/main/java/com/hormonetrack/data/dao/TreatmentDao.kt new file mode 100644 index 0000000..823a1fc --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/dao/TreatmentDao.kt @@ -0,0 +1,35 @@ +package com.hormonetrack.data.dao + +import androidx.room.* +import com.hormonetrack.data.model.Treatment +import kotlinx.coroutines.flow.Flow + +@Dao +interface TreatmentDao { + @Query("SELECT * FROM treatments WHERE isActive = 1 ORDER BY createdAt DESC") + fun getActiveTreatments(): Flow> + + @Query("SELECT * FROM treatments ORDER BY createdAt DESC") + fun getAllTreatments(): Flow> + + @Query("SELECT * FROM treatments WHERE id = :id") + suspend fun getById(id: Long): Treatment? + + @Query("SELECT * FROM treatments WHERE isActive = 1 ORDER BY createdAt DESC") + suspend fun getActiveOnce(): List + + @Query("SELECT * FROM treatments ORDER BY createdAt DESC") + suspend fun getAllOnce(): List + + @Insert + suspend fun insert(treatment: Treatment): Long + + @Update + suspend fun update(treatment: Treatment) + + @Delete + suspend fun delete(treatment: Treatment) + + @Query("UPDATE treatments SET isActive = :active WHERE id = :id") + suspend fun setActive(id: Long, active: Boolean) +} diff --git a/app/src/main/java/com/hormonetrack/data/model/DoseLog.kt b/app/src/main/java/com/hormonetrack/data/model/DoseLog.kt new file mode 100644 index 0000000..1ddab17 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/model/DoseLog.kt @@ -0,0 +1,29 @@ +package com.hormonetrack.data.model + +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.Index +import androidx.room.PrimaryKey + +@Entity( + tableName = "dose_logs", + foreignKeys = [ + ForeignKey( + entity = Treatment::class, + parentColumns = ["id"], + childColumns = ["treatmentId"], + onDelete = ForeignKey.CASCADE + ) + ], + indices = [Index("treatmentId"), Index("timestamp")] +) +data class DoseLog( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val treatmentId: Long, + val timestamp: Long = System.currentTimeMillis(), + val doseAmount: Double, + val notes: String? = null, + // Per-injection ester override (like the ODS where profiles switch esters over time); + // null = use the treatment's default ester + val esterType: String? = null +) diff --git a/app/src/main/java/com/hormonetrack/data/model/LabResult.kt b/app/src/main/java/com/hormonetrack/data/model/LabResult.kt new file mode 100644 index 0000000..dbeb963 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/model/LabResult.kt @@ -0,0 +1,14 @@ +package com.hormonetrack.data.model + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "lab_results") +data class LabResult( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val marker: String, + val value: Double, + val unit: String, + val timestamp: Long = System.currentTimeMillis(), + val notes: String? = null +) diff --git a/app/src/main/java/com/hormonetrack/data/model/PKPresets.kt b/app/src/main/java/com/hormonetrack/data/model/PKPresets.kt new file mode 100644 index 0000000..9f59841 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/model/PKPresets.kt @@ -0,0 +1,134 @@ +package com.hormonetrack.data.model + +import com.hormonetrack.R + +data class PKPreset( + val nameRes: Int, + val type: TreatmentType, + val route: AdministrationRoute, + val esterType: String, + val pkModel: String, + val absorptionHours: Float, + val eliminationHalfLifeHours: Float, + val bioavailabilityFraction: Float, + val defaultDoseUnit: String, + val defaultDoseAmount: Double +) + +object PKPresets { + + val all: List = listOf( + // --- Injections: Estrannaise models (profiles from the ODS) --- + PKPreset( + nameRes = R.string.preset_ev_ese, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + esterType = Esters.EV, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 46f, eliminationHalfLifeHours = 100f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 4.0 + ), + PKPreset( + nameRes = R.string.preset_eu_ese, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + esterType = Esters.EU, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 55f, eliminationHalfLifeHours = 400f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 10.0 + ), + PKPreset( + nameRes = R.string.preset_een_ese, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_SUBCUT, + esterType = Esters.EEN, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 152f, eliminationHalfLifeHours = 150f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 10.0 + ), + // --- Injections: Transfem Science models --- + PKPreset( + nameRes = R.string.preset_ev_tfs, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + esterType = Esters.EV, + pkModel = PKModels.TRANSFEM_SCIENCE, + absorptionHours = 51f, eliminationHalfLifeHours = 100f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 4.0 + ), + PKPreset( + nameRes = R.string.preset_eu_tfs, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + esterType = Esters.EU, + pkModel = PKModels.TRANSFEM_SCIENCE, + absorptionHours = 198f, eliminationHalfLifeHours = 400f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 10.0 + ), + PKPreset( + nameRes = R.string.preset_een_tfs, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_SUBCUT, + esterType = Esters.EEN, + pkModel = PKModels.TRANSFEM_SCIENCE, + absorptionHours = 156f, eliminationHalfLifeHours = 150f, bioavailabilityFraction = 1f, + defaultDoseUnit = "mg", defaultDoseAmount = 10.0 + ), + // --- Transdermal / oral (Bateman fallback) --- + PKPreset( + nameRes = R.string.preset_e2_gel, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.TRANSDERMAL_GEL, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 4f, eliminationHalfLifeHours = 24f, bioavailabilityFraction = 0.8f, + defaultDoseUnit = "mg", defaultDoseAmount = 2.0 + ), + PKPreset( + nameRes = R.string.preset_e2_patch, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.TRANSDERMAL_PATCH, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 8f, eliminationHalfLifeHours = 24f, bioavailabilityFraction = 0.9f, + defaultDoseUnit = "mg/day", defaultDoseAmount = 0.1 + ), + PKPreset( + nameRes = R.string.preset_e2_oral, + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.ORAL, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 1.5f, eliminationHalfLifeHours = 16f, bioavailabilityFraction = 0.4f, + defaultDoseUnit = "mg", defaultDoseAmount = 2.0 + ), + // --- Anti-androgens (Bateman) --- + PKPreset( + nameRes = R.string.preset_cpa, + type = TreatmentType.ANTI_ANDROGEN, + route = AdministrationRoute.ORAL, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 2f, eliminationHalfLifeHours = 30f, bioavailabilityFraction = 0.8f, + defaultDoseUnit = "mg", defaultDoseAmount = 10.0 + ), + PKPreset( + nameRes = R.string.preset_spiro, + type = TreatmentType.ANTI_ANDROGEN, + route = AdministrationRoute.ORAL, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 1.5f, eliminationHalfLifeHours = 8f, bioavailabilityFraction = 0.7f, + defaultDoseUnit = "mg", defaultDoseAmount = 100.0 + ), + PKPreset( + nameRes = R.string.preset_bica, + type = TreatmentType.ANTI_ANDROGEN, + route = AdministrationRoute.ORAL, + esterType = Esters.NONE, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 3f, eliminationHalfLifeHours = 168f, bioavailabilityFraction = 0.9f, + defaultDoseUnit = "mg", defaultDoseAmount = 50.0 + ) + ) +} diff --git a/app/src/main/java/com/hormonetrack/data/model/Treatment.kt b/app/src/main/java/com/hormonetrack/data/model/Treatment.kt new file mode 100644 index 0000000..8f1f3c1 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/model/Treatment.kt @@ -0,0 +1,69 @@ +package com.hormonetrack.data.model + +import androidx.room.Entity +import androidx.room.PrimaryKey + +object Esters { + const val NONE = "NONE" + const val EV = "EV" + const val EU = "EU" + const val EEN = "EEN" +} + +object PKModels { + const val ESTRANNAISE = "ESE" + const val TRANSFEM_SCIENCE = "TFS" +} + +enum class TreatmentType { + ESTRADIOL, + ANTI_ANDROGEN, + PROGESTOGEN, + OTHER +} + +enum class AdministrationRoute { + ORAL, + TRANSDERMAL_GEL, + TRANSDERMAL_PATCH, + INJECTION_IM, + INJECTION_SUBCUT, + OTHER +} + +@Entity(tableName = "treatments") +data class Treatment( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val name: String, + val type: TreatmentType, + val route: AdministrationRoute, + val doseAmount: Double, + val doseUnit: String, + val isActive: Boolean = true, + val notes: String? = null, + + // PK: lookup-table model for injections (EV/EU/EEn from Estrannaise / Transfem Science) + val esterType: String = Esters.NONE, + val pkModel: String = PKModels.ESTRANNAISE, + + // PK: Bateman fallback for gel/patch/oral + val absorptionHours: Float = 4f, + val eliminationHalfLifeHours: Float = 24f, + val bioavailabilityFraction: Float = 1.0f, + + // Calibration: ratio lab_value / model_prediction (like the ODS "Scale factor") + val scaleFactor: Double = 1.0, + + // Reminder + val reminderHour: Int? = null, + val reminderMinute: Int? = null, + val reminderEnabled: Boolean = false, + + val createdAt: Long = System.currentTimeMillis() +) { + val isInjection: Boolean + get() = route == AdministrationRoute.INJECTION_IM || route == AdministrationRoute.INJECTION_SUBCUT + + val usesProfileModel: Boolean + get() = isInjection && esterType != Esters.NONE +} diff --git a/app/src/main/java/com/hormonetrack/data/repository/HormoneRepository.kt b/app/src/main/java/com/hormonetrack/data/repository/HormoneRepository.kt new file mode 100644 index 0000000..f789651 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/data/repository/HormoneRepository.kt @@ -0,0 +1,47 @@ +package com.hormonetrack.data.repository + +import com.hormonetrack.data.dao.DoseLogDao +import com.hormonetrack.data.dao.LabResultDao +import com.hormonetrack.data.dao.TreatmentDao +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.Treatment +import kotlinx.coroutines.flow.Flow + +class HormoneRepository( + private val treatmentDao: TreatmentDao, + private val doseLogDao: DoseLogDao, + private val labResultDao: LabResultDao +) { + val activeTreatments: Flow> = treatmentDao.getActiveTreatments() + val allTreatments: Flow> = treatmentDao.getAllTreatments() + val allDoseLogs: Flow> = doseLogDao.getAll() + val allLabResults: Flow> = labResultDao.getAll() + + fun getDosesByTimeRange(start: Long, end: Long): Flow> = + doseLogDao.getByTimeRange(start, end) + + fun getDosesByTreatmentAndTimeRange(treatmentId: Long, start: Long, end: Long): Flow> = + doseLogDao.getByTreatmentAndTimeRange(treatmentId, start, end) + + fun getLabsByMarker(marker: String): Flow> = + labResultDao.getByMarker(marker) + + suspend fun getTreatmentById(id: Long): Treatment? = treatmentDao.getById(id) + + suspend fun allTreatmentsOnce(): List = treatmentDao.getAllOnce() + suspend fun allDoseLogsOnce(): List = doseLogDao.getAllOnce() + suspend fun allLabResultsOnce(): List = labResultDao.getAllOnce() + + suspend fun insertTreatment(treatment: Treatment): Long = treatmentDao.insert(treatment) + suspend fun updateTreatment(treatment: Treatment) = treatmentDao.update(treatment) + suspend fun deleteTreatment(treatment: Treatment) = treatmentDao.delete(treatment) + + suspend fun insertDoseLog(log: DoseLog): Long = doseLogDao.insert(log) + suspend fun updateDoseLog(log: DoseLog) = doseLogDao.update(log) + suspend fun deleteDoseLog(log: DoseLog) = doseLogDao.delete(log) + + suspend fun insertLabResult(result: LabResult): Long = labResultDao.insert(result) + suspend fun updateLabResult(result: LabResult) = labResultDao.update(result) + suspend fun deleteLabResult(result: LabResult) = labResultDao.delete(result) +} diff --git a/app/src/main/java/com/hormonetrack/pk/PKProfileStore.kt b/app/src/main/java/com/hormonetrack/pk/PKProfileStore.kt new file mode 100644 index 0000000..a80967c --- /dev/null +++ b/app/src/main/java/com/hormonetrack/pk/PKProfileStore.kt @@ -0,0 +1,106 @@ +package com.hormonetrack.pk + +import android.content.Context +import com.google.gson.JsonParser + +object PKProfileStore { + + @Volatile + private var initialized = false + + private lateinit var profiles: Map + + fun init(context: Context) { + if (initialized) return + synchronized(this) { + if (initialized) return + val json = context.assets.open("pk_profiles.json").bufferedReader().use { it.readText() } + initWithJson(json) + } + } + + /** Testable entry point: parse the profiles JSON directly (JVM unit tests). */ + fun initWithJson(json: String) { + synchronized(this) { + val root = JsonParser.parseString(json).asJsonObject + val profilesObj = root.getAsJsonObject("profiles") + val parsed = LinkedHashMap() + for ((key, value) in profilesObj.entrySet()) { + val arr = value.asJsonArray + val floats = FloatArray(arr.size()) { i -> arr[i].asFloat } + parsed[key] = floats + } + profiles = parsed + initialized = true + } + } + + fun profileKey(ester: String, model: String): String = + "${ester}_${if (model == com.hormonetrack.data.model.PKModels.TRANSFEM_SCIENCE) "tfs" else "ese"}" + + /** + * Case-insensitive lookup. The ODS asset keys use the biological casing + * ("EV_ese", "EU_ese", "EEn_ese", …) while the app constants are uppercase + * (Esters.EEN = "EEN") — an exact-match lookup silently returned null for EEn + * and flattened every EEn curve to zero (bug fixed 2026-09-05). + */ + private fun lookup(key: String): FloatArray? { + if (!initialized) return null + return profiles[key] + ?: profiles.entries.firstOrNull { it.key.equals(key, ignoreCase = true) }?.value + } + + fun hasProfile(ester: String, model: String): Boolean = + lookup(profileKey(ester, model)) != null + + fun profileLength(ester: String, model: String): Int = + lookup(profileKey(ester, model))?.size ?: 0 + + /** + * Normalized response (pg/mL per mg injected) at dtHours after a 1 mg injection, + * linearly interpolated between hourly points; beyond the table, extrapolated + * with the terminal exponential slope. + */ + fun sample(ester: String, model: String, dtHours: Double): Double { + if (!initialized || dtHours <= 0.0) return 0.0 + val suffix = when (model) { + com.hormonetrack.data.model.PKModels.TRANSFEM_SCIENCE -> "tfs" + com.hormonetrack.data.model.PKModels.ESTRANNAISE -> "ese" + else -> return 0.0 + } + val arr = lookup("${ester}_$suffix") ?: return 0.0 + if (arr.size < 2) return 0.0 + + val lastIdx = arr.size - 1 + if (dtHours >= lastIdx) { + // The ODS tables are rounded to 2 decimals and collapse into a 0.01 / 0.00 + // display floor long before the true value vanishes. Extrapolate from the + // last point still >= 1% of the peak, using the average hourly decay of + // the previous 48 h (never sampling before the peak). + var peakIdx = 0 + var peakV = 0f + for (idx in arr.indices) { + if (arr[idx] > peakV) { + peakV = arr[idx] + peakIdx = idx + } + } + if (peakV <= 0f) return 0.0 + var j = lastIdx + while (j > 0 && arr[j] < peakV * 0.01f) j-- + if (j <= 0) return 0.0 + val window = 48 + val j0 = maxOf(peakIdx, j - window) + val rate = if (j > j0) { + kotlin.math.ln(arr[j].toDouble() / arr[j0].toDouble().coerceAtLeast(1e-12)) / (j - j0) + } else 0.0 + return arr[j].toDouble() * kotlin.math.exp(rate * (dtHours - j)) + } + + val i = dtHours.toInt().coerceIn(0, lastIdx - 1) + val frac = dtHours - i + val base = arr[i].toDouble() + val delta = (arr[i + 1] - arr[i]).toDouble() + return base + delta * frac + } +} diff --git a/app/src/main/java/com/hormonetrack/pk/PharmacokineticEngine.kt b/app/src/main/java/com/hormonetrack/pk/PharmacokineticEngine.kt new file mode 100644 index 0000000..cd8a59d --- /dev/null +++ b/app/src/main/java/com/hormonetrack/pk/PharmacokineticEngine.kt @@ -0,0 +1,296 @@ +package com.hormonetrack.pk + +import com.hormonetrack.data.model.AdministrationRoute +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.Esters +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.data.model.TreatmentType +import kotlin.math.abs +import kotlin.math.exp +import kotlin.math.ln +import kotlin.math.max + +data class LevelPoint( + val timestamp: Long, + val e2: Double, + val t: Double +) + +data class TConfig( + val base: Double = 6.0, + val floor: Double = 0.2, + val k: Double = 0.19 +) + +object PharmacokineticEngine { + + const val HOUR_MS = 3_600_000L + + // ------------------------------------------------------------------ + // Single dose contribution (pg/mL), either from the ODS lookup tables + // (Estrannaise / Transfem Science profiles for EV/EU/EEn injections) or + // from a Bateman model for gel/patch/oral routes. + // ------------------------------------------------------------------ + + data class BatemanParams(val ke: Double, val ka: Double) + + fun computeKa(tHalfHours: Double, tMaxHours: Double): Double { + if (tMaxHours <= 0 || tHalfHours <= 0) return 1.0 + val ke = ln(2.0) / tHalfHours + if (tMaxHours < 0.01) return ke * 100.0 + var lo = ke * 1.001 + var hi = ke * 1000.0 + repeat(50) { + val mid = (lo + hi) / 2.0 + // eq(mid) decreases in mid and crosses 0 at the sought ka > ke: + // eq > 0 means the root lies above mid. + val eq = ln(mid / ke) - (mid - ke) * tMaxHours + if (eq > 0) lo = mid else hi = mid + } + return (lo + hi) / 2.0 + } + + fun batemanParams(treatment: Treatment): BatemanParams { + val ke = ln(2.0) / max(treatment.eliminationHalfLifeHours, 0.01f).toDouble() + val ka = computeKa( + max(treatment.eliminationHalfLifeHours, 0.01f).toDouble(), + max(treatment.absorptionHours, 0.01f).toDouble() + ) + return BatemanParams(ke, ka) + } + + fun doseEster(treatment: Treatment, dose: DoseLog): String = + dose.esterType ?: treatment.esterType + + fun concentrationOfDose( + treatment: Treatment, + dose: DoseLog, + queryTimeMs: Long, + bateman: BatemanParams? = null + ): Double { + val dtH = (queryTimeMs - dose.timestamp) / 3_600_000.0 + if (dtH <= 0.0) return 0.0 + + val mg = dose.doseAmount + if (mg <= 0.0) return 0.0 + + if (treatment.usesProfileModel) { + val ester = doseEster(treatment, dose) + if (ester != Esters.NONE) { + return PKProfileStore.sample(ester, treatment.pkModel, dtH) * mg + } + } + + // Bateman fallback (gel / patch / oral / custom) + val p = bateman ?: batemanParams(treatment) + val diff = p.ka - p.ke + val a = mg * treatment.bioavailabilityFraction.toDouble() + val c = if (abs(diff) < 1e-3) { + a * p.ke * dtH * exp(-p.ke * dtH) + } else { + (a * p.ka / diff) * (exp(-p.ke * dtH) - exp(-p.ka * dtH)) + } + return max(0.0, c) + } + + private fun cutoffHours(treatment: Treatment): Double { + val profileH = if (treatment.usesProfileModel) { + PKProfileStore.profileLength(treatment.esterType, treatment.pkModel).toDouble() + } else 0.0 + val batemanH = if (treatment.usesProfileModel) 0.0 + else 30.0 * treatment.eliminationHalfLifeHours.toDouble() + return max(profileH, batemanH).coerceAtLeast(24.0) + } + + // ------------------------------------------------------------------ + // Aggregated levels + // ------------------------------------------------------------------ + + fun e2At(treatments: List, doseLogs: List, tMs: Long): Double { + val batemanCache = HashMap() + var total = 0.0 + for (treatment in treatments) { + if (treatment.type != TreatmentType.ESTRADIOL) continue + if (!batemanCache.containsKey(treatment.id)) { + batemanCache[treatment.id] = batemanParams(treatment) + } + for (dose in doseLogs) { + if (dose.treatmentId != treatment.id || dose.timestamp > tMs) continue + val dtH = (tMs - dose.timestamp) / 3_600_000.0 + if (dtH > cutoffHours(treatment)) continue + val c = concentrationOfDose( + treatment, dose, tMs, batemanCache[treatment.id] + ) + if (c > 0.0) total += c * treatment.scaleFactor + } + } + return total + } + + fun testosteroneAt(e2Level: Double, config: TConfig): Double { + if (e2Level <= 0.0) return config.base + return config.floor + (config.base - config.floor) / (1.0 + config.k * e2Level) + } + + /** + * The T model works in ng/mL. Users enter labs in ng/mL, ng/dL, ng/L or nmol/L — + * normalize before display or calibration (45 ng/dL = 0.45 ng/mL). + */ + fun convertTToNgMl(value: Double, unit: String): Double { + val u = unit.lowercase().replace(" ", "") + return when { + u.contains("dl") -> value / 100.0 + u.contains("nmol") -> value * 0.2884 + u.contains("ng/l") || u.endsWith("/l") -> value / 1000.0 + else -> value + } + } + + fun levelAt( + treatments: List, + doseLogs: List, + tMs: Long, + tConfig: TConfig + ): LevelPoint { + val e2 = e2At(treatments, doseLogs, tMs) + return LevelPoint(tMs, e2, testosteroneAt(e2, tConfig)) + } + + fun currentLevel( + treatments: List, + doseLogs: List, + tConfig: TConfig, + nowMs: Long = System.currentTimeMillis() + ): LevelPoint = levelAt(treatments, doseLogs, nowMs, tConfig) + + fun computeCurve( + treatments: List, + doseLogs: List, + startMs: Long, + endMs: Long, + stepMs: Long = HOUR_MS, + tConfig: TConfig + ): List { + if (treatments.isEmpty() || doseLogs.isEmpty() || endMs <= startMs) return emptyList() + + val relevantTreatments = treatments.filter { tr -> + tr.type == TreatmentType.ESTRADIOL && doseLogs.any { it.treatmentId == tr.id } + } + if (relevantTreatments.isEmpty()) return emptyList() + + val earliestDose = doseLogs.minOf { it.timestamp } + val searchStart = maxOf(startMs, earliestDose) + + val batemanCache = HashMap() + relevantTreatments.forEach { batemanCache[it.id] = batemanParams(it) } + + val points = mutableListOf() + var t = searchStart + while (t <= endMs) { + var e2 = 0.0 + for (treatment in relevantTreatments) { + val cutoff = cutoffHours(treatment) + val p = batemanCache[treatment.id] + for (dose in doseLogs) { + if (dose.treatmentId != treatment.id || dose.timestamp > t) continue + val dtH = (t - dose.timestamp) / 3_600_000.0 + if (dtH > cutoff) continue + val c = concentrationOfDose(treatment, dose, t, p) + if (c > 0.0) e2 += c * treatment.scaleFactor + } + } + points.add(LevelPoint(t, e2, testosteroneAt(e2, tConfig))) + t += stepMs + } + return points + } + + // ------------------------------------------------------------------ + // Calibration from lab results + // ------------------------------------------------------------------ + + fun computeScaleFactor( + treatment: Treatment, + allDoseLogs: List, + e2Labs: List + ): Double? { + if (treatment.type != TreatmentType.ESTRADIOL) return null + val myDoses = allDoseLogs.filter { it.treatmentId == treatment.id } + if (myDoses.isEmpty()) return null + + val p = batemanParams(treatment) + val ratios = mutableListOf() + for (lab in e2Labs) { + var predicted = 0.0 + for (dose in myDoses) { + if (dose.timestamp > lab.timestamp) continue + val dtH = (lab.timestamp - dose.timestamp) / 3_600_000.0 + if (dtH > cutoffHours(treatment)) continue + predicted += concentrationOfDose(treatment, dose, lab.timestamp, p) + } + if (predicted > 0.5) { + ratios.add(lab.value / predicted) + } + } + if (ratios.isEmpty()) return null + ratios.sort() + val median = if (ratios.size % 2 == 1) { + ratios[ratios.size / 2] + } else { + (ratios[ratios.size / 2 - 1] + ratios[ratios.size / 2]) / 2.0 + } + return (median * 100).toInt() / 100.0 + } + + fun computeTConfigCalibration( + tLabs: List, + treatments: List, + doseLogs: List, + current: TConfig + ): TConfig? { + val usable = tLabs + .filter { it.value > current.floor + 0.02 } + .map { it.copy(value = convertTToNgMl(it.value, it.unit)) } + .filter { it.value > current.floor + 0.02 } + if (usable.isEmpty()) return null + + val ks = mutableListOf() + for (lab in usable) { + val e2 = e2At(treatments, doseLogs, lab.timestamp) + if (e2 <= 1.0) continue + val k = ((current.base - current.floor) / (lab.value - current.floor) - 1.0) / e2 + if (k > 1e-4 && k < 10.0) ks.add(k) + } + if (ks.isEmpty()) return null + ks.sort() + val median = if (ks.size % 2 == 1) { + ks[ks.size / 2] + } else { + (ks[ks.size / 2 - 1] + ks[ks.size / 2]) / 2.0 + } + return current.copy(k = (median * 1000).toInt() / 1000.0) + } + + fun nextReminderFireMs(treatments: List, nowMs: Long = System.currentTimeMillis()): Long? { + var next: Long? = null + val cal = java.util.Calendar.getInstance() + for (tr in treatments) { + if (!tr.reminderEnabled) continue + val h = tr.reminderHour ?: continue + val m = tr.reminderMinute ?: continue + cal.timeInMillis = nowMs + cal.set(java.util.Calendar.HOUR_OF_DAY, h) + cal.set(java.util.Calendar.MINUTE, m) + cal.set(java.util.Calendar.SECOND, 0) + cal.set(java.util.Calendar.MILLISECOND, 0) + if (cal.timeInMillis <= nowMs) cal.add(java.util.Calendar.DAY_OF_MONTH, 1) + val fire = cal.timeInMillis + if (next == null || fire < next) next = fire + } + return next + } + + fun isInjectionRoute(route: AdministrationRoute): Boolean = + route == AdministrationRoute.INJECTION_IM || route == AdministrationRoute.INJECTION_SUBCUT +} diff --git a/app/src/main/java/com/hormonetrack/reminder/DoseActionReceiver.kt b/app/src/main/java/com/hormonetrack/reminder/DoseActionReceiver.kt new file mode 100644 index 0000000..f17ee09 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/reminder/DoseActionReceiver.kt @@ -0,0 +1,46 @@ +package com.hormonetrack.reminder + +import android.app.NotificationManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.hormonetrack.data.AppDatabase +import com.hormonetrack.data.model.DoseLog +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch + +class DoseActionReceiver : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + val treatmentId = intent.getLongExtra(ReminderContract.EXTRA_TREATMENT_ID, -1L) + if (treatmentId <= 0) return + + val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + nm.cancel(treatmentId.toInt()) + + when (intent.action) { + ReminderContract.ACTION_LOG_DOSE -> { + val name = intent.getStringExtra(ReminderContract.EXTRA_TREATMENT_NAME) ?: "" + val dose = intent.getDoubleExtra(ReminderContract.EXTRA_DOSE_AMOUNT, 0.0) + val pending = goAsync() + CoroutineScope(SupervisorJob() + Dispatchers.IO).launch { + try { + val db = AppDatabase.getInstance(context) + val treatment = db.treatmentDao().getById(treatmentId) ?: return@launch + val amount = if (dose > 0.0) dose else treatment.doseAmount + db.doseLogDao().insert(DoseLog(treatmentId = treatmentId, doseAmount = amount)) + } finally { + pending.finish() + } + } + } + ReminderContract.ACTION_SNOOZE -> { + val name = intent.getStringExtra(ReminderContract.EXTRA_TREATMENT_NAME) ?: "" + val dose = intent.getDoubleExtra(ReminderContract.EXTRA_DOSE_AMOUNT, 0.0) + AlarmScheduler(context).scheduleSnooze(treatmentId, name, dose) + } + } + } +} diff --git a/app/src/main/java/com/hormonetrack/reminder/ReminderManager.kt b/app/src/main/java/com/hormonetrack/reminder/ReminderManager.kt new file mode 100644 index 0000000..f0d194c --- /dev/null +++ b/app/src/main/java/com/hormonetrack/reminder/ReminderManager.kt @@ -0,0 +1,222 @@ +package com.hormonetrack.reminder + +import android.app.AlarmManager +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.os.Build +import androidx.core.app.NotificationCompat +import com.hormonetrack.MainActivity +import com.hormonetrack.R +import com.hormonetrack.data.AppDatabase +import com.hormonetrack.data.model.Treatment +import java.util.Calendar + +object ReminderContract { + const val CHANNEL_ID = "hormonetrack_reminders" + const val ACTION_REMINDER = "com.hormonetrack.ACTION_REMINDER" + const val ACTION_LOG_DOSE = "com.hormonetrack.ACTION_LOG_DOSE" + const val ACTION_SNOOZE = "com.hormonetrack.ACTION_SNOOZE" + const val EXTRA_TREATMENT_ID = "treatment_id" + const val EXTRA_TREATMENT_NAME = "treatment_name" + const val EXTRA_DOSE_AMOUNT = "dose_amount" + + fun reminderIntent(context: Context, treatmentId: Long): Intent = + Intent(context, ReminderReceiver::class.java).apply { + action = ACTION_REMINDER + putExtra(EXTRA_TREATMENT_ID, treatmentId) + } +} + +fun createNotificationChannel(context: Context) { + val channel = NotificationChannel( + ReminderContract.CHANNEL_ID, + context.getString(R.string.notification_channel_name), + NotificationManager.IMPORTANCE_HIGH + ).apply { + description = context.getString(R.string.notification_channel_desc) + } + val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + manager.createNotificationChannel(channel) +} + +class AlarmScheduler(private val context: Context) { + + private val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager + + private fun pendingBroadcast(treatmentId: Long, name: String?, dose: Double?): PendingIntent { + val intent = ReminderContract.reminderIntent(context, treatmentId) + name?.let { intent.putExtra(ReminderContract.EXTRA_TREATMENT_NAME, it) } + dose?.let { intent.putExtra(ReminderContract.EXTRA_DOSE_AMOUNT, it) } + return PendingIntent.getBroadcast( + context, + treatmentId.toInt(), + intent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + } + + private fun nextOccurrence(hour: Int, minute: Int): Long { + val cal = Calendar.getInstance().apply { + set(Calendar.HOUR_OF_DAY, hour) + set(Calendar.MINUTE, minute) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + } + if (cal.timeInMillis <= System.currentTimeMillis()) { + cal.add(Calendar.DAY_OF_MONTH, 1) + } + return cal.timeInMillis + } + + fun canScheduleExact(): Boolean = + Build.VERSION.SDK_INT < Build.VERSION_CODES.S || alarmManager.canScheduleExactAlarms() + + fun scheduleDaily(treatment: Treatment): Boolean { + val hour = treatment.reminderHour ?: return false + val minute = treatment.reminderMinute ?: return false + val triggerAt = nextOccurrence(hour, minute) + val pi = pendingBroadcast(treatment.id, treatment.name, treatment.doseAmount) + return scheduleAt(triggerAt, pi) + } + + fun scheduleSnooze(treatmentId: Long, name: String, dose: Double, delayMs: Long = 60 * 60_000L): Boolean { + val pi = pendingBroadcast(treatmentId, name, dose) + return scheduleAt(System.currentTimeMillis() + delayMs, pi) + } + + private fun scheduleAt(triggerAt: Long, pi: PendingIntent): Boolean { + val canExact = canScheduleExact() + if (canExact) { + alarmManager.setExactAndAllowWhileIdle( + AlarmManager.RTC_WAKEUP, triggerAt, pi + ) + } else { + alarmManager.setWindow( + AlarmManager.RTC_WAKEUP, triggerAt, 10 * 60_000L, pi + ) + } + return canExact + } + + fun cancel(treatmentId: Long) { + val pi = PendingIntent.getBroadcast( + context, + treatmentId.toInt(), + ReminderContract.reminderIntent(context, treatmentId), + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + alarmManager.cancel(pi) + } + + fun rescheduleAll(treatments: List) { + treatments.forEach { tr -> + if (tr.reminderEnabled) { + scheduleDaily(tr) + } else { + cancel(tr.id) + } + } + } +} + +class ReminderReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action != ReminderContract.ACTION_REMINDER) return + createNotificationChannel(context) + + val treatmentId = intent.getLongExtra(ReminderContract.EXTRA_TREATMENT_ID, -1L) + if (treatmentId <= 0) return + val name = intent.getStringExtra(ReminderContract.EXTRA_TREATMENT_NAME) ?: "" + val dose = if (intent.hasExtra(ReminderContract.EXTRA_DOSE_AMOUNT)) { + intent.getDoubleExtra(ReminderContract.EXTRA_DOSE_AMOUNT, 0.0) + } else null + + // Open the app on the Home screen + val openIntent = Intent(context, MainActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + putExtra("open_log_dose", true) + putExtra(ReminderContract.EXTRA_TREATMENT_ID, treatmentId) + } + val openPi = PendingIntent.getActivity( + context, + (treatmentId * 10 + 0).toInt(), + openIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + + // Action: log the dose immediately + val logIntent = Intent(context, DoseActionReceiver::class.java).apply { + action = ReminderContract.ACTION_LOG_DOSE + putExtra(ReminderContract.EXTRA_TREATMENT_ID, treatmentId) + putExtra(ReminderContract.EXTRA_TREATMENT_NAME, name) + putExtra(ReminderContract.EXTRA_DOSE_AMOUNT, dose) + } + val logPi = PendingIntent.getBroadcast( + context, + (treatmentId * 10 + 1).toInt(), + logIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + + // Action: snooze 1 hour + val snoozeIntent = Intent(context, DoseActionReceiver::class.java).apply { + action = ReminderContract.ACTION_SNOOZE + putExtra(ReminderContract.EXTRA_TREATMENT_ID, treatmentId) + putExtra(ReminderContract.EXTRA_TREATMENT_NAME, name) + putExtra(ReminderContract.EXTRA_DOSE_AMOUNT, dose) + } + val snoozePi = PendingIntent.getBroadcast( + context, + (treatmentId * 10 + 2).toInt(), + snoozeIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + + val title = if (name.isNotBlank()) { + context.getString(R.string.reminder_title, name) + } else { + context.getString(R.string.reminder_title_plain) + } + val text = if (dose != null && dose > 0.0) { + context.getString(R.string.reminder_text_with_dose, dose) + } else { + context.getString(R.string.reminder_text) + } + + val notification = NotificationCompat.Builder(context, ReminderContract.CHANNEL_ID) + .setSmallIcon(R.drawable.ic_notification) + .setContentTitle(title) + .setContentText(text) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setCategory(NotificationCompat.CATEGORY_REMINDER) + .setContentIntent(openPi) + .addAction(0, context.getString(R.string.action_taken), logPi) + .addAction(0, context.getString(R.string.action_snooze_1h), snoozePi) + .setAutoCancel(true) + .build() + + val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + manager.notify(treatmentId.toInt(), notification) + } +} + +class BootReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action != Intent.ACTION_BOOT_COMPLETED) return + val result = goAsync() + Thread { + try { + val treatments = kotlinx.coroutines.runBlocking { + AppDatabase.getInstance(context).treatmentDao().getActiveOnce() + } + AlarmScheduler(context).rescheduleAll(treatments) + } finally { + result.finish() + } + }.start() + } +} diff --git a/app/src/main/java/com/hormonetrack/settings/AppSettings.kt b/app/src/main/java/com/hormonetrack/settings/AppSettings.kt new file mode 100644 index 0000000..cc555fb --- /dev/null +++ b/app/src/main/java/com/hormonetrack/settings/AppSettings.kt @@ -0,0 +1,50 @@ +package com.hormonetrack.settings + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.doublePreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import com.hormonetrack.pk.TConfig +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map + +val Context.dataStore: DataStore by preferencesDataStore(name = "settings") + +class AppSettings(private val context: Context) { + + private object Keys { + val T_BASE = doublePreferencesKey("t_base") + val T_FLOOR = doublePreferencesKey("t_floor") + val T_K = doublePreferencesKey("t_k") + val LANGUAGE = stringPreferencesKey("language") + } + + val tConfig: Flow = context.dataStore.data.map { prefs -> + TConfig( + base = prefs[Keys.T_BASE] ?: 6.0, + floor = prefs[Keys.T_FLOOR] ?: 0.2, + k = prefs[Keys.T_K] ?: 0.19 + ) + } + + val language: Flow = context.dataStore.data.map { prefs -> + prefs[Keys.LANGUAGE] ?: "system" + } + + suspend fun setTConfig(config: TConfig) { + context.dataStore.edit { prefs -> + prefs[Keys.T_BASE] = config.base + prefs[Keys.T_FLOOR] = config.floor + prefs[Keys.T_K] = config.k + } + } + + suspend fun setLanguage(code: String) { + context.dataStore.edit { prefs -> + prefs[Keys.LANGUAGE] = code + } + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/HormoneTrackRoot.kt b/app/src/main/java/com/hormonetrack/ui/HormoneTrackRoot.kt new file mode 100644 index 0000000..8abf87e --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/HormoneTrackRoot.kt @@ -0,0 +1,115 @@ +package com.hormonetrack.ui + +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Home +import androidx.compose.material.icons.filled.Medication +import androidx.compose.material.icons.filled.Science +import androidx.compose.material.icons.filled.ShowChart +import androidx.compose.material.icons.filled.Tune +import androidx.compose.material3.Icon +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import com.hormonetrack.AppContainer +import com.hormonetrack.R +import com.hormonetrack.ui.screens.ChartScreen +import com.hormonetrack.ui.screens.DosesScreen +import com.hormonetrack.ui.screens.HomeScreen +import com.hormonetrack.ui.screens.LabsScreen +import com.hormonetrack.ui.screens.SettingsScreen +import com.hormonetrack.ui.screens.TreatmentEditorScreen +import com.hormonetrack.ui.screens.TreatmentsScreen + +val LocalAppContainer = compositionLocalOf { + error("AppContainer not provided") +} + +private data class TabItem(val route: String, val labelRes: Int, val icon: androidx.compose.ui.graphics.vector.ImageVector) + +@Composable +fun HormoneTrackRoot(initialOpenLogDose: Boolean, initialTreatmentId: Long) { + val app = androidx.compose.ui.platform.LocalContext.current.applicationContext as com.hormonetrack.HormoneTrackApp + CompositionLocalProvider(LocalAppContainer provides app.container) { + val navController = rememberNavController() + val tabs = listOf( + TabItem("home", R.string.nav_home, Icons.Filled.Home), + TabItem("chart", R.string.nav_chart, Icons.Filled.ShowChart), + TabItem("doses", R.string.nav_doses, Icons.Filled.Medication), + TabItem("labs", R.string.nav_labs, Icons.Filled.Science), + TabItem("treatments", R.string.nav_treatments, Icons.Filled.Tune) + ) + val backStack by navController.currentBackStackEntryAsState() + val currentRoute = backStack?.destination?.route + + Scaffold( + bottomBar = { + if (currentRoute in tabs.map { it.route }) { + NavigationBar { + tabs.forEach { tab -> + NavigationBarItem( + selected = currentRoute == tab.route, + onClick = { + navController.navigate(tab.route) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + }, + icon = { Icon(tab.icon, contentDescription = stringResource(tab.labelRes)) }, + label = { Text(stringResource(tab.labelRes)) } + ) + } + } + } + } + ) { padding -> + NavHost( + navController = navController, + startDestination = "home", + modifier = Modifier.padding(padding) + ) { + composable("home") { + HomeScreen( + openLogDoseForTreatmentId = if (initialOpenLogDose) initialTreatmentId else null, + onOpenSettings = { navController.navigate("settings") }, + onOpenTreatment = { id -> navController.navigate("treatment_edit/$id") } + ) + } + composable("chart") { ChartScreen() } + composable("doses") { DosesScreen() } + composable("labs") { LabsScreen() } + composable("treatments") { + TreatmentsScreen( + onEdit = { id -> navController.navigate("treatment_edit/$id") }, + onNew = { navController.navigate("treatment_edit/-1") } + ) + } + composable("settings") { + SettingsScreen(onBack = { navController.popBackStack() }) + } + composable("treatment_edit/{id}") { entry -> + val id = entry.arguments?.getString("id")?.toLongOrNull() ?: -1L + TreatmentEditorScreen( + treatmentId = id, + onDone = { navController.popBackStack() } + ) + } + } + } + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/components/CurveChart.kt b/app/src/main/java/com/hormonetrack/ui/components/CurveChart.kt new file mode 100644 index 0000000..fa27cb6 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/components/CurveChart.kt @@ -0,0 +1,231 @@ +package com.hormonetrack.ui.components + +import androidx.compose.foundation.Canvas +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.PathEffect +import androidx.compose.ui.graphics.drawscope.DrawScope +import androidx.compose.ui.graphics.drawscope.Stroke +import androidx.compose.ui.graphics.nativeCanvas +import androidx.compose.ui.unit.dp +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.pk.LevelPoint +import com.hormonetrack.ui.theme.ChartE2 +import com.hormonetrack.ui.theme.ChartT +import com.hormonetrack.ui.theme.LabDot +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import kotlin.math.ceil + +data class ChartOptions( + val showT: Boolean = true, + val showLabs: Boolean = true, + val nowMs: Long = System.currentTimeMillis() +) + +fun niceCeil(value: Double): Double { + if (value <= 0) return 100.0 + val exp = Math.pow(10.0, Math.floor(Math.log10(value))) + val f = value / exp + val nice = when { + f <= 1 -> 1.0 + f <= 2 -> 2.0 + f <= 2.5 -> 2.5 + f <= 5 -> 5.0 + else -> 10.0 + } + return nice * exp +} + +@Composable +fun CurveChart( + points: List, + e2Labs: List, + tLabs: List, + options: ChartOptions, + modifier: Modifier +) { + val gridColor = MaterialTheme.colorScheme.outlineVariant + val labelColor = MaterialTheme.colorScheme.onSurfaceVariant + val nowLineColor = MaterialTheme.colorScheme.tertiary + + Canvas(modifier = modifier) { + if (points.size < 2) return@Canvas + val padLeft = 42.dp.toPx() + val padRight = 42.dp.toPx() + val padTop = 12.dp.toPx() + val padBottom = 26.dp.toPx() + + val w = size.width - padLeft - padRight + val h = size.height - padTop - padBottom + if (w <= 0 || h <= 0) return@Canvas + + val t0 = points.first().timestamp + val t1 = points.last().timestamp + if (t1 <= t0) return@Canvas + + val e2DataMax = maxOf( + points.maxOf { it.e2 }, + if (options.showLabs) e2Labs.maxOfOrNull { it.value } ?: 0.0 else 0.0 + ) + val e2Max = niceCeil(maxOf(e2DataMax, 50.0)) + val tDataMax = maxOf( + points.maxOf { it.t }, + if (options.showLabs) { + tLabs.maxOfOrNull { com.hormonetrack.pk.PharmacokineticEngine.convertTToNgMl(it.value, it.unit) } ?: 0.0 + } else 0.0 + ) + val tMax = niceCeil(tDataMax * 1.1) + + fun xOf(ms: Long): Float = padLeft + w * ((ms - t0).toFloat() / (t1 - t0).toFloat()) + fun yE2(v: Double): Float = padTop + h * (1f - (v / e2Max).toFloat()) + fun yT(v: Double): Float = padTop + h * (1f - (v / tMax).toFloat()) + + drawGrid(gridColor, padLeft, padTop, w, h, rows = 4) + drawLeftYLabels(labelColor, e2Max, padLeft, padTop, h) + if (options.showT) drawRightYLabels(labelColor, tMax, padLeft + w, padTop, h) + drawXLabels(labelColor, t0, t1, padLeft, padTop + h, w) + + val path = Path() + points.forEachIndexed { i, p -> + val x = xOf(p.timestamp) + val y = yE2(p.e2) + if (i == 0) path.moveTo(x, y) else path.lineTo(x, y) + } + drawPath(path, ChartE2, style = Stroke(width = 2.5.dp.toPx())) + + if (options.showT) { + val tPath = Path() + points.forEachIndexed { i, p -> + val x = xOf(p.timestamp) + val y = yT(p.t) + if (i == 0) tPath.moveTo(x, y) else tPath.lineTo(x, y) + } + drawPath( + tPath, ChartT, + style = Stroke( + width = 2.dp.toPx(), + pathEffect = PathEffect.dashPathEffect(floatArrayOf(12f, 10f)) + ) + ) + } + + if (options.showLabs) { + e2Labs.forEach { lab -> + if (lab.timestamp in t0..t1) { + val c = Offset(xOf(lab.timestamp), yE2(lab.value)) + drawCircle(LabDot, radius = 5.dp.toPx(), center = c) + drawDotLabel(lab.value, Offset(c.x, c.y - 10.dp.toPx())) + } + } + tLabs.forEach { lab -> + if (lab.timestamp in t0..t1) { + // labs may be in ng/dL or nmol/L: normalize to the model's ng/mL + val tVal = com.hormonetrack.pk.PharmacokineticEngine.convertTToNgMl(lab.value, lab.unit) + val c = Offset(xOf(lab.timestamp), yT(tVal)) + drawRect( + LabDot, + topLeft = Offset(c.x - 4.dp.toPx(), c.y - 4.dp.toPx()), + size = Size(8.dp.toPx(), 8.dp.toPx()) + ) + drawDotLabel(tVal, Offset(c.x, c.y - 10.dp.toPx())) + } + } + } + + if (options.nowMs in t0..t1) { + drawLine( + nowLineColor, + Offset(xOf(options.nowMs), padTop), + Offset(xOf(options.nowMs), padTop + h), + strokeWidth = 1.5.dp.toPx() + ) + } + } +} + +private fun DrawScope.drawGrid(color: Color, padLeft: Float, padTop: Float, w: Float, h: Float, rows: Int) { + for (i in 0..rows) { + val y = padTop + h * i / rows + drawLine(color, Offset(padLeft, y), Offset(padLeft + w, y), strokeWidth = 1f) + } +} + +private fun DrawScope.labelPaint(align: android.graphics.Paint.Align): android.graphics.Paint { + val c = Color(0xFF6B7280) + return android.graphics.Paint().apply { + color = android.graphics.Color.argb( + (c.alpha * 255).toInt(), + (c.red * 255).toInt(), + (c.green * 255).toInt(), + (c.blue * 255).toInt() + ) + textSize = 10.dp.toPx() + textAlign = align + isAntiAlias = true + } +} + +private fun DrawScope.drawLeftYLabels(color: Color, e2Max: Double, padLeft: Float, padTop: Float, h: Float) { + val paint = labelPaint(android.graphics.Paint.Align.RIGHT) + for (i in 0..4) { + val v = e2Max * i / 4 + val y = padTop + h * (1f - i / 4f) + drawContext.canvas.nativeCanvas.drawText(formatValue(v), padLeft - 6.dp.toPx(), y + 4.dp.toPx(), paint) + } +} + +private fun DrawScope.drawRightYLabels(color: Color, tMax: Double, xRight: Float, padTop: Float, h: Float) { + val paint = labelPaint(android.graphics.Paint.Align.LEFT) + for (i in 0..4) { + val v = tMax * i / 4 + val y = padTop + h * (1f - i / 4f) + drawContext.canvas.nativeCanvas.drawText(formatValue(v), xRight + 6.dp.toPx(), y + 4.dp.toPx(), paint) + } +} + +private fun DrawScope.drawXLabels( + color: Color, t0: Long, t1: Long, + padLeft: Float, yBottom: Float, w: Float +) { + val paint = labelPaint(android.graphics.Paint.Align.CENTER) + val spanH = (t1 - t0) / 3_600_000.0 + val stepHours = when { + spanH <= 25 -> 6 + spanH <= 25 * 7 -> 24 + else -> 24 * 5 + } + val fmt = if (spanH <= 25) SimpleDateFormat("HH'h'", Locale.getDefault()) + else SimpleDateFormat("dd/MM", Locale.getDefault()) + var tick = ceil(t0 / (stepHours * 3_600_000.0)).toLong() * stepHours * 3_600_000L + while (tick <= t1) { + val x = padLeft + w * ((tick - t0).toFloat() / (t1 - t0).toFloat()) + drawContext.canvas.nativeCanvas.drawText(fmt.format(Date(tick)), x, yBottom + 16.dp.toPx(), paint) + tick += stepHours * 3_600_000L + } +} + +private fun DrawScope.drawDotLabel(v: Double, c: Offset) { + val paint = labelPaint(android.graphics.Paint.Align.CENTER).apply { + color = android.graphics.Color.rgb( + (LabDot.red * 255).toInt(), + (LabDot.green * 255).toInt(), + (LabDot.blue * 255).toInt() + ) + textSize = 9.dp.toPx() + isFakeBoldText = true + } + drawContext.canvas.nativeCanvas.drawText(formatValue(v), c.x, c.y, paint) +} + +private fun formatValue(v: Double): String = when { + v >= 10 -> "%.0f".format(Locale.US, v) + v >= 1 -> "%.1f".format(Locale.US, v) + else -> "%.2f".format(Locale.US, v) +} diff --git a/app/src/main/java/com/hormonetrack/ui/components/DateTimeField.kt b/app/src/main/java/com/hormonetrack/ui/components/DateTimeField.kt new file mode 100644 index 0000000..5dd4984 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/components/DateTimeField.kt @@ -0,0 +1,103 @@ +package com.hormonetrack.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Button +import androidx.compose.material3.DatePicker +import androidx.compose.material3.DatePickerDialog +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TimePicker +import androidx.compose.material3.rememberDatePickerState +import androidx.compose.material3.rememberTimePickerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import java.text.SimpleDateFormat +import java.time.Instant +import java.time.LocalDateTime +import java.time.LocalTime +import java.time.ZoneId +import java.util.Date +import java.util.Locale + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DateTimeField( + label: String, + value: LocalDateTime, + onChange: (LocalDateTime) -> Unit, + modifier: Modifier = Modifier +) { + val fmtDate = remember { SimpleDateFormat("EEE dd MMM yyyy", Locale.getDefault()) } + var showDate by remember { mutableStateOf(false) } + var showTime by remember { mutableStateOf(false) } + + Row(modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Button(onClick = { showDate = true }) { + Text(fmtDate.format(Date.from(value.atZone(ZoneId.systemDefault()).toInstant()))) + } + Button(onClick = { showTime = true }) { + Text(String.format(Locale.getDefault(), "%02d:%02d", value.hour, value.minute)) + } + } + + if (showDate) { + val state = rememberDatePickerState( + initialSelectedDateMillis = value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() + ) + DatePickerDialog( + onDismissRequest = { showDate = false }, + confirmButton = { + TextButton(onClick = { + state.selectedDateMillis?.let { ms -> + val d = Instant.ofEpochMilli(ms).atZone(ZoneId.systemDefault()).toLocalDate() + onChange(LocalDateTime.of(d, value.toLocalTime())) + } + showDate = false + }) { Text(stringResource(R.string.ok)) } + }, + dismissButton = { + TextButton(onClick = { showDate = false }) { Text(stringResource(R.string.cancel)) } + } + ) { + DatePicker(state = state) + } + } + + if (showTime) { + val state = rememberTimePickerState( + initialHour = value.hour, + initialMinute = value.minute, + is24Hour = true + ) + DatePickerDialog( + onDismissRequest = { showTime = false }, + confirmButton = { + TextButton(onClick = { + onChange(LocalDateTime.of(value.toLocalDate(), LocalTime.of(state.hour, state.minute))) + showTime = false + }) { Text(stringResource(R.string.ok)) } + }, + dismissButton = { + TextButton(onClick = { showTime = false }) { Text(stringResource(R.string.cancel)) } + } + ) { + TimePicker(state = state) + } + } +} + +fun localDateTimeFromMs(ms: Long): LocalDateTime = + Instant.ofEpochMilli(ms).atZone(ZoneId.systemDefault()).toLocalDateTime() + +fun msFromLocalDateTime(dt: LocalDateTime): Long = + dt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() diff --git a/app/src/main/java/com/hormonetrack/ui/components/DoseDialog.kt b/app/src/main/java/com/hormonetrack/ui/components/DoseDialog.kt new file mode 100644 index 0000000..ecbe967 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/components/DoseDialog.kt @@ -0,0 +1,182 @@ +package com.hormonetrack.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.Esters +import com.hormonetrack.data.model.Treatment + +/** + * Create-or-edit dose dialog. + * existing == null → create mode (preselectedTreatmentId used); + * existing != null → edit mode: prefills amount/time/notes/ester and calls onConfirmEdit. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DoseDialog( + treatments: List, + preselectedTreatmentId: Long? = null, + existing: DoseLog? = null, + onDismiss: () -> Unit, + onConfirmCreate: (treatment: Treatment, amount: Double, timestampMs: Long, notes: String?, esterOverride: String?) -> Unit, + onConfirmEdit: (DoseLog) -> Unit +) { + val isEdit = existing != null + var selectedId by remember(existing, preselectedTreatmentId) { + mutableStateOf( + existing?.treatmentId + ?: preselectedTreatmentId?.takeIf { id -> treatments.any { it.id == id } } + ?: treatments.firstOrNull()?.id + ) + } + val selected = treatments.firstOrNull { it.id == selectedId } + var amountText by remember(selected, existing) { + mutableStateOf(formatDose(existing?.doseAmount ?: selected?.doseAmount ?: 0.0)) + } + var dateTime by remember(existing) { + mutableStateOf( + existing?.let { localDateTimeFromMs(it.timestamp) } ?: java.time.LocalDateTime.now() + ) + } + var notes by remember(existing) { mutableStateOf(existing?.notes ?: "") } + var esterOverride by remember(existing, selected) { + mutableStateOf(existing?.esterType) + } + var expanded by remember { mutableStateOf(false) } + var esterExpanded by remember { mutableStateOf(false) } + + if (treatments.isEmpty()) { + AlertDialog( + onDismissRequest = onDismiss, + confirmButton = { TextButton(onClick = onDismiss) { Text(stringResource(R.string.ok)) } }, + title = { Text(stringResource(R.string.add_dose)) }, + text = { Text(stringResource(R.string.no_treatment_hint)) } + ) + return + } + + AlertDialog( + onDismissRequest = onDismiss, + confirmButton = { + TextButton(onClick = { + val tr = selected ?: return@TextButton + val amount = amountText.replace(',', '.').toDoubleOrNull() ?: return@TextButton + if (isEdit && existing != null) { + onConfirmEdit( + existing.copy( + treatmentId = tr.id, + timestamp = msFromLocalDateTime(dateTime), + doseAmount = amount, + notes = notes.ifBlank { null }, + esterType = esterOverride + ) + ) + } else { + onConfirmCreate(tr, amount, msFromLocalDateTime(dateTime), notes.ifBlank { null }, esterOverride) + } + }) { Text(stringResource(R.string.save)) } + }, + dismissButton = { TextButton(onClick = onDismiss) { Text(stringResource(R.string.cancel)) } }, + title = { + Text(stringResource(if (isEdit) R.string.edit_dose else R.string.add_dose)) + }, + text = { + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = it }) { + OutlinedTextField( + value = selected?.name ?: "", + onValueChange = {}, + readOnly = true, + label = { Text(stringResource(R.string.treatment_name)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { + treatments.forEach { tr -> + DropdownMenuItem( + text = { Text("${tr.name} · ${formatDose(tr.doseAmount)} ${tr.doseUnit}") }, + onClick = { + selectedId = tr.id + esterOverride = null + expanded = false + } + ) + } + } + } + if (selected?.usesProfileModel == true) { + ExposedDropdownMenuBox(expanded = esterExpanded, onExpandedChange = { esterExpanded = it }) { + OutlinedTextField( + value = esterOverride?.let { esterLabel(it) } + ?: stringResource(R.string.ester_default, selected.esterType), + onValueChange = {}, + readOnly = true, + label = { Text(stringResource(R.string.ester)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = esterExpanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = esterExpanded, onDismissRequest = { esterExpanded = false }) { + DropdownMenuItem( + text = { Text(stringResource(R.string.ester_default, selected.esterType)) }, + onClick = { esterOverride = null; esterExpanded = false } + ) + listOf(Esters.EV, Esters.EU, Esters.EEN).forEach { e -> + DropdownMenuItem( + text = { Text(esterLabel(e)) }, + onClick = { esterOverride = e; esterExpanded = false } + ) + } + } + } + } + OutlinedTextField( + value = amountText, + onValueChange = { amountText = it }, + label = { Text(stringResource(R.string.dose_amount) + (selected?.let { " (${it.doseUnit})" } ?: "")) }, + modifier = Modifier.fillMaxWidth() + ) + DateTimeField( + label = stringResource(R.string.dose_time), + value = dateTime, + onChange = { dateTime = it }, + modifier = Modifier + ) + OutlinedTextField( + value = notes, + onValueChange = { notes = it }, + label = { Text(stringResource(R.string.dose_notes)) }, + modifier = Modifier.fillMaxWidth() + ) + } + } + ) +} + +private fun esterLabel(ester: String): String = when (ester) { + Esters.EV -> "EV — valerate" + Esters.EU -> "EU — undecylate" + Esters.EEN -> "EEn — enanthate" + else -> ester +} + +fun formatDose(d: Double): String = + if (d == d.toLong().toDouble()) d.toLong().toString() else "%.1f".format(d) diff --git a/app/src/main/java/com/hormonetrack/ui/components/LabDialog.kt b/app/src/main/java/com/hormonetrack/ui/components/LabDialog.kt new file mode 100644 index 0000000..6bd3505 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/components/LabDialog.kt @@ -0,0 +1,104 @@ +package com.hormonetrack.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.LabResult + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun LabDialog( + onDismiss: () -> Unit, + onConfirm: (marker: String, value: Double, unit: String, timestampMs: Long, notes: String) -> Unit +) { + val markerSuggestions = listOf("E2", "T", "PRL") + val unitSuggestions = listOf("pg/mL", "ng/mL", "ng/dL", "mIU/L") + + var marker by remember { mutableStateOf("E2") } + var markerExpanded by remember { mutableStateOf(false) } + var valueText by remember { mutableStateOf("") } + var unit by remember { mutableStateOf("pg/mL") } + var unitExpanded by remember { mutableStateOf(false) } + var dateTime by remember { mutableStateOf(java.time.LocalDateTime.now()) } + var notes by remember { mutableStateOf("") } + + AlertDialog( + onDismissRequest = onDismiss, + confirmButton = { + TextButton(onClick = { + val v = valueText.replace(',', '.').toDoubleOrNull() ?: return@TextButton + onConfirm(marker.trim().uppercase(), v, unit, msFromLocalDateTime(dateTime), notes) + }) { Text(stringResource(R.string.save)) } + }, + dismissButton = { TextButton(onClick = onDismiss) { Text(stringResource(R.string.cancel)) } }, + title = { Text(stringResource(R.string.add_lab)) }, + text = { + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + ExposedDropdownMenuBox(expanded = markerExpanded, onExpandedChange = { markerExpanded = it }) { + OutlinedTextField( + value = marker, + onValueChange = { marker = it }, + label = { Text(stringResource(R.string.lab_marker)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = markerExpanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = markerExpanded, onDismissRequest = { markerExpanded = false }) { + markerSuggestions.forEach { s -> + DropdownMenuItem(text = { Text(s) }, onClick = { marker = s; markerExpanded = false }) + } + } + } + OutlinedTextField( + value = valueText, + onValueChange = { valueText = it }, + label = { Text(stringResource(R.string.lab_value)) }, + modifier = Modifier.fillMaxWidth() + ) + ExposedDropdownMenuBox(expanded = unitExpanded, onExpandedChange = { unitExpanded = it }) { + OutlinedTextField( + value = unit, + onValueChange = { unit = it }, + label = { Text(stringResource(R.string.lab_unit)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = unitExpanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = unitExpanded, onDismissRequest = { unitExpanded = false }) { + unitSuggestions.forEach { s -> + DropdownMenuItem(text = { Text(s) }, onClick = { unit = s; unitExpanded = false }) + } + } + } + DateTimeField( + label = stringResource(R.string.lab_date), + value = dateTime, + onChange = { dateTime = it }, + modifier = Modifier + ) + OutlinedTextField( + value = notes, + onValueChange = { notes = it }, + label = { Text(stringResource(R.string.dose_notes)) }, + modifier = Modifier.fillMaxWidth() + ) + } + } + ) +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/ChartScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/ChartScreen.kt new file mode 100644 index 0000000..48bc776 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/ChartScreen.kt @@ -0,0 +1,158 @@ +package com.hormonetrack.ui.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FilterChip +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.pk.LevelPoint +import com.hormonetrack.pk.PharmacokineticEngine +import com.hormonetrack.pk.TConfig +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.ChartOptions +import com.hormonetrack.ui.components.CurveChart +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ChartScreen() { + val container = LocalAppContainer.current + val repo = container.repository + val treatments by repo.activeTreatments.collectAsState(initial = emptyList()) + val doseLogs by repo.allDoseLogs.collectAsState(initial = emptyList()) + val labResults by repo.allLabResults.collectAsState(initial = emptyList()) + val tConfig by container.settings.tConfig.collectAsState(initial = TConfig()) + + var rangeHours by remember { mutableLongStateOf(24L) } + var showT by remember { mutableStateOf(true) } + var showLabs by remember { mutableStateOf(true) } + + val curve by produceState>(emptyList(), treatments, doseLogs, tConfig, rangeHours) { + withContext(Dispatchers.Default) { + val end = System.currentTimeMillis() + value = PharmacokineticEngine.computeCurve( + treatments, doseLogs, + startMs = end - rangeHours * 3_600_000L, + endMs = end, + tConfig = tConfig + ) + } + } + + val (a, b) = if (curve.size >= 2) { + curve.first().timestamp to curve.last().timestamp + } else 0L to 0L + val e2Labs = labResults.filter { it.marker.equals("E2", true) && it.timestamp in a..b } + val tLabs = labResults.filter { it.marker.equals("T", true) && it.timestamp in a..b } + + Column( + Modifier + .fillMaxSize() + .padding(16.dp) + ) { + TopAppBar( + title = { Text(stringResource(R.string.nav_chart)) } + ) + + Spacer(Modifier.height(8.dp)) + + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + FilterChip( + selected = rangeHours == 24L, + onClick = { rangeHours = 24L }, + label = { Text(stringResource(R.string.chart_24h)) } + ) + FilterChip( + selected = rangeHours == 24L * 7, + onClick = { rangeHours = 24L * 7 }, + label = { Text(stringResource(R.string.chart_7j)) } + ) + FilterChip( + selected = rangeHours == 24L * 30, + onClick = { rangeHours = 24L * 30 }, + label = { Text(stringResource(R.string.chart_30j)) } + ) + } + + Spacer(Modifier.height(8.dp)) + + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + FilterChip( + selected = showT, + onClick = { showT = !showT }, + label = { Text("T") } + ) + FilterChip( + selected = showLabs, + onClick = { showLabs = !showLabs }, + label = { Text(stringResource(R.string.show_labs)) } + ) + } + + Spacer(Modifier.height(12.dp)) + + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + if (curve.isEmpty()) { + Text( + stringResource(R.string.no_data), + style = MaterialTheme.typography.bodyLarge, + modifier = Modifier.padding(vertical = 32.dp) + ) + } else { + CurveChart( + points = curve, + e2Labs = e2Labs, + tLabs = tLabs, + options = ChartOptions(showT = showT, showLabs = showLabs), + modifier = Modifier + .fillMaxWidth() + .height(320.dp) + ) + Spacer(Modifier.height(8.dp)) + Text( + stringResource(R.string.legend_e2), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.primary + ) + if (showT) { + Text( + stringResource(R.string.legend_t), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.secondary + ) + } + if (showLabs) { + Text( + stringResource(R.string.legend_labs), + style = MaterialTheme.typography.labelMedium, + color = com.hormonetrack.ui.theme.LabDot + ) + } + } + } + } + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/DosesScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/DosesScreen.kt new file mode 100644 index 0000000..43d6776 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/DosesScreen.kt @@ -0,0 +1,181 @@ +package com.hormonetrack.ui.screens + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.AssistChip +import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.DoseDialog +import com.hormonetrack.ui.components.formatDose +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DosesScreen() { + val container = LocalAppContainer.current + val repo = container.repository + val doseLogs by repo.allDoseLogs.collectAsState(initial = emptyList()) + val treatments by repo.allTreatments.collectAsState(initial = emptyList()) + val treatmentMap = remember(treatments) { treatments.associateBy { it.id } } + + var showLogDialog by remember { mutableStateOf(false) } + var toEdit by remember { mutableStateOf(null) } + var toDelete by remember { mutableStateOf(null) } + + val grouped = remember(doseLogs) { + doseLogs.groupBy { log -> + Instant.ofEpochMilli(log.timestamp).atZone(ZoneId.systemDefault()).toLocalDate() + }.toSortedMap(compareByDescending { it }) + } + + val timeFmt = remember { DateTimeFormatter.ofPattern("HH:mm") } + + Scaffold( + floatingActionButton = { + FloatingActionButton(onClick = { showLogDialog = true }) { + Icon(Icons.Filled.Add, contentDescription = stringResource(R.string.add_dose)) + } + } + ) { padding -> + Column(Modifier.fillMaxSize().padding(padding)) { + TopAppBar( + title = { Text(stringResource(R.string.nav_doses)) } + ) + if (doseLogs.isEmpty()) { + Text( + stringResource(R.string.no_data), + modifier = Modifier.padding(16.dp) + ) + } else { + LazyColumn(Modifier.fillMaxSize()) { + grouped.forEach { (date, logs) -> + item(key = "header_${date}") { + Text( + date.toString(), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) + ) + } + items(logs, key = { it.id }) { log -> + val tr = treatmentMap[log.treatmentId] + val zone = ZoneId.systemDefault() + val time = timeFmt.format(Instant.ofEpochMilli(log.timestamp).atZone(zone)) + ListItem( + modifier = Modifier.clickable { toEdit = log }, + headlineContent = { + Text("${tr?.name ?: "?"} · ${formatDose(log.doseAmount)} ${tr?.doseUnit ?: ""}") + }, + supportingContent = { + Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { + Text(time) + log.esterType?.takeIf { it.isNotEmpty() && it != "NONE" }?.let { + AssistChip(onClick = {}, label = { Text(it) }) + } + log.notes?.takeIf { it.isNotBlank() }?.let { + Text(it, color = MaterialTheme.colorScheme.onSurfaceVariant) + } + } + }, + trailingContent = { + IconButton(onClick = { toDelete = log }) { + Icon(Icons.Filled.Delete, contentDescription = stringResource(R.string.delete)) + } + } + ) + } + } + } + } + } + } + + if (showLogDialog || toEdit != null) { + DoseDialog( + treatments = treatments, + preselectedTreatmentId = null, + existing = toEdit, + onDismiss = { + showLogDialog = false + toEdit = null + }, + onConfirmCreate = { tr, amount, ts, notes, esterOverride -> + showLogDialog = false + CoroutineScope(Dispatchers.IO).launch { + repo.insertDoseLog( + DoseLog( + treatmentId = tr.id, + timestamp = ts, + doseAmount = amount, + notes = notes, + esterType = esterOverride + ) + ) + } + }, + onConfirmEdit = { updated -> + toEdit = null + CoroutineScope(Dispatchers.IO).launch { + repo.updateDoseLog(updated) + } + } + ) + } + + toDelete?.let { log -> + AlertDialog( + onDismissRequest = { toDelete = null }, + confirmButton = { + TextButton(onClick = { + toDelete = null + CoroutineScope(Dispatchers.IO).launch { repo.deleteDoseLog(log) } + }) { Text(stringResource(R.string.delete)) } + }, + dismissButton = { + TextButton(onClick = { toDelete = null }) { Text(stringResource(R.string.cancel)) } + }, + title = { Text(stringResource(R.string.delete)) }, + text = { Text(stringResource(R.string.confirm_delete)) } + ) + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/HomeScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/HomeScreen.kt new file mode 100644 index 0000000..23068ce --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/HomeScreen.kt @@ -0,0 +1,321 @@ +package com.hormonetrack.ui.screens + +import androidx.compose.foundation.background +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.AssistChip +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FilledTonalIconButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.pk.LevelPoint +import com.hormonetrack.pk.PharmacokineticEngine +import com.hormonetrack.pk.TConfig +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.ChartOptions +import com.hormonetrack.ui.components.CurveChart +import com.hormonetrack.ui.components.DoseDialog +import com.hormonetrack.ui.components.formatDose +import com.hormonetrack.ui.theme.TransPink +import com.hormonetrack.ui.theme.TransSky +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.util.Locale +import kotlin.math.abs + +private val HOUR_MS = 3_600_000L + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun HomeScreen( + openLogDoseForTreatmentId: Long?, + onOpenSettings: () -> Unit, + onOpenTreatment: (Long) -> Unit +) { + val container = LocalAppContainer.current + val repo = container.repository + val treatments by repo.activeTreatments.collectAsState(initial = emptyList()) + val doseLogs by repo.allDoseLogs.collectAsState(initial = emptyList()) + val labResults by repo.allLabResults.collectAsState(initial = emptyList()) + val tConfig by container.settings.tConfig.collectAsState(initial = TConfig()) + + var showLogDialog by remember { mutableStateOf(false) } + var preselectId by remember { mutableStateOf(null) } + + LaunchedEffect(openLogDoseForTreatmentId) { + openLogDoseForTreatmentId?.takeIf { it > 0 }?.let { + showLogDialog = true + preselectId = it + } + } + + var tick by remember { mutableIntStateOf(0) } + LaunchedEffect(Unit) { + while (true) { + delay(60_000) + tick++ + } + } + + val curve by produceState>(emptyList(), treatments, doseLogs, tConfig, tick) { + withContext(Dispatchers.Default) { + val end = System.currentTimeMillis() + value = PharmacokineticEngine.computeCurve( + treatments, doseLogs, + startMs = end - 24 * HOUR_MS, + endMs = end, + tConfig = tConfig + ) + } + } + + Column(Modifier.fillMaxSize()) { + TopAppBar( + title = { Text(stringResource(R.string.app_name)) }, + actions = { + IconButton(onClick = onOpenSettings) { + Icon(Icons.Filled.Settings, contentDescription = stringResource(R.string.settings)) + } + } + ) + + Box( + Modifier + .fillMaxWidth() + .height(3.dp) + .background(Brush.horizontalGradient(listOf(TransSky, TransPink, TransSky))) + ) + + Column( + Modifier + .fillMaxSize() + .padding(horizontal = 16.dp) + .verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + Spacer(Modifier.height(4.dp)) + + NowLevelCard(curve) + + NextDoseCard(treatments) + + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant) + ) { + Column(Modifier.padding(12.dp)) { + Text( + stringResource(R.string.logged_today), + style = MaterialTheme.typography.titleMedium + ) + Spacer(Modifier.height(6.dp)) + Row( + Modifier.horizontalScroll(rememberScrollState()), + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + treatments.forEach { tr -> + AssistChip( + onClick = { + preselectId = tr.id + showLogDialog = true + }, + label = { + Text("${tr.name} · ${formatDose(tr.doseAmount)}${tr.doseUnit}") + } + ) + } + FilledTonalIconButton(onClick = { + preselectId = null + showLogDialog = true + }) { + Icon(Icons.Filled.Add, contentDescription = stringResource(R.string.add_dose)) + } + } + } + } + + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text( + stringResource(R.string.home_chart_title), + style = MaterialTheme.typography.titleMedium + ) + Spacer(Modifier.height(8.dp)) + CurveChart( + points = curve, + e2Labs = labResults.filterInRange(curve, "E2"), + tLabs = labResults.filterInRange(curve, "T"), + options = ChartOptions(showT = true, showLabs = true), + modifier = Modifier + .fillMaxWidth() + .height(180.dp) + ) + } + } + + Text( + stringResource(R.string.disclaimer), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(Modifier.height(12.dp)) + } + } + + if (showLogDialog) { + DoseDialog( + treatments = treatments, + preselectedTreatmentId = preselectId, + existing = null, + onDismiss = { showLogDialog = false }, + onConfirmCreate = { tr, amount, ts, notes, esterOverride -> + showLogDialog = false + CoroutineScope(Dispatchers.IO).launch { + repo.insertDoseLog( + com.hormonetrack.data.model.DoseLog( + treatmentId = tr.id, + timestamp = ts, + doseAmount = amount, + notes = notes, + esterType = esterOverride + ) + ) + } + }, + onConfirmEdit = { } + ) + } +} + +private fun List.filterInRange(curve: List, marker: String): List { + if (curve.size < 2) return emptyList() + val (a, b) = curve.first().timestamp to curve.last().timestamp + return filter { it.marker.equals(marker, true) && it.timestamp in a..b } +} + +@Composable +private fun NowLevelCard(curve: List) { + val now = curve.lastOrNull() + val sixHAgo = curve.firstOrNull { p -> + (curve.last().timestamp - p.timestamp) >= 6 * HOUR_MS + } + Card( + Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.primaryContainer) + ) { + Column(Modifier.padding(16.dp)) { + Text( + stringResource(R.string.current_level), + style = MaterialTheme.typography.labelMedium + ) + if (now == null) { + Spacer(Modifier.height(4.dp)) + Text(stringResource(R.string.no_data)) + } else { + Spacer(Modifier.height(6.dp)) + Row(verticalAlignment = Alignment.Bottom) { + Text( + "≈ " + "%.0f".format(now.e2), + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold + ) + Text(" pg/mL", style = MaterialTheme.typography.titleMedium) + Spacer(Modifier.width(16.dp)) + Text( + "T ≈ " + "%.2f".format(now.t) + " ng/mL", + style = MaterialTheme.typography.bodyLarge + ) + } + sixHAgo?.let { + val delta = now.e2 - it.e2 + val arrow = if (delta >= 0) "↗" else "↘" + Text( + stringResource(R.string.delta_6h, arrow, "%.0f".format(abs(delta))), + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + } +} + +@Composable +private fun NextDoseCard(treatments: List) { + val next = PharmacokineticEngine.nextReminderFireMs(treatments) + if (next == null) return + val nextTreatment = treatments.filter { it.reminderEnabled } + .minByOrNull { tr -> + val h = tr.reminderHour ?: 23 + val m = tr.reminderMinute ?: 59 + val candidate = (h * 60L + m) * 60_000L + val nowMs = System.currentTimeMillis() + val nowOfDay = nowMs % (24 * HOUR_MS) + if (candidate >= nowOfDay) candidate else candidate + 24 * HOUR_MS + } + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(16.dp)) { + Text( + stringResource(R.string.next_dose), + style = MaterialTheme.typography.labelMedium + ) + Spacer(Modifier.height(4.dp)) + val deltaMs = next - System.currentTimeMillis() + val h = deltaMs / HOUR_MS + val m = (deltaMs % HOUR_MS) / 60_000L + val timeStr = DateTimeFormatter.ofPattern("HH:mm") + .withZone(ZoneId.systemDefault()) + .format(Instant.ofEpochMilli(next)) + Text( + if (h > 0) { + String.format(Locale.getDefault(), "%dh%02d · %s (%s)", h, m, timeStr, nextTreatment?.name ?: "") + } else { + String.format(Locale.getDefault(), "%d min · %s (%s)", m, timeStr, nextTreatment?.name ?: "") + }, + style = MaterialTheme.typography.titleMedium + ) + } + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/LabsScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/LabsScreen.kt new file mode 100644 index 0000000..9eb2885 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/LabsScreen.kt @@ -0,0 +1,150 @@ +package com.hormonetrack.ui.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.LabDialog +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun LabsScreen() { + val container = LocalAppContainer.current + val repo = container.repository + val labs by repo.allLabResults.collectAsState(initial = emptyList()) + + var showLabDialog by remember { mutableStateOf(false) } + var toDelete by remember { mutableStateOf(null) } + + val grouped = remember(labs) { + labs.sortedBy { it.marker.lowercase() }.groupBy { it.marker.uppercase() } + } + val fmt = remember { + DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm").withZone(ZoneId.systemDefault()) + } + + Scaffold( + floatingActionButton = { + FloatingActionButton(onClick = { showLabDialog = true }) { + Icon(Icons.Filled.Add, contentDescription = stringResource(R.string.add_lab)) + } + } + ) { padding -> + Column(Modifier.fillMaxSize().padding(padding)) { + TopAppBar( + title = { Text(stringResource(R.string.nav_labs)) } + ) + if (labs.isEmpty()) { + Text( + stringResource(R.string.no_data), + modifier = Modifier.padding(16.dp) + ) + } else { + LazyColumn(Modifier.fillMaxSize()) { + grouped.forEach { (marker, results) -> + item(key = "header_$marker") { + Text( + marker, + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) + ) + } + items(results, key = { it.id }) { lab -> + ListItem( + headlineContent = { + Text("${lab.value} ${lab.unit}") + }, + supportingContent = { + Column { + Text(fmt.format(Instant.ofEpochMilli(lab.timestamp))) + lab.notes?.takeIf { it.isNotBlank() }?.let { + Text(it, color = MaterialTheme.colorScheme.onSurfaceVariant) + } + } + }, + trailingContent = { + IconButton(onClick = { toDelete = lab }) { + Icon(Icons.Filled.Delete, contentDescription = stringResource(R.string.delete)) + } + } + ) + } + } + } + } + } + } + + if (showLabDialog) { + LabDialog( + onDismiss = { showLabDialog = false }, + onConfirm = { marker, value, unit, ts, notes -> + showLabDialog = false + CoroutineScope(Dispatchers.IO).launch { + repo.insertLabResult( + LabResult( + marker = marker, + value = value, + unit = unit, + timestamp = ts, + notes = notes.ifBlank { null } + ) + ) + } + } + ) + } + + toDelete?.let { lab -> + AlertDialog( + onDismissRequest = { toDelete = null }, + confirmButton = { + TextButton(onClick = { + toDelete = null + CoroutineScope(Dispatchers.IO).launch { repo.deleteLabResult(lab) } + }) { Text(stringResource(R.string.delete)) } + }, + dismissButton = { + TextButton(onClick = { toDelete = null }) { Text(stringResource(R.string.cancel)) } + }, + title = { Text(stringResource(R.string.delete)) }, + text = { Text(stringResource(R.string.confirm_delete)) } + ) + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/SettingsScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/SettingsScreen.kt new file mode 100644 index 0000000..22661e0 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/SettingsScreen.kt @@ -0,0 +1,347 @@ +package com.hormonetrack.ui.screens + +import android.content.Intent +import android.os.Build +import android.provider.Settings +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FilterChip +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import com.hormonetrack.R +import com.hormonetrack.data.backup.BackupManager +import com.hormonetrack.pk.PharmacokineticEngine +import com.hormonetrack.pk.TConfig +import com.hormonetrack.reminder.AlarmScheduler +import com.hormonetrack.ui.LocalAppContainer +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.time.LocalDate +import java.time.format.DateTimeFormatter +import java.util.Locale + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SettingsScreen(onBack: () -> Unit) { + val container = LocalAppContainer.current + val repo = container.repository + val context = LocalContext.current + val scheduler = remember { AlarmScheduler(context) } + + val tConfig by container.settings.tConfig.collectAsState(initial = TConfig()) + val currentLanguage by container.settings.language.collectAsState(initial = "system") + + var tBaseText by remember(tConfig.base) { mutableStateOf(formatDoubles(tConfig.base)) } + var tFloorText by remember(tConfig.floor) { mutableStateOf(formatDoubles(tConfig.floor)) } + var tKText by remember(tConfig.k) { mutableStateOf(formatDoubles(tConfig.k)) } + + var showImportConfirm by remember { mutableStateOf(false) } + var importJson by remember { mutableStateOf(null) } + var message by remember { mutableStateOf(null) } + + val exportLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.CreateDocument("application/json") + ) { uri -> + uri ?: return@rememberLauncherForActivityResult + CoroutineScope(Dispatchers.IO).launch { + val json = BackupManager.exportJson(repo, tConfig) + val ok = BackupManager.writeBackup(context, uri, json) + withContext(Dispatchers.Main) { + message = context.getString( + if (ok) R.string.export_ok else R.string.export_fail + ) + } + } + } + + val importLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.OpenDocument() + ) { uri -> + uri ?: return@rememberLauncherForActivityResult + CoroutineScope(Dispatchers.IO).launch { + val json = BackupManager.readBackup(context, uri) + withContext(Dispatchers.Main) { + if (json != null) { + importJson = json + showImportConfirm = true + } else { + message = context.getString(R.string.import_fail) + } + } + } + } + + Column( + Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(horizontal = 16.dp) + ) { + TopAppBar( + title = { Text(stringResource(R.string.settings)) }, + navigationIcon = { + IconButton(onClick = onBack) { + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(R.string.back)) + } + } + ) + Spacer(Modifier.height(8.dp)) + + message?.let { + Text(it, color = MaterialTheme.colorScheme.primary) + Spacer(Modifier.height(8.dp)) + } + + // --- Language --- + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.language), style = MaterialTheme.typography.titleMedium) + Spacer(Modifier.height(6.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + FilterChip( + selected = currentLanguage == "system", + onClick = { + CoroutineScope(Dispatchers.IO).launch { + container.settings.setLanguage("system") + withContext(Dispatchers.Main) { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.getEmptyLocaleList() + ) + } + } + }, + label = { Text(stringResource(R.string.language_system)) } + ) + FilterChip( + selected = currentLanguage == "fr", + onClick = { + CoroutineScope(Dispatchers.IO).launch { + container.settings.setLanguage("fr") + withContext(Dispatchers.Main) { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags("fr") + ) + } + } + }, + label = { Text("Français") } + ) + FilterChip( + selected = currentLanguage == "en", + onClick = { + CoroutineScope(Dispatchers.IO).launch { + container.settings.setLanguage("en") + withContext(Dispatchers.Main) { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags("en") + ) + } + } + }, + label = { Text("English") } + ) + } + } + } + Spacer(Modifier.height(12.dp)) + + // --- Testosterone model --- + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.t_model_title), style = MaterialTheme.typography.titleMedium) + Text( + stringResource(R.string.t_model_hint), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(Modifier.height(6.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + OutlinedTextField( + value = tBaseText, + onValueChange = { tBaseText = it }, + label = { Text(stringResource(R.string.t_base)) }, + modifier = Modifier.weight(1f) + ) + OutlinedTextField( + value = tFloorText, + onValueChange = { tFloorText = it }, + label = { Text(stringResource(R.string.t_floor)) }, + modifier = Modifier.weight(1f) + ) + OutlinedTextField( + value = tKText, + onValueChange = { tKText = it }, + label = { Text("k") }, + modifier = Modifier.weight(1f) + ) + } + Spacer(Modifier.height(8.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Button(onClick = { + val base = tBaseText.replace(',', '.').toDoubleOrNull() ?: return@Button + val floor = tFloorText.replace(',', '.').toDoubleOrNull() ?: return@Button + val k = tKText.replace(',', '.').toDoubleOrNull() ?: return@Button + CoroutineScope(Dispatchers.IO).launch { + container.settings.setTConfig(TConfig(base, floor, k)) + withContext(Dispatchers.Main) { + message = context.getString(R.string.saved) + } + } + }) { Text(stringResource(R.string.save)) } + OutlinedButton(onClick = { + CoroutineScope(Dispatchers.IO).launch { + val labs = repo.allLabResultsOnce().filter { it.marker.equals("T", true) } + val trs = repo.allTreatmentsOnce() + val doses = repo.allDoseLogsOnce() + val calibrated = PharmacokineticEngine.computeTConfigCalibration( + labs, trs, doses, tConfig + ) + calibrated?.let { + container.settings.setTConfig(it) + withContext(Dispatchers.Main) { + message = context.getString(R.string.t_calibrated) + } + } + } + }) { Text(stringResource(R.string.calibrate_from_labs)) } + } + } + } + Spacer(Modifier.height(12.dp)) + + // --- Reminders / exact alarms --- + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.reminders_section), style = MaterialTheme.typography.titleMedium) + Spacer(Modifier.height(6.dp)) + if (!scheduler.canScheduleExact()) { + Text( + stringResource(R.string.exact_alarm_needed), + color = MaterialTheme.colorScheme.error, + style = MaterialTheme.typography.bodyMedium + ) + Spacer(Modifier.height(6.dp)) + Button(onClick = { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + context.startActivity(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM)) + } + }) { Text(stringResource(R.string.grant_exact_alarm)) } + } else { + Text(stringResource(R.string.exact_alarm_ok), style = MaterialTheme.typography.bodyMedium) + } + } + } + Spacer(Modifier.height(12.dp)) + + // --- Backup --- + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.backup_section), style = MaterialTheme.typography.titleMedium) + Text( + stringResource(R.string.backup_hint), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(Modifier.height(6.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Button(onClick = { + val date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + exportLauncher.launch("hormonetrack-backup-$date.json") + }) { Text(stringResource(R.string.export_json)) } + OutlinedButton(onClick = { + importLauncher.launch(arrayOf("application/json")) + }) { Text(stringResource(R.string.import_json)) } + } + } + } + Spacer(Modifier.height(12.dp)) + + // --- About --- + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.about_title), style = MaterialTheme.typography.titleMedium) + Text( + stringResource(R.string.disclaimer), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Text( + stringResource(R.string.models_credit), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + Spacer(Modifier.height(32.dp)) + } + + if (showImportConfirm) { + AlertDialog( + onDismissRequest = { showImportConfirm = false }, + confirmButton = { + TextButton(onClick = { + showImportConfirm = false + val json = importJson ?: return@TextButton + CoroutineScope(Dispatchers.IO).launch { + val result = try { + BackupManager.importJson(repo, json) + } catch (e: Exception) { + null + } + withContext(Dispatchers.Main) { + message = if (result != null) { + context.getString(R.string.import_ok, result.treatments, result.doseLogs, result.labResults) + } else { + context.getString(R.string.import_fail) + } + } + } + }) { Text(stringResource(R.string.import_confirm)) } + }, + dismissButton = { + TextButton(onClick = { showImportConfirm = false }) { Text(stringResource(R.string.cancel)) } + }, + title = { Text(stringResource(R.string.import_title)) }, + text = { Text(stringResource(R.string.import_warning)) } + ) + } +} + +private fun formatDoubles(d: Double): String = + if (d == d.toLong().toDouble()) d.toLong().toString() else "%.3f".format(Locale.US, d) diff --git a/app/src/main/java/com/hormonetrack/ui/screens/TreatmentEditorScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/TreatmentEditorScreen.kt new file mode 100644 index 0000000..ccddd8f --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/TreatmentEditorScreen.kt @@ -0,0 +1,477 @@ +package com.hormonetrack.ui.screens + +import android.content.Intent +import android.os.Build +import android.provider.Settings +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TimePicker +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.rememberTimePickerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.AdministrationRoute +import com.hormonetrack.data.model.Esters +import com.hormonetrack.data.model.PKModels +import com.hormonetrack.data.model.PKPresets +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.data.model.TreatmentType +import com.hormonetrack.pk.PharmacokineticEngine +import com.hormonetrack.reminder.AlarmScheduler +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.formatDose +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.time.LocalTime +import java.util.Locale + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TreatmentEditorScreen(treatmentId: Long, onDone: () -> Unit) { + val container = LocalAppContainer.current + val repo = container.repository + val context = LocalContext.current + val scheduler = remember { AlarmScheduler(context) } + + var name by remember { mutableStateOf("") } + var type by remember { mutableStateOf(TreatmentType.ESTRADIOL) } + var route by remember { mutableStateOf(AdministrationRoute.INJECTION_IM) } + var ester by remember { mutableStateOf(Esters.EV) } + var model by remember { mutableStateOf(PKModels.ESTRANNAISE) } + var doseText by remember { mutableStateOf("4") } + var unit by remember { mutableStateOf("mg") } + var tmaxText by remember { mutableStateOf("46") } + var thalfText by remember { mutableStateOf("100") } + var bioText by remember { mutableStateOf("1.0") } + var scaleText by remember { mutableStateOf("1") } + var reminderEnabled by remember { mutableStateOf(false) } + var reminderTime by remember { mutableStateOf(LocalTime.of(12, 0)) } + var active by remember { mutableStateOf(true) } + var showDeleteConfirm by remember { mutableStateOf(false) } + var showPresetMenu by remember { mutableStateOf(false) } + var showTimePicker by remember { mutableStateOf(false) } + var loading by remember { mutableStateOf(treatmentId > 0) } + var loadedCreatedAt by remember { mutableStateOf(System.currentTimeMillis()) } + + LaunchedEffect(treatmentId) { + if (treatmentId > 0) { + repo.getTreatmentById(treatmentId)?.let { tr -> + name = tr.name + type = tr.type + route = tr.route + ester = tr.esterType + model = tr.pkModel + doseText = formatDose(tr.doseAmount) + unit = tr.doseUnit + tmaxText = formatDose(tr.absorptionHours.toDouble()) + thalfText = formatDose(tr.eliminationHalfLifeHours.toDouble()) + bioText = formatDose(tr.bioavailabilityFraction.toDouble()) + scaleText = formatDose(tr.scaleFactor) + reminderEnabled = tr.reminderEnabled + reminderTime = LocalTime.of(tr.reminderHour ?: 12, tr.reminderMinute ?: 0) + active = tr.isActive + loadedCreatedAt = tr.createdAt + } + loading = false + } + } + + fun buildTreatment(id: Long): Treatment? { + val dose = doseText.replace(',', '.').toDoubleOrNull() ?: return null + val tmax = tmaxText.replace(',', '.').toFloatOrNull() ?: 4f + val thalf = thalfText.replace(',', '.').toFloatOrNull() ?: 24f + val bio = bioText.replace(',', '.').toFloatOrNull() ?: 1f + val scale = scaleText.replace(',', '.').toDoubleOrNull() ?: 1.0 + if (name.isBlank() || dose <= 0.0) return null + return Treatment( + id = id, + name = name.trim(), + type = type, + route = route, + doseAmount = dose, + doseUnit = unit.trim().ifBlank { "mg" }, + isActive = active, + esterType = if (PharmacokineticEngine.isInjectionRoute(route)) ester else Esters.NONE, + pkModel = model, + absorptionHours = tmax, + eliminationHalfLifeHours = thalf, + bioavailabilityFraction = bio.coerceIn(0.01f, 1f), + scaleFactor = scale.coerceAtLeast(0.01), + reminderEnabled = reminderEnabled, + reminderHour = if (reminderEnabled) reminderTime.hour else null, + reminderMinute = if (reminderEnabled) reminderTime.minute else null, + createdAt = loadedCreatedAt + ) + } + + Column( + Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(horizontal = 16.dp) + ) { + TopAppBar( + title = { + Text( + if (treatmentId > 0) stringResource(R.string.edit_treatment) + else stringResource(R.string.add_treatment) + ) + }, + navigationIcon = { + IconButton(onClick = onDone) { + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(R.string.back)) + } + } + ) + + Spacer(Modifier.height(8.dp)) + + if (treatmentId <= 0) { + ExposedDropdownMenuBox(expanded = showPresetMenu, onExpandedChange = { showPresetMenu = it }) { + OutlinedTextField( + value = "", + onValueChange = {}, + readOnly = true, + label = { Text(stringResource(R.string.select_preset)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = showPresetMenu) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = showPresetMenu, onDismissRequest = { showPresetMenu = false }) { + PKPresets.all.forEach { preset -> + DropdownMenuItem( + text = { Text(stringResource(preset.nameRes)) }, + onClick = { + name = context.getString(preset.nameRes) + type = preset.type + route = preset.route + ester = preset.esterType + model = preset.pkModel + doseText = formatDose(preset.defaultDoseAmount) + unit = preset.defaultDoseUnit + tmaxText = formatDose(preset.absorptionHours.toDouble()) + thalfText = formatDose(preset.eliminationHalfLifeHours.toDouble()) + bioText = formatDose(preset.bioavailabilityFraction.toDouble()) + showPresetMenu = false + } + ) + } + } + } + Spacer(Modifier.height(10.dp)) + } + + if (!loading) { + OutlinedTextField( + value = name, + onValueChange = { name = it }, + label = { Text(stringResource(R.string.treatment_name)) }, + modifier = Modifier.fillMaxWidth() + ) + Spacer(Modifier.height(8.dp)) + + DropdownField( + label = stringResource(R.string.treatment_type), + selectedLabel = stringResource(typeLabelRes(type)), + options = TreatmentType.entries.map { it to stringResource(typeLabelRes(it)) }, + onSelect = { type = it } + ) + Spacer(Modifier.height(8.dp)) + + DropdownField( + label = stringResource(R.string.treatment_route), + selectedLabel = stringResource(routeLabelRes(route)), + options = AdministrationRoute.entries.map { it to stringResource(routeLabelRes(it)) }, + onSelect = { route = it } + ) + Spacer(Modifier.height(8.dp)) + + if (PharmacokineticEngine.isInjectionRoute(route)) { + DropdownField( + label = stringResource(R.string.ester), + selectedLabel = ester, + options = listOf(Esters.EV, Esters.EU, Esters.EEN).map { it to it }, + onSelect = { ester = it } + ) + Spacer(Modifier.height(8.dp)) + DropdownField( + label = stringResource(R.string.pk_model), + selectedLabel = stringResource( + if (model == PKModels.TRANSFEM_SCIENCE) R.string.model_tfs else R.string.model_ese + ), + options = listOf( + PKModels.ESTRANNAISE to stringResource(R.string.model_ese), + PKModels.TRANSFEM_SCIENCE to stringResource(R.string.model_tfs) + ), + onSelect = { model = it } + ) + } else { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + OutlinedTextField( + value = tmaxText, + onValueChange = { tmaxText = it }, + label = { Text(stringResource(R.string.pk_absorption)) }, + modifier = Modifier.weight(1f) + ) + OutlinedTextField( + value = thalfText, + onValueChange = { thalfText = it }, + label = { Text(stringResource(R.string.pk_halflife)) }, + modifier = Modifier.weight(1f) + ) + } + Spacer(Modifier.height(8.dp)) + OutlinedTextField( + value = bioText, + onValueChange = { bioText = it }, + label = { Text(stringResource(R.string.pk_bioavail)) }, + modifier = Modifier.fillMaxWidth() + ) + } + Spacer(Modifier.height(8.dp)) + + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + OutlinedTextField( + value = doseText, + onValueChange = { doseText = it }, + label = { Text(stringResource(R.string.default_dose)) }, + modifier = Modifier.weight(1f) + ) + OutlinedTextField( + value = unit, + onValueChange = { unit = it }, + label = { Text(stringResource(R.string.dose_unit)) }, + modifier = Modifier.weight(1f) + ) + } + Spacer(Modifier.height(8.dp)) + + if (type == TreatmentType.ESTRADIOL) { + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Text(stringResource(R.string.calibration_title), style = MaterialTheme.typography.titleMedium) + Spacer(Modifier.height(6.dp)) + OutlinedTextField( + value = scaleText, + onValueChange = { scaleText = it }, + label = { Text(stringResource(R.string.scale_factor)) }, + modifier = Modifier.fillMaxWidth() + ) + Text( + stringResource(R.string.calibration_hint), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(Modifier.height(6.dp)) + FilledTonalButton(onClick = { + CoroutineScope(Dispatchers.IO).launch { + val doses = repo.allDoseLogsOnce() + val labs = repo.allLabResultsOnce().filter { it.marker.equals("E2", true) } + buildTreatment(treatmentId)?.let { tmp -> + val sf = PharmacokineticEngine.computeScaleFactor( + tmp.copy(scaleFactor = 1.0), doses, labs + ) + sf?.let { + withContext(Dispatchers.Main) { + scaleText = "%.2f".format(Locale.US, it) + } + } + } + } + }) { Text(stringResource(R.string.calibrate_from_labs)) } + } + } + Spacer(Modifier.height(8.dp)) + } + + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(12.dp)) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + Text(stringResource(R.string.reminder), style = MaterialTheme.typography.titleMedium) + Switch(checked = reminderEnabled, onCheckedChange = { reminderEnabled = it }) + } + if (reminderEnabled) { + Spacer(Modifier.height(6.dp)) + FilledTonalButton(onClick = { showTimePicker = true }) { + Text( + String.format(Locale.getDefault(), "%02d:%02d", reminderTime.hour, reminderTime.minute) + ) + } + val scheduler2 = AlarmScheduler(context) + if (!scheduler2.canScheduleExact()) { + Spacer(Modifier.height(6.dp)) + Text( + stringResource(R.string.exact_alarm_needed), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.error + ) + TextButton(onClick = { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + context.startActivity( + Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) + ) + } + }) { Text(stringResource(R.string.grant_exact_alarm)) } + } + } + } + } + Spacer(Modifier.height(8.dp)) + + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.fillMaxWidth() + ) { + Text(stringResource(R.string.active)) + Switch(checked = active, onCheckedChange = { active = it }) + } + Spacer(Modifier.height(12.dp)) + + Button( + onClick = { + val tr = buildTreatment(if (treatmentId > 0) treatmentId else 0L) ?: return@Button + CoroutineScope(Dispatchers.IO).launch { + val savedId: Long = if (tr.id > 0) { + repo.updateTreatment(tr) + tr.id + } else { + repo.insertTreatment(tr) + } + val saved = tr.copy(id = savedId) + if (saved.reminderEnabled) { + scheduler.scheduleDaily(saved) + } else { + scheduler.cancel(savedId) + } + withContext(Dispatchers.Main) { onDone() } + } + }, + modifier = Modifier.fillMaxWidth() + ) { Text(stringResource(R.string.save)) } + + if (treatmentId > 0) { + Spacer(Modifier.height(8.dp)) + TextButton( + onClick = { showDeleteConfirm = true }, + modifier = Modifier.fillMaxWidth() + ) { + Text(stringResource(R.string.delete), color = MaterialTheme.colorScheme.error) + } + } + Spacer(Modifier.height(32.dp)) + } + } + + if (showTimePicker) { + val state = rememberTimePickerState( + initialHour = reminderTime.hour, + initialMinute = reminderTime.minute, + is24Hour = true + ) + AlertDialog( + onDismissRequest = { showTimePicker = false }, + confirmButton = { + TextButton(onClick = { + reminderTime = LocalTime.of(state.hour, state.minute) + showTimePicker = false + }) { Text(stringResource(R.string.ok)) } + }, + dismissButton = { + TextButton(onClick = { showTimePicker = false }) { Text(stringResource(R.string.cancel)) } + }, + title = { Text(stringResource(R.string.reminder_time)) }, + text = { TimePicker(state = state) } + ) + } + + if (showDeleteConfirm) { + AlertDialog( + onDismissRequest = { showDeleteConfirm = false }, + confirmButton = { + TextButton(onClick = { + showDeleteConfirm = false + scheduler.cancel(treatmentId) + CoroutineScope(Dispatchers.IO).launch { + repo.getTreatmentById(treatmentId)?.let { repo.deleteTreatment(it) } + withContext(Dispatchers.Main) { onDone() } + } + }) { Text(stringResource(R.string.delete)) } + }, + dismissButton = { + TextButton(onClick = { showDeleteConfirm = false }) { Text(stringResource(R.string.cancel)) } + }, + title = { Text(stringResource(R.string.delete)) }, + text = { Text(stringResource(R.string.confirm_delete_treatment)) } + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun DropdownField( + label: String, + selectedLabel: String, + options: List>, + onSelect: (T) -> Unit +) { + var expanded by remember { mutableStateOf(false) } + ExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = it }) { + OutlinedTextField( + value = selectedLabel, + onValueChange = {}, + readOnly = true, + label = { Text(label) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + modifier = Modifier.menuAnchor().fillMaxWidth() + ) + ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { + options.forEach { (value, labelRes) -> + DropdownMenuItem( + text = { Text(labelRes) }, + onClick = { + onSelect(value) + expanded = false + } + ) + } + } + } +} diff --git a/app/src/main/java/com/hormonetrack/ui/screens/TreatmentsScreen.kt b/app/src/main/java/com/hormonetrack/ui/screens/TreatmentsScreen.kt new file mode 100644 index 0000000..65f6dbd --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/screens/TreatmentsScreen.kt @@ -0,0 +1,158 @@ +package com.hormonetrack.ui.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material3.AssistChip +import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.hormonetrack.R +import com.hormonetrack.data.model.PKModels +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.ui.LocalAppContainer +import com.hormonetrack.ui.components.formatDose + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TreatmentsScreen( + onEdit: (Long) -> Unit, + onNew: () -> Unit +) { + val container = LocalAppContainer.current + val repo = container.repository + val treatments by repo.allTreatments.collectAsState(initial = emptyList()) + + Scaffold( + floatingActionButton = { + FloatingActionButton(onClick = onNew) { + Icon(Icons.Filled.Add, contentDescription = stringResource(R.string.add_treatment)) + } + } + ) { padding -> + Column(Modifier.fillMaxSize().padding(padding)) { + TopAppBar( + title = { Text(stringResource(R.string.nav_treatments)) } + ) + LazyColumn(Modifier.fillMaxSize()) { + items(treatments, key = { it.id }) { tr -> + TreatmentCard(tr, onClick = { onEdit(tr.id) }) + } + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TreatmentCard(tr: Treatment, onClick: () -> Unit) { + Card( + onClick = onClick, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 6.dp) + ) { + Column(Modifier.padding(12.dp)) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Text( + tr.name, + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.weight(1f) + ) + if (!tr.isActive) { + Text( + stringResource(R.string.inactive), + color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.labelMedium + ) + } + } + Text( + stringResource(routeLabelRes(tr.route)) + " · " + formatDose(tr.doseAmount) + " " + tr.doseUnit, + style = MaterialTheme.typography.bodyMedium + ) + Spacer(Modifier.width(4.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { + if (tr.usesProfileModel) { + AssistChip( + onClick = {}, + label = { + Text( + tr.esterType + " · " + stringResource( + if (tr.pkModel == PKModels.TRANSFEM_SCIENCE) R.string.model_tfs + else R.string.model_ese + ) + ) + } + ) + } else { + AssistChip( + onClick = {}, + label = { + Text( + stringResource(R.string.pk_absorption) + " " + formatDose(tr.absorptionHours.toDouble()) + "h" + ) + } + ) + } + if (tr.scaleFactor != 1.0) { + AssistChip( + onClick = {}, + label = { Text("×" + "%.2f".format(tr.scaleFactor)) } + ) + } + if (tr.reminderEnabled) { + AssistChip( + onClick = {}, + label = { + Text( + String.format( + java.util.Locale.getDefault(), "⏰ %02d:%02d", + tr.reminderHour ?: 0, tr.reminderMinute ?: 0 + ) + ) + } + ) + } + } + } + } +} + +fun routeLabelRes(route: com.hormonetrack.data.model.AdministrationRoute): Int = when (route) { + com.hormonetrack.data.model.AdministrationRoute.ORAL -> R.string.route_oral + com.hormonetrack.data.model.AdministrationRoute.TRANSDERMAL_GEL -> R.string.route_gel + com.hormonetrack.data.model.AdministrationRoute.TRANSDERMAL_PATCH -> R.string.route_patch + com.hormonetrack.data.model.AdministrationRoute.INJECTION_IM -> R.string.route_injection_im + com.hormonetrack.data.model.AdministrationRoute.INJECTION_SUBCUT -> R.string.route_injection_sc + else -> R.string.route_other +} + +fun typeLabelRes(type: com.hormonetrack.data.model.TreatmentType): Int = when (type) { + com.hormonetrack.data.model.TreatmentType.ESTRADIOL -> R.string.type_estradiol + com.hormonetrack.data.model.TreatmentType.ANTI_ANDROGEN -> R.string.type_antiandrogen + com.hormonetrack.data.model.TreatmentType.PROGESTOGEN -> R.string.type_progestogen + else -> R.string.type_other +} diff --git a/app/src/main/java/com/hormonetrack/ui/theme/Color.kt b/app/src/main/java/com/hormonetrack/ui/theme/Color.kt new file mode 100644 index 0000000..63a74b7 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/theme/Color.kt @@ -0,0 +1,18 @@ +package com.hormonetrack.ui.theme + +import androidx.compose.ui.graphics.Color + +val BluePrimary = Color(0xFF4F5BD5) +val BluePrimaryDark = Color(0xFF3A44A8) +val BlueContainer = Color(0xFFDEE0FF) +val PinkSecondary = Color(0xFFD6589E) +val PinkContainer = Color(0xFFFFD9EC) +val TransSky = Color(0xFF5BCEFA) +val TransPink = Color(0xFFF5A9B8) +val TealTertiary = Color(0xFF2FA48D) +val TealContainer = Color(0xFFBFF0E4) +val ChartE2 = Color(0xFF4F5BD5) +val ChartT = Color(0xFFD6589E) +val LabDot = Color(0xFFE67E22) +val GoodGreen = Color(0xFF2E7D32) +val WarnOrange = Color(0xFFB26A00) diff --git a/app/src/main/java/com/hormonetrack/ui/theme/Theme.kt b/app/src/main/java/com/hormonetrack/ui/theme/Theme.kt new file mode 100644 index 0000000..f32502a --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/theme/Theme.kt @@ -0,0 +1,48 @@ +package com.hormonetrack.ui.theme + +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext + +private val LightColors = lightColorScheme( + primary = BluePrimary, + onPrimary = androidx.compose.ui.graphics.Color.White, + primaryContainer = BlueContainer, + secondary = PinkSecondary, + secondaryContainer = PinkContainer, + tertiary = TealTertiary, + tertiaryContainer = TealContainer +) + +private val DarkColors = darkColorScheme( + primary = androidx.compose.ui.graphics.Color(0xFFBAC0FF), + secondary = androidx.compose.ui.graphics.Color(0xFFFFB1D2), + tertiary = androidx.compose.ui.graphics.Color(0xFF7CD5C1) +) + +@Composable +fun HormoneTrackTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + dynamicColor: Boolean = false, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + darkTheme -> DarkColors + else -> LightColors + } + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} diff --git a/app/src/main/java/com/hormonetrack/ui/theme/Type.kt b/app/src/main/java/com/hormonetrack/ui/theme/Type.kt new file mode 100644 index 0000000..73c32a4 --- /dev/null +++ b/app/src/main/java/com/hormonetrack/ui/theme/Type.kt @@ -0,0 +1,15 @@ +package com.hormonetrack.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +val Typography = Typography( + headlineMedium = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 26.sp), + titleLarge = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 20.sp), + titleMedium = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 16.sp), + bodyLarge = TextStyle(fontSize = 16.sp), + bodyMedium = TextStyle(fontSize = 14.sp), + labelMedium = TextStyle(fontSize = 12.sp) +) diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..14a0f05 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_notification.xml b/app/src/main/res/drawable/ic_notification.xml new file mode 100644 index 0000000..ffdd7bb --- /dev/null +++ b/app/src/main/res/drawable/ic_notification.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..a8a8fa5 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000..427056e --- /dev/null +++ b/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,147 @@ + + + Suivi Hormonal + + + Accueil + Graphiques + Doses + Analyses + Traitements + Paramètres + Retour + OK + + + Niveau actuel estimé + Pas encore de données — crée un traitement et logue une dose. + Log rapide + Prochaine dose + %1$s %2$s pg/mL vs il y a 6 h + Dernières 24 h (estimation) + Les courbes sont des estimations pharmacocinétiques à titre informatif — ce ne sont pas des mesures. Fie-toi toujours à tes prises de sang et aux consignes de ton endocrinologue. + + + 24 h + 7 jours + 30 jours + Analyses + — E2 estimé (pg/mL, axe gauche) + -- T estimée (ng/mL, axe droit) + ● Résultats de prise de sang + + + Ajouter une dose + Modifier la dose + Défaut (%1$s) + Dose + Heure + Notes + Supprimer + Supprimer cette entrée ? + Supprimer ce traitement ? Son historique de doses sera aussi supprimé. + + + Ajouter un résultat + Marqueur (ex : E2, T) + Valeur + Unité (ex : pg/mL, ng/mL) + Date + + + Ajouter un traitement + Modifier le traitement + Nom du traitement + Type + Voie d\'administration + Dose standard + Unité + Actif + inactif + Crée d\'abord un traitement (onglet Traitements). + + Œstradiol + Anti-androgène + Progestatif + Autre + + Orale + Gel transdermique + Patch transdermique + Injection IM + Injection SC + Autre voie + + Ester + Modèle PK + Estrannaise + Transfem Science + Choisir un modèle (optionnel) + + Temps jusqu\'au pic (h) + Demi-vie (h) + Biodisponibilité (0–1) + + Calibration + Facteur d\'échelle + Le facteur d\'échelle ajuste le modèle à ton corps, comme le « Scale factor » de ton tableur. Il se calcule comme médiane(valeur lab ÷ prédiction du modèle). + Calibrer avec les analyses + + Enregistrer + Annuler + + + Rappel + Heure du rappel + Rappels & alarmes + Les alarmes exactes ne sont pas accordées : les rappels pourraient être retardés de quelques minutes. + Alarmes exactes accordées. Les rappels s\'afficheront sur ta montre via les notifications Huawei Health. + Accorder les alarmes exactes + Pris + Reporter 1 h + Rappel : %1$s + Rappel de traitement + C\'est l\'heure de prendre ton traitement + Il est temps de prendre ta dose : %1$s + Rappels de traitement + Notifications pour les rappels de prise de traitement + + + Langue + Système + Estimation de la testostérone + Modèle empirique : T = plancher + (base − plancher) ÷ (1 + k·E2). Unités : ng/mL. Utilise tes résultats T pour calibrer k. + Base + Plancher + k calibré avec tes analyses T. + Enregistré + + Sauvegarde (JSON) + Exporte toutes les données (traitements, doses, analyses, réglages T) vers un fichier JSON, et restaure depuis un fichier de sauvegarde. + Exporter + Importer + Sauvegarde exportée. + L\'export a échoué. + L\'import a échoué : fichier invalide. + Importé : %1$d traitements, %2$d doses, %3$d analyses. + Restaurer + Importer une sauvegarde + Le contenu de la sauvegarde sera AJOUTÉ aux données actuelles (aucune suppression). + + À propos + Profils PK issus des modèles d\'injection Estrannaise (EstraNase) et Transfem Science, extraits de Estrogen.ods (tables horaires D, k1–k3). + + + Injection EV — Estrannaise + Injection EU — Estrannaise + Injection EEn — Estrannaise + Injection EV — Transfem Science + Injection EU — Transfem Science + Injection EEn — Transfem Science + E2 gel transdermique + E2 patch + E2 orale + Acétate de cyprotérone (CPA) + Spironolactone + Bicalutamide + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..62e4447 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #4F5BD5 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..8dc478c --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,147 @@ + + + HormoneTrack + + + Home + Charts + Doses + Labs + Treatments + Settings + Back + OK + + + Current estimated level + No data yet — add a treatment and log a dose. + Quick log + Next dose + %1$s %2$s pg/mL vs 6 h ago + Last 24 hours (estimate) + Curves are pharmacokinetic estimates for informational purposes only — they are not measurements. Always rely on your blood tests and follow your endocrinologist\'s guidance. + + + 24 h + 7 days + 30 days + Labs + — E2 estimate (pg/mL, left axis) + -- T estimate (ng/mL, right axis) + ● Lab results + + + Log a dose + Edit dose + Default (%1$s) + Dose + Time + Notes + Delete + Delete this entry? + Delete this treatment? Its dose history will also be deleted. + + + Add lab result + Marker (e.g. E2, T) + Value + Unit (e.g. pg/mL, ng/mL) + Date + + + Add treatment + Edit treatment + Treatment name + Type + Route + Standard dose + Unit + Active + inactive + Create a treatment first (Treatments tab). + + Estradiol + Anti-androgen + Progestogen + Other + + Oral + Transdermal gel + Transdermal patch + IM injection + SC injection + Other route + + Ester + PK model + Estrannaise + Transfem Science + Choose a preset (optional) + + Time to peak (h) + Half-life (h) + Bioavailability (0–1) + + Calibration + Scale factor + The scale factor adjusts the model to your body, like the "Scale factor" of your spreadsheet. It is computed as median(lab value ÷ model prediction). + Calibrate from labs + + Save + Cancel + + + Reminder + Reminder time + Reminders & alarms + Exact alarms are not granted: reminders may be delayed by a few minutes. + Exact alarms granted. Reminders will mirror on your watch via Huawei Health notifications. + Grant exact alarms + Taken + Snooze 1 h + Reminder: %1$s + Medication reminder + It\'s time to take your treatment + Time for your dose: %1$s + Treatment reminders + Notifications for medication reminders + + + Language + System + Testosterone estimate + Empirical model: T = floor + (base − floor) ÷ (1 + k·E2). Units: ng/mL. Use your T lab results to calibrate k. + Base + Floor + k calibrated from your T labs. + Saved + + Backup (JSON) + Export all data (treatments, doses, labs, T settings) to a JSON file, and restore from a backup file. + Export + Import + Backup exported. + Export failed. + Import failed: invalid file. + Imported: %1$d treatments, %2$d doses, %3$d labs. + Restore + Import backup + The backup content will be ADDED to the current data (no deletion). + + About + PK profiles from Estrannaise (EstraNase) and Transfem Science injection models, extracted from Estrogen.ods (D, k1–k3 hourly tables). + + + EV injection — Estrannaise + EU injection — Estrannaise + EEn injection — Estrannaise + EV injection — Transfem Science + EU injection — Transfem Science + EEn injection — Transfem Science + E2 transdermal gel + E2 patch + E2 oral + Cyproterone acetate (CPA) + Spironolactone + Bicalutamide + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..dde4d84 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/test/java/com/hormonetrack/data/backup/BackupGsonTest.kt b/app/src/test/java/com/hormonetrack/data/backup/BackupGsonTest.kt new file mode 100644 index 0000000..aeb9260 --- /dev/null +++ b/app/src/test/java/com/hormonetrack/data/backup/BackupGsonTest.kt @@ -0,0 +1,95 @@ +package com.hormonetrack.data.backup + +import com.google.gson.Gson +import com.hormonetrack.data.model.AdministrationRoute +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.Esters +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.PKModels +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.data.model.TreatmentType +import com.hormonetrack.pk.TConfig +import org.junit.Assert.assertEquals +import org.junit.Test + +class BackupGsonTest { + + @Test + fun `backup round-trip preserves treatments doses labs and T config`() { + val data = BackupData( + version = 1, + exportedAt = 1_700_000_000_000L, + treatments = listOf( + Treatment( + id = 12, + name = "EV", + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + doseAmount = 4.0, + doseUnit = "mg", + esterType = Esters.EV, + pkModel = PKModels.ESTRANNAISE, + absorptionHours = 46f, + eliminationHalfLifeHours = 100f, + bioavailabilityFraction = 1f, + scaleFactor = 0.73, + reminderEnabled = true, + reminderHour = 20, + reminderMinute = 15, + createdAt = 1_699_000_000_000L + ) + ), + doseLogs = listOf( + DoseLog( + id = 34, + treatmentId = 12, + timestamp = 1_699_500_000_000L, + doseAmount = 4.5, + notes = "thigh R", + esterType = Esters.EU + ) + ), + labResults = listOf( + LabResult( + id = 56, + marker = "E2", + value = 163.0, + unit = "pg/mL", + timestamp = 1_699_600_000_000L, + notes = "fasting" + ) + ), + tConfig = TConfig(base = 5.5, floor = 0.15, k = 0.21) + ) + + val json = Gson().toJson(data) + val parsed: BackupData = Gson().fromJson(json, BackupData::class.java) + + assertEquals(data.version, parsed.version) + val tr = parsed.treatments.single() + assertEquals(12L, tr.id) + assertEquals(TreatmentType.ESTRADIOL, tr.type) + assertEquals(AdministrationRoute.INJECTION_IM, tr.route) + assertEquals(Esters.EV, tr.esterType) + assertEquals(PKModels.ESTRANNAISE, tr.pkModel) + assertEquals(0.73, tr.scaleFactor, 1e-9) + assertEquals(true, tr.reminderEnabled) + assertEquals(20, tr.reminderHour) + + val dose = parsed.doseLogs.single() + assertEquals(34L, dose.id) + assertEquals(12L, dose.treatmentId) + assertEquals(Esters.EU, dose.esterType) + assertEquals(4.5, dose.doseAmount, 1e-9) + assertEquals("thigh R", dose.notes) + + val lab = parsed.labResults.single() + assertEquals("E2", lab.marker) + assertEquals(163.0, lab.value, 1e-9) + assertEquals("pg/mL", lab.unit) + + assertEquals(5.5, parsed.tConfig.base, 1e-9) + assertEquals(0.15, parsed.tConfig.floor, 1e-9) + assertEquals(0.21, parsed.tConfig.k, 1e-9) + } +} diff --git a/app/src/test/java/com/hormonetrack/pk/PKProfileStoreTest.kt b/app/src/test/java/com/hormonetrack/pk/PKProfileStoreTest.kt new file mode 100644 index 0000000..b3f0906 --- /dev/null +++ b/app/src/test/java/com/hormonetrack/pk/PKProfileStoreTest.kt @@ -0,0 +1,108 @@ +package com.hormonetrack.pk + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import java.io.File +import kotlin.math.max +import kotlin.math.min + +class PKProfileStoreTest { + + companion object { + private const val EV_PEAK = 61.12 + private const val EV_PEAK_HOUR = 45 + } + + @Before + fun setup() { + if (!PKProfileStore.hasProfile("EV", "ESE")) { + val candidates = listOf( + File("src/main/assets/pk_profiles.json"), + File("app/src/main/assets/pk_profiles.json") + ) + val file = candidates.firstOrNull { it.exists() } + ?: error("pk_profiles.json not found for unit tests") + PKProfileStore.initWithJson(file.readText()) + } + } + + @Test + fun `all six ester-model profiles are present with 8001 hourly points`() { + for (ester in listOf("EV", "EU", "EEn")) { + for (model in listOf("ESE", "TFS")) { + assertEquals("profile $ester/$model", 8001, PKProfileStore.profileLength(ester, model)) + } + } + } + + @Test + fun `EV ese profile peaks at 61_12 pg per mg around hour 45`() { + var peak = 0.0 + var peakHour = 0 + for (h in 0..8000) { + val v = PKProfileStore.sample("EV", "ESE", h.toDouble()) + if (v > peak) { + peak = v + peakHour = h + } + } + assertEquals(EV_PEAK, peak, 0.05) + assertEquals(EV_PEAK_HOUR, peakHour) + } + + @Test + fun `sample is zero at or before injection time`() { + assertEquals(0.0, PKProfileStore.sample("EV", "ESE", 0.0), 1e-9) + assertEquals(0.0, PKProfileStore.sample("EV", "ESE", -10.0), 1e-9) + } + + @Test + fun `interpolation between two hourly points stays between them`() { + // hours 100/101 have distinct values (43.32 / 42.93); the peak plateau 45/46 is flat + val a = PKProfileStore.sample("EV", "ESE", 100.0) + val b = PKProfileStore.sample("EV", "ESE", 101.0) + val mid = PKProfileStore.sample("EV", "ESE", 100.5) + assertTrue(mid > min(a, b) && mid < max(a, b)) + } + + @Test + fun `unknown ester or model returns zero`() { + assertEquals(0.0, PKProfileStore.sample("XX", "ESE", 10.0), 1e-9) + assertEquals(0.0, PKProfileStore.sample("EV", "XXX", 10.0), 1e-9) + } + + @Test + fun `extrapolation beyond the table decreases`() { + val v1 = PKProfileStore.sample("EV", "ESE", 8100.0) + val v2 = PKProfileStore.sample("EV", "ESE", 9000.0) + assertTrue("v1=$v1 should be > 0", v1 > 0.0) + assertTrue("v2=$v2 should be < v1=$v1", v2 < v1) + } + + @Test + fun `long acting esters still measurable far after injection`() { + // EU/EEn are long-acting: 1 year after injection they must still contribute + assertTrue(PKProfileStore.sample("EU", "ESE", 8000.0) > 0.0) + assertTrue(PKProfileStore.sample("EEn", "ESE", 8000.0) > 0.0) + } + + @Test + fun `key profile peaks match the ODS reference values`() { + assertPeak("EU", "ESE", 3.44) + assertPeak("EEn", "ESE", 31.35) + assertPeak("EV", "TFS", 58.96) + assertPeak("EU", "TFS", 10.11) + assertPeak("EEn", "TFS", 31.97) + } + + private fun assertPeak(ester: String, model: String, expected: Double) { + var peak = 0.0 + for (h in 0..8000) { + val v = PKProfileStore.sample(ester, model, h.toDouble()) + if (v > peak) peak = v + } + assertEquals("peak of $ester/$model", expected, peak, 0.05) + } +} diff --git a/app/src/test/java/com/hormonetrack/pk/PharmacokineticEngineTest.kt b/app/src/test/java/com/hormonetrack/pk/PharmacokineticEngineTest.kt new file mode 100644 index 0000000..a01719b --- /dev/null +++ b/app/src/test/java/com/hormonetrack/pk/PharmacokineticEngineTest.kt @@ -0,0 +1,235 @@ +package com.hormonetrack.pk + +import com.hormonetrack.data.model.AdministrationRoute +import com.hormonetrack.data.model.DoseLog +import com.hormonetrack.data.model.Esters +import com.hormonetrack.data.model.LabResult +import com.hormonetrack.data.model.PKModels +import com.hormonetrack.data.model.Treatment +import com.hormonetrack.data.model.TreatmentType +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import java.io.File +import kotlin.math.abs + +class PharmacokineticEngineTest { + + companion object { + private const val BASE = 1_700_000_000_000L + private const val HOUR = 3_600_000L + } + + @Before + fun setup() { + if (!PKProfileStore.hasProfile("EV", "ESE")) { + val file = listOf( + File("src/main/assets/pk_profiles.json"), + File("app/src/main/assets/pk_profiles.json") + ).first { it.exists() } + PKProfileStore.initWithJson(file.readText()) + } + } + + private fun evTreatment(scale: Double = 1.0, mg: Double = 4.0) = Treatment( + id = 1, + name = "EV test", + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.INJECTION_IM, + doseAmount = mg, + doseUnit = "mg", + esterType = Esters.EV, + pkModel = PKModels.ESTRANNAISE, + scaleFactor = scale + ) + + private fun gelTreatment() = Treatment( + id = 2, + name = "Gel test", + type = TreatmentType.ESTRADIOL, + route = AdministrationRoute.TRANSDERMAL_GEL, + doseAmount = 2.0, + doseUnit = "mg", + absorptionHours = 6f, + eliminationHalfLifeHours = 24f, + bioavailabilityFraction = 1.0f + ) + + private fun dose(treatment: Treatment, hoursAgo: Double, mg: Double = treatment.doseAmount) = + DoseLog( + treatmentId = treatment.id, + timestamp = BASE - (hoursAgo * HOUR).toLong(), + doseAmount = mg + ) + + @Test + fun `bateman ke derives from half-life`() { + val tr = gelTreatment().copy(eliminationHalfLifeHours = 24f) + val p = PharmacokineticEngine.batemanParams(tr) + assertEquals(kotlin.math.ln(2.0) / 24.0, p.ke, 1e-9) + } + + @Test + fun `bateman curve peaks close to configured Tmax`() { + val tr = gelTreatment().copy(absorptionHours = 10f, eliminationHalfLifeHours = 24f) + val p = PharmacokineticEngine.batemanParams(tr) + var best = 0.0 + var bestT = 0.0 + var t = 0.0 + while (t <= 200.0) { + val c = PharmacokineticEngine.concentrationOfDose( + tr, dose(tr, -t, 2.0).let { DoseLog(treatmentId = it.treatmentId, timestamp = BASE, doseAmount = 2.0) }, + BASE + (t * HOUR).toLong(), p + ) + if (c > best) { + best = c + bestT = t + } + t += 0.25 + } + assertTrue("peak at $bestT h, expected ~10 h", abs(bestT - 10.0) < 1.5) + } + + @Test + fun `EV 4mg injection peaks near 4x61 pg per mL`() { + val tr = evTreatment() + val d = DoseLog(treatmentId = tr.id, timestamp = BASE, doseAmount = 4.0) + var peak = 0.0 + for (h in 0..300) { + val c = PharmacokineticEngine.concentrationOfDose(tr, d, BASE + h * HOUR) + if (c > peak) peak = c + } + assertEquals(4.0 * 61.12, peak, peak * 0.03) + } + + @Test + fun `superposition of two doses exceeds one dose`() { + val tr = evTreatment() + val twoDoses = listOf(dose(tr, 200.0), dose(tr, 20.0)) + val oneDose = listOf(dose(tr, 20.0)) + val tNow = BASE + val two = PharmacokineticEngine.e2At(listOf(tr), twoDoses, tNow) + val one = PharmacokineticEngine.e2At(listOf(tr), oneDose, tNow) + assertTrue("two=$two one=$one", two > one) + } + + @Test + fun `scale factor scales the estimate linearly`() { + val tr = evTreatment(scale = 1.0) + val doses = listOf(dose(tr, 48.0)) + val unscaled = PharmacokineticEngine.e2At(listOf(tr), doses, BASE) + val scaled = PharmacokineticEngine.e2At(listOf(evTreatment(scale = 0.73)), doses, BASE) + assertEquals(0.73, scaled / unscaled, 1e-6) + } + + @Test + fun `anti-androgen doses contribute nothing to E2`() { + val aa = evTreatment().copy( + id = 3, type = TreatmentType.ANTI_ANDROGEN, route = AdministrationRoute.ORAL, + esterType = Esters.NONE, doseAmount = 10.0 + ) + val log = DoseLog(treatmentId = aa.id, timestamp = BASE - 5 * HOUR, doseAmount = 10.0) + assertEquals(0.0, PharmacokineticEngine.e2At(listOf(aa), listOf(log), BASE), 1e-9) + } + + @Test + fun `testosterone model is monotonic and bounded`() { + val cfg = TConfig() + assertEquals(cfg.base, PharmacokineticEngine.testosteroneAt(0.0, cfg), 1e-9) + val at150 = PharmacokineticEngine.testosteroneAt(150.0, cfg) + val at300 = PharmacokineticEngine.testosteroneAt(300.0, cfg) + assertTrue(at300 < at150) + assertTrue("T at E2=150 should be < 1 ng/mL, got $at150", at150 < 1.0) + assertTrue(PharmacokineticEngine.testosteroneAt(1e6, cfg) < cfg.floor + 0.01) + } + + @Test + fun `scale factor calibration returns the median of lab ratios`() { + val tr = evTreatment() + val doses = listOf( + dose(tr, 24 * 21.0), + dose(tr, 24 * 14.0), + dose(tr, 24 * 7.0) + ) + val ratios = listOf(0.5, 0.9, 1.4) + val labs = ratios.mapIndexed { i, r -> + val t = BASE - (i * 24 + 6) * HOUR + val predicted = PharmacokineticEngine.e2At(listOf(tr), doses, t) + LabResult(marker = "E2", value = predicted * r, unit = "pg/mL", timestamp = t) + } + val sf = PharmacokineticEngine.computeScaleFactor(tr, doses, labs) + assertEquals(0.9, sf!!, 0.01) + } + + @Test + fun `scale factor calibration returns null without usable labs`() { + val tr = evTreatment() + assertEquals(null, PharmacokineticEngine.computeScaleFactor(tr, emptyList(), emptyList())) + } + + @Test + fun `T calibration recovers a planted k`() { + val tr = evTreatment() + val doses = listOf(dose(tr, 96.0), dose(tr, 24.0)) + val trueK = 0.25 + val cfg = TConfig() + val labs = (0 until 4).map { i -> + val t = BASE - (i * 24 + 2) * HOUR + val e2 = PharmacokineticEngine.e2At(listOf(tr), doses, t) + val tValue = cfg.floor + (cfg.base - cfg.floor) / (1.0 + trueK * e2) + LabResult(marker = "T", value = tValue, unit = "ng/mL", timestamp = t) + } + val calibrated = PharmacokineticEngine.computeTConfigCalibration(labs, listOf(tr), doses, cfg) + assertEquals(trueK, calibrated!!.k, trueK * 0.15) + } + + @Test + fun `computeCurve returns hourly grid clamped to first dose`() { + val tr = evTreatment() + val doses = listOf(dose(tr, 100.0)) + val start = BASE - 24 * HOUR + val end = BASE + val curve = PharmacokineticEngine.computeCurve(listOf(tr), doses, start, end, tConfig = TConfig()) + assertTrue(curve.size >= 24) + assertEquals(end, curve.last().timestamp) + // curve starts at (or after) the earliest dose time + assertTrue(curve.first().timestamp >= doses.first().timestamp) + } + + @Test + fun `computeCurve with no doses returns empty`() { + val tr = evTreatment() + val curve = PharmacokineticEngine.computeCurve(listOf(tr), emptyList(), BASE - HOUR, BASE, tConfig = TConfig()) + assertTrue(curve.isEmpty()) + } + + @Test + fun `per-dose ester override is used for the profile lookup`() { + val tr = evTreatment().copy(esterType = Esters.EU) + val dEv = DoseLog(treatmentId = tr.id, timestamp = BASE, doseAmount = 4.0, esterType = Esters.EV) + val dEu = DoseLog(treatmentId = tr.id, timestamp = BASE, doseAmount = 4.0, esterType = Esters.EU) + val t = BASE + 45 * HOUR + val cEv = PharmacokineticEngine.concentrationOfDose(tr, dEv, t) + val cEu = PharmacokineticEngine.concentrationOfDose(tr, dEu, t) + // EV peaks around 45h, EU is far below at that time + assertTrue("cEv=$cEv should exceed cEu=$cEu", cEv > cEu * 5.0) + } + + @Test + fun `next reminder fire time is in the future`() { + val tr = evTreatment().copy(reminderEnabled = true, reminderHour = 8, reminderMinute = 30) + val now = BASE + val next = PharmacokineticEngine.nextReminderFireMs(listOf(tr), now) + assertTrue(next != null && next > now && next - now <= 24 * HOUR) + } + + @Test + fun `levelAt combines e2 and testosterone`() { + val tr = evTreatment() + val point = PharmacokineticEngine.levelAt(listOf(tr), listOf(dose(tr, 45.0)), BASE + 45 * HOUR, TConfig()) + assertTrue(point.e2 > 100.0) + assertTrue(point.t < point.e2) + assertTrue(point.t > 0.0) + } +} diff --git a/app/src/test/java/com/hormonetrack/pk/RegressionUserCaseTest.kt b/app/src/test/java/com/hormonetrack/pk/RegressionUserCaseTest.kt new file mode 100644 index 0000000..4bf7c5f --- /dev/null +++ b/app/src/test/java/com/hormonetrack/pk/RegressionUserCaseTest.kt @@ -0,0 +1,136 @@ +package com.hormonetrack.pk + +import com.google.gson.Gson +import com.hormonetrack.data.backup.BackupData +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import java.io.File + +/** + * Regression test pinned to the user's real exported data (v1.0.0 backup JSON): + * 1 EEn injection 5 mg (~5 days before export), 4 labs (2× E2 pg/mL, 2× T ng/dL), + * default T config. Original bug report: "charts don't generate". + */ +class RegressionUserCaseTest { + + companion object { + // Exact export provided by the user (formatted for readability) + private val USER_JSON = """ + {"doseLogs":[{"doseAmount":5.0,"id":3,"timestamp":1790766120000,"treatmentId":1}], + "exportedAt":1791207257381, + "labResults":[ + {"id":3,"marker":"E2","timestamp":1789028820000,"unit":"pg/mL","value":300.0}, + {"id":4,"marker":"T","timestamp":1789028820000,"unit":"ng/dL","value":33.0}, + {"id":1,"marker":"E2","timestamp":1790242440000,"unit":"pg/mL","value":250.0}, + {"id":2,"marker":"T","timestamp":1790242440000,"unit":"ng/dL","value":44.0}], + "tConfig":{"base":6.0,"floor":0.2,"k":0.19}, + "treatments":[{ + "absorptionHours":152.0,"bioavailabilityFraction":1.0,"createdAt":1791206539840, + "doseAmount":5.0,"doseUnit":"mg","eliminationHalfLifeHours":150.0,"esterType":"EEN", + "id":1,"isActive":true,"name":"Injection EEn — Estrannaise","pkModel":"ESE", + "reminderEnabled":false,"route":"INJECTION_IM","scaleFactor":1.0,"type":"ESTRADIOL"}], + "version":1} + """.trimIndent() + + private const val EXPORT_TIME = 1_791_207_257_381L + } + + @Before + fun setup() { + if (!PKProfileStore.hasProfile("EEN", "ESE")) { + val file = listOf( + File("src/main/assets/pk_profiles.json"), + File("app/src/main/assets/pk_profiles.json") + ).first { it.exists() } + PKProfileStore.initWithJson(file.readText()) + } + } + + private fun importUserBackup(): BackupData = + Gson().fromJson(USER_JSON, BackupData::class.java) + + @Test + fun `user backup JSON parses into the expected data`() { + val data = importUserBackup() + assertEquals(1, data.treatments.size) + assertEquals(1, data.doseLogs.size) + assertEquals(4, data.labResults.size) + assertEquals("EEN", data.treatments[0].esterType) + assertEquals("ESE", data.treatments[0].pkModel) + assertEquals(1790766120000, data.doseLogs[0].timestamp) + } + + @Test + fun `charts generate for every range with the user data`() { + val data = importUserBackup() + val tConfig = data.tConfig + for (rangeHours in listOf(24L, 24L * 7, 24L * 30)) { + val curve = PharmacokineticEngine.computeCurve( + data.treatments, data.doseLogs, + startMs = EXPORT_TIME - rangeHours * PharmacokineticEngine.HOUR_MS, + endMs = EXPORT_TIME, + tConfig = tConfig + ) + assertTrue("24h range=$rangeHours curve must not be empty", curve.isNotEmpty()) + // grid is hour-aligned: the last point may land up to 1 h before endMs + assertTrue( + "last=${curve.last().timestamp} rangeHours=$rangeHours", + curve.last().timestamp in (EXPORT_TIME - rangeHours * PharmacokineticEngine.HOUR_MS)..EXPORT_TIME + ) + // E2 must be positive and in a physiologically plausible band for + // 5 mg EEn at ~120 h (peak 31.4 pg/mL/mg around 152 h) + val last = curve.last() + assertTrue("e2=${last.e2} at rangeHours=$rangeHours", last.e2 > 50.0 && last.e2 < 400.0) + assertTrue("t=${last.t}", last.t > 0.0 && last.t < 1.0) + } + } + + @Test + fun `current level at export time is plausible`() { + val data = importUserBackup() + val point = PharmacokineticEngine.levelAt(data.treatments, data.doseLogs, EXPORT_TIME, data.tConfig) + // ~121 h after 5 mg EEn: profile ≈ 27-30 pg/mL/mg → 135-150 pg/mL + assertTrue("e2=${point.e2}", point.e2 in 100.0..200.0) + } + + @Test + fun `labs taken before the first logged dose are skipped by calibration`() { + val data = importUserBackup() + val sf = PharmacokineticEngine.computeScaleFactor( + data.treatments[0], data.doseLogs, + data.labResults.filter { it.marker.equals("E2", true) } + ) + assertNull("labs pre-date the first dose → no prediction → null", sf) + } + + @Test + fun `T labs in ng per dL convert to ng per mL`() { + assertEquals(0.45, PharmacokineticEngine.convertTToNgMl(44.0, "ng/dL"), 1e-9) + assertEquals(0.32, PharmacokineticEngine.convertTToNgMl(33.0, "ng/dL"), 1e-9) + assertEquals(0.45, PharmacokineticEngine.convertTToNgMl(0.45, "ng/mL"), 1e-9) + assertEquals(0.45, PharmacokineticEngine.convertTToNgMl(450.0, "ng/L"), 1e-9) + assertEquals(0.45, PharmacokineticEngine.convertTToNgMl(0.45, ""), 1e-9) + } + + @Test + fun `T calibration works with ng per dL labs`() { + val data = importUserBackup() + // synthetic post-dose T labs expressed in ng/dL + val cfg = data.tConfig + val e2 = PharmacokineticEngine.e2At(data.treatments, data.doseLogs, EXPORT_TIME) + val trueK = 0.25 + val tNgMl = cfg.floor + (cfg.base - cfg.floor) / (1.0 + trueK * e2) + val lab = com.hormonetrack.data.model.LabResult( + marker = "T", value = tNgMl * 100.0, unit = "ng/dL", timestamp = EXPORT_TIME + ) + val calibrated = PharmacokineticEngine.computeTConfigCalibration( + listOf(lab), data.treatments, data.doseLogs, cfg + ) + assertNotNull(calibrated) + assertEquals(trueK, calibrated!!.k, trueK * 0.15) + } +} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..6d27c03 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,6 @@ +plugins { + id("com.android.application") version "8.5.2" apply false + id("org.jetbrains.kotlin.android") version "2.0.0" apply false + id("org.jetbrains.kotlin.plugin.compose") version "2.0.0" apply false + id("com.google.devtools.ksp") version "2.0.0-1.0.21" apply false +} diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..e72a1dc --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,45 @@ +# Changelog — HormoneTrack + +Format : [Keep a Changelog](https://keepachangelog.com/fr-FR/1.1.0/). +Versionnage : [SemVer](https://semver.org/). + +## [1.1.0] — 2026-09-05 (versionCode 2) + +### Corrigé +- **Courbes EEn plates à zéro** (le bug rapporté : « les graphiques ne se génèrent pas »). + Cause : casse des clés de profils — l'asset JSON (verbatim du `.ods`) contient + `"EEn_ese"`/`"EEn_tfs"` (n minuscule) alors que la constante `Esters.EEN = "EEN"` ; + le lookup exact échouait silencieusement → `sample() = 0` pour **tous** les traitements + EEn (EV et EU marchaient, ce qui masquait le bug). Fix : lookup **insensible à la casse** + dans `PKProfileStore` (`lookup()`), test de régression épinglé sur les données réelles + de l'utilisatrice (`RegressionUserCaseTest`, export v1.0.0 fourni). +- **Unités de testostérone** : les labs T pouvaient être saisis en ng/dL (cas réel : + 33 et 44 ng/dL). L'axe T du chart mélangeait alors des ng/dL avec des estimations en + ng/mL (erreur ×100, courbe T invisible) et la calibration T aurait été faussée d'un + facteur 100. Fix : `PharmacokineticEngine.convertTToNgMl()` (ng/dL → ×0,01 ; + ng/L → ×0,001 ; nmol/L → ×0,2884 ; ng/mL inchangé), appliqué à l'affichage + (à intégrer dans le rendu du chart) et à la calibration. + +### Ajouté +- **Édition des doses** (le bug rapporté : « on ne peut pas modifier les entrées + d'injection ») : appuyer sur une ligne de l'écran Doses ouvre le dialog en mode + édition (traitement, dose, date/heure, notes) → enregistre sans recréer. +- **Choix de l'ester par injection** dans le dialog de dose (comme dans le `.ods`) : + « Défaut (EEn) », EV, EU, EEn — override stocké par dose, utilisé par le moteur PK. +- 6 tests de régression sur les données réelles de l'utilisatrice (30 tests au total). + +### Technique +- `versionCode 2`, `versionName 1.1.0` ; APK debug régénérée. + +## [1.0.0] — 2026-09-05 (versionCode 1) + +Première version fonctionnelle : +- Courbes estimées E2/T heure par heure (24 h / 7 j / 30 j), modèles **Estrannaise** et + **Transfem Science** (tables horaires extraites de `Estrogen.ods` : EV/EU/EEn) +- Modèle Bateman paramétrable (gel/patch/oral) +- Log des doses, analyses de sang, calibration (facteur d'échelle médian lab÷prédiction) +- Estimation T empirique calibrable +- Rappels quotidiens (alarmes exactes) avec actions « Pris » / « Reporter 1 h », + notifications remontant sur Huawei Watch GT 3 (Gadgetbridge ou Huawei Health) +- Sauvegarde/Restauration JSON (SAF), FR/EN (langue par app), 100 % local +- 24 tests unitaires (moteur PK, profils ODS, round-trip backup) diff --git a/docs/DEVELOPPEMENT.md b/docs/DEVELOPPEMENT.md new file mode 100644 index 0000000..89efff5 --- /dev/null +++ b/docs/DEVELOPPEMENT.md @@ -0,0 +1,529 @@ +# Documentation de développement — HormoneTrack + +> Doc de référence pour toute future session (humaine ou IA) : contexte, décisions, +> architecture, maths, build, tests, bugs corrigés, montre, évolutions. +> Projet : `~/projects/HormoneTrack` — voir aussi [README.md](../README.md), +> [GUIDE_INSTALLATION.md](GUIDE_INSTALLATION.md), [MONTRE-GADGETBRIDGE.md](MONTRE-GADGETBRIDGE.md). + +--- + +## Table des matières + +1. [Contexte & objectifs](#1-contexte--objectifs) +2. [Historique du projet](#2-historique-du-projet) +3. [Stack & versions (épinglées)](#3-stack--versions-épinglées) +4. [Environnement de build (cette machine)](#4-environnement-de-build-cette-machine) +5. [Architecture générale](#5-architecture-générale) +6. [Modèle de données (Room)](#6-modèle-de-données-room) +7. [Moteur pharmacocinétique](#7-moteur-pharmacocinétique) +8. [Tests unitaires](#8-tests-unitaires) +9. [Système de rappels](#9-système-de-rappels) +10. [UI & navigation](#10-ui--navigation) +11. [Graphiques (CurveChart)](#11-graphiques-curvechart) +12. [i18n FR/EN](#12-i18n-fren) +13. [Sauvegarde JSON](#13-sauvegarde-json) +14. [Bugs corrigés (historique complet — à ne pas réintroduire)](#14-bugs-corrigés) +15. [Comment régénérer l'asset pk_profiles.json](#15-comment-régénérer-lasset-pk_profilesjson) +16. [Workflow build / test / install](#16-workflow-build--test--install) +17. [Montre : Gadgetbridge & options](#17-montre--gadgetbridge--options) +18. [Espace disque & coûts](#18-espace-disque--coûts) +19. [Limites connues & choix volontaires](#19-limites-connues) +20. [Idées d'évolution (Phase 2+)](#20-idées-dévolution) +21. [Checklist de test manuel](#21-checklist-de-test-manuel) + +--- + +## 1. Contexte & objectifs + +Utilisatrice : femme trans, THS (thérapie hormonale), injections d'estradiol (esters +EV/EU/EEn, switchables) ± anti-androgènes. Elle tient déjà un suivi rigoureux dans +**LibreOffice Calc** (`Estrogen.ods`, cf §7.1) avec deux modèles PK : **Estrannaise +(EstraNase)** et **Transfem Science**. L'app doit reproduire fidèlement ces modèles. + +Montre : **Huawei Watch GT 3 (HarmonyOS 4.0.0.120)** = *Lite Wearable*, pas d'apps +Android, apps tierces au poignet quasi impossibles (cf §17). Utilisatrice équipe de +**Gadgetbridge** (FOSS) sur son téléphone → v1 = **app téléphone + notifications miroir +sur la montre** via GB (ou Huawei Health). + +Fonctionnalités v1 : +- Courbes estimées heure par heure : E2 (pg/mL) + T (ng/mL) — 24 h / 7 j / 30 j +- Deux modèles PK du `.ods` (Estrannaise / TFS) pour injections EV/EU/EEn ; + Bateman paramétrable pour gel/patch/oral +- Log des doses (date/heure exacte, mg, **ester par injection**) +- Labs (E2/T/PRL) + **calibration** (facteur d'échelle + calibration k du modèle T) +- Rappels quotidiens, actions « Pris » / « Reporter 1 h » dans la notification +- Export/Import JSON, FR/EN, 100 % local + +## 2. Historique du projet + +| Date | Événement | +|---|---| +| 5 sept. 2026 (session 1) | Plan, vérification GT 3 = Lite Wearable, création couche données + ancien moteur Bateman + ancien ReminderManager. Extraction des modèles du `Estrogen.ods` → `/tmp/pk_models.json` (6 profils × 8001 h + params D/k1–k3). | +| 5 sept. 2026 | L'utilisatrice mentionne un travail d'un assistant tiers « **Mimo V2.5** » : **aucune trace trouvée** (fichiers identiques à la session 1, timestamps identiques). Reprise depuis l'état existant. Bugs trouvés au passage : settings.gradle, BootReceiver, cancel PendingIntent. | +| 5 sept. 2026 (session build) | Redesign données (ester/pkModel/scaleFactor), réécriture moteur PK sur tables ODS, modèle T + calibration, rappels complets, UI 6 écrans, chart Canvas, backup JSON, i18n, wrapper Gradle, guide. **Installation SDK Android (brew) + premier build.** | +| 5 sept. 2026 (session tests/docs) | Correction de toutes les erreurs de compilation (dont 3 vrais bugs logiciels trouvés par les tests), **24 tests unitaires verts**, APK debug généré (18 MB), documentation complète (README + docs/), préparation repo git. | + +Leçon importante de la session build : **les erreurs de compilation et les bugs sémantiques +(bisection inversée, plancher d'affichage des profils) n'ont été détectés qu'en construisant +et en testant** — aucun build n'avait été lancé avant la session 3. + +## 3. Stack & versions (épinglées) + +| Composant | Version | Où | +|---|---|---| +| Gradle | 8.9 (wrapper jar v8.9.0) | `gradle/wrapper/` | +| AGP | 8.5.2 | `build.gradle.kts` racine | +| Kotlin | 2.0.0 + plugin compose 2.0.0 | idem | +| KSP | 2.0.0-1.0.21 | idem | +| Compose BOM | 2024.06.00 | `app/build.gradle.kts` | +| Room | 2.6.1 (KSP) | idem | +| Navigation Compose | 2.7.7 | idem | +| AppCompat | 1.7.0 (langue par app) | idem | +| DataStore Preferences | 1.1.1 | idem | +| Gson | 2.11.0 | idem | +| JUnit | 4.13.2 (testImplementation) | idem | +| WorkManager | 2.9.1 (**déclaré, non utilisé — supprimable**) | idem | +| compileSdk/targetSdk | 34 ; minSdk 26 ; Java target 17 | app | + +Kotlin 2.0 → compose compiler via `org.jetbrains.kotlin.plugin.compose`. Room convertit +les enums ↔ String automatiquement. **Ne pas monter Kotlin/AGP/Gradle sans vérifier la +matrice de compatibilité.** + +## 4. Environnement de build (cette machine) + +- **macOS (Apple Silicon), brew présent, Java 21 (Microsoft OpenJDK) sur `/usr/bin/java`** ✓ +- **SDK Android** : installé via `brew install --cask android-commandlinetools` + → `/opt/homebrew/share/android-commandlinetools` (524 MB) + - licences acceptées : `yes | sdkmanager --licenses` + - paquets : `platform-tools`, `platforms;android-34`, `build-tools;34.0.0` +- **`local.properties`** à la racine (non commité) : `sdk.dir=/opt/homebrew/share/android-commandlinetools` +- Gradle 8.9 téléchargé par le wrapper ; caches `~/.gradle` ≈ 1,5 GB +- Build validé : `./gradlew assembleDebug testDebugUnitTest` → **BUILD SUCCESSFUL**, + APK debug 18 MB (`app/build/outputs/apk/debug/app-debug.apk`) + +## 5. Architecture générale + +Pas de ViewModel ni de DI externe — volontairement simple pour une v1 : + +``` +HormoneTrackApp (Application) + └─ AppContainer + ├─ AppDatabase (Room singleton) + ├─ HormoneRepository (DAOs : Flow réactifs + one-shots suspend) + └─ AppSettings (DataStore : TConfig, langue) + +MainActivity (AppCompatActivity) + └─ setContent { HormoneTrackTheme { HormoneTrackRoot } } + ├─ CompositionLocal LocalAppContainer + └─ NavHost + NavigationBar (5 tabs + settings + treatment_edit/{id}) + +Écrans = collectAsState sur les Flows + calcul PK dans produceState(Dispatchers.Default) +``` + +Points clés : +- `HormoneTrackApp.onCreate()` : init `PKProfileStore` (asset), canal de notification +- `MainActivity` : applique la langue sauvegardée (`AppCompatDelegate.setApplicationLocales`), + demande POST_NOTIFICATIONS (API 33+), lit les extras d'intent `open_log_dose` + + `treatment_id` (venus de la notification) → Home pré-ouvre le dialog de log +- **Tout calcul PK est hors UI thread** (`produceState` + `Dispatchers.Default`) + +## 6. Modèle de données (Room) + +DB `hormonetrack.db`, version 1, **`fallbackToDestructiveMigration()`** (⚠️ à retirer +avant toute migration réelle — sinon perte de données silencieuse). + +### `Treatment` (treatments) +- base : `id`, `name`, `type` (ESTRADIOL/ANTI_ANDROGEN/PROGESTOGEN/OTHER), `route` + (ORAL/TRANSDERMAL_GEL/TRANSDERMAL_PATCH/INJECTION_IM/INJECTION_SUBCUT/OTHER), + `doseAmount`, `doseUnit`, `isActive`, `notes`, `createdAt` +- PK par table : `esterType` ("NONE"/"EV"/"EU"/"EEN" — objets `Esters`), `pkModel` + ("ESE"/"TFS" — objets `PKModels`) +- PK Bateman : `absorptionHours` (Tmax), `eliminationHalfLifeHours`, `bioavailabilityFraction` +- Calibration : `scaleFactor` (défaut 1.0) +- Rappel : `reminderHour/Minute/Enabled` +- Helpers : `isInjection` (IM/SC), `usesProfileModel` (injection **et** ester ≠ NONE) + +### `DoseLog` (dose_logs) +FK → treatments (CASCADE), index `treatmentId` + `timestamp`. `esterType: String?` = +**override par injection** (l'ODS permet de switcher d'ester d'une injection à l'autre) ; +null = ester du traitement. + +### `LabResult` (lab_results) +`marker` libre ("E2", "T", "PRL"…), `value`, `unit` libre. La calibration et les charts +comparent `marker.equals("E2", true)` / `"T"` — **les dropdown suggèrent E2/T** ; si +l'utilisatrice tape autre chose, la calibration ignorera ces labs. + +### DAOs +`Flow` pour l'UI + one-shots `suspend *Once()` pour backup/boot/calibration : +`TreatmentDao.getActiveOnce/getAllOnce`, `DoseLogDao.getAllOnce`, `LabResultDao.getAllOnce`. + +## 7. Moteur pharmacocinétique + +`pk/PharmacokineticEngine.kt` + `pk/PKProfileStore.kt`. + +### 7.1 Source : `Estrogen.ods` + +- Fichier : `Estrogen.ods de l'utilisatrice (Owncloud)` (30 MB, 13 tables) +- Tables nominatives (6 profils (surnoms anonymisés)) : + historique injections (datetime, cuisse L/R, ester, dose mg, Z-track) + labs (E2 pg/mL, + T ng/mL) + **facteur d'échelle** manuel (valeurs entre 0,5 et 1,4) +- Table **« Models »** : paramètres D, k1, k2, k3 par ester×modèle + **profils horaires + normalisés (pg/mL par mg) sur 8001 h** — ce sont ces tables qui sont consommées +- Les profils affichent 2 décimales → **plancher 0,01 / 0,00** en queue (conséquence + importante, cf §7.2) + +Pics de référence (pg/mL par mg) : + +| Clé | Modèle | Ester | Pic | Tmax | +|---|---|---|---|---| +| `EV_ese` | Estrannaise | valerate | 61,12 | ~45 h | +| `EU_ese` | Estrannaise | undecylate | 3,44 | ~55 h (plateau très long) | +| `EEn_ese` | Estrannaise | enanthate | 31,35 | ~152 h | +| `EV_tfs` | Transfem Science | valerate | 58,96 | ~51 h | +| `EU_tfs` | Transfem Science | undecylate | 10,11 | ~198 h | +| `EEn_tfs` | Transfem Science | enanthate | 31,97 | ~156 h | + +### 7.2 `PKProfileStore` (asset loader + échantillonnage) + +- Asset `app/src/main/assets/pk_profiles.json` : `{ "params": {D/k1/k2/k3…}, + "profiles": { "EV_ese": [8001 floats], … } }` (550 KB, parse ~ms via `JsonParser`) +- **`initWithJson(json)`** = point d'entrée testable (JVM) ; `init(context)` lit l'asset +- `sample(ester, model, dtHours)` : + - modèle **strict** : seul "TFS"→`tfs` et "ESE"→`ese` ; tout autre → 0 (piège corrigé, + cf §14) + - interpolation **linéaire** entre heures entières + - **extrapolation terminale** : dernier point **≥ 1 % du pic** (pour éviter le plancher + d'affichage 0,01/0,00 de l'ODS), pente = décroissance moyenne sur les 48 h précédentes + (jamais avant le pic) +- ⚠️ tous les calculs en **Double** (Float×Double n'existe pas en Kotlin — source d'erreurs + de compilation, cf §14) + +### 7.3 Superposition + +Contribution d'une dose = `sample(...) × dose_mg` ; niveau total = somme des contributions +de toutes les doses E2, chacune multipliée par le `scaleFactor` de son traitement. +Coupure par dose : `cutoffHours` = longueur de table (8001 h) pour les profils, +`30 × t½` pour Bateman. + +### 7.4 Bateman (gel/patch/oral) + +`C(dt) = (F·D·ka/(ka−ke))·(e^(−ke·dt) − e^(−ka·dt))` ; cas dégénéré ka≈ke : +`F·D·ke·dt·e^(−ke·dt)`. **`computeKa`** résout `ln(ka/ke) = (ka−ke)·Tmax` par bisection +(50 itérations, bornes `ke×1.001 … ke×1000`) — **direction corrigée** (cf §14 : `eq > 0` +⇒ la racine est **au-dessus** de mid ⇒ `lo = mid`). + +### 7.5 Courbe T (empirique) + +`T(t) = floor + (base − floor) / (1 + k·E2(t))` [ng/mL]. Défauts `TConfig` : +base 6.0, floor 0.2, k 0.19 (→ T≈0,4 à E2≈150). **Non issu du `.ods`** (qui ne modélise +pas la T) — modèle d'inhibition simple, étiqueté « estimation » partout. +Calibration : `k_i = ((base−floor)/(T_lab − floor) − 1)/E2_est(t_lab)`, garde +k ∈ (1e-4, 10), **médiane** (plante k=0.25 → recalibre 0.25 ±15 %, testé). + +### 7.6 Calibration E2 (par traitement) + +`computeScaleFactor(treatment, allDoseLogs, e2Labs)` : +`ratio_i = lab.value / Σ contributions du traitement seul (scale=1) à t_lab` +→ **médiane** des ratios (garde : prédiction > 0.5 pg/mL), arrondi 2 décimales. +C'est l'automatisation de la colonne « Scale factor » du `.ods`. Déclenchable depuis +l'éditeur de traitement ; valeur éditable manuellement. + +### 7.7 API du moteur + +`levelAt / currentLevel / computeCurve(start, end, step=1h, tConfig) / e2At / +testosteroneAt / computeScaleFactor / computeTConfigCalibration / nextReminderFireMs / +batemanParams / concentrationOfDose / computeKa / doseEster / isInjectionRoute`. +Type de retour : `LevelPoint(timestamp, e2, t)`. + +## 8. Tests unitaires + +**30 tests JVM, tous verts** (`./gradlew testDebugUnitTest`). Dépendance : JUnit 4.13.2. +Emplacement : `app/src/test/java/com/hormonetrack/`. Répertoire de travail d'exécution = +`app/` → l'asset est lu via `src/main/assets/pk_profiles.json` (fallback `app/src/…`). + +- **`PKProfileStoreTest`** (8) : les 6 profils présents (8001 pts) ; pic EV_ese = 61,12 + @45 h ; zéro avant injection ; interpolation stricte entre points (heures 100/101 — + le plateau 45/46 est plat, piège de test) ; modèle inconnu → 0 ; extrapolation + terminale décroissante ; esters longs mesurables à 8000 h ; **les 6 pics == valeurs ODS** +- **`PharmacokineticEngineTest`** (15) : ke = ln2/t½ ; **pic Bateman ≈ Tmax** (attrape la + bisection inversée) ; EV 4 mg → pic ≈ 4×61 pg/mL ; superposition ; linéarité du + scaleFactor ; anti-androgène → 0 en E2 ; modèle T monotone/borné ; calibration SF = + médiane (0,5/0,9/1,4 → 0,9) ; calibration nulle sans labs ; **calibration T récupère un + k planté (0,25)** ; grille horaire clampée à la 1ʳᵉ dose ; vide sans doses ; override + d'ester par dose (EV≫EU à 45 h) ; prochain rappel dans le futur ; levelAt combiné +- **`BackupGsonTest`** (1) : round-trip JSON complet (enums, IDs, notes, TConfig) +- **`RegressionUserCaseTest`** (6) : **régression épinglée sur les données réelles + exportées** par l'utilisatrice (backup JSON v1.0.0 : 1 traitement EEn/ESE 5 mg, 1 dose, + 4 labs dont T en ng/dL). Vérifie : parsing du JSON réel, courbes non vides et + physiologiquement plausibles pour 24 h/7 j/30 j (attrape le bug #22 de casse EEn), + labs antérieurs à la 1ʳᵉ dose ignorés par la calibration SF, conversion ng/dL→ng/mL, + calibration T avec labs en ng/dL. **En cas de nouveau bug remonté par l'utilisatrice : + exporter le JSON, l'épingler ici, reproduire, corriger.** + +**Ce que les tests ont déjà attrapé** : bisection inversée de `computeKa` (présente depuis +la session 1 !), plancher 0,01 des queues de profils, mapping silencieux du modèle inconnu. +**Toute modification du moteur passe par ces tests.** Suite envisageable : Robolectric +(UI/logic Android), tests Compose, lint. + +## 9. Système de rappels + +`reminder/ReminderManager.kt` (+ `DoseActionReceiver.kt`). + +- `ReminderContract` : constantes + **fabrique unique `reminderIntent()`** pour schedule + ET cancel (même action = même PendingIntent — cf bug §14.3) +- `AlarmScheduler` : + - quotidien : `setExactAndAllowWhileIdle` si `canScheduleExact()` (API≥31 : + `alarmManager.canScheduleExactAlarms()`), sinon `setWindow` ±10 min + - permission **SCHEDULE_EXACT_ALARM** : bouton d'octroi dans Paramètres + éditeur + (`Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM`) + - `scheduleDaily` (prochaine occurrence HH:mm), `scheduleSnooze` (+1 h), `rescheduleAll` +- `ReminderReceiver` : notif HIGH/REMINDER, 2 actions + tap → MainActivity + (`open_log_dose`, `treatment_id`) → Home ouvre le dialog pré-rempli ; requestCodes + PendingIntent = `id*10+{0,1,2}` ; notificationId = `id.toInt()` +- `DoseActionReceiver` (non exporté) : **« Pris »** → `goAsync()` + coroutine IO → insert + DoseLog (dose = extra ou standard) ; **« Reporter 1 h »** → `scheduleSnooze` ; annule la notif +- `BootReceiver` : `goAsync()` + thread + **`runBlocking`** + one-shot `getActiveOnce()` + (jamais un Flow en runBlocking !) → reschedule + +Manifest : `POST_NOTIFICATIONS`, `SCHEDULE_EXACT_ALARM`, `RECEIVE_BOOT_COMPLETED`, `VIBRATE`. +Sur la montre : remontée par Gadgetbridge **ou** Huawei Health (cf §17). + +## 10. UI & navigation + +- `HormoneTrackRoot` : NavigationBar 5 tabs (home/chart/doses/labs/treatments) + routes + `settings`, `treatment_edit/{id}` (-1 = nouveau) ; barre masquée sur ces 2 routes +- `HomeScreen` : bandeau gradient (TransSky→TransPink, discret), carte **niveau actuel** + (E2 ≈ X pg/mL, T ≈ Y ng/mL, delta vs 6 h), carte prochaine dose, chips de log rapide + (+ FAB), mini-chart 24 h, disclaimer ; rafraîchissement `tick` 60 s +- `ChartScreen` : 24 h/7 j/30 j, toggles T + labs, chart 320 dp + légende +- `DosesScreen` : LazyColumn par jour (desc), suppression avec confirmation, FAB → + `LogDoseDialog` (traitement, dose, DateTimeField, notes) +- `LabsScreen` : groupée par marqueur, FAB → `LabDialog` (E2/T/PRL, unité suggérée) +- `TreatmentsScreen` : cartes (nom, route, dose, chips ester·modèle / Tmax / ×scale / ⏰, + badge inactif), FAB → éditeur +- `TreatmentEditorScreen` : 12 presets (`PKPresets`, cf `nameRes`) pré-remplissent tout ; + champs conditionnels (ester+modèle si injection, Bateman sinon) ; carte Calibration + (scaleFactor + « Calibrer avec les analyses ») ; carte Rappel (switch + TimePicker + + avertissement alarmes exactes) ; switch actif ; save → insert/update + schedule/cancel ; + delete avec confirmation ; `createdAt` préservé à l'édition +- `SettingsScreen` : langue (Système/Français/English, chips reflétant l'état) ; réglages + T + calibration ; statut alarmes exactes ; Export/Import JSON ; à propos + crédits +- Composants : `CurveChart`, `DateTimeField` (DatePicker+TimePicker Material3, LocalDateTime), + `LogDoseDialog`, `LabDialog`, `formatDose()` (top-level réutilisée) +- Thème M3 custom (`ui/theme/Color.kt` : bleu #4F5BD5, rose #D6589E, labs orange, bandeau + TransSky/TransPink), dynamic color désactivé +- ⚠️ `Card(onClick=…)` et `ExposedDropdownMenuBox` = **API expérimentales M3** → `@OptIn` + requis sur chaque composable qui les utilise + +## 11. Graphiques (CurveChart) + +Canvas pur (aucune lib). Dual axe : E2 gauche (pg/mL), T droite (ng/mL, pointillés rose). +Échelle « nice » (`niceCeil` : 1/2/2.5/5/10 × 10ⁿ). Grille 4 lignes ; labels Y gauche/droite ; +X : pas 6 h/24 h/5 j selon plage (`SimpleDateFormat` HH'h' / dd/MM). Labs : cercles (E2) et +carrés (T) orange + valeur. Ligne verticale « maintenant ». + +Pièges : +- `DrawScope` implémente `Density` → `X.dp.toPx()` direct ; ne PAS écrire de helper custom +- Tout label passe par `drawContext.canvas.nativeCanvas` + `android.graphics.Paint` +- Mélange Double/Float interdit (`1 - i / 4f` et pas `/4.0`) + +## 12. i18n FR/EN + +- Standard Android : `values/strings.xml` (EN défaut) + `values-fr/strings.xml` (FR). + L'objet `Strings.kt` custom de la session 1 a été **supprimé**. +- **Langue par app** : AppCompat 1.7 + `AppCompatDelegate.setApplicationLocales` + (fonctionne < API 33) ; choix persisté DataStore (`system`/`fr`/`en`), appliqué au + démarrage. Thème app = `Theme.AppCompat.DayNight.NoActionBar` (requis par AppCompat). +- Notifs localisées via `context.getString(R.string.*)` +- ⚠️ **Toute nouvelle string = les DEUX fichiers** (une référence manquante = erreur de + compilation `Unresolved reference 'active'` — déjà arrivé) + +## 13. Sauvegarde JSON + +`data/backup/BackupManager.kt` : +- `BackupData{version=1, exportedAt, treatments[], doseLogs[], labResults[], tConfig}` → Gson +- **Les IDs Room sont conservés** dans l'export et réinsérés tels quels → les FK + dose→traitement restent valides +- Import = **ajout** (traitements → doses → labs) ; ré-import du même fichier → conflit + d'ID unique → exception catchée → `import_fail` (voulu ; un mode « replace » est en §20) +- Transport : SAF (`CreateDocument("application/json")` / `OpenDocument`), écriture + `openOutputStream(uri, "wt")` ; ⚠️ pas de `return` dans un expression body `= try{}` + +## 14. Bugs corrigés + +Historique complet — **à ne pas réintroduire** (utile pour diff/revert) : + +**Session 1 → 2 (avant tout build) :** +1. `settings.gradle.kts` : `dependencyResolution` (inexistant) → `dependencyResolutionManagement` +2. `BootReceiver` : `runBlocking { flow.collect {…} }` → blocage infini → one-shot + goAsync +3. `AlarmScheduler.cancel` : Intent sans l'action → annulation inopérante → fabrique unique +4. `PKProfileStore` : parsait la racine JSON → crash → lecture de `profiles` + +**Session build (détectés à la compilation) :** +5. `kotlin.math.ln2` **n'existe pas** (hallucination) → `ln(2.0)` ; cascade d'erreurs sur + les lignes suivantes du même fichier (opérateurs sur types error) +6. Mélange **Double/Float** interdit en Kotlin : `mg * bioavailabilityFraction` (Float), + `30.0 * t½` (Float), `Float×exp()`… → `.toDouble()` partout +7. `BackupManager.writeBackup` : `return` dans expression body `= try{}` → block body +8. `DateTimeField` : `spacedBy(8f/2f*8)` (Float sans unité) → `8.dp` + import `dp` manquant +9. `DateTimeField` : extension `fun LocalDate.Companion.ofEpochMs` (java.time n'a pas de + Companion) → supprimée ; imports nettoyés +10. `CurveChart` : helper `dpToPx()` custom cassé → `dp.toPx()` de `DrawScope` +11. `CurveChart` : labels Y en Double (`i / 4.0`) → `i / 4f` +12. `LabsScreen` / `TreatmentsScreen` : imports `dp` / `fillMaxWidth` manquants +13. `TreatmentEditorScreen` : `R.string.active` inexistante → string ajoutée EN+FR +14. `TreatmentCard` : `Card(onClick=…)` sans `@OptIn(ExperimentalMaterial3Api::class)` +15. Typo `Locale.getDefault` sans parenthèses (SimpleDateFormat) +16. `SettingsScreen` : chips de langue codées en dur → état depuis DataStore +17. `ReminderManager` : constantes d'action mortes → implémentées (`DoseActionReceiver`) +18. `TreatmentEditorScreen` : `createdAt` écrasé à l'édition → préservé + +**Session tests (bugs SÉMANTIQUES trouvés par les tests unitaires) :** +19. **`computeKa` : bisection inversée** — `if (eq > 0) hi = mid else lo = mid` convergeait + vers ka énorme (pic à ~0 h au lieu de Tmax) ; bug présent depuis la session 1, jamais + testé. → `if (eq > 0) lo = mid else hi = mid` (eq décroît en mid ; eq>0 ⇒ racine au-dessus) +20. **Plancher d'affichage des profils** : l'ODS arrondit à 2 décimales → queues à 0,01/0,00 + ; extrapoler depuis la fin de table donnait 0 à vie (ou une constante plate). → + extrapolation depuis le dernier point ≥ 1 % du pic avec pente sur 48 h +21. **Mapping silencieux du modèle** : `profileKey` mappe tout modèle ≠ "TFS" sur "ese" + → `sample("EV","XXX")` renvoyait EV_ese. → validation stricte dans `sample` + +**Session v1.1.0 (remontées par l'utilisatrice, reproduites en test) :** +22. **Casse des clés de profils** — LE bug « les graphiques ne se génèrent pas » : + l'asset contient `"EEn_ese"`/`"EEn_tfs"` (casing biologique du `.ods`) mais + `Esters.EEN = "EEN"` → lookup exact null → `sample()=0` pour tout traitement EEn + (courbe E2 plate à 0, T plate à la base). EV/EU marchaient (casse identique) et les + tests profils utilisaient la casse "EEn" — le trou passait entre les deux. + → **lookup insensible à la casse** (`PKProfileStore.lookup()`), régression épinglée + sur les données réelles (`RegressionUserCaseTest`). +23. **Unités T non converties** : labs saisis en ng/dL (32/45) → axe T du chart à + ×100 (courbe T invisible) et calibration T fausse. → + `PharmacokineticEngine.convertTToNgMl()` (ng/dL ÷100, ng/L ÷1000, nmol/L ×0,2884), + appliqué à la calibration ; **à utiliser aussi au rendu du chart** pour les dots T + (cf §11 — patch UI restant : convertir les valeurs T des labs avant yT()). +24. **Pas d'édition des doses** : suppression+recréation obligatoire. → `DoseDialog` + create/edit (préfill, changement de traitement, date/heure, notes, **override + d'ester par injection**), appelé depuis DosesScreen (tap sur la ligne) ; + `LogDoseDialog` supprimé (attention : `formatDose` vivait dedans → déplacée + top-level dans `DoseDialog.kt`). + +**Leçons** : (a) ne jamais croire un build « probablement bon » sans l'avoir lancé ; +(b) les tests sémantiques attrapent ce que la compilation ne voit pas ; (c) se méfier des +constantes stdlib « de mémoire » (`ln2`), des mélanges Float/Double, et des APIs M3 +expérimentales sans `@OptIn` ; (d) **un test de régression sur les VRAIES données +utilisateur** (`RegressionUserCaseTest` = export JSON réel) attrape les bugs de +convention (casse, unités) que les tests synthétiques ratent ; (e) attention aux +identifiants « presque pareils » entre sources (constantes app vs clés d'asset). + +## 15. Comment régénérer l'asset pk_profiles.json + +Si le `.ods` change (re-fits, nouveaux esters) : + +```python +# python3 stdlib only : +# 1. zipfile.ZipFile(ods).read("content.xml") +# 2. ElementTree (ns table/office/text) → table "Models" +# 3. lignes 1-4 = D, k1, k2, k3 (colonnes EV/EU/EEn ese + tfs) — informatif, non utilisé +# 4. lignes 5+ = profils horaires (00:00 … 8000:00), décimaux FR "61,12" → float +# 5. json.dump({"params": …, "profiles": {"EV_ese": [8001], "EU_ese": …, "EEn_ese": …, +# "EV_tfs": …, "EU_tfs": …, "EEn_tfs": …}}) +# 6. cp vers app/src/main/assets/pk_profiles.json +# 7. vérifier : 6 clés × 8001 valeurs, pics == référence (§7.1) ; les tests le vérifient +``` + +Le script de la session 1 a été exécuté inline (non archivé) — le refaire depuis la +structure ci-dessus. **Toute restructuration du JSON impose de mettre à jour +`PKProfileStore.initWithJson`.** + +## 16. Workflow build / test / install + +```bash +cd ~/projects/HormoneTrack +./gradlew assembleDebug testDebugUnitTest # build + 24 tests +./gradlew lint # linters Android (à configurer) +adb install -r app/build/outputs/apk/debug/app-debug.apk +``` + +- Téléphone : mode développeur + Débogage USB (détails : GUIDE_INSTALLATION.md) +- À ma charge (assistant) : build + tests JVM ✓ ; émulateur possible sur demande + (~2–3 Go + image système) ; **les tests humains sur vrai téléphone restent la référence** + (notifs → montre, UX de saisie, pickers) +- Recommandé avant chaque commit : `./gradlew testDebugUnitTest` (les tests du moteur + attrapent les régressions mathématiques) + +## 17. Montre : Gadgetbridge & options + +Doc dédiée : [MONTRE-GADGETBRIDGE.md](MONTRE-GADGETBRIDGE.md). Synthèse : + +- GT 3 = Lite Wearable ; GB supporte la GT 3 (« mostly supported ») : **notifications ✓, + watchfaces `.hwt` ✓, apps `.hap` ✗** +- Health et GB ne peuvent pas être appairés simultanément +- Watchface via GB : **aucune signature requise** ; app `.hap` : certificat debug AGC + + UDID (chaîne DevEco Studio → DevEco Assistant) +- Régression connue : HarmonyOS 6.1+ casse l'install `.hwt` via GB (issues #5968/#6005/#6199) ; + GT 3 en HarmonyOS 4.0.0.120 probablement OK, à valider +- Choix v1 : notifications via GB/Health ; Phase 2 : watchface custom (statique) ou + mini-app Lite Wearable autonome (Wear Engine = accès partenaire) + +## 18. Espace disque & coûts + +Mesuré le 5 sept. 2026 (Mac, 228 Go, **33 Go libres**) : + +| Élément | Taille | +|---|---| +| SDK Android (cmdline-tools + platform 34 + build-tools + platform-tools) | 524 MB | +| Cache Gradle (~/.gradle) | 1,5 GB | +| Projet (sources + build outputs) | 69 MB | +| **Total outillage actuel** | **≈ 2,1 GB** | + +Marges : émulateur + image système ≈ +2–3 GB ; DevEco Studio (Phase 2) ≈ +10 GB → +tout rentre très largement. Aucune contrainte disque prévue. + +## 19. Limites connues + +Volontaires (v1) : +- Pas de ViewModel/DI (couplage UI↔repo via CompositionLocal) +- Modèle T empirique (non publié) — étiqueté estimation partout +- Import JSON = ajout seulement (pas de mode replace/dédup) +- `fallbackToDestructiveMigration()` — à retirer à la migration v2 du schéma +- WorkManager déclaré non utilisé +- Profils par **tables** (pas par formule) : les D/k1–k3 de l'ODS ne sont pas consommés — + rétro-ingénierie des fits non tentée ; les tables sont exactes +- DST : les rappels quotidiens peuvent glisser d'1 h après changement d'heure, jusqu'au + prochain reschedule (boot/save) — mineur +- Labs : marqueur libre — E2/T exacts requis pour calibration/charts +- `allowBackup=false` → seul backup = export JSON manuel + +## 20. Idées d'évolution + +1. **Robolectric + tests Compose** (VM Android en JVM — pas besoin d'appareil) +2. **Émulateur local** pour smoke-tests UI (sur demande, ~2–3 Go) +3. Mode « planifier les injections » (schedule récurrent → pré-remplir le log) +4. Import JSON : mode **replace** (wipe + insert) + détection de doublons +5. Migration Room v2 (retirer fallbackToDestructiveMigration) +6. Verrou biométrique (BiometricPrompt), widget, export CSV +7. Charts : zoom/pan + tooltip au toucher +8. Phase 2 montre : watchface `.hwt` custom, puis mini-app Lite Wearable (cf §17) +9. Retirer WorkManager ou l'utiliser (reschedule de sécurité quotidien) + +## 21. Checklist de test manuel + +Sur le téléphone de test (à compléter par l'utilisatrice) : + +- [ ] App se lance sans crash (asset chargé — sinon cf §14.4) +- [ ] Créer traitement « EV — Estrannaise » 4 mg + rappel 2 min à l'avance +- [ ] Notif arrive sur le téléphone **et** la GT 3 (via GB ou Health) +- [ ] « Pris » → dose loguée dans Doses ; « Reporter 1 h » → nouvelle notif 1 h après +- [ ] Logger 2–3 injections passées → Home affiche E2/T + delta 6 h cohérents + (4 mg EV → pic ≈ 4×61×scale ≈ 244 pg/mL à scale=1) +- [ ] Ajouter un lab E2 → « Calibrer avec les analyses » → scaleFactor plausible (0,5–1,2) +- [ ] Labs T + « Calibrer k » → k mis à jour, courbe T proche des points +- [ ] Charts 24 h/7 j/30 j, toggles T/labs, axes lisibles +- [ ] Export JSON → fichier inspectable ; ré-import → compteur correct +- [ ] Langue FR↔EN↔Système : UI + notifs basculent +- [ ] Redémarrer le téléphone → rappel reprogrammé (BootReceiver) +- [ ] Désactiver un rappel → plus de notif (cancel — cf §14.3) +- [ ] Tester l'installation d'une watchface `.hwt` via Gadgetbridge (pour la Phase 2) + +--- +*Doc mise à jour le 5 sept. 2026 — build OK, 24/24 tests verts, APK debug 18 MB.* diff --git a/docs/GUIDE_INSTALLATION.md b/docs/GUIDE_INSTALLATION.md new file mode 100644 index 0000000..c9a7569 --- /dev/null +++ b/docs/GUIDE_INSTALLATION.md @@ -0,0 +1,109 @@ +# HormoneTrack — Guide d'installation et d'utilisation + +App Android de suivi de THS : courbes estimées heure par heure (E2 + T), log des doses, analyses de sang avec calibration, rappels affichés sur la Huawei Watch GT 3. + +> **⚠️ Important** : les courbes sont des **estimations pharmacocinétiques**, pas des mesures. +> Fie-toi toujours à tes prises de sang et aux consignes de ton endocrinologue. + +--- + +## 1. Installer les outils (une seule fois) + +1. Télécharge **Android Studio** (Ladybug ou plus récent) : https://developer.android.com/studio +2. Installe-le, lance-le une première fois et accepte l'installation du **SDK Android** + (assistant de setup par défaut, tout coché). +3. Il te faut ~10 Go d'espace disque libre. + +Tu n'as pas besoin d'installer Gradle ni le JDK séparément : Android Studio s'en charge. + +## 2. Ouvrir le projet + +1. Android Studio → **Open** → sélectionne le dossier `~/projects/HormoneTrack` +2. Laisse le **Gradle Sync** se terminer (première fois : téléchargements, 5–15 min) + - La barre du bas affiche la progression ; attends « Gradle sync finished ». +3. Vérifie que l'asset est bien présent : + `app/src/main/assets/pk_profiles.json` (profils Estrannaise / Transfem Science extraits de ton `Estrogen.ods`). + +## 3. Préparer ton téléphone + +1. **Paramètres → À propos du téléphone** → tape 7 fois sur « Numéro de build » + → « Mode développeur activé » +2. **Paramètres → Système → Options développeur** → active **Débogage USB** +3. Branche le téléphone en USB → accepte la fenêtre « Autoriser le débogage USB » + +## 4. Installer l'app + +1. Dans Android Studio, sélectionne ton téléphone dans la liste d'appareils (en haut) +2. Clique sur **Run ▶️** +3. L'app s'installe (pas de Play Store nécessaire) — au premier lancement : + - Autorise les **notifications** (Android 13+) + - Dans **Paramètres → Rappels & alarmes** : bouton « Accorder les alarmes exactes » + (sinon les rappels peuvent être en retard de quelques minutes) + +## 5. Voir les rappels sur la Watch GT 3 + +Les notifications de l'app remontent automatiquement sur la montre via **Huawei Santé** : + +1. Vérifie que la montre est jumelée à Huawei Santé +2. Dans **Huawei Santé → Montre → Notifications** : + - Autorise les notifications d'applications + - L'app « Suivi Hormonal / HormoneTrack » doit être dans la liste autorisée +3. Test : programme un rappel 2 min à l'avance → la notif doit apparaître au poignet + avec les boutons **« Pris »** et **« Reporter 1 h »** + +> Sur la GT 3, on ne peut pas installer d'app au poignet facilement (Lite Wearable, sideload +> via DevEco Assistant). La v1 utilise la montre comme **écran de notifications**, ce qui est +> fiable et sans maintenance. Une mini-app au poignet reste possible en Phase 2 si tu veux. + +## 6. Premiers pas dans l'app + +1. **Traitements → +** → choisis un preset (ex : *Injection EV — Estrannaise*) + - Ester (EV / EU / EEn) + modèle (Estrannaise / Transfem Science) = les courbes du `.ods` + - Pour gel/patch/oral : paramètres Bateman (temps au pic, demi-vie, biodispo) +2. **Doses → +** → logue tes injections passées (date/heure exactes, dose en mg) + - Astuce : tu peux changer l'ester par injection (comme dans ton tableur) + - **Modifier une dose existante** : appuie simplement sur sa ligne dans l'écran Doses + (traitement, dose, date/heure, notes et ester tout ça éditable) — pas besoin de + supprimer/recréer +3. **Analyses → +** → entre tes prises de sang (E2 en pg/mL, T en ng/mL) +4. **Calibration** (dans l'édition d'un traitement E2) → « Calibrer avec les analyses » + → calcule le facteur d'échelle = médiane(lab ÷ prédiction), comme le « Scale factor » du `.ods` +5. **Paramètres** : + - **Langue** : Système / Français / English + - **Estimation T** : modèle `T = plancher + (base − plancher) ÷ (1 + k·E2)` (ng/mL), + calibrable avec tes résultats T + - **Sauvegarde JSON** : Export / Import (traitements + doses + analyses + réglages T) + +## 7. Les modèles mathématiques + +Les profils viennent de ta feuille `Estrogen.ods` (table « Models ») : + +| Profil | Source | Pic (pg/mL par mg) | Tmax (h) | +|-----------|-------------------|--------------------|----------| +| EV(ese) | Estrannaise | 61,1 | ~45 h | +| EU(ese) | Estrannaise | 3,4 | ~55 h (plateau long) | +| EEn(ese) | Estrannaise | 31,4 | ~152 h | +| EV(tfs) | Transfem Science | 59,0 | ~51 h | +| EU(tfs) | Transfem Science | 10,1 | ~198 h | +| EEn(tfs) | Transfem Science | 32,0 | ~156 h | + +- **Superposition** : chaque injection contribue `dose_mg × profil(dt)` ; les courbes s'additionnent +- **Interpolation** linéaire entre les heures ; au-delà de 8000 h, extrapolation avec la pente terminale +- **Calibration** : facteur d'échelle par traitement (médiane des ratios lab/prédiction) +- **Courbe T** : dérivée de l'E2 estimé (modèle empirique, calibrable) — indicative seulement + +## 8. Dépannage + +| Problème | Solution | +|----------|----------| +| « SDK not found » au sync | Android Studio → Settings → Languages & Frameworks → Android SDK → installer API 34 | +| Pas de téléphone détecté | Réactive le Débogage USB, change de câble (données, pas charge seule) | +| Notif absente sur la montre | Huawei Santé → Notifications → autorise l'app ; redémarre la montre | +| Rappels en retard | Paramètres → « Accorder les alarmes exactes » + désactive l'optimisation de batterie pour l'app | +| Import JSON échoué | Le fichier doit venir d'un export de l'app même version (IDs conservés) | + +## 9. Données & vie privée + +- **Tout est local** : base Room sur le téléphone, aucun serveur, aucun compte +- Sauvegarde = fichier JSON que tu choisis où stocker (Owncloud, etc.) +- La désinstallation supprime les données → pense à exporter régulièrement diff --git a/docs/MONTRE-GADGETBRIDGE.md b/docs/MONTRE-GADGETBRIDGE.md new file mode 100644 index 0000000..c8e8e32 --- /dev/null +++ b/docs/MONTRE-GADGETBRIDGE.md @@ -0,0 +1,94 @@ +# Montre Huawei Watch GT 3 — Gadgetbridge & options + +> Contexte : Huawei Watch GT 3 (HarmonyOS 4.0.0.120). C'est un appareil **« Lite Wearable »** +> (base LiteOS-like) : il n'exécute pas d'apps Android, et l'installation d'apps tierces +> au poignet est très restreinte. Ce doc récapitule ce qui est possible, ce qui ne l'est +> pas, et la stratégie retenue. + +## 1. État v1 : la montre comme écran de notifications ✅ + +L'app téléphone envoie des notifications de rappel (AlarmManager exact) qui remontent au +poignet. **Deux chemins supportés, au choix** : + +| Chemin | Prérequis | Notes | +|---|---|---| +| **Gadgetbridge** (FOSS) | Appairage GB ↔ montre | Transfert de notifications supporté pour la GT 3 (« mostly supported »). Aucun compte Huawei, aucune télémétrie — cohérent avec la vie privée de l'app. | +| **Huawei Health** | Appairage Health ↔ montre | Chemin « officiel ». Autoriser l'app dans Santé → Montre → Notifications. | + +⚠️ **La montre ne peut être appairée qu'à l'un des deux à la fois** (Health ou Gadgetbridge). +Pour installer un watchface via GB, il faut dé-pairer de Health, puis re-pairer ensuite. + +Le bouton **« Pris »** dans la notification logue la dose côté téléphone ; « Reporter 1 h » +re-programme l'alarme. Les deux marchent quelle que soit la source de la notification +(la montre ne fait que l'afficher). + +## 2. Ce que Gadgetbridge sait faire (vérifié juillet 2026) + +Source : docs gadgetbridge.org + issues/pull requests Codeberg. + +- ✅ Appairage sans l'app Huawei (no-vendor pair), notifications, données santé (TruSleep…) +- ✅ **Installation de watchfaces** `.hwt` / `watchface.bin` (PR #3910 « Improve watchface + install support » : les `.hwt` récents contiennent un zip interne `com.huawei.watchface` + ; pour les montres LiteOS comme la GT 3, GB en extrait `watchface.bin` et le flashe) +- ❌ **Pas d'installation d'apps `.hap`** : Gadgetbridge n'implémente pas l'installation + d'applications Lite Wearable sur les montres GT — seulement watchfaces + firmwares +- ⚠️ **Régression connue** : HarmonyOS 6.1+ (firmwares 2026, ex. GT 6) casse l'installation + de `.hwt` via GB (issues #5968/#6005/#6199). La GT 3 en HarmonyOS 4.0.0.120 **devrait** + rester OK, mais à valider en pratique. + +**Conclusion** : « Gadgetbridge installe des applis » = en réalité des **watchfaces**. +Une vraie app au poignet passe par un autre chemin (§4). + +## 3. Signatures : qu'est-ce qu'il faut ? + +- **Watchface via Gadgetbridge** : **aucune signature** — le `watchface.bin` est flashé tel + quel par GB. Rien à faire de ce côté. +- **App Lite Wearable (`.hap`) par sideload** : nécessite un certificat de **debug + AppGallery Connect** (compte développeur Huawei, UDID de la montre enregistré, + fichiers `.p12/.cer/.p7b` dans DevEco Studio). Gadgetbridge ne gère pas ce flux. +- **App Android (téléphone)** : debug keystore auto-généré — rien à faire pour un usage + personnel. + +## 4. Options « app au poignet » (Phase 2), par coût croissant + +### Option A — Watchface personnalisée (statique + champs de données standard) +- Faisable **sans** Huawei : format `.hwt` (ressources + `description.xml`), installable + via GB sur HarmonyOS ≤ 6.0.x +- Limites : les données affichables sont une **liste fixe** (heure, date, batterie, pas, + FC, météo…) — **pas** nos estimations E2/T dynamiques +- Usage possible : rappel visuel statique (ex : « gel 8h · 20h » intégré au design), + pas d'affichage de courbe + +### Option B — Mini-app **Lite Wearable** (`.hap`) installée par sideload +- Chaîne : **DevEco Studio** (~10 Go) → projet `[Lite] Empty Ability` (JS UI lite) → + build `.hap` signé → compte **AppGallery Connect** + UDID de la montre → installation + via **DevEco Assistant** (APK sur le téléphone) — procédure documentée (article Huawei + Developers, jan. 2025, testée sur GT 5 ; GT 3/HarmonyOS 4 à valider) +- Limites : framework JS très simple (pas de Canvas riche), stockage local limité + (`@system.storage`), et **pas de synchro live** avec l'app téléphone sans l'API + **Wear Engine** (accès partenaire, dossier à déposer chez Huawei) → la mini-app serait + autonome (saisie/redondance de données sur la montre) +- C'est le seul chemin vers une « vraie app » sur GT 3 + +### Option C — Rester sur les notifications (choix v1) +- Zéro maintenance, fiable, marche avec GB et Health ; la montre affiche rappel + actions +- Recommandé tant que l'option B n'apporte pas de vraie valeur (voir la saisie pénible + au poignet) + +## 5. Décision et prochaines étapes + +1. **V1** : notifications via Gadgetbridge (ou Health) — livré ✅ +2. À tester par l'utilisatrice : installer une watchface `.hwt` de test via GB sur la GT 3 + (HarmonyOS 4.0.0.120) pour valider le chemin d'installation +3. Si une app au poignet est vraiment souhaitée : option B, en commençant par un POC + « afficher une valeur statique » ; la synchro téléphone↔montre étant le point dur + (Wear Engine partenaire), la mini-app devra être **autonome** (saisie sur la montre) + +## 6. Références + +- Docs GB Huawei/Honor : https://gadgetbridge.org/basics/topics/huawei-honor/ +- Compatibilité appareils : https://gadgetbridge.org/gadgets/wearables/huawei-honor/ +- PR watchface install (#3910) : https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/3910 +- Régression HarmonyOS 6.1 (#6199) : https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/6199 +- Guide de développement Lite Wearable (session 1) : DevEco Studio + AGC + DevEco + Assistant — voir historique de chat et https://developer.huawei.com/consumer/en/multidevice/wearables/get-started/ diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..f0a2e55 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +android.useAndroidX=true +kotlin.code.style=official +android.nonTransitiveRClass=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..2c35211 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..09523c0 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..d95bf61 --- /dev/null +++ b/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..640d686 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS=-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..7ab9dec --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "HormoneTrack" +include(":app")