diff --git a/README.md b/README.md index 08ae79f..1a459e3 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,165 @@ -# hmg_patient_app_new +# HMG Patient App -New HMG Patient App +A comprehensive Flutter-based mobile application for HMG (Habib Medical Group) patients, +providing seamless healthcare services and patient management features. -## Getting Started +## 📱 Features -This project is a starting point for a Flutter application. +- **Patient Registration & Authentication**: Secure login and registration system +- **Appointment Management**: Book, reschedule, and manage medical appointments +- **Medical Records**: Access to personal health records and medical history +- **Doctor Consultation**: Video consultations and chat with healthcare providers +- **Health Monitoring**: Track vital signs and health metrics +- **Prescription Management**: View and manage prescriptions +- **Payment Integration**: Secure payment processing for medical services +- **Multi-language Support**: Available in English and Arabic +- **Push Notifications**: Real-time updates for appointments and health reminders +- **Calendar Integration**: Sync appointments with device calendar +- **Location Services**: Find nearby hospitals and clinics -A few resources to get you started if this is your first Flutter project: +## 🚀 Getting Started -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) +### Prerequisites -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +- Flutter SDK (>=3.0.0) +- Dart SDK (>=3.0.0) +- Android Studio / VS Code +- Android SDK (for Android development) +- Xcode (for iOS development, macOS only) + +### Installation + +1. **Clone the repository:** + ```bash + git clone + cd HMG_Patient_App_New + ``` + +2. **Install dependencies:** + ```bash + flutter pub get + ``` + +3. **Configure Firebase:** + - Add your `google-services.json` file to `android/app/` + - Add your `GoogleService-Info.plist` file to `ios/Runner/` + +4. **Run the application:** + ```bash + flutter run + ``` + +## 🏗️ Project Structure + +``` +lib/ +├── core/ # Core utilities and constants +├── extensions/ # Dart extensions +├── features/ # Feature-based modules +├── generated/ # Generated files (localization, etc.) +├── presentation/ # UI screens and widgets +├── routes/ # App navigation and routing +├── services/ # Business logic and API services +├── theme/ # App theming and styling +├── widgets/ # Reusable UI components +├── main.dart # App entry point +└── splashPage.dart # Splash screen + +assets/ +├── animations/ # Lottie animations +├── fonts/ # Custom fonts (Poppins, Gess Two) +├── images/ # PNG and SVG images +├── json/ # JSON data files +└── langs/ # Localization files +``` + +## 🛠️ Technologies Used + +- **Framework**: Flutter +- **Language**: Dart +- **State Management**: [Your state management solution] +- **Backend Services**: Firebase +- **Authentication**: Firebase Auth +- **Database**: Cloud Firestore +- **Push Notifications**: Firebase Cloud Messaging +- **Maps**: Google Maps +- **Payment**: Amazon PayFort +- **Video Calling**: Flutter Zoom Video SDK +- **Local Storage**: SQLite, Shared Preferences + +## 📱 Supported Platforms + +- ✅ Android (API level 21+) +- ✅ iOS (iOS 12.0+) +- ✅ Foldable devices support +- ✅ Tablet optimization + +## 🌐 Localization + +The app supports multiple languages: + +- English (en-US) +- Arabic (ar-SA) + +## 🔧 Configuration + +### Environment Setup + +1. **API Keys**: Configure your API keys in the appropriate configuration files +2. **Firebase**: Set up Firebase project and add configuration files +3. **Maps**: Add Google Maps API key +4. **Payment**: Configure PayFort credentials + +### Build Variants + +- **Debug**: Development build with debugging enabled +- **Release**: Production-ready optimized build + +## 📝 Development Guidelines + +### Code Style + +- Follow Dart/Flutter best practices +- Use consistent naming conventions +- Implement proper error handling +- Write comprehensive documentation + +### Testing + +```bash +# Run unit tests +flutter test + +# Run integration tests +flutter test integration_test/ +``` + +### Building for Production + +**Android:** + +```bash +flutter build apk --release +# or +flutter build appbundle --release +``` + +**iOS:** + +```bash +flutter build ios --release +``` + +## 🤝 Contributing + +1. Fork the repository +2. Create a feature branch (`git checkout -b feature/new-feature`) +3. Commit your changes (`git commit -am 'Add new feature'`) +4. Push to the branch (`git push origin feature/new-feature`) +5. Create a Pull Request + +## 📄 License + +This project is proprietary software developed for HMG Healthcare Group. + +**Built with ❤️ for better healthcare accessibility** diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..be3943c --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/agconnect-services.json b/android/app/agconnect-services.json new file mode 100644 index 0000000..91aad2c --- /dev/null +++ b/android/app/agconnect-services.json @@ -0,0 +1,74 @@ +{ + "agcgw":{ + "backurl":"connect-drcn.hispace.hicloud.com", + "url":"connect-drcn.dbankcloud.cn", + "websocketbackurl":"connect-ws-drcn.hispace.dbankcloud.com", + "websocketurl":"connect-ws-drcn.hispace.dbankcloud.cn" + }, + "agcgw_all":{ + "CN":"connect-drcn.dbankcloud.cn", + "CN_back":"connect-drcn.hispace.hicloud.com", + "DE":"connect-dre.dbankcloud.cn", + "DE_back":"connect-dre.hispace.hicloud.com", + "RU":"connect-drru.dbankcloud.cn", + "RU_back":"connect-drru.hispace.hicloud.com", + "SG":"connect-dra.dbankcloud.cn", + "SG_back":"connect-dra.hispace.hicloud.com" + }, + "client":{ + "cp_id":"2640966000002322881", + "product_id":"736430079244816567", + "client_id":"563735388191982656", + "client_secret":"650C7C799812AFFD53A10C7756CF05FB9F215A7E49032ABA8EBF3E14B77535CF", + "project_id":"736430079244816567", + "app_id":"102857389", + "api_key":"CgB6e3x9DJzMgRCmnT6dyUEkp6UsIfddb6l3w0ZEXzeiRMHEFi3400Z5fJ5qaHneU0OrAI/JRpk+DMGVs3QpUxlI", + "package_name":"com.ejada.hmg" + }, + "oauth_client":{ + "client_id":"102857389", + "client_type":1 + }, + "app_info":{ + "app_id":"102857389", + "package_name":"com.ejada.hmg" + }, + "service":{ + "analytics":{ + "collector_url":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn", + "collector_url_ru":"datacollector-drru.dt.hicloud.com,datacollector-drru.dt.dbankcloud.cn", + "collector_url_sg":"datacollector-dra.dt.hicloud.com,datacollector-dra.dt.dbankcloud.cn", + "collector_url_de":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn", + "collector_url_cn":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn", + "resource_id":"p1", + "channel_id":"" + }, + "search":{ + "url":"https://search-drcn.cloud.huawei.com" + }, + "cloudstorage":{ + "storage_url":"https://agc-storage-drcn.platform.dbankcloud.cn" + }, + "ml":{ + "mlservice_url":"ml-api-drcn.ai.dbankcloud.com,ml-api-drcn.ai.dbankcloud.cn" + } + }, + "region":"CN", + "configuration_version":"3.0", + "appInfos":[ + { + "package_name":"com.ejada.hmg", + "client":{ + "app_id":"102857389" + }, + "app_info":{ + "package_name":"com.ejada.hmg", + "app_id":"102857389" + }, + "oauth_client":{ + "client_type":1, + "client_id":"102857389" + } + } + ] +} diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000..226d4dd --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,188 @@ +import java.util.Properties +import java.io.FileInputStream + +plugins { + id("com.android.application") + id("kotlin-android") + id("com.google.gms.google-services") version "4.4.1" // Add the version here + id("dev.flutter.flutter-gradle-plugin") + id("com.huawei.agconnect") + // id("com.mapbox.gradle.application") + // id("com.mapbox.gradle.plugins.ndk") +} + +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) +} + +android { + namespace = "com.ejada.hmg" + compileSdk = 36 + ndkVersion = "28.2.13676358" + + defaultConfig { + applicationId = "com.ejada.hmg" + // minSdk = 24 + minSdk = 26 + targetSdk = 35 + compileSdk = 35 + // targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + multiDexEnabled = true + } + + buildFeatures { + viewBinding = true + dataBinding = true + } + + sourceSets { +// getByName("main") { +// java.srcDirs += "src/main/kotlin" +// jniLibs.srcDir("src/main/libs") +// jni.srcDirs = listOf() // disables automatic ndk-build +// } + getByName("main") { + java.srcDir("src/main/kotlin") + jniLibs.srcDir("src/main/libs") + // To disable automatic ndk-build, do not set jni.srcDirs + // If you need to clear jni.srcDirs: + // set("jni.srcDirs", emptyList()) + } + } + + signingConfigs { + create("release") { + keyAlias = keystoreProperties.getProperty("keyAlias") + keyPassword = keystoreProperties.getProperty("keyPassword") + storeFile = keystoreProperties.getProperty("storeFile")?.let { file(it) } + storePassword = keystoreProperties.getProperty("storePassword") + } + } + + buildTypes { + getByName("debug") { + isDebuggable = true + signingConfig = signingConfigs.getByName("debug") + isMinifyEnabled = false + isShrinkResources = false + } + getByName("release") { + isDebuggable = false + signingConfig = signingConfigs.getByName("release") + isMinifyEnabled = true + isShrinkResources = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + create("staging") { + matchingFallbacks += listOf("debug", "qa", "release") + } + } + + packagingOptions { + jniLibs { + pickFirsts += listOf( + "lib/x86/libc++_shared.so", + "lib/x86_64/libc++_shared.so", + "lib/armeabi-v7a/libc++_shared.so", + "lib/arm64-v8a/libc++_shared.so", + "**/*.so" + ) + useLegacyPackaging = true + } + resources { + excludes += listOf("META-INF/proguard/androidx-annotations.pro") + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + isCoreLibraryDesugaringEnabled = true + } + + // kotlinOptions { + // jvmTarget = "17" + // } + + lint { + disable += "MissingTranslation" + checkReleaseBuilds = false + } +} + +flutter { + source = "../.." +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.20") + implementation("com.google.firebase:firebase-messaging:24.1.2") + implementation("pub.devrel:easypermissions:3.0.0") + implementation("com.google.guava:guava:33.4.0-android") + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"), "exclude" to listOf("bcprov-jdk16-1.46.jar")))) + implementation("com.google.code.gson:gson:2.12.0") + + // Zoom SDKs + implementation("us.zoom.videosdk:zoomvideosdk-core:1.12.10") + implementation("us.zoom.videosdk:zoomvideosdk-annotation:1.12.10") + implementation("us.zoom.videosdk:zoomvideosdk-videoeffects:1.12.10") + + // Networking + implementation("com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.11") + implementation("com.squareup.okhttp3:okhttp:5.0.0-alpha.11") + implementation("com.squareup.retrofit2:retrofit:2.11.0") + implementation("com.squareup.retrofit2:converter-gson:2.11.0") + implementation("com.squareup.retrofit2:adapter-java8:2.11.0") + + // Google Services + implementation("com.google.android.gms:play-services-location:21.3.0") + implementation("com.google.android.gms:play-services-basement:18.7.0") + + implementation("com.android.volley:volley:1.2.1") + implementation("androidx.constraintlayout:constraintlayout:2.2.1") + implementation("androidx.navigation:navigation-fragment-ktx:2.9.0") + implementation("androidx.navigation:navigation-ui-ktx:2.9.0") + implementation("androidx.activity:activity-ktx:1.10.1") + +// val room_version = "2.6.1" +// implementation("androidx.room:room-runtime:$room_version") +// annotationProcessor("androidx.room:room-compiler:$room_version") + + implementation("net.zetetic:android-database-sqlcipher:4.5.4") + implementation("com.intuit.ssp:ssp-android:1.1.0") + implementation("com.intuit.sdp:sdp-android:1.1.0") + +// implementation("com.github.bumptech.glide:glide:4.16.0") +// annotationProcessor("com.github.bumptech.glide:compiler:4.16.0") + + implementation("com.mapbox.maps:android:11.5.0") + // implementation("com.mapbox.maps:android:11.4.0") + + // AARs +// implementation(files("libs/PenNavUI.aar")) +// implementation(files("libs/Penguin.aar")) +// implementation(files("libs/PenguinRenderer.aar")) + + implementation("com.github.kittinunf.fuel:fuel:2.3.1") + implementation("com.github.kittinunf.fuel:fuel-android:2.3.1") + +// implementation("com.opentok.android:opentok-android-sdk:2.25.2") + +// implementation("com.facebook.stetho:stetho:1.6.0") +// implementation("com.facebook.stetho:stetho-urlconnection:1.6.0") + + implementation("androidx.core:core-ktx:1.16.0") + implementation("androidx.appcompat:appcompat:1.7.1") + implementation("com.google.android.material:material:1.12.0") + + implementation("pl.droidsonroids.gif:android-gif-drawable:1.2.25") + + androidTestImplementation("androidx.test:core:1.6.1") + implementation("com.whatsapp.otp:whatsapp-otp-android-sdk:0.1.0") + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") + // implementation(project(":vitalSignEngine")) +} \ No newline at end of file diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..3707617 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,47 @@ +{ + "project_info": { + "project_number": "815750722565", + "firebase_url": "https://api-project-815750722565.firebaseio.com", + "project_id": "api-project-815750722565", + "storage_bucket": "api-project-815750722565.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:815750722565:android:62281cd3e5df4063", + "android_client_info": { + "package_name": "com.ejada.hmg" + } + }, + "oauth_client": [ + { + "client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDZDeWcBlRE3YfJWYt_DCiToVnANfaj8qg" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "815750722565-0cq9366orvsk5ipivq6lijcj56u03fr7.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.void.demo" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/app/key b/android/app/key new file mode 100644 index 0000000..15b9f5d Binary files /dev/null and b/android/app/key differ diff --git a/android/app/keystores/keystore b/android/app/keystores/keystore new file mode 100644 index 0000000..e69de29 diff --git a/android/app/libs/PenNavUI.aar b/android/app/libs/PenNavUI.aar new file mode 100644 index 0000000..d423bc1 Binary files /dev/null and b/android/app/libs/PenNavUI.aar differ diff --git a/android/app/libs/Penguin.aar b/android/app/libs/Penguin.aar new file mode 100644 index 0000000..5c789c6 Binary files /dev/null and b/android/app/libs/Penguin.aar differ diff --git a/android/app/libs/PenguinRenderer.aar b/android/app/libs/PenguinRenderer.aar new file mode 100644 index 0000000..b657ac6 Binary files /dev/null and b/android/app/libs/PenguinRenderer.aar differ diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..ab7b2ca --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,72 @@ +-keep class tvi.webrtc.** { *; } +-keep class com.twilio.video.** { *; } +-keep class com.twilio.common.** { *; } +-keepattributes InnerClasses + +-keep class com.ejada.** { *; } +-keep class org.webrtc.** { *; } + +-keep class com.builttoroam.devicecalendar.** { *; } + +-ignorewarnings +-keepattributes *Annotation* +-keepattributes Exceptions +-keepattributes InnerClasses +-keepattributes Signature +-keep class com.hianalytics.android.**{*;} +-keep class com.huawei.updatesdk.**{*;} +-keep class com.huawei.hms.**{*;} + +## Flutter wrapper +-keep class io.flutter.app.** { *; } +-keep class io.flutter.plugin.** { *; } +-keep class io.flutter.util.** { *; } +-keep class io.flutter.view.** { *; } +-keep class io.flutter.** { *; } +-keep class io.flutter.plugins.** { *; } +-dontwarn io.flutter.embedding.** +-keep class com.huawei.hms.flutter.** { *; } +-repackageclasses + +## Flutter WebRTC +-keep class com.cloudwebrtc.webrtc.** { *; } +-keep class org.webrtc.** { *; } + +## Flutter OpenTok +-keep class com.opentok.android.** { *; } +-keep class com.opentok.otc.** { *; } +-keep class org.otwebrtc.** { *; } + + +##Flutter Zoom +-keep class us.zoom**{ + *; +} +-keep interface us.zoom**{ + *; +} +-keep class org.webrtc**{ + *; +} +-keep class com.zipow**{ + *; +} + +-dontwarn com.opentok.android.** +-dontwarn com.opentok.otc.** + +-dontwarn penguin.com.pennav.Model.Navigation.NearLandmark + +-keep,includedescriptorclasses class net.sqlcipher.** { *; } +-keep,includedescriptorclasses interface net.sqlcipher.** { *; } + +-keep class retrofit2.** { *; } +-keep class okhttp3.** { *; } +-dontwarn retrofit2.** + +-keep class com.google.gson.** { *; } +-dontwarn com.google.gson.** + +# Penguin classes +-keep class com.peng.pennavmap.models.** { *; } +-keep class com.peng.pennavmap.db.** { *; } \ No newline at end of file diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6a1c47e --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/ejada/hmg/Application.kt b/android/app/src/main/kotlin/com/ejada/hmg/Application.kt new file mode 100644 index 0000000..32eb97c --- /dev/null +++ b/android/app/src/main/kotlin/com/ejada/hmg/Application.kt @@ -0,0 +1,27 @@ +//package com.cloud.diplomaticquarterapp +package com.ejada.hmg + + +import io.flutter.app.FlutterApplication + +class Application : FlutterApplication() { + override fun onCreate() { + super.onCreate() + } +} + +//import io.flutter.app.FlutterApplication +//import io.flutter.plugin.common.PluginRegistry +//import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback +//import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService +// +//class Application : FlutterApplication(), PluginRegistrantCallback { +// override fun onCreate() { +// super.onCreate() +// FlutterFirebaseMessagingService.setPluginRegistrant(this) +// } +// +// override fun registerWith(registry: PluginRegistry?) { +// FirebaseCloudMessagingPluginRegistrant.registerWith(registry) +// } +//} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/ejada/hmg/MainActivity.kt b/android/app/src/main/kotlin/com/ejada/hmg/MainActivity.kt new file mode 100644 index 0000000..6170727 --- /dev/null +++ b/android/app/src/main/kotlin/com/ejada/hmg/MainActivity.kt @@ -0,0 +1,6 @@ +package com.ejada.hmg + +import io.flutter.embedding.android.FlutterFragmentActivity + + +class MainActivity : FlutterFragmentActivity() diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/app_icon.png b/android/app/src/main/res/drawable/app_icon.png new file mode 100755 index 0000000..2d394f8 Binary files /dev/null and b/android/app/src/main/res/drawable/app_icon.png differ diff --git a/android/app/src/main/res/drawable/food.png b/android/app/src/main/res/drawable/food.png new file mode 100644 index 0000000..41b394d Binary files /dev/null and b/android/app/src/main/res/drawable/food.png differ diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/me.png b/android/app/src/main/res/drawable/me.png new file mode 100644 index 0000000..ba75bc5 Binary files /dev/null and b/android/app/src/main/res/drawable/me.png differ diff --git a/android/app/src/main/res/drawable/sample_large_icon.png b/android/app/src/main/res/drawable/sample_large_icon.png new file mode 100644 index 0000000..f354ca2 Binary files /dev/null and b/android/app/src/main/res/drawable/sample_large_icon.png differ diff --git a/android/app/src/main/res/drawable/secondary_icon.png b/android/app/src/main/res/drawable/secondary_icon.png new file mode 100644 index 0000000..9de9ff4 Binary files /dev/null and b/android/app/src/main/res/drawable/secondary_icon.png differ diff --git a/android/app/src/main/res/layout/activity_whats_app_code.xml b/android/app/src/main/res/layout/activity_whats_app_code.xml new file mode 100644 index 0000000..3cd824c --- /dev/null +++ b/android/app/src/main/res/layout/activity_whats_app_code.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/local_video.xml b/android/app/src/main/res/layout/local_video.xml new file mode 100644 index 0000000..f47c48c --- /dev/null +++ b/android/app/src/main/res/layout/local_video.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/remote_video.xml b/android/app/src/main/res/layout/remote_video.xml new file mode 100644 index 0000000..cfdbeb0 --- /dev/null +++ b/android/app/src/main/res/layout/remote_video.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_local.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_local.png new file mode 100644 index 0000000..348b511 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_local.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_local.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_local.png new file mode 100644 index 0000000..410b1b1 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_local.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_local.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_local.png new file mode 100644 index 0000000..bb9943a Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_local.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_local.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_local.png new file mode 100644 index 0000000..0b9d935 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_local.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_local.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_local.png new file mode 100644 index 0000000..aaa9808 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_local.png differ diff --git a/android/app/src/main/res/raw/keep.xml b/android/app/src/main/res/raw/keep.xml new file mode 100644 index 0000000..944a7ac --- /dev/null +++ b/android/app/src/main/res/raw/keep.xml @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/android/app/src/main/res/raw/slow_spring_board.mp3 b/android/app/src/main/res/raw/slow_spring_board.mp3 new file mode 100644 index 0000000..60dbf97 Binary files /dev/null and b/android/app/src/main/res/raw/slow_spring_board.mp3 differ diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..6c4ac3d --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,23 @@ + + HMG Patient App + + + Unknown error: the Geofence service is not available now. + + + Geofence service is not available now. Go to Settings>Location>Mode and choose High accuracy. + + + Your app has registered too many geofences. + + + You have provided too many PendingIntents to the addGeofences() call. + + + App do not have permission to access location service. + + + Geofence requests happened too frequently. + + sk.eyJ1IjoicndhaWQiLCJhIjoiY2x6NWo0bTMzMWZodzJrcGZpemYzc3Z4dSJ9.uSSZuwNSGCcCdPAiORECmg + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..1f83a33 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..4b24dd7 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,104 @@ +buildscript { + repositories { + mavenCentral() + google() + maven { url = uri("https://developer.huawei.com/repo/") } + maven { + url = uri("https://api.mapbox.com/downloads/v2/releases/maven") + credentials { + username = "mapbox" + password = "sk.eyJ1IjoicndhaWQiLCJhIjoiY2x6NWo0bTMzMWZodzJrcGZpemYzc3Z4dSJ9.uSSZuwNSGCcCdPAiORECmg" + if (password.isNullOrEmpty()) { + throw GradleException("MAPBOX_DOWNLOADS_TOKEN isn't set. Set it to the project properties or to the environment variables.") + } + } + authentication { + create("basic") + } + } + } + dependencies { + classpath("com.android.tools.build:gradle:8.1.0") + classpath("com.huawei.agconnect:agcp:1.9.1.304") + } +} + +allprojects { + repositories { + google() + mavenCentral() + maven { url = uri("https://developer.huawei.com/repo/") } + maven { url = uri("https://artifactory.ess-dev.com/artifactory/gradle-dev-local") } + maven { + url = uri("https://api.mapbox.com/downloads/v2/releases/maven") + credentials { + username = "mapbox" + password = "sk.eyJ1IjoicndhaWQiLCJhIjoiY2x6NWo0bTMzMWZodzJrcGZpemYzc3Z4dSJ9.uSSZuwNSGCcCdPAiORECmg" + if (password.isNullOrEmpty()) { + throw GradleException("MAPBOX_DOWNLOADS_TOKEN isn't set. Set it to the project properties or to the environment variables.") + } + } + authentication { + create("basic") + } + } + } + + configurations.all { + exclude(group = "org.bouncycastle", module = "bcprov-jdk16") + } + + tasks.withType().configureEach { + sourceCompatibility = JavaVersion.VERSION_21.toString() + targetCompatibility = JavaVersion.VERSION_21.toString() + } + + tasks.withType().configureEach { + kotlinOptions { + jvmTarget = "21" + } + } + + subprojects { + afterEvaluate { + if (project.hasProperty("android")) { + project.extensions.findByName("android")?.let { androidExt -> + val android = androidExt as com.android.build.gradle.BaseExtension + if (android.namespace == null) { + android.namespace = project.group.toString() + } + android.buildFeatures.apply { + if (buildConfig == null) { + buildConfig = true + } + } + android.compileOptions.apply { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + } + } + } + project.tasks.withType().configureEach { + sourceCompatibility = JavaVersion.VERSION_21.toString() + targetCompatibility = JavaVersion.VERSION_21.toString() + } + project.tasks.withType().configureEach { + kotlinOptions { + jvmTarget = "21" + } + } + } + } +} + +rootProject.buildDir = File("../build") +subprojects { + project.buildDir = File("${rootProject.buildDir}/${project.name}") +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} \ No newline at end of file diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html new file mode 100644 index 0000000..82570ba --- /dev/null +++ b/android/build/reports/problems/problems-report.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Gradle Configuration Cache + + + +
+ +
+ Loading... +
+ + + + + + diff --git a/android/google-services.json b/android/google-services.json new file mode 100644 index 0000000..3707617 --- /dev/null +++ b/android/google-services.json @@ -0,0 +1,47 @@ +{ + "project_info": { + "project_number": "815750722565", + "firebase_url": "https://api-project-815750722565.firebaseio.com", + "project_id": "api-project-815750722565", + "storage_bucket": "api-project-815750722565.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:815750722565:android:62281cd3e5df4063", + "android_client_info": { + "package_name": "com.ejada.hmg" + } + }, + "oauth_client": [ + { + "client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDZDeWcBlRE3YfJWYt_DCiToVnANfaj8qg" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "815750722565-0cq9366orvsk5ipivq6lijcj56u03fr7.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.void.demo" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..f018a61 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ac3b479 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip diff --git a/android/key b/android/key new file mode 100644 index 0000000..15b9f5d Binary files /dev/null and b/android/key differ diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..ab39a10 --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.3" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/assets/animations/lottie/ErrorAnimation.json b/assets/animations/lottie/ErrorAnimation.json new file mode 100644 index 0000000..a9fc775 --- /dev/null +++ b/assets/animations/lottie/ErrorAnimation.json @@ -0,0 +1 @@ +{"nm":"Bouncy Fail","ddd":0,"h":512,"w":512,"meta":{"g":"@lottiefiles/toolkit-js 0.33.2"},"layers":[{"ty":4,"nm":"X line 2","sr":1,"st":0,"op":60,"ip":26,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[41,-3,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[256,256,0],"ix":2},"r":{"a":0,"k":90,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Shape 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[112,-74],[-30,68]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"c":{"a":0,"k":[1,1,1],"ix":3}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8863,0.1176,0.1882],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":26},{"s":[0],"t":40}],"ix":1},"m":1}],"ind":1},{"ty":4,"nm":"X line 1","sr":1,"st":0,"op":60,"ip":26,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[41,-3,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[256,256,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Shape 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[112,-74],[-30,68]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"c":{"a":0,"k":[1,1,1],"ix":3}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8863,0.1176,0.1882],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[0],"t":26},{"s":[100],"t":40}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":0,"k":0,"ix":1},"m":1}],"ind":2},{"ty":4,"nm":"Circle 2","sr":1,"st":0,"op":360,"ip":10,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[140.061,140.061,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[0,0,100],"t":10},{"s":[140,140,100],"t":20}],"ix":6,"x":"var $bm_rt;\nvar scaleInertialBounce, scaleBounceBack, n, n, t, t, v, amp, freq, decay, v, amp, freq, decay, e, g, nMax, e, g, nMax, n, n, t, v, vl, vu, vu, tCur, segDur, tNext, nb, delta;\nscaleInertialBounce = effect('Bounce & Drop - ukramedia.com')(16);\nscaleBounceBack = effect('Bounce & Drop - ukramedia.com')(17);\ntry {\n if (scaleInertialBounce == 1) {\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (effect('Bounce & Drop - ukramedia.com')(58) == 1) {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(59);\n freq = effect('Bounce & Drop - ukramedia.com')(60);\n decay = effect('Bounce & Drop - ukramedia.com')(61);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n } else {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(19);\n freq = effect('Bounce & Drop - ukramedia.com')(20);\n decay = effect('Bounce & Drop - ukramedia.com')(21);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n }\n } else if (scaleBounceBack == 1) {\n if (effect('Bounce & Drop - ukramedia.com')(64) == 1) {\n e = effect('Bounce & Drop - ukramedia.com')(65);\n g = effect('Bounce & Drop - ukramedia.com')(66);\n nMax = effect('Bounce & Drop - ukramedia.com')(67);\n } else {\n e = effect('Bounce & Drop - ukramedia.com')(24);\n g = effect('Bounce & Drop - ukramedia.com')(25);\n nMax = effect('Bounce & Drop - ukramedia.com')(26);\n }\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time)\n n--;\n }\n if (n > 0) {\n t = $bm_sub(time, key(n).time);\n v = $bm_mul($bm_neg(velocityAtTime($bm_sub(key(n).time, 0.001))), e);\n vl = length(v);\n if ($bm_isInstanceOfArray(value)) {\n vu = vl > 0 ? normalize(v) : [\n 0,\n 0,\n 0\n ];\n } else {\n vu = v < 0 ? -1 : 1;\n }\n tCur = 0;\n segDur = $bm_div($bm_mul(2, vl), g);\n tNext = segDur;\n nb = 1;\n while (tNext < t && nb <= nMax) {\n vl *= e;\n segDur *= e;\n tCur = tNext;\n tNext = $bm_sum(tNext, segDur);\n nb++;\n }\n if (nb <= nMax) {\n delta = $bm_sub(t, tCur);\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(vu, delta), $bm_sub(vl, $bm_div($bm_mul(g, delta), 2))));\n } else {\n $bm_rt = value;\n }\n } else\n $bm_rt = value;\n } else {\n $bm_rt = value;\n }\n} catch (err) {\n $bm_rt = value;\n}"},"sk":{"a":0,"k":0},"p":{"a":0,"k":[256,256,0],"ix":2,"x":"var $bm_rt;\nvar positionInertialBounce, positionBounceBack, n, n, t, t, v, amp, freq, decay, v, amp, freq, decay, e, g, nMax, e, g, nMax, n, n, t, v, vl, vu, vu, tCur, segDur, tNext, nb, delta;\npositionInertialBounce = effect('Bounce & Drop - ukramedia.com')(2);\npositionBounceBack = effect('Bounce & Drop - ukramedia.com')(3);\ntry {\n if (positionInertialBounce == 1) {\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (effect('Bounce & Drop - ukramedia.com')(58) == 1) {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(59);\n freq = effect('Bounce & Drop - ukramedia.com')(60);\n decay = effect('Bounce & Drop - ukramedia.com')(61);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n } else {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(5);\n freq = effect('Bounce & Drop - ukramedia.com')(6);\n decay = effect('Bounce & Drop - ukramedia.com')(7);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n }\n } else if (positionBounceBack == 1) {\n if (effect('Bounce & Drop - ukramedia.com')(64) == 1) {\n e = effect('Bounce & Drop - ukramedia.com')(65);\n g = effect('Bounce & Drop - ukramedia.com')(66);\n nMax = effect('Bounce & Drop - ukramedia.com')(67);\n } else {\n e = effect('Bounce & Drop - ukramedia.com')(10);\n g = effect('Bounce & Drop - ukramedia.com')(11);\n nMax = effect('Bounce & Drop - ukramedia.com')(12);\n }\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time)\n n--;\n }\n if (n > 0) {\n t = $bm_sub(time, key(n).time);\n v = $bm_mul($bm_neg(velocityAtTime($bm_sub(key(n).time, 0.001))), e);\n vl = length(v);\n if ($bm_isInstanceOfArray(value)) {\n vu = vl > 0 ? normalize(v) : [\n 0,\n 0,\n 0\n ];\n } else {\n vu = v < 0 ? -1 : 1;\n }\n tCur = 0;\n segDur = $bm_div($bm_mul(2, vl), g);\n tNext = segDur;\n nb = 1;\n while (tNext < t && nb <= nMax) {\n vl *= e;\n segDur *= e;\n tCur = tNext;\n tNext = $bm_sum(tNext, segDur);\n nb++;\n }\n if (nb <= nMax) {\n delta = $bm_sub(t, tCur);\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(vu, delta), $bm_sub(vl, $bm_div($bm_mul(g, delta), 2))));\n } else {\n $bm_rt = value;\n }\n } else\n $bm_rt = value;\n } else {\n $bm_rt = value;\n }\n} catch (err) {\n $bm_rt = value;\n}"},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar rotationInertialBounce, rotationBounceBack, n, n, t, t, v, amp, freq, decay, v, amp, freq, decay, e, g, nMax, e, g, nMax, n, n, t, v, vl, vu, vu, tCur, segDur, tNext, nb, delta;\nrotationInertialBounce = effect('Bounce & Drop - ukramedia.com')(30);\nrotationBounceBack = effect('Bounce & Drop - ukramedia.com')(31);\ntry {\n if (rotationInertialBounce == 1) {\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (effect('Bounce & Drop - ukramedia.com')(58) == 1) {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(59);\n freq = effect('Bounce & Drop - ukramedia.com')(60);\n decay = effect('Bounce & Drop - ukramedia.com')(61);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n } else {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(33);\n freq = effect('Bounce & Drop - ukramedia.com')(34);\n decay = effect('Bounce & Drop - ukramedia.com')(35);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n }\n } else if (rotationBounceBack == 1) {\n if (effect('Bounce & Drop - ukramedia.com')(64) == 1) {\n e = effect('Bounce & Drop - ukramedia.com')(65);\n g = effect('Bounce & Drop - ukramedia.com')(66);\n nMax = effect('Bounce & Drop - ukramedia.com')(67);\n } else {\n e = effect('Bounce & Drop - ukramedia.com')(38);\n g = effect('Bounce & Drop - ukramedia.com')(39);\n nMax = effect('Bounce & Drop - ukramedia.com')(40);\n }\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time)\n n--;\n }\n if (n > 0) {\n t = $bm_sub(time, key(n).time);\n v = $bm_mul($bm_neg(velocityAtTime($bm_sub(key(n).time, 0.001))), e);\n vl = length(v);\n if ($bm_isInstanceOfArray(value)) {\n vu = vl > 0 ? normalize(v) : [\n 0,\n 0,\n 0\n ];\n } else {\n vu = v < 0 ? -1 : 1;\n }\n tCur = 0;\n segDur = $bm_div($bm_mul(2, vl), g);\n tNext = segDur;\n nb = 1;\n while (tNext < t && nb <= nMax) {\n vl *= e;\n segDur *= e;\n tCur = tNext;\n tNext = $bm_sum(tNext, segDur);\n nb++;\n }\n if (nb <= nMax) {\n delta = $bm_sub(t, tCur);\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(vu, delta), $bm_sub(vl, $bm_div($bm_mul(g, delta), 2))));\n } else {\n $bm_rt = value;\n }\n } else\n $bm_rt = value;\n } else {\n $bm_rt = value;\n }\n} catch (err) {\n $bm_rt = value;\n}"},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11,"x":"var $bm_rt;\nvar opacityInertialBounce, opacityBounceBack, n, n, t, t, v, amp, freq, decay, v, amp, freq, decay, e, g, nMax, e, g, nMax, n, n, t, v, vl, vu, vu, tCur, segDur, tNext, nb, delta;\nopacityInertialBounce = effect('Bounce & Drop - ukramedia.com')(44);\nopacityBounceBack = effect('Bounce & Drop - ukramedia.com')(45);\ntry {\n if (opacityInertialBounce == 1) {\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (effect('Bounce & Drop - ukramedia.com')(58) == 1) {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(59);\n freq = effect('Bounce & Drop - ukramedia.com')(60);\n decay = effect('Bounce & Drop - ukramedia.com')(61);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n } else {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(47);\n freq = effect('Bounce & Drop - ukramedia.com')(48);\n decay = effect('Bounce & Drop - ukramedia.com')(49);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n }\n } else if (opacityBounceBack == 1) {\n if (effect('Bounce & Drop - ukramedia.com')(64) == 1) {\n e = effect('Bounce & Drop - ukramedia.com')(65);\n g = effect('Bounce & Drop - ukramedia.com')(66);\n nMax = effect('Bounce & Drop - ukramedia.com')(67);\n } else {\n e = effect('Bounce & Drop - ukramedia.com')(52);\n g = effect('Bounce & Drop - ukramedia.com')(53);\n nMax = effect('Bounce & Drop - ukramedia.com')(54);\n }\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time)\n n--;\n }\n if (n > 0) {\n t = $bm_sub(time, key(n).time);\n v = $bm_mul($bm_neg(velocityAtTime($bm_sub(key(n).time, 0.001))), e);\n vl = length(v);\n if ($bm_isInstanceOfArray(value)) {\n vu = vl > 0 ? normalize(v) : [\n 0,\n 0,\n 0\n ];\n } else {\n vu = v < 0 ? -1 : 1;\n }\n tCur = 0;\n segDur = $bm_div($bm_mul(2, vl), g);\n tNext = segDur;\n nb = 1;\n while (tNext < t && nb <= nMax) {\n vl *= e;\n segDur *= e;\n tCur = tNext;\n tNext = $bm_sum(tNext, segDur);\n nb++;\n }\n if (nb <= nMax) {\n delta = $bm_sub(t, tCur);\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(vu, delta), $bm_sub(vl, $bm_div($bm_mul(g, delta), 2))));\n } else {\n $bm_rt = value;\n }\n } else\n $bm_rt = value;\n } else {\n $bm_rt = value;\n }\n} catch (err) {\n $bm_rt = value;\n}"}},"ef":[{"ty":5,"mn":"Pseudo/animationControl","nm":"Bounce & Drop - ukramedia.com","ix":1,"en":1,"ef":[{"ty":6,"mn":"Pseudo/animationControl-0001","nm":"Position","ix":1,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0002","nm":"Enable Inertial Bounce","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":7,"mn":"Pseudo/animationControl-0003","nm":"Enable Bounce Back","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":6,"mn":"Pseudo/animationControl-0004","nm":"Inertial Bounce Options","ix":4,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0005","nm":"Amplitude","ix":5,"v":{"a":0,"k":0.05,"ix":5}},{"ty":0,"mn":"Pseudo/animationControl-0006","nm":"Frequency","ix":6,"v":{"a":0,"k":4,"ix":6}},{"ty":0,"mn":"Pseudo/animationControl-0007","nm":"Decay","ix":7,"v":{"a":0,"k":8,"ix":7}},{"ty":6,"mn":"Pseudo/animationControl-0008","nm":"","ix":8,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0009","nm":"Bounce Back Options","ix":9,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0010","nm":"Elasticity","ix":10,"v":{"a":0,"k":0.7,"ix":10}},{"ty":0,"mn":"Pseudo/animationControl-0011","nm":"Gravity","ix":11,"v":{"a":0,"k":5000,"ix":11}},{"ty":0,"mn":"Pseudo/animationControl-0012","nm":"nMax","ix":12,"v":{"a":0,"k":9,"ix":12}},{"ty":6,"mn":"Pseudo/animationControl-0013","nm":"","ix":13,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0014","nm":"","ix":14,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0015","nm":"Scale","ix":15,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0016","nm":"Enable Inertial Bounce","ix":16,"v":{"a":0,"k":1,"ix":16}},{"ty":7,"mn":"Pseudo/animationControl-0017","nm":"Enable Bounce Back","ix":17,"v":{"a":0,"k":0,"ix":17}},{"ty":6,"mn":"Pseudo/animationControl-0018","nm":"Inertial Bounce Options","ix":18,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0019","nm":"Amplitude","ix":19,"v":{"a":0,"k":0.8,"ix":19}},{"ty":0,"mn":"Pseudo/animationControl-0020","nm":"Frequency","ix":20,"v":{"a":0,"k":4,"ix":20}},{"ty":0,"mn":"Pseudo/animationControl-0021","nm":"Decay","ix":21,"v":{"a":0,"k":8,"ix":21}},{"ty":6,"mn":"Pseudo/animationControl-0022","nm":"","ix":22,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0023","nm":"Bounce Back Options","ix":23,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0024","nm":"Elasticity","ix":24,"v":{"a":0,"k":0.7,"ix":24}},{"ty":0,"mn":"Pseudo/animationControl-0025","nm":"Gravity","ix":25,"v":{"a":0,"k":5000,"ix":25}},{"ty":0,"mn":"Pseudo/animationControl-0026","nm":"nMax","ix":26,"v":{"a":0,"k":9,"ix":26}},{"ty":6,"mn":"Pseudo/animationControl-0027","nm":"","ix":27,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0028","nm":"","ix":28,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0029","nm":"Rotation","ix":29,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0030","nm":"Enable Inertial Bounce","ix":30,"v":{"a":0,"k":0,"ix":30}},{"ty":7,"mn":"Pseudo/animationControl-0031","nm":"Enable Bounce Back","ix":31,"v":{"a":0,"k":0,"ix":31}},{"ty":6,"mn":"Pseudo/animationControl-0032","nm":"Inertial Bounce Options","ix":32,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0033","nm":"Amplitude","ix":33,"v":{"a":0,"k":0.05,"ix":33}},{"ty":0,"mn":"Pseudo/animationControl-0034","nm":"Frequency","ix":34,"v":{"a":0,"k":4,"ix":34}},{"ty":0,"mn":"Pseudo/animationControl-0035","nm":"Decay","ix":35,"v":{"a":0,"k":8,"ix":35}},{"ty":6,"mn":"Pseudo/animationControl-0036","nm":"","ix":36,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0037","nm":"Bounce Back Options","ix":37,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0038","nm":"Elasticity","ix":38,"v":{"a":0,"k":0.7,"ix":38}},{"ty":0,"mn":"Pseudo/animationControl-0039","nm":"Gravity","ix":39,"v":{"a":0,"k":5000,"ix":39}},{"ty":0,"mn":"Pseudo/animationControl-0040","nm":"nMax","ix":40,"v":{"a":0,"k":9,"ix":40}},{"ty":6,"mn":"Pseudo/animationControl-0041","nm":"","ix":41,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0042","nm":"","ix":42,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0043","nm":"Opacity","ix":43,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0044","nm":"Enable Inertial Bounce","ix":44,"v":{"a":0,"k":0,"ix":44}},{"ty":7,"mn":"Pseudo/animationControl-0045","nm":"Enable Bounce Back","ix":45,"v":{"a":0,"k":0,"ix":45}},{"ty":6,"mn":"Pseudo/animationControl-0046","nm":"Inertial Bounce Options","ix":46,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0047","nm":"Amplitude","ix":47,"v":{"a":0,"k":0.05,"ix":47}},{"ty":0,"mn":"Pseudo/animationControl-0048","nm":"Frequency","ix":48,"v":{"a":0,"k":4,"ix":48}},{"ty":0,"mn":"Pseudo/animationControl-0049","nm":"Decay","ix":49,"v":{"a":0,"k":8,"ix":49}},{"ty":6,"mn":"Pseudo/animationControl-0050","nm":"","ix":50,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0051","nm":"Bounce Back Options","ix":51,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0052","nm":"Elasticity","ix":52,"v":{"a":0,"k":0.7,"ix":52}},{"ty":0,"mn":"Pseudo/animationControl-0053","nm":"Gravity","ix":53,"v":{"a":0,"k":5000,"ix":53}},{"ty":0,"mn":"Pseudo/animationControl-0054","nm":"nMax","ix":54,"v":{"a":0,"k":9,"ix":54}},{"ty":6,"mn":"Pseudo/animationControl-0055","nm":"","ix":55,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0056","nm":"","ix":56,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0057","nm":"Global Inertial Bounce Options","ix":57,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0058","nm":"Enable Global Inertial Bounce","ix":58,"v":{"a":0,"k":0,"ix":58}},{"ty":0,"mn":"Pseudo/animationControl-0059","nm":"Amplitude","ix":59,"v":{"a":0,"k":0.05,"ix":59}},{"ty":0,"mn":"Pseudo/animationControl-0060","nm":"Frequency","ix":60,"v":{"a":0,"k":4,"ix":60}},{"ty":0,"mn":"Pseudo/animationControl-0061","nm":"Decay","ix":61,"v":{"a":0,"k":8,"ix":61}},{"ty":6,"mn":"Pseudo/animationControl-0062","nm":"","ix":62,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0063","nm":"Global Bounce Back Options","ix":63,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0064","nm":"Enable Global Bounce Back","ix":64,"v":{"a":0,"k":0,"ix":64}},{"ty":0,"mn":"Pseudo/animationControl-0065","nm":"Elasticity","ix":65,"v":{"a":0,"k":0.7,"ix":65}},{"ty":0,"mn":"Pseudo/animationControl-0066","nm":"Gravity","ix":66,"v":{"a":0,"k":5000,"ix":66}},{"ty":0,"mn":"Pseudo/animationControl-0067","nm":"nMax","ix":67,"v":{"a":0,"k":9,"ix":67}},{"ty":6,"mn":"Pseudo/animationControl-0068","nm":"","ix":68,"v":0}]}],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-77.215],[77.216,0],[0,77.215],[-77.215,0]],"o":[[0,77.215],[-77.215,0],[0,-77.215],[77.216,0]],"v":[[139.811,0],[0,139.811],[-139.811,0],[0,-139.811]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8863,0.1176,0.1882],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[140.061,140.061],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Circle 1","sr":1,"st":0,"op":360,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[140.061,140.061,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[0,0,100],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[132,132,100],"t":10},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[130,130,100],"t":35},{"s":[175,175,100],"t":55}],"ix":6,"x":"var $bm_rt;\nvar scaleInertialBounce, scaleBounceBack, n, n, t, t, v, amp, freq, decay, v, amp, freq, decay, e, g, nMax, e, g, nMax, n, n, t, v, vl, vu, vu, tCur, segDur, tNext, nb, delta;\nscaleInertialBounce = effect('Bounce & Drop - ukramedia.com')(16);\nscaleBounceBack = effect('Bounce & Drop - ukramedia.com')(17);\ntry {\n if (scaleInertialBounce == 1) {\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (effect('Bounce & Drop - ukramedia.com')(58) == 1) {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(59);\n freq = effect('Bounce & Drop - ukramedia.com')(60);\n decay = effect('Bounce & Drop - ukramedia.com')(61);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n } else {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(19);\n freq = effect('Bounce & Drop - ukramedia.com')(20);\n decay = effect('Bounce & Drop - ukramedia.com')(21);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n }\n } else if (scaleBounceBack == 1) {\n if (effect('Bounce & Drop - ukramedia.com')(64) == 1) {\n e = effect('Bounce & Drop - ukramedia.com')(65);\n g = effect('Bounce & Drop - ukramedia.com')(66);\n nMax = effect('Bounce & Drop - ukramedia.com')(67);\n } else {\n e = effect('Bounce & Drop - ukramedia.com')(24);\n g = effect('Bounce & Drop - ukramedia.com')(25);\n nMax = effect('Bounce & Drop - ukramedia.com')(26);\n }\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time)\n n--;\n }\n if (n > 0) {\n t = $bm_sub(time, key(n).time);\n v = $bm_mul($bm_neg(velocityAtTime($bm_sub(key(n).time, 0.001))), e);\n vl = length(v);\n if ($bm_isInstanceOfArray(value)) {\n vu = vl > 0 ? normalize(v) : [\n 0,\n 0,\n 0\n ];\n } else {\n vu = v < 0 ? -1 : 1;\n }\n tCur = 0;\n segDur = $bm_div($bm_mul(2, vl), g);\n tNext = segDur;\n nb = 1;\n while (tNext < t && nb <= nMax) {\n vl *= e;\n segDur *= e;\n tCur = tNext;\n tNext = $bm_sum(tNext, segDur);\n nb++;\n }\n if (nb <= nMax) {\n delta = $bm_sub(t, tCur);\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(vu, delta), $bm_sub(vl, $bm_div($bm_mul(g, delta), 2))));\n } else {\n $bm_rt = value;\n }\n } else\n $bm_rt = value;\n } else {\n $bm_rt = value;\n }\n} catch (err) {\n $bm_rt = value;\n}"},"sk":{"a":0,"k":0},"p":{"a":0,"k":[256,256,0],"ix":2,"x":"var $bm_rt;\nvar positionInertialBounce, positionBounceBack, n, n, t, t, v, amp, freq, decay, v, amp, freq, decay, e, g, nMax, e, g, nMax, n, n, t, v, vl, vu, vu, tCur, segDur, tNext, nb, delta;\npositionInertialBounce = effect('Bounce & Drop - ukramedia.com')(2);\npositionBounceBack = effect('Bounce & Drop - ukramedia.com')(3);\ntry {\n if (positionInertialBounce == 1) {\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (effect('Bounce & Drop - ukramedia.com')(58) == 1) {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(59);\n freq = effect('Bounce & Drop - ukramedia.com')(60);\n decay = effect('Bounce & Drop - ukramedia.com')(61);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n } else {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(5);\n freq = effect('Bounce & Drop - ukramedia.com')(6);\n decay = effect('Bounce & Drop - ukramedia.com')(7);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n }\n } else if (positionBounceBack == 1) {\n if (effect('Bounce & Drop - ukramedia.com')(64) == 1) {\n e = effect('Bounce & Drop - ukramedia.com')(65);\n g = effect('Bounce & Drop - ukramedia.com')(66);\n nMax = effect('Bounce & Drop - ukramedia.com')(67);\n } else {\n e = effect('Bounce & Drop - ukramedia.com')(10);\n g = effect('Bounce & Drop - ukramedia.com')(11);\n nMax = effect('Bounce & Drop - ukramedia.com')(12);\n }\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time)\n n--;\n }\n if (n > 0) {\n t = $bm_sub(time, key(n).time);\n v = $bm_mul($bm_neg(velocityAtTime($bm_sub(key(n).time, 0.001))), e);\n vl = length(v);\n if ($bm_isInstanceOfArray(value)) {\n vu = vl > 0 ? normalize(v) : [\n 0,\n 0,\n 0\n ];\n } else {\n vu = v < 0 ? -1 : 1;\n }\n tCur = 0;\n segDur = $bm_div($bm_mul(2, vl), g);\n tNext = segDur;\n nb = 1;\n while (tNext < t && nb <= nMax) {\n vl *= e;\n segDur *= e;\n tCur = tNext;\n tNext = $bm_sum(tNext, segDur);\n nb++;\n }\n if (nb <= nMax) {\n delta = $bm_sub(t, tCur);\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(vu, delta), $bm_sub(vl, $bm_div($bm_mul(g, delta), 2))));\n } else {\n $bm_rt = value;\n }\n } else\n $bm_rt = value;\n } else {\n $bm_rt = value;\n }\n} catch (err) {\n $bm_rt = value;\n}"},"r":{"a":0,"k":0,"ix":10,"x":"var $bm_rt;\nvar rotationInertialBounce, rotationBounceBack, n, n, t, t, v, amp, freq, decay, v, amp, freq, decay, e, g, nMax, e, g, nMax, n, n, t, v, vl, vu, vu, tCur, segDur, tNext, nb, delta;\nrotationInertialBounce = effect('Bounce & Drop - ukramedia.com')(30);\nrotationBounceBack = effect('Bounce & Drop - ukramedia.com')(31);\ntry {\n if (rotationInertialBounce == 1) {\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (effect('Bounce & Drop - ukramedia.com')(58) == 1) {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(59);\n freq = effect('Bounce & Drop - ukramedia.com')(60);\n decay = effect('Bounce & Drop - ukramedia.com')(61);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n } else {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(33);\n freq = effect('Bounce & Drop - ukramedia.com')(34);\n decay = effect('Bounce & Drop - ukramedia.com')(35);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n }\n } else if (rotationBounceBack == 1) {\n if (effect('Bounce & Drop - ukramedia.com')(64) == 1) {\n e = effect('Bounce & Drop - ukramedia.com')(65);\n g = effect('Bounce & Drop - ukramedia.com')(66);\n nMax = effect('Bounce & Drop - ukramedia.com')(67);\n } else {\n e = effect('Bounce & Drop - ukramedia.com')(38);\n g = effect('Bounce & Drop - ukramedia.com')(39);\n nMax = effect('Bounce & Drop - ukramedia.com')(40);\n }\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time)\n n--;\n }\n if (n > 0) {\n t = $bm_sub(time, key(n).time);\n v = $bm_mul($bm_neg(velocityAtTime($bm_sub(key(n).time, 0.001))), e);\n vl = length(v);\n if ($bm_isInstanceOfArray(value)) {\n vu = vl > 0 ? normalize(v) : [\n 0,\n 0,\n 0\n ];\n } else {\n vu = v < 0 ? -1 : 1;\n }\n tCur = 0;\n segDur = $bm_div($bm_mul(2, vl), g);\n tNext = segDur;\n nb = 1;\n while (tNext < t && nb <= nMax) {\n vl *= e;\n segDur *= e;\n tCur = tNext;\n tNext = $bm_sum(tNext, segDur);\n nb++;\n }\n if (nb <= nMax) {\n delta = $bm_sub(t, tCur);\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(vu, delta), $bm_sub(vl, $bm_div($bm_mul(g, delta), 2))));\n } else {\n $bm_rt = value;\n }\n } else\n $bm_rt = value;\n } else {\n $bm_rt = value;\n }\n} catch (err) {\n $bm_rt = value;\n}"},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[50],"t":41.25},{"s":[0],"t":55}],"ix":11,"x":"var $bm_rt;\nvar opacityInertialBounce, opacityBounceBack, n, n, t, t, v, amp, freq, decay, v, amp, freq, decay, e, g, nMax, e, g, nMax, n, n, t, v, vl, vu, vu, tCur, segDur, tNext, nb, delta;\nopacityInertialBounce = effect('Bounce & Drop - ukramedia.com')(44);\nopacityBounceBack = effect('Bounce & Drop - ukramedia.com')(45);\ntry {\n if (opacityInertialBounce == 1) {\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n }\n if (effect('Bounce & Drop - ukramedia.com')(58) == 1) {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(59);\n freq = effect('Bounce & Drop - ukramedia.com')(60);\n decay = effect('Bounce & Drop - ukramedia.com')(61);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n } else {\n if (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = effect('Bounce & Drop - ukramedia.com')(47);\n freq = effect('Bounce & Drop - ukramedia.com')(48);\n decay = effect('Bounce & Drop - ukramedia.com')(49);\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n } else {\n $bm_rt = value;\n }\n }\n } else if (opacityBounceBack == 1) {\n if (effect('Bounce & Drop - ukramedia.com')(64) == 1) {\n e = effect('Bounce & Drop - ukramedia.com')(65);\n g = effect('Bounce & Drop - ukramedia.com')(66);\n nMax = effect('Bounce & Drop - ukramedia.com')(67);\n } else {\n e = effect('Bounce & Drop - ukramedia.com')(52);\n g = effect('Bounce & Drop - ukramedia.com')(53);\n nMax = effect('Bounce & Drop - ukramedia.com')(54);\n }\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time)\n n--;\n }\n if (n > 0) {\n t = $bm_sub(time, key(n).time);\n v = $bm_mul($bm_neg(velocityAtTime($bm_sub(key(n).time, 0.001))), e);\n vl = length(v);\n if ($bm_isInstanceOfArray(value)) {\n vu = vl > 0 ? normalize(v) : [\n 0,\n 0,\n 0\n ];\n } else {\n vu = v < 0 ? -1 : 1;\n }\n tCur = 0;\n segDur = $bm_div($bm_mul(2, vl), g);\n tNext = segDur;\n nb = 1;\n while (tNext < t && nb <= nMax) {\n vl *= e;\n segDur *= e;\n tCur = tNext;\n tNext = $bm_sum(tNext, segDur);\n nb++;\n }\n if (nb <= nMax) {\n delta = $bm_sub(t, tCur);\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(vu, delta), $bm_sub(vl, $bm_div($bm_mul(g, delta), 2))));\n } else {\n $bm_rt = value;\n }\n } else\n $bm_rt = value;\n } else {\n $bm_rt = value;\n }\n} catch (err) {\n $bm_rt = value;\n}"}},"ef":[{"ty":5,"mn":"Pseudo/animationControl","nm":"Bounce & Drop - ukramedia.com","ix":1,"en":1,"ef":[{"ty":6,"mn":"Pseudo/animationControl-0001","nm":"Position","ix":1,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0002","nm":"Enable Inertial Bounce","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":7,"mn":"Pseudo/animationControl-0003","nm":"Enable Bounce Back","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":6,"mn":"Pseudo/animationControl-0004","nm":"Inertial Bounce Options","ix":4,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0005","nm":"Amplitude","ix":5,"v":{"a":0,"k":0.05,"ix":5}},{"ty":0,"mn":"Pseudo/animationControl-0006","nm":"Frequency","ix":6,"v":{"a":0,"k":4,"ix":6}},{"ty":0,"mn":"Pseudo/animationControl-0007","nm":"Decay","ix":7,"v":{"a":0,"k":8,"ix":7}},{"ty":6,"mn":"Pseudo/animationControl-0008","nm":"","ix":8,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0009","nm":"Bounce Back Options","ix":9,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0010","nm":"Elasticity","ix":10,"v":{"a":0,"k":0.7,"ix":10}},{"ty":0,"mn":"Pseudo/animationControl-0011","nm":"Gravity","ix":11,"v":{"a":0,"k":5000,"ix":11}},{"ty":0,"mn":"Pseudo/animationControl-0012","nm":"nMax","ix":12,"v":{"a":0,"k":9,"ix":12}},{"ty":6,"mn":"Pseudo/animationControl-0013","nm":"","ix":13,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0014","nm":"","ix":14,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0015","nm":"Scale","ix":15,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0016","nm":"Enable Inertial Bounce","ix":16,"v":{"a":0,"k":1,"ix":16}},{"ty":7,"mn":"Pseudo/animationControl-0017","nm":"Enable Bounce Back","ix":17,"v":{"a":0,"k":0,"ix":17}},{"ty":6,"mn":"Pseudo/animationControl-0018","nm":"Inertial Bounce Options","ix":18,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0019","nm":"Amplitude","ix":19,"v":{"a":0,"k":0.8,"ix":19}},{"ty":0,"mn":"Pseudo/animationControl-0020","nm":"Frequency","ix":20,"v":{"a":0,"k":4,"ix":20}},{"ty":0,"mn":"Pseudo/animationControl-0021","nm":"Decay","ix":21,"v":{"a":0,"k":8,"ix":21}},{"ty":6,"mn":"Pseudo/animationControl-0022","nm":"","ix":22,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0023","nm":"Bounce Back Options","ix":23,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0024","nm":"Elasticity","ix":24,"v":{"a":0,"k":0.7,"ix":24}},{"ty":0,"mn":"Pseudo/animationControl-0025","nm":"Gravity","ix":25,"v":{"a":0,"k":5000,"ix":25}},{"ty":0,"mn":"Pseudo/animationControl-0026","nm":"nMax","ix":26,"v":{"a":0,"k":9,"ix":26}},{"ty":6,"mn":"Pseudo/animationControl-0027","nm":"","ix":27,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0028","nm":"","ix":28,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0029","nm":"Rotation","ix":29,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0030","nm":"Enable Inertial Bounce","ix":30,"v":{"a":0,"k":0,"ix":30}},{"ty":7,"mn":"Pseudo/animationControl-0031","nm":"Enable Bounce Back","ix":31,"v":{"a":0,"k":0,"ix":31}},{"ty":6,"mn":"Pseudo/animationControl-0032","nm":"Inertial Bounce Options","ix":32,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0033","nm":"Amplitude","ix":33,"v":{"a":0,"k":0.05,"ix":33}},{"ty":0,"mn":"Pseudo/animationControl-0034","nm":"Frequency","ix":34,"v":{"a":0,"k":4,"ix":34}},{"ty":0,"mn":"Pseudo/animationControl-0035","nm":"Decay","ix":35,"v":{"a":0,"k":8,"ix":35}},{"ty":6,"mn":"Pseudo/animationControl-0036","nm":"","ix":36,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0037","nm":"Bounce Back Options","ix":37,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0038","nm":"Elasticity","ix":38,"v":{"a":0,"k":0.7,"ix":38}},{"ty":0,"mn":"Pseudo/animationControl-0039","nm":"Gravity","ix":39,"v":{"a":0,"k":5000,"ix":39}},{"ty":0,"mn":"Pseudo/animationControl-0040","nm":"nMax","ix":40,"v":{"a":0,"k":9,"ix":40}},{"ty":6,"mn":"Pseudo/animationControl-0041","nm":"","ix":41,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0042","nm":"","ix":42,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0043","nm":"Opacity","ix":43,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0044","nm":"Enable Inertial Bounce","ix":44,"v":{"a":0,"k":0,"ix":44}},{"ty":7,"mn":"Pseudo/animationControl-0045","nm":"Enable Bounce Back","ix":45,"v":{"a":0,"k":0,"ix":45}},{"ty":6,"mn":"Pseudo/animationControl-0046","nm":"Inertial Bounce Options","ix":46,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0047","nm":"Amplitude","ix":47,"v":{"a":0,"k":0.05,"ix":47}},{"ty":0,"mn":"Pseudo/animationControl-0048","nm":"Frequency","ix":48,"v":{"a":0,"k":4,"ix":48}},{"ty":0,"mn":"Pseudo/animationControl-0049","nm":"Decay","ix":49,"v":{"a":0,"k":8,"ix":49}},{"ty":6,"mn":"Pseudo/animationControl-0050","nm":"","ix":50,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0051","nm":"Bounce Back Options","ix":51,"v":0},{"ty":0,"mn":"Pseudo/animationControl-0052","nm":"Elasticity","ix":52,"v":{"a":0,"k":0.7,"ix":52}},{"ty":0,"mn":"Pseudo/animationControl-0053","nm":"Gravity","ix":53,"v":{"a":0,"k":5000,"ix":53}},{"ty":0,"mn":"Pseudo/animationControl-0054","nm":"nMax","ix":54,"v":{"a":0,"k":9,"ix":54}},{"ty":6,"mn":"Pseudo/animationControl-0055","nm":"","ix":55,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0056","nm":"","ix":56,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0057","nm":"Global Inertial Bounce Options","ix":57,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0058","nm":"Enable Global Inertial Bounce","ix":58,"v":{"a":0,"k":0,"ix":58}},{"ty":0,"mn":"Pseudo/animationControl-0059","nm":"Amplitude","ix":59,"v":{"a":0,"k":0.05,"ix":59}},{"ty":0,"mn":"Pseudo/animationControl-0060","nm":"Frequency","ix":60,"v":{"a":0,"k":4,"ix":60}},{"ty":0,"mn":"Pseudo/animationControl-0061","nm":"Decay","ix":61,"v":{"a":0,"k":8,"ix":61}},{"ty":6,"mn":"Pseudo/animationControl-0062","nm":"","ix":62,"v":0},{"ty":6,"mn":"Pseudo/animationControl-0063","nm":"Global Bounce Back Options","ix":63,"v":0},{"ty":7,"mn":"Pseudo/animationControl-0064","nm":"Enable Global Bounce Back","ix":64,"v":{"a":0,"k":0,"ix":64}},{"ty":0,"mn":"Pseudo/animationControl-0065","nm":"Elasticity","ix":65,"v":{"a":0,"k":0.7,"ix":65}},{"ty":0,"mn":"Pseudo/animationControl-0066","nm":"Gravity","ix":66,"v":{"a":0,"k":5000,"ix":66}},{"ty":0,"mn":"Pseudo/animationControl-0067","nm":"nMax","ix":67,"v":{"a":0,"k":9,"ix":67}},{"ty":6,"mn":"Pseudo/animationControl-0068","nm":"","ix":68,"v":0}]}],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-77.215],[77.216,0],[0,77.215],[-77.215,0]],"o":[[0,77.215],[-77.215,0],[0,-77.215],[77.216,0]],"v":[[139.811,0],[0,139.811],[-139.811,0],[0,-139.811]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8863,0.1176,0.1882],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[140.061,140.061],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4}],"v":"5.7.11","fr":30,"op":60,"ip":0,"assets":[]} \ No newline at end of file diff --git a/assets/animations/lottie/Loader.json b/assets/animations/lottie/Loader.json new file mode 100644 index 0000000..6ffaba4 --- /dev/null +++ b/assets/animations/lottie/Loader.json @@ -0,0 +1 @@ +{"nm":"newScene","ddd":0,"h":89,"w":87,"meta":{"g":"SVG to Lottie v0.15.1-0.6.0"},"layers":[{"ty":4,"nm":"","sr":1,"st":0,"op":145,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"nm":"","it":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4578999999999951,-0.7915999999999954],[0.5837000000000074,-0.04779999999999518],[0,0],[0.7841999999999985,-1.0872000000000028],[0.08370000000000033,-1.5309999999999988],[0,0],[0,0],[0,0],[0,0],[-0.7730999999999995,-1.0963999999999956],[-1.3689000000000036,-0.00269999999999726],[0,0],[0,0],[-0.4672999999999945,-0.7371000000000052],[-0.06629999999999825,-1.1026000000000025],[0,0],[0,0],[0,0],[0,0],[0.44539999999999935,0.6474000000000046],[0.08979999999999677,1.1196999999999946],[0,0],[0,0],[0.7180999999999997,1.1539999999999964],[1.2956000000000003,0.1752000000000038],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.6975000000000051,-1.1477000000000004],[0,-1.5995999999999952],[0,0],[0.5057000000000045,-0.699300000000008],[0.6049000000000007,0],[0,0],[0,0],[0,0],[-0.4679000000000002,0.7723999999999975],[-0.605599999999999,0.045999999999999375],[0,0],[0,0],[-0.708400000000001,1.1539000000000001],[0,1.6081000000000003],[0,0],[0.7216999999999985,1.1640000000000015],[1.4034999999999975,0.0945999999999998],[0,0],[0,0],[0,0],[0.4687000000000001,0.7625999999999991],[0,1.3160999999999987],[0,0],[0,0],[-0.4976000000000056,-0.6899999999999995],[-0.06589999999999918,-1.2172000000000018],[0,0],[0,0],[0,0],[-0.780300000000004,-1.0818000000000012],[-1.3714999999999975,0],[0,0],[0,0],[0,0],[0,0],[-0.7753000000000014,1.1095000000000041],[-0.08019999999999783,1.5247000000000028],[0,0],[0,0],[-0.5198999999999998,0.7158000000000015],[-0.5554000000000059,0.00019999999999953388],[0,0],[0,0],[-1.2428000000000026,1.1377000000000006],[-0.011699999999990496,0.010800000000001475],[0,0]],"o":[[0,1.334100000000003],[-0.44549999999999557,0.7698999999999998],[0,0],[-1.3445999999999998,0.00010000000000331966],[-0.7323999999999984,1.0152999999999963],[0,0],[0,0],[0,0],[0,0],[0.03580000000000183,1.6775999999999982],[0.7805999999999997,1.1067999999999998],[0,0],[0,0],[0.6218000000000075,0.04639999999999844],[0.418200000000013,0.6596999999999937],[0,0],[0,0],[0,0],[0,0],[-0.6043999999999983,0],[-0.4025999999999996,-0.5853999999999928],[0,0],[0,0],[0,-1.6077999999999975],[-0.6773000000000025,-1.0883000000000038],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.393099999999997,0.09390000000000498],[-0.6918999999999969,1.1385999999999967],[0,0],[-0.029200000000003,1.3703000000000003],[-0.4995999999999938,0.6905999999999892],[0,0],[0,0],[0,0],[0,-1.3253000000000057],[0.45700000000000074,-0.754400000000004],[0,0],[0,0],[1.3979,-0.09440000000000026],[0.7066999999999979,-1.1512000000000029],[0,0],[0,-1.6160999999999959],[-0.7198000000000029,-1.160899999999998],[0,0],[0,0],[0,0],[-0.5666999999999991,-0.04700000000000415],[-0.47689999999999877,-0.7762999999999991],[0,0],[0,0],[0.5625,0.00020000000000131024],[0.4695999999999998,0.6512999999999991],[0,0],[0,0],[0,0],[0.07270000000000465,1.6426000000000016],[0.7882999999999996,1.092800000000004],[0,0],[0,0],[0,0],[0,0],[1.383499999999998,-0.00010000000000331966],[0.7209999999999965,-1.031799999999997],[0,0],[0,0],[0.028800000000003934,-1.325099999999999],[0.5206999999999979,-0.7166999999999994],[0,0],[0,0],[2.543999999999997,-0.11350000000000016],[0.011899999999997135,-0.010899999999999466],[0,0],[0,0]],"v":[[73.6377,31.1362],[72.8926,34.4077],[71.3115,35.5864],[62.5371,35.5864],[59.2598,37.4057],[57.9971,41.3071],[57.9854,41.6157],[57.9854,41.6528],[58.0527,46.2387],[58.0527,46.2455],[59.2949,50.5053],[62.5947,52.3412],[62.5947,52.3422],[71.3672,52.4077],[73.0439,53.5551],[73.8203,56.2426],[73.835,56.725],[73.7715,72.6703],[52.873,72.6078],[52.8701,72.6078],[51.2695,71.6703],[50.4746,69.0952],[50.4502,68.6],[50.4502,54.7983],[49.3545,50.5307],[46.3604,48.4428],[46.0977,48.4164],[46.0586,48.4145],[46.0186,48.4145],[41.0215,48.4809],[40.9941,48.4809],[40.9678,48.4828],[37.7949,50.5737],[36.7451,54.7983],[36.7451,68.5356],[35.8428,71.6752],[34.1299,72.6733],[17.8916,72.6078],[13.6885,72.6078],[13.625,56.4594],[14.3926,53.2387],[16.0264,52.0756],[24.8906,52.0756],[24.9248,52.0737],[28.126,49.9545],[29.21,45.6918],[29.21,41.7709],[28.0908,37.4721],[24.8594,35.3227],[24.8223,35.3207],[24.7852,35.3207],[16.0234,35.3862],[14.415,34.2192],[13.625,31.0034],[13.625,15.1215],[34.1953,15.1215],[35.8496,16.1098],[36.7363,18.9477],[36.7451,19.1948],[36.7451,32.9526],[36.7461,32.975],[38.0527,37.1635],[41.3623,38.9828],[41.3623,38.9819],[45.8203,39.0483],[45.8271,39.0493],[45.835,39.0493],[49.1445,37.184],[50.373,33.2602],[50.3848,32.9526],[50.3848,19.3276],[51.3115,16.2123],[53.002,15.1879],[67.8867,15.1879],[67.9092,15.187],[73.6025,12.7241],[73.6377,12.6909],[73.6377,31.1362]]}}},{"ty":"st","bm":0,"hd":false,"nm":"","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":2},"c":{"a":0,"k":[0.9294,0.1098,0.1686]}},{"ty":"tm","bm":0,"hd":false,"nm":"","e":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"s":[100],"t":120}]},"o":{"a":0,"k":0},"s":{"a":null,"k":0},"m":1},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":1}],"v":"5.7.0","fr":60,"op":145,"ip":0,"assets":[]} \ No newline at end of file diff --git a/assets/animations/lottie/Nodata.json b/assets/animations/lottie/Nodata.json new file mode 100644 index 0000000..647c39d --- /dev/null +++ b/assets/animations/lottie/Nodata.json @@ -0,0 +1 @@ +{"nm":"Comp 1","ddd":0,"h":120,"w":120,"meta":{"g":"@lottiefiles/toolkit-js 0.33.2"},"layers":[{"ty":4,"nm":"ruoi","sr":1,"st":0,"op":50,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[60.531,10.945,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[57.361,61.016,0],"t":0,"ti":[-13.9099960327148,5.27300262451172,0],"to":[-4.67500305175781,-4.12800598144531,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[57.699,41.796,0],"t":10.219,"ti":[-4.54498291015625,3.73400115966797,0],"to":[12.8159942626953,-4.85800170898438,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[79.084,33.982,0],"t":19.445,"ti":[20.0290069580078,1.20700073242188,0],"to":[6.61601257324219,-5.43799591064453,0]},{"s":[59.691,9.121,0],"t":35}]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.033},"i":{"x":0.833,"y":0.967},"s":[100],"t":35},{"s":[0],"t":49}]}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"ruoi","ix":1,"cix":2,"np":3,"it":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.994,0],[0,-0.994],[0.995,0],[0,0.994]],"o":[[0.995,0],[0,0.994],[-0.994,0],[0,-0.994]],"v":[[-0.001,-1.801],[1.801,-0.001],[-0.001,1.801],[-1.801,-0.001]]}}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[62.4,13.144],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-1.422,0],[0,-1.422],[1.421,0],[0,1.422]],"o":[[1.421,0],[0,1.422],[-1.422,0],[0,-1.422]],"v":[[0.001,-2.574],[2.574,0],[0.001,2.574],[-2.574,0]]}}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100},"w":{"a":0,"k":0.7},"c":{"a":0,"k":[0.1804,0.1882,0.2235]}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[64.145,9.606],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-1.996,0],[0,-1.996],[1.996,0],[0,1.996]],"o":[[1.996,0],[0,1.996],[-1.996,0],[0,-1.996]],"v":[[0,-3.614],[3.614,0],[0,3.614],[-3.614,0]]}}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100},"w":{"a":0,"k":0.7},"c":{"a":0,"k":[0.1804,0.1882,0.2235]}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[57.957,10.552],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tr","a":{"a":0,"k":[60.531,10.941],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[60.531,10.941],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Shape Layer 2","sr":1,"st":0,"op":50,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[-0.75,-0.75,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.033},"i":{"x":0.833,"y":0.967},"s":[100],"t":35},{"s":[0],"t":49}]}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 6","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-13.91,5.273],[-4.545,3.734],[20.029,1.207]],"o":[[-4.675,-4.128],[12.816,-4.858],[6.616,-5.438],[0,0]],"v":[[-7.383,24.76],[-7.046,5.54],[14.34,-2.273],[-3.178,-24.76]]}}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":1},"d":[{"nm":"dash","n":"d","v":{"a":0,"k":2.028}},{"nm":"gap","n":"g","v":{"a":0,"k":2.028}},{"nm":"offset","n":"o","v":{"a":0,"k":0}}],"c":{"a":0,"k":[0.1804,0.1882,0.2235]}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[67.87,37.631],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.167,"y":0.033},"i":{"x":0.833,"y":0.953},"s":[0],"t":0},{"s":[100],"t":35}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":0,"k":0,"ix":1},"m":1}],"ind":2},{"ty":4,"nm":"im_emptyBox Outlines","sr":1,"st":0,"op":50,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[60,60,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[60,60,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"box","ix":1,"cix":2,"np":4,"it":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 7","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.001,-16.607],[-32.143,-0.002],[-0.001,16.607],[32.144,-0.002]]}}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8,0.8196,0.851]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[60,55.75],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 8","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[12.856,-23.249],[0,-16.605],[-12.857,-23.249],[-45,-6.641],[-32.144,0.001],[-45,6.645],[-12.857,23.249],[0,16.609],[12.856,23.249],[45,6.645],[32.143,0.001],[45,-6.641]]}}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9373,0.9373,0.9373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[60,55.748],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 9","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.072,24.171],[16.072,11.312],[16.072,-24.171],[-16.072,-24.171]]}}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9529,0.9529,0.9529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[76.072,83.33],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 10","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-32.143,-24.171],[-32.143,11.311],[-0.001,24.171],[32.144,11.311],[32.144,-24.171]]}}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8,0.8196,0.851]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[60,83.33],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tr","a":{"a":0,"k":[60,60.186],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[60,60.186],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3}],"v":"4.7.0","fr":25,"op":50,"ip":0,"assets":[]} \ No newline at end of file diff --git a/assets/animations/lottie/Ripple.json b/assets/animations/lottie/Ripple.json new file mode 100644 index 0000000..058b4ca --- /dev/null +++ b/assets/animations/lottie/Ripple.json @@ -0,0 +1 @@ +{"nm":"Comp 1","ddd":0,"h":100,"w":100,"meta":{"g":"@lottiefiles/toolkit-js 0.33.2"},"layers":[{"ty":4,"nm":"Shape Layer 2","sr":1,"st":0,"op":300,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[5.277,-32.723,0],"ix":1},"s":{"a":0,"k":[4.91,4.91,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[50.2,50.18,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 2","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"s":{"a":0,"k":[102.555,102.555],"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.0941,0.7608,0.451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[3.277,-34.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":2,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"s":{"a":0,"k":[102.555,102.555],"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.0941,0.7608,0.451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100],"t":0},{"s":[295,295],"t":60}],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[3.277,-34.527],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":0},{"s":[0],"t":60}],"ix":7}}]}],"ind":1}],"v":"5.5.7","fr":60,"op":61,"ip":0,"assets":[]} \ No newline at end of file diff --git a/assets/animations/lottie/ambulance.json b/assets/animations/lottie/ambulance.json new file mode 100644 index 0000000..b38e58d --- /dev/null +++ b/assets/animations/lottie/ambulance.json @@ -0,0 +1 @@ +{"nm":"F5XND4M_3","ddd":0,"h":500,"w":500,"meta":{"g":"@lottiefiles/toolkit-js 0.33.2"},"layers":[{"ty":4,"nm":"Layer 12","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,298.786,0],"t":0,"ti":[0,0,0],"to":[0,-0.833,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,293.786,0],"t":10,"ti":[0,-0.833,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,298.786,0],"t":20,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,293.786,0],"t":30,"ti":[0,-0.833,0],"to":[0,0,0]},{"s":[450.232,298.786,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.518,-3.779],[3.781,-0.517],[0.518,3.779],[-3.781,0.517]],"o":[[0.518,3.779],[-3.781,0.517],[-0.518,-3.779],[3.781,-0.517]],"v":[[6.846,-0.937],[0.938,6.842],[-6.846,0.937],[-0.938,-6.842]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Layer 6","sr":1,"st":0,"op":180,"ip":0,"hd":true,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,395.682,0],"t":1,"ti":[0,0,0],"to":[0,0.833,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,400.682,0],"t":11,"ti":[0,0.833,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,395.682,0],"t":21,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,400.682,0],"t":31,"ti":[0,0.833,0],"to":[0,0,0]},{"s":[63.907,395.682,0],"t":41}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.518,-3.779],[3.781,-0.517],[0.518,3.779],[-3.781,0.517]],"o":[[0.518,3.779],[-3.781,0.517],[-0.518,-3.779],[3.781,-0.517]],"v":[[6.846,-0.937],[0.938,6.842],[-6.846,0.937],[-0.938,-6.842]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Layer 2","sr":1,"st":0,"op":180,"ip":0,"hd":true,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,424.922,0],"t":0,"ti":[0,0,0],"to":[0,-0.667,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,420.922,0],"t":10,"ti":[0,-0.667,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,424.922,0],"t":20,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,420.922,0],"t":30,"ti":[0,-0.667,0],"to":[0,0,0]},{"s":[121.127,424.922,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.746,-5.442],[5.445,-0.745],[0.746,5.442],[-5.445,0.745]],"o":[[0.746,5.442],[-5.445,0.745],[-0.746,-5.442],[5.445,-0.745]],"v":[[9.859,-1.349],[1.351,9.853],[-9.859,1.349],[-1.351,-9.853]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":3,"nm":"Null 3","sr":1,"st":0,"op":129,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[131.911,173.859,0],"ix":2},"r":{"a":0,"k":138,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":0,"ix":11}},"ef":[],"ind":4},{"ty":4,"nm":"Layer 11","sr":1,"st":43,"op":129,"ip":43,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":43},{"s":[-100,100,100],"t":48}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[54.892,46.827,0],"t":43,"ti":[1.777,-1.646,0],"to":[-1.777,1.646,0]},{"s":[44.23,56.705,0],"t":48}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5,"parent":4},{"ty":4,"nm":"Layer 10","sr":1,"st":31,"op":41,"ip":31,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":31},{"s":[-134,134,100],"t":41}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":31,"ti":[5.313,-5.439,0],"to":[-5.313,5.439,0]},{"s":[23.889,75.927,0],"t":41}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":36},{"s":[0],"t":41}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6,"parent":4},{"ty":4,"nm":"Layer 9","sr":1,"st":18,"op":28,"ip":18,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":18},{"s":[-134,134,100],"t":28}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":18,"ti":[5.313,-5.439,0],"to":[-5.313,5.439,0]},{"s":[23.889,75.927,0],"t":28}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":23},{"s":[0],"t":28}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":7,"parent":4},{"ty":4,"nm":"Layer 8","sr":1,"st":7,"op":17,"ip":7,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":7},{"s":[-134,134,100],"t":17}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":7,"ti":[5.313,-5.439,0],"to":[-5.313,5.439,0]},{"s":[23.889,75.927,0],"t":17}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":12},{"s":[0],"t":17}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":8,"parent":4},{"ty":4,"nm":"Layer 7","sr":1,"st":0,"op":5,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-100,100,100],"t":0},{"s":[-134,134,100],"t":5}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[44.23,56.705,0],"t":0,"ti":[3.39,-3.204,0],"to":[-3.39,3.204,0]},{"s":[23.889,75.927,0],"t":5}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":0},{"s":[0],"t":5}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":9,"parent":4},{"ty":4,"nm":"Layer 5","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[396.051,136.57,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":4},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":8},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":12},{"o":{"x":0.191,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":16},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":23},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":27},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":31},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":35},{"s":[100,100,100],"t":39}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[396.051,136.57,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-6.092,-10.552],[0,0],[12.184,0],[0,0],[-6.092,10.552],[0,0]],"o":[[0,0],[6.092,10.552],[0,0],[-12.185,0],[0,0],[6.092,-10.552]],"v":[[13.709,-53.595],[66.454,37.767],[52.746,61.509],[-52.746,61.509],[-66.454,37.767],[-13.706,-53.595]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,146.499],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[-13.769,0],[0,0],[-7.045,-11.709],[0,0]],"o":[[0,0],[7.01,-11.85],[0,0],[13.665,0],[0,0],[0,0]],"v":[[-64.065,49.563],[-17.385,-30.444],[16.14,-49.563],[16.14,-49.563],[49.516,-30.693],[64.065,-6.511]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"d":[{"nm":"dash","n":"d","v":{"a":0,"k":6,"ix":1}},{"nm":"gap","n":"g","v":{"a":0,"k":10,"ix":2}},{"nm":"gap2","n":"g","v":{"a":0,"k":10,"ix":4}},{"nm":"gap3","n":"g","v":{"a":0,"k":10,"ix":6}}],"c":{"a":0,"k":[0.6627,0.6863,0.7686],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[386.167,114.696],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.779,7.779],[-7.779,7.779],[-7.779,-7.779],[7.779,-7.779]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.391,184.828],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-10.361,-23.305],[-10.361,5.407],[-7.127,23.336],[-0.018,23.336],[-0.018,23.348],[7.103,23.34],[10.348,5.39],[10.361,-23.348]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,140.911],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tr","a":{"a":0,"k":[401.402,140.911],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,140.911],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-6.092,-10.552],[0,0],[12.184,0],[0,0],[-6.092,10.552],[0,0]],"o":[[0,0],[6.092,10.552],[0,0],[-12.185,0],[0,0],[6.092,-10.552]],"v":[[13.709,-53.595],[66.454,37.767],[52.746,61.509],[-52.746,61.509],[-66.454,37.767],[-13.706,-53.595]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,146.499],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":10},{"ty":4,"nm":"Layer 4","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[351.654,335.209,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[351.654,335.209,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-5.899],[5.899,0],[0,5.899],[-5.899,0]],"o":[[0,5.899],[-5.899,0],[0,-5.899],[5.899,0]],"v":[[10.682,0],[0,10.682],[-10.682,0],[0,-10.682]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.652,334.504],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.654,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.654,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":11},{"ty":4,"nm":"Layer 3","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[91.751,335.209,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.751,335.209,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-5.899],[5.899,0],[0,5.899],[-5.899,0]],"o":[[0,5.899],[-5.899,0],[0,-5.899],[5.899,0]],"v":[[10.682,0],[0,10.682],[-10.682,0],[0,-10.682]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.749,334.504],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.751,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.751,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":12},{"ty":4,"nm":"Layer 1","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[221.146,268.245,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":0,"ti":[0,0,0],"to":[0,-0.5,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":5,"ti":[0,-0.5,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":10,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":15,"ti":[0,-0.5,0],"to":[0,0,0]},{"o":{"x":0.324,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":20,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":25,"ti":[0,-0.5,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":30,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":35,"ti":[0,-0.5,0],"to":[0,0,0]},{"s":[221.146,268.245,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[11.166,0],[4.286,-9.562],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-4.276,-9.562],[-11.156,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,-64.707],[59.545,64.707],[14.358,64.707],[-10.685,48.483],[-35.729,64.707],[-59.545,64.707],[-59.545,11.067],[-23.247,-12.056],[1.777,-64.707]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.433,259.275],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[44.92,72.136],[-119.713,72.136],[-119.713,-72.136],[119.713,-72.136],[119.713,72.136],[95.007,72.136]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.691,251.847],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[5.305,0],[0,0],[0,-5.305],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.305,0],[0,0],[0,0],[0,0],[0,-5.305]],"v":[[0,-10.37],[0,-10.37],[-9.605,-0.765],[-9.605,10.37],[9.605,10.37],[9.605,-0.765]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[131.871,184.202],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[30.878,-9.505],[9.504,-9.505],[9.504,-30.878],[-9.504,-30.878],[-9.504,-9.505],[-30.878,-9.505],[-30.878,9.504],[-9.504,9.504],[-9.504,30.878],[9.504,30.878],[9.504,9.504],[30.878,9.504]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[280.853,235.296],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 7","ix":5,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-31.952,16.61],[31.952,16.61],[31.952,-16.61],[-14.701,-16.61]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.6627,0.6863,0.7686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[111.137,230.612],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 8","ix":6,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.691],[0,0],[4.691,0],[0,0],[0,1.98],[1.554,3.425],[0,0]],"o":[[0,0],[0,4.691],[0,0],[0.396,-1.861],[0,-3.999],[0,0],[4.691,0]],"v":[[17.798,0],[17.798,0],[9.305,8.493],[-15.996,8.493],[-15.392,2.732],[-17.798,-8.493],[9.305,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[394.495,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 9","ix":7,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,1.98],[1.554,3.425]],"o":[[-1.554,3.425],[0,1.98],[0,0],[0.396,-1.861],[0,-3.999],[0,0]],"v":[[104.91,-8.493],[102.505,2.732],[103.108,8.493],[-103.109,8.493],[-102.505,2.732],[-104.91,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[221.701,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 10","ix":8,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,4.691],[0,0],[-4.691,0]],"o":[[-1.544,3.425],[0,1.98],[0,0],[-4.691,0],[0,0],[0,-4.691],[0,0]],"v":[[18.352,-8.493],[15.947,2.732],[16.55,8.493],[-9.859,8.493],[-18.352,0],[-18.352,0],[-9.859,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[48.352,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 11","ix":9,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.691],[0,0],[4.691,0],[0,0],[0,1.98],[1.554,3.425],[0,0]],"o":[[0,0],[0,4.691],[0,0],[0.396,-1.861],[0,-3.999],[0,0],[4.691,0]],"v":[[17.798,0],[17.798,0],[9.305,8.493],[-15.996,8.493],[-15.392,2.732],[-17.798,-8.493],[9.305,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[394.495,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 12","ix":10,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,1.98],[1.554,3.425]],"o":[[-1.554,3.425],[0,1.98],[0,0],[0.396,-1.861],[0,-3.999],[0,0]],"v":[[104.91,-8.493],[102.505,2.732],[103.108,8.493],[-103.109,8.493],[-102.505,2.732],[-104.91,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[221.701,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 13","ix":11,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,4.691],[0,0],[-4.691,0]],"o":[[-1.544,3.425],[0,1.98],[0,0],[-4.691,0],[0,0],[0,-4.691],[0,0]],"v":[[18.352,-8.493],[15.947,2.732],[16.55,8.493],[-9.859,8.493],[-18.352,0],[-18.352,0],[-9.859,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[48.352,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":1,"hd":false,"mn":"ADBE Vector Group","nm":"Group 14","ix":12,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[5.721,9.918],[-3.465,8.879]],"o":[[0,0],[0,0],[-11.453,0],[-4.89,-8.463],[0,0]],"v":[[42.236,-21.524],[42.236,21.524],[-10.514,21.524],[-37.943,5.687],[-40.081,-21.524]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[41.298,-0.235],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0,0.792156862745098,0.8117647058823529,0.8666666666666667,0.5,0.8627450980392157,0.8745098039215686,0.9058823529411765,1,0.9333333333333333,0.9411764705882353,0.9450980392156862],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[-43.173,-0.235],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[359.173,201.235],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 15","ix":13,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[119.713,9.09],[-119.713,9.09],[-119.713,-9.09],[119.713,-9.09]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.689,297.261],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 16","ix":14,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,9.09],[-59.545,9.09],[-59.545,-9.09],[59.545,-9.09]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.432,297.261],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 17","ix":15,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[11.166,0],[4.286,-9.562],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-4.276,-9.562],[-11.156,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,-64.707],[59.545,64.707],[14.358,64.707],[-10.685,48.483],[-35.729,64.707],[-59.545,64.707],[-59.545,11.067],[-23.247,-12.056],[1.777,-64.707]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.433,259.275],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 18","ix":16,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[44.92,72.136],[-119.713,72.136],[-119.713,-72.136],[119.713,-72.136],[119.713,72.136],[95.007,72.136]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.691,251.847],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":13},{"ty":0,"nm":"Pre-comp 1","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":true,"ao":0,"ks":{"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[250,250,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"masksProperties":[{"nm":"Mask 1","inv":false,"mode":"a","x":{"a":0,"k":0,"ix":4},"o":{"a":0,"k":100,"ix":3},"pt":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[27,346],[27,380],[458,380],[458,349]]},"ix":1}}],"w":500,"h":500,"refId":"comp_0","ind":14}],"v":"5.12.1","fr":30,"op":61,"ip":0,"assets":[{"nm":"Pre-comp 1","id":"comp_0","layers":[{"ty":4,"nm":"Layer 8","sr":1,"st":22,"op":75,"ip":22,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-197.04,362.657,0],"t":22,"ti":[-73.167,0,0],"to":[73.167,0,0]},{"s":[241.96,362.657,0],"t":42}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Layer 7","sr":1,"st":20,"op":40,"ip":20,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[241.96,362.657,0],"t":20,"ti":[-72.833,0,0],"to":[72.833,0,0]},{"s":[678.96,362.657,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Layer 6","sr":1,"st":2,"op":22,"ip":2,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-197.04,362.657,0],"t":2,"ti":[-73.167,0,0],"to":[73.167,0,0]},{"s":[241.96,362.657,0],"t":22}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Layer 2","sr":1,"st":0,"op":20,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[241.96,362.657,0],"t":0,"ti":[-72.833,0,0],"to":[72.833,0,0]},{"s":[678.96,362.657,0],"t":20}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4}]}]} \ No newline at end of file diff --git a/assets/animations/lottie/ambulance_alert.json b/assets/animations/lottie/ambulance_alert.json new file mode 100644 index 0000000..8fb93b1 --- /dev/null +++ b/assets/animations/lottie/ambulance_alert.json @@ -0,0 +1 @@ +{"nm":"after_ohno","ddd":0,"h":214,"w":240,"meta":{"g":"@lottiefiles/toolkit-js 0.26.1"},"layers":[{"ty":4,"nm":"! contornos","sr":1,"st":-34,"op":716,"ip":26,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[172.26,-42.033,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0,0,100],"t":26},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0,0,100],"t":27},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":-0.042},"s":[0,0,100],"t":28},{"o":{"x":0.167,"y":0.083},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":29},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[12.5,12.5,100],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[25,25,100],"t":31},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[37.5,37.5,100],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[50,50,100],"t":33},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[62.5,62.5,100],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[75,75,100],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.725},"s":[87.5,87.5,100],"t":36},{"o":{"x":0.167,"y":0.12},"i":{"x":0.833,"y":0.935},"s":[100,100,100],"t":37},{"o":{"x":0.167,"y":-0.292},"i":{"x":0.833,"y":0.654},"s":[128.739,128.739,100],"t":38},{"o":{"x":0.167,"y":0.11},"i":{"x":0.833,"y":0.866},"s":[122.364,122.364,100],"t":39},{"o":{"x":0.167,"y":0.22},"i":{"x":0.833,"y":0.924},"s":[102.249,102.249,100],"t":40},{"o":{"x":0.167,"y":-0.9},"i":{"x":0.833,"y":0.333},"s":[89.958,89.958,100],"t":41},{"o":{"x":0.167,"y":0.095},"i":{"x":0.833,"y":0.858},"s":[90.999,90.999,100],"t":42},{"o":{"x":0.167,"y":0.202},"i":{"x":0.833,"y":0.914},"s":[98.291,98.291,100],"t":43},{"o":{"x":0.167,"y":3.061},"i":{"x":0.833,"y":2.422},"s":[103.416,103.416,100],"t":44},{"o":{"x":0.167,"y":0.079},"i":{"x":0.833,"y":0.849},"s":[103.559,103.559,100],"t":45},{"o":{"x":0.167,"y":0.187},"i":{"x":0.833,"y":0.906},"s":[100.969,100.969,100],"t":46},{"o":{"x":0.167,"y":0.75},"i":{"x":0.833,"y":1.203},"s":[98.877,98.877,100],"t":47},{"o":{"x":0.167,"y":0.059},"i":{"x":0.833,"y":0.839},"s":[98.615,98.615,100],"t":48},{"o":{"x":0.167,"y":0.173},"i":{"x":0.833,"y":0.899},"s":[99.515,99.515,100],"t":49},{"o":{"x":0.167,"y":0.476},"i":{"x":0.833,"y":1.059},"s":[100.352,100.352,100],"t":50},{"o":{"x":0.167,"y":0.035},"i":{"x":0.833,"y":0.826},"s":[100.53,100.53,100],"t":51},{"o":{"x":0.167,"y":0.16},"i":{"x":0.833,"y":0.892},"s":[100.227,100.227,100],"t":52},{"o":{"x":0.167,"y":0.368},"i":{"x":0.833,"y":1.002},"s":[99.897,99.897,100],"t":53},{"o":{"x":0.167,"y":0.002},"i":{"x":0.833,"y":0.809},"s":[99.8,99.8,100],"t":54},{"o":{"x":0.167,"y":0.148},"i":{"x":0.833,"y":0.886},"s":[99.899,99.899,100],"t":55},{"o":{"x":0.167,"y":0.308},"i":{"x":0.833,"y":0.97},"s":[100.027,100.027,100],"t":56},{"o":{"x":0.167,"y":-0.046},"i":{"x":0.833,"y":0.784},"s":[100.074,100.074,100],"t":57},{"o":{"x":0.167,"y":0.135},"i":{"x":0.833,"y":0.879},"s":[100.044,100.044,100],"t":58},{"o":{"x":0.167,"y":0.269},"i":{"x":0.833,"y":0.95},"s":[99.995,99.995,100],"t":59},{"o":{"x":0.167,"y":-0.126},"i":{"x":0.833,"y":0.742},"s":[99.973,99.973,100],"t":60},{"o":{"x":0.167,"y":0.123},"i":{"x":0.833,"y":0.917},"s":[99.982,99.982,100],"t":61},{"o":{"x":0.167,"y":0.002},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":62},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":63},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":64},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":65},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":66},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":67},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":68},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":69},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":70},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":71},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":72},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":73},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":74},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":75},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":76},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":77},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":78},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":79},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":80},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":81},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":82},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":83},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":84},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":85},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":86},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":87},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":88},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":89},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":90},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":91},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":92},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":93},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":94},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":95},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":96},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":97},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":98},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":99},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":100},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":101},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":102},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":103},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":104},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":105},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":106},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":107},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":108},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":109},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":110},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":111},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":112},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":113},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":114},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":115},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":116},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":117},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":118},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":119},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":120},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":121},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":122},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":123},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":124},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":125},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":126},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":127},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":128},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":129},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":130},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":131},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":132},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":133},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":134},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":135},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":136},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":137},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":138},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":139},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":140},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":141},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":142},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":143},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":144},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":145},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":146},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":147},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":148},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":149},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":150},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":151},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":152},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":153},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":154},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":155},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":156},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":157},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":158},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":159},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":160},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":161},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":162},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":163},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":164},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":165},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":166},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":167},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":168},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":169},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":170},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":171},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":172},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":173},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":174},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":175},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":176},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":177},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":178},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":179},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":180},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":181},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":182},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":183},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":184},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":185},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":186},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":187},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":188},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":189},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":190},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":191},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":192},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":193},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":194},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":195},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":196},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":197},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":198},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":199},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":200},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":201},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":202},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":203},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":204},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":205},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":206},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":207},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":208},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":209},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":210},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":211},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":212},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":213},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":214},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":215},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":216},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":217},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":218},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":219},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":220},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":221},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":222},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":223},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":224},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":225},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":226},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":227},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":228},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":229},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":230},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":231},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":232},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":233},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":234},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":235},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":236},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":237},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":238},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":239},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":240},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":241},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":242},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":243},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":244},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":245},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":246},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":247},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":248},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":249},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":250},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":251},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":252},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":253},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":254},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":255},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":256},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":257},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":258},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":259},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":260},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":261},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":262},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":263},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":264},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":265},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":266},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":267},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":268},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":269},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":270},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":271},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":272},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":273},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":274},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":275},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":276},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":277},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":278},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":279},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":280},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":281},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":282},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":283},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":284},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":285},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":286},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":287},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":288},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":289},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":290},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":291},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":292},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":293},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":294},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":295},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":296},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":297},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":298},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":299},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":300},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":301},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":302},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":303},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":304},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":305},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":306},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":307},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":308},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":309},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":310},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":311},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":312},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":313},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":314},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":315},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":316},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":317},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":318},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":319},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":320},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":321},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":322},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":323},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":324},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":325},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":326},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":327},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":328},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":329},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":330},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":331},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":332},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":333},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":334},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":335},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":336},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":337},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":338},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":339},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":340},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":341},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":342},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":343},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":344},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":345},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":346},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":347},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":348},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":349},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":350},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":351},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":352},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":353},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":354},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":355},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":356},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":357},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":358},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":359},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":360},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":361},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":362},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":363},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":364},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":365},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":366},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":367},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":368},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":369},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":370},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":371},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":372},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":373},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":374},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":375},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":376},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":377},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":378},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":379},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":380},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":381},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":382},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":383},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":384},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":385},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":386},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":387},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":388},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":389},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":390},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":391},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":392},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":393},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":394},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":395},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":396},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":397},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":398},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":399},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":400},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":401},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":402},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":403},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":404},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":405},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":406},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":407},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":408},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":409},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":410},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":411},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":412},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":413},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":414},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":415},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":416},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":417},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":418},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":419},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":420},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":421},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":422},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":423},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":424},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":425},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":426},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":427},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":428},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":429},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":430},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":431},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":432},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":433},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":434},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":435},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":436},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":437},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":438},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":439},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":440},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":441},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":442},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":443},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":444},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":445},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":446},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":447},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":448},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":449},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":450},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":451},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":452},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":453},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":454},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":455},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":456},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":457},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":458},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":459},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":460},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":461},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":462},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":463},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":464},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":465},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":466},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":467},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":468},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":469},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":470},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":471},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":472},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":473},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":474},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":475},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":476},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":477},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":478},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":479},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":480},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":481},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":482},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":483},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":484},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":485},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":486},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":487},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":488},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":489},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":490},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":491},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":492},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":493},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":494},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":495},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":496},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":497},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":498},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":499},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":500},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":501},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":502},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":503},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":504},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":505},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":506},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":507},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":508},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":509},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":510},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":511},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":512},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":513},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":514},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":515},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":516},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":517},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":518},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":519},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":520},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":521},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":522},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":523},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":524},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":525},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":526},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":527},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":528},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":529},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":530},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":531},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":532},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":533},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":534},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":535},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":536},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":537},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":538},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":539},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":540},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":541},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":542},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":543},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":544},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":545},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":546},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":547},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":548},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":549},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":550},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":551},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":552},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":553},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":554},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":555},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":556},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":557},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":558},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":559},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":560},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":561},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":562},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":563},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":564},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":565},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":566},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":567},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":568},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":569},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":570},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":571},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":572},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":573},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":574},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":575},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":576},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":577},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":578},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":579},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":580},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":581},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":582},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":583},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":584},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":585},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":586},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":587},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":588},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":589},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":590},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":591},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":592},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":593},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":594},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":595},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":596},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":597},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":598},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":599},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":600},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":601},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":602},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":603},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":604},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":605},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":606},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":607},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":608},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":609},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":610},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":611},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":612},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":613},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":614},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":615},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":616},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":617},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":618},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":619},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":620},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":621},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":622},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":623},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":624},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":625},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":626},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":627},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":628},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":629},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":630},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":631},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":632},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":633},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":634},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":635},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":636},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":637},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":638},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":639},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":640},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":641},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":642},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":643},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":644},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":645},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":646},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":647},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":648},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":649},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":650},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":651},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":652},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":653},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":654},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":655},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":656},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":657},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":658},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":659},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":660},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":661},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":662},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":663},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":664},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":665},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":666},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":667},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":668},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":669},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":670},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":671},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":672},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":673},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":674},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":675},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":676},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":677},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":678},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":679},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":680},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":681},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":682},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":683},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":684},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":685},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":686},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":687},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":688},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":689},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":690},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":691},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":692},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":693},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":694},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":695},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":696},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":697},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":698},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":699},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":700},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":701},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":702},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":703},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":704},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":705},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":706},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":707},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":708},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":709},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":710},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":711},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":712},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":713},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":714},{"s":[100,100,100],"t":715}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[120,116.618,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"!","ix":1,"cix":2,"np":5,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"!","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-1.15,0],[-0.805,0.767],[-0.155,1.457],[0,0],[0,0],[1.648,1.42],[2.53,0],[1.648,-1.418],[0,-2.375],[0,0],[0,0],[-0.805,-0.765]],"o":[[1.15,0],[0.805,-0.765],[0,0],[0,0],[0,-2.375],[-1.65,-1.418],[-2.53,0],[-1.65,1.42],[0,0],[0,0],[0.153,1.457],[0.805,0.767]],"v":[[172.26,-23.46],[175.193,-24.61],[176.63,-27.945],[180.885,-72.565],[181,-73.83],[178.527,-79.523],[172.26,-81.65],[165.993,-79.523],[163.52,-73.83],[163.635,-72.68],[167.89,-27.945],[169.327,-24.61]]},"ix":2}},{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"!","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-2.455,0],[-1.61,1.65],[0,2.455],[1.61,1.65],[2.453,0],[1.61,-1.648],[0,-2.453],[-1.61,-1.648]],"o":[[2.453,0],[1.61,-1.648],[0,-2.453],[-1.61,-1.648],[-2.455,0],[-1.61,1.65],[0,2.455],[1.61,1.65]],"v":[[172.26,0.69],[178.355,-1.783],[180.77,-7.935],[178.355,-14.087],[172.26,-16.56],[166.165,-14.087],[163.75,-7.935],[166.165,-1.783]]},"ix":2}},{"ty":"mm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Mesclar caminhos 1","mm":1},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Preenchimento 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Camada de forma 1","sr":1,"st":0,"op":750,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[0,0,100],"t":28},{"s":[100,100,100],"t":35}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[120,107,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Polystar 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sr","bm":0,"hd":false,"mn":"ADBE Vector Shape - Star","nm":"Caminho Polystar 1","ix":1,"d":1,"ir":{"a":0,"k":53.5,"ix":6},"is":{"a":0,"k":51,"ix":8},"pt":{"a":0,"k":3,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"or":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":1},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":2},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":3},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":4},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":5},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":6},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":7},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":8},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":9},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":10},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":11},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":12},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":13},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":14},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":15},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":16},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":17},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":18},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":19},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":20},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":21},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":22},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":23},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":24},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":25},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":26},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":27},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":28},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":29},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":30},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":0.157},"s":[68],"t":31},{"o":{"x":0.167,"y":0.083},"i":{"x":0.833,"y":0.762},"s":[68],"t":32},{"o":{"x":0.167,"y":0.128},"i":{"x":0.833,"y":0.872},"s":[78.111],"t":33},{"o":{"x":0.167,"y":0.238},"i":{"x":0.833,"y":0.869},"s":[96.889],"t":34},{"o":{"x":0.167,"y":0.23},"i":{"x":0.833,"y":0.935},"s":[107],"t":35},{"o":{"x":0.167,"y":-0.292},"i":{"x":0.833,"y":0.654},"s":[112.729],"t":36},{"o":{"x":0.167,"y":0.11},"i":{"x":0.833,"y":0.866},"s":[111.459],"t":37},{"o":{"x":0.167,"y":0.22},"i":{"x":0.833,"y":0.924},"s":[107.448],"t":38},{"o":{"x":0.167,"y":-0.9},"i":{"x":0.833,"y":0.333},"s":[104.998],"t":39},{"o":{"x":0.167,"y":0.095},"i":{"x":0.833,"y":0.858},"s":[105.206],"t":40},{"o":{"x":0.167,"y":0.202},"i":{"x":0.833,"y":0.914},"s":[106.659],"t":41},{"o":{"x":0.167,"y":3.061},"i":{"x":0.833,"y":2.422},"s":[107.681],"t":42},{"o":{"x":0.167,"y":0.079},"i":{"x":0.833,"y":0.849},"s":[107.71],"t":43},{"o":{"x":0.167,"y":0.187},"i":{"x":0.833,"y":0.906},"s":[107.193],"t":44},{"o":{"x":0.167,"y":0.75},"i":{"x":0.833,"y":1.203},"s":[106.776],"t":45},{"o":{"x":0.167,"y":0.059},"i":{"x":0.833,"y":0.839},"s":[106.724],"t":46},{"o":{"x":0.167,"y":0.173},"i":{"x":0.833,"y":0.899},"s":[106.903],"t":47},{"o":{"x":0.167,"y":0.476},"i":{"x":0.833,"y":1.059},"s":[107.07],"t":48},{"o":{"x":0.167,"y":0.035},"i":{"x":0.833,"y":0.826},"s":[107.106],"t":49},{"o":{"x":0.167,"y":0.16},"i":{"x":0.833,"y":0.892},"s":[107.045],"t":50},{"o":{"x":0.167,"y":0.368},"i":{"x":0.833,"y":1.002},"s":[106.979],"t":51},{"o":{"x":0.167,"y":0.002},"i":{"x":0.833,"y":0.809},"s":[106.96],"t":52},{"o":{"x":0.167,"y":0.148},"i":{"x":0.833,"y":0.886},"s":[106.98],"t":53},{"o":{"x":0.167,"y":0.308},"i":{"x":0.833,"y":0.97},"s":[107.005],"t":54},{"o":{"x":0.167,"y":-0.046},"i":{"x":0.833,"y":0.784},"s":[107.015],"t":55},{"o":{"x":0.167,"y":0.135},"i":{"x":0.833,"y":0.879},"s":[107.009],"t":56},{"o":{"x":0.167,"y":0.269},"i":{"x":0.833,"y":0.95},"s":[106.999],"t":57},{"o":{"x":0.167,"y":-0.126},"i":{"x":0.833,"y":0.742},"s":[106.995],"t":58},{"o":{"x":0.167,"y":0.123},"i":{"x":0.833,"y":0.917},"s":[106.996],"t":59},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":60},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":61},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":62},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":63},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":64},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":65},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":66},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":67},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":68},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":69},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":70},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":71},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":72},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":73},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":74},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":75},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":76},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":77},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":78},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":79},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":80},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":81},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":82},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":83},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":84},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":85},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":86},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":87},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":88},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":89},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":90},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":91},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":92},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":93},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":94},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":95},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":96},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":97},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":98},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":99},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":100},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":101},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":102},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":103},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":104},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":105},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":106},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":107},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":108},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":109},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":110},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":111},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":112},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":113},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":114},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":115},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":116},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":117},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":118},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":119},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":120},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":121},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":122},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":123},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":124},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":125},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":126},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":127},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":128},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":129},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":130},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":131},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":132},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":133},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":134},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":135},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":136},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":137},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":138},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":139},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":140},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":141},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":142},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":143},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":144},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":145},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":146},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":147},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":148},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":149},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":150},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":151},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":152},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":153},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":154},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":155},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":156},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":157},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":158},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":159},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":160},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":161},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":162},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":163},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":164},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":165},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":166},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":167},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":168},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":169},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":170},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":171},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":172},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":173},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":174},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":175},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":176},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":177},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":178},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":179},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":180},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":181},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":182},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":183},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":184},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":185},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":186},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":187},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":188},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":189},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":190},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":191},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":192},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":193},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":194},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":195},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":196},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":197},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":198},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":199},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":200},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":201},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":202},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":203},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":204},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":205},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":206},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":207},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":208},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":209},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":210},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":211},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":212},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":213},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":214},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":215},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":216},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":217},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":218},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":219},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":220},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":221},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":222},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":223},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":224},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":225},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":226},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":227},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":228},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":229},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":230},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":231},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":232},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":233},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":234},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":235},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":236},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":237},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":238},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":239},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":240},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":241},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":242},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":243},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":244},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":245},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":246},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":247},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":248},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":249},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":250},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":251},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":252},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":253},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":254},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":255},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":256},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":257},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":258},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":259},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":260},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":261},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":262},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":263},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":264},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":265},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":266},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":267},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":268},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":269},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":270},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":271},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":272},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":273},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":274},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":275},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":276},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":277},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":278},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":279},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":280},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":281},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":282},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":283},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":284},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":285},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":286},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":287},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":288},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":289},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":290},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":291},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":292},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":293},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":294},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":295},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":296},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":297},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":298},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":299},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":300},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":301},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":302},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":303},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":304},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":305},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":306},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":307},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":308},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":309},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":310},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":311},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":312},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":313},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":314},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":315},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":316},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":317},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":318},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":319},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":320},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":321},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":322},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":323},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":324},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":325},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":326},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":327},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":328},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":329},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":330},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":331},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":332},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":333},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":334},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":335},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":336},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":337},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":338},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":339},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":340},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":341},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":342},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":343},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":344},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":345},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":346},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":347},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":348},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":349},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":350},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":351},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":352},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":353},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":354},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":355},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":356},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":357},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":358},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":359},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":360},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":361},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":362},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":363},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":364},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":365},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":366},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":367},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":368},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":369},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":370},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":371},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":372},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":373},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":374},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":375},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":376},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":377},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":378},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":379},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":380},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":381},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":382},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":383},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":384},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":385},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":386},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":387},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":388},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":389},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":390},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":391},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":392},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":393},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":394},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":395},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":396},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":397},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":398},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":399},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":400},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":401},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":402},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":403},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":404},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":405},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":406},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":407},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":408},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":409},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":410},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":411},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":412},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":413},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":414},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":415},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":416},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":417},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":418},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":419},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":420},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":421},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":422},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":423},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":424},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":425},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":426},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":427},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":428},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":429},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":430},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":431},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":432},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":433},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":434},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":435},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":436},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":437},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":438},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":439},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":440},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":441},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":442},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":443},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":444},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":445},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":446},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":447},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":448},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":449},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":450},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":451},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":452},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":453},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":454},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":455},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":456},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":457},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":458},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":459},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":460},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":461},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":462},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":463},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":464},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":465},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":466},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":467},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":468},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":469},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":470},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":471},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":472},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":473},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":474},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":475},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":476},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":477},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":478},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":479},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":480},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":481},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":482},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":483},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":484},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":485},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":486},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":487},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":488},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":489},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":490},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":491},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":492},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":493},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":494},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":495},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":496},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":497},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":498},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":499},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":500},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":501},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":502},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":503},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":504},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":505},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":506},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":507},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":508},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":509},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":510},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":511},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":512},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":513},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":514},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":515},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":516},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":517},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":518},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":519},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":520},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":521},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":522},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":523},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":524},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":525},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":526},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":527},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":528},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":529},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":530},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":531},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":532},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":533},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":534},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":535},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":536},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":537},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":538},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":539},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":540},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":541},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":542},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":543},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":544},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":545},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":546},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":547},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":548},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":549},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":550},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":551},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":552},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":553},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":554},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":555},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":556},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":557},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":558},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":559},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":560},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":561},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":562},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":563},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":564},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":565},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":566},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":567},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":568},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":569},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":570},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":571},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":572},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":573},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":574},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":575},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":576},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":577},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":578},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":579},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":580},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":581},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":582},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":583},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":584},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":585},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":586},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":587},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":588},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":589},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":590},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":591},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":592},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":593},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":594},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":595},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":596},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":597},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":598},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":599},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":600},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":601},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":602},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":603},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":604},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":605},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":606},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":607},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":608},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":609},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":610},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":611},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":612},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":613},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":614},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":615},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":616},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":617},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":618},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":619},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":620},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":621},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":622},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":623},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":624},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":625},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":626},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":627},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":628},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":629},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":630},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":631},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":632},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":633},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":634},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":635},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":636},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":637},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":638},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":639},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":640},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":641},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":642},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":643},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":644},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":645},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":646},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":647},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":648},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":649},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":650},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":651},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":652},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":653},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":654},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":655},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":656},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":657},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":658},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":659},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":660},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":661},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":662},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":663},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":664},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":665},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":666},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":667},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":668},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":669},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":670},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":671},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":672},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":673},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":674},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":675},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":676},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":677},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":678},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":679},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":680},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":681},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":682},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":683},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":684},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":685},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":686},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":687},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":688},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":689},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":690},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":691},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":692},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":693},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":694},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":695},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":696},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":697},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":698},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":699},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":700},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":701},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":702},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":703},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":704},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":705},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":706},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":707},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":708},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":709},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":710},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":711},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":712},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":713},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":714},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":715},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":716},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":717},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":718},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":719},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":720},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":721},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":722},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":723},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":724},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":725},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":726},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":727},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":728},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":729},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":730},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":731},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":732},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":733},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":734},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":735},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":736},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":737},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":738},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":739},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":740},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":741},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":742},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":743},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":744},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":745},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":746},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":747},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":748},{"s":[107],"t":749}],"ix":7},"os":{"a":0,"k":0,"ix":9},"r":{"a":0,"k":0,"ix":5},"sy":1},{"ty":"rd","bm":0,"hd":false,"mn":"ADBE Vector Filter - RC","nm":"Arredondar cantos 1","ix":2,"r":{"a":0,"k":40,"ix":1}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Traçado 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"c":{"a":0,"k":[1,1,1],"ix":3}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Preenchimento 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,23],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2}],"v":"5.1.8","fr":25,"op":66,"ip":28,"assets":[]} \ No newline at end of file diff --git a/assets/animations/lottie/checkmark.json b/assets/animations/lottie/checkmark.json new file mode 100755 index 0000000..998a915 --- /dev/null +++ b/assets/animations/lottie/checkmark.json @@ -0,0 +1,767 @@ +{ + "nm": "HDFC Success", + "h": 512, + "w": 512, + "meta": { + "g": "LottieFiles AE 1.0.0" + }, + "layers": [ + { + "ty": 4, + "nm": "check", + "sr": 1, + "st": 0, + "op": 240, + "ip": 0, + "hasMask": false, + "ao": 0, + "ks": { + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + }, + "sk": { + "a": 0, + "k": 0 + }, + "p": { + "a": 0, + "k": [ + 256, + 256, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "sa": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "ef": [], + "shapes": [ + { + "ty": "gr", + "nm": "Shape 1", + "it": [ + { + "ty": "sh", + "nm": "Path 1", + "d": 1, + "ks": { + "a": 0, + "k": { + "c": false, + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -82.5, + 4.5 + ], + [ + -31, + 55 + ], + [ + 73, + -52.5 + ] + ] + } + } + }, + { + "ty": "tm", + "nm": "Trim Paths 1", + "e": { + "a": 1, + "k": [ + { + "o": { + "x": 1, + "y": 0.076 + }, + "i": { + "x": 0.667, + "y": 1 + }, + "s": [ + 0 + ], + "t": 60 + }, + { + "s": [ + 100 + ], + "t": 85 + } + ] + }, + "o": { + "a": 0, + "k": 0 + }, + "s": { + "a": 0, + "k": 0 + }, + "m": 1 + }, + { + "ty": "st", + "nm": "Stroke 1", + "lc": 2, + "lj": 2, + "ml": 1, + "o": { + "a": 0, + "k": 100 + }, + "w": { + "a": 0, + "k": 30 + }, + "c": { + "a": 0, + "k": [ + 1, + 1, + 1 + ] + } + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "sk": { + "a": 0, + "k": 0 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "sa": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ], + "ind": 1 + }, + { + "ty": 4, + "nm": "Shape Layer 2", + "sr": 1, + "st": 0, + "op": 240, + "ip": 0, + "hasMask": false, + "ao": 0, + "ks": { + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 1, + "k": [ + { + "o": { + "x": 0.656, + "y": 0.872 + }, + "i": { + "x": 0, + "y": 0.98 + }, + "s": [ + 0, + 0, + 100 + ], + "t": 20 + }, + { + "s": [ + 150, + 150, + 100 + ], + "t": 60 + } + ] + }, + "sk": { + "a": 0, + "k": 0 + }, + "p": { + "a": 0, + "k": [ + 256, + 257.86, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "sa": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "ef": [], + "shapes": [ + { + "ty": "gr", + "nm": "Ellipse 1", + "it": [ + { + "ty": "el", + "nm": "Ellipse Path 1", + "d": 1, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 236, + 236 + ] + } + }, + { + "ty": "fl", + "nm": "Fill 1", + "c": { + "a": 0, + "k": [ + 0.094, + 0.761, + 0.451 + ] + }, + "r": 1, + "o": { + "a": 0, + "k": 100 + } + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "sk": { + "a": 0, + "k": 0 + }, + "p": { + "a": 0, + "k": [ + 0, + -3 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "sa": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ], + "ind": 2 + }, + { + "ty": 4, + "nm": "Shape Layer 1", + "sr": 1, + "st": 0, + "op": 240, + "ip": 0, + "hasMask": false, + "ao": 0, + "ks": { + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 1, + "k": [ + { + "o": { + "x": 0.477, + "y": 0.587 + }, + "i": { + "x": 0, + "y": 0.999 + }, + "s": [ + 0, + 0, + 100 + ], + "t": 10 + }, + { + "o": { + "x": 0.167, + "y": 0.167 + }, + "i": { + "x": 0.833, + "y": 0.833 + }, + "s": [ + 150, + 150, + 100 + ], + "t": 50 + }, + { + "o": { + "x": 0.167, + "y": 0 + }, + "i": { + "x": 0.833, + "y": 1 + }, + "s": [ + 150, + 150, + 100 + ], + "t": 76 + }, + { + "s": [ + 210, + 210, + 100 + ], + "t": 123 + } + ] + }, + "sk": { + "a": 0, + "k": 0 + }, + "p": { + "a": 0, + "k": [ + 256, + 257.86, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "sa": { + "a": 0, + "k": 0 + }, + "o": { + "a": 1, + "k": [ + { + "o": { + "x": 0.912, + "y": 0.073 + }, + "i": { + "x": 0.626, + "y": 0.729 + }, + "s": [ + 100 + ], + "t": 76 + }, + { + "s": [ + 0 + ], + "t": 119 + } + ] + } + }, + "ef": [], + "shapes": [ + { + "ty": "gr", + "nm": "Ellipse 1", + "it": [ + { + "ty": "el", + "nm": "Ellipse Path 1", + "d": 1, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 236, + 236 + ] + } + }, + { + "ty": "st", + "nm": "Stroke 1", + "lc": 1, + "lj": 1, + "ml": 4, + "o": { + "a": 0, + "k": 100 + }, + "w": { + "a": 0, + "k": 2 + }, + "c": { + "a": 0, + "k": [ + 1, + 1, + 1 + ] + } + }, + { + "ty": "fl", + "nm": "Fill 1", + "c": { + "a": 0, + "k": [ + 0.784, + 0.945, + 0.878 + ] + }, + "r": 1, + "o": { + "a": 0, + "k": 100 + } + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "sk": { + "a": 0, + "k": 0 + }, + "p": { + "a": 0, + "k": [ + 0, + -3 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "sa": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ], + "ind": 3 + }, + { + "ty": 4, + "nm": "BG", + "sr": 1, + "st": 0, + "op": 240, + "ip": 0, + "hasMask": false, + "ao": 0, + "ks": { + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ] + }, + "sk": { + "a": 0, + "k": 0 + }, + "p": { + "a": 0, + "k": [ + 256, + 256, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "sa": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + }, + "ef": [], + "shapes": [ + { + "ty": "gr", + "nm": "Rectangle 1", + "it": [ + { + "ty": "rc", + "nm": "Rectangle Path 1", + "d": 1, + "p": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "s": { + "a": 0, + "k": [ + 554, + 556 + ] + } + }, + { + "ty": "fl", + "nm": "Fill 1", + "c": { + "a": 0, + "k": [ + 0.972, + 0.972, + 0.972 + ] + }, + "r": 1, + "o": { + "a": 0, + "k": 100 + } + }, + { + "ty": "tr", + "a": { + "a": 0, + "k": [ + 0, + 0 + ] + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ] + }, + "sk": { + "a": 0, + "k": 0 + }, + "p": { + "a": 0, + "k": [ + -1, + 6 + ] + }, + "r": { + "a": 0, + "k": 0 + }, + "sa": { + "a": 0, + "k": 0 + }, + "o": { + "a": 0, + "k": 100 + } + } + ] + } + ], + "ind": 4 + } + ], + "v": "4.8.0", + "fr": 60, + "op": 130, + "ip": 0, + "assets": [] +} \ No newline at end of file diff --git a/assets/animations/lottie/login.json b/assets/animations/lottie/login.json new file mode 100755 index 0000000..4010d1e --- /dev/null +++ b/assets/animations/lottie/login.json @@ -0,0 +1 @@ +{"nm":"Pincode password protection","h":1200,"w":1200,"meta":{"g":"LottieFiles AE 3.5.6"},"layers":[{"ty":0,"nm":"security","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[375.453,928.37,0],"t":0},{"s":[375.453,928.37,0],"t":239}]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[372.663,928.043,0],"t":8},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[372.957,927.471,0],"t":11},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[373.328,926.769,0],"t":14},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[373.612,926.237,0],"t":16},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[373.921,925.663,0],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[374.249,925.053,0],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[374.595,924.41,0],"t":22},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[374.954,923.74,0],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[375.321,923.052,0],"t":26},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[375.691,922.35,0],"t":28},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[376.061,921.64,0],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[376.427,920.928,0],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[376.784,920.218,0],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[377.129,919.517,0],"t":36},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[377.456,918.83,0],"t":38},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[377.761,918.167,0],"t":40},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[378.039,917.531,0],"t":42},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[378.397,916.64,0],"t":45},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[378.665,915.846,0],"t":48},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[378.845,914.975,0],"t":52},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[378.511,914.29,0],"t":62},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[378.168,914.238,0],"t":65},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[377.991,914.234,0],"t":66},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[377.786,914.245,0],"t":67},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[377.555,914.276,0],"t":68},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[377.299,914.331,0],"t":69},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[377.023,914.41,0],"t":70},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[376.73,914.514,0],"t":71},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[376.424,914.643,0],"t":72},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[376.106,914.796,0],"t":73},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[375.777,914.973,0],"t":74},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[375.438,915.172,0],"t":75},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[375.091,915.391,0],"t":76},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[374.738,915.63,0],"t":77},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[374.378,915.887,0],"t":78},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[374.014,916.159,0],"t":79},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[373.645,916.447,0],"t":80},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[373.272,916.749,0],"t":81},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[372.896,917.064,0],"t":82},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[372.516,917.39,0],"t":83},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[372.135,917.728,0],"t":84},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[371.751,918.074,0],"t":85},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[371.367,918.428,0],"t":86},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[370.982,918.789,0],"t":87},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[370.598,919.155,0],"t":88},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[370.214,919.525,0],"t":89},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[369.832,919.898,0],"t":90},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[369.452,920.273,0],"t":91},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[369.074,920.648,0],"t":92},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[368.699,921.024,0],"t":93},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[368.327,921.397,0],"t":94},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[367.959,921.768,0],"t":95},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[367.596,922.134,0],"t":96},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[367.238,922.495,0],"t":97},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[366.885,922.849,0],"t":98},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[366.538,923.197,0],"t":99},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[366.197,923.537,0],"t":100},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[365.862,923.867,0],"t":101},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[365.535,924.185,0],"t":102},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[365.216,924.492,0],"t":103},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[364.906,924.783,0],"t":104},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[364.606,925.06,0],"t":105},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[364.315,925.32,0],"t":106},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[364.033,925.563,0],"t":107},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[363.76,925.788,0],"t":108},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[363.497,925.991,0],"t":109},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[363.245,926.172,0],"t":110},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[363.005,926.326,0],"t":111},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[362.776,926.451,0],"t":112},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[362.561,926.541,0],"t":113},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[362.361,926.588,0],"t":114},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[362.051,926.526,0],"t":116},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[361.755,925.758,0],"t":127},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[361.713,924.983,0],"t":131},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[361.76,924.229,0],"t":134},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[361.878,923.363,0],"t":137},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[361.995,922.737,0],"t":139},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[362.141,922.078,0],"t":141},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[362.315,921.392,0],"t":143},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[362.512,920.689,0],"t":145},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[362.731,919.975,0],"t":147},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[362.969,919.258,0],"t":149},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[363.225,918.542,0],"t":151},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[363.494,917.836,0],"t":153},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[363.776,917.144,0],"t":155},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[364.068,916.474,0],"t":157},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[364.365,915.834,0],"t":159},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[364.667,915.23,0],"t":161},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[364.971,914.668,0],"t":163},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[365.274,914.156,0],"t":165},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[365.573,913.702,0],"t":167},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[365.866,913.314,0],"t":169},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[366.15,913.001,0],"t":171},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[366.421,912.773,0],"t":173},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[366.764,912.616,0],"t":176},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[367.067,912.665,0],"t":183},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[367.343,912.895,0],"t":186},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[367.673,913.356,0],"t":189},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[368.022,914.018,0],"t":192},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[368.382,914.849,0],"t":195},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[368.625,915.481,0],"t":197},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[368.87,916.165,0],"t":199},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[369.114,916.893,0],"t":201},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[369.359,917.661,0],"t":203},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[369.602,918.457,0],"t":205},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[369.843,919.273,0],"t":207},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[370.079,920.101,0],"t":209},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[370.31,920.933,0],"t":211},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[370.536,921.762,0],"t":213},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[370.755,922.582,0],"t":215},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[370.968,923.385,0],"t":217},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[371.172,924.164,0],"t":219},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[371.366,924.908,0],"t":221},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[371.548,925.611,0],"t":223},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[371.72,926.265,0],"t":225},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[371.952,927.141,0],"t":228},{"s":[372.208,928.068,0],"t":232}]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"w":1200,"h":1200,"refId":"comp_0","ind":1},{"ty":0,"nm":"pin","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[414.085,860.765,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[414.085,860.765,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-2],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.997],"t":1},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.987],"t":2},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.971],"t":3},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.949],"t":4},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.921],"t":5},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.888],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.849],"t":7},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.806],"t":8},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.757],"t":9},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.704],"t":10},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.646],"t":11},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.584],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.518],"t":13},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.448],"t":14},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.375],"t":15},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.298],"t":16},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.219],"t":17},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.136],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.051],"t":19},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.963],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.873],"t":21},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.781],"t":22},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.687],"t":23},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.592],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.495],"t":25},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.398],"t":26},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.299],"t":27},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.2],"t":28},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.1],"t":29},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.1],"t":31},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.2],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.299],"t":33},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.398],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.495],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.592],"t":36},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.687],"t":37},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.781],"t":38},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.873],"t":39},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.963],"t":40},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.051],"t":41},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.136],"t":42},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.219],"t":43},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.298],"t":44},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.375],"t":45},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.448],"t":46},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.518],"t":47},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.584],"t":48},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.646],"t":49},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.704],"t":50},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.757],"t":51},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.806],"t":52},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.849],"t":53},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.888],"t":54},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.921],"t":55},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.949],"t":56},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.971],"t":57},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.987],"t":58},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.997],"t":59},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[2],"t":60},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.997],"t":61},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.987],"t":62},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.971],"t":63},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.949],"t":64},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.921],"t":65},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.888],"t":66},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.849],"t":67},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.806],"t":68},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.757],"t":69},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.704],"t":70},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.646],"t":71},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.584],"t":72},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.518],"t":73},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.448],"t":74},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.375],"t":75},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.298],"t":76},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.219],"t":77},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.136],"t":78},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.051],"t":79},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.963],"t":80},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.873],"t":81},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.781],"t":82},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.687],"t":83},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.592],"t":84},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.495],"t":85},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.398],"t":86},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.299],"t":87},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.2],"t":88},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.1],"t":89},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.1],"t":91},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.2],"t":92},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.299],"t":93},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.398],"t":94},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.495],"t":95},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.592],"t":96},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.687],"t":97},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.781],"t":98},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.873],"t":99},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.963],"t":100},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.051],"t":101},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.136],"t":102},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.219],"t":103},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.298],"t":104},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.375],"t":105},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.448],"t":106},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.518],"t":107},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.584],"t":108},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.646],"t":109},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.704],"t":110},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.757],"t":111},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.806],"t":112},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.849],"t":113},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.888],"t":114},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.921],"t":115},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.949],"t":116},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.971],"t":117},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.987],"t":118},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.997],"t":119},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-2],"t":120},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.997],"t":121},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.987],"t":122},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.971],"t":123},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.949],"t":124},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.921],"t":125},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.888],"t":126},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.849],"t":127},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.806],"t":128},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.757],"t":129},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.704],"t":130},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.646],"t":131},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.584],"t":132},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.518],"t":133},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.448],"t":134},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.375],"t":135},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.298],"t":136},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.219],"t":137},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.136],"t":138},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.051],"t":139},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.963],"t":140},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.873],"t":141},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.781],"t":142},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.687],"t":143},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.592],"t":144},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.495],"t":145},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.398],"t":146},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.299],"t":147},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.2],"t":148},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.1],"t":149},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.1],"t":151},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.2],"t":152},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.299],"t":153},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.398],"t":154},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.495],"t":155},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.592],"t":156},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.687],"t":157},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.781],"t":158},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.873],"t":159},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.963],"t":160},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.051],"t":161},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.136],"t":162},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.219],"t":163},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.298],"t":164},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.375],"t":165},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.448],"t":166},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.518],"t":167},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.584],"t":168},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.646],"t":169},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.704],"t":170},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.757],"t":171},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.806],"t":172},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.849],"t":173},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.888],"t":174},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.921],"t":175},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.949],"t":176},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.971],"t":177},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.987],"t":178},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.997],"t":179},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[2],"t":180},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.997],"t":181},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.987],"t":182},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.971],"t":183},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.949],"t":184},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.921],"t":185},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.888],"t":186},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.849],"t":187},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.806],"t":188},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.757],"t":189},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.704],"t":190},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.646],"t":191},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.584],"t":192},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.518],"t":193},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.448],"t":194},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.375],"t":195},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.298],"t":196},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.219],"t":197},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.136],"t":198},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1.051],"t":199},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.963],"t":200},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.873],"t":201},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.781],"t":202},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.687],"t":203},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.592],"t":204},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.495],"t":205},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.398],"t":206},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.299],"t":207},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.2],"t":208},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.1],"t":209},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.1],"t":211},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.2],"t":212},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.299],"t":213},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.398],"t":214},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.495],"t":215},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.592],"t":216},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.687],"t":217},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.781],"t":218},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.873],"t":219},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-0.963],"t":220},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.051],"t":221},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.136],"t":222},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.219],"t":223},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.298],"t":224},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.375],"t":225},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.448],"t":226},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.518],"t":227},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.584],"t":228},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.646],"t":229},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.704],"t":230},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.757],"t":231},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.806],"t":232},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.849],"t":233},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.888],"t":234},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.921],"t":235},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.949],"t":236},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.971],"t":237},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-1.987],"t":238},{"s":[-1.997],"t":239}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"w":1200,"h":1200,"refId":"comp_1","ind":2},{"ty":0,"nm":"lock","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[600,1200,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[596.603,1199.801,0],"t":1},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[596.155,1200.22,0],"t":2},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[595.717,1200.631,0],"t":3},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[595.29,1201.032,0],"t":4},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[594.878,1201.423,0],"t":5},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[594.483,1201.8,0],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[594.108,1202.162,0],"t":7},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[593.756,1202.506,0],"t":8},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[593.429,1202.83,0],"t":9},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[592.868,1203.409,0],"t":11},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[592.307,1204.085,0],"t":14},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[592.579,1205.248,0],"t":21},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[592.994,1205.484,0],"t":23},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[593.527,1205.674,0],"t":25},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[593.832,1205.752,0],"t":26},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[594.161,1205.818,0],"t":27},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[594.51,1205.872,0],"t":28},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[594.879,1205.914,0],"t":29},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[595.265,1205.945,0],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[595.666,1205.964,0],"t":31},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[596.081,1205.971,0],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[596.507,1205.967,0],"t":33},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[596.943,1205.952,0],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[597.387,1205.925,0],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[597.836,1205.888,0],"t":36},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[598.29,1205.841,0],"t":37},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[598.747,1205.783,0],"t":38},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[599.204,1205.716,0],"t":39},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[599.661,1205.639,0],"t":40},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600.115,1205.553,0],"t":41},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600.566,1205.459,0],"t":42},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.01,1205.356,0],"t":43},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.448,1205.246,0],"t":44},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.877,1205.129,0],"t":45},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[602.296,1205.006,0],"t":46},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[602.704,1204.877,0],"t":47},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.098,1204.742,0],"t":48},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.479,1204.604,0],"t":49},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.843,1204.461,0],"t":50},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.191,1205.097,0],"t":51},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.52,1207.477,0],"t":52},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.83,1211.377,0],"t":53},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[605.119,1215.839,0],"t":54},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[605.386,1219.841,0],"t":55},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[605.63,1222.925,0],"t":56},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[605.849,1225.063,0],"t":57},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[606.043,1226.391,0],"t":58},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[606.463,1226.246,0],"t":61},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[606.545,1223.607,0],"t":62},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[606.597,1219.446,0],"t":63},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[606.617,1214.725,0],"t":64},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[606.605,1210.493,0],"t":65},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[606.56,1207.19,0],"t":66},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[606.48,1204.841,0],"t":67},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[606.366,1203.321,0],"t":68},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[605.808,1202.249,0],"t":71},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[605.248,1202.325,0],"t":73},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.931,1202.379,0],"t":74},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.609,1202.428,0],"t":75},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.282,1202.471,0],"t":76},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.952,1202.509,0],"t":77},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.619,1202.54,0],"t":78},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.285,1202.566,0],"t":79},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[602.95,1202.586,0],"t":80},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[602.616,1202.599,0],"t":81},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[602.284,1202.606,0],"t":82},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.953,1202.606,0],"t":83},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.625,1202.599,0],"t":84},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.301,1202.586,0],"t":85},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600.981,1202.567,0],"t":86},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600.666,1202.54,0],"t":87},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600.357,1202.507,0],"t":88},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[599.757,1202.421,0],"t":90},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[599.186,1202.309,0],"t":92},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[598.647,1202.171,0],"t":94},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[598.142,1202.009,0],"t":96},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[597.673,1201.823,0],"t":98},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[597.242,1201.616,0],"t":100},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[596.667,1201.268,0],"t":103},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[596.176,1200.883,0],"t":106},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[595.648,1200.329,0],"t":110},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[595.077,1199.462,0],"t":116},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[594.547,1198.412,0],"t":124},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[593.996,1197.825,0],"t":131},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[593.451,1197.685,0],"t":136},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[593.901,1197.562,0],"t":153},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[594.423,1197.555,0],"t":156},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[594.842,1197.55,0],"t":158},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[595.313,1197.543,0],"t":160},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[595.833,1197.533,0],"t":162},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[596.398,1197.521,0],"t":164},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[596.695,1197.513,0],"t":165},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[597.002,1197.505,0],"t":166},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[597.316,1197.496,0],"t":167},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[597.638,1197.485,0],"t":168},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[597.966,1197.474,0],"t":169},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[598.3,1197.462,0],"t":170},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[598.639,1197.448,0],"t":171},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[598.981,1197.433,0],"t":172},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[599.326,1197.418,0],"t":173},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[599.672,1197.4,0],"t":174},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600.018,1197.382,0],"t":175},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600.363,1197.362,0],"t":176},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600.706,1197.341,0],"t":177},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.046,1197.319,0],"t":178},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.38,1197.296,0],"t":179},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.709,1197.271,0],"t":180},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[602.029,1197.245,0],"t":181},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[602.341,1197.217,0],"t":182},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[602.93,1197.158,0],"t":184},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.463,1197.094,0],"t":186},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.927,1197.025,0],"t":188},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.461,1197.143,0],"t":191},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.588,1197.879,0],"t":192},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.686,1199.276,0],"t":193},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.754,1201.487,0],"t":194},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.792,1204.654,0],"t":195},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.801,1208.783,0],"t":196},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.784,1213.452,0],"t":197},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.743,1217.583,0],"t":198},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.679,1220.158,0],"t":199},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.366,1220.057,0],"t":202},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.227,1218.676,0],"t":203},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[604.073,1216.495,0],"t":204},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.906,1213.369,0],"t":205},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.727,1209.295,0],"t":206},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.538,1204.714,0],"t":207},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.339,1200.679,0],"t":208},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[603.134,1198.202,0],"t":209},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[602.704,1197.591,0],"t":211},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[602.26,1197.774,0],"t":213},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.81,1197.962,0],"t":215},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[601.363,1198.149,0],"t":217},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600.928,1198.332,0],"t":219},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600.513,1198.51,0],"t":221},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[599.943,1198.756,0],"t":224},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[599.454,1198.971,0],"t":227},{"s":[598.871,1199.239,0],"t":232}]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"w":1200,"h":1200,"refId":"comp_2","ind":3},{"ty":4,"nm":"Shape Layer 1","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[344.188,416.438,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[944.188,1016.438,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Shape 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-15.375,18.625],[-9.25,4.5],[-5,4.25],[-20.25,-12.75],[1.5,35.25],[2,-42.25],[-23.352,35.602],[-4,4.75],[-5,44.5]],"o":[[0,0],[2.625,-4.125],[9.25,-4.5],[5,-4.25],[20.25,12.75],[-1.5,-35.25],[-2,42.25],[15.25,-23.25],[4,-4.75],[5,-44.5]],"v":[[189.375,507.875],[218.625,488.125],[253.25,482.5],[289.5,447.25],[332.25,446],[393.5,408.5],[330.25,410],[422,425],[477,383.75],[499,325]]}}},{"ty":"st","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100},"w":{"a":0,"k":5},"d":[{"nm":"dash","n":"d","v":{"a":0,"k":15}},{"nm":"offset","n":"o","v":{"a":0,"k":-6}}],"c":{"a":0,"k":[0.929,0.11,0.169]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"tm","nm":"Trim Paths 1","e":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":60},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":200},{"s":[0],"t":239}]},"o":{"a":0,"k":0},"s":{"a":0,"k":0},"m":1}],"ind":4},{"ty":4,"nm":"small lock Outlines","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[307.943,43.448,0]},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[0,0,100],"t":50},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":60},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":200},{"s":[0,0,100],"t":209.834}]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[1097.061,882.312,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.001,0],[-0.001,-0.001]],"o":[[0.001,0.001],[-0.001,-0.001]],"v":[[-0.863,0.084],[-0.86,0.087]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.002,0.002],[0.003,-0.002]],"o":[[-0.002,0.002],[0.002,-0.002]],"v":[[0.863,0.084],[0.855,0.09]]}}},{"ty":"sh","nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.004,0.002],[0.004,-0.003]],"o":[[-0.005,0.003],[0.005,-0.003]],"v":[[1.586,1.158],[1.573,1.166]]}}},{"ty":"sh","nm":"Path 4","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.002,0.002],[-0.002,-0.001]],"o":[[0.002,0.002],[-0.002,-0.001]],"v":[[-1.575,1.165],[-1.57,1.169]]}}},{"ty":"sh","nm":"Path 5","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-0.264,0.189],[-0.042,0.042],[-0.084,0.075],[0,0.861],[1.05,0],[0,-1.162],[-0.184,-0.169],[-0.055,-0.056],[-0.016,-0.014],[0.046,-0.258]],"o":[[0,0],[0,0],[-0.078,-0.441],[0.013,-0.011],[0.072,-0.074],[0.175,-0.156],[0,-1.162],[-1.049,0],[0,0.834],[0.059,0.054],[0.053,0.055],[0.357,0.251],[0,0]],"v":[[-1.052,3.9],[1.052,3.9],[0.553,1.072],[0.842,0.098],[0.925,0.02],[1.157,-0.201],[1.903,-1.794],[0,-3.9],[-1.903,-1.794],[-1.12,-0.174],[-0.949,-0.006],[-0.843,0.097],[-0.553,1.072]]}}},{"ty":"sh","nm":"Path 6","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.258,0],[0,0],[0.163,0.195],[-0.047,0.267],[0,0],[0.014,0.015],[0.039,0.036],[0,1.36],[-1.763,0],[0,-1.875],[0.355,-0.316],[0.052,-0.053],[0.002,-0.002],[0,0],[0.169,-0.2]],"o":[[0,0],[-0.258,0],[-0.169,-0.201],[0,0],[-0.013,-0.013],[-0.037,-0.038],[-0.281,-0.26],[0,-1.875],[1.763,0],[0,1.361],[-0.062,0.055],[-0.002,0.002],[0,0],[0.047,0.267],[-0.164,0.195]],"v":[[1.555,5.195],[-1.555,5.195],[-2.219,4.887],[-2.41,4.152],[-1.842,0.932],[-1.883,0.89],[-1.997,0.778],[-3.197,-1.794],[0,-5.195],[3.197,-1.794],[2.017,0.766],[1.848,0.925],[1.842,0.932],[2.41,4.152],[2.219,4.887]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[308.608,52.335]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-1.519],[-0.236,-0.218],[-0.046,-0.048],[-0.034,-0.022],[0.028,-0.156],[0,0],[-0.147,0],[0,0],[0.028,0.156],[0,0],[-0.044,0.028],[-0.071,0.072],[-0.069,0.061],[0,1.114],[1.406,0]],"o":[[0,1.096],[0.048,0.045],[0.082,0.085],[0.045,0.028],[0,0],[-0.027,0.156],[0,0],[0.148,0],[0,0],[-0.028,-0.156],[0.03,-0.02],[0.064,-0.066],[0.263,-0.234],[0,-1.519],[-1.406,0]],"v":[[-2.55,-1.794],[-1.559,0.303],[-1.417,0.442],[-1.221,0.624],[-1.19,0.96],[-1.773,4.264],[-1.555,4.548],[1.555,4.548],[1.773,4.264],[1.19,0.96],[1.221,0.624],[1.386,0.473],[1.586,0.283],[2.55,-1.794],[-0.001,-4.548]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[308.609,52.336]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 3","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.021,0],[0,0],[0,1.874],[0,0],[-2.021,0],[0,0],[0,-1.874]],"o":[[0,1.874],[0,0],[-2.021,0],[0,0],[0,-1.874],[0,0],[2.021,0],[0,0]],"v":[[18.597,11.602],[14.938,14.994],[-14.938,14.994],[-18.597,11.602],[-18.597,-11.602],[-14.938,-14.994],[14.938,-14.994],[18.597,-11.602]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[308.604,52.345]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 4","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[6.409,0],[0,0],[0,0],[0,0],[0,-5.899],[0,0],[0,0],[0,0],[0,0],[-3.417,0],[0,0],[0,-3.145],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-6.409,0],[0,0],[0,0],[0,0],[0,0],[0,-3.145],[0,0],[3.417,0],[0,0],[0,0],[0,0],[0,0],[0,-5.899]],"v":[[1.525,-9.449],[1.517,-9.449],[-1.518,-9.449],[-1.525,-9.449],[-13.148,1.249],[-13.14,1.249],[-13.14,9.449],[-7.714,9.449],[-7.714,1.249],[-1.518,-4.455],[1.517,-4.455],[7.714,1.249],[7.714,9.449],[13.14,9.449],[13.14,1.249],[13.148,1.249]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[308.608,28.985]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 5","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-23.486,0.672],[-0.671,-23.486],[23.486,-0.672],[0.671,23.487]],"o":[[23.486,-0.672],[0.672,23.487],[-23.487,0.672],[-0.672,-23.486]],"v":[[-1.216,-42.526],[42.526,-1.217],[1.217,42.526],[-42.526,1.216]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[307.943,43.448]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":5},{"ty":4,"nm":"background Outlines","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[507.907,453.886,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[579.653,610.437,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[67.181,-50.606],[23.144,-82.899],[-67.565,-84.716],[-192.217,78.044],[-25.169,191.703],[44.962,65.939],[99.907,6.304],[89.708,-44.61]],"o":[[-74.864,56.395],[-29.172,104.489],[124.871,156.569],[193.996,-78.767],[10.378,-79.052],[-54.433,-79.827],[-99.907,-6.305],[-66.959,33.296]],"v":[[-316.395,-244.699],[-477.111,-37.079],[-404.372,265.626],[153.169,403.699],[483.984,-76.999],[438.093,-305.586],[184.591,-437.029],[-105.284,-369.599]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.941,0.941,0.941]},"r":1,"o":{"a":0,"k":20}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[528.254,443.448]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[6.624,0],[0,-6.624],[-6.624,0],[0,6.624]],"o":[[-6.624,0],[0,6.624],[6.624,0],[0,-6.624]],"v":[[0.001,-12.013],[-12.012,0],[0.001,12.013],[12.013,0]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[8.977,0],[0,8.976],[-8.977,0],[0,-8.977]],"o":[[-8.977,0],[0,-8.977],[8.977,0],[0,8.976]],"v":[[0.001,16.28],[-16.28,0],[0.001,-16.28],[16.28,0]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.065,80.065],"t":2},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":3},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":4},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":5},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":7},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":8},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":9},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":10},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":11},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":13},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":14},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":15},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":16},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":17},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":19},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":21},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":22},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":23},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":25},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":26},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":27},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":28},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":29},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":31},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":33},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":36},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":37},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":38},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":39},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":40},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":41},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":42},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":43},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":44},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":45},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":46},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":47},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":48},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":49},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":50},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":51},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":52},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":53},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":54},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":55},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":56},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":57},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.935,99.935],"t":58},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":63},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":64},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":65},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":66},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":67},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":68},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":69},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":70},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":71},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":72},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":73},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":74},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":75},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":76},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":77},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":78},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":79},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":80},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":81},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":82},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":83},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":84},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":85},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":86},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":87},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":88},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":89},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":91},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":92},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":93},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":94},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":95},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":96},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":97},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":98},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":99},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":100},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":101},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":102},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":103},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":104},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":105},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":106},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":107},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":108},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":109},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":110},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":111},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":112},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":113},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":114},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":115},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":116},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":117},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.065,80.065],"t":118},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":123},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":124},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":125},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":126},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":127},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":128},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":129},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":130},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":131},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":132},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":133},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":134},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":135},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":136},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":137},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":138},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":139},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":140},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":141},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":142},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":143},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":144},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":145},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":146},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":147},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":148},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":149},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":151},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":152},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":153},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":154},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":155},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":156},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":157},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":158},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":159},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":160},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":161},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":162},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":163},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":164},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":165},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":166},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":167},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":168},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":169},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":170},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":171},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":172},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":173},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":174},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":175},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":176},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":177},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.935,99.935],"t":178},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":183},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":184},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":185},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":186},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":187},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":188},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":189},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":190},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":191},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":192},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":193},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":194},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":195},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":196},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":197},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":198},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":199},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":200},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":201},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":202},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":203},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":204},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":205},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":206},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":207},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":208},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":209},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":211},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":212},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":213},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":214},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":215},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":216},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":217},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":218},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":219},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":220},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":221},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":222},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":223},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":224},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":225},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":226},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":227},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":228},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":229},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":230},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":231},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":232},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":233},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":234},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":235},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":236},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":237},{"s":[80.065,80.065],"t":238}]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[219.174,891.243]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 3","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[11.233,0.868],[1.256,-0.102],[-1.05,-12.836],[-4.756,-4.037],[-6.219,0.51],[1.05,12.838]],"o":[[-1.219,-0.094],[-12.837,1.05],[0.508,6.219],[4.757,4.038],[12.836,-1.049],[-0.947,-11.58]],"v":[[1.814,-22.71],[-1.903,-22.701],[-23.28,2.484],[-15.116,18.388],[1.905,23.86],[23.28,-1.325]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.52,0.117],[4.657,3.953],[0.625,7.639],[-15.768,1.289],[-1.29,-15.768],[15.768,-1.29]],"o":[[-5.975,-0.462],[-5.842,-4.959],[-1.289,-15.768],[15.768,-1.29],[1.289,15.768],[-1.55,0.127]],"v":[[-2.272,29.188],[-18.567,22.454],[-28.596,2.919],[-2.338,-28.016],[28.596,-1.758],[2.339,29.177]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.065,80.065],"t":2},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":3},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":4},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":5},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":7},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":8},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":9},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":10},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":11},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":13},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":14},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":15},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":16},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":17},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":19},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":21},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":22},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":23},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":25},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":26},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":27},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":28},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":29},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":31},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":33},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":36},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":37},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":38},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":39},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":40},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":41},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":42},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":43},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":44},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":45},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":46},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":47},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":48},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":49},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":50},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":51},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":52},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":53},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":54},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":55},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":56},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":57},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.935,99.935],"t":58},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":63},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":64},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":65},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":66},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":67},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":68},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":69},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":70},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":71},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":72},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":73},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":74},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":75},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":76},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":77},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":78},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":79},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":80},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":81},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":82},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":83},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":84},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":85},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":86},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":87},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":88},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":89},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":91},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":92},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":93},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":94},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":95},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":96},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":97},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":98},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":99},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":100},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":101},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":102},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":103},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":104},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":105},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":106},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":107},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":108},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":109},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":110},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":111},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":112},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":113},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":114},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":115},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":116},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":117},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.065,80.065],"t":118},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":123},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":124},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":125},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":126},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":127},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":128},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":129},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":130},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":131},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":132},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":133},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":134},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":135},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":136},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":137},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":138},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":139},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":140},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":141},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":142},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":143},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":144},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":145},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":146},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":147},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":148},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":149},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":151},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":152},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":153},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":154},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":155},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":156},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":157},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":158},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":159},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":160},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":161},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":162},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":163},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":164},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":165},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":166},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":167},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":168},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":169},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":170},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":171},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":172},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":173},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":174},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":175},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":176},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":177},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.935,99.935],"t":178},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":183},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":184},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":185},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":186},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":187},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":188},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":189},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":190},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":191},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":192},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":193},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":194},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":195},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":196},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":197},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":198},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":199},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":200},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":201},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":202},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":203},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":204},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":205},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":206},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":207},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":208},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":209},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":211},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":212},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":213},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":214},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":215},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":216},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":217},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":218},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":219},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":220},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":221},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":222},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":223},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":224},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":225},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":226},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":227},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":228},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":229},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":230},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":231},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":232},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":233},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":234},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":235},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":236},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":237},{"s":[80.065,80.065],"t":238}]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[30.135,255.978]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 4","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.649,-7.933],[7.933,-0.648],[0.648,7.935],[-7.934,0.649]],"o":[[0.649,7.934],[-7.934,0.649],[-0.649,-7.933],[7.933,-0.649]],"v":[[14.364,-1.175],[1.175,14.364],[-14.364,1.174],[-1.175,-14.364]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.065,80.065],"t":2},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":3},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":4},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":5},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":7},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":8},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":9},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":10},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":11},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":13},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":14},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":15},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":16},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":17},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":19},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":21},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":22},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":23},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":25},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":26},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":27},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":28},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":29},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":31},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":33},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":36},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":37},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":38},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":39},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":40},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":41},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":42},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":43},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":44},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":45},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":46},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":47},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":48},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":49},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":50},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":51},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":52},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":53},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":54},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":55},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":56},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":57},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.935,99.935],"t":58},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":63},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":64},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":65},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":66},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":67},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":68},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":69},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":70},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":71},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":72},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":73},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":74},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":75},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":76},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":77},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":78},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":79},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":80},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":81},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":82},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":83},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":84},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":85},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":86},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":87},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":88},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":89},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":91},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":92},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":93},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":94},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":95},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":96},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":97},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":98},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":99},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":100},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":101},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":102},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":103},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":104},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":105},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":106},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":107},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":108},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":109},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":110},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":111},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":112},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":113},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":114},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":115},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":116},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":117},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.065,80.065],"t":118},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":123},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":124},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":125},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":126},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":127},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":128},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":129},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":130},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":131},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":132},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":133},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":134},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":135},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":136},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":137},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":138},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":139},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":140},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":141},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":142},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":143},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":144},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":145},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":146},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":147},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":148},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":149},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":151},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":152},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":153},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":154},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":155},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":156},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":157},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":158},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":159},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":160},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":161},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":162},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":163},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":164},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":165},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":166},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":167},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":168},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":169},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":170},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":171},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":172},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":173},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":174},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":175},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":176},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":177},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.935,99.935],"t":178},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":183},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":184},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":185},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":186},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":187},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":188},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":189},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":190},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":191},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":192},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":193},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":194},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":195},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":196},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":197},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":198},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":199},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":200},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":201},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":202},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":203},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":204},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":205},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":206},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":207},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":208},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":209},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":211},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":212},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":213},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":214},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":215},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":216},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":217},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":218},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":219},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":220},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":221},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":222},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":223},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":224},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":225},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":226},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":227},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":228},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":229},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":230},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":231},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":232},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":233},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":234},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":235},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":236},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":237},{"s":[80.065,80.065],"t":238}]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[103.129,162.946]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 5","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[14.114,0],[0,-14.114],[-14.115,0],[0,14.115]],"o":[[-14.115,0],[0,14.115],[14.114,0],[0,-14.114]],"v":[[0.001,-25.598],[-25.597,-0.001],[0.001,25.598],[25.597,-0.001]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[17.055,0],[0,17.056],[-17.056,0],[0,-17.055]],"o":[[-17.056,0],[0,-17.055],[17.055,0],[0,17.056]],"v":[[0.001,30.931],[-30.931,-0.001],[0.001,-30.931],[30.931,-0.001]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.065,80.065],"t":2},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":3},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":4},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":5},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":7},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":8},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":9},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":10},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":11},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":13},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":14},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":15},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":16},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":17},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":18},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":19},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":21},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":22},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":23},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":24},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":25},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":26},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":27},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":28},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":29},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":31},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":33},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":36},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":37},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":38},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":39},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":40},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":41},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":42},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":43},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":44},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":45},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":46},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":47},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":48},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":49},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":50},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":51},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":52},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":53},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":54},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":55},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":56},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":57},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.935,99.935],"t":58},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":63},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":64},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":65},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":66},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":67},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":68},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":69},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":70},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":71},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":72},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":73},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":74},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":75},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":76},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":77},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":78},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":79},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":80},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":81},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":82},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":83},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":84},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":85},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":86},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":87},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":88},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":89},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":91},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":92},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":93},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":94},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":95},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":96},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":97},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":98},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":99},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":100},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":101},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":102},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":103},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":104},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":105},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":106},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":107},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":108},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":109},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":110},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":111},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":112},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":113},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":114},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":115},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":116},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":117},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.065,80.065],"t":118},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":123},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":124},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":125},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":126},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":127},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":128},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":129},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":130},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":131},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":132},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":133},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":134},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":135},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":136},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":137},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":138},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":139},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":140},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":141},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":142},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":143},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":144},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":145},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":146},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":147},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":148},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":149},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":151},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":152},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":153},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":154},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":155},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":156},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":157},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":158},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":159},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":160},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":161},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":162},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":163},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":164},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":165},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":166},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":167},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":168},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":169},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":170},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":171},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":172},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":173},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":174},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":175},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":176},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":177},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.935,99.935],"t":178},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.855,99.855],"t":183},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.745,99.745],"t":184},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.606,99.606],"t":185},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.44,99.44],"t":186},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.247,99.247],"t":187},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[99.028,99.028],"t":188},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.785,98.785],"t":189},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.519,98.519],"t":190},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[98.23,98.23],"t":191},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.92,97.92],"t":192},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.59,97.59],"t":193},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[97.241,97.241],"t":194},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.875,96.875],"t":195},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.492,96.492],"t":196},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[96.093,96.093],"t":197},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.68,95.68],"t":198},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[95.254,95.254],"t":199},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.815,94.815],"t":200},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[94.365,94.365],"t":201},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.905,93.905],"t":202},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[93.436,93.436],"t":203},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.96,92.96],"t":204},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[92.477,92.477],"t":205},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.988,91.988],"t":206},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.495,91.495],"t":207},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.999,90.999],"t":208},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[90.5,90.5],"t":209},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.5,89.5],"t":211},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[89.001,89.001],"t":212},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.505,88.505],"t":213},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.012,88.012],"t":214},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.523,87.523],"t":215},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[87.04,87.04],"t":216},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.564,86.564],"t":217},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[86.095,86.095],"t":218},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.635,85.635],"t":219},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[85.185,85.185],"t":220},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.746,84.746],"t":221},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[84.32,84.32],"t":222},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.907,83.907],"t":223},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.508,83.508],"t":224},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[83.125,83.125],"t":225},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.759,82.759],"t":226},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.41,82.41],"t":227},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[82.08,82.08],"t":228},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.77,81.77],"t":229},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.481,81.481],"t":230},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[81.215,81.215],"t":231},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.972,80.972],"t":232},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.753,80.753],"t":233},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.56,80.56],"t":234},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.394,80.394],"t":235},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.255,80.255],"t":236},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[80.145,80.145],"t":237},{"s":[80.065,80.065],"t":238}]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[974.695,31.181]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":6}],"v":"4.8.0","fr":60,"op":240,"ip":0,"assets":[{"nm":"","id":"comp_0","layers":[{"ty":4,"nm":"Shape Layer 1","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[-250,146.5,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.57,"y":0},"i":{"x":0.52,"y":1},"s":[173,718.5,0],"t":50,"ti":[-29.5,-5.083,0],"to":[11.5,13,0]},{"o":{"x":0.57,"y":0},"i":{"x":0.52,"y":1},"s":[242,796.5,0],"t":60,"ti":[11.5,13,0],"to":[29.5,5.083,0]},{"o":{"x":0.599,"y":0},"i":{"x":0.52,"y":1},"s":[350,749,0],"t":70,"ti":[0,0,0],"to":[-11.048,-12.489,0]},{"o":{"x":0.599,"y":0},"i":{"x":0.52,"y":1},"s":[350,749,0],"t":180,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.599,"y":0},"i":{"x":0.52,"y":1},"s":[435,765.5,0],"t":190,"ti":[0,0,0],"to":[0,0,0]},{"s":[485.5,619.5,0],"t":200}]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Ellipse 1","it":[{"ty":"el","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[164,164]}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,0,0]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[120.235,120.235]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[-250,146.5]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":1},{"ty":4,"nm":"check Outlines","sr":1,"st":0,"op":240,"ip":0,"tt":1,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[84.575,67.731,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[351.626,757.976,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.004,0.005],[0.004,-0.006]],"o":[[-0.004,0.006],[0.004,-0.006]],"v":[[-28.01,50.49],[-28.023,50.508]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.118,-0.263],[0,0],[0,0],[-0.189,0.238],[0,0],[-1.261,1.781],[0,0],[1.89,-2.46],[0.009,-0.011],[0,0],[0.549,-0.063],[0.432,0.345],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0.057,-0.279],[0,0],[0.351,-0.468],[0,0],[-0.692,0.877],[-0.143,0.186],[0,0],[-0.344,0.432],[-0.55,0.061],[0,0],[0,0],[0,0],[0.241,0.192]],"v":[[-27.779,48.577],[-9.472,63.15],[5.11,44.829],[5.477,44.042],[75.576,-44.022],[79.386,-49.288],[62.196,-62.971],[58.469,-58.165],[58.232,-57.857],[-11.756,30.072],[-13.14,30.84],[-14.663,30.401],[-65.839,-10.333],[-79.657,7.022],[-28.32,47.882]]}}},{"ty":"sh","nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.067,0],[0.145,0.036],[0.336,0.268],[0,0],[0.133,0.279],[0,0],[-0.709,0.893],[0,0],[-0.892,-0.71],[0,0],[0,0],[0,0],[-1.101,1.412],[-0.399,0.496],[-0.8,0.098],[-0.392,-0.311],[0,0],[1.055,-1.597],[0.234,-0.334],[0.704,-0.977],[0.089,-0.112],[0,0],[0.198,-0.249],[0,0],[0.495,-0.054]],"o":[[-0.151,0],[-0.421,-0.025],[0,0],[-0.249,-0.199],[0,0],[-0.892,-0.711],[0,0],[0.712,-0.893],[0,0],[0,0],[0,0],[0.482,-0.628],[0.555,-0.712],[0.793,-0.987],[0.497,-0.06],[0,0],[0.317,0.253],[-0.132,0.199],[-0.401,0.572],[-1.07,1.483],[0,0],[-0.067,0.292],[0,0],[-0.31,0.389],[-0.067,0.007]],"v":[[-9.049,67.482],[-9.493,67.427],[-10.653,66.98],[-30.615,51.091],[-31.193,50.365],[-83.285,8.908],[-83.615,5.999],[-67.725,-13.961],[-64.816,-14.29],[-13.64,26.445],[55.313,-60.182],[55.51,-60.44],[58.296,-64.047],[59.779,-65.928],[61.7,-67.422],[63.09,-67.03],[83.055,-51.139],[83.27,-48.341],[82.712,-47.527],[81.046,-45.193],[78.514,-41.716],[8.826,45.831],[8.429,46.654],[-7.588,66.777],[-8.847,67.47]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.574,67.732]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.088,0.07],[0,0],[0.07,-0.088],[0,0],[0.087,0.07],[0,0],[0.069,-0.088],[0,0],[-0.088,-0.07],[0,0],[0,0],[-0.088,-0.07],[0,0],[-0.069,0.088],[0,0],[0,0],[0.085,0.071],[0,0],[0,0]],"o":[[0,0],[-0.087,-0.07],[0,0],[-0.07,0.087],[0,0],[-0.087,-0.069],[0,0],[-0.07,0.088],[0,0],[0,0],[-0.069,0.087],[0,0],[0.088,0.069],[0,0],[0,0],[0.068,-0.086],[0,0],[0,0],[0.07,-0.087]],"v":[[82.014,-49.667],[62.051,-65.556],[56.895,-59.008],[-13.093,28.922],[-13.378,28.954],[-65.857,-12.818],[-66.141,-12.785],[-82.032,7.174],[-81.999,7.458],[-29.36,49.354],[-29.363,49.358],[-29.33,49.643],[-9.368,65.533],[-9.083,65.5],[-8.926,65.626],[7.093,45.501],[7.063,45.22],[7.06,45.217],[77.175,-42.866]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.452,67.72]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":2},{"ty":4,"nm":"security Outlines","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[165.132,196.375,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[353.647,761.503,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.067,0],[0.104,0.956],[0,0],[-0.835,0.277],[-35.606,27.813],[-0.635,-0.812],[0.812,-0.634],[47.663,-15.927],[0,0],[1.025,-0.112]],"o":[[-0.94,0],[0,0],[-0.096,-0.875],[47.926,-15.873],[0.813,-0.635],[0.634,0.813],[-35.604,27.811],[0,0],[0.112,1.025],[-0.068,0.007]],"v":[[-47.491,94.69],[-49.344,93.025],[-62.605,-28.913],[-61.337,-30.887],[59.447,-94.055],[62.067,-93.733],[61.745,-91.113],[-58.731,-27.819],[-45.633,92.621],[-47.287,94.679]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[78.672,120.791]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[56.257,-18.799],[0,0],[-16.297,-24.78],[-21.642,-16.508],[-40.114,-14.256],[13.938,128.161],[0,0],[25.814,8.123],[22.066,12.681]],"o":[[0,0],[3.199,29.417],[13.346,20.291],[17.457,13.316],[17.538,-10.382],[0,0],[-29.327,-3.095],[-24.96,-7.854],[-42.171,37.24]],"v":[[-160.913,-111.752],[-147.815,8.688],[-118.433,90.365],[-65.706,145.822],[21.045,192.21],[146.761,-23.535],[133.663,-143.974],[50.574,-160.876],[-20.283,-191.818]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.327,0],[0.202,0.071],[17.789,13.569],[13.577,20.644],[3.264,30.011],[0,0],[-0.836,0.276],[-42.459,37.705],[-0.697,-0.404],[-25.139,-7.911],[-29.625,-3.031],[-0.095,-0.875],[0,0],[14.648,-8.545]],"o":[[-0.209,0],[-40.991,-14.452],[-21.977,-16.763],[-16.626,-25.279],[0,0],[-0.095,-0.875],[56.908,-18.849],[0.602,-0.535],[22.154,12.848],[26.014,8.185],[0.876,0.09],[0,0],[14.41,132.503],[-0.289,0.168]],"v":[[21.241,196.126],[20.62,196.02],[-67.971,148.79],[-121.552,92.416],[-151.526,9.092],[-164.787,-112.846],[-163.518,-114.819],[-21.753,-195.502],[-19.577,-195.721],[51.695,-164.437],[135.545,-147.532],[137.212,-145.877],[150.472,-23.939],[22.182,195.872]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[165.132,196.375]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 3","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[43.981,25.507],[57.982,-19.204],[-10.547,-96.986],[-21.067,-7.427],[14.07,129.377],[0.413,3.798]],"o":[[-41.877,37.188],[0.413,3.798],[14.07,129.377],[18.379,-10.72],[-10.547,-96.986],[-60.747,-6.217]],"v":[[-20.391,-194.183],[-162.809,-113.124],[-149.548,8.814],[21.363,194.183],[148.739,-23.813],[135.478,-145.751]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[165.01,196.451]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":3}]},{"nm":"","id":"comp_1","layers":[{"ty":4,"nm":"pin 4 Outlines","sr":0.908,"st":40,"op":150,"ip":40,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[41.628,42.21,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[844.38,755.334,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-12.498,25.361],[-12.495,25.361]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.547,0],[-0.177,-0.053],[-0.082,-0.745],[-0.043,-2.528],[-0.417,-1.854],[-1.862,-1.417],[-2.61,0.586],[-1.098,2.007],[0.649,2.883],[1.122,2.108],[0.828,2.891],[-0.573,0.473],[-0.662,-0.336],[-2.977,-1.463],[-2.581,0.581],[-1.162,2.112],[0.497,2.211],[2.597,1.643],[10.458,0.349],[0.192,0.821],[-0.743,0.4],[-1.212,1.847],[0.404,1.798],[2.029,1.468],[2.122,-0.477],[1.867,-2.259],[3.178,-4.099],[0.72,0.183],[0.121,0.732],[-0.13,2.68],[0.444,1.975],[1.891,1.316],[2.804,-0.632],[1.019,-1.967],[-0.651,-2.897],[-0.98,-2.163],[-1.028,-2.974],[0.557,-0.501],[0.678,0.317],[2.999,1.612],[2.885,-0.648],[1.162,-2.111],[-0.497,-2.213],[-2.495,-1.576],[-10.519,-0.543],[-0.176,-0.827],[0.754,-0.384],[1.077,-1.841],[-0.413,-1.836],[-2.025,-1.459],[-2.127,0.479],[-1.723,2.43],[-3.035,3.667]],"o":[[0.179,0],[0.718,0.215],[0.345,3.133],[0.042,2.377],[0.652,2.901],[1.76,1.342],[2.791,-0.627],[1.142,-2.089],[-0.443,-1.97],[-1.262,-2.359],[-0.205,-0.714],[0.572,-0.473],[4.527,2.298],[2.664,1.314],[2.124,-0.478],[1.205,-2.19],[-0.407,-1.809],[-1.886,-1.194],[-0.843,-0.029],[-0.193,-0.821],[9.284,-5],[1.649,-2.508],[-0.497,-2.209],[-1.954,-1.409],[-2.593,0.583],[-2.072,2.504],[-0.454,0.587],[-0.72,-0.182],[-0.488,-2.964],[0.112,-2.378],[-0.645,-2.867],[-1.839,-1.277],[-2.606,0.586],[-1.074,2.08],[0.381,1.693],[1.045,2.308],[0.244,0.709],[-0.557,0.502],[-4.281,-1.996],[-2.587,-1.387],[-2.125,0.478],[-1.205,2.19],[0.408,1.812],[1.826,1.157],[0.844,0.044],[0.176,0.826],[-9.478,4.825],[-1.507,2.571],[0.498,2.216],[1.953,1.413],[2.876,-0.646],[1.993,-2.81],[0.361,-0.436]],"v":[[-5.005,13.844],[-4.469,13.922],[-3.149,15.507],[-2.565,24.038],[-1.875,30.415],[1.862,36.832],[8.354,37.954],[14.133,34.039],[14.867,26.65],[12.51,20.505],[9.359,12.591],[9.966,10.637],[11.998,10.413],[23.308,16.081],[31.102,17.169],[35.987,13.322],[37.039,6.779],[32.511,1.577],[15.724,-1.462],[13.969,-2.902],[14.901,-4.973],[28.791,-15.072],[30.667,-21.561],[26.912,-27.025],[20.854,-28.41],[14.226,-24.186],[6.424,-14.374],[4.49,-13.708],[3.107,-15.214],[2.566,-23.717],[2.066,-30.279],[-1.701,-36.496],[-8.604,-37.457],[-13.99,-33.663],[-14.62,-26.264],[-12.57,-20.453],[-9.445,-12.493],[-9.961,-10.497],[-11.998,-10.191],[-22.969,-15.63],[-31.104,-16.728],[-35.987,-12.88],[-37.039,-6.337],[-32.666,-1.23],[-15.938,1.962],[-14.21,3.439],[-15.188,5.491],[-29.018,15.363],[-30.667,22.004],[-26.917,27.465],[-20.854,28.853],[-14.021,24.281],[-6.443,14.521]]}}},{"ty":"sh","nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.99,0],[1.883,1.437],[0.841,3.742],[0.045,2.632],[0.085,1.285],[1.274,-1.798],[3.763,-0.845],[2.828,2.046],[0.697,3.102],[-2.001,3.412],[-5.099,3.022],[2.44,1.547],[0.633,2.814],[-1.641,2.982],[-3.184,0.716],[-3.366,-1.805],[-2.497,-1.213],[0.473,1.046],[0.437,1.941],[-1.474,2.855],[-3.696,0.832],[-2.709,-1.881],[-0.848,-3.767],[0.128,-2.714],[-0.056,-1.114],[-1.44,1.741],[-3.384,0.761],[-2.834,-2.043],[-0.696,-3.093],[2.226,-3.385],[4.964,-3.056],[-2.528,-1.6],[-0.631,-2.81],[1.641,-2.982],[3.183,-0.715],[3.409,1.681],[2.774,1.398],[-0.493,-0.923],[-0.517,-2.296],[1.575,-2.88],[3.845,-0.865]],"o":[[-2.425,0],[-2.552,-1.943],[-0.473,-2.101],[-0.02,-1.141],[-1.733,2.182],[-2.249,3.171],[-3.188,0.718],[-2.757,-1.986],[-0.627,-2.79],[1.48,-2.53],[-5.764,-0.644],[-3.36,-2.123],[-0.696,-3.097],[1.684,-3.06],[3.747,-0.842],[1.931,1.038],[-0.475,-1.204],[-1.084,-2.393],[-0.84,-3.737],[1.536,-2.965],[3.828,-0.86],[2.656,1.848],[0.517,2.301],[-0.051,1.053],[1.939,-2.466],[2.38,-2.879],[3.179,-0.716],[2.762,1.999],[0.635,2.824],[-1.609,2.452],[5.785,0.561],[3.465,2.192],[0.697,3.096],[-1.685,3.06],[-3.4,0.765],[-2.07,-1.018],[0.424,1.025],[1.28,2.405],[0.844,3.755],[-1.621,2.961],[-1.074,0.241]],"v":[[6.076,41.96],[-0.401,39.801],[-5.516,31.234],[-6.297,24.103],[-6.455,20.46],[-10.976,26.441],[-20.036,32.495],[-29.102,30.491],[-34.309,22.823],[-32.239,13.477],[-22.43,5.194],[-34.662,1.923],[-40.682,-5.518],[-39.258,-14.68],[-31.922,-20.37],[-21.203,-18.919],[-14.547,-15.535],[-15.971,-18.914],[-18.263,-25.445],[-17.307,-35.379],[-9.422,-41.1],[0.43,-39.561],[5.709,-31.098],[6.295,-23.54],[6.303,-20.286],[11.349,-26.566],[20.034,-32.053],[29.099,-30.052],[34.308,-22.38],[31.911,-13.022],[22.112,-4.805],[34.508,-1.578],[40.68,5.961],[39.258,15.121],[31.922,20.811],[21.659,19.43],[14.425,15.823],[15.803,18.749],[18.51,25.831],[17.409,35.831],[9.174,41.598]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.627,42.21]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.983,-2.797],[3.313,-0.745],[2.388,1.727],[0.596,2.653],[-1.764,3.009],[-7.968,4.057],[2.941,1.864],[0.522,2.322],[-1.423,2.585],[-2.653,0.597],[-2.97,-1.593],[-4.28,-1.996],[1.038,2.293],[0.411,1.825],[-1.274,2.466],[-3.15,0.708],[-2.273,-1.578],[-0.745,-3.313],[0.121,-2.549],[-0.47,-2.852],[-2.124,2.567],[-2.983,0.671],[-2.391,-1.723],[-0.595,-2.649],[1.946,-2.96],[7.764,-4.182],[-3.045,-1.927],[-0.521,-2.319],[1.42,-2.58],[2.649,-0.595],[3.034,1.496],[4.519,2.293],[-1.204,-2.251],[-0.483,-2.152],[1.356,-2.48],[3.313,-0.745],[2.207,1.683],[0.745,3.317],[0.044,2.517],[0.337,3.059]],"o":[[-1.983,2.796],[-2.653,0.597],[-2.391,-1.723],[-0.522,-2.319],[1.76,-3.007],[-8.811,-0.455],[-2.944,-1.86],[-0.596,-2.65],[1.419,-2.58],[3.313,-0.745],[2.971,1.597],[-1.005,-2.908],[-1.036,-2.289],[-0.745,-3.314],[1.274,-2.462],[3.313,-0.745],[2.269,1.579],[0.485,2.156],[-0.123,2.554],[3.103,-4.003],[2.121,-2.566],[2.649,-0.595],[2.389,1.728],[0.523,2.323],[-1.946,2.963],[8.77,0.293],[3.045,1.927],[0.597,2.653],[-1.422,2.585],[-2.984,0.671],[-3.037,-1.493],[0.797,2.783],[1.201,2.256],[0.746,3.317],[-1.36,2.485],[-3.15,0.708],[-2.205,-1.679],[-0.448,-1.989],[-0.043,-2.512],[-3.013,3.64]],"v":[[-12.498,25.13],[-20.445,30.443],[-28.008,28.749],[-32.487,22.182],[-30.628,14.19],[-16.034,3.596],[-33.662,0.117],[-38.86,-6.158],[-37.622,-14.01],[-31.513,-18.779],[-22.086,-17.504],[-11.211,-12.115],[-14.271,-19.914],[-16.442,-26.085],[-15.648,-34.753],[-9.013,-39.508],[-0.635,-38.258],[3.888,-30.918],[4.43,-23.858],[4.948,-15.749],[12.786,-25.607],[20.443,-30.462],[28.006,-28.768],[32.487,-22.202],[30.352,-14.277],[15.786,-3.559],[33.51,-0.232],[38.859,6.139],[37.622,13.991],[31.513,18.76],[22.485,17.526],[11.154,11.846],[14.157,19.398],[16.688,26.01],[15.771,34.704],[8.763,39.546],[0.73,38.087],[-3.695,30.595],[-4.432,23.839],[-5.005,15.48]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.627,42.441]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":1},{"ty":4,"nm":"pin 3 Outlines","sr":0.877,"st":30,"op":160,"ip":30,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[41.628,42.209,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[747.508,777.117,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-12.498,25.361],[-12.495,25.361]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.547,0],[-0.176,-0.053],[-0.082,-0.745],[-0.043,-2.526],[-0.416,-1.854],[-1.862,-1.417],[-2.609,0.586],[-1.098,2.007],[0.649,2.883],[1.121,2.107],[0.828,2.891],[-0.573,0.473],[-0.662,-0.336],[-3.009,-1.478],[-2.581,0.581],[-1.163,2.112],[0.497,2.212],[2.597,1.643],[10.458,0.349],[0.193,0.821],[-0.743,0.4],[-1.213,1.847],[0.404,1.798],[2.029,1.468],[2.121,-0.476],[1.867,-2.259],[3.178,-4.099],[0.719,0.183],[0.121,0.732],[-0.13,2.679],[0.444,1.974],[1.891,1.316],[2.804,-0.631],[1.018,-1.967],[-0.651,-2.897],[-0.98,-2.164],[-1.026,-2.97],[0.557,-0.501],[0.68,0.317],[2.997,1.611],[2.885,-0.648],[1.162,-2.111],[-0.497,-2.213],[-2.495,-1.576],[-10.519,-0.543],[-0.176,-0.827],[0.754,-0.384],[1.077,-1.841],[-0.413,-1.836],[-2.025,-1.459],[-2.127,0.478],[-1.723,2.429],[-3.037,3.669]],"o":[[0.179,0],[0.719,0.215],[0.346,3.135],[0.041,2.377],[0.653,2.901],[1.76,1.342],[2.792,-0.628],[1.142,-2.089],[-0.443,-1.971],[-1.262,-2.359],[-0.204,-0.714],[0.572,-0.473],[4.602,2.336],[2.663,1.314],[2.124,-0.478],[1.205,-2.19],[-0.407,-1.808],[-1.887,-1.194],[-0.844,-0.029],[-0.192,-0.821],[9.283,-5],[1.649,-2.508],[-0.497,-2.209],[-1.955,-1.409],[-2.593,0.583],[-2.072,2.504],[-0.455,0.587],[-0.72,-0.182],[-0.488,-2.964],[0.112,-2.378],[-0.645,-2.868],[-1.839,-1.277],[-2.606,0.586],[-1.076,2.08],[0.381,1.692],[1.046,2.312],[0.245,0.709],[-0.557,0.502],[-4.283,-1.998],[-2.587,-1.387],[-2.125,0.478],[-1.205,2.19],[0.408,1.812],[1.826,1.157],[0.844,0.044],[0.176,0.826],[-9.478,4.825],[-1.508,2.571],[0.498,2.216],[1.953,1.413],[2.875,-0.646],[1.991,-2.808],[0.361,-0.436]],"v":[[-5.005,13.844],[-4.471,13.922],[-3.151,15.507],[-2.565,24.038],[-1.875,30.415],[1.862,36.832],[8.354,37.956],[14.133,34.039],[14.867,26.65],[12.51,20.505],[9.359,12.591],[9.966,10.637],[11.998,10.413],[23.308,16.081],[31.102,17.169],[35.987,13.322],[37.039,6.779],[32.511,1.577],[15.724,-1.462],[13.967,-2.902],[14.901,-4.973],[28.791,-15.072],[30.666,-21.561],[26.912,-27.025],[20.854,-28.41],[14.226,-24.186],[6.424,-14.374],[4.49,-13.708],[3.107,-15.214],[2.566,-23.717],[2.066,-30.277],[-1.701,-36.496],[-8.604,-37.457],[-13.99,-33.663],[-14.62,-26.264],[-12.57,-20.453],[-9.447,-12.493],[-9.961,-10.497],[-12,-10.191],[-22.969,-15.63],[-31.104,-16.728],[-35.987,-12.88],[-37.039,-6.337],[-32.666,-1.23],[-15.938,1.962],[-14.21,3.439],[-15.188,5.491],[-29.018,15.363],[-30.667,22.004],[-26.917,27.465],[-20.854,28.853],[-14.021,24.281],[-6.443,14.521]]}}},{"ty":"sh","nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.991,0],[1.883,1.437],[0.842,3.742],[0.045,2.631],[0.085,1.286],[1.273,-1.796],[3.763,-0.846],[2.829,2.046],[0.697,3.102],[-2.001,3.413],[-5.1,3.022],[2.44,1.547],[0.633,2.814],[-1.641,2.982],[-3.184,0.716],[-3.366,-1.805],[-2.498,-1.213],[0.474,1.047],[0.436,1.94],[-1.475,2.855],[-3.696,0.831],[-2.709,-1.882],[-0.847,-3.767],[0.128,-2.714],[-0.056,-1.114],[-1.44,1.741],[-3.384,0.761],[-2.835,-2.043],[-0.696,-3.093],[2.226,-3.385],[4.964,-3.056],[-2.528,-1.6],[-0.632,-2.809],[1.641,-2.982],[3.183,-0.715],[3.409,1.682],[2.78,1.401],[-0.494,-0.923],[-0.517,-2.297],[1.575,-2.88],[3.846,-0.865]],"o":[[-2.424,0],[-2.552,-1.943],[-0.472,-2.101],[-0.02,-1.141],[-1.734,2.184],[-2.249,3.171],[-3.187,0.716],[-2.756,-1.986],[-0.628,-2.789],[1.48,-2.53],[-5.764,-0.644],[-3.36,-2.123],[-0.696,-3.098],[1.684,-3.06],[3.746,-0.842],[1.93,1.038],[-0.475,-1.203],[-1.085,-2.394],[-0.84,-3.736],[1.535,-2.965],[3.827,-0.861],[2.656,1.848],[0.518,2.301],[-0.051,1.053],[1.939,-2.466],[2.38,-2.879],[3.18,-0.716],[2.762,1.999],[0.635,2.824],[-1.609,2.452],[5.785,0.561],[3.464,2.192],[0.697,3.097],[-1.684,3.06],[-3.4,0.766],[-2.065,-1.014],[0.424,1.026],[1.28,2.404],[0.844,3.756],[-1.619,2.961],[-1.073,0.241]],"v":[[6.075,41.96],[-0.401,39.801],[-5.518,31.234],[-6.297,24.103],[-6.455,20.458],[-10.976,26.441],[-20.036,32.495],[-29.102,30.491],[-34.309,22.823],[-32.239,13.477],[-22.43,5.194],[-34.662,1.923],[-40.682,-5.518],[-39.258,-14.68],[-31.922,-20.37],[-21.203,-18.919],[-14.547,-15.535],[-15.971,-18.914],[-18.263,-25.445],[-17.305,-35.379],[-9.422,-41.099],[0.43,-39.561],[5.708,-31.098],[6.295,-23.54],[6.303,-20.286],[11.349,-26.566],[20.034,-32.053],[29.099,-30.052],[34.308,-22.38],[31.911,-13.022],[22.112,-4.805],[34.508,-1.578],[40.68,5.96],[39.256,15.121],[31.922,20.811],[21.659,19.43],[14.425,15.823],[15.803,18.749],[18.51,25.831],[17.409,35.831],[9.172,41.598]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.627,42.21]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.983,-2.797],[3.313,-0.745],[2.388,1.727],[0.596,2.653],[-1.764,3.009],[-7.968,4.057],[2.941,1.864],[0.522,2.322],[-1.423,2.585],[-2.653,0.597],[-2.97,-1.593],[-4.28,-1.996],[1.037,2.293],[0.411,1.825],[-1.274,2.466],[-3.15,0.708],[-2.273,-1.578],[-0.745,-3.313],[0.121,-2.549],[-0.47,-2.852],[-2.124,2.567],[-2.984,0.671],[-2.391,-1.723],[-0.596,-2.649],[1.946,-2.96],[7.764,-4.182],[-3.045,-1.927],[-0.521,-2.319],[1.42,-2.58],[2.649,-0.595],[3.034,1.496],[4.519,2.293],[-1.204,-2.251],[-0.483,-2.152],[1.356,-2.48],[3.313,-0.745],[2.206,1.683],[0.746,3.317],[0.044,2.516],[0.337,3.059]],"o":[[-1.983,2.796],[-2.653,0.597],[-2.391,-1.723],[-0.522,-2.319],[1.76,-3.007],[-8.811,-0.455],[-2.944,-1.86],[-0.596,-2.65],[1.419,-2.58],[3.313,-0.745],[2.971,1.597],[-1.005,-2.908],[-1.037,-2.288],[-0.745,-3.314],[1.274,-2.462],[3.313,-0.745],[2.269,1.579],[0.485,2.156],[-0.123,2.554],[3.103,-4.003],[2.121,-2.566],[2.649,-0.595],[2.389,1.728],[0.522,2.323],[-1.946,2.963],[8.77,0.293],[3.045,1.927],[0.597,2.653],[-1.422,2.585],[-2.984,0.671],[-3.037,-1.493],[0.797,2.783],[1.201,2.256],[0.746,3.317],[-1.359,2.485],[-3.15,0.708],[-2.206,-1.679],[-0.448,-1.989],[-0.043,-2.512],[-3.013,3.64]],"v":[[-12.498,25.13],[-20.445,30.443],[-28.008,28.749],[-32.487,22.182],[-30.628,14.19],[-16.034,3.596],[-33.662,0.117],[-38.86,-6.158],[-37.622,-14.01],[-31.513,-18.779],[-22.086,-17.504],[-11.211,-12.115],[-14.27,-19.914],[-16.442,-26.085],[-15.648,-34.753],[-9.013,-39.508],[-0.635,-38.258],[3.888,-30.918],[4.43,-23.858],[4.948,-15.749],[12.786,-25.607],[20.445,-30.462],[28.006,-28.768],[32.487,-22.202],[30.352,-14.277],[15.786,-3.559],[33.51,-0.232],[38.859,6.139],[37.622,13.991],[31.513,18.76],[22.485,17.526],[11.154,11.846],[14.157,19.398],[16.688,26.01],[15.771,34.704],[8.763,39.546],[0.732,38.087],[-3.695,30.595],[-4.432,23.839],[-5.005,15.48]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.627,42.44]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":2},{"ty":4,"nm":"pin 2 Outlines","sr":0.855,"st":20,"op":170,"ip":20,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[41.628,42.21,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[650.635,798.899,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-12.498,25.361],[-12.495,25.361]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.548,0],[-0.177,-0.053],[-0.082,-0.745],[-0.043,-2.528],[-0.417,-1.855],[-1.862,-1.417],[-2.609,0.585],[-1.098,2.007],[0.649,2.883],[1.122,2.108],[0.828,2.891],[-0.573,0.473],[-0.662,-0.336],[-3.014,-1.481],[-2.583,0.581],[-1.162,2.112],[0.497,2.211],[2.597,1.643],[10.458,0.349],[0.192,0.821],[-0.743,0.4],[-1.213,1.848],[0.405,1.798],[2.029,1.468],[2.121,-0.476],[1.866,-2.259],[3.174,-4.094],[0.719,0.183],[0.121,0.732],[-0.13,2.681],[0.444,1.975],[1.891,1.316],[2.804,-0.631],[1.019,-1.967],[-0.651,-2.897],[-0.98,-2.164],[-1.028,-2.974],[0.557,-0.501],[0.678,0.317],[2.997,1.612],[2.886,-0.648],[1.162,-2.111],[-0.497,-2.213],[-2.495,-1.576],[-10.519,-0.543],[-0.176,-0.827],[0.754,-0.384],[1.077,-1.841],[-0.413,-1.836],[-2.025,-1.459],[-2.127,0.479],[-1.722,2.429],[-3.037,3.668]],"o":[[0.178,0],[0.718,0.215],[0.345,3.133],[0.041,2.376],[0.652,2.901],[1.76,1.342],[2.791,-0.628],[1.142,-2.089],[-0.443,-1.97],[-1.262,-2.359],[-0.205,-0.714],[0.572,-0.472],[4.597,2.333],[2.663,1.314],[2.124,-0.478],[1.205,-2.19],[-0.407,-1.809],[-1.887,-1.194],[-0.843,-0.029],[-0.193,-0.821],[9.283,-5],[1.649,-2.508],[-0.496,-2.209],[-1.955,-1.409],[-2.594,0.584],[-2.076,2.509],[-0.454,0.587],[-0.72,-0.182],[-0.488,-2.962],[0.112,-2.378],[-0.645,-2.867],[-1.839,-1.277],[-2.606,0.586],[-1.075,2.081],[0.381,1.692],[1.045,2.308],[0.244,0.709],[-0.557,0.502],[-4.283,-1.997],[-2.586,-1.387],[-2.125,0.478],[-1.205,2.19],[0.408,1.812],[1.826,1.157],[0.844,0.044],[0.176,0.826],[-9.478,4.825],[-1.507,2.571],[0.498,2.216],[1.953,1.413],[2.875,-0.646],[1.992,-2.809],[0.361,-0.436]],"v":[[-5.005,13.844],[-4.469,13.922],[-3.149,15.507],[-2.565,24.038],[-1.875,30.415],[1.862,36.832],[8.354,37.956],[14.133,34.039],[14.867,26.65],[12.51,20.505],[9.359,12.591],[9.966,10.637],[11.998,10.413],[23.308,16.081],[31.102,17.169],[35.987,13.322],[37.039,6.779],[32.511,1.577],[15.724,-1.462],[13.969,-2.902],[14.901,-4.973],[28.791,-15.072],[30.666,-21.561],[26.912,-27.025],[20.854,-28.41],[14.226,-24.186],[6.424,-14.374],[4.49,-13.708],[3.107,-15.214],[2.566,-23.717],[2.066,-30.279],[-1.701,-36.496],[-8.604,-37.457],[-13.99,-33.663],[-14.62,-26.264],[-12.57,-20.453],[-9.445,-12.493],[-9.961,-10.497],[-11.998,-10.191],[-22.969,-15.63],[-31.104,-16.728],[-35.987,-12.88],[-37.039,-6.337],[-32.666,-1.23],[-15.938,1.962],[-14.21,3.439],[-15.188,5.491],[-29.018,15.363],[-30.667,22.004],[-26.917,27.465],[-20.854,28.853],[-14.021,24.281],[-6.443,14.521]]}}},{"ty":"sh","nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.99,0],[1.883,1.437],[0.841,3.741],[0.045,2.63],[0.085,1.285],[1.274,-1.797],[3.762,-0.846],[2.827,2.046],[0.697,3.102],[-2.001,3.412],[-5.099,3.022],[2.44,1.547],[0.633,2.814],[-1.641,2.982],[-3.184,0.716],[-3.366,-1.805],[-2.498,-1.213],[0.473,1.046],[0.436,1.94],[-1.475,2.855],[-3.696,0.831],[-2.709,-1.882],[-0.848,-3.767],[0.128,-2.714],[-0.056,-1.114],[-1.442,1.744],[-3.384,0.761],[-2.835,-2.043],[-0.695,-3.092],[2.226,-3.385],[4.964,-3.056],[-2.528,-1.6],[-0.632,-2.81],[1.641,-2.982],[3.183,-0.715],[3.409,1.681],[2.777,1.398],[-0.494,-0.923],[-0.517,-2.296],[1.575,-2.88],[3.845,-0.865]],"o":[[-2.425,0],[-2.553,-1.943],[-0.473,-2.102],[-0.02,-1.141],[-1.734,2.183],[-2.249,3.171],[-3.19,0.716],[-2.757,-1.986],[-0.628,-2.789],[1.48,-2.53],[-5.764,-0.644],[-3.36,-2.123],[-0.696,-3.097],[1.684,-3.059],[3.747,-0.842],[1.931,1.038],[-0.475,-1.204],[-1.085,-2.394],[-0.84,-3.736],[1.535,-2.965],[3.827,-0.861],[2.657,1.849],[0.517,2.301],[-0.051,1.053],[1.937,-2.464],[2.379,-2.879],[3.179,-0.715],[2.763,1.999],[0.635,2.824],[-1.61,2.452],[5.785,0.561],[3.465,2.192],[0.697,3.096],[-1.684,3.06],[-3.4,0.765],[-2.068,-1.017],[0.424,1.024],[1.28,2.405],[0.844,3.756],[-1.619,2.961],[-1.074,0.241]],"v":[[6.076,41.96],[-0.401,39.801],[-5.516,31.234],[-6.297,24.103],[-6.455,20.46],[-10.976,26.441],[-20.034,32.495],[-29.102,30.491],[-34.309,22.823],[-32.239,13.477],[-22.43,5.194],[-34.662,1.923],[-40.682,-5.518],[-39.258,-14.68],[-31.922,-20.37],[-21.203,-18.919],[-14.547,-15.535],[-15.971,-18.914],[-18.263,-25.445],[-17.305,-35.379],[-9.422,-41.099],[0.43,-39.561],[5.709,-31.098],[6.295,-23.54],[6.303,-20.286],[11.349,-26.566],[20.034,-32.053],[29.099,-30.052],[34.308,-22.38],[31.911,-13.022],[22.112,-4.805],[34.508,-1.578],[40.68,5.961],[39.258,15.121],[31.922,20.811],[21.659,19.43],[14.425,15.824],[15.803,18.749],[18.51,25.831],[17.409,35.831],[9.174,41.598]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.628,42.21]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.983,-2.797],[3.313,-0.745],[2.388,1.727],[0.596,2.653],[-1.764,3.009],[-7.968,4.057],[2.941,1.864],[0.522,2.322],[-1.423,2.585],[-2.653,0.597],[-2.97,-1.593],[-4.28,-1.996],[1.038,2.293],[0.411,1.825],[-1.274,2.466],[-3.15,0.708],[-2.273,-1.578],[-0.745,-3.313],[0.121,-2.549],[-0.47,-2.852],[-2.124,2.567],[-2.984,0.671],[-2.391,-1.723],[-0.596,-2.649],[1.946,-2.96],[7.764,-4.182],[-3.045,-1.927],[-0.521,-2.319],[1.42,-2.58],[2.649,-0.595],[3.034,1.496],[4.519,2.293],[-1.204,-2.251],[-0.483,-2.152],[1.356,-2.48],[3.313,-0.745],[2.206,1.683],[0.745,3.317],[0.043,2.517],[0.337,3.059]],"o":[[-1.983,2.796],[-2.653,0.597],[-2.391,-1.723],[-0.522,-2.319],[1.76,-3.007],[-8.811,-0.455],[-2.944,-1.86],[-0.596,-2.65],[1.419,-2.58],[3.313,-0.745],[2.971,1.597],[-1.005,-2.908],[-1.036,-2.288],[-0.745,-3.314],[1.274,-2.461],[3.313,-0.745],[2.269,1.579],[0.485,2.156],[-0.123,2.554],[3.103,-4.003],[2.121,-2.566],[2.649,-0.595],[2.389,1.728],[0.522,2.323],[-1.946,2.963],[8.77,0.293],[3.045,1.927],[0.597,2.653],[-1.422,2.585],[-2.984,0.671],[-3.037,-1.493],[0.797,2.783],[1.201,2.256],[0.746,3.317],[-1.36,2.485],[-3.15,0.708],[-2.206,-1.679],[-0.448,-1.989],[-0.043,-2.512],[-3.013,3.64]],"v":[[-12.498,25.13],[-20.445,30.443],[-28.008,28.749],[-32.487,22.182],[-30.628,14.19],[-16.034,3.596],[-33.662,0.117],[-38.86,-6.158],[-37.622,-14.01],[-31.513,-18.779],[-22.086,-17.504],[-11.211,-12.115],[-14.271,-19.914],[-16.442,-26.085],[-15.648,-34.753],[-9.013,-39.508],[-0.635,-38.258],[3.888,-30.918],[4.43,-23.858],[4.948,-15.749],[12.786,-25.607],[20.445,-30.462],[28.006,-28.768],[32.487,-22.202],[30.352,-14.277],[15.786,-3.559],[33.51,-0.232],[38.859,6.139],[37.622,13.991],[31.513,18.76],[22.485,17.526],[11.154,11.846],[14.157,19.398],[16.688,26.01],[15.771,34.704],[8.763,39.546],[0.732,38.087],[-3.695,30.595],[-4.432,23.839],[-5.005,15.48]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.628,42.441]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":3},{"ty":4,"nm":"pin 1 Outlines","sr":0.839,"st":10,"op":180,"ip":10,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[41.627,42.21,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[553.763,820.682,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-12.498,25.361],[-12.495,25.361]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.547,0],[-0.177,-0.053],[-0.083,-0.745],[-0.043,-2.527],[-0.417,-1.855],[-1.862,-1.417],[-2.609,0.586],[-1.098,2.007],[0.649,2.884],[1.122,2.108],[0.829,2.892],[-0.573,0.473],[-0.663,-0.336],[-3.008,-1.478],[-2.582,0.58],[-1.162,2.112],[0.497,2.212],[2.597,1.643],[10.458,0.349],[0.192,0.821],[-0.743,0.4],[-1.213,1.848],[0.405,1.798],[2.029,1.468],[2.122,-0.476],[1.866,-2.259],[3.177,-4.099],[0.72,0.182],[0.121,0.732],[-0.13,2.679],[0.444,1.974],[1.891,1.316],[2.804,-0.631],[1.019,-1.967],[-0.651,-2.897],[-0.98,-2.163],[-1.028,-2.973],[0.557,-0.501],[0.679,0.317],[2.998,1.612],[2.886,-0.648],[1.162,-2.111],[-0.497,-2.212],[-2.495,-1.576],[-10.518,-0.543],[-0.176,-0.827],[0.754,-0.384],[1.077,-1.841],[-0.413,-1.836],[-2.025,-1.459],[-2.128,0.478],[-1.723,2.429],[-3.037,3.669]],"o":[[0.179,0],[0.718,0.215],[0.345,3.134],[0.041,2.377],[0.652,2.901],[1.76,1.342],[2.792,-0.627],[1.142,-2.088],[-0.443,-1.97],[-1.262,-2.358],[-0.204,-0.714],[0.572,-0.472],[4.602,2.336],[2.663,1.314],[2.124,-0.478],[1.205,-2.19],[-0.407,-1.808],[-1.887,-1.194],[-0.843,-0.029],[-0.193,-0.821],[9.283,-5],[1.649,-2.508],[-0.496,-2.209],[-1.955,-1.409],[-2.594,0.584],[-2.073,2.505],[-0.454,0.587],[-0.72,-0.182],[-0.488,-2.964],[0.112,-2.378],[-0.645,-2.868],[-1.84,-1.277],[-2.606,0.586],[-1.075,2.081],[0.381,1.693],[1.045,2.308],[0.244,0.709],[-0.557,0.502],[-4.281,-1.997],[-2.587,-1.387],[-2.125,0.478],[-1.205,2.19],[0.408,1.812],[1.826,1.158],[0.844,0.044],[0.176,0.826],[-9.478,4.825],[-1.507,2.571],[0.498,2.216],[1.952,1.413],[2.875,-0.646],[1.991,-2.808],[0.361,-0.436]],"v":[[-5.005,13.844],[-4.469,13.922],[-3.149,15.507],[-2.565,24.038],[-1.874,30.415],[1.862,36.832],[8.354,37.954],[14.134,34.039],[14.868,26.65],[12.51,20.505],[9.359,12.591],[9.966,10.637],[11.999,10.413],[23.309,16.081],[31.103,17.169],[35.987,13.322],[37.039,6.779],[32.512,1.577],[15.724,-1.462],[13.969,-2.902],[14.901,-4.973],[28.791,-15.072],[30.666,-21.561],[26.913,-27.025],[20.854,-28.41],[14.226,-24.186],[6.424,-14.374],[4.491,-13.708],[3.107,-15.214],[2.567,-23.717],[2.067,-30.277],[-1.701,-36.496],[-8.603,-37.457],[-13.99,-33.663],[-14.62,-26.264],[-12.569,-20.453],[-9.445,-12.493],[-9.96,-10.497],[-11.999,-10.191],[-22.969,-15.63],[-31.103,-16.728],[-35.987,-12.88],[-37.039,-6.337],[-32.665,-1.23],[-15.938,1.962],[-14.209,3.439],[-15.188,5.491],[-29.017,15.363],[-30.666,22.004],[-26.916,27.465],[-20.854,28.853],[-14.021,24.281],[-6.443,14.521]]}}},{"ty":"sh","nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.99,0],[1.883,1.437],[0.842,3.742],[0.045,2.631],[0.086,1.285],[1.273,-1.797],[3.763,-0.846],[2.829,2.046],[0.698,3.102],[-2,3.412],[-5.099,3.021],[2.44,1.547],[0.633,2.814],[-1.641,2.982],[-3.184,0.716],[-3.366,-1.805],[-2.498,-1.212],[0.473,1.046],[0.436,1.941],[-1.474,2.855],[-3.696,0.831],[-2.71,-1.882],[-0.848,-3.768],[0.128,-2.714],[-0.056,-1.114],[-1.441,1.741],[-3.384,0.761],[-2.835,-2.043],[-0.696,-3.093],[2.226,-3.385],[4.963,-3.056],[-2.528,-1.6],[-0.632,-2.809],[1.64,-2.982],[3.184,-0.716],[3.408,1.682],[2.78,1.401],[-0.494,-0.923],[-0.517,-2.296],[1.575,-2.88],[3.846,-0.865]],"o":[[-2.424,0],[-2.553,-1.943],[-0.472,-2.102],[-0.02,-1.141],[-1.733,2.183],[-2.249,3.171],[-3.188,0.717],[-2.756,-1.986],[-0.627,-2.789],[1.481,-2.53],[-5.763,-0.644],[-3.36,-2.123],[-0.696,-3.097],[1.684,-3.06],[3.747,-0.842],[1.931,1.038],[-0.475,-1.203],[-1.084,-2.394],[-0.84,-3.736],[1.536,-2.965],[3.827,-0.861],[2.656,1.849],[0.517,2.3],[-0.051,1.053],[1.939,-2.466],[2.379,-2.879],[3.179,-0.715],[2.762,1.999],[0.635,2.824],[-1.609,2.452],[5.785,0.561],[3.464,2.192],[0.696,3.097],[-1.684,3.06],[-3.401,0.764],[-2.065,-1.014],[0.424,1.026],[1.28,2.405],[0.844,3.756],[-1.619,2.961],[-1.073,0.241]],"v":[[6.076,41.96],[-0.401,39.801],[-5.517,31.234],[-6.297,24.103],[-6.455,20.46],[-10.975,26.441],[-20.035,32.495],[-29.102,30.491],[-34.309,22.823],[-32.239,13.477],[-22.43,5.194],[-34.662,1.923],[-40.681,-5.518],[-39.258,-14.68],[-31.922,-20.37],[-21.203,-18.919],[-14.546,-15.536],[-15.97,-18.914],[-18.262,-25.445],[-17.306,-35.379],[-9.422,-41.099],[0.43,-39.561],[5.71,-31.096],[6.296,-23.54],[6.304,-20.286],[11.349,-26.566],[20.035,-32.053],[29.099,-30.052],[34.309,-22.38],[31.911,-13.022],[22.113,-4.805],[34.508,-1.578],[40.681,5.96],[39.258,15.121],[31.922,20.813],[21.66,19.43],[14.426,15.823],[15.804,18.749],[18.511,25.831],[17.409,35.831],[9.173,41.598]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.627,42.21]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.983,-2.797],[3.313,-0.745],[2.388,1.727],[0.596,2.653],[-1.764,3.009],[-7.968,4.057],[2.941,1.864],[0.522,2.322],[-1.423,2.585],[-2.653,0.597],[-2.97,-1.593],[-4.28,-1.996],[1.038,2.293],[0.411,1.825],[-1.274,2.466],[-3.151,0.708],[-2.273,-1.578],[-0.745,-3.313],[0.121,-2.549],[-0.47,-2.852],[-2.124,2.567],[-2.983,0.671],[-2.391,-1.723],[-0.595,-2.649],[1.946,-2.96],[7.764,-4.182],[-3.045,-1.927],[-0.521,-2.319],[1.42,-2.58],[2.649,-0.595],[3.034,1.496],[4.519,2.293],[-1.204,-2.251],[-0.483,-2.152],[1.356,-2.48],[3.313,-0.745],[2.207,1.683],[0.746,3.317],[0.043,2.517],[0.337,3.059]],"o":[[-1.983,2.796],[-2.653,0.597],[-2.391,-1.723],[-0.522,-2.319],[1.76,-3.007],[-8.811,-0.455],[-2.944,-1.86],[-0.596,-2.65],[1.419,-2.58],[3.313,-0.745],[2.971,1.597],[-1.005,-2.908],[-1.036,-2.289],[-0.745,-3.314],[1.274,-2.462],[3.313,-0.745],[2.269,1.579],[0.485,2.156],[-0.123,2.554],[3.103,-4.003],[2.121,-2.566],[2.649,-0.595],[2.389,1.728],[0.523,2.323],[-1.946,2.963],[8.77,0.293],[3.045,1.927],[0.597,2.653],[-1.422,2.585],[-2.984,0.671],[-3.037,-1.493],[0.797,2.783],[1.201,2.256],[0.746,3.317],[-1.36,2.485],[-3.15,0.708],[-2.205,-1.679],[-0.447,-1.989],[-0.043,-2.512],[-3.013,3.64]],"v":[[-12.498,25.13],[-20.445,30.443],[-28.008,28.749],[-32.487,22.182],[-30.628,14.19],[-16.034,3.596],[-33.662,0.117],[-38.86,-6.158],[-37.622,-14.01],[-31.513,-18.779],[-22.086,-17.504],[-11.211,-12.115],[-14.271,-19.914],[-16.442,-26.085],[-15.648,-34.753],[-9.013,-39.508],[-0.635,-38.258],[3.888,-30.918],[4.43,-23.858],[4.948,-15.749],[12.786,-25.607],[20.443,-30.462],[28.006,-28.768],[32.487,-22.202],[30.352,-14.277],[15.786,-3.559],[33.51,-0.232],[38.859,6.139],[37.622,13.991],[31.513,18.76],[22.485,17.526],[11.154,11.846],[14.157,19.398],[16.688,26.01],[15.771,34.704],[8.763,39.546],[0.73,38.087],[-3.697,30.595],[-4.432,23.839],[-5.005,15.48]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.627,42.441]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":4},{"ty":4,"nm":"yellow box Outlines","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[315.477,137.779,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[701.631,786.567,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.135,0],[0.194,0.87],[-1.006,0.224],[0,0],[-9.839,17.407],[6.972,20.778],[-0.977,0.328],[-0.328,-0.977],[9.428,-16.678],[27.194,-6.026],[0,0]],"o":[[-0.855,0],[-0.225,-1.006],[0,0],[26.134,-5.791],[8.892,-15.731],[-0.328,-0.977],[0.977,-0.328],[7.319,21.809],[-10.375,18.354],[0,0],[-0.137,0.03]],"v":[[-170.439,79.424],[-172.259,77.963],[-170.843,75.735],[103.705,14.533],[158.691,-20.926],[161.626,-76.732],[162.802,-79.096],[165.165,-77.92],[161.941,-19.089],[104.515,18.177],[-170.031,79.379]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.537,0.541,0.553]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[442.664,137.343]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[14.32,0],[5.63,-1.266],[0,0],[10.93,-17.273],[-4.484,-19.942],[-17.272,-10.931],[-19.943,4.485],[0,0],[-10.931,17.273],[4.485,19.943],[17.273,10.931]],"o":[[-5.634,0],[0,0],[-19.943,4.484],[-10.931,17.272],[4.485,19.943],[17.273,10.931],[0,0],[19.942,-4.484],[10.93,-17.273],[-4.484,-19.943],[-12.395,-7.845]],"v":[[229.394,-126.742],[212.457,-124.851],[-246.035,-21.753],[-293.911,11.986],[-303.908,69.696],[-270.169,117.573],[-212.458,127.569],[246.034,24.472],[293.91,-9.267],[303.906,-66.978],[270.167,-114.854]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[5.908,0],[13.001,8.227],[4.703,20.915],[-11.464,18.116],[-20.916,4.703],[0,0],[-18.116,-11.464],[-4.703,-20.915],[11.464,-18.115],[20.916,-4.703],[0,0],[0,0],[0,0]],"o":[[-15.019,0],[-18.115,-11.465],[-4.703,-20.916],[11.464,-18.115],[0,0],[20.915,-4.703],[18.115,11.464],[4.704,20.916],[-11.464,18.115],[0,0],[0,0],[0,0],[-5.904,1.327]],"v":[[-229.403,133.196],[-272.164,120.728],[-307.549,70.516],[-297.066,9.989],[-246.854,-25.396],[211.638,-128.493],[272.164,-118.009],[307.549,-67.797],[297.065,-7.271],[246.852,28.114],[246.443,26.293],[246.852,28.114],[-211.639,131.212]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.537,0.541,0.553]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[315.477,136.42]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 3","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[42.24,-9.498],[0,0],[9.498,42.24],[-42.241,9.499],[0,0],[-9.498,-42.24],[0,0]],"o":[[0,0],[-42.241,9.498],[-9.498,-42.24],[0,0],[42.24,-9.498],[0,0],[9.499,42.24]],"v":[[246.444,24.934],[-212.048,128.031],[-305.729,68.747],[-246.443,-24.934],[212.047,-128.031],[305.727,-68.747],[305.727,-68.746]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.537,0.541,0.553]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[315.476,137.779]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":5}]},{"nm":"","id":"comp_2","layers":[{"ty":4,"nm":"lock Outlines","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[238.038,192.34,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[606.663,642.058,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.031,0],[0,1.031],[0,0],[-26.622,0],[0,0],[0,-1.031],[1.031,0],[0,0],[0,-22.699],[0,0]],"o":[[-1.031,0],[0,0],[0,-24.757],[0,0],[1.031,0],[0,1.031],[0,0],[-24.563,0],[0,0],[0,1.031]],"v":[[-53.408,60.441],[-55.275,58.574],[-55.275,-15.542],[-6.994,-60.441],[53.408,-60.441],[55.275,-58.574],[53.408,-56.707],[-6.994,-56.707],[-51.542,-15.542],[-51.542,58.574]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[68.86,72.843]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.031,0],[0,1.031],[0,0],[-1.031,0],[0,-1.031],[0,0]],"o":[[-1.031,0],[0,0],[0,-1.031],[1.031,0],[0,0],[0,1.031]],"v":[[0,107.724],[-1.867,105.857],[-1.867,-105.857],[0,-107.724],[1.867,-105.857],[1.867,105.857]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[457.427,201.292]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 3","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-1.03],[1.03,0],[0.6,-0.06],[0.94,-13.92],[0,-0.71],[1.03,0],[0,1.03],[-16.3,0]],"o":[[0,1.03],[-0.6,0],[-12.76,0.95],[-0.06,0.7],[0,1.03],[-1.03,0],[0,-17.6],[1.03,0]],"v":[[15.715,-15.03],[13.845,-13.16],[12.045,-13.08],[-11.895,12.92],[-11.975,15.03],[-13.845,16.9],[-15.715,15.03],[13.845,-16.9]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[227.389,159.103]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 4","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.031,0],[0,0],[0,1.031],[-1.031,0],[0,0],[0,-1.031]],"o":[[0,0],[-1.031,0],[0,-1.031],[0,0],[1.031,0],[0,1.031]],"v":[[10.15,1.866],[-10.151,1.866],[-12.017,0],[-10.151,-1.866],[10.15,-1.866],[12.017,0]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[243.046,240.876]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 5","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[232.895,240.876],[253.196,240.876]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 6","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[16.431,0],[0,-17.737],[-2.716,-2.503],[-0.517,-0.539],[-0.688,-0.556],[-0.072,-0.457],[0.18,-1.015],[0,0],[-0.548,-0.653],[-0.811,0],[0,0],[-0.51,0.607],[0.166,0.952],[0,0],[-0.119,0.762],[-0.36,0.29],[-0.685,0.697],[-0.828,0.737],[0,12.842]],"o":[[-16.43,0],[0,12.814],[0.579,0.534],[0.378,0.394],[0.359,0.291],[0.121,0.764],[0,0],[-0.167,0.949],[0.496,0.59],[0,0],[0.835,0],[0.548,-0.653],[0,0],[-0.178,-1.014],[0.072,-0.457],[0.408,-0.33],[0.717,-0.73],[3.383,-3.011],[0,-17.737]],"v":[[-0.001,-53.041],[-29.798,-20.873],[-18.219,3.604],[-16.567,5.221],[-14.547,7.148],[-13.877,8.308],[-13.972,11.149],[-20.753,49.59],[-20.153,52.111],[-18.096,53.04],[18.092,53.04],[20.149,52.112],[20.75,49.587],[13.969,11.148],[13.875,8.312],[14.546,7.149],[16.216,5.58],[18.545,3.369],[29.797,-20.873]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.945,0],[0,0],[1.206,1.438],[-0.359,2.039],[0,0],[-0.007,0.272],[0.397,0.414],[0.523,0.481],[0,14.333],[-18.489,0],[0,-19.795],[3.76,-3.345],[0.659,-0.671],[0.394,-0.358],[-0.069,-0.39],[0,0],[1.26,-1.499]],"o":[[0,0],[-1.918,0],[-1.26,-1.5],[0,0],[0.069,-0.391],[-0.654,-0.594],[-0.465,-0.484],[-2.998,-2.763],[0,-19.795],[18.49,0],[0,14.354],[-0.765,0.682],[-0.497,0.506],[0.008,0.271],[0,0],[0.357,2.043],[-1.224,1.458]],"v":[[18.092,56.773],[-18.096,56.773],[-23.012,54.511],[-24.429,48.942],[-17.648,10.498],[-17.543,9.492],[-19.261,7.805],[-20.749,6.351],[-33.531,-20.873],[-0.001,-56.773],[33.531,-20.873],[21.026,6.158],[18.88,8.195],[17.541,9.494],[17.646,10.498],[24.427,48.941],[23.007,54.513]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[238.038,192.34]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 7","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.385,0],[0,0],[0.851,1.013],[-0.263,1.494],[0,0],[0.064,0.406],[0.445,0.464],[0.549,0.507],[0,13.572],[-17.459,0],[0,-18.767],[3.571,-3.178],[0.69,-0.701],[0.57,-0.461],[-0.175,-0.989],[0,0],[0.904,-1.076]],"o":[[0,0],[-1.365,0],[-0.904,-1.078],[0,0],[0.176,-0.99],[-0.76,-0.614],[-0.492,-0.513],[-2.858,-2.633],[0,-18.767],[17.461,0],[0,13.597],[-0.796,0.708],[-0.549,0.56],[-0.064,0.406],[0,0],[0.262,1.496],[-0.864,1.028]],"v":[[18.092,54.907],[-18.095,54.907],[-21.582,53.312],[-22.59,49.266],[-15.811,10.823],[-15.72,8.599],[-17.915,6.513],[-19.483,4.977],[-31.665,-20.873],[-0.001,-54.907],[31.665,-20.873],[19.785,4.763],[17.548,6.887],[15.72,8.601],[15.807,10.823],[22.588,49.266],[21.579,53.313]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[238.038,192.34]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 8","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.008,0.005],[0.008,-0.006]],"o":[[-0.008,0.005],[0.008,-0.006]],"v":[[15.248,8.804],[15.223,8.82]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.006,0.004],[-0.006,-0.004]],"o":[[0.006,0.004],[-0.006,-0.004]],"v":[[-15.236,8.811],[-15.217,8.824]]}}},{"ty":"sh","nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[15.336,0],[0,-16.642],[-2.567,-2.365],[-0.548,-0.571],[-0.163,-0.11],[0.189,-1.063],[0,0],[-0.17,-0.203],[-0.237,0],[0,0],[-0.124,0.148],[0.065,0.37],[0,0],[-1.846,1.182],[-0.879,0.895],[-0.86,0.766],[0,12.037]],"o":[[-15.336,0],[0,12.004],[0.605,0.557],[1.093,1.138],[1.834,1.179],[0,0],[-0.065,0.369],[0.124,0.148],[0,0],[0.237,0],[0.17,-0.203],[0,0],[-0.188,-1.064],[0.144,-0.098],[0.749,-0.762],[3.183,-2.832],[0,-16.642]],"v":[[-0.001,-51.055],[-27.813,-20.873],[-16.873,2.145],[-15.134,3.846],[-13.189,5.689],[-12.016,11.494],[-18.796,49.935],[-18.631,50.835],[-18.095,51.055],[18.092,51.055],[18.629,50.835],[18.795,49.933],[12.014,11.492],[13.202,5.682],[14.799,4.188],[17.225,1.885],[27.811,-20.873]]}}},{"ty":"sh","nm":"Path 4","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.349,0],[0,0],[0.841,1.002],[-0.257,1.459],[0,0],[0.072,0.404],[0.451,0.469],[0.549,0.506],[0,13.523],[-17.394,0],[0,-18.701],[3.559,-3.168],[0.69,-0.703],[0.569,-0.455],[-0.184,-1.042],[0,0],[0.882,-1.05]],"o":[[0,0],[-1.349,0],[-0.881,-1.05],[0,0],[0.185,-1.043],[-0.756,-0.604],[-0.495,-0.517],[-2.849,-2.625],[0,-18.701],[17.394,0],[0,13.549],[-0.798,0.709],[-0.559,0.569],[-0.072,0.403],[0,0],[0.256,1.461],[-0.84,1]],"v":[[18.092,54.788],[-18.095,54.788],[-21.491,53.235],[-22.473,49.287],[-15.692,10.844],[-15.61,8.535],[-17.829,6.431],[-19.402,4.89],[-31.545,-20.873],[-0.001,-54.788],[31.546,-20.873],[19.707,4.675],[17.463,6.804],[15.61,8.537],[15.691,10.843],[22.472,49.287],[21.486,53.237]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[238.037,192.34]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 9","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.672],[-2.748,-2.532],[-0.536,-0.559],[-0.399,-0.258],[0.322,-1.819],[0,0],[-1.717,0],[0,0],[0.319,1.823],[0,0],[-0.518,0.332],[-0.821,0.836],[-0.8,0.712],[0,12.959],[16.365,0]],"o":[[0,12.759],[0.567,0.523],[0.951,0.991],[0.516,0.332],[0,0],[-0.321,1.823],[0,0],[1.719,0],[0,0],[-0.321,-1.819],[0.349,-0.226],[0.754,-0.767],[3.058,-2.722],[0,-17.672],[-16.367,0]],"v":[[-29.678,-20.873],[-18.138,3.517],[-16.482,5.138],[-14.208,7.253],[-13.854,11.168],[-20.635,49.611],[-18.096,52.921],[18.092,52.921],[20.633,49.611],[13.852,11.168],[14.208,7.253],[16.132,5.496],[18.465,3.28],[29.678,-20.873],[-0.001,-52.921]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[238.037,192.34]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 10","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-22.699],[0,0],[-24.564,0],[0,0],[0,22.7],[0,0],[24.565,0]],"o":[[-24.564,0],[0,0],[0,22.7],[0,0],[24.565,0],[0,0],[0,-22.699],[0,0]],"v":[[-189.506,-188.358],[-234.054,-147.192],[-234.054,147.189],[-189.506,188.356],[189.503,188.356],[234.055,147.189],[234.055,-147.192],[189.503,-188.358]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[26.624,0],[0,0],[0,24.758],[0,0],[-26.622,0],[0,0],[0,-24.758],[0,0]],"o":[[0,0],[-26.622,0],[0,0],[0,-24.758],[0,0],[26.624,0],[0,0],[0,24.758]],"v":[[189.503,192.09],[-189.506,192.09],[-237.787,147.189],[-237.787,-147.192],[-189.506,-192.09],[189.503,-192.09],[237.787,-147.192],[237.787,147.189]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[238.037,192.341]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 11","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[25.635,0],[0,0],[0,23.768],[0,0],[-25.635,0],[0,0],[0,-23.766]],"o":[[0,23.768],[0,0],[-25.635,0],[0,0],[0,-23.766],[0,0],[25.635,0],[0,0]],"v":[[235.921,147.19],[189.504,190.224],[-189.506,190.224],[-235.921,147.19],[-235.921,-147.191],[-189.506,-190.224],[189.504,-190.224],[235.921,-147.191]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[238.037,192.34]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":1},{"ty":4,"nm":"lock top Outlines","sr":1,"st":0,"op":240,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[278.62,303.58,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[726.66,542.7,0],"t":50,"ti":[0,15.61,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[726.66,511.797,0],"t":70,"ti":[0,-12.003,0],"to":[0,-8.573,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[726.66,511.797,0],"t":190,"ti":[0,0,0],"to":[0,6.312,0]},{"s":[726.66,542.7,0],"t":210}]},"r":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[0],"t":50},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[7.478],"t":70},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[7.478],"t":190},{"s":[0],"t":210}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.958,0],[0.055,0.005],[-0.089,1.027],[5.495,14.62],[10.891,11.364],[38.217,-1.7],[0.028,0],[0,0],[0,1.031],[-1.031,0],[0,0],[-26.029,-27.157],[-5.501,-14.637],[1.383,-15.894]],"o":[[-0.054,0],[-1.027,-0.09],[1.335,-15.333],[-5.322,-14.162],[-25.295,-26.391],[-0.027,0.001],[0,0],[-1.031,0],[0,-1.031],[0,0],[39.278,-1.734],[11.243,11.73],[5.692,15.147],[-0.085,0.972]],"v":[[65.652,64.979],[65.488,64.973],[63.789,62.951],[57.52,17.81],[33.087,-20.659],[-66.856,-59.513],[-66.939,-59.512],[-67.027,-59.512],[-68.893,-61.378],[-67.027,-63.245],[-66.98,-63.245],[35.781,-23.241],[61.015,16.496],[67.509,63.275]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[229.344,75.241]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.34,-67.35],[0,-0.2],[0,0],[0,0],[0,0],[40.79,0],[0,0],[0,-37.63],[0,0],[0,0],[0.06,0.18],[-73.35,0],[0,0]],"o":[[-0.06,0.18],[0,0],[0,0],[0,0],[0,-37.63],[0,0],[-40.79,0],[0,0],[0,0],[0,0],[0.33,-67.35],[0,0],[73.34,0]],"v":[[151.135,-26.54],[151.045,-25.97],[151.045,148.6],[91.635,148.6],[91.635,-25.97],[17.655,-94.21],[-17.665,-94.21],[-91.635,-25.97],[-91.635,67.6],[-151.045,67.6],[-151.135,-26.54],[-17.745,-148.6],[17.745,-148.6]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[155.125,152.58]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 3","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-0.2],[0,0],[0,0],[0,0],[40.79,0],[0,0],[0,-37.63],[0,0],[0,0],[0.06,0.18],[-73.35,0],[0,0],[-0.34,-67.35]],"o":[[0,0],[0,0],[0,0],[0,-37.63],[0,0],[-40.79,0],[0,0],[0,0],[0,0],[0.33,-67.35],[0,0],[73.34,0],[-0.06,0.18]],"v":[[151.05,-25.97],[151.05,148.6],[91.64,148.6],[91.64,-25.97],[17.66,-94.21],[-17.66,-94.21],[-91.63,-25.97],[-91.63,67.6],[-151.04,67.6],[-151.13,-26.54],[-17.74,-148.6],[17.75,-148.6],[151.14,-26.54]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[75.61,0],[0,0],[0,-69.68],[0,0],[-1.03,0],[0,0],[0,1.03],[0,0],[-38.73,0],[0,0],[0,-35.57],[0,0],[-1.03,0],[0,0],[0,1.03],[0,0],[0,0.2]],"o":[[0,0],[-75.61,0],[0,0],[0,1.03],[0,0],[1.03,0],[0,0],[0,-35.57],[0,0],[38.74,0],[0,0],[0,1.03],[0,0],[1.03,0],[0,0],[0.06,-0.18],[0,-69.68]],"v":[[17.75,-152.33],[-17.74,-152.33],[-154.87,-25.97],[-154.78,69.46],[-152.91,71.33],[-89.77,71.33],[-87.9,69.46],[-87.9,-25.97],[-17.66,-90.48],[17.66,-90.48],[87.91,-25.97],[87.91,150.46],[89.77,152.33],[152.92,152.33],[154.78,150.46],[154.78,-25.4],[154.87,-25.97]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[155.12,152.58]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":2}]}]} \ No newline at end of file diff --git a/assets/animations/lottie/onboarding_1.json b/assets/animations/lottie/onboarding_1.json new file mode 100644 index 0000000..b0c55c4 --- /dev/null +++ b/assets/animations/lottie/onboarding_1.json @@ -0,0 +1 @@ +{"nm":"Main Scene","ddd":0,"h":600,"w":600,"meta":{"g":"@lottiefiles/creator 1.53.2"},"layers":[{"ty":0,"nm":"estrellas","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[300,125,0],"ix":1},"s":{"a":0,"k":[53.16945994492611,53.16945994492611],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[478.2389608823896,85.22773247406882],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":40},{"s":[0],"t":89}],"ix":11}},"w":600,"h":250,"refId":"comp_0_3767b7ba-b54e-4323-959c-3eb2991ef416","ind":1},{"ty":4,"nm":"check/calendario contornos","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[323.5,147.5,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0,0],"t":10},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":26},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[51.22535002552709,51.22535002552707],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[56.97376091391484,56.97376091391489],"t":46},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[91.64753139680157,91.64753139680163],"t":74},{"s":[42.551035503050684,42.5510355030507],"t":83}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[490.73378396944724,97.1908609616772],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-8.587,0.922],[-1.971,8.235],[8.587,-8.235]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[10],"t":23},{"s":[4],"t":60}],"ix":5},"c":{"a":0,"k":[1,1,1],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[323.405,146.875],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":0,"nm":"dias","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[300,125,0],"ix":1},"s":{"a":0,"k":[53.16945994492611,53.16945994492611],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[478.2389608823896,85.22773247406882],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"w":600,"h":250,"refId":"comp_1_324897dc-302d-4af9-abad-aa3ece2c26ac","ind":3},{"ty":4,"nm":"calendario/calendario contornos","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[302,159,0],"ix":1},"s":{"a":0,"k":[53.16945994492611,53.16945994492611],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[479.3065039453463,103.30534885534378],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[404.364,130.846],[404.364,163.225]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.7,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[404.364,115.559],[404.364,124.288]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.7,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[404.364,171.672],[404.364,180.4]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.7,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[6.075,0],[0,0]],"o":[[0,0],[0,6.075],[0,0],[0,0]],"v":[[57.353,-21.986],[57.353,10.986],[46.353,21.986],[-57.354,21.986]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.7,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[347.011,210.269],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 5","ix":5,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[279.299,232.255],[272.823,232.255]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.7,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 6","ix":6,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,6.075],[0,0]],"o":[[0,0],[-6.075,0],[0,0],[0,0]],"v":[[27.073,21.141],[-16.073,21.141],[-27.073,10.141],[-27.073,-21.141]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.7,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[222.709,211.114],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 7","ix":7,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,0],[-6.075,0],[0,0],[0,-6.075]],"o":[[0,0],[0,0],[0,-6.075],[0,0],[6.075,0],[0,0]],"v":[[-104.364,46.089],[-104.364,35.952],[-104.364,-35.089],[-93.364,-46.089],[93.365,-46.089],[104.365,-35.089]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.7,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[300,122.204],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 8","ix":8,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-1.194,0],[0,-14.099],[0.011,-0.824]],"o":[[0.61,-6.943],[1.886,0],[0,0.844],[0,0]],"v":[[-3.135,-2.488],[-0.28,-14.016],[3.134,11.512],[3.118,14.016]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[227.505,77.304],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 9","ix":9,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-3.521],[3.522,0],[0,3.521],[-3.521,0]],"o":[[0,3.521],[-3.521,0],[0,-3.521],[3.522,0]],"v":[[6.376,0],[0,6.376],[-6.376,0],[0,-6.376]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[231.385,91.32],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 10","ix":10,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-1.194,0],[0,-14.099],[0.011,-0.824]],"o":[[0.61,-6.943],[1.886,0],[0,0.844],[0,0]],"v":[[-3.135,-2.488],[-0.28,-14.016],[3.134,11.512],[3.118,14.016]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[255.078,77.304],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 11","ix":11,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-3.521],[3.522,0],[0,3.521],[-3.521,0]],"o":[[0,3.521],[-3.521,0],[0,-3.521],[3.522,0]],"v":[[6.376,0],[0,6.376],[-6.376,0],[0,-6.376]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[258.959,91.32],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 12","ix":12,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-1.194,0],[0,-14.099],[0.011,-0.824]],"o":[[0.61,-6.943],[1.886,0],[0,0.844],[0,0]],"v":[[-3.134,-2.488],[-0.28,-14.016],[3.134,11.512],[3.118,14.016]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[282.652,77.304],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 13","ix":13,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-3.521],[3.522,0],[0,3.521],[-3.521,0]],"o":[[0,3.521],[-3.521,0],[0,-3.521],[3.522,0]],"v":[[6.376,0],[0,6.376],[-6.376,0],[0,-6.376]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[286.533,91.32],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 14","ix":14,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-1.194,0],[0,-14.099],[0.011,-0.824]],"o":[[0.61,-6.943],[1.886,0],[0,0.844],[0,0]],"v":[[-3.135,-2.488],[-0.28,-14.016],[3.135,11.512],[3.119,14.016]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[310.226,77.304],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 15","ix":15,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-3.521],[3.522,0],[0,3.521],[-3.521,0]],"o":[[0,3.521],[-3.521,0],[0,-3.521],[3.522,0]],"v":[[6.376,0],[0,6.376],[-6.376,0],[0,-6.376]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[314.106,91.32],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 16","ix":16,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-1.194,0],[0,-14.099],[0.011,-0.824]],"o":[[0.61,-6.943],[1.885,0],[0,0.844],[0,0]],"v":[[-3.135,-2.488],[-0.28,-14.016],[3.135,11.512],[3.118,14.016]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[337.8,77.304],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 17","ix":17,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-3.521],[3.522,0],[0,3.521],[-3.521,0]],"o":[[0,3.521],[-3.521,0],[0,-3.521],[3.522,0]],"v":[[6.376,0],[0,6.376],[-6.376,0],[0,-6.376]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[341.681,91.32],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 18","ix":18,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-1.194,0],[0,-14.099],[0.011,-0.824]],"o":[[0.61,-6.943],[1.886,0],[0,0.844],[0,0]],"v":[[-3.135,-2.488],[-0.28,-14.016],[3.135,11.512],[3.119,14.016]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"c":{"a":0,"k":[0.2824,0.2824,0.2824],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[365.373,77.304],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 19","ix":19,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-3.521],[3.522,0],[0,3.521],[-3.521,0]],"o":[[0,3.521],[-3.521,0],[0,-3.521],[3.522,0]],"v":[[6.376,0],[0,6.376],[-6.376,0],[0,-6.376]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[369.254,91.32],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 20","ix":20,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-6.074,0],[0,0],[0,-6.075]],"o":[[0,0],[0,0],[0,-6.075],[0,0],[6.075,0],[0,0]],"v":[[104.364,15.095],[-104.365,15.095],[-104.365,-4.096],[-93.365,-15.096],[93.364,-15.096],[104.364,-4.096]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[0.9098,0.9098,0.9098],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[300,91.21],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 21","ix":21,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[6.075,0],[0,0],[0,6.075],[0,0],[-6.074,0],[0,0],[0,-6.075],[0,0]],"o":[[0,0],[-6.074,0],[0,0],[0,-6.075],[0,0],[6.075,0],[0,0],[0,6.075]],"v":[[93.365,78.07],[-93.365,78.07],[-104.365,67.07],[-104.365,-67.07],[-93.365,-78.07],[93.365,-78.07],[104.365,-67.07],[104.365,67.07]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[300,154.185],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":0,"nm":"Nested Scene 3","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[175.00004406522177,160.50000077122638]},"s":{"a":0,"k":[185.30287610958862,185.3028761095886]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[324.28011980404784,302.5888710731508]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"w":350,"h":321,"refId":"precomp_Shape Layer - SVG_HNb6lFcX8T_73239bc2-d9ab-43fa-bd1f-1abcce3fb3c6","ind":5}],"v":"5.7.0","fr":30,"op":150,"ip":0,"assets":[{"nm":"Scene","id":"comp_0_3767b7ba-b54e-4323-959c-3eb2991ef416","layers":[{"ty":4,"nm":"estrellas/Loading-ilustracion contornos 3","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[46.526,29.526,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[308.337,308.337,100],"t":16},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[400,400,100],"t":38},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[0,0,100],"t":55},{"s":[308.337,308.337,100],"t":89}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[422.237,48.919,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[46.526,27.026],[46.526,32.026]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.657,"ix":5},"c":{"a":0,"k":[0.8549,0.098,0.098],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[44.026,29.526],[49.026,29.526]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Trazo 1","lc":2,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.658,"ix":5},"c":{"a":0,"k":[0.8549,0.098,0.098],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1}]},{"nm":"Scene_1","id":"comp_1_324897dc-302d-4af9-abad-aa3ece2c26ac","layers":[{"ty":4,"nm":"1/calendario contornos","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[229.75,146.25,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[110,110,100],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":13},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":78},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":81},{"s":[0,0,100],"t":86}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[229.75,146.25,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.923,0],[0,0],[0,2.923],[0,0],[-2.923,0],[0,0],[0,-2.922],[0,0]],"o":[[0,0],[-2.923,0],[0,0],[0,-2.922],[0,0],[2.923,0],[0,0],[0,2.923]],"v":[[12.183,17.474],[-12.182,17.474],[-17.475,12.182],[-17.475,-12.183],[-12.182,-17.474],[12.183,-17.474],[17.475,-12.183],[17.475,12.182]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[229.786,146.876],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"7/calendario contornos","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[276.5,148,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":6},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[110,110,100],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":19},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":79},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":82},{"s":[0,0,100],"t":87}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[276.5,148,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.922,0],[0,0],[0,2.923],[0,0],[-2.923,0],[0,0],[0,-2.922],[0,0]],"o":[[0,0],[-2.923,0],[0,0],[0,-2.922],[0,0],[2.922,0],[0,0],[0,2.923]],"v":[[12.183,17.474],[-12.182,17.474],[-17.474,12.182],[-17.474,-12.183],[-12.182,-17.474],[12.183,-17.474],[17.475,-12.183],[17.475,12.182]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[276.595,146.876],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"dia/calendario contornos","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[322.75,146.25,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":12},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[170,170,100],"t":22},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":29},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":80},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[170,170,100],"t":84},{"s":[0,0,100],"t":89}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[322.75,146.25,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.923,0],[0,0],[0,2.923],[0,0],[-2.922,0],[0,0],[0,-2.922],[0,0]],"o":[[0,0],[-2.922,0],[0,0],[0,-2.922],[0,0],[2.923,0],[0,0],[0,2.923]],"v":[[12.182,17.474],[-12.183,17.474],[-17.474,12.182],[-17.474,-12.183],[-12.183,-17.474],[12.182,-17.474],[17.474,-12.183],[17.474,12.182]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[0.8078,0.098,0.1451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[323.405,146.876],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"5/calendario contornos","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[370.25,147,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":22},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[110,110,100],"t":28},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":73},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":76},{"s":[0,0,100],"t":81}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[370.25,147,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.923,0],[0,0],[0,2.923],[0,0],[-2.922,0],[0,0],[0,-2.922],[0,0]],"o":[[0,0],[-2.922,0],[0,0],[0,-2.922],[0,0],[2.923,0],[0,0],[0,2.923]],"v":[[12.182,17.474],[-12.183,17.474],[-17.474,12.182],[-17.474,-12.183],[-12.183,-17.474],[12.182,-17.474],[17.474,-12.183],[17.474,12.182]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[370.215,146.876],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":4,"nm":"4/calendario contornos","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[370.25,193.75,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":28},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[110,110,100],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":41},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":74},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":77},{"s":[0,0,100],"t":82}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[370.25,193.75,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.923,0],[0,0],[0,2.922],[0,0],[-2.922,0],[0,0],[0,-2.923],[0,0]],"o":[[0,0],[-2.922,0],[0,0],[0,-2.923],[0,0],[2.923,0],[0,0],[0,2.922]],"v":[[12.182,17.474],[-12.183,17.474],[-17.474,12.183],[-17.474,-12.182],[-12.183,-17.474],[12.182,-17.474],[17.474,-12.182],[17.474,12.183]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[370.215,193.659],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5},{"ty":4,"nm":"3/calendario contornos 2","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[276.5,194.25,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[110,110,100],"t":40},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":47},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":75},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":78},{"s":[0,0,100],"t":83}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[324,194.25,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.922,0],[0,0],[0,2.922],[0,0],[-2.923,0],[0,0],[0,-2.923],[0,0]],"o":[[0,0],[-2.923,0],[0,0],[0,-2.923],[0,0],[2.922,0],[0,0],[0,2.922]],"v":[[12.183,17.474],[-12.182,17.474],[-17.474,12.183],[-17.474,-12.182],[-12.182,-17.474],[12.183,-17.474],[17.475,-12.182],[17.475,12.183]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[276.595,193.659],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6},{"ty":4,"nm":"3/calendario contornos","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[276,194.25,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":40},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[110,110,100],"t":46},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":53},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":76},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":79},{"s":[0,0,100],"t":84}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[276,194.25,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.922,0],[0,0],[0,2.922],[0,0],[-2.923,0],[0,0],[0,-2.923],[0,0]],"o":[[0,0],[-2.923,0],[0,0],[0,-2.923],[0,0],[2.922,0],[0,0],[0,2.922]],"v":[[12.183,17.474],[-12.182,17.474],[-17.474,12.183],[-17.474,-12.182],[-12.182,-17.474],[12.183,-17.474],[17.475,-12.182],[17.475,12.183]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[276.595,193.659],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":7},{"ty":4,"nm":"2/calendario contornos","sr":1,"st":0,"op":90,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[229.25,194,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":46},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[110,110,100],"t":52},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":59},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":77},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":80},{"s":[0,0,100],"t":85}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[229.25,194,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Grupo 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Trazado 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.923,0],[0,0],[0,2.922],[0,0],[-2.923,0],[0,0],[0,-2.923],[0,0]],"o":[[0,0],[-2.923,0],[0,0],[0,-2.923],[0,0],[2.923,0],[0,0],[0,2.922]],"v":[[12.183,17.474],[-12.182,17.474],[-17.475,12.183],[-17.475,-12.182],[-12.182,-17.474],[12.183,-17.474],[17.475,-12.182],[17.475,12.183]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Relleno 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[229.786,193.659],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":8}]},{"nm":"Nested Scene 3","id":"precomp_Shape Layer - SVG_HNb6lFcX8T_73239bc2-d9ab-43fa-bd1f-1abcce3fb3c6","layers":[{"ty":4,"nm":"Layer_1-2","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ln":"Layer_1-2","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[175.1650126774173,160.50000077122638]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[175.1650126774173,160.50000077122638]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","bm":0,"hd":false,"nm":"Group 1","it":[{"ty":"gr","bm":0,"hd":false,"nm":"Group 2","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.10999999999998522,-0.09000000000000341],[2.6500000000000057,5.930000000000007],[-4.240000000000009,-0.21999999999999886],[-0.21999999999999886,-0.1799999999999926]],"o":[[0.27000000000001023,0.21999999999999886],[-5.310000000000002,4.320000000000007],[3.8799999999999955,1.5499999999999972],[1.1200000000000045,0.060000000000002274],[0,0]],"v":[[146.33,86.67],[145.17000000000002,88.32000000000001],[128.67000000000002,83.67],[140.82000000000002,87.01],[146.33,86.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9882,0.9882,0.9882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[137.51821199592436,87.01160945048872]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[137.51821199592436,87.01160945048872]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 3","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.7199999999999989,-0.06999999999999318],[0.03999999999999204,-0.05000000000001137],[0.6299999999999955,-0.7400000000000091],[1.1299999999999812,8.899999999999991],[-1.9699999999999989,-0.5799999999999983],[-4.759999999999991,0.7400000000000091]],"o":[[0.4399999999999977,-0.06999999999999318],[1.0999999999999943,0.12000000000000455],[-0.46999999999999886,0.7199999999999989],[-5.849999999999994,6.859999999999999],[1.7099999999999937,-0.10999999999999943],[4.5800000000000125,1.3499999999999943],[0,0]],"v":[[147.33,85.33],[148.83,84.99],[148.33,85.89],[146.99,88.15],[127.00000000000001,81.99000000000001],[134.41000000000003,84.41000000000001],[147.33,85.32000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0314,0.0314,0.0275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[138.1110878505161,86.78480746549099]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[138.1110878505161,86.78480746549099]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 4","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.710000000000008,0.0799999999999983],[0.37999999999999545,-0.710000000000008],[0.4099999999999966,0.060000000000002274],[-0.060000000000002274,0.10999999999999943]],"o":[[-0.0799999999999983,0.7099999999999937],[-0.6500000000000057,0.5],[0.030000000000001137,-0.3100000000000023],[0.06999999999999318,-0.060000000000002274],[0,0]],"v":[[77.67,65.33],[78.34,66],[77.01,67.67],[76.68,66.67],[77.68,65.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.3255,0.3059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[77.51002341570648,66.49998784864508]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[77.51002341570648,66.49998784864508]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 5","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 4","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.01999999999999602,-0.2400000000000091],[-0.010000000000005116,-0.05999999999998806],[-0.28000000000000114,-0.45999999999999375],[0.46000000000000796,0.06999999999999318],[0.6499999999999915,0.20000000000000284],[0.4200000000000017,1.0999999999999943],[-0.9099999999999966,0.37000000000000455],[-0.12999999999999545,0.10999999999999943],[0.37999999999999545,-0.8599999999999994]],"o":[[0,0.0799999999999983],[0.030000000000001137,0.29000000000000625],[0.06999999999999318,0.4899999999999949],[-0.7600000000000051,0.21999999999999886],[-0.5100000000000051,-0.09000000000000341],[0.4200000000000017,-1.25],[1.0799999999999983,0.3199999999999932],[0.18999999999999773,-0.0799999999999983],[0.9000000000000057,-0.8599999999999994],[0,0]],"v":[[77,67.67],[76.69,68.18],[77,68.67],[77.33,70],[75.78999999999999,69.03],[74.33,69.67],[74,67.01],[76,67.01],[76.67,66.68],[77,67.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.9373,0.9294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[75.66503420218982,68.18968204377978]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[75.66503420218982,68.18968204377978]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 6","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 5","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.25,0.0899999999999963],[0.7999999999999972,-0.25],[0.10999999999999943,0.10000000000000142]],"o":[[0.12000000000000455,-0.060000000000002274],[0.7999999999999972,-0.28000000000000114],[-0.06999999999999318,-0.13000000000000256],[0,0]],"v":[[84.67,52],[85.17,51.34],[85,52.34],[84.67,52.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9843,0.6471,0.6196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.18088474217126,51.81607952729638]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.18088474217126,51.81607952729638]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 7","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 6","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.1700000000000017,0.1700000000000017],[-0.04999999999999716,-0.060000000000002274],[0.03999999999999204,-0.38000000000000256],[0,0],[-0.21999999999999886,0.4200000000000017]],"o":[[0.04999999999999716,-0.10000000000000142],[0.09000000000000341,-0.09000000000000341],[0.18999999999999773,0.20000000000000284],[0,0],[0.35999999999999943,-0.39000000000000057],[0,0]],"v":[[88.67,43.33],[88.72,42.73],[90.33,42.33],[90,44],[88,44.66],[88.67,43.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8549,0.8431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[89.187165801492,43.49171319653584]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[89.187165801492,43.49171319653584]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 8","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 7","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3499999999999943,-1.6700000000000017],[-0.01999999999999602,-0.6000000000000014],[1.0999999999999943,-0.8499999999999943],[-0.7199999999999989,1.2600000000000051],[0.010000000000005116,0.45000000000000284]],"o":[[-0.01999999999999602,-0.7800000000000011],[-1.0999999999999943,1.0600000000000023],[0.060000000000002274,1.5499999999999972],[-1.1800000000000068,0.8900000000000006],[0.5499999999999972,-1.0499999999999972],[0,0]],"v":[[77.67,64],[80.67,63],[80.34,64],[78.34,66],[77.67,65.33],[77.67,64]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.8941,0.8824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[78.97487622047427,64.42165801727515]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[78.97487622047427,64.42165801727515]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 9","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 8","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.6200000000000045,0.21999999999999886],[0.269999999999996,-1.5600000000000023],[-0.4299999999999926,-0.04000000000000625],[0.0799999999999983,-0.07000000000000739],[0.8100000000000023,-1.3199999999999932],[0,0],[0.4099999999999966,-0.20000000000000284],[0,0],[-1.4300000000000068,-0.4000000000000057],[-1.0900000000000034,-0.060000000000002274],[0,0],[-0.5800000000000125,0.46999999999999886]],"o":[[0,0],[0.6400000000000006,-0.269999999999996],[-1.7800000000000011,0.5600000000000023],[0.4399999999999977,0.04000000000000625],[-0.06999999999999318,0.09000000000000341],[-0.3400000000000034,0.269999999999996],[0,0],[-0.5499999999999972,0.9300000000000068],[0,0],[-1.1099999999999994,0.7000000000000028],[0.09000000000000341,-0.9599999999999937],[0,0],[0.7099999999999937,-0.29999999999999716],[0,0]],"v":[[80.33,64],[80.67,65.33],[82.67,64.66],[80.67,68.32],[82,68.32],[82,68.99],[80.34,69.32],[80.18,68.66],[77.68,69.66],[77.01,68.66],[77.01,67.66],[78.34,65.99],[78.41,65.14999999999999],[80.34,63.989999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2824,0.2627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[79.3618995910739,66.8249987058162]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[79.3618995910739,66.8249987058162]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 10","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 9","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12000000000000455,-0.3299999999999983],[-0.29999999999999716,-0.35999999999999943],[0.36999999999999034,-0.14000000000000057],[0.19000000000001194,-0.07000000000000028],[0,0],[0,0],[0.11999999999999034,0.11999999999999744],[0.12000000000000455,0.4399999999999977],[-0.7099999999999937,0.38000000000000256]],"o":[[0.3299999999999983,-0.10999999999999943],[0.29000000000000625,0.5300000000000011],[-0.030000000000001137,0.020000000000003126],[-0.730000000000004,0.28000000000000114],[0,0],[0,0],[0.1599999999999966,-0.5900000000000034],[-0.10999999999999943,-0.10999999999999943],[0.6599999999999966,0.25],[0,0]],"v":[[84.67,52],[85,52.33],[85.33,53.66],[85.09,54.309999999999995],[82.33,54.66],[82.33,54.33],[83.33,53.66],[82.67,53.33],[83.34,52],[84.67,52]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8627,0.851]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[83.83478226804513,53.329996959122894]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[83.83478226804513,53.329996959122894]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 11","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 10","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.1500000000000057,0.13999999999999346],[0,0],[0.45000000000000284,-0.5300000000000011],[-0.04000000000000625,1.1099999999999994]],"o":[[1.3799999999999955,0.7999999999999972],[0,0],[-0.6299999999999955,-0.3999999999999986],[-1.1400000000000006,0.3400000000000034],[0,0]],"v":[[81.67,58.67],[84.34,58.010000000000005],[83.67,61.010000000000005],[82,61.34],[81.67,58.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9098,0.8941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[82.85944117656439,59.69503259558044]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[82.85944117656439,59.69503259558044]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 12","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 11","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.5700000000000003,-0.37000000000000455],[-0.5300000000000011,0.14000000000000057],[0,0]],"o":[[-0.09000000000000341,-1.269999999999996],[0.4399999999999977,-0.25],[0,0],[0,0]],"v":[[55,112.33],[54,110],[55.33,109],[55,112.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.3176,0.2941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[54.66503544435807,110.66498940197735]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[54.66503544435807,110.66498940197735]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 13","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 12","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.23999999999999488,0.29999999999999716],[0.29000000000000625,0.3199999999999932],[0,0]],"o":[[0,0],[0,0],[-0.04999999999999716,-0.060000000000002274],[0,0],[0,0]],"v":[[69.67,99.67],[69.67,100],[68.67,100],[68.67,98.51],[69.67,99.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8627,0.2078,0.1765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[69.16750416815992,99.32164571630264]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[69.16750416815992,99.32164571630264]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 14","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 13","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.06999999999999318,0.09000000000000341],[-0.269999999999996,-0.2600000000000051]],"o":[[0.46999999999999886,0.46999999999999886],[-0.6099999999999994,-0.8400000000000034],[0,0]],"v":[[68,98.67],[66.67,100],[68,98.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8627,0.2078,0.1765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[67.30892017156779,99.31179298186282]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[67.30892017156779,99.31179298186282]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 15","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 14","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.030000000000001137,-0.46000000000000796],[0.3299999999999983,1.6899999999999977],[-0.35999999999999943,-0.4000000000000057]],"o":[[0.25,0.269999999999996],[-2.010000000000005,0.3299999999999983],[0.5900000000000034,0.15000000000000568],[0,0]],"v":[[67.12,101.55],[68,102.33],[66,100.33],[67.12,101.55]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8627,0.2078,0.1765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[67.00002201849563,101.37189027839065]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[67.00002201849563,101.37189027839065]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 16","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 15","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.269999999999996,-0.1700000000000017],[0.2600000000000051,1.1799999999999926],[-0.060000000000002274,0.060000000000002274],[-0.18999999999999773,1.480000000000004],[0,0]],"o":[[-0.5999999999999943,0.9099999999999966],[-0.8900000000000006,0.5600000000000023],[0.4000000000000057,-0.769999999999996],[0.09999999999999432,-0.09999999999999432],[0,0],[0,0]],"v":[[69.33,95.33],[68.69,97.84],[66.33,96.99000000000001],[66.67,95.33000000000001],[69,94.16000000000001],[69.34,95.33000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9176,0.7647,0.7333]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[67.83503628613724,96.14548241417461]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[67.83503628613724,96.14548241417461]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 17","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 16","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4399999999999977,0],[-2.589999999999989,-0.05000000000001137],[0.1599999999999966,-1.1700000000000017],[0.030000000000001137,-1.2299999999999898],[0.4200000000000017,0.0799999999999983],[0.030000000000001137,0]],"o":[[-0.4399999999999977,0],[0.030000000000001137,-2.739999999999995],[0.5400000000000063,0.010000000000005116],[-0.5699999999999932,1.1299999999999955],[-0.6200000000000045,0.18000000000000682],[-0.2600000000000051,-0.04999999999999716],[0,0]],"v":[[71.33,94],[70,94],[71.99,91.18],[73,91.66000000000001],[73,94.32000000000001],[71.77,93.72000000000001],[71.33999999999999,93.99000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.851,0.8235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[71.48930601501914,92.66537718296539]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[71.48930601501914,92.66537718296539]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 18","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 17","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.46999999999999886,-0.4200000000000017],[0,0],[-0.04000000000000625,0.20000000000000284]],"o":[[0.6099999999999994,0.1599999999999966],[0,0],[0.06999999999999318,-0.10000000000000142],[0,0]],"v":[[104,43.33],[104.5,44.66],[104,44],[104,43.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2745,0.2549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[104.35313159562747,43.99498888126766]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[104.35313159562747,43.99498888126766]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 19","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 18","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.18000000000000682,-0.75],[0.18999999999999773,-0.03999999999999915],[-0.10000000000000853,0.5499999999999972]],"o":[[0.5699999999999932,0.240000000000002],[-0.09999999999999432,0.07000000000000028],[0,-0.04999999999999716],[0,0]],"v":[[103.33,44.67],[104.33,45.67],[103.66,45.67],[103.33,44.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2745,0.2549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[103.83858000370347,45.18194481354908]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[103.83858000370347,45.18194481354908]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 20","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 19","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.09000000000000341,0.14000000000000057],[0,0],[-0.23999999999999488,-0.13999999999999346]],"o":[[0,0],[-0.1599999999999966,0],[0,0],[0.7099999999999937,-0.25],[0,0]],"v":[[103.67,42.67],[103.67,43.34],[103.01,43.67],[102.67,42.010000000000005],[103.67,42.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2745,0.2549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[103.17002718680888,42.82820617394523]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[103.17002718680888,42.82820617394523]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 21","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 20","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.2799999999999869,-0.3400000000000034],[2.3100000000000023,0.9699999999999989],[0.01999999999999602,0.01999999999999602],[-0.45000000000000284,0.28999999999999915],[-0.12000000000000455,0.0799999999999983]],"o":[[0,0],[-0.3400000000000034,0.3299999999999983],[-0.37000000000000455,0.45000000000000284],[0.01999999999999602,-0.09000000000000341],[0.4200000000000017,-0.3400000000000034],[0.12000000000000455,-0.0799999999999983],[0,0]],"v":[[90.33,52],[91.5,52.34],[90.29,53.160000000000004],[88.66000000000001,53.67],[88.66000000000001,53.34],[89.99000000000001,52.34],[90.32000000000001,52.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2863,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[90.08004249138901,53.036335711532814]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[90.08004249138901,53.036335711532814]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 22","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 21","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4200000000000017,-0.39000000000000057],[-1.2600000000000051,0.6599999999999966],[0.06999999999999318,-0.21000000000000085],[0.21999999999999886,-0.10000000000000142]],"o":[[-0.269999999999996,0.11999999999999744],[-0.8199999999999932,-1.5600000000000023],[0,0.020000000000003126],[-0.15000000000000568,0.46000000000000085],[0,0]],"v":[[88.33,50.33],[86.67,50.66],[89,47.33],[89.23,47.76],[88.33,50.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.8863,0.8745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.85551400454415,48.99499285076632]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.85551400454415,48.99499285076632]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 23","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 22","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-1.6599999999999966,1.3299999999999983],[-0.45999999999999375,0.4099999999999966]],"o":[[0,0],[-1.3400000000000034,0.8200000000000003],[0.3299999999999983,-0.259999999999998],[0,0]],"v":[[95.67,44.67],[96.01,47],[93.67,45.67],[95.67,44.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.9176,0.9098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[94.57569593239873,45.998955448259835]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[94.57569593239873,45.998955448259835]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 24","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 23","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.0600000000000023,-0.17999999999999972],[0.3499999999999943,1.0200000000000031],[-0.29000000000000625,0.1600000000000037],[-0.7199999999999989,0.6400000000000006],[0.18999999999999773,-0.5799999999999983]],"o":[[-0.2600000000000051,0.7800000000000011],[-1.8599999999999994,0.3299999999999983],[0.4300000000000068,-0.060000000000002274],[0.769999999999996,-0.4200000000000017],[0.09000000000000341,0.6599999999999966],[0,0]],"v":[[93,44],[92.16,45.67],[90.33,44.33],[91.33,43.66],[93.66,42.33],[93,44]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.9059,0.8941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[91.99991248664782,44.043247375508486]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.99991248664782,44.043247375508486]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 25","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 24","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5499999999999972,-0.03999999999999915],[0.04999999999999716,-0.20999999999999375],[-1.0900000000000034,-0.5200000000000031],[0.5699999999999932,-0.36999999999999744],[0.5900000000000034,0.3200000000000003],[0,0],[-0.9699999999999989,0.9299999999999997]],"o":[[0.5499999999999972,0.04999999999999716],[0.10999999999999943,0.07000000000000028],[-0.01999999999999602,0.060000000000002274],[-0.37000000000000455,0.21000000000000085],[0.46999999999999886,0.45000000000000284],[0,0],[0.7099999999999937,-1.0799999999999983],[0,0]],"v":[[90.67,49.33],[92.34,49.33],[92.01,49.989999999999995],[92.34,50.66],[90.34,51.989999999999995],[90.01,52.31999999999999],[89.02000000000001,51.81999999999999],[90.68,49.31999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.9373,0.9255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[90.6897575648413,50.8980634361925]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[90.6897575648413,50.8980634361925]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 26","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 25","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.2599999999999909,-0.030000000000001137],[0.7800000000000011,-0.5200000000000031],[0,0],[-0.07000000000000739,0.4200000000000017],[-0.23999999999999488,-0.509999999999998],[-0.4200000000000017,-0.4799999999999969],[0.06999999999999318,-0.8700000000000045]],"o":[[-0.1599999999999966,0.00999999999999801],[-0.45999999999999375,0.04999999999999716],[0,0],[0.18999999999999773,-0.46000000000000085],[0,-0.6199999999999974],[0.3499999999999943,-0.240000000000002],[0.45999999999999375,0.6599999999999966],[0,0]],"v":[[106,47.33],[105.45,47.98],[103.17,48],[102.99,47.33],[103.66,45.66],[104.33,45.66],[105,45.16],[106,47.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8941,0.8824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[104.49779760352288,46.50068853315511]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[104.49779760352288,46.50068853315511]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 27","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 26","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.1599999999999966,0.17999999999999972],[-0.14000000000000057,0.6000000000000014],[1.0100000000000051,-2.020000000000003],[0.21999999999999886,0.1700000000000017],[0.29000000000000625,-0.17999999999999972],[0.12000000000000455,-0.060000000000002274],[-1.3200000000000074,-0.18999999999999773]],"o":[[0.8799999999999955,0.45000000000000284],[-0.09999999999999432,-0.11999999999999744],[1.8299999999999983,-0.7000000000000028],[-1.0999999999999943,2.1799999999999997],[-0.6200000000000045,-0.4799999999999969],[-0.20999999999999375,0.13000000000000256],[-1.2900000000000063,0.5799999999999983],[0,0]],"v":[[92,50],[94,48.34],[93.34,48.010000000000005],[95.58,50.080000000000005],[94,50.010000000000005],[93.1,50.67],[92.33999999999999,50.67],[92.00999999999999,50]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2863,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[93.54764768779387,49.411345522773985]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[93.54764768779387,49.411345522773985]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 28","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 27","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4399999999999977,0.6799999999999997],[-1.6799999999999926,-1.1799999999999997],[0.6099999999999994,-0.5899999999999963]],"o":[[-0.6200000000000045,-0.060000000000002274],[0.8499999999999943,-0.9099999999999966],[1.6799999999999926,1.1799999999999997],[0,0]],"v":[[90.67,49.33],[89.01,48.83],[92.36,46.14],[90.67,49.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2863,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[90.95243743635962,47.59805424783377]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[90.95243743635962,47.59805424783377]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 29","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 28","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.46000000000000796,0.10000000000000853],[-0.8100000000000023,-0.030000000000001137]],"o":[[-0.11000000000001364,0.480000000000004],[-0.1599999999999966,-0.8700000000000045],[0,0]],"v":[[186,89.67],[185,90.33],[186,89.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2941,0.3176,0.3373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[185.48110429904793,89.99228056817202]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[185.48110429904793,89.99228056817202]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 30","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 29","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.9699999999999989,-0.12999999999999545],[0,0],[-1.1000000000000227,-0.030000000000001137]],"o":[[-0.7800000000000011,0.7099999999999937],[0,0],[1.1100000000000136,0.01999999999999602],[0,0]],"v":[[196.33,69.67],[193.17000000000002,70],[193.00000000000003,69.67],[196.33000000000004,69.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4275,0.451,0.4784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[194.66502716323637,69.85860587853489]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[194.66502716323637,69.85860587853489]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 31","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 30","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12000000000000455,-0.1599999999999966],[1.4499999999999886,0.030000000000001137],[-1.5,-0.25],[0.009999999999990905,-0.7000000000000028],[0.04999999999998295,-0.03999999999999204]],"o":[[-0.11000000000001364,0.0799999999999983],[-0.060000000000002274,0.0799999999999983],[-0.4000000000000057,-1.3599999999999994],[-1.2700000000000102,-2.3299999999999983],[0,0.060000000000002274],[0,0]],"v":[[192.26,78.9],[191,79.01],[190,80.34],[191.33,78.67],[192.99,77.84],[192.26000000000002,78.91]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2941,0.3176,0.3373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[191.40815105675838,78.72961983007625]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.40815105675838,78.72961983007625]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 32","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 31","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.8700000000000045,0.45000000000000284],[-2.259999999999991,-2.089999999999989]],"o":[[1.4499999999999886,1.3400000000000034],[-2.3100000000000023,-0.5600000000000023],[0,0]],"v":[[195.24,72.42],[193.23000000000002,77.29],[195.24,72.42]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0157,0.0235,0.0196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[194.01070607386586,74.66367498998133]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[194.01070607386586,74.66367498998133]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 33","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 32","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.420000000000016,2.5999999999999943],[0,0],[-2.009999999999991,0.46999999999999886]],"o":[[-3,1.2999999999999972],[0,0],[2.0600000000000023,0.060000000000002274],[0,0]],"v":[[142.33,95],[133,94],[136.2,95.3],[142.33999999999997,95]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8784,0.7255,0.5529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[137.67004362886686,94.98719893433861]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[137.67004362886686,94.98719893433861]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 34","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 33","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-3.6599999999999966,0.4899999999999949],[0,0],[3.6599999999999966,1.2000000000000028],[-0.21999999999999886,-0.030000000000001137]],"o":[[3.6399999999999864,0.45999999999999375],[0,0],[-3.7700000000000102,0.6099999999999994],[0.21999999999999886,0.030000000000001137],[0,0]],"v":[[137,83.67],[147.67,84],[147.83999999999997,84.33],[136.33999999999997,83.67],[137.00999999999996,83.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.8039,0.6157]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[142.09002010757368,84.18407371141629]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[142.09002010757368,84.18407371141629]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 35","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 34","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.329999999999984,0.25],[-0.08999999999997499,-0.5900000000000034],[-4.099999999999994,0.0800000000000125],[-1.1899999999999977,-0.9000000000000057],[2.6699999999999875,0.35999999999999943],[2.2299999999999898,1.1299999999999955],[0.12000000000000455,0.2599999999999909],[0.2600000000000051,-1.4500000000000028],[-0.7600000000000051,-2.6100000000000136],[-1,0.6500000000000057],[-1.8199999999999932,-0.6500000000000057]],"o":[[0,0],[-1.5300000000000011,-0.20000000000000284],[-0.3499999999999943,-0.06999999999999318],[3.8400000000000034,1.2800000000000011],[1.2299999999999898,-0.01999999999999602],[-2.0999999999999943,1.6400000000000006],[-2.3899999999999864,-0.3299999999999983],[-0.269999999999996,-0.14000000000000057],[-1.5900000000000034,0.09999999999999432],[-0.480000000000004,2.6599999999999966],[-1.8499999999999943,-1.3400000000000034],[1.2800000000000011,-0.8400000000000034],[0,0]],"v":[[137,83.67],[136.33,83.67],[132.42000000000002,82.75],[131.34,83],[143.16,85.32],[147.32999999999998,85.33],[138.63,86.08],[127.53999999999999,82.69],[126.99999999999999,82],[125.15999999999998,84.66],[125.32999999999998,93.34],[125.64999999999998,81.5],[136.99999999999997,83.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8824,0.7098,0.5451]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[135.8421125838652,87.33097737793531]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[135.8421125838652,87.33097737793531]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 36","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 35","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-6.060000000000002,4.52000000000001],[0.7299999999999898,0.8199999999999932],[4.1299999999999955,2.5600000000000023],[-0.4399999999999977,0.269999999999996],[-0.6800000000000068,-0.2600000000000051],[-3.1500000000000057,0.9399999999999977],[-0.3199999999999932,-1.269999999999996],[2.930000000000007,-0.9899999999999949],[0.9199999999999875,1.6500000000000057],[0.5,-0.21000000000000796],[2.719999999999999,2.1099999999999994],[2.3799999999999955,-0.45000000000000284],[0.8900000000000006,3.049999999999997],[-1.1500000000000057,1.1299999999999955],[-0.45000000000000284,-0.5699999999999932]],"o":[[0,0],[1.6299999999999955,7.429999999999993],[0.8499999999999943,-0.6299999999999955],[-4.699999999999989,0.15000000000000568],[-0.4199999999999875,-0.2600000000000051],[0.30000000000001137,-0.18000000000000682],[3.6699999999999875,0.6800000000000068],[0.37000000000000455,-0.04999999999999716],[0.7299999999999898,2.950000000000003],[-3.1500000000000057,1.0600000000000023],[-0.25,-0.45000000000000284],[-3.1999999999999886,0.980000000000004],[-2.3000000000000114,1.3599999999999994],[-3.1399999999999864,0.5799999999999983],[-1.1800000000000068,-1.7000000000000028],[0.45000000000000284,-0.45000000000000284],[0,0]],"v":[[127,82],[127.75,82.49],[145.25,88.91999999999999],[147.33,85.33999999999999],[131.23000000000002,83.07999999999998],[131.22000000000003,82.32999999999998],[136.33000000000004,83.66999999999999],[147.66000000000005,83.99999999999999],[151.01000000000005,83.88999999999999],[144.65000000000003,98.13999999999999],[144.17000000000004,94.32999999999998],[142.33000000000004,94.99999999999999],[133.00000000000003,93.99999999999999],[132.83000000000004,97.99999999999999],[125.33000000000004,93.33999999999999],[125.62000000000005,82.16],[126.99000000000005,82.00999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.6706,0.5098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[137.84050588693188,90.01832562476685]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[137.84050588693188,90.01832562476685]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 37","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 36","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.239999999999995,0.4200000000000017],[0.06999999999999318,0.389999999999997]],"o":[[1.3199999999999932,0.2699999999999996],[-0.09999999999999432,-0.3200000000000003],[0,0]],"v":[[117,18.67],[117,20],[117,18.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9647,0.5804,0.5569]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[117.66218537234846,19.372259097018315]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[117.66218537234846,19.372259097018315]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 38","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 37","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.160000000000025,-0.3200000000000003],[0.5,0.5499999999999972],[0,0],[-0.13999999999998636,-0.39000000000000057]],"o":[[0.12000000000000455,0.3299999999999983],[-0.6899999999999977,-0.030000000000001137],[0,0],[0.5900000000000034,0.0799999999999983],[0,0]],"v":[[129,17.67],[129.33,18.67],[127.33000000000001,18.340000000000003],[128.34,16.67],[129,17.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9216,0.9137]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[128.33002956573574,17.685610292528622]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[128.33002956573574,17.685610292528622]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 39","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 38","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6200000000000045,0.27999999999999936],[-0.19000000000002615,-0.08000000000000007],[0.3100000000000023,-0.5399999999999991],[0.46999999999999886,0.4299999999999997]],"o":[[0.21999999999999886,-0.40000000000000036],[0.5099999999999909,-0.22000000000000064],[-0.15000000000000568,0.39000000000000057],[-0.710000000000008,0.16000000000000014],[0,0]],"v":[[128.33,15],[129.17000000000002,13.33],[130.00000000000003,14],[129.66000000000003,16],[128.33,15]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.9294,0.9176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[129.16502392886335,14.657387290852256]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[129.16502392886335,14.657387290852256]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 40","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 39","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4899999999999949,-0.4499999999999993],[0.3200000000000074,-0.03999999999999915],[0.5400000000000063,-0.03999999999999915],[-1.2399999999999949,-0.3500000000000014]],"o":[[0.4200000000000017,0.120000000000001],[-0.6400000000000006,-0.3099999999999987],[-0.5300000000000011,0.07000000000000028],[0.35999999999999943,-1.5100000000000016],[0,0]],"v":[[102.33,20.33],[103.33,20.659999999999997],[101.66,20.989999999999995],[99.99,20.989999999999995],[102.32,20.329999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.7804,0.7529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[101.66003094424428,20.48753887431471]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[101.66003094424428,20.48753887431471]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 41","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 40","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.06999999999999318,-0.8999999999999986],[-0.18999999999999773,-0.05999999999999872],[0,0],[0.21000000000000796,-0.3000000000000007],[0.3100000000000023,-0.0799999999999983],[0,0],[0,0]],"o":[[1.2900000000000063,0.19000000000000128],[0.010000000000005116,0.14999999999999858],[0,0],[-0.06999999999999318,0.46000000000000085],[-0.3199999999999932,-0.4499999999999993],[0,0],[0,0],[0,0]],"v":[[106,16.67],[106.33,17.67],[106.5,18],[108,18],[107.33,19],[104.33,18.33],[104.33,18],[106,16.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8667,0.8627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[106.16501960232927,17.834983717989672]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[106.16501960232927,17.834983717989672]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 42","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 41","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.010000000000005116,-0.41999999999999993],[0.010000000000005116,-0.09999999999999964],[0.20999999999999375,0.07000000000000028],[-0.4099999999999966,0.3200000000000003]],"o":[[-0.269999999999996,0.6699999999999999],[0,0.10999999999999943],[-0.5900000000000034,0.21000000000000085],[-0.3100000000000023,-1.959999999999999],[0,0]],"v":[[126,12.33],[126.33,14.33],[126.33,14.66],[125.33,13.99],[126,12.32]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.4863,0.4627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[125.78790465319219,13.507314423049365]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[125.78790465319219,13.507314423049365]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 43","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 42","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.9500000000000028,-0.370000000000001],[0.5400000000000063,-0.5699999999999967],[-0.010000000000005116,0.2700000000000031],[-0.28999999999999204,0.4799999999999969],[-0.29999999999999716,0.1999999999999993]],"o":[[-0.6899999999999977,1.0600000000000005],[-0.6700000000000017,0.41000000000000014],[-0.04999999999999716,-0.16000000000000014],[0.09000000000000341,-0.3500000000000014],[0.35999999999999943,-0.5800000000000001],[0,0]],"v":[[125.67,15.67],[126.34,17],[124.34,18.33],[124.01,17.659999999999997],[124.17,16.33],[125.67,15.659999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8627,0.851]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[125.17490533492656,16.99499332184311]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[125.17490533492656,16.99499332184311]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 44","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 43","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.20000000000000284,-0.030000000000001137],[0,0],[-0.8400000000000034,0.7099999999999973],[-0.3299999999999983,0]],"o":[[0.20999999999999375,0],[0,0],[-0.45000000000000284,0.8000000000000007],[0.3299999999999983,0],[0,0]],"v":[[107.33,17.67],[108,17.67],[108,18],[106.33,17.67],[107.33,17.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.298,0.2745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[107.06542019852571,18.045613285346434]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.06542019852571,18.045613285346434]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 45","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 44","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7099999999999937,-0.34999999999999787],[0.0799999999999983,-0.05000000000000071],[0,0],[-0.03999999999999204,-0.00999999999999801]],"o":[[-0.18000000000000682,0.9699999999999989],[-0.09000000000000341,0.03999999999999915],[0,0],[0.1700000000000017,0.03999999999999915],[0,0]],"v":[[113,17.33],[111.67,18.659999999999997],[111.34,18.659999999999997],[112.67,16.989999999999995],[113,17.319999999999993]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.5529,0.5333]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[112.17003234145506,17.83028625268099]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[112.17003234145506,17.83028625268099]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 46","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 45","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.0799999999999983,-0.8599999999999994],[0.23000000000000398,0.0799999999999983],[0,0],[-0.3499999999999943,-1.0199999999999996]],"o":[[-0.5799999999999983,0.40000000000000036],[-0.23000000000000398,-0.07000000000000028],[0,0],[1,-0.10999999999999943],[0,0]],"v":[[113.67,15.67],[112.34,17],[111.67,16.67],[112.34,14.670000000000002],[113.67,15.670000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2588,0.2353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[112.67001382911661,15.816924755071511]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[112.67001382911661,15.816924755071511]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 47","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 46","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6400000000000006,-0.360000000000003],[0.5600000000000023,0.05000000000000071],[0,0],[-0.9899999999999949,0.10999999999999943]],"o":[[1.0699999999999932,0.5199999999999996],[-0.519999999999996,-0.19000000000000128],[0,0],[0.6599999999999966,-0.16000000000000014],[0,0]],"v":[[112.33,14.67],[111.66,16.67],[109.99,16.330000000000002],[110.32,15.330000000000002],[112.32,14.660000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8706,0.8627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[111.38412250990012,15.66498364730191]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[111.38412250990012,15.66498364730191]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 48","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 47","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.09000000000000341,-0.120000000000001],[0.04999999999999716,-0.07000000000000028],[0.37000000000000455,-0.46000000000000085],[-0.980000000000004,1.4200000000000017],[-0.8799999999999955,0.21000000000000085],[-0.29000000000000625,0.11999999999999744]],"o":[[0.18000000000000682,0.030000000000001137],[0.04999999999999716,0.07000000000000028],[-0.20999999999999375,0.3099999999999987],[0.0799999999999983,-0.3999999999999986],[-0.4300000000000068,-0.4499999999999993],[-0.29000000000000625,-0.08999999999999986],[0,0]],"v":[[108,17.67],[108.64,17.69],[108.86,19.35],[107,20.330000000000002],[107.33,19],[108,18],[108,17.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9059,0.898]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[107.84032283382774,18.984061360091573]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.84032283382774,18.984061360091573]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 49","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 48","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.3299999999999983,-1],[0.46999999999999886,-1.3099999999999987],[0,0],[-1.6200000000000045,0.8500000000000014]],"o":[[0,0],[-0.730000000000004,1.5199999999999996],[-0.8599999999999994,0],[0,0],[0.09000000000000341,-2.1499999999999986],[0,0]],"v":[[111.33,18.67],[111.66,18.67],[111.99,21],[109.77,21.32],[109.33,21.32],[111.33,18.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8353,0.8275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[110.66003609889043,19.98999568962057]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[110.66003609889043,19.98999568962057]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 50","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 49","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.09999999999999432,-0.5700000000000003],[0,0],[-1.8599999999999994,0.2699999999999996]],"o":[[0.39000000000000057,-0.0600000000000005],[0,0],[-0.04999999999999716,-0.13000000000000078],[0,0]],"v":[[114.67,13.33],[117,13.66],[114.34,14.33],[114.67,13.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9843,0.749,0.7333]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[115.3673740465,13.79258591798012]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[115.3673740465,13.79258591798012]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 51","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 50","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.769999999999996,0.1700000000000017],[-0.3299999999999983,0.5299999999999976],[0.09000000000000341,0.030000000000001137],[-0.8400000000000034,-1.040000000000001],[0,0],[-0.7000000000000028,-0.21999999999999886]],"o":[[-0.7600000000000051,0.129999999999999],[-0.4899999999999949,0.39000000000000057],[-0.10999999999999943,-0.030000000000001137],[-0.7000000000000028,-0.7199999999999989],[0,0],[0.060000000000002274,0.6500000000000004],[0,0]],"v":[[115,17.33],[113,17.33],[112.67,17],[112.34,17],[113.67,15.67],[114,15.67],[115,17.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.8784,0.8667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[113.56418431242486,16.436074568169175]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[113.56418431242486,16.436074568169175]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 52","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 51","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.37000000000000455,-0.20000000000000107],[0.060000000000002274,-0.05000000000000071],[0.03999999999999204,0.27999999999999936],[0.01999999999999602,0.22000000000000064],[-0.0799999999999983,-0.08000000000000007],[0,0]],"o":[[-0.04999999999999716,0.009999999999999787],[-0.37000000000000455,0.20000000000000107],[-0.3299999999999983,-0.10000000000000142],[-0.030000000000001137,-0.21000000000000085],[0.37000000000000455,-0.08999999999999986],[0,0],[0,0]],"v":[[123.33,15],[122.66,15.82],[121.33,16.330000000000002],[121,15.660000000000002],[121,14.990000000000002],[123,13.990000000000002],[123.34,14.990000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.9176,0.9098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[122.16512386548945,15.157687250738121]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[122.16512386548945,15.157687250738121]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 53","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 52","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5600000000000023,-1],[-2.1899999999999977,1.92],[-0.12999999999999545,0.05000000000000071]],"o":[[1.1099999999999994,-0.33000000000000007],[-2.1899999999999977,0.3100000000000005],[0.030000000000001137,-0.019999999999999574],[0,0]],"v":[[119.67,12.67],[120.34,15],[119.01,13],[119.68,12.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.7725,0.7569]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[119.11465756939609,13.86132615714726]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[119.11465756939609,13.86132615714726]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 54","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 53","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.04999999999998295,-0.34999999999999964],[0.3499999999999943,0.05000000000000071],[0.10000000000002274,0.019999999999999574],[-0.47999999999998977,0.08999999999999986]],"o":[[0,0],[-0.13999999999998636,0.0600000000000005],[-0.3100000000000023,-0.1899999999999995],[-0.11000000000001364,-0.019999999999999574],[0.3199999999999932,-0.5999999999999996],[0,0]],"v":[[142.67,13.67],[142.67,14],[142.33999999999997,14.33],[141.33999999999997,14],[141.00999999999996,14],[142.67999999999995,13.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8549,0.2118,0.1765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[141.8450353490189,13.986794261270632]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[141.8450353490189,13.986794261270632]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 55","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 54","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5099999999999909,0.75],[-0.8799999999999955,-0.5999999999999996]],"o":[[-0.5099999999999909,0.75],[0.6599999999999966,-0.23000000000000043],[0,0]],"v":[[131.67,12],[130,12],[131.67,12]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9569,0.6627,0.6471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[130.83503255963245,11.837265983252166]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[130.83503255963245,11.837265983252166]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 56","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 55","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.12000000000000455,0.14000000000000057],[-0.29000000000000625,0.0600000000000005]],"o":[[0,0],[-2.819999999999993,2.33],[0.3199999999999932,-0.03999999999999915],[0,0]],"v":[[124.33,12],[125,12.17],[123.33,12],[124.33,12]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.8039,0.7961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[124.07334972004679,12.59154754202973]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[124.07334972004679,12.59154754202973]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 57","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 56","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.5100000000000193,1.5300000000000011],[-0.14000000000001478,0.11000000000000121],[-0.3400000000000034,0]],"o":[[3,0.6699999999999999],[0.05000000000001137,-0.14000000000000057],[0.1699999999999875,-0.13000000000000078],[0,0]],"v":[[135.33,12.67],[134,13.34],[134.03,12.709999999999999],[135.34,12.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.9059,0.8941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[135.31342878698715,13.320401084147107]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[135.31342878698715,13.320401084147107]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 58","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 57","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.12999999999999545,-0.8599999999999994],[1.4200000000000017,-1.0100000000000016],[-0.730000000000004,0.39000000000000057],[-0.10999999999999943,0.07000000000000028],[-0.010000000000005116,0.02999999999999936]],"o":[[1.3100000000000023,-0.07000000000000028],[0.28999999999999204,1.9499999999999993],[-0.7199999999999989,0],[0.12999999999999545,-0.09999999999999964],[0.1700000000000017,-0.10999999999999943],[0,0]],"v":[[127,11.67],[127.88,12.29],[126.33,14.34],[126,12.34],[126.33,12.01],[127,11.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8745,0.8588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[126.77988591839329,12.974072492460891]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[126.77988591839329,12.974072492460891]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 59","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 58","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.8499999999999943,-0.1899999999999995],[0,0],[0.3599999999999852,-0.2900000000000009],[-1.700000000000017,-0.0600000000000005]],"o":[[0.5800000000000125,0.14000000000000057],[0,0],[0.9000000000000057,1.3100000000000005],[-1.240000000000009,0.5899999999999999],[0,0]],"v":[[139,13.33],[141,14],[141.33,14],[140.66000000000003,15.33],[138.99000000000004,13.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8784,0.8667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[140.00689328832502,14.372364602346778]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[140.00689328832502,14.372364602346778]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 60","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 59","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.15000000000000568,-0.08000000000000007],[-0.21999999999999886,-0.23000000000000043],[0.6100000000000136,-0.8200000000000003],[0.3300000000000125,0.030000000000001137],[0.6700000000000159,0.8099999999999987],[-1.8400000000000034,0.08999999999999986]],"o":[[0.46000000000000796,0.1899999999999995],[0.30000000000001137,0.15000000000000036],[0.15000000000000568,1.08],[-0.3300000000000125,0],[0.44999999999998863,-0.7899999999999991],[-0.12999999999999545,-0.16000000000000014],[0,0]],"v":[[131.33,14.33],[132.66000000000003,14.66],[133.66000000000003,15.33],[132.66000000000003,18],[131.66000000000003,18],[131.89000000000001,15.77],[131.33,14.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9255,0.9137]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[132.14948685646723,16.1716530516741]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[132.14948685646723,16.1716530516741]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 61","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 60","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.14000000000000057,0.09999999999999964],[-0.410000000000025,0.27999999999999936],[-0.1599999999999966,-0.3200000000000003],[0.5799999999999841,-1.2200000000000006],[0,0],[-0.04999999999998295,0.07000000000000028],[-0.1799999999999784,0.0600000000000005],[-0.5799999999999841,0.07000000000000028],[0.14999999999997726,-0.370000000000001],[0.549999999999983,-0.33000000000000007],[1.2099999999999937,-0.75],[-1.5999999999999943,0.8600000000000012],[-0.04999999999999716,0.3200000000000003],[-0.28000000000000114,0.10999999999999943],[0,0],[0.45000000000000284,0.2599999999999998]],"o":[[0.01999999999999602,-0.08000000000000007],[0.0799999999999983,-0.0600000000000005],[0.18000000000000682,0.5800000000000001],[0.30000000000001137,0.6400000000000006],[0,0],[0.12999999999999545,-0.14000000000000057],[0.060000000000002274,-0.08000000000000007],[0.6100000000000136,0.09999999999999964],[2.3600000000000136,1.620000000000001],[-0.5600000000000023,0.33000000000000007],[-0.7000000000000028,1.2699999999999996],[-1.6200000000000045,0.5799999999999983],[0.28000000000000114,-0.1899999999999995],[-0.28000000000000114,-0.10999999999999943],[0,0],[1.4300000000000068,-0.33000000000000007],[0,0]],"v":[[127,11.67],[126.67,11.01],[128.67000000000002,11.01],[128.01000000000002,11.5],[128.35000000000002,13.33],[129.68000000000004,13],[129.34000000000003,12],[130.01000000000002,12],[131.68,12],[130.01000000000002,14],[128.34000000000003,15],[126.34000000000003,17],[125.67000000000003,15.67],[126.34000000000003,14.67],[126.34000000000003,14.34],[126.45000000000003,13.49],[127.01000000000003,11.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.2627,0.2392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[128.59378428101118,14.08484389733178]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[128.59378428101118,14.08484389733178]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 62","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 61","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.170000000000016,0.39000000000000057],[-0.3300000000000125,0.12999999999999545]],"o":[[0,0],[-0.27000000000001023,0],[0.46000000000000796,-0.6099999999999994],[0,0]],"v":[[144.67,32.67],[144.67,33],[143.33999999999997,33],[144.67,32.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.8235,0.8039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[144.00503340141168,32.91356869557853]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[144.00503340141168,32.91356869557853]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 63","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 62","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.27000000000001023,-1.3300000000000018],[0.46000000000000796,-0.3299999999999983]],"o":[[0.4099999999999966,-1.1899999999999977],[-0.5099999999999909,-0.46000000000000085],[0,0]],"v":[[151.33,33.33],[152.66000000000003,33],[151.33,33.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.6471,0.6235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[151.99502380115476,32.76334932827163]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[151.99502380115476,32.76334932827163]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 64","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 63","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6599999999999966,-0.5600000000000023],[0.6100000000000136,-0.6800000000000068],[-0.04999999999998295,0.07000000000000028],[-0.3800000000000239,-0.1700000000000017]],"o":[[0.539999999999992,0.020000000000003126],[-0.11000000000001364,0.09000000000000341],[-0.37000000000000455,-0.07000000000000028],[0.4300000000000068,-0.13000000000000256],[0,0]],"v":[[144.67,33],[146,34],[143.17,34.34],[143.32999999999998,33],[144.66,33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9647,0.4941,0.4667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[144.59995942094733,33.61350097882524]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[144.59995942094733,33.61350097882524]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 65","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 64","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.0700000000000216,-0.28999999999999915],[-0.0800000000000125,-0.6300000000000026],[0.14000000000001478,0.17999999999999972],[0.6399999999999864,0.4099999999999966],[-0.339999999999975,0.030000000000001137],[-0.18000000000000682,-0.10000000000000142]],"o":[[0.0800000000000125,0.03999999999999915],[-0.020000000000010232,0.10000000000000142],[-0.030000000000001137,-0.03999999999999915],[-0.22999999999998977,-0.28999999999999915],[0.09000000000000341,-0.03999999999999915],[0.21999999999999886,0.09000000000000341],[0,0]],"v":[[139.33,34],[140,35.49],[138.99,36.67],[138.4,36.6],[137.65,34.67],[138.32,34],[139.32,34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.9255,0.9176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[138.8276105461982,35.33046435816698]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[138.8276105461982,35.33046435816698]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 66","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 65","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.1700000000000017,0.6099999999999994],[0,0],[-0.37999999999999545,-0.46000000000000796]],"o":[[-0.5799999999999983,0.060000000000002274],[0,0],[0.37000000000000455,0.23999999999999488],[0,0]],"v":[[73.33,87.33],[72,86.66],[72.33,86.66],[73.33,87.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8706,0.2353,0.2039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[72.66502584913641,87.00189604764714]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[72.66502584913641,87.00189604764714]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 67","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 66","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4300000000000068,-0.6699999999999946],[-0.4900000000000091,-0.21999999999999886],[0.4000000000000057,-0.5300000000000011],[1.0700000000000216,-0.6400000000000006],[0.19999999999998863,-0.030000000000001137],[-0.030000000000001137,0.5600000000000023],[0.3100000000000023,0.7000000000000028],[-0.5900000000000034,1.7000000000000028],[-0.4300000000000068,-0.8800000000000026]],"o":[[0.11000000000001364,0.5399999999999991],[0.5800000000000125,0.9099999999999966],[0.18999999999999773,0.5799999999999983],[-2.5500000000000114,-0.22999999999999687],[-0.09000000000000341,0.04999999999999716],[0.009999999999990905,-0.5499999999999972],[0.009999999999990905,-0.29999999999999716],[-0.4300000000000068,-0.9699999999999989],[0.4199999999999875,-0.6700000000000017],[0,0]],"v":[[152.67,33],[152.98,34.51],[154.67,35.33],[154.67,37],[153.33999999999997,38.67],[152.67999999999998,38.67],[152.67999999999998,37],[152.79999999999998,35.76],[151.35,33.33],[152.68,33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.8941,0.8824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[153.05975606509813,35.613944446835944]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[153.05975606509813,35.613944446835944]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 68","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 67","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.5900000000000034,0.7399999999999949],[-0.0799999999999983,0.12000000000000455],[0,0],[0.980000000000004,-1.2000000000000028]],"o":[[0,0],[0.3100000000000023,-0.7999999999999972],[0.10999999999999943,-0.14000000000000057],[0,0],[-1.3400000000000034,0.6400000000000006],[0,0]],"v":[[66.67,92],[66.33,91.83],[68,89.67],[68.67,89.34],[69.51,90.35000000000001],[66.67,92.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9647,0.8353,0.8196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[67.92002856100149,90.67499544679168]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[67.92002856100149,90.67499544679168]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 69","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 68","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.23999999999999488,-0.8200000000000003],[0.20000000000000284,-0.29999999999999716],[0.23000000000000398,0.10999999999999943],[0.7199999999999989,-0.060000000000002274],[-0.21999999999999886,0.13000000000000256],[-0.20999999999999375,0.05999999999999517]],"o":[[1.0699999999999932,-0.20000000000000284],[-0.09999999999999432,0.3400000000000034],[-0.12000000000000455,-0.060000000000002274],[-0.4099999999999966,-0.20000000000000284],[-0.10999999999999943,-0.1599999999999966],[0.0799999999999983,-0.04999999999999716],[0,0]],"v":[[108,47.33],[108.33,48.66],[108,49.66],[107.25,49.66],[106,48.65],[107,47.66],[108,47.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8824,0.8667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[107.3244774484925,48.496942100964674]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.3244774484925,48.496942100964674]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 70","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 69","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.789999999999992,-0.12000000000000455],[0.23999999999999488,-0.259999999999998],[0.10999999999999943,-0.07000000000000028],[0.47999999999998977,-0.14999999999999858],[-0.07000000000000739,0.3999999999999986],[-0.060000000000002274,0.03999999999999915],[-0.14999999999999147,0.46999999999999886],[0,0],[-0.28999999999999204,0]],"o":[[0.8199999999999932,0.020000000000003126],[0.09000000000000341,0.4299999999999997],[-0.4899999999999949,0.5200000000000031],[-0.12999999999999545,0.0799999999999983],[-0.29000000000000625,-0.490000000000002],[0.9200000000000017,-0.2700000000000031],[0.06999999999999318,-0.04999999999999716],[0,0],[0.37999999999999545,0.0799999999999983],[0,0]],"v":[[111,45.67],[113.33,46.010000000000005],[112.67,46.67],[111.35000000000001,48.5],[108.33000000000001,48.67],[108.00000000000001,47.34],[109.33000000000001,47.34],[109.66000000000001,45.67],[109.86000000000001,45.93],[110.99000000000001,45.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9569,0.4,0.3765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[110.6600759079185,47.1699877693255]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[110.6600759079185,47.1699877693255]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 71","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 70","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.12000000000000455,0.3299999999999983],[0.4300000000000068,-0.12000000000000455],[0.01999999999999602,0.010000000000005116]],"o":[[0.010000000000005116,-0.37000000000000455],[0.6899999999999977,0.1700000000000017],[-0.12000000000000455,0.030000000000001137],[0,0]],"v":[[84.67,92],[85,91],[84.83,92.33],[84.67,92]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.8235,0.7608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.01645355185431,91.66588196372174]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.01645355185431,91.66588196372174]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 72","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 71","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.0500000000000114,-0.36999999999999744],[-0.6699999999999875,0.4399999999999977],[-0.8200000000000216,-0.7800000000000011]],"o":[[0.3100000000000023,1.259999999999998],[-0.5800000000000125,-0.5799999999999983],[0.46999999999999886,1.7000000000000028],[0,0]],"v":[[144.33,37.33],[142,37.66],[142.5,35],[144.33,37.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8745,0.8627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[143.04627277010943,36.44684883599146]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[143.04627277010943,36.44684883599146]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 73","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 72","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4299999999999926,0.3299999999999983],[-0.2600000000000051,1.4899999999999949],[-0.21999999999999886,0.07000000000000028]],"o":[[0.37000000000000455,-0.11999999999999744],[0.5100000000000051,0.5900000000000034],[0.20999999999999375,-0.10999999999999943],[0,0]],"v":[[123.33,39],[124.66,38.67],[122.66,39.34],[123.33,39.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.2431,0.2157]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[123.6828231549797,39.31699018732314]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[123.6828231549797,39.31699018732314]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 74","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 73","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.10999999999999943,0],[-0.04000000000000625,-0.21000000000000085],[0.3199999999999932,0.19000000000000483],[-0.030000000000001137,0.12999999999999545],[-0.3999999999999915,0.00999999999999801]],"o":[[0.10999999999999943,0],[0.030000000000001137,0.21000000000000085],[0,0.7899999999999991],[-0.10999999999999943,-0.07000000000000028],[0.4300000000000068,-0.04999999999999716],[0,0]],"v":[[87.33,43],[87.66,43],[87.66,43.67],[85.66,44],[86,43.34],[87.33,43.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.2353,0.2078]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[86.65471448276205,43.601406973298566]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[86.65471448276205,43.601406973298566]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 75","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 74","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.6800000000000068,-0.09000000000000341],[-1,0.6899999999999977]],"o":[[0,0],[-0.29000000000000625,0.6700000000000017],[0.7900000000000063,-1.1599999999999966],[0,0]],"v":[[86.67,45.33],[86.67,45.66],[85,46.66],[86.67,45.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.2353,0.2078]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.83502669091564,45.99499444996994]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.83502669091564,45.99499444996994]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 76","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 75","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.4099999999999966,-0.36000000000000654],[-0.3400000000000034,1.3400000000000034],[-0.3400000000000034,0.5100000000000051],[0,0]],"o":[[0,0],[-0.8299999999999983,0.3500000000000014],[-0.10999999999999943,0.09000000000000341],[0.4099999999999966,-0.5200000000000031],[0,0],[0,0]],"v":[[86.67,45.67],[87.33,46.17],[86.2,48.010000000000005],[84,48.34],[85,46.67],[86.67,45.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.8784,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.64876024871899,47.273371815143975]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.64876024871899,47.273371815143975]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 77","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 76","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-2.469999999999999,-0.3599999999999959],[0.05000000000001137,-0.18999999999999773],[-1.3499999999999943,-1.2800000000000011],[0.07999999999998408,-0.04999999999999716]],"o":[[0,0],[0.13999999999998636,-1.1599999999999966],[0.11000000000001364,0.020000000000003126],[-0.05000000000001137,0.18999999999999773],[-0.710000000000008,0.10000000000000142],[0,0]],"v":[[146.33,37.33],[147.23000000000002,35.46],[148.11,32.3],[149.33,34.16],[147.99,37.33],[146.32000000000002,37.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.9059,0.8941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[147.82580439006855,34.81409150321019]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[147.82580439006855,34.81409150321019]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 78","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 77","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6300000000000239,-0.10999999999999943],[-0.4200000000000159,-0.5499999999999972]],"o":[[-0.710000000000008,0],[0.4300000000000068,-0.5499999999999972],[0,0]],"v":[[195,69],[192.67,69],[195,69]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3529,0.3765,0.4]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[193.83502883312772,68.97554211404963]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[193.83502883312772,68.97554211404963]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 79","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 78","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4300000000000068,-0.01999999999999602],[-1.8400000000000034,-0.0799999999999983],[1.0999999999999943,0.01999999999999602],[3,0.06999999999999318],[1.0700000000000216,0.269999999999996],[-0.5200000000000102,0.01999999999999602],[-1.7800000000000011,-0.09999999999999432]],"o":[[0.060000000000002274,0],[1.8300000000000125,0.09000000000000341],[-0.5900000000000034,0],[-3.0200000000000102,-0.04000000000000625],[-1.0900000000000034,0.28000000000000114],[0.6299999999999955,-0.20999999999999375],[1.6599999999999966,-0.04000000000000625],[0,0]],"v":[[202,69.33],[202.81,69.67999999999999],[208.34,69.66999999999999],[205.34,69.99999999999999],[196.34,69.66999999999999],[193.01,69.66999999999999],[196.01,68.99999999999999],[202.01,69.32999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0745,0.0824,0.0863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[200.6750359353811,69.49838393606285]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[200.6750359353811,69.49838393606285]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 80","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 79","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4200000000000017,1.25],[-0.8100000000000023,-0.20000000000000284]],"o":[[-0.4000000000000057,0.7999999999999972],[0.8299999999999983,-0.5],[0,0]],"v":[[94,39.67],[91.33,40],[94,39.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.6549,0.6392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[92.64284819399907,40.10521889476138]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[92.64284819399907,40.10521889476138]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 81","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 80","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3200000000000074,-0.5100000000000051],[-0.12999999999999545,-0.6400000000000006],[0.3999999999999915,0.6700000000000017],[0.01999999999999602,0.10999999999999943],[-0.6400000000000006,0.2600000000000051]],"o":[[-0.09999999999999432,0.6000000000000014],[-0.12000000000000455,0.18999999999999773],[-0.04999999999999716,0.7899999999999991],[0,-0.020000000000003126],[0.6800000000000068,-0.7199999999999989],[0,0]],"v":[[88.67,40.33],[88,42],[87.33,43],[86,43.33],[85.67,43],[88.67,40.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.7804,0.7725]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.17002244621881,42.03050291783359]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.17002244621881,42.03050291783359]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 82","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 81","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.480000000000004,-1.240000000000002],[0.6500000000000057,0.8500000000000014],[0.3299999999999983,-0.03999999999999915],[0.539999999999992,-0.28999999999999915],[0.20999999999999375,0.00999999999999801],[0.1599999999999966,0.28000000000000114],[-0.75,-0.5200000000000031],[-0.28000000000000114,0]],"o":[[2.1700000000000017,0.030000000000001137],[0.5600000000000023,0.8100000000000023],[-0.060000000000002274,-0.17999999999999972],[-0.3400000000000034,-0.740000000000002],[-0.3299999999999983,0.030000000000001137],[-0.060000000000002274,0.28999999999999915],[-1.0900000000000034,-0.17999999999999972],[0.3400000000000034,0.8200000000000003],[0,0]],"v":[[89.67,42],[91.34,43.67],[90.34,44.34],[90.01,44.010000000000005],[88.68,43.34],[87.68,43.010000000000005],[87.35000000000001,43.010000000000005],[88.02000000000001,42.010000000000005],[89.69000000000001,42.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9647,0.5255,0.5059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[89.19297791958581,43.307735773451526]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[89.19297791958581,43.307735773451526]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 83","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 82","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.23000000000000398,1.3500000000000085],[0.3500000000000014,-0.37000000000000455]],"o":[[-1.4500000000000028,-0.06999999999999318],[0.9200000000000017,-0.28000000000000114],[0,0]],"v":[[46.66,129.33],[45,127.00000000000001],[46.66,129.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.949,0.7647,0.7333]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[45.834756080758126,128.15289637457016]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[45.834756080758126,128.15289637457016]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 84","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 83","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.07000000000000028,-0.10999999999999943],[-0.14999999999999858,-0.23999999999999488],[1.7100000000000009,-0.9799999999999898],[0.240000000000002,-0.09000000000000341],[0,0],[-1.6099999999999994,-0.1700000000000017]],"o":[[0.09000000000000341,0.12000000000000455],[0.03999999999999915,0.060000000000002274],[0.259999999999998,0.4099999999999966],[-0.14000000000000057,0.04000000000000625],[0,0],[0.20000000000000284,-0.9300000000000068],[0,0]],"v":[[48.33,125.33],[48.66,125.66],[48.76,126.22999999999999],[49,127.99999999999999],[48.33,128.32999999999998],[48.33,127.99999999999999],[48.33,125.32999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.7725,0.7373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[48.706320604842205,126.8246681540337]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[48.706320604842205,126.8246681540337]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 85","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 84","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.5600000000000023,0.3200000000000003],[0.08999999999997499,0.03999999999999915]],"o":[[-0.05000000000001137,-1.9499999999999993],[-0.05000000000001137,-0.10999999999999943],[0,0]],"v":[[161,33],[161.67,33.67],[161,33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9647,0.902,0.8863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[161.82381311055448,33.01079229430789]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[161.82381311055448,33.01079229430789]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 86","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 85","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.44999999999998863,-1.1900000000000013],[0.9000000000000057,-0.8900000000000006],[0.5,0.7099999999999937],[0.22999999999998977,1.009999999999998]],"o":[[1.3300000000000125,0.0799999999999983],[0.44999999999998863,1.1900000000000013],[-0.30000000000001137,-0.6199999999999974],[-0.3400000000000034,-0.48999999999999844],[0,0]],"v":[[156,31.33],[158,32],[157.16,34],[156.66,32.34],[155.99,31.340000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.8039,0.7843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[157.08886760199945,32.62413715721766]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[157.08886760199945,32.62413715721766]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 87","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 86","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6700000000000017,-0.8700000000000045],[1.1200000000000045,-0.6099999999999994],[-0.3299999999999983,0.1599999999999966],[0.8900000000000006,-1.6400000000000006]],"o":[[-0.5600000000000023,0.9099999999999966],[-0.39000000000000057,1],[-1.1599999999999966,0.5699999999999932],[-0.09000000000000341,-1],[0,0]],"v":[[80.33,69.33],[80.33,71.66],[78,72.33],[77.67,69.66],[80.34,69.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.898,0.8824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[78.87720477017947,70.42468030499896]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[78.87720477017947,70.42468030499896]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 88","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 87","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12000000000000455,-0.960000000000008],[-0.030000000000001137,-0.29000000000000625],[-0.010000000000005116,-0.09999999999999432],[0.2599999999999909,-0.4099999999999966],[0,0],[0.010000000000005116,0.09000000000000341],[0.06999999999999318,0.14999999999999147],[-0.18999999999999773,0.04999999999999716],[-0.28000000000000114,-0.010000000000005116]],"o":[[0.8299999999999983,0.04000000000000625],[0,0.04999999999999716],[0.030000000000001137,0.29000000000000625],[0.030000000000001137,0.4200000000000017],[0,0],[0.01999999999999602,-0.09000000000000341],[-0.04000000000000625,-0.3100000000000023],[0.18999999999999773,-0.1599999999999966],[0.21999999999999886,-0.060000000000002274],[0,0]],"v":[[75,87.33],[76,88],[75.74,88.43],[76.33,89.17],[74.34,90.34],[74.01,90.34],[74.01,88.58],[73.35000000000001,88.01],[74.02000000000001,87.34],[75.02000000000001,87.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.8667,0.8353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[74.84025085475434,88.82317898496626]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[74.84025085475434,88.82317898496626]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 89","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 88","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.9300000000000068,0.06999999999999318],[0,0],[-0.3299999999999841,0]],"o":[[-0.17000000000001592,1.009999999999991],[0,0],[0.3299999999999841,0.009999999999990905],[0,0]],"v":[[276.67,292],[274.51,293.67],[275.67,292],[276.67,292]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5961,0.6,0.6078]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[275.5900534417117,292.83731191890195]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[275.5900534417117,292.83731191890195]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 90","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 89","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3200000000000003,-0.7400000000000091],[0.12000000000000455,-0.10999999999998522],[0.6999999999999957,1.1200000000000045],[0.6199999999999974,0.8600000000000136],[0,0],[-0.3299999999999983,-0.5600000000000023]],"o":[[0.5200000000000031,0.8700000000000045],[0.13000000000000256,0.30000000000001137],[-2.1300000000000026,0.18999999999999773],[-0.5300000000000011,-0.8400000000000034],[0,0],[0.4099999999999966,0.6699999999999875],[0,0]],"v":[[46.33,138],[48.33,141],[48.66,142.66],[46.47,140.35],[44.33,137.32999999999998],[45,135.99999999999997],[46.33,137.99999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8706,0.5804,0.5412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[46.5082452171296,139.33883516337687]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[46.5082452171296,139.33883516337687]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 91","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 90","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.8100000000000023,-1.6400000000000006],[0.3400000000000034,0.8800000000000026],[0.6400000000000148,-0.12999999999999545],[0.020000000000010232,0.10000000000000142]],"o":[[0,0],[-0.30000000000001137,-1.7899999999999991],[-0.21000000000000796,0.9200000000000017],[-0.2599999999999909,-0.10999999999999943],[-0.020000000000010232,-0.10999999999999943],[0,0]],"v":[[137,33],[138.66,33.67],[139.32999999999998,34],[138.32999999999998,34],[136.99999999999997,33.33],[136.99999999999997,33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.4549,0.4275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[138.47046385114223,33.60307101347891]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[138.47046385114223,33.60307101347891]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 92","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 91","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12000000000000455,-0.10999999999999943],[0.1799999999999784,-0.14000000000000057],[0,0],[-0.19999999999998863,0]],"o":[[-0.12999999999999545,0.1700000000000017],[-0.1599999999999966,0.14000000000000057],[0,0],[0.12000000000000455,0.04999999999999716],[0,0]],"v":[[129.33,36.67],[129,37.34],[128.33,37.67],[128.66000000000003,36.67],[129.33,36.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.8039,0.7882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[128.83001105339724,37.16998978258519]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[128.83001105339724,37.16998978258519]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 93","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 92","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3499999999999943,-0.36999999999999744],[0,0],[-0.4200000000000159,0.10999999999999943],[0,0]],"o":[[-0.18999999999999773,0.21999999999999886],[0,0],[-0.3400000000000034,-0.3200000000000003],[0,0],[0,0]],"v":[[130,36.67],[129.33,37.67],[129,37.34],[129.33,36.67],[130,36.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.3882,0.3647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[129.42057798436264,37.16998978258519]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[129.42057798436264,37.16998978258519]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 94","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 93","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8299999999999841,0.259999999999998],[0.06999999999999318,0.030000000000001137],[0.060000000000002274,0.4200000000000017],[-0.0800000000000125,-0.480000000000004]],"o":[[0.28999999999999204,0.7999999999999972],[-0.06999999999999318,0.030000000000001137],[-0.03999999999999204,-0.4299999999999997],[0.4099999999999966,-0.25],[0,0]],"v":[[138.33,34],[137.66000000000003,34.67],[136.99000000000004,34.67],[136.99000000000004,33.34],[138.32000000000005,34.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9843,0.7686,0.7451]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[137.7253582733277,34.02936599023943]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[137.7253582733277,34.02936599023943]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 95","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 94","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12999999999999545,-0.45000000000000284],[0.46000000000000796,-0.12000000000000455],[0.21000000000000796,-0.03999999999999915],[0,0],[0,0]],"o":[[0.0799999999999983,0.28999999999999915],[-0.7099999999999937,-0.25],[-0.18999999999999773,0.04999999999999716],[0,0],[0,0],[0,0]],"v":[[126,34.67],[126.33,35.67],[124.66,36.010000000000005],[123.99,36.010000000000005],[123.66,34.68000000000001],[125.99,34.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.9216,0.9176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[125.00846378869355,35.34776138085013]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[125.00846378869355,35.34776138085013]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 96","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 95","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.21999999999999886,0.5],[-0.4000000000000057,-1.0400000000000063],[0.04999999999998295,-0.060000000000002274],[-0.020000000000010232,0.5],[0.14999999999997726,0.5499999999999972]],"o":[[-0.5500000000000114,-0.21000000000000085],[0.9199999999999875,-0.04999999999999716],[0.28000000000000114,0.740000000000002],[-0.46000000000000796,0.5],[-0.3199999999999932,0.4200000000000017],[0,0]],"v":[[128.67,36.67],[127.66999999999999,35.34],[130.67,36.18000000000001],[130.01,36.67000000000001],[129.34,36.67000000000001],[128.67000000000002,36.67000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8118,0.8]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[129.19722943254726,36.16905148607515]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[129.19722943254726,36.16905148607515]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 97","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 96","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7199999999999989,-1.2399999999999949],[-0.29999999999998295,-0.13000000000000256],[0,0],[0.7099999999999795,0.1599999999999966],[0.009999999999990905,0.1700000000000017],[0.8400000000000034,1.740000000000002],[-0.9099999999999966,-0.25]],"o":[[-1.7800000000000011,0.07000000000000028],[0,0.11999999999999744],[0,0],[-0.8300000000000125,-0.38000000000000256],[-0.18999999999999773,-0.03999999999999915],[0.37000000000000455,-1.5300000000000011],[1.0800000000000125,-0.21000000000000085],[0,0]],"v":[[135.67,33.67],[133.32999999999998,36.5],[134.99999999999997,37.34],[135.32999999999998,38],[132.66,37.67],[131.65,37.15],[133,33.33],[135.67,33.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8824,0.8667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[133.66002052091048,35.628882784607754]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[133.66002052091048,35.628882784607754]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 98","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 97","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.2599999999999909,-0.25],[-0.38999999999998636,-0.17999999999999972],[-0.3199999999999932,-0.8100000000000023],[-0.0700000000000216,-1.7899999999999991],[0.020000000000010232,-0.5500000000000043],[0.20000000000001705,0.060000000000002274],[0.3199999999999932,-0.0799999999999983],[0.75,0.3299999999999983],[-1.509999999999991,2.8299999999999983],[-0.5900000000000034,-0.07000000000000028]],"o":[[0.21999999999999886,0.060000000000002274],[0.19999999999998863,0.18999999999999773],[0.2400000000000091,-0.8400000000000034],[0.8100000000000023,-0.46000000000000085],[0.4099999999999966,0.5],[-0.22999999999998977,-0.21999999999999886],[-0.539999999999992,-0.14999999999999858],[-0.5500000000000114,0.14000000000000057],[-2.25,0.45000000000000284],[0.5699999999999932,-0.21999999999999886],[0,0]],"v":[[135.67,33.67],[136.58999999999997,33.75],[136.99999999999997,34.67],[137.66999999999996,34.67],[138.99999999999997,36.67],[138.99999999999997,38.34],[137.75999999999996,37.39],[136.66999999999996,37.67],[134.99999999999997,37.34],[133.88999999999996,33.77],[135.66999999999996,33.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2824,0.2627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[136.08361405246652,35.97521137629403]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[136.08361405246652,35.97521137629403]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 99","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 98","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.21000000000000796,-0.17000000000001592],[-0.040000000000020464,-0.10000000000002274],[0.13999999999998636,-0.19999999999998863]],"o":[[0,0],[-0.3199999999999932,-0.37000000000000455],[-0.030000000000001137,0.30000000000001137],[0,0]],"v":[[200.96,299.63],[200,300],[200.99,298.67],[200.95000000000002,299.63]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4471,0.4588,0.4745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[200.48241995321214,299.33169703971674]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[200.48241995321214,299.33169703971674]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 100","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 99","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3500000000000014,-0.09000000000000341],[-0.04999999999999716,0.18999999999999773],[-0.38000000000000256,0.060000000000002274],[0,0]],"o":[[-0.36999999999999744,0.04000000000000625],[0.00999999999999801,-0.20999999999999375],[0.060000000000002274,-0.2600000000000051],[0,0],[0,0]],"v":[[51.67,110],[50.67,110.33],[50.67,109.66],[51.67,108.33],[51.67,110]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.9176,0.9059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[51.15995004805407,109.32999364667418]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[51.15995004805407,109.32999364667418]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 101","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 100","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.769999999999996,-1.0600000000000023],[0.25,-0.04999999999999716],[0.03999999999999915,0.21999999999999886],[0.21999999999999886,-0.01999999999999602],[0.3400000000000034,0.01999999999999602],[-0.5499999999999972,0.769999999999996]],"o":[[1.4099999999999966,-0.12999999999999545],[-0.21000000000000085,0.06999999999999318],[-0.03999999999999915,-0.18999999999999773],[-0.21999999999999886,0],[-0.3200000000000003,-0.20000000000000284],[-0.22999999999999687,-1.0900000000000034],[0,0]],"v":[[51.67,107.33],[53,110.33],[52.33,110.66],[52.33,109.99],[51.66,109.99],[50.66,109.66],[51.66,107.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9451,0.4706,0.4353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[51.807085607863456,108.99207471216124]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[51.807085607863456,108.99207471216124]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 102","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 101","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.1300000000000026,-0.4300000000000068],[0,0],[-0.4200000000000017,0.7099999999999937]],"o":[[2.1000000000000014,0.29999999999999716],[0,0],[0.6099999999999994,-0.9000000000000057],[0,0]],"v":[[54.33,103.33],[53.66,106.5],[53.33,105.33],[54.33,103.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.8784,0.8549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[54.33645172692039,104.91499329647235]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[54.33645172692039,104.91499329647235]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 103","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 102","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.47999999999998977,-0.11000000000001364],[-0.8700000000000045,-0.160000000000025]],"o":[[0.09999999999999432,0.45999999999997954],[-0.030000000000001137,-0.8000000000000114],[0,0]],"v":[[246.66,306.67],[246,307.67],[246.66,306.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4863,0.498,0.5098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[246.3223366000195,307.1513844175071]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[246.3223366000195,307.1513844175071]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 104","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 103","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6899999999999977,-0.25],[0.30000000000001137,0.36000000000001364]],"o":[[-0.12999999999999545,-0.14999999999997726],[1.039999999999992,0.37000000000000455],[0,0]],"v":[[247,307.66],[247.49,306.67],[247,307.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4863,0.498,0.5098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[247.4078889856274,307.1854808500228]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[247.4078889856274,307.1854808500228]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 105","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 104","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.21999999999999886,-0.5100000000000477],[0,0],[0,0],[-0.75,-0.8000000000000114]],"o":[[0.12000000000000455,0.12999999999999545],[0,0],[0,0],[-0.21000000000000796,-0.339999999999975],[0,0]],"v":[[253.33,306.67],[252.66000000000003,308.33000000000004],[253.66000000000003,308.66],[252.33,309],[253.33,306.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4,0.4157,0.4314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[252.96964810204796,307.76320936944546]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[252.96964810204796,307.76320936944546]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 106","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 105","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.28000000000000114,0.03999999999996362],[-0.6999999999999886,-0.7199999999999704]],"o":[[0,0],[-1.7299999999999898,-0.6399999999999864],[0,0]],"v":[[192.33,299.67],[192.17000000000002,300.33000000000004],[192.33,299.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4471,0.4588,0.4745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[191.81557655422816,299.8527773122392]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[191.81557655422816,299.8527773122392]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 107","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 106","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.01999999999998181,0.1400000000000432],[-0.6399999999999864,-0.13999999999998636],[1.1100000000000136,-0.75],[0.660000000000025,-0.029999999999972715]],"o":[[1.6399999999999864,-0.8799999999999955],[0.05000000000001137,-0.4200000000000159],[0.7799999999999727,0.160000000000025],[-0.6700000000000159,0.01999999999998181],[0,0]],"v":[[285.67,295.67],[285.67,294.5],[286.17,294],[287.67,295.67],[285.67,295.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5294,0.5373,0.549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[286.84406566846576,294.81637793885545]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[286.84406566846576,294.81637793885545]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 108","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 107","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.09000000000000341,0],[0,0],[-0.12000000000000455,0.2600000000000051],[0.060000000000002274,-0.29000000000000625]],"o":[[-0.030000000000001137,0.14000000000000057],[0,0],[0.18000000000000682,-0.46999999999999886],[-0.04000000000000625,0.3199999999999932],[0,0]],"v":[[74.67,65.67],[74.17,66.67],[74,65.67],[74.67,64.67],[74.67,65.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.6667,0.6471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[74.34486730983136,65.66998951853645]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[74.34486730983136,65.66998951853645]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 109","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 108","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8900000000000006,-0.8200000000000003],[0.010000000000005116,0.17999999999999972],[-0.01999999999999602,0.05999999999999517]],"o":[[1.5,-0.3200000000000003],[0,-0.7700000000000031],[0,-0.10000000000000142],[0,0]],"v":[[79,54],[79.33,55.67],[79,54.34],[79,54.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2941,0.2784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[79.52625116333479,54.80796683862974]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[79.52625116333479,54.80796683862974]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 110","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 109","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.10999999999999943,-0.09000000000000341],[0.0799999999999983,-0.4799999999999969],[1.2999999999999972,-0.15000000000000568],[-0.030000000000001137,1.009999999999998],[-0.4399999999999977,0.3299999999999983]],"o":[[0.14000000000000057,-0.10999999999999943],[-0.28000000000000114,0.46000000000000085],[-0.18000000000000682,1.0200000000000031],[-1.019999999999996,0.11999999999999744],[0.23000000000000398,-0.3500000000000014],[0,0]],"v":[[81.33,51],[83,50.34],[82.67,51.67],[81.47,52.980000000000004],[80.67,52.010000000000005],[81.34,51.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8784,0.8667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[81.81841518881862,51.67684745172838]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[81.81841518881862,51.67684745172838]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 111","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 110","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.5400000000000063,-0.5],[-0.22999999999998977,0.980000000000004],[-0.6899999999999977,1.1299999999999955]],"o":[[0,0],[-1.269999999999996,0.7399999999999949],[-0.15000000000000568,0.14000000000000057],[0.3299999999999983,-1.4300000000000068],[0,0]],"v":[[73.33,70.33],[73.99,70.49],[72.99,73.66],[71.33999999999999,73.85],[73.32,70.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8745,0.8667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[72.65453617024804,72.29921776957784]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[72.65453617024804,72.29921776957784]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 112","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 111","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5400000000000063,-0.46000000000000085],[0,-0.09000000000000341],[0,0],[0,0],[0.3299999999999983,-0.5700000000000003]],"o":[[0,0.09000000000000341],[-0.04000000000000625,0.00999999999999801],[0,0],[0,0],[0.8900000000000006,-0.10000000000000142],[0,0]],"v":[[79.33,55.67],[79.33,56.67],[79,57.34],[77,57.84],[79,54.34],[79.33,55.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8706,0.8588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[78.31167771785101,56.086005827065435]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[78.31167771785101,56.086005827065435]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 113","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 112","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.769999999999996,0.23000000000000398],[0,0],[0,0],[0,0],[0.0799999999999983,-0.020000000000003126],[-0.28000000000000114,0.4099999999999966],[-0.7199999999999989,0.6400000000000006],[-0.23000000000000398,-0.0799999999999983]],"o":[[1.0499999999999972,1.1400000000000006],[0,0],[0,0],[0,0],[-0.46999999999999886,0.35999999999999943],[-0.04999999999999716,-0.6599999999999966],[0.6200000000000045,0.4200000000000017],[0.15000000000000568,0.28999999999999915],[0,0]],"v":[[83.33,52],[82.33,54.33],[82,53.66],[80.66,54.66],[81.66,53.33],[80,53.33],[80.67,52],[82.67,51.67],[83.34,52]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2941,0.2784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[81.9692117870321,53.164998490156336]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[81.9692117870321,53.164998490156336]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 114","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 113","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.04999999999999716,-0.6899999999999977],[0.09000000000000341,-0.0799999999999983],[0.5200000000000102,-0.21000000000000085],[0.37000000000000455,0],[-0.010000000000005116,0.05000000000000426],[-1.6599999999999966,1.240000000000002]],"o":[[1.9699999999999989,-0.21999999999999886],[-0.030000000000001137,0.3400000000000034],[-0.04999999999999716,0.04999999999999716],[-0.3299999999999983,0.13000000000000256],[0.10999999999999943,-0.25],[0.37000000000000455,-1.4500000000000028],[0,0]],"v":[[76.67,60.67],[77.09,62.21],[77.34,63.33],[76,63.67],[75,64],[75.33,63.44],[76.67,60.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.9333,0.9216]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[76.34172796531854,62.3203484244695]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[76.34172796531854,62.3203484244695]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 115","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 114","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.04999999999999716,-0.8299999999999983],[-0.06999999999999318,1.5300000000000011],[-0.01999999999999602,0.4299999999999997],[-0.9399999999999977,-0.17999999999999972],[-1.0600000000000023,0.9499999999999957]],"o":[[1.0100000000000051,-0.21000000000000085],[-0.45000000000000284,1.009999999999998],[0.5699999999999932,-1.1000000000000014],[-0.9000000000000057,-0.35999999999999943],[0.18999999999999773,-0.04999999999999716],[0,0]],"v":[[81,56.33],[81.67,57.66],[79,58.989999999999995],[79,57.31999999999999],[79.33,56.64999999999999],[81,56.31999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9098,0.9059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[80.07969617565331,57.93297553972701]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[80.07969617565331,57.93297553972701]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 116","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 115","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.35999999999999943,-0.5900000000000034],[1.0499999999999972,-1.1400000000000006],[0.29000000000000625,-0.11999999999999744],[0.39000000000000057,-0.35999999999999943],[-0.060000000000002274,1.3999999999999986],[-1.0799999999999983,-0.0799999999999983],[0.6200000000000045,0.5200000000000031],[-0.3199999999999932,0.07000000000000028]],"o":[[0.29999999999999716,-0.6899999999999977],[1.0400000000000063,-0.07000000000000028],[0.29000000000000625,0.09000000000000341],[-0.4200000000000017,0.14999999999999858],[0.3400000000000034,1.3400000000000034],[-1.2099999999999937,0.3500000000000014],[0.21999999999999886,-0.740000000000002],[0.12000000000000455,-0.3299999999999983],[0,0]],"v":[[80,53.33],[80.72,53.22],[82.33,54.33],[82.33,54.66],[81,56.33],[79.33,56.66],[79.33,55.66],[79,53.989999999999995],[80,53.31999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9176,0.2353,0.2157]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[80.57048177783776,55.16696465348954]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[80.57048177783776,55.16696465348954]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 117","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 116","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.1700000000000017,-0.8999999999999915],[0.18999999999999773,0.14999999999999147],[0.5300000000000011,-0.4399999999999977],[-0.1599999999999966,0.8900000000000006],[-0.12999999999999545,0.20999999999999375],[-0.5400000000000063,0.6400000000000006],[-0.5999999999999943,0.18000000000000682],[-0.030000000000001137,0]],"o":[[-1.1599999999999966,1.0999999999999943],[-0.21999999999999886,1.1500000000000057],[-0.9000000000000057,-0.7099999999999937],[-0.7900000000000063,0.010000000000005116],[0.0799999999999983,-0.12000000000000455],[0.23999999999999488,-0.4200000000000017],[0.4000000000000057,-0.480000000000004],[0.7199999999999989,-0.21999999999999886],[0,0]],"v":[[76.67,73.33],[76.67,76.49],[75.34,76],[74.01,76.67],[73.01,76],[73.59,75.59],[74.01,74],[76.01,73.13],[76.68,73.33999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8824,0.8667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[74.82936308558558,74.99494581681165]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[74.82936308558558,74.99494581681165]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 118","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 117","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.25,0.23999999999999488],[0.8299999999999983,0.18999999999999773],[0.5,0.6000000000000085],[-0.12999999999999545,1],[-0.3199999999999932,0.5499999999999972],[-0.09999999999999432,0.23000000000000398],[-0.1700000000000017,-0.4100000000000037],[0,0]],"o":[[1.1899999999999977,-0.45000000000000284],[0,0.6299999999999955],[0.3100000000000023,0.7099999999999937],[-1.019999999999996,0.12999999999999545],[-0.3199999999999932,-0.10999999999999943],[0.09999999999999432,-0.21999999999999886],[0.5,-0.6300000000000026],[0,0],[0,0]],"v":[[77.67,64],[77.67,65.33],[76.67,66.66],[76,66.99],[74.67,65.66],[74.67,64.66],[75,63.989999999999995],[76,63.66],[77.67,63.989999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.2588,0.2392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[76.50759228064487,65.37754244630159]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[76.50759228064487,65.37754244630159]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 119","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 118","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.3499999999999943,-0.5300000000000011],[0.6899999999999977,-0.010000000000005116],[-0.29000000000000625,0.39000000000000057],[0.6599999999999966,-0.6899999999999977],[0,0],[-0.1599999999999966,-0.5600000000000023],[0.7999999999999972,-0.20999999999999375],[0.8400000000000034,0.3100000000000023],[0,0],[-0.730000000000004,0.8100000000000023],[-0.12999999999999545,0.8799999999999955],[-0.3199999999999932,0.6400000000000006],[-0.46000000000000796,1.1899999999999977]],"o":[[0,0],[0.519999999999996,0.3299999999999983],[0.20000000000000284,0.730000000000004],[-0.3199999999999932,0.3100000000000023],[0.7600000000000051,-0.6200000000000045],[0,0],[-0.18000000000000682,0.769999999999996],[-0.29000000000000625,0.15000000000000568],[-0.9399999999999977,0.7600000000000051],[0,0],[-1.0400000000000063,-0.8599999999999994],[0.030000000000001137,-0.030000000000001137],[0.37000000000000455,-0.5999999999999943],[-1.5799999999999983,0.09999999999999432],[0,0]],"v":[[74,65.67],[74.67,65.67],[76,67],[75.11,67.92],[77,68.67],[77.67,69.67],[78.12,70.2],[78,72.34],[76.67,73.34],[74,74.01],[73,73.68],[73.65,70.52000000000001],[73.34,70.35000000000001],[74.34,68.51],[74.01,65.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.3255,0.3059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[75.3314345472192,69.9078595984767]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[75.3314345472192,69.9078595984767]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 120","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 119","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.01999999999999602,-0.6099999999999994],[0.769999999999996,-0.75],[0.7800000000000011,-0.79999999999999],[0,0],[-0.01999999999999602,0.9500000000000028],[-0.12999999999999545,0.23999999999999488],[0.35999999999999943,0.480000000000004],[-0.5100000000000051,0.990000000000002],[-0.710000000000008,0.9400000000000048],[0,0],[0.010000000000005116,-0.3299999999999983]],"o":[[0,0],[-0.20999999999999375,0.8599999999999994],[-0.5,0.6000000000000014],[-0.75,-0.14000000000000057],[0,0],[-0.09000000000000341,1],[-0.04000000000000625,-0.28000000000000114],[0.23000000000000398,-0.3999999999999986],[0.769999999999996,-0.5700000000000003],[0.5600000000000023,0.04999999999999716],[0,0],[0.01999999999999602,0.3400000000000034],[0,0]],"v":[[81.67,58.67],[82.3,59.13],[82.00999999999999,61.330000000000005],[80.67999999999999,63.00000000000001],[78.38999999999999,64],[77.67999999999999,64],[76.00999999999999,63.67],[76.17999999999999,62.910000000000004],[76.66999999999999,60.67],[78.99999999999999,59],[80.89999999999999,57.66],[81.66999999999999,57.66],[81.66999999999999,58.669999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.3059,0.2863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[79.14985680322172,61.1249529782437]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[79.14985680322172,61.1249529782437]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 121","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 120","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.39000000000000057,-0.3200000000000003],[0.39000000000000057,-1.3999999999999986],[0.8199999999999932,-0.7600000000000051],[-0.1799999999999926,-0.46999999999999886],[0.25,-0.5400000000000063],[0.28000000000000114,-0.259999999999998],[0.35999999999999943,-0.3200000000000003],[0.21999999999999886,-0.14999999999999858],[-0.8100000000000023,0.4799999999999969],[0.3199999999999932,-0.10000000000000142],[-0.10999999999999943,1.2299999999999969],[-0.10999999999999943,1.0399999999999991],[0.3999999999999915,0.28999999999999915],[0,0],[-0.6800000000000068,0.730000000000004],[-0.030000000000001137,0.03999999999999915],[-0.3500000000000085,1.230000000000004],[-0.18999999999999773,0.11999999999999744],[0.20999999999999375,1.0900000000000034],[-0.6200000000000045,0.21000000000000085],[0.01999999999999602,-0.6199999999999974]],"o":[[0.5,0.11999999999999744],[-0.23999999999999488,2.0700000000000003],[-0.4000000000000057,0.7999999999999972],[0.5900000000000034,-0.030000000000001137],[1.019999999999996,-0.36999999999999744],[-0.1700000000000017,0.3500000000000014],[-0.3400000000000034,0.3200000000000003],[-0.28000000000000114,-0.20000000000000284],[-1.0600000000000023,0.14000000000000057],[0.09999999999999432,-0.3200000000000003],[0.09999999999999432,1.25],[-0.480000000000004,0.8800000000000026],[-0.4899999999999949,-0.1599999999999966],[0,0],[1.9099999999999966,-0.4799999999999969],[0.14000000000000057,-0.14999999999999858],[1.25,-0.00999999999999801],[-0.18999999999999773,-0.10000000000000142],[0.9599999999999937,-0.6700000000000017],[-0.6299999999999955,-0.20000000000000284],[0.29999999999999716,-0.5799999999999983],[0,0]],"v":[[88.67,43.33],[90,44],[89,47.33],[87.17,49.67],[88.33,50.33],[88.66,52.42],[87.67,53],[86.67,54],[85.34,53.67],[85.01,52.34],[84.68,52.010000000000005],[83.35000000000001,52.010000000000005],[82.68,51.68000000000001],[81.35000000000001,51.010000000000005],[81.35000000000001,50.34],[83.44000000000001,48.42],[84.02000000000001,48.34],[86.69000000000001,45.67],[86.69000000000001,45.34],[87.69000000000001,43.67],[87.69000000000001,43],[88.69000000000001,43.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2863,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.67503420722502,48.3430005895361]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.67503420722502,48.3430005895361]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 122","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 121","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.4000000000000057,-0.28000000000000114],[0.29999999999999716,0.30000000000001137]],"o":[[0,0],[-0.09999999999999432,0.29000000000000625],[-0.6099999999999994,0.4000000000000057],[0,0]],"v":[[83.67,77.67],[85,76.67],[84.69,77.85000000000001],[83.67,77.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.749,0.3333,0.2863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[84.3350225143889,77.359213944332]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.3350225143889,77.359213944332]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 123","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 122","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.060000000000002274,0.8800000000000026]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0.03999999999999204,-0.8800000000000026],[0,0]],"v":[[163,40.67],[163.5,42.010000000000005],[164,41.34],[164,42.84],[163.67,42.34],[163.01,43.34],[163.01,40.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.6431,0.549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[163.49515534376295,42.004995283117324]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[163.49515534376295,42.004995283117324]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 124","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 123","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.19999999999998863,-0.17999999999999972],[-0.19999999999998863,1.2899999999999991],[-0.2400000000000091,-0.1699999999999946]],"o":[[0.21000000000000796,0.14999999999999858],[-1.1599999999999966,0.04999999999999716],[0.0800000000000125,-0.09000000000000341],[0,0]],"v":[[166.56,39.11],[167.33,40.66],[165,38.66],[166.56,39.099999999999994]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.698,0.3882,0.3373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[166.17183477107992,39.654043275476226]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[166.17183477107992,39.654043275476226]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 125","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 124","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.509999999999998,-0.010000000000005116],[0.010000000000005116,0.3500000000000085],[0,0]],"o":[[-0.1599999999999966,0.28000000000000114],[-0.3100000000000023,0],[0,0],[0,0]],"v":[[50.33,115.67],[49.17,117.01],[49,115.67],[50.33,115.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.949,0.5961,0.5686]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[49.65122769438676,116.33998529865599]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[49.65122769438676,116.33998529865599]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 126","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 125","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.20000000000000284,-0.9899999999999949],[-0.28000000000000114,0.789999999999992],[0,0]],"o":[[-0.490000000000002,0.519999999999996],[-0.1700000000000017,-0.3299999999999983],[0,0],[0,0]],"v":[[53.33,117],[52.33,118.67],[51.33,117.01],[53.33,117.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.6314,0.5961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[52.30750499483344,117.83499344216375]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[52.30750499483344,117.83499344216375]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 127","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 126","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.240000000000002,0.9399999999999977],[0.5899999999999963,-0.9699999999999989]],"o":[[-1.1899999999999977,-0.5600000000000023],[1.0399999999999991,0.7800000000000011],[0,0]],"v":[[47.66,120.67],[47.339999999999996,117.67],[47.66,120.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.8314,0.8078]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[47.53561670825792,119.16998919746692]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[47.53561670825792,119.16998919746692]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 128","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 127","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.1700000000000017,0.3299999999999983],[-1.490000000000002,0.20000000000000284],[-0.14000000000000057,0.12999999999999545],[0,0],[0.6700000000000017,-0.9699999999999989]],"o":[[-0.1599999999999966,-0.39000000000000057],[-0.8299999999999983,-0.9200000000000017],[0.13000000000000256,-0.14000000000000057],[0,0],[-0.259999999999998,1.3400000000000034],[0,0]],"v":[[52.67,120],[52.34,118.67],[53.34,117],[54.010000000000005,116.67],[54.330000000000005,116.86],[52.68000000000001,120.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.8588,0.8392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[53.113777144230596,118.33999086735832]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[53.113777144230596,118.33999086735832]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 129","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 128","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5,-0.6599999999999966],[-0.14000000000000057,-0.18999999999999773],[0,0],[0.7199999999999989,-0.2599999999999909],[0.19999999999999574,1.0799999999999983],[0.04999999999999716,0.4099999999999966],[-0.30999999999999517,0.04000000000000625]],"o":[[0,0],[0.14000000000000057,0.18000000000000682],[0,0],[0.8100000000000023,1.1599999999999966],[-1.4699999999999989,0.38999999999998636],[-0.04999999999999716,-0.28000000000000114],[-0.030000000000001137,-0.25],[0,0]],"v":[[47,124],[48,124.67],[48.33,125.34],[48.19,125.87],[48.33,128],[47,125.67],[46.67,124.67],[47,124]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.4745,0.4431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[47.74923195271762,126.02938329637544]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[47.74923195271762,126.02938329637544]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 130","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 129","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.17999999999999972,0.9200000000000017],[-0.9299999999999997,0.06999999999999318],[0.5799999999999983,-1.0100000000000051]],"o":[[-0.14999999999999858,0.8700000000000045],[-0.00999999999999801,-0.7600000000000051],[2.520000000000003,-0.20000000000000284],[0,0]],"v":[[50.33,115.67],[49,115.67],[49.83,113.31],[50.33,115.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.8667,0.8471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[50.1303691558696,114.81685207683842]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[50.1303691558696,114.81685207683842]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 131","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 130","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5700000000000003,0.8100000000000023],[-0.44999999999999574,-0.21000000000000796],[0,0],[0.9200000000000017,0.14000000000000057],[1.2299999999999969,-2.029999999999987]],"o":[[-0.00999999999999801,-0.23999999999999488],[0.11999999999999744,-0.1700000000000017],[0,0],[-0.5300000000000011,0.46999999999999886],[-0.10999999999999943,-0.01999999999999602],[0,0]],"v":[[48.33,123],[48.15,121.32],[51.16,120],[51.33,121.67],[49.83,122.68],[48.33,123]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.7765,0.749]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[49.632298501553976,121.48900441236333]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[49.632298501553976,121.48900441236333]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 132","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 131","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.14000000000000057,-0.9399999999999977],[0,-0.10999999999999943],[1.0399999999999991,-0.14999999999999147],[0.0899999999999963,0.480000000000004],[0.04999999999999716,0.20000000000000284],[-0.6499999999999986,-0.6000000000000085],[-0.5300000000000011,0.29999999999999716]],"o":[[0,0],[0.13000000000000256,0.9399999999999977],[0,0.10999999999999943],[-0.46999999999999886,1.2199999999999989],[-0.10000000000000142,-0.35999999999999943],[-0.03999999999999915,-0.20000000000000284],[-0.20000000000000284,-0.8199999999999932],[0.39000000000000057,-0.12999999999999545],[0,0]],"v":[[54,110],[54.99,109.52],[54.99,112.33999999999999],[54.99,112.66999999999999],[52.660000000000004,112.99999999999999],[52.330000000000005,111.32999999999998],[52.330000000000005,110.65999999999998],[53.00000000000001,110.32999999999998],[54.00000000000001,109.99999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.898,0.8784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[53.67504463055883,111.39550497101538]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[53.67504463055883,111.39550497101538]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 133","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 132","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.289999999999992,-0.010000000000005116],[0.45000000000001705,-1.1299999999999955],[2.1699999999999875,-6.890000000000001],[0,0],[-2,2.089999999999989],[-0.21999999999999886,0.06999999999999318],[-0.11000000000001364,0.01999999999999602],[-0.7400000000000091,-0.29000000000000625]],"o":[[0,0],[-0.710000000000008,0.4300000000000068],[-1.1100000000000136,0.35999999999999943],[-2.280000000000001,6.849999999999994],[0,0],[1.1899999999999977,-3.8799999999999955],[0.28000000000000114,-0.29000000000000625],[0.09999999999999432,-0.030000000000001137],[0.7400000000000091,-0.3299999999999983],[0,0]],"v":[[195,69],[196,69],[193,69.67],[190.16,72],[183.66,92.67],[183.32999999999998,91.67],[190.32,70.49000000000001],[192.32999999999998,69.00000000000001],[192.66,69.00000000000001],[194.99,69.00000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0235,0.0275,0.0275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[189.66503314599478,80.71862815478255]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[189.66503314599478,80.71862815478255]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 134","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 133","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.19000000000002615,0.6599999999999966],[-0.19000000000002615,-0.6599999999999966]],"o":[[-0.75,-0.28999999999999204],[0.75,0.28999999999999204],[0,0]],"v":[[169.66,209.33],[169.32999999999998,206.67000000000002],[169.66,209.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9882,0.9882,0.9843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[169.4950128137576,207.99999369630706]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[169.4950128137576,207.99999369630706]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 135","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 134","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.23999999999999488,-0.28000000000000114],[0.6499999999999915,0.21000000000000085],[-0.5900000000000034,0.0799999999999983],[-0.060000000000002274,0.01999999999999602],[-0.18000000000000682,-0.07000000000000028]],"o":[[-0.23000000000000398,0.13000000000000256],[0.20000000000000284,-0.8999999999999986],[0.28000000000000114,-0.6099999999999994],[0.15000000000000568,-0.020000000000003126],[0.10999999999999943,-0.03999999999999915],[0,0]],"v":[[105.67,53.67],[104.34,55],[103.01,54],[104.7,53.81],[105.01,53.330000000000005],[105.68,53.660000000000004]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9451,0.5176,0.4902]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[104.34503045842146,54.163160106960646]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[104.34503045842146,54.163160106960646]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 136","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 135","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.20999999999999375,0.030000000000001137],[-2.030000000000001,0.19999999999999574],[0.21999999999999886,-0.3999999999999986],[0.4099999999999966,-0.28999999999999915],[0.29999999999999716,-0.4399999999999977]],"o":[[-0.20000000000000284,-0.03999999999999915],[0.06999999999999318,-2.1700000000000017],[-0.35999999999999943,0.38000000000000256],[-0.09999999999999432,0.1700000000000017],[-0.3299999999999983,0.22999999999999687],[0,0]],"v":[[99,58],[98.34,58],[101.34,55.34],[100.67,56.67],[100.34,57.5],[99,58.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9294,0.9176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[99.8400418003364,56.674990349166194]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[99.8400418003364,56.674990349166194]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 137","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 136","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.22999999999998977,0.240000000000002],[1.1899999999999977,0.6799999999999997],[-0.5900000000000034,0.04999999999999716],[-0.29000000000000625,0.9400000000000048],[-0.030000000000001137,-0.2600000000000051]],"o":[[-0.6700000000000017,-0.36999999999999744],[-0.29000000000000625,-0.28999999999999915],[0.04000000000000625,0],[0.7099999999999937,-0.07000000000000028],[-0.030000000000001137,0.13000000000000256],[0,0]],"v":[[102,51.67],[99.34,52.33],[99.34,50],[100.01,49.67],[102.01,49],[102.01,51.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8902,0.8824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[100.6557685938929,50.680198577989586]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[100.6557685938929,50.680198577989586]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 138","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 137","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[1.6200000000000045,0.259999999999998],[0.1799999999999926,0.1699999999999946],[0.10999999999999943,0.6199999999999974]],"o":[[0,0],[0,0],[0.29000000000000625,0.7100000000000009],[-0.01999999999999602,0],[-0.5799999999999983,-0.5700000000000003],[0,0]],"v":[[102.33,52.33],[105.66,51],[105,53.33],[103,54],[102.67,54.2],[102.33,52.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9255,0.9137]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[103.99190447519746,52.62232181992246]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[103.99190447519746,52.62232181992246]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 139","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 138","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6899999999999977,-0.28000000000000114],[-0.0799999999999983,0.0799999999999983],[-0.5599999999999881,0.6000000000000014],[-2.4399999999999977,-0.9699999999999989],[0.6200000000000045,0.490000000000002],[0.5400000000000063,0.04999999999999716]],"o":[[-0.5300000000000011,-0.04999999999999716],[0.2600000000000051,-0.4399999999999977],[0.09999999999999432,-0.10000000000000142],[0.23999999999999488,1.6000000000000014],[-0.010000000000005116,0.7899999999999991],[-0.1599999999999966,0],[0,0]],"v":[[97.67,49.67],[96,49.67],[96.34,47.35],[99.16,46.67],[100,49.67],[99.33,50],[97.66,49.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8706,0.8549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[98.0000287153247,48.49728047770304]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[98.0000287153247,48.49728047770304]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 140","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 139","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.019999999999996,-0.21999999999999886],[-0.4099999999999966,0.20000000000000284],[-0.5300000000000011,-0.5900000000000034],[-0.29999999999999716,-0.11999999999999744],[0,0],[1.1200000000000045,-1.2899999999999991],[0.06999999999999318,-0.03999999999999915],[-0.09000000000000341,0.7899999999999991],[-0.3399999999999892,0.7000000000000028],[0.519999999999996,0.4799999999999969],[0,0.0799999999999983],[-0.5799999999999983,0.7700000000000031],[-0.20000000000000284,0.480000000000004]],"o":[[0.980000000000004,-0.21999999999999886],[0.04999999999999716,0],[0.14000000000000057,0.75],[0.35999999999999943,0.17999999999999972],[0,0],[-2.3499999999999943,-0.35999999999999943],[-0.10999999999999943,0.030000000000001137],[-0.6299999999999955,0.3999999999999986],[-0.5799999999999983,-0.060000000000002274],[-1.019999999999996,0.5799999999999983],[-0.04999999999999716,-0.28999999999999915],[-1.3599999999999994,-0.38000000000000256],[0.09000000000000341,-0.3999999999999986],[0,0]],"v":[[103,47.33],[106,47.33],[107,47.66],[108,49.66],[109,49.989999999999995],[109,50.31999999999999],[106,53.64999999999999],[105.67,53.64999999999999],[105,53.31999999999999],[104.63,52.17999999999999],[102.33,52.31999999999999],[102,51.64999999999999],[102,48.97999999999999],[103,47.30999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.298,0.2784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[105.12256048957411,50.551058091029574]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[105.12256048957411,50.551058091029574]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 141","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 140","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.28999999999999204,0.28000000000000114],[-0.7199999999999989,0.060000000000002274]],"o":[[-0.09000000000000341,0.45000000000000284],[-0.23999999999999488,-0.7800000000000011],[0,0]],"v":[[92.67,57.67],[91.34,58.660000000000004],[92.67,57.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2863,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[91.98430734765634,58.19346591470318]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.98430734765634,58.19346591470318]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 142","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 141","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.18999999999999773,-0.8500000000000085],[-0.060000000000002274,0.20000000000000284],[0.01999999999999602,0.2600000000000051],[0.01999999999999602,0.09000000000000341]],"o":[[1.1700000000000017,-0.23000000000000398],[-0.1599999999999966,0.010000000000005116],[0.29999999999999716,-0.5799999999999983],[-0.010000000000005116,-0.12000000000000455],[0,0]],"v":[[84.33,68.67],[84.66,70.34],[84.33,70.01],[84.33,69.01],[84.33,68.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9569,0.749,0.7294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[84.66597486899494,69.48916814607173]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.66597486899494,69.48916814607173]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 143","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 142","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.010000000000005116,-0.5699999999999932],[0,0],[-0.060000000000002274,0.060000000000002274]],"o":[[0.20999999999999375,-0.21000000000000085],[0,0],[0.030000000000001137,-0.2700000000000031],[0,0]],"v":[[93.33,54.33],[94.66,54.989999999999995],[93.33,55.33],[93.33,54.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2863,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[93.98453186601284,54.79643217275532]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[93.98453186601284,54.79643217275532]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 144","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 143","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.01999999999999602,0.09999999999999432],[-0.29000000000000625,0.240000000000002],[1.2999999999999972,0.07000000000000739]],"o":[[0.010000000000005116,-0.10999999999999943],[0.060000000000002274,-0.35999999999999943],[1.0300000000000011,0.8200000000000003],[0,0]],"v":[[90.67,64.33],[90.67,64],[91.34,63],[90.67,64.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2863,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[91.29354109311575,63.66785416683405]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.29354109311575,63.66785416683405]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 145","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 144","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4299999999999926,0.39000000000000057],[-0.5499999999999972,-0.3100000000000023],[0.04999999999999716,-0.18999999999999773]],"o":[[-0.3299999999999983,0.10999999999999943],[-0.5499999999999972,-0.4799999999999969],[0.10999999999999943,0.0799999999999983],[0,0]],"v":[[93.67,62],[92.01,62.66],[94.01,61.33],[93.68,61.989999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2863,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[92.97236742359567,62.01614773670599]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[92.97236742359567,62.01614773670599]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 146","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 145","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.45999999999999375,-0.509999999999998],[0.46000000000000796,-0.060000000000002274],[-0.37999999999999545,1.3700000000000045],[-0.09999999999999432,0]],"o":[[0.45000000000000284,0.5900000000000034],[-0.39000000000000057,0.4399999999999977],[0.3499999999999943,-1.3400000000000034],[0.23000000000000398,-0.0799999999999983],[0,0]],"v":[[94.67,61.67],[94.53,63.02],[92.33,64.67],[93.66,62],[94.66,61.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.949,0.3765,0.3569]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[93.63938759291074,63.1699925099156]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[93.63938759291074,63.1699925099156]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 147","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 146","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.1599999999999966,-0.5700000000000003],[0.4899999999999949,0.17999999999999972],[-0.010000000000005116,0.2700000000000031],[-0.5600000000000023,0.529999999999994],[-0.060000000000002274,0.03999999999999915],[-0.04999999999999716,-0.05999999999999517],[0.030000000000001137,-0.259999999999998]],"o":[[-0.060000000000002274,0.5900000000000034],[-0.5499999999999972,-0.6199999999999974],[-0.12000000000000455,-0.03999999999999915],[-0.12999999999999545,-1.4600000000000009],[0.04999999999999716,-0.04999999999999716],[0.1700000000000017,-0.14000000000000057],[-0.29000000000000625,0.5300000000000011],[0,0]],"v":[[91,57.67],[90.66,59.34],[89,58.67],[88.75,58.47],[90,56.67],[90,56.34],[91,55.67],[91,57.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.9176,0.9059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[89.86917406986399,57.50285889627472]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[89.86917406986399,57.50285889627472]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 148","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 147","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.1500000000000057,-0.2600000000000051],[-0.1700000000000017,-0.15000000000000568],[-0.04999999999999716,-0.04999999999999716],[0.480000000000004,-0.75],[0.18000000000000682,0.01999999999999602],[0.23000000000000398,-0.01999999999999602],[0.3299999999999983,0.3400000000000034]],"o":[[-0.5699999999999932,-2.1299999999999955],[0.3400000000000034,0.0799999999999983],[0.14000000000000057,0.12000000000000455],[-1.0100000000000051,0.35999999999999943],[-0.20999999999999375,-0.09000000000000341],[-0.3299999999999983,-0.04000000000000625],[0.12000000000000455,-0.769999999999996],[0,0]],"v":[[84.33,68.67],[85.89,68.23],[86.94,68.04],[86.99,68.67],[86.32,70.34],[85.64999999999999,70.01],[84.64999999999999,70.34],[84.32,68.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9647,0.9373,0.9255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.58363267884644,68.9296920660052]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.58363267884644,68.9296920660052]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 149","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 148","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6299999999999955,0.14000000000000057],[0.35999999999999943,-0.29999999999999716],[0.20999999999999375,0.2400000000000091],[-0.5900000000000034,0.5700000000000003],[-0.3999999999999915,0.10000000000000142],[-0.8699999999999903,-0.6899999999999977]],"o":[[0.4000000000000057,0.5700000000000003],[-0.6700000000000017,0.18000000000000682],[-0.23999999999999488,0.20000000000000284],[-0.01999999999999602,-0.7800000000000011],[0.480000000000004,-0.46000000000000085],[0.7600000000000051,-0.18999999999999773],[0,0]],"v":[[91.33,63],[90.66,64],[89.33,65.33],[88,65.99],[88.5,63.3],[89.77,63.199999999999996],[91.33999999999999,62.989999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9216,0.9098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[89.73493802731494,64.36708979209007]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[89.73493802731494,64.36708979209007]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 150","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 149","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.46999999999999886,-0.10999999999999943],[0.09999999999999432,-0.45000000000000284],[0,-0.020000000000003126],[1.1899999999999977,0.010000000000005116],[-2.239999999999995,1.1700000000000017]],"o":[[0.3400000000000034,-0.17999999999999972],[0.21999999999999886,0.6799999999999997],[-0.04999999999999716,0.22999999999999687],[-0.269999999999996,1.2100000000000009],[-0.0799999999999983,-2.1199999999999974],[0,0]],"v":[[93.67,58],[94.67,57.67],[94.09,59.24],[94.34,59.67],[92.01,61.33],[93.68,58]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9294,0.9176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[93.31110244318336,59.4869508060182]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[93.31110244318336,59.4869508060182]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 151","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 150","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-0.07000000000000028],[0,-0.03999999999999915],[-0.0899999999999892,-0.14999999999999858],[0.519999999999996,-0.1700000000000017],[0.4899999999999949,0.14999999999999858],[0,0],[0,0],[-0.23000000000000398,0.14000000000000057],[-0.14000000000000057,-0.4099999999999966]],"o":[[-0.04000000000000625,0.04999999999999716],[0,0.09000000000000341],[0.01999999999999602,0.14999999999999858],[-0.060000000000002274,0.3100000000000023],[-0.3100000000000023,0.10999999999999943],[0,0],[0,0],[0.12000000000000455,-0.0799999999999983],[0.21999999999999886,-0.11999999999999744],[0,0]],"v":[[95.33,51.67],[94.75,52.84],[95,53.010000000000005],[95.32,53.510000000000005],[93.33,54.34],[92.33,54.67],[92.66,53.010000000000005],[92.66,52.68000000000001],[93.05,51.75000000000001],[95.32,51.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8706,0.8588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[93.8300330281917,53.097183810891124]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[93.8300330281917,53.097183810891124]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 152","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 151","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.09000000000000341,-0.0800000000000054],[0.11999999999999034,-0.10000000000000142],[0.4200000000000017,-0.14000000000000057],[0.5999999999999943,0.13999999999999346],[-0.09000000000000341,0.46000000000000085],[-0.07000000000000739,0.3500000000000014],[-1.6400000000000006,0.6599999999999966]],"o":[[0.3199999999999932,-0.13000000000000256],[-0.6899999999999977,0.4799999999999969],[-0.11999999999999034,0.10000000000000142],[-0.480000000000004,0.1599999999999966],[-0.06999999999999318,-0.490000000000002],[0,-0.030000000000001137],[0.14000000000000057,-0.7800000000000011],[0,0]],"v":[[96.33,54],[98.66,53.34],[97.64,56.31],[96.25,56.410000000000004],[95,57.00000000000001],[95.33,55.67000000000001],[95.62,55.18000000000001],[96.33,54.00000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9059,0.8902]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[96.824906016628,55.17734485755082]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[96.824906016628,55.17734485755082]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 153","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 152","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.29000000000000625,-0.11999999999999744],[-0.01999999999999602,-0.6099999999999994],[0.5200000000000102,-0.28000000000000114],[-0.480000000000004,0.6900000000000048],[0.5900000000000034,0.7800000000000011],[0,0],[-0.44000000000001194,0.3100000000000023],[-0.980000000000004,0.5100000000000051],[-0.030000000000001137,0.020000000000003126]],"o":[[0.29000000000000625,0.09000000000000341],[-1.8199999999999932,0.8200000000000003],[0.01999999999999602,0.46999999999999886],[-1.1299999999999955,-0.09000000000000341],[0.04000000000000625,-0.04999999999999716],[0,0],[0.09999999999999432,-1.0300000000000011],[0.18000000000000682,-0.13000000000000256],[0.28000000000000114,-0.14999999999999858],[0,0]],"v":[[92.67,52.67],[92.67,53],[92.19,55.18],[91.00999999999999,57.67],[90.75999999999999,55.9],[90.00999999999999,56.33],[88.85,56],[90.36,55.19],[92,52.519999999999996],[92.68,52.669999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2863,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[90.76503643686388,55.07492618066232]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[90.76503643686388,55.07492618066232]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 154","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 153","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3100000000000023,0.04999999999999716],[-0.4899999999999949,-1.4499999999999886],[0.46999999999999886,-0.5700000000000074],[-2.75,0.3500000000000085]],"o":[[0.23999999999999488,-0.0799999999999983],[-0.4899999999999949,1.4500000000000028],[-0.6899999999999977,0.01999999999999602],[-3.200000000000003,1.2099999999999937],[0,0]],"v":[[82.67,64.67],[83.67,64.67],[83.67,67.66],[82,68.33],[82.67,64.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8863,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[81.86216531063397,66.58904064436933]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[81.86216531063397,66.58904064436933]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 155","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 154","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.12999999999999545,0.21000000000000085],[-0.29999999999999716,0.44999999999999574],[-0.21999999999999886,1.1099999999999994],[0.23000000000000398,-0.3299999999999983],[0.28999999999999204,-0.10000000000000853],[0.03999999999999204,-0.00999999999999801]],"o":[[0.12000000000000455,-0.21000000000000085],[0.7600000000000051,-1.1599999999999966],[0.1700000000000017,-0.259999999999998],[-0.030000000000001137,0.4299999999999997],[-0.09000000000000341,0.13000000000000256],[-0.4000000000000057,0.15000000000000568],[0,0]],"v":[[84,64],[84.33,63.33],[84.81,61.32],[87.33,60],[87.53,62.68],[84.65,64.2],[83.99000000000001,64]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8627,0.851]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.7923713173713,62.118317607169246]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.7923713173713,62.118317607169246]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 156","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 155","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.29999999999999716,-0.12999999999999545],[-3.9599999999999937,0],[-0.030000000000001137,-0.13999999999999346],[0.06999999999999318,-0.04999999999999716],[0.05000000000001137,-0.1700000000000017],[-0.20000000000000284,1.269999999999996],[-0.04999999999999716,0.22000000000000597],[0.7199999999999989,-1.2800000000000011],[-0.1600000000000108,0.29999999999999716],[-0.39000000000000057,0.35999999999999943],[-0.9099999999999966,-0.4099999999999966],[-0.12000000000000455,-0.1599999999999966]],"o":[[0.3100000000000023,0.09000000000000341],[-0.18000000000000682,1.0300000000000011],[0.09000000000000341,0.13000000000000256],[0.01999999999999602,0.09000000000000341],[-0.15000000000000568,0.10999999999999943],[-0.5999999999999943,1.0900000000000034],[0.12999999999999545,-0.240000000000002],[0.12000000000000455,-0.6099999999999994],[-0.12000000000000455,-0.1700000000000017],[0.3100000000000023,-0.5700000000000003],[-0.39000000000000057,-0.8999999999999986],[0.25,0.09000000000000341],[0,0]],"v":[[88.67,53.33],[88.67,53.66],[90,56.66],[90.2,57.06999999999999],[89.29,58.21999999999999],[89,58.64999999999999],[88,58.31999999999999],[88.67,57.47999999999999],[85.01,57.31999999999999],[85.41000000000001,54.879999999999995],[86.68,53.98],[87.68,52.98],[88.68,53.309999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.9059,0.8941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.5931924142782,56.10779131766003]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.5931924142782,56.10779131766003]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 157","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 156","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.28999999999999204,-0.4899999999999949],[0.6299999999999955,0.030000000000001137],[0.35999999999999943,-0.12999999999999545],[-0.5900000000000034,1.9399999999999977],[-1.25,-0.5399999999999991],[-1.1799999999999926,-0.1700000000000017],[0,-1.5]],"o":[[0.3299999999999983,0.21000000000000085],[0.46999999999999886,0.45000000000000284],[-0.4899999999999949,0.18000000000000682],[-2.1400000000000006,1.4899999999999949],[-1.3400000000000034,0.23999999999999488],[-0.12000000000000455,-1.0700000000000003],[-0.6899999999999977,-1.240000000000002],[0,0]],"v":[[83.67,61],[84.34,63.33],[84.01,64],[82.68,64.67],[80.35000000000001,64],[80.68,63],[82.01,61.33],[83.68,61]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2824,0.2667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[82.06622638836421,62.87612226492831]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[82.06622638836421,62.87612226492831]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 158","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 157","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4899999999999949,-0.18999999999999773],[0.4899999999999949,-0.35999999999999943],[0.37999999999999545,-0.21000000000000796],[0.12999999999999545,0.1599999999999966],[-1.519999999999996,0.12999999999999545],[-1.6400000000000006,-0.010000000000005116],[-0.730000000000004,-0.7999999999999972]],"o":[[0.5900000000000034,-0.1700000000000017],[-0.2600000000000051,0.5100000000000051],[-0.8799999999999955,0.6400000000000006],[-0.04000000000000625,-0.4000000000000057],[-1.5799999999999983,0.06999999999999318],[-0.5300000000000011,-0.6800000000000068],[0.8799999999999955,0.09000000000000341],[0,0]],"v":[[84.33,69],[84.33,70],[82.66,71.67],[80.99,72.34],[80.32,71.67],[80.32,69.34],[81.99,68.34],[84.32,69.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2784,0.2627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[81.94665997264772,70.33987712301786]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[81.94665997264772,70.33987712301786]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 159","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 158","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.060000000000002274,-0.6999999999999957],[-0.20000000000000284,-0.22999999999999687],[0.18000000000000682,0.5300000000000011],[0.09000000000000341,-1.1300000000000026],[1.3700000000000045,-0.060000000000002274],[1.039999999999992,0.0899999999999963],[-0.45999999999999375,0.6599999999999966],[-0.39000000000000057,0.9200000000000017],[-0.01999999999999602,1.1299999999999955],[-0.269999999999996,0.5200000000000031],[-0.010000000000005116,0.7100000000000009],[-0.789999999999992,-0.5300000000000011],[-1.2000000000000028,0.060000000000002274],[0.23999999999999488,-1.1099999999999994]],"o":[[0,0],[-0.6800000000000068,0.20000000000000284],[0.5799999999999983,-0.18999999999999773],[0.06999999999999318,0.0799999999999983],[-0.39000000000000057,0.7199999999999989],[0.09000000000000341,1.1499999999999986],[0.060000000000002274,0.8699999999999974],[-0.7600000000000051,-0.28999999999999915],[-0.6099999999999994,-0.1700000000000017],[-0.8900000000000006,0.35999999999999943],[-0.269999999999996,-0.14999999999999858],[-0.45999999999999375,-0.17999999999999972],[-0.8199999999999932,-0.6599999999999966],[0.7999999999999972,-0.6000000000000014],[-0.12000000000000455,-1.1700000000000017],[0,0]],"v":[[86.67,54],[86.71000000000001,54.77],[85.82000000000001,55.96],[89.18,57],[88.01,58.33],[87.34,60],[85.41,61.81],[84.34,63.34],[83.67,61.010000000000005],[83.35000000000001,59.370000000000005],[81.67,58.68000000000001],[81.67,57.68000000000001],[81,56.35000000000001],[82.33,54.68000000000001],[85.33,53.68000000000001],[86.66,54.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2941,0.2784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[84.96474162443101,58.15821502037426]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.96474162443101,58.15821502037426]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 160","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 159","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.0799999999999983,-0.20000000000000284],[0,0],[-0.28000000000000114,0.3299999999999983],[0.0799999999999983,-0.4899999999999949]],"o":[[-0.1599999999999966,0.20000000000000284],[0,0],[0.2600000000000051,-0.09999999999999432],[1.0699999999999932,0.37999999999999545],[0,0]],"v":[[88.33,82],[87.66,82.67],[87.33,81],[88,80.67],[88.33,82]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6824,0.2039,0.1608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.96725794625092,81.66998430686948]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.96725794625092,81.66998430686948]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 161","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 160","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.23999999999999488,0.6099999999999994],[-0.6000000000000085,-0.4200000000000017],[0.39000000000000057,-1.2199999999999989]],"o":[[0,0],[0.29999999999999716,-0.7999999999999972],[0.01999999999999602,-0.6299999999999955],[-0.23000000000000398,1.4300000000000068],[0,0]],"v":[[87.33,85.33],[87,85],[87.67,82.67],[88.34,82],[87.34,85.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5412,0.1451,0.1176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.67002383839434,83.58413175434771]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.67002383839434,83.58413175434771]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 162","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 161","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.8799999999999955,0.6599999999999966],[-1.6899999999999977,-0.07000000000000739]],"o":[[0,0],[-0.5999999999999943,0.6599999999999966],[-0.4099999999999966,-1.5],[0,0]],"v":[[88.67,95],[89.34,95.5],[87.01,96.34],[88.68,95.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7412,0.5686,0.5255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[88.09998124573445,95.77844317565086]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[88.09998124573445,95.77844317565086]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 163","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 162","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.769999999999996,0.35999999999999943],[-0.1599999999999966,-0.960000000000008],[-0.27000000000001023,1.6600000000000108],[-0.1700000000000017,0.480000000000004]],"o":[[0.6299999999999955,0.5699999999999932],[-0.8900000000000006,1.6200000000000045],[0.37000000000000455,2.280000000000001],[0.20000000000000284,-0.480000000000004],[0,0]],"v":[[87.33,86.33],[89.33,86.66],[89.24,89.22],[86.67,87.99],[87.34,86.32]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7569,0.6,0.5608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.99195944814943,88.30166081313536]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.99195944814943,88.30166081313536]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 164","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 163","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.8199999999999932,-0.030000000000001137],[0,0],[0.20999999999999375,0],[-0.030000000000001137,0.4299999999999926],[0.36999999999999744,-0.06999999999999318]],"o":[[0.5200000000000031,-0.769999999999996],[0,0],[-0.0799999999999983,0.060000000000002274],[0.04999999999999716,-0.4300000000000068],[-0.6400000000000006,0.29999999999999716],[0,0]],"v":[[63.33,106.33],[65.66,105.66],[65.66,106.99],[65.33,107.32],[65.33,105.99],[63.33,106.32]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.5961,0.5686]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[64.49503892911287,106.48180697430624]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[64.49503892911287,106.48180697430624]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 165","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 164","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.36999999999999744,-0.13000000000000966],[1.6499999999999986,-0.6400000000000006],[-1.1000000000000014,0.39000000000000057]],"o":[[0.28000000000000114,-0.09999999999999432],[-0.4299999999999997,2.799999999999997],[-0.5,-0.8299999999999983],[0,0]],"v":[[60,103],[62.01,102.84],[60,105.34],[60,103.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.8235,0.7961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[60.69512787114866,104.06799651139087]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[60.69512787114866,104.06799651139087]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 166","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 165","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5699999999999932,-0.030000000000001137],[0.1700000000000017,-0.5500000000000114],[-0.010000000000005116,-0.03999999999999204],[-0.10999999999999943,-0.5600000000000023],[0.8099999999999952,-1.1400000000000006],[0,0],[-0.5699999999999932,0.3499999999999943]],"o":[[0.5,-0.3100000000000023],[0.15000000000000568,0.519999999999996],[-0.06999999999999318,0.23999999999999488],[0.10999999999999943,0.5600000000000023],[-1.25,-0.5],[0,0],[0.6799999999999997,-0.25],[0,0]],"v":[[64.67,92.33],[66.33,92],[65.34,92.87],[65.67,93.33],[66,95],[63.17,95.66],[62.67,94.67],[64.67,92.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.8706,0.8471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[64.50789724516966,93.82623829736693]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[64.50789724516966,93.82623829736693]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 167","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 166","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.20999999999999375,-0.20000000000000284],[0.5900000000000034,-0.5],[0.46000000000000085,1.2099999999999937],[-0.44999999999999574,0.3400000000000034]],"o":[[1.2299999999999969,-0.21999999999999886],[-0.10999999999999943,0.09999999999999432],[0.39000000000000057,-1.0699999999999932],[0.21000000000000085,-0.1599999999999966],[0,0]],"v":[[61,95.67],[62.34,98.34],[59.34,99.01],[59.67,96.35000000000001],[61,95.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.949,0.851,0.8235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[60.86988950424188,97.33361271278321]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[60.86988950424188,97.33361271278321]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 168","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 167","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.0899999999999963,-0.7800000000000011],[0.03999999999999915,-0.4299999999999926],[-0.480000000000004,2.3400000000000034],[-1.1899999999999977,1.6299999999999955]],"o":[[1.1599999999999966,-0.20999999999999375],[-0.04999999999999716,0.4300000000000068],[-1.7100000000000009,-0.4399999999999977],[1,-0.730000000000004],[0,0]],"v":[[58,99.33],[58.67,101.33],[58.67,102.66],[56.010000000000005,100.66],[58.010000000000005,99.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.8549,0.8275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[57.3627937520219,100.9845981968518]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[57.3627937520219,100.9845981968518]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 169","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 168","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7199999999999989,-1.9000000000000057],[0.060000000000002274,-0.060000000000002274],[0.4299999999999926,-0.14999999999999147],[0.6000000000000014,0.14000000000000057],[-0.0899999999999963,0.6400000000000006],[-1,0.21000000000000796]],"o":[[1.4599999999999937,-0.6599999999999966],[-0.030000000000001137,0.21999999999999886],[-0.04999999999999716,0.04999999999999716],[-0.4799999999999969,0.1599999999999966],[-0.10999999999999943,-0.6700000000000017],[0.09000000000000341,-0.6899999999999977],[0,0]],"v":[[63.33,106.33],[65.33,107.33],[65,109],[63.59,109.08],[62.34,109.67],[63.02,108.15],[63.34,106.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.8431,0.8196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[63.93351268410234,107.77001716940606]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[63.93351268410234,107.77001716940606]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 170","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 169","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.20999999999999375,0.010000000000005116],[1.480000000000004,0.04000000000000625],[1.019999999999996,-0.1700000000000017],[-0.22999999999999687,0.1599999999999966],[-0.39000000000000057,-0.010000000000005116],[-0.030000000000001137,0.010000000000005116]],"o":[[0.21999999999999886,-0.030000000000001137],[-0.5499999999999972,1.0699999999999932],[-0.9000000000000057,-0.5600000000000023],[0.38000000000000256,-0.5300000000000011],[0.3100000000000023,-0.20999999999999375],[0.3299999999999983,0],[0,0]],"v":[[65.33,99],[65.99,99],[64.99,102],[62.989999999999995,102],[63.31999999999999,99],[64.89999999999999,99.26],[65.32,99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.8078,0.7725]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[64.4900229915799,100.47288299817563]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[64.4900229915799,100.47288299817563]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 171","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 170","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.0799999999999983,-0.519999999999996],[-0.27999999999999403,-0.6599999999999966],[0.3200000000000003,1.4399999999999977],[0.02999999999999403,0.07000000000000739],[0.04999999999999716,0.29000000000000625],[-1.1799999999999997,0.3100000000000023]],"o":[[-0.04999999999999716,0.5300000000000011],[-0.04999999999999716,0.3499999999999943],[-3.5900000000000034,-0.5100000000000051],[-0.0799999999999983,-0.37000000000000455],[-0.0799999999999983,-0.20000000000000284],[1.1499999999999986,0.030000000000001137],[0,0]],"v":[[58.67,106],[58.67,107.67],[58.33,109.34],[56.29,107.56],[55.67,107],[55.67,106],[58.67,106]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9569,0.9137,0.8941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[57.17001853374083,107.66998703419992]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[57.17001853374083,107.66998703419992]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 172","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 171","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.8400000000000034,0.3100000000000023],[-0.04000000000000625,0.7999999999999972],[-0.010000000000005116,0.04000000000000625],[-1.6300000000000097,0.769999999999996],[0,-0.37999999999999545]],"o":[[0,1.6700000000000017],[-1.7099999999999937,-0.8400000000000034],[0.010000000000005116,-0.2600000000000051],[0.3199999999999932,-2.069999999999993],[0.3100000000000023,0.20000000000000284],[0,0]],"v":[[69,103.67],[67,105.67],[66.53,104.5],[66.34,104],[68.85000000000001,102.34],[69.01,103.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9176,0.8078,0.7765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[67.5649718399176,104.04274763535687]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[67.5649718399176,104.04274763535687]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 173","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 172","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.2199999999999989,0.9899999999999949],[0,0],[-1.5100000000000051,-0.519999999999996],[0.21999999999999886,-0.6499999999999915],[0.37999999999999545,-0.10999999999999943],[1.490000000000002,0.37000000000000455],[0,0],[0.39000000000000057,-1.0700000000000074],[0,0],[-0.1599999999999966,0.25],[0.5900000000000034,1.0100000000000051],[-0.30000000000000426,0.21999999999999886]],"o":[[0.5600000000000023,1.2800000000000011],[0,0],[-0.25,1.3900000000000006],[0.21999999999999886,0.9000000000000057],[-0.4099999999999966,0.1599999999999966],[-0.10000000000000142,0.8400000000000034],[0,0],[-0.9500000000000028,-0.3299999999999983],[0,0],[0.0799999999999983,-0.10999999999999943],[1.3699999999999974,0.10999999999999943],[0.29999999999999716,-0.519999999999996],[0,0]],"v":[[56,100.67],[58.67,101.34],[59.33,101.01],[60,103.01],[60,105.34],[58.67,106.01],[56.28,106.72],[55.67,107.01],[53.17,107.68],[53,106.01],[53.33,105.34],[54.33,103.34],[56,100.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.2667,0.2392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[56.5000325918368,104.17498327424693]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[56.5000325918368,104.17498327424693]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 174","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 173","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.1000000000000014,0.39000000000000057],[0,0],[0.29999999999999716,-0.9899999999999949],[-0.6400000000000006,0.37000000000000455],[-0.28999999999999915,-1.8299999999999983],[1.1099999999999994,-0.12000000000000455],[-0.01999999999999602,-0.20999999999999375],[1.1200000000000045,-0.5100000000000051],[0.7800000000000011,-0.010000000000005116],[0.020000000000003126,0.28999999999999204],[-0.28999999999999915,0.10999999999999943],[1.0499999999999972,-0.37000000000000455],[0.4799999999999969,0.8900000000000006],[-0.010000000000005116,1.7099999999999937],[-0.23999999999999488,0.3299999999999983]],"o":[[0.46000000000000085,0.5300000000000011],[0,0],[0.8400000000000034,-1.019999999999996],[0.5300000000000011,-0.15000000000000568],[-0.28000000000000114,2.760000000000005],[-0.9299999999999997,-0.6200000000000045],[-0.13000000000000256,0.4000000000000057],[0.28999999999999915,2.4599999999999937],[-0.740000000000002,0.3400000000000034],[0.3999999999999986,-0.5999999999999943],[-0.28999999999999915,-0.10999999999999943],[0.38000000000000256,-1.9200000000000017],[0.3400000000000034,0.9699999999999989],[-0.8999999999999986,-0.29000000000000625],[0.46000000000000085,-0.6500000000000057],[0,0]],"v":[[53,106],[55.34,106.21],[55.660000000000004,107],[56.910000000000004,108.44],[58.660000000000004,107.66],[61.330000000000005,110.33],[58.330000000000005,109.67],[58.660000000000004,110.67],[56.82,112.96000000000001],[54.99,114.00000000000001],[54.99,112.67000000000002],[54.99,112.34000000000002],[53.99,110.01000000000002],[52.99,110.34000000000002],[51.660000000000004,107.34000000000002],[52.99,106.01000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8941,0.2314,0.2039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[56.49495694076177,109.99998954083523]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[56.49495694076177,109.99998954083523]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 175","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 174","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.0799999999999983,-0.15000000000000568],[1.25,-0.5600000000000023],[0.18999999999999773,-0.37000000000000455],[0.09999999999999432,-0.10999999999999943],[-0.6500000000000057,-0.04000000000000625],[0.6200000000000045,-0.9299999999999926],[0.10999999999999943,-0.6700000000000017],[0,0],[0.12999999999999545,0.6700000000000017],[-0.5400000000000063,0.6700000000000017],[-0.20000000000000284,0.23999999999999488],[-0.7099999999999937,0.9200000000000017],[-0.12000000000000455,0.23000000000000398],[-1.0400000000000063,0.28000000000000114]],"o":[[0,0],[0.0799999999999983,0.09000000000000341],[1.4500000000000028,-0.9500000000000028],[-0.12000000000000455,0.5],[-0.010000000000005116,-0.12000000000000455],[-0.09000000000000341,0.09000000000000341],[-0.8100000000000023,0.6200000000000045],[-1.3499999999999943,0.28000000000000114],[0,0],[-0.12999999999999545,-0.5999999999999943],[-0.75,-0.4099999999999966],[0.7099999999999937,-0.21999999999999886],[0.6299999999999955,-0.8599999999999994],[0.3299999999999983,-0.5],[0.9399999999999977,-0.5],[0,0]],"v":[[72,86.67],[73.33,87.34],[73.33,88.01],[74,90.34],[73,91.67],[70.59,91.86],[71.34,94],[69.34,95.33],[67.15,96.75],[66.34,96.99],[66.01,94.99],[65.68,93.32],[66.68,91.99],[68.68,89.32],[69.01,87.99],[72.01,86.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8745,0.2196,0.1882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[70.03420642212095,91.82498869653844]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[70.03420642212095,91.82498869653844]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 176","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 175","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3500000000000085,-0.3199999999999932],[-0.01999999999999602,-0.3299999999999983],[0.20000000000000284,-0.04999999999999716],[0,0],[1.230000000000004,0.030000000000001137],[-0.21999999999999886,0.6099999999999994],[-0.7000000000000028,-0.6400000000000006]],"o":[[-0.12000000000000455,0.0799999999999983],[-0.21999999999999886,0.20999999999999375],[-0.21999999999999886,-0.18999999999999773],[0,0],[0.3499999999999943,-1.3199999999999932],[0.39000000000000057,-0.4000000000000057],[0.6899999999999977,0.6599999999999966],[0,0]],"v":[[74.67,102.33],[74,102.66],[73.67,103.33],[73.17,102.66],[72.67,103.33],[71,101.66],[72.33,100.66],[74.66,102.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8745,0.3294,0.2941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[72.83503030337894,101.99499113752128]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[72.83503030337894,101.99499113752128]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 177","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 176","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.21999999999999886,-0.12000000000000455],[-0.09000000000000341,0.9000000000000057],[0.4900000000000091,-3.6099999999999994]],"o":[[-0.09999999999999432,0.25],[-0.4899999999999949,-0.12000000000000455],[0.21999999999999886,-2.269999999999996],[0,0]],"v":[[82.33,81.67],[81.66,82.34],[80.34,81.86],[82.33,81.67999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.851,0.7216,0.6863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[81.36664243411283,80.9566761902015]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[81.36664243411283,80.9566761902015]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 178","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 177","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3199999999999932,-0.04000000000000625],[-0.029999999999986926,-0.4099999999999966],[2.5500000000000114,-0.8400000000000034],[0.35999999999999943,0.8700000000000045],[-0.7399999999999949,0.4099999999999966]],"o":[[0.29999999999999716,0.04999999999999716],[0.25,0.6700000000000017],[0.06999999999999318,1.1299999999999955],[-0.3400000000000034,-0.8100000000000023],[-0.23999999999999488,-1.0600000000000023],[0,0]],"v":[[78,90.67],[79,90.67],[78.46,92.49],[77.66999999999999,94.33],[76.99999999999999,92],[77.99999999999999,90.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.898,0.698,0.651]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[78.00650170890052,92.4946959752462]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[78.00650170890052,92.4946959752462]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 179","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 178","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.0799999999999983,-0.710000000000008],[-0.009999999999990905,-0.4299999999999926],[0.3200000000000074,-0.5600000000000023],[0.37999999999999545,0],[0.21999999999999886,-0.21999999999999886],[0.3100000000000023,-0.5699999999999932],[0.12999999999999545,0.6400000000000006],[-0.6700000000000017,0.7199999999999989],[-0.480000000000004,0.5300000000000011]],"o":[[0.7099999999999937,-0.0799999999999983],[-0.20999999999999375,0.35999999999999943],[0.010000000000005116,0.3400000000000034],[-0.5400000000000063,0.7399999999999949],[-0.15000000000000568,0],[-0.46999999999999886,0.45000000000000284],[-0.5600000000000023,0.010000000000005116],[1.3900000000000006,-0.4899999999999949],[0.5300000000000011,-0.5699999999999932],[0,0]],"v":[[78.67,83.67],[79.34,84.34],[78.66,85.5],[79.50999999999999,86.34],[78.17999999999999,85.73],[77.00999999999999,86.68],[76.00999999999999,88.01],[75.00999999999999,87.34],[76.99999999999999,85.17],[78.66999999999999,83.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9255,0.7412,0.7059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[77.28794875278834,85.82583783679152]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[77.28794875278834,85.82583783679152]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 180","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 179","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.14000000000000057,-0.12000000000000455],[-0.030000000000001137,-0.18999999999999773],[0.030000000000001137,-0.13000000000000966],[-0.23000000000000398,-0.21999999999999886],[1.6700000000000017,0.010000000000005116],[0.04999999999999716,0.07000000000000739],[-0.45000000000000284,0.6599999999999966],[0.3299999999999983,0.01999999999999602],[-0.29000000000000625,0.12000000000000455]],"o":[[-0.39000000000000057,-1.0100000000000051],[0.04999999999999716,0.04000000000000625],[-0.23000000000000398,0.18999999999999773],[-0.14000000000000057,0.5499999999999972],[0.7800000000000011,0.6700000000000017],[-0.3100000000000023,0],[-0.1599999999999966,-0.8700000000000045],[-0.3299999999999983,-0.01999999999999602],[-0.29000000000000625,-0.09000000000000341],[0,0]],"v":[[69.67,99.67],[72.67,98.34],[72.67,99],[71.67,99.84],[72.34,100.67],[71.01,101.67],[70.01,102],[70.67,100],[69.67,100],[69.67,99.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.7255,0.6902]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[71.17567058761028,100.16447250569698]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[71.17567058761028,100.16447250569698]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 181","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 180","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4299999999999926,-0.04000000000000625],[-0.46999999999999886,-0.6599999999999966],[-0.04000000000000625,-0.18999999999999773],[0.020000000000010232,-0.07000000000000739],[1.6000000000000085,0.21999999999999886],[0,0]],"o":[[0.4300000000000068,0.060000000000002274],[0.3199999999999932,1.0999999999999943],[0.04000000000000625,0.060000000000002274],[0.1599999999999966,0.8700000000000045],[-3.3499999999999943,1.0600000000000023],[0,0],[0,0]],"v":[[84,82.33],[85.33,82.33],[84.38,84.3],[85.02,84.5],[84.33999999999999,85.67],[82.66999999999999,83.51],[83.99999999999999,82.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8588,0.7176,0.6784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[84.01985443940052,84.1081578949451]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.01985443940052,84.1081578949451]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 182","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 181","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12000000000000455,-0.35999999999999943],[-2.1099999999999994,1.6899999999999977],[-0.5400000000000063,0.15000000000000568]],"o":[[-1.5699999999999932,1.3100000000000023],[-0.45999999999999375,1.3700000000000045],[0.7999999999999972,-0.6400000000000006],[0,0]],"v":[[76.33,94.67],[76,97.67],[73.9,95.32000000000001],[76.33000000000001,94.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.8,0.7608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[74.79538608015389,96.39560253734655]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[74.79538608015389,96.39560253734655]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 183","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 182","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.14999999999999147,-0.3999999999999915],[0.3299999999999983,0.06999999999999318],[0.10999999999999943,0.029999999999986926],[0.4099999999999966,-0.5300000000000011],[-0.04000000000000625,0.4300000000000068],[-0.23000000000000398,0.4099999999999966],[-0.23999999999999488,-0.05000000000001137],[-0.20999999999999375,-0.5699999999999932],[-0.030000000000001137,-0.07000000000000739]],"o":[[0.1700000000000017,0.35999999999999943],[-0.0799999999999983,-0.010000000000005116],[-0.12000000000000455,-0.030000000000001137],[-0.6700000000000017,-0.18000000000000682],[-1.0600000000000023,-0.6800000000000068],[0.04000000000000625,-0.4300000000000068],[0.12000000000000455,-0.20999999999999375],[0.7999999999999972,0.45000000000000284],[0.06999999999999318,0.20000000000000284],[0,0]],"v":[[83,88.67],[83.33,90],[82.73,90.23],[82.33,89.66000000000001],[80.5,90.32000000000001],[80.56,88.82000000000001],[80.14,87.65],[82.16,86.66000000000001],[82.49,88.32000000000001],[83,88.66000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.898,0.7843,0.7412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[81.68278583028817,88.48890257651897]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[81.68278583028817,88.48890257651897]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 184","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 183","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.29000000000000625,-0.6700000000000017],[0.25,-0.21999999999999886],[0.6500000000000057,-1.4599999999999937],[-0.21000000000000796,-0.030000000000001137],[0.8299999999999983,-0.3499999999999943],[1.3299999999999983,-0.09999999999999432],[-0.9099999999999966,0.18999999999999773],[-0.9300000000000068,-0.3200000000000074],[-0.8700000000000045,-0.1700000000000017]],"o":[[0,0],[0.5900000000000034,-0.5900000000000034],[0.04000000000000625,0.09000000000000341],[0.2600000000000051,0.7000000000000028],[0.20999999999999375,0.030000000000001137],[0.1599999999999966,0.5400000000000063],[-0.480000000000004,-1.1700000000000017],[-0.25,-0.6500000000000057],[-0.4399999999999977,-0.8199999999999932],[0.04000000000000625,-0.7600000000000051],[0,0]],"v":[[77,86.67],[76.83,88],[78.67,88.51],[77.01,89.35000000000001],[77.34,90.68],[78.01,90.68],[77.01,92.01],[74.34,90.34],[75.33,89.09],[76.01,88.01],[77.01,86.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8706,0.2353,0.2039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[76.5054425931308,89.33270468710026]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[76.5054425931308,89.33270468710026]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 185","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 184","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.21999999999999886,-1.9099999999999966],[0.789999999999992,-0.5100000000000051],[0.4399999999999977,-0.12000000000000455],[0,0],[-2.5,-0.5599999999999881],[0.4200000000000017,0.010000000000005116],[0.1599999999999966,-0.12999999999999545],[1.0699999999999932,-0.4099999999999966],[-0.8499999999999943,-0.35999999999999943],[0.980000000000004,-1.4200000000000017],[0,0],[1.3199999999999932,0.8299999999999983],[0,0],[0.8700000000000045,-0.6799999999999926],[0.12000000000000455,0.1700000000000017],[0.15000000000000568,0.09000000000000341],[-0.09000000000000341,1.0100000000000051],[0,0],[0,0],[-0.4200000000000017,0.7999999999999972],[0.07000000000000739,1.8900000000000006],[0,0],[-1.6599999999999966,-0.0799999999999983],[-0.8100000000000023,-0.23000000000000398],[-1,0.010000000000005116],[-1.0900000000000034,-0.1599999999999966],[-0.12000000000000455,-0.29000000000000625]],"o":[[1.8700000000000045,-0.7000000000000028],[1.0400000000000063,-0.18000000000000682],[-0.4300000000000068,0.14000000000000057],[0,0],[-2.519999999999996,1.0900000000000034],[-0.2600000000000051,1.980000000000004],[-0.09000000000000341,0],[-0.9300000000000068,0.04000000000000625],[-0.8499999999999943,-0.14000000000000057],[0.75,-1.4000000000000057],[0,0],[-0.730000000000004,0.7399999999999949],[0,0],[-1.0499999999999972,-0.8100000000000023],[-2.1299999999999955,0.28000000000000114],[-0.04000000000000625,-0.04999999999999716],[0.12999999999999545,-0.9899999999999949],[0,0],[0,0],[0.5400000000000063,-0.5699999999999932],[1.5100000000000051,0.9099999999999966],[0,0],[-0.3199999999999932,-0.9699999999999989],[-0.3499999999999943,-0.7999999999999972],[-0.1700000000000017,-0.8199999999999932],[-0.29999999999999716,-0.9399999999999977],[0.09000000000000341,-0.29000000000000625],[0,0]],"v":[[74.33,90.33],[77,92],[77.67,94.33],[76.34,94.66],[75.68,95.09],[76,97.66],[74.16,98.1],[72.66,98.99],[69.66,99.66],[69.66,99.99],[70.67999999999999,101.22999999999999],[70.99999999999999,101.66],[69.33999999999999,102.66],[68.99999999999999,103.66],[66.32999999999998,103.99],[65.99999999999999,102.66],[64.99999999999999,101.99],[65.32999999999998,98.99],[65.82999999999998,98.32],[64.66999999999999,98.16],[66.32999999999998,96.99],[68.48999999999998,95.52],[69.32999999999998,95.33],[71.32999999999998,94],[72.15999999999998,93.18],[72.99999999999999,91.67],[73.99999999999999,90.34],[74.32999999999998,90.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.851,0.2118,0.1804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[71.37519343614406,97.02338095727174]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[71.37519343614406,97.02338095727174]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 186","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 185","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.45000000000000284,-0.19000000000000483],[0.15000000000000568,0.22999999999999687],[-0.35999999999999943,0.030000000000001137]],"o":[[0.6200000000000045,0.07000000000000028],[-0.10999999999999943,-0.09000000000000341],[0.3299999999999983,-0.14000000000000057],[0,0]],"v":[[109.67,36.67],[109.34,37.34],[108.67,37.010000000000005],[109.67,36.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9569,0.949]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[109.31500846852134,37.00499131361866]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[109.31500846852134,37.00499131361866]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 187","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 186","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0.21999999999999886],[-0.6499999999999915,0.09000000000000341]],"o":[[0,0],[0.04000000000000625,-0.17999999999999972],[0.2600000000000051,-0.04999999999999716],[0,0]],"v":[[108,40.67],[106.67,42],[106.67,41.33],[108,40.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.3922,0.3725]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[107.33502684092292,41.329993403680305]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.33502684092292,41.329993403680305]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 188","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 187","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-1.5700000000000003],[0.4200000000000017,-0.020000000000003126],[0.21999999999999886,0.6300000000000026]],"o":[[0.4200000000000017,0.259999999999998],[-0.37000000000000455,0.07000000000000028],[0.09999999999999432,-0.20000000000000284],[0,0]],"v":[[106,40.33],[106.67,41.33],[105.34,41.33],[106.01,40.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.3922,0.3725]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[106.00502711863874,40.84353703329515]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[106.00502711863874,40.84353703329515]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 189","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 188","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.9200000000000017,0.240000000000002],[0.060000000000002274,0.4200000000000017],[0.04000000000000625,0.3200000000000003],[-0.4099999999999966,-0.10000000000000142]],"o":[[-0.35999999999999943,0.6300000000000026],[0.04000000000000625,-1.1400000000000006],[-0.04999999999999716,-0.3100000000000023],[0.45999999999999375,0.17999999999999972],[0,0]],"v":[[114.33,39.67],[113.33,41],[113,39.67],[113,38.67],[114.33,39.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.4235,0.4039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[113.65727772449509,39.85416325943058]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[113.65727772449509,39.85416325943058]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 190","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 189","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12000000000000455,-0.7899999999999991],[0.45999999999999375,0.9100000000000037],[2.1599999999999966,-0.6700000000000017],[-0.12000000000000455,0.10000000000000142],[-0.28999999999999204,0.2700000000000031]],"o":[[0.8900000000000006,-0.3200000000000003],[-0.20999999999999375,1.3200000000000003],[-0.12999999999999545,-0.259999999999998],[-0.04999999999999716,-0.03999999999999915],[0.3100000000000023,-0.2700000000000031],[0,0]],"v":[[96.33,39.33],[97,41],[95.43,41.26],[94.33000000000001,41],[95.00000000000001,40],[96.33000000000001,39.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.902,0.8902]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[95.7022317123733,40.621860460657444]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[95.7022317123733,40.621860460657444]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 191","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 190","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.1599999999999966,-0.13000000000000256],[1.5,0.060000000000002274],[-0.010000000000005116,0.3299999999999983],[-0.480000000000004,0.1599999999999966]],"o":[[0.45000000000000284,0.10999999999999943],[-0.25,1.5],[0,-0.3299999999999983],[0.18999999999999773,-0.7299999999999969],[0,0]],"v":[[114.33,39.67],[116.33,39.67],[113.33,42],[113.33,41],[114.33,39.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8706,0.8588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[114.82782238496725,40.8165365600274]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[114.82782238496725,40.8165365600274]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 192","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 191","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.0799999999999983,-0.07000000000000028],[-0.09000000000000341,-0.21999999999999886],[-0.5100000000000051,1.9899999999999949],[-0.12999999999999545,0.8000000000000043]],"o":[[1.0100000000000051,0.45000000000000284],[0.09000000000000341,0.0799999999999983],[-0.3199999999999932,1.1799999999999997],[0.45999999999999375,-0.6599999999999966],[0,0]],"v":[[97.67,41.33],[99.67,41.33],[99.67,42.33],[97,43],[97.67,41.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.851,0.8392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[98.31762514102351,42.649742301244345]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[98.31762514102351,42.649742301244345]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 193","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 192","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3999999999999915,-0.09000000000000341],[-0.20000000000000284,-0.5700000000000003],[1.1400000000000006,-0.5399999999999991],[-0.010000000000005116,0.29999999999999716],[-0.04000000000000625,0.3100000000000023],[-0.39000000000000057,-0.07000000000000028]],"o":[[0.39000000000000057,0.07000000000000028],[-0.12000000000000455,0.6400000000000006],[-0.8499999999999943,0],[-0.12999999999999545,-0.13000000000000256],[0,-0.1700000000000017],[0.4300000000000068,0.03999999999999915],[0,0]],"v":[[119,35.67],[120.33,36.34],[120.66,38.010000000000005],[117.66,38.010000000000005],[117.99,36.68000000000001],[117.66,35.68000000000001],[118.99,35.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.902,0.8863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[119.14825638906137,36.833036217002245]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[119.14825638906137,36.833036217002245]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 194","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 193","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.10000000000000853,-0.37999999999999545],[0.10999999999999943,-0.4299999999999997],[0.4399999999999977,0.4299999999999997],[0.12999999999999545,-0.3400000000000034],[0.1700000000000017,0.36999999999999744],[0.10999999999999943,0.3200000000000003],[-1.0699999999999932,0.21999999999999886]],"o":[[0.060000000000002274,0.060000000000002274],[0.09000000000000341,0.3400000000000034],[0.29000000000000625,0.5700000000000003],[-0.3100000000000023,0.1599999999999966],[-0.060000000000002274,-0.11999999999999744],[-0.12000000000000455,-0.259999999999998],[1.2199999999999989,0],[0,0]],"v":[[123,37],[123.68,37.22],[123.33000000000001,39],[122.66000000000001,39.33],[121.99000000000001,40],[120.99000000000001,39],[120.66000000000001,38],[122.99000000000001,37]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8627,0.8431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[122.17776323189199,38.49499347185045]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[122.17776323189199,38.49499347185045]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 195","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 194","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8400000000000034,-0.11999999999999744],[0.23999999999999488,-0.5],[-1.5699999999999932,1.4299999999999997],[-0.9699999999999989,1.0899999999999963],[-0.8299999999999983,0.7399999999999949],[-1.2399999999999949,-0.759999999999998]],"o":[[0.8199999999999932,0.5799999999999983],[-0.4399999999999977,0.020000000000003126],[-0.09999999999999432,-0.10999999999999943],[0.06999999999999318,-0.17999999999999972],[1.0499999999999972,-0.35999999999999943],[0.1700000000000017,1.3599999999999994],[0,0]],"v":[[106,40.33],[105.33,41.33],[104,41.66],[104,40.489999999999995],[103.67,39.33],[106,38],[106,40.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8471,0.8314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[104.82853100847464,39.82998922715362]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[104.82853100847464,39.82998922715362]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 196","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 195","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.45999999999999375,-0.020000000000003126],[-0.8799999999999955,-0.35999999999999943],[0.5400000000000063,-0.03999999999999915],[-0.3400000000000034,1.3699999999999974],[1.0100000000000051,1.9099999999999966],[-0.4299999999999926,0.1599999999999966]],"o":[[0.4200000000000017,-0.1599999999999966],[0.0799999999999983,0.07000000000000028],[-0.09999999999999432,0.020000000000003126],[0.18999999999999773,1.1599999999999966],[0.4000000000000057,-1.1799999999999997],[1.019999999999996,0.5399999999999991],[0,0]],"v":[[111.33,43],[112.66,42.67],[112.66,44.67],[110.99,45.67],[109.66,45.67],[109.66,43.34],[111.32,43.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8863,0.8784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[111.14162581559776,44.644453269217365]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[111.14162581559776,44.644453269217365]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 197","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 196","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.03999999999999204,-0.5],[-0.07000000000000739,-0.23999999999999488],[0.8799999999999955,-0.29999999999999716],[0.5999999999999943,0.13999999999999346],[-1.8599999999999994,0.8699999999999974],[-0.3299999999999983,0.21999999999999886]],"o":[[1.2999999999999972,-0.1700000000000017],[0.01999999999999602,0.18999999999999773],[0.480000000000004,1.5900000000000034],[-0.480000000000004,0.1599999999999966],[0.18999999999999773,-1.9200000000000017],[0.28000000000000114,-0.13000000000000256],[0,0]],"v":[[101.67,42.67],[101.99,43.82],[102.66,44.23],[101.25,45.419999999999995],[100,46.01],[100.66,43.01],[101.66,42.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8863,0.8784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[101.23110857163314,44.339555923463195]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[101.23110857163314,44.339555923463195]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 198","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 197","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.20999999999999375,-1.3299999999999983],[0.10999999999999943,-0.13999999999999346],[0.730000000000004,0.5900000000000034],[-0.09000000000000341,0.4099999999999966],[-0.6700000000000017,0.28999999999999915]],"o":[[1.4899999999999949,-0.20000000000000284],[0.030000000000001137,0.21000000000000085],[-0.29999999999999716,0.36999999999999744],[-0.23000000000000398,-0.7700000000000031],[0.21999999999999886,-0.5900000000000034],[0,0]],"v":[[108,40.67],[109,42.34],[109.33,43],[106,44.01],[106.67,42.01],[108,40.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8941,0.8863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[107.65389715551896,42.398587143343406]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.65389715551896,42.398587143343406]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 199","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 198","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.1699999999999875,-0.6000000000000014],[-0.009999999999990905,-0.07000000000000028],[0.6700000000000017,-0.14000000000000057],[1.1799999999999926,-0.13000000000000256],[1.0100000000000051,0.4799999999999969],[-0.35999999999999943,0.14999999999999858],[0.060000000000002274,-0.30999999999999517],[-0.8900000000000006,0.10000000000000142],[-0.9000000000000057,-0.6799999999999997]],"o":[[-0.20999999999999375,0.259999999999998],[-0.14000000000000057,0.46999999999999886],[0.37999999999999545,0.46000000000000085],[-1.1899999999999977,-0.39000000000000057],[0.8599999999999994,-1.3299999999999983],[0.06999999999999318,-0.6099999999999994],[0.5100000000000051,-0.09000000000000341],[0.3199999999999932,0.2700000000000031],[0.8199999999999932,-0.09000000000000341],[0,0]],"v":[[113.67,37],[112.71000000000001,37.92],[113.01,38.67],[113.01,39.67],[109.68,39.67],[107.68,37.67],[108.68,37.010000000000005],[109.35000000000001,37.34],[110.48,38.010000000000005],[113.68,37.00000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8863,0.8745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[110.68004013548025,38.251063652538676]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[110.68004013548025,38.251063652538676]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 200","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 199","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6800000000000068,-0.5500000000000043],[0.11999999999999034,-0.740000000000002],[-0.39000000000000057,0.20000000000000284],[0,0],[0,0],[0,0],[1.0499999999999972,0.030000000000001137],[0.6400000000000006,1.8599999999999994],[0,0],[0.5999999999999943,0.7199999999999989],[-0.3299999999999983,0.8599999999999994],[0.5400000000000063,0.7000000000000028],[0.20000000000000284,0.4399999999999977],[-0.0799999999999983,0.12000000000000455],[0.3299999999999983,0.480000000000004],[0.09999999999999432,0],[-0.5900000000000034,0.0799999999999983],[-0.23999999999999488,0.6000000000000014],[0.20000000000000284,0.21000000000000085],[0.03999999999999204,0.03999999999999915],[-0.3400000000000034,-1.2000000000000028]],"o":[[-0.37000000000000455,0.75],[0.519999999999996,-0.45000000000000284],[0,0.03999999999999915],[0,0],[0,0],[0,0],[0.14000000000000057,0.7299999999999969],[1.4300000000000068,0.8400000000000034],[0,0],[0.04999999999999716,0.9500000000000028],[-0.9899999999999949,0.6499999999999986],[-0.5699999999999932,-0.4099999999999966],[-0.35999999999999943,-0.21999999999999886],[0.0799999999999983,-0.46999999999999886],[0.3299999999999983,0.030000000000001137],[-0.09000000000000341,-0.020000000000003126],[-0.5600000000000023,0],[0.4099999999999966,0.25],[0.09999999999999432,-0.259999999999998],[-0.1599999999999966,-0.1700000000000017],[-0.3400000000000034,-1.0499999999999972],[0,0]],"v":[[105.33,41.33],[106,44],[108.7,43.07],[109,42.33],[110.16,42.989999999999995],[111.66,41.66],[111.33,42.989999999999995],[109.66,45.66],[108.49,47.279999999999994],[108,47.32999999999999],[107,47.65999999999999],[106,47.32999999999999],[104.33,45.65999999999999],[103.33,44.65999999999999],[104,43.98999999999999],[104,43.319999999999986],[103.67,43.319999999999986],[103.67,42.649999999999984],[104.67,42.47999999999998],[104.13,42.18999999999998],[104,41.649999999999984],[105.33,41.319999999999986]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2824,0.2667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[107.44937827396623,44.373144790871464]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.44937827396623,44.373144790871464]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 201","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 200","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.14999999999999147,-0.720000000000006],[0,0],[-0.23000000000000398,-0.10000000000000142],[1.0900000000000034,0.28999999999999915],[0.2600000000000051,-0.240000000000002],[0.7900000000000063,0.740000000000002],[0,0],[-0.37999999999999545,0.3299999999999983],[0.789999999999992,1.3100000000000023],[0,0],[0.789999999999992,0.2700000000000031],[-0.4899999999999949,0.28999999999999915],[-0.9699999999999989,0.4299999999999997],[-0.37000000000000455,0.030000000000001137]],"o":[[0.8400000000000034,0.060000000000002274],[0,0],[0.23000000000000398,0.10000000000000142],[0.9899999999999949,0.5399999999999991],[-0.25,0.35999999999999943],[0.0799999999999983,1.0799999999999983],[0,0],[-0.6299999999999955,-0.2700000000000031],[0.10999999999999943,-0.10000000000000142],[0,0],[-0.010000000000005116,-0.8599999999999994],[0.45999999999999375,-0.4799999999999969],[0.8100000000000023,0.21000000000000085],[0.29000000000000625,0.07000000000000028],[0,0]],"v":[[95,40],[96.24,41.27],[97,41],[97.67,41.33],[97,43],[95.67,44.67],[93.67,45.67],[93,44],[93.47,42.6],[91.34,43.67],[90.88000000000001,43.7],[89.67000000000002,42],[91.34000000000002,40],[94.01000000000002,39.67],[95.01000000000002,40]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2824,0.2627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[93.92561450451444,42.82727066178629]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[93.92561450451444,42.82727066178629]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 202","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 201","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.0900000000000034,-0.46000000000000085],[0,0],[1.5300000000000011,1.8999999999999986],[-0.5100000000000051,-0.28999999999999915],[-0.1599999999999966,-0.28999999999999915],[0.45999999999999375,-0.12000000000000455],[0.75,0.259999999999998],[0.3200000000000074,-0.29999999999999716],[1.0100000000000051,0.1599999999999966],[1.230000000000004,0.05999999999999517],[0.5,1.2800000000000011],[-0.4000000000000057,1.509999999999998],[-1.1899999999999977,-1.3200000000000003],[0.3999999999999915,-0.5300000000000011],[0.9500000000000028,-0.21999999999999886],[0.19000000000001194,-1.490000000000002],[-0.2600000000000051,-0.4899999999999949],[0.28000000000000114,-0.12999999999999545],[0.10999999999999943,0.28999999999999915],[-1.6899999999999977,0.3100000000000023],[-0.04000000000000625,0.75],[-0.8599999999999994,-0.5700000000000003],[0.28000000000000114,0.21999999999999886],[-0.18000000000000682,-0.3200000000000003],[0.030000000000001137,1.2000000000000028],[-0.17333333333333675,-0.4200000000000017],[0,0],[0.030000000000001137,-0.8699999999999974],[0.8599999999999994,0.5499999999999972],[0.04000000000000625,0.9200000000000017],[-0.20999999999999375,0.1700000000000017],[0.09000000000000341,1.029999999999994],[-0.9399999999999977,1.1400000000000006],[-0.7800000000000011,0.5700000000000003],[0.46000000000000796,-0.6000000000000014],[0,0],[-0.3200000000000074,1.0899999999999963],[-0.28999999999999204,0.01999999999999602],[0.7999999999999972,-0.5100000000000051],[0.769999999999996,1.980000000000004],[0,0],[-0.8999999999999915,-0.3500000000000014],[-0.5,0.5900000000000034],[0,0],[-0.5499999999999972,-0.010000000000005116],[-1.5600000000000023,0.5600000000000023],[-0.6600000000000108,-0.5799999999999983],[0,0],[-0.37000000000000455,0.4799999999999969],[-0.14999999999999147,0.05000000000000426]],"o":[[0.75,0.7299999999999969],[0,0],[1.6700000000000017,0.07000000000000028],[-0.5300000000000011,0.1599999999999966],[0.060000000000002274,-0.3100000000000023],[0.3100000000000023,0.29999999999999716],[0.29999999999999716,0.7000000000000028],[0.5400000000000063,0.35999999999999943],[0.9200000000000017,0.5],[0.2600000000000051,1],[-0.010000000000005116,1.4500000000000028],[-1.4000000000000057,0.11999999999999744],[-1.5300000000000011,-0.04999999999999716],[-0.5699999999999932,0.5499999999999972],[-0.8299999999999983,0.45000000000000284],[-0.9300000000000068,0.3200000000000003],[-0.9200000000000017,0.13000000000000256],[0.29000000000000625,0.09000000000000341],[-0.8400000000000034,0.4299999999999997],[-2.260000000000005,-0.3500000000000014],[1.0799999999999983,-0.35999999999999943],[-0.4399999999999977,-0.9799999999999969],[0.060000000000002274,-0.22999999999999687],[-0.5499999999999972,-0.4099999999999966],[0.04999999999999716,0.0799999999999983],[-0.17333333333333675,-0.4200000000000017],[0,0],[-0.5499999999999972,0.8500000000000014],[0.14000000000000057,0.8999999999999986],[-0.5900000000000034,0.6799999999999997],[-0.15000000000000568,-0.25],[0.75,-0.6400000000000006],[-0.4899999999999949,-0.8599999999999994],[-0.8900000000000006,-0.75],[0.6099999999999994,-0.46000000000000085],[0,0],[0.29999999999999716,1.2000000000000028],[0.06999999999999318,-0.240000000000002],[0.9300000000000068,-0.35999999999999943],[0.12000000000000455,1.5600000000000023],[0,0],[-0.5699999999999932,-0.7899999999999991],[0.730000000000004,0.6000000000000014],[0,0],[0.20000000000000284,0.5],[-0.6400000000000006,1.6599999999999966],[-0.9300000000000068,-0.4299999999999997],[0,0],[1.3100000000000023,-0.8800000000000026],[0.10999999999999943,-0.14999999999999858],[0,0]],"v":[[103.67,39.33],[103.86,41.21],[104,41.67],[103.67,42.67],[103.67,43.34],[104,43.34],[104,44.010000000000005],[103.33,44.68000000000001],[103.66,45.68000000000001],[102.99,47.35000000000001],[101.99,49.02000000000001],[99.99,49.69000000000001],[98.17,47.79000000000001],[97.66,49.69000000000001],[95.33,51.69000000000001],[92.66,52.69000000000001],[90.97999999999999,55.41000000000001],[89.99,56.35000000000001],[89.99,56.68000000000001],[88.57,56.89000000000001],[88.66,53.68000000000001],[90.33,52.010000000000005],[92.33,50.68000000000001],[92,50.010000000000005],[92.04,49.690000000000005],[90.66000000000001,49.34],[90.66000000000001,49.34],[90.87,49.760000000000005],[90,52.34],[88.67,53.34],[87.67,53.010000000000005],[87.64,52.260000000000005],[88.34,50.35000000000001],[89.01,47.35000000000001],[90.01,44.02000000000001],[90.34,44.35000000000001],[91.08,44.540000000000006],[92.26,44.35000000000001],[93,44.02000000000001],[93.67,45.69000000000001],[95.11,45.20000000000001],[95.67,44.69000000000001],[97,43.02000000000001],[98.93,42.38000000000001],[99.67,42.35000000000001],[100.67,43.02000000000001],[102.05,44.67000000000001],[101.92,43.27000000000001],[101.67,42.68000000000001],[103.04,39.38000000000001],[103.67,39.35000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2902,0.2745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[96.08710539545879,48.19089029339736]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[96.08710539545879,48.19089029339736]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 203","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 202","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.09000000000000341,0.589999999999975],[0.14000000000001478,-0.4300000000000068]],"o":[[-0.6399999999999864,-0.160000000000025],[0.1599999999999966,-0.339999999999975],[0,0]],"v":[[231.66,308.33],[231,307],[231.66,308.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5294,0.5373,0.549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[231.32631554658454,307.63584038423323]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[231.32631554658454,307.63584038423323]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 204","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 203","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.29999999999999716,0.04999999999999716],[0,0],[-0.28000000000000114,0.04999999999999716],[-0.1700000000000017,-0.060000000000002274]],"o":[[0.15000000000000568,0.04999999999999716],[0,0],[0.1700000000000017,-0.28000000000000114],[0.10999999999999943,-0.01999999999999602],[0,0]],"v":[[91.67,90.33],[92.34,90.66],[90.34,90.99],[91.17,90.03],[91.67,90.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6941,0.2784,0.2275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[91.3400181333518,90.50943965143256]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.3400181333518,90.50943965143256]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 205","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 204","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.1099999999999994,-0.710000000000008],[0.01999999999999602,0.5400000000000063],[0,0]],"o":[[-0.1700000000000017,2.1400000000000006],[-1.3400000000000034,-0.519999999999996],[0,0],[0,0]],"v":[[94.67,88.33],[93.34,90],[93.01,88],[94.68,88.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6667,0.3765,0.3255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[93.66540279273454,89.0000007352605]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[93.66540279273454,89.0000007352605]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 206","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 205","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7800000000000011,0.6200000000000045],[-1.3599999999999994,-0.4300000000000068]],"o":[[0.3299999999999983,0.5699999999999932],[-0.20999999999999375,-0.1700000000000017],[0,0]],"v":[[95.66,79],[94.67,82.66],[95.66,79]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6667,0.4784,0.4353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[95.14480579725085,80.84833592039212]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[95.14480579725085,80.84833592039212]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 207","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 206","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.730000000000004,-0.060000000000002274],[0.04000000000000625,-0.5],[-0.01999999999999602,0.9500000000000028],[0.060000000000002274,0.12999999999999545]],"o":[[0.4399999999999977,-0.6700000000000017],[-0.29000000000000625,0.6500000000000057],[-0.09000000000000341,1],[0,-0.04999999999999716],[0,0]],"v":[[92.67,87],[94.67,86.34],[94.67,88.34],[93,88.01],[92.67,87.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6745,0.4902,0.451]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[93.67175233270683,87.62553432865624]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[93.67175233270683,87.62553432865624]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 208","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 207","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.1400000000000006,-0.25],[-0.5100000000000051,0.3299999999999983]],"o":[[1.2600000000000051,-0.8100000000000023],[-0.9500000000000028,0.20999999999999375],[0,0]],"v":[[92,76.67],[93.16,79.67],[92,76.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6941,0.5294,0.4863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[92.74079830749014,78.11564519062372]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[92.74079830749014,78.11564519062372]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 209","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 208","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.2199999999999989,-0.6299999999999955],[0.12000000000000455,0.7199999999999989],[0.3100000000000023,0.7299999999999898],[0,0],[-0.8199999999999932,-0.3200000000000074],[0,0]],"o":[[-0.5100000000000051,0.8100000000000023],[-0.8599999999999994,-0.5300000000000011],[0,-0.060000000000002274],[0,0],[0.5100000000000051,-0.5400000000000063],[0,0],[0,0]],"v":[[92.67,90.67],[90.84,93.66],[90.69,91.88],[90,91],[90.33,91],[92.33,90.67],[92.66,90.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7137,0.5216,0.4745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[91.33504200484683,92.07569600287397]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.33504200484683,92.07569600287397]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 210","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 209","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.1600000000000108,-0.1700000000000017],[-0.28000000000000114,-0.46999999999999886],[0.3100000000000023,-0.29999999999999716],[0.28000000000000114,0.7000000000000028],[0.010000000000005116,0.22000000000001307],[-0.06999999999999318,0.10999999999999943]],"o":[[0.3499999999999943,0.37000000000000455],[0.09999999999999432,0.10999999999999943],[-0.4000000000000057,0.25],[-1.9699999999999989,-0.20999999999999375],[-0.14000000000000057,-0.35999999999999943],[0,-0.20000000000000284],[0,0]],"v":[[89.67,81.67],[91.29,82.05],[92.28,84.83],[91.34,85.67],[90.18,83.34],[89.01,82.16],[89.67,81.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7373,0.5922,0.549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[90.64503212183897,83.66498389029582]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[90.64503212183897,83.66498389029582]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 211","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 210","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.04999999999999716,-0.0799999999999983],[-0.13000000000000966,-0.1599999999999966],[0.9500000000000028,-2.030000000000001],[0.37999999999999545,0.5699999999999932],[1.4599999999999937,0.46999999999999886],[-0.5900000000000034,-0.14999999999999147]],"o":[[0.7900000000000063,0.6299999999999955],[0.3199999999999932,0.4300000000000068],[0.29999999999999716,0.37999999999999545],[-0.5499999999999972,-0.8299999999999983],[-0.2600000000000051,-0.39000000000000057],[0.21999999999999886,-0.06999999999999318],[0,0]],"v":[[89,72.67],[90.66,73.34],[90,74.66],[90.66,76.67],[88.49,76.01],[87.67,73.34],[89,72.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7098,0.5451,0.5098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[89.33511605420065,74.66009217745781]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[89.33511605420065,74.66009217745781]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 212","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 211","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.060000000000002274,-0.7999999999999972],[0.01999999999999602,-0.030000000000001137],[0.5799999999999983,0.7600000000000051],[-0.0799999999999983,0.710000000000008],[0.060000000000002274,0.6799999999999926]],"o":[[0,0],[-0.18000000000000682,0.8900000000000006],[0,0.04000000000000625],[0.3199999999999932,0.9099999999999966],[-2.480000000000004,1],[0.060000000000002274,-0.5300000000000011],[0,0]],"v":[[86,77.67],[88,77.34],[88.33,80.01],[88,80.68],[87.33,81.01],[86.27,79.78],[85.99,77.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7373,0.5882,0.5529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.08588606545737,79.4128621783174]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.08588606545737,79.4128621783174]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 213","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 212","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.010000000000005116,0.5300000000000011],[0.010000000000005116,-0.5300000000000011]],"o":[[-0.5499999999999972,-0.3199999999999932],[0.5300000000000011,0.3199999999999932],[0,0]],"v":[[122.67,125],[122.34,123.33],[122.67,125]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3333,0.3373,0.3451]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[122.50594885904934,124.16498718168958]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[122.50594885904934,124.16498718168958]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 214","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 213","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.04999999999999716,0.12000000000000455],[-0.2600000000000051,0.37000000000000455],[-0.06999999999999318,-0.6899999999999977]],"o":[[-0.09999999999999432,-0.10999999999999943],[-0.1700000000000017,-0.37000000000000455],[0.06999999999999318,0.37999999999999545],[0,0]],"v":[[122.33,122.67],[122,122.34],[122,121.34],[122.33,122.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3333,0.3373,0.3451]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[122.08355516703665,122.00498912929675]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[122.08355516703665,122.00498912929675]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 215","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 214","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0.6299999999999955],[-0.01999999999999602,-0.6299999999999955]],"o":[[-0.5600000000000023,-0.37000000000000455],[0.5699999999999932,0.37000000000000455],[0,0]],"v":[[124,137.67],[123.67,135.67],[124,137.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3412,0.3412,0.349]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[123.8327240500623,136.66999811458368]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[123.8327240500623,136.66999811458368]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 216","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 215","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0.839999999999975],[-0.01999999999999602,-0.839999999999975]],"o":[[-0.5900000000000034,-0.5600000000000023],[0.5999999999999943,0.5600000000000023],[0,0]],"v":[[123.67,135.33],[123.34,132.66000000000003],[123.67,135.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3412,0.3412,0.349]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[123.50286644372741,133.99499066644438]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[123.50286644372741,133.99499066644438]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 217","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 216","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.010000000000005116,1.3599999999999994],[-0.09999999999999432,-0.8400000000000034]],"o":[[-0.18000000000000682,-1.1700000000000017],[0.6700000000000017,0.5799999999999983],[0,0]],"v":[[123,128.67],[122.67,125.99999999999999],[123,128.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3333,0.3373,0.3451]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[122.86028901762853,127.33498008447151]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[122.86028901762853,127.33498008447151]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 218","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 217","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.46999999999999886,-0.28000000000000114],[0,0],[-0.6900000000000261,0.45999999999999375],[0,0]],"o":[[-0.960000000000008,0.6400000000000006],[0,0],[0.5300000000000011,-0.39000000000000057],[0,0],[0,0]],"v":[[132.33,115],[130,116],[129.67,115.67],[132,114.67],[132.33,115]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2157,0.2157,0.2157]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[131.00002107634208,115.33498648128591]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[131.00002107634208,115.33498648128591]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 219","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 218","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.0700000000000216,-0.8599999999999994],[0,0],[-1.579999999999984,1.1499999999999915],[0.23999999999998067,-0.45000000000000284]],"o":[[-0.8100000000000023,0.46999999999999886],[0,0],[-0.12000000000000455,-1.3900000000000006],[0.46000000000000796,-0.18000000000000682],[0,0]],"v":[[130,116],[129.33,119.33],[129,120],[129.67,115.67],[130,116]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2667,0.2627,0.2627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[129.41010820998827,117.78776003039496]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[129.41010820998827,117.78776003039496]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 220","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 219","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.01999999999999602,-2],[0,0],[0,0],[-0.3500000000000014,-0.3100000000000023],[-1.0799999999999983,-1.289999999999992]],"o":[[1.1799999999999997,1.4099999999999966],[0,0],[0,0],[0.25,-0.21999999999999886],[1.259999999999998,1.1100000000000136],[0,0]],"v":[[61.47,198.19],[64.33,203],[63.449999999999996,202.55],[55,192.34],[58,194.5],[61.47,198.2]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0235,0.0353,0.0353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[59.665029461599715,197.6618080641146]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[59.665029461599715,197.6618080641146]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 221","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 220","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-0.6200000000000045,-0.09000000000000341]],"o":[[0,0],[0,0],[0.18000000000000682,-0.6599999999999966],[0,0]],"v":[[214,73],[214,73.66],[212.67,73.66],[214,73]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3176,0.3451,0.3647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[213.3350234144328,73.31534321028496]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[213.3350234144328,73.31534321028496]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 222","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 221","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5599999999999739,-1.8599999999999994],[0.4000000000000057,-1.3599999999999994],[0.6599999999999966,-2.3499999999999943],[0.45999999999997954,-1.8199999999999932],[0,0],[-1.3099999999999739,4.429999999999993],[-0.9499999999999886,3.0999999999999943],[0.13999999999998636,-0.8599999999999994]],"o":[[-0.5900000000000034,1.8799999999999955],[-0.4000000000000057,1.3299999999999983],[-0.6999999999999886,2.3400000000000034],[-0.44999999999998863,1.5900000000000034],[0,0],[1.1599999999999966,-4.480000000000004],[0.9199999999999875,-3.1200000000000045],[0.36000000000001364,-0.20000000000000284],[0,0]],"v":[[183.67,92.67],[182,98.34],[180.67,102.34],[178.67,109.34],[177,114.67],[176.67,114.34],[180.33999999999997,101.01],[183.33999999999997,91.68],[183.67,92.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0667,0.0745,0.0784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[180.19942159939913,103.1471340747822]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[180.19942159939913,103.1471340747822]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 223","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 222","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-3.069999999999993,-0.519999999999996],[-2.9499999999999886,-0.8499999999999943],[0,0],[0,0],[2.039999999999992,1.3599999999999994],[-0.539999999999992,0.7900000000000063],[-0.27000000000001023,-1.4500000000000028],[1.049999999999983,0.09000000000000341],[0.5199999999999818,-0.3100000000000023],[1.5,0.10999999999999943],[0.5800000000000125,0.45000000000000284],[0.5500000000000114,0.20999999999999375],[0.36000000000001364,-1.0300000000000011],[0,0],[1.7300000000000182,0.39000000000000057],[0,0],[0.22999999999998977,0.11000000000001364],[0.25,-0.3299999999999983],[0,0],[0.3200000000000216,-0.18000000000000682],[0.4399999999999977,-0.5499999999999972],[0.03999999999999204,-0.07000000000000739],[0.01999999999998181,-0.29999999999999716],[-1.4299999999999784,-1.5100000000000051],[0.1799999999999784,-0.12999999999999545],[0.12999999999999545,-0.14999999999999147],[-0.27000000000001023,-1.269999999999996],[0,0],[0,0],[-0.12000000000000455,-1.3199999999999932],[0.18999999999999773,-0.38000000000000966],[0.06999999999999318,-0.39000000000000057],[-0.4300000000000068,-1.3800000000000097],[-0.14000000000001478,0.14000000000000057],[3.3400000000000034,1.9099999999999966],[0,0],[0.30000000000001137,-0.29000000000000625],[0.5300000000000011,-0.769999999999996],[-0.19999999999998863,-0.6700000000000017],[0.710000000000008,-1.980000000000004],[0.1599999999999966,-0.539999999999992],[-0.6999999999999886,-0.9699999999999989],[0.18000000000000682,-1.0499999999999972],[0,0],[-1,1.5999999999999943],[-2.390000000000015,6.819999999999993],[-0.8499999999999943,-0.730000000000004],[-1.0400000000000205,0.23999999999999488]],"o":[[2.930000000000007,-0.29999999999999716],[2.9499999999999886,0.6700000000000017],[0,0],[0,0],[-1.490000000000009,-0.6599999999999966],[0.8199999999999932,-0.3400000000000034],[-1.1500000000000057,0.28000000000000114],[-1.25,-1.2199999999999989],[-0.5200000000000102,-0.04999999999999716],[-0.0800000000000125,0.04999999999999716],[0.8899999999999864,-1.1599999999999966],[-0.05000000000001137,-0.04000000000000625],[-1.0800000000000125,0.3199999999999932],[0,0],[1.1399999999999864,1.0699999999999932],[0,0],[-0.9900000000000091,0.29999999999999716],[-0.7800000000000011,-0.37000000000000455],[0,0],[2.2700000000000102,1.8900000000000006],[-0.3200000000000216,0.18000000000000682],[-0.4399999999999977,0.5499999999999972],[-0.15000000000000568,0.28000000000000114],[-0.009999999999990905,0.20999999999999375],[-0.4900000000000091,-0.09999999999999432],[-0.46000000000000796,0.3400000000000034],[-0.27000000000001023,0.29999999999999716],[0,0],[0,0],[0.2400000000000091,0.04000000000000625],[-0.19999999999998863,0.7900000000000063],[-0.28999999999999204,0.5600000000000023],[-0.11000000000001364,0.6299999999999955],[-0.75,-0.01999999999999602],[0.12999999999999545,-0.12000000000000455],[0,0],[3.4000000000000057,0.8599999999999994],[-0.4900000000000091,0.46999999999999886],[-0.9099999999999966,-0.9300000000000068],[-0.4000000000000057,0.23000000000000398],[-0.2599999999999909,1.0400000000000063],[-0.30000000000001137,0.9899999999999949],[0.15000000000000568,0.20999999999999375],[0,0],[-0.12999999999999545,-1.8599999999999994],[1.490000000000009,-7.060000000000002],[0.30000000000001137,-0.9399999999999977],[0.9699999999999989,0.3299999999999983],[0,0]],"v":[[196.33,69.67],[205.33,70],[214.33,71],[213,71.34],[213.66,72.67],[209.66,73.51],[211.66,72.01],[209.99,73.01],[206.51000000000002,72.67],[204.66000000000003,72.01],[203.66000000000003,73.34],[202.05,72.3],[201.84,71.36],[200.34,72.85],[201.17000000000002,72.00999999999999],[200.34,73.99999999999999],[201,73.33999999999999],[199.84,72.65999999999998],[199.34,74.66999999999999],[196.68,73.33999999999999],[196.66,74.49],[195.35,76.83999999999999],[194.03,77.71],[194.36,78.82],[194.34,80.33],[191.20000000000002,80.63],[191.00000000000003,82.00999999999999],[189.66000000000003,82.33999999999999],[189.00000000000003,81.35],[188.67000000000002,83.67999999999999],[190.33,82.83999999999999],[188.48000000000002,84.67999999999999],[188.60000000000002,86.13999999999999],[187.34000000000003,88.33999999999999],[186.67000000000004,86.33999999999999],[186.67000000000004,84.66999999999999],[185.33000000000004,88.99999999999999],[185.33000000000004,90.67999999999999],[186.33000000000004,92.67999999999999],[185.33000000000004,95.00999999999999],[183.00000000000003,95.85],[183.99000000000004,96.17999999999999],[182.66000000000003,98.00999999999999],[183.66000000000003,98.16999999999999],[182.00000000000003,98.33999999999999],[183.67000000000002,92.66999999999999],[189.85000000000002,71.88],[193.00000000000003,69.67],[196.33000000000004,69.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3176,0.3451,0.3647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[198.1580305195304,83.92268763330921]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[198.1580305195304,83.92268763330921]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 224","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 223","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3199999999999932,-0.04999999999999716],[0,0],[-1.6299999999999955,1.0799999999999983],[0.5,0.25],[-0.6800000000000068,0.75],[3.030000000000001,1.1800000000000068],[1.970000000000013,1.1599999999999966],[-1.9300000000000068,4.810000000000002],[-1.6000000000000085,-0.04000000000000625],[-6.180000000000007,0.4300000000000068],[-1.75,-1.7900000000000063],[0.839999999999975,-1.8400000000000034],[3.920000000000016,-2.1899999999999977]],"o":[[-0.13999999999998636,0.0799999999999983],[0,0],[1.3199999999999932,-1.3700000000000045],[0.03999999999999204,-0.5999999999999943],[-1.1100000000000136,-0.5499999999999972],[-3.0500000000000114,0.5799999999999983],[2.4399999999999977,3.9000000000000057],[-5.019999999999996,-2.950000000000003],[0.5900000000000034,-1.480000000000004],[5.8999999999999915,0.14000000000000057],[1.990000000000009,-0.14000000000000057],[1.5,1.5300000000000011],[-1.9099999999999966,4.140000000000001],[0,0]],"v":[[142.14,101.14],[141.57,101.78],[139.32999999999998,102.17],[144.32999999999998,99.33],[142.99999999999997,98.83],[142.99999999999997,96.33],[134.32999999999998,96.33],[127.68999999999998,98.13],[124.41999999999999,81.58],[126.83999999999999,80.31],[144.72,83.14],[151.68,83.14],[150.29000000000002,92.11],[142.14000000000001,101.13]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0196,0.0235,0.0235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[137.74820865542236,91.2266590051054]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[137.74820865542236,91.2266590051054]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 225","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 224","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.1100000000000136,1.9800000000000182],[-0.06999999999999318,1.4700000000000273],[-0.9800000000000182,-3.3000000000000114]],"o":[[-1.3600000000000136,-1.8100000000000023],[-0.6399999999999864,-1.1299999999999955],[2.7700000000000102,2.160000000000025],[0,0]],"v":[[197.33,290],[194.4,283.77],[192.34,280.34],[197.33,290.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0275,0.0392,0.0431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[194.83383734663775,285.17498962895155]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[194.83383734663775,285.17498962895155]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 226","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 225","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.11000000000001364,-1.740000000000002],[-0.0700000000000216,0.6299999999999955],[-0.7400000000000091,0.5899999999999963],[-0.010000000000019327,0.00999999999999801]],"o":[[-0.710000000000008,1.5600000000000023],[-1.0800000000000125,0.14999999999999858],[0.11000000000001364,-0.9699999999999989],[0.13999999999998636,-0.10999999999999943],[0,0]],"v":[[152,58.33],[151,63],[150.49,61.99],[151.67000000000002,58.160000000000004],[152.00000000000003,58.330000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.7569,0.5765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[151.15690442932615,60.580355522406904]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[151.15690442932615,60.580355522406904]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 227","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 226","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-0.20000000000000284,0.0799999999999983],[-1.8799999999999955,0.4100000000000037]],"o":[[0,0],[0,0],[-0.09000000000000341,-0.29999999999999716],[1.730000000000004,-0.7299999999999969],[0,0]],"v":[[128,51.67],[128.19,52.02],[121,54],[121.66,53.34],[127.99,51.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.898,0.7373,0.5608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[124.59013061754098,52.83499159996626]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[124.59013061754098,52.83499159996626]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 228","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 227","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.21999999999999886,0.05000000000000426],[-3.780000000000001,-0.8800000000000026],[0,0],[2.7900000000000063,-0.9500000000000028]],"o":[[-0.8400000000000034,-0.3299999999999983],[3.6999999999999886,-0.9799999999999969],[0,0],[-2.8100000000000023,-0.8200000000000003],[0,0]],"v":[[127,47.67],[127.6,47.11],[138.54999999999998,46.63],[138.32999999999998,47.010000000000005],[126.99999999999999,47.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.7686,0.5882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[132.62922545337082,46.90808417385392]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[132.62922545337082,46.90808417385392]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 229","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 228","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.539999999999992,0.07000000000000028],[2.3400000000000034,-0.3400000000000034],[0.07999999999998408,1.3599999999999994],[-1,0.9600000000000009]],"o":[[0.47999999999998977,-0.3400000000000034],[3.4099999999999966,-0.4099999999999966],[-1.8499999999999943,0.269999999999996],[-0.6100000000000136,-1.1499999999999986],[0,0]],"v":[[152,58.33],[153.51,57.32],[153.48,66.34],[151,63],[152,58.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0235,0.0275,0.0275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[153.214016048751,61.834369762420806]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[153.214016048751,61.834369762420806]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 230","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 229","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5500000000000114,-0.5900000000000034],[3.25,1.3700000000000045],[-0.010000000000019327,1.1099999999999994],[-0.6800000000000068,0.4000000000000057]],"o":[[0.710000000000008,-0.4099999999999966],[2.1500000000000057,2.3200000000000003],[-1.1100000000000136,-0.46999999999999886],[0.009999999999990905,-0.9500000000000028],[0,0]],"v":[[131.73,57.07],[134.19,57.64],[131.34,66.16],[129.67000000000002,62.5],[131.73000000000002,57.08]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0196,0.0235,0.0235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[132.403468455359,61.612504096899926]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[132.403468455359,61.612504096899926]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 231","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 230","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[4.189999999999998,-0.010000000000005116],[4.350000000000023,-0.9500000000000028],[2.019999999999996,-0.2600000000000051],[-0.2599999999999909,0.29999999999999716],[-1.2900000000000063,0.44000000000000483],[-3.3000000000000114,-1.1999999999999957]],"o":[[3.4199999999999875,1],[-4.189999999999998,0.010000000000005116],[-1.9099999999999966,0.7800000000000011],[-1.6299999999999955,0.14000000000000057],[0.9000000000000057,-1.0300000000000011],[3.219999999999999,-1.3200000000000003],[0,0]],"v":[[138.33,47],[137.83,51.03],[128,51.67],[121.67,53.34],[122.16,50.660000000000004],[127,47.67],[138.33,47]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0196,0.0235,0.0235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[130.97115953101337,49.84094464886175]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[130.97115953101337,49.84094464886175]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 232","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 231","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.28000000000000114,-0.12000000000000455],[0,0],[-0.269999999999996,0.10000000000002274]],"o":[[0,0],[-0.29000000000000625,0.21999999999999886],[0,0],[0.18999999999999773,-0.0800000000000125],[0,0]],"v":[[120.67,192],[121,192.33],[120,192.66000000000003],[120,192.33],[120.67,192]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1961,0.2,0.2]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[120.5000515541972,192.32998589365002]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[120.5000515541972,192.32998589365002]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 233","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 232","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6700000000000159,-0.22999999999998977],[0.46000000000000796,-0.27000000000001023],[0,0]],"o":[[0.3400000000000034,-0.12999999999999545],[-0.1599999999999966,0.6100000000000136],[0,0],[0,0]],"v":[[168,238],[169.33,237.34],[168,238.34],[168,238.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6,0.6078,0.6]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[168.66503438816298,237.81844853641104]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[168.66503438816298,237.81844853641104]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 234","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 233","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.6099999999999994,0.47999999999998977],[0,0]],"o":[[0,0],[0.3400000000000034,-0.7400000000000091],[0,0],[0,0]],"v":[[103.33,201],[101.66,202.33],[103.33,200.67000000000002],[103.33,201.00000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4471,0.451,0.4431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[102.49502530737183,201.49999550253875]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[102.49502530737183,201.49999550253875]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 235","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 234","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7599999999999909,-0.28000000000000114],[-0.37000000000000455,0.45999999999997954],[0,0]],"o":[[-0.5,0.47999999999998977],[-0.15000000000000568,-0.9199999999999875],[0,0],[0,0]],"v":[[102,211],[100.34,212.67],[101.67,211],[102,211]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3961,0.4039,0.4039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[101.16313465625575,211.83499641248807]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[101.16313465625575,211.83499641248807]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 236","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 235","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.25,-0.12000000000000455],[0.6599999999999966,-0.3199999999999932],[0,0],[-0.8200000000000216,0.3199999999999932]],"o":[[0.2599999999999909,0.09999999999999432],[-0.6399999999999864,0.36000000000001364],[0,0],[0.6899999999999977,-0.2599999999999909],[0,0]],"v":[[168,238],[168,238.33],[166,239.33],[165.67,239],[168,238]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4235,0.4275,0.4275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[166.93067446356795,238.66500742218415]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[166.93067446356795,238.66500742218415]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 237","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 236","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.9099999999999966,0.15000000000000568],[0,0],[-0.1700000000000017,0.3800000000000239]],"o":[[1.730000000000004,-0.6800000000000068],[0,0],[-0.37999999999999545,0.11000000000001364],[0,0]],"v":[[120.67,192],[126,190],[121,192.33],[120.67,192]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4196,0.4275,0.4235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[123.29727271841759,191.1895567628897]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[123.29727271841759,191.1895567628897]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 238","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 237","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.29000000000000625,-0.12000000000000455],[5.489999999999995,-2.880000000000024],[-0.15000000000000568,0.12000000000000455],[-5.769999999999996,2.3200000000000216]],"o":[[0.29000000000000625,0.09000000000000341],[-5.659999999999997,2.530000000000001],[-0.1599999999999966,-0.09999999999999432],[4.929999999999993,-3.9099999999999966],[0,0]],"v":[[120,192.33],[120,192.66000000000003],[103.33,200.99000000000004],[103.33,200.66000000000003],[120,192.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1804,0.1882,0.1922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[111.60685402178086,196.65999396898764]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[111.60685402178086,196.65999396898764]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 239","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 238","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.03999999999999204,0.6299999999999955],[-0.06999999999999318,-0.8199999999999932]],"o":[[-0.5900000000000034,-0.37999999999999545],[0.060000000000002274,0.5600000000000023],[0,0]],"v":[[123.33,137.67],[123,135.67],[123.33,137.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3412,0.3412,0.349]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[123.14434633720398,136.66999811458368]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[123.14434633720398,136.66999811458368]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 240","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 239","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.23999999999999488,0.8599999999999994],[0,0],[-0.2400000000000091,-0.5600000000000023]],"o":[[0,0],[-0.20999999999999375,-0.6700000000000017],[0,0],[-0.04999999999999716,0.6200000000000045],[0,0]],"v":[[93.33,98.67],[93,99],[92.67,97],[93,97],[93.34,98.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6196,0.6157,0.6118]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[92.96528141660463,97.99998598539264]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[92.96528141660463,97.99998598539264]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 241","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 240","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.46999999999999886,0.6299999999999955],[-0.04999999999999716,0],[-0.28000000000000114,-0.04000000000000625]],"o":[[0,0],[-0.730000000000004,-0.0799999999999983],[0.3100000000000023,-0.0799999999999983],[0.29999999999999716,-0.01999999999999602],[0,0]],"v":[[123.67,117.33],[124,117.99],[121.67,117.66],[122.67,117.33],[123.67,117.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4627,0.4627,0.4627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[122.8350301893374,117.66926845843551]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[122.8350301893374,117.66926845843551]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 242","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 241","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.3999999999999915,1.269999999999996],[-0.39000000000000057,-0.1700000000000017],[-0.5600000000000023,-0.8400000000000034]],"o":[[0,0],[-0.6200000000000045,-0.9500000000000028],[-0.06999999999999318,-0.39000000000000057],[0.4000000000000057,0.9599999999999937],[0,0]],"v":[[94.67,101],[94.34,101.33],[93.01,99],[93.34,98.67],[94.67,101]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3608,0.3608,0.3569]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[93.823285397939,99.96127727432656]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[93.823285397939,99.96127727432656]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 243","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 242","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.6899999999999977,0.5699999999999932],[0,0],[-1.289999999999992,-0.28999999999999204]],"o":[[0,0],[-1.5300000000000011,-0.480000000000004],[0,0],[1.2999999999999972,0.4399999999999977],[0,0]],"v":[[119.33,116.67],[119.33,117],[114.66,115.67],[114.99,115.34],[119.32,116.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2941,0.2941,0.302]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[116.99502587143525,116.16998084441352]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[116.99502587143525,116.16998084441352]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 244","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 243","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5100000000000051,0.1700000000000017],[-0.020000000000010232,-0.3199999999999932],[-0.23000000000000398,-1.2199999999999989],[0,0],[0,0],[2.0600000000000023,0.6400000000000006],[-0.29000000000000625,0.12000000000000455],[-1.0900000000000034,-0.6899999999999977]],"o":[[0.3199999999999932,0.5400000000000063],[-0.20000000000000284,0.060000000000002274],[0.730000000000004,1.0799999999999983],[0,0],[0,0],[-0.29999999999999716,-1.8700000000000045],[-0.29000000000000625,-0.09000000000000341],[0.9599999999999937,0.21999999999999886],[0,0]],"v":[[122.67,117.33],[121.67,117.66],[121.01,117.82],[122.01,121.33],[122.01,122.33],[121.34,123.33],[119.34,117],[119.34,116.67],[122.67,117.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2667,0.2667,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[121.04139462199169,119.99998752757557]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[121.04139462199169,119.99998752757557]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 245","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 244","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6200000000000045,0.07000000000000739],[4.920000000000002,7.560000000000002],[-0.519999999999996,-0.3200000000000074],[-6.739999999999995,-2.280000000000001]],"o":[[0.4000000000000057,0.29000000000000625],[-8.310000000000002,-2.8299999999999983],[-0.269999999999996,-0.519999999999996],[4,5.950000000000003],[0,0]],"v":[[115,115.33],[114.67,115.66],[94.34,101.33],[94.67,101],[115,115.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2902,0.2902,0.2941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[104.71197017437512,108.25346795817418]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[104.71197017437512,108.25346795817418]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 246","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 245","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4399999999999977,-0.18000000000000682],[-0.20000000000000284,0.2600000000000193],[0,0]],"o":[[-0.10999999999999943,0.12999999999999545],[-0.6800000000000068,-0.6699999999999875],[0,0],[0,0]],"v":[[70.33,172.67],[69.83,173.67],[70.33,172.33999999999997],[70.33,172.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.698,0.6941,0.6902]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[69.96163456400501,173.0049718950924]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[69.96163456400501,173.0049718950924]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 247","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 246","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[5.219999999999999,2.8100000000000023],[0,0],[-2.430000000000007,-6.839999999999989]],"o":[[0,0],[-2.0400000000000063,-5.480000000000004],[0,0],[6.790000000000006,3.3100000000000023],[0,0]],"v":[[85.33,132.33],[85,133],[72.33,116.67],[72.66,116],[85.33,132.32999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.302,0.302,0.302]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[78.83003107195273,124.50000005715566]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[78.83003107195273,124.50000005715566]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 248","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 247","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.2000000000000028,-1.2399999999999807],[0.9799999999999969,0.6400000000000148],[5.409999999999997,2.6500000000000057],[-0.30999999999999517,-0.10999999999998522],[-3.6799999999999997,-2.6299999999999955]],"o":[[1.3900000000000006,0.9900000000000091],[-1.1199999999999974,0.13999999999998636],[-5.060000000000002,-3.2700000000000102],[-0.0799999999999983,-0.6100000000000136],[4.200000000000003,1.5200000000000102],[0,0]],"v":[[47.33,186],[51.33,189.17],[48,187.32999999999998],[32.34,178.32999999999998],[33.35,178.14999999999998],[47.34,185.99999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0353,0.0471,0.0471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[41.83213745201698,183.5738707492876]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.83213745201698,183.5738707492876]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 249","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 248","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.030000000000001137,0.4300000000000068],[-0.3800000000000239,-0.05999999999997385],[0,0]],"o":[[-0.05000000000001137,-0.4300000000000068],[0.020000000000010232,0],[0,0],[0,0]],"v":[[163,211],[163,209.67],[163.33,209.33999999999997],[163,211.00999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1059,0.1059,0.1137]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[163.15657956028738,210.17183493454166]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[163.15657956028738,210.17183493454166]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 250","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 249","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.10000000000002274,0.2599999999999909],[0,0],[-0.11000000000001364,-0.2599999999999909]],"o":[[0,0],[-0.06999999999999318,-0.18999999999999773],[0,0],[0.09000000000000341,0.21000000000000796],[0,0]],"v":[[203.67,195],[203.33999999999997,195.33],[203.00999999999996,194.66000000000003],[203.33999999999997,194.33],[203.67,195]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6549,0.6549,0.6549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[203.34001150845447,194.82999285452786]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[203.34001150845447,194.82999285452786]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 251","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 250","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.21999999999999886,0.549999999999983],[-0.45000000000001705,-0.22999999999998977],[-0.21999999999999886,-0.549999999999983]],"o":[[0,0],[-0.19999999999998863,-0.539999999999992],[-0.13999999999998636,-0.46000000000000796],[0.22999999999998977,0.539999999999992],[0,0]],"v":[[204.33,196.67],[204,197],[203.33,195.33],[203.66000000000003,195],[204.33,196.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4431,0.4431,0.4431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[203.79172454961818,195.94050550071654]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[203.79172454961818,195.94050550071654]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 252","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 251","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.19999999999998863,0.5],[0,0],[-0.21999999999999886,-0.6299999999999955]],"o":[[0,0],[-0.18000000000000682,-0.4199999999999875],[0,0],[0.18000000000000682,0.5099999999999909],[0,0]],"v":[[219,239.33],[218.67,239.66000000000003],[218,238.33],[218.33,237.66000000000003],[219,239.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.502,0.502,0.5059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[218.50000594838397,238.6599715801371]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[218.50000594838397,238.6599715801371]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 253","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 252","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.15000000000000568,-0.12999999999999545],[0.5300000000000011,0.5699999999999932],[0,0]],"o":[[0.21000000000000796,0.25],[-0.9699999999999989,0.03999999999999204],[0,0],[0,0]],"v":[[230.33,223],[232,225],[230,223.34],[230.33,223.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5451,0.549,0.549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[231.00497707224994,224.0004960497477]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[231.00497707224994,224.0004960497477]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 254","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 253","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.45000000000001705,0.22999999999998977],[-0.11000000000001364,1.0300000000000011],[-0.3300000000000125,-0.7400000000000091]],"o":[[0.15000000000000568,0.46000000000000796],[-0.3300000000000125,-0.8199999999999932],[0.9199999999999875,0.37999999999999545],[0,0]],"v":[[203.33,194.33],[203,194.66000000000003],[202,191.99000000000004],[203.33,194.32000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8627,0.8627,0.851]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[202.70036004591648,193.3844872373872]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[202.70036004591648,193.3844872373872]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 255","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 254","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5900000000000034,0.30999999999997385],[0.5799999999999841,0.6899999999999977],[0,0],[-0.539999999999992,-0.6500000000000057]],"o":[[0.4399999999999977,0.46999999999999886],[-0.6299999999999955,-0.6800000000000068],[0,0],[0.5,0.6599999999999966],[0,0]],"v":[[230.33,223],[230,223.33],[228.33,221.33],[228.66000000000003,221],[230.33,223]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3882,0.3922,0.3922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[229.45230555162718,222.24338526562815]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[229.45230555162718,222.24338526562815]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 256","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 255","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12000000000000455,-1.1100000000000136],[0.35000000000002274,0.8299999999999841],[-0.5,-0.28000000000000114]],"o":[[0.30000000000001137,0.9000000000000057],[-1.0200000000000102,-0.4399999999999977],[-0.18000000000000682,-0.5200000000000102],[0,0]],"v":[[219,239.33],[220,242.33],[218.67,239.66000000000003],[219,239.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6314,0.6314,0.6314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[219.28774699522867,240.75205543069467]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[219.28774699522867,240.75205543069467]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 257","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 256","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5500000000000114,0.3199999999999932],[1.0200000000000102,1.3700000000000045],[0,0],[-1.0600000000000023,-1.3800000000000239]],"o":[[0.37999999999999545,0.46999999999999886],[-1.1200000000000045,-1.3300000000000125],[0,0],[0.9900000000000091,1.4399999999999977],[0,0]],"v":[[228.67,221],[228.33999999999997,221.33],[225.33999999999997,217.33],[225.67,216.66000000000003],[228.67,220.99000000000004]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.251,0.2549,0.2549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[227.10882768900038,219.07564157293046]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[227.10882768900038,219.07564157293046]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 258","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 257","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3199999999999932,0.08999999999997499],[-0.020000000000010232,-0.5199999999999818],[-0.1599999999999966,-1.740000000000009],[0,0],[0,0]],"o":[[-0.020000000000010232,-0.8000000000000114],[0.8100000000000023,-0.15000000000000568],[0.06999999999999318,1.789999999999992],[0,0],[0,0],[0,0]],"v":[[162.67,207],[162.83999999999997,200.33],[163.33999999999997,201.5],[163.33999999999997,207],[163.17999999999998,207.32],[162.67999999999998,207]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1569,0.1569,0.1608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[163.0085496895227,203.815806090678]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[163.0085496895227,203.815806090678]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 259","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 258","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.660000000000025,1.0200000000000102],[-0.13999999999998636,0.03999999999999204],[-0.6800000000000068,-0.5599999999999739],[0,0]],"o":[[-1.4499999999999886,-1.3100000000000023],[-0.3300000000000125,-0.19999999999998863],[0.539999999999992,-0.1699999999999875],[0,0],[0,0]],"v":[[199.67,177.67],[194.83999999999997,174.33999999999997],[194.99999999999997,173.83999999999997],[200.32999999999998,177.00999999999996],[199.66,177.67999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2667,0.2667,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[197.51634879656237,175.75625344095533]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[197.51634879656237,175.75625344095533]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 260","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 259","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3400000000000034,0.14000000000001478],[1.2299999999999898,3.440000000000026],[0,0],[-1.1500000000000057,-3.3000000000000114]],"o":[[0.12000000000000455,0.5900000000000034],[-1.3600000000000136,-3.4000000000000057],[0,0],[1.1100000000000136,3.319999999999993],[0,0]],"v":[[218.33,237.67],[218,238.33999999999997],[214.33,228.00999999999996],[215,227.67999999999995],[218.33,237.67999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2471,0.2471,0.251]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[216.33001582995317,233.03037787993748]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[216.33001582995317,233.03037787993748]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 261","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 260","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7199999999999989,0.46000000000000796],[1.6000000000000227,4.360000000000014],[-0.4000000000000057,-0.1799999999999784],[-1.6399999999999864,-4.6699999999999875]],"o":[[-0.05000000000001137,1.5],[-1.460000000000008,-4.409999999999997],[-0.0800000000000125,-0.4000000000000057],[1.8499999999999943,4.599999999999994],[0,0]],"v":[[209.33,210.67],[208.33,210.33999999999997],[204,197.00999999999996],[204.33,196.67999999999995],[209.33,210.67999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2627,0.2588,0.2627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[206.6452754885144,203.9748033486676]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[206.6452754885144,203.9748033486676]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 262","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 261","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5500000000000114,-0.5300000000000011],[-1.8999999999999773,-5.6699999999999875],[0.6499999999999773,0.6699999999999875],[1.960000000000008,5.929999999999978]],"o":[[0.12000000000000455,-0.3100000000000023],[1.9799999999999898,5.650000000000006],[0.27000000000001023,0.9199999999999875],[-2.0800000000000125,-5.8300000000000125],[0,0]],"v":[[208.33,210.33],[209.33,210.66000000000003],[215,227.66000000000003],[214.33,227.99000000000004],[208.33,210.32000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2941,0.2941,0.298]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[211.7153532996194,219.37558269469372]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[211.7153532996194,219.37558269469372]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 263","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 262","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5,0.2400000000000091],[3.609999999999985,6.210000000000008],[6.560000000000002,5.920000000000016],[-0.8099999999999739,-0.4800000000000182],[-7.509999999999991,-10.969999999999999]],"o":[[0.28000000000000114,0.6899999999999977],[-4.25,-5.710000000000008],[-4.340000000000003,-7.449999999999989],[-0.7199999999999989,-0.6299999999999955],[9.52000000000001,7.710000000000008],[0,0]],"v":[[225.67,216.67],[225.33999999999997,217.33999999999997],[213.95,199.55999999999997],[199.67,177.66999999999996],[200.33999999999997,176.99999999999997],[225.66999999999996,216.66999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2941,0.2941,0.2941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[212.50659754093166,197.1230326786286]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[212.50659754093166,197.1230326786286]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 264","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 263","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.5699999999999932,-0.10999999999999943]],"o":[[0,0],[0.5900000000000034,0.09999999999999964],[0,0]],"v":[[139.67,12.33],[138,12],[139.67,12.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8549,0.2118,0.1765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[138.83501502541347,12.164973902072944]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[138.83501502541347,12.164973902072944]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 265","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 264","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.39999999999997726,-0.6199999999999992]],"o":[[0,0],[0.5999999999999943,0.10999999999999943],[0,0]],"v":[[143,13],[141.33,12.67],[143,13]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8549,0.2118,0.1765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[142.165040220914,12.821434726700602]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[142.165040220914,12.821434726700602]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 266","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 265","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.10000000000002274,1.6300000000000026],[-0.21999999999999886,0.019999999999999574]],"o":[[2.030000000000001,0.14999999999999858],[0.21999999999999886,-0.019999999999999574],[0,0]],"v":[[148.67,31],[148,31],[148.67,31]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.949,0.7765,0.7569]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[148.70381240799284,31.37657197974616]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[148.70381240799284,31.37657197974616]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 267","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 266","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.2400000000000091,-1.08],[0.44000000000002615,0.010000000000001563],[0.030000000000001137,0.05000000000000071]],"o":[[0.8799999999999955,0.08999999999999986],[-0.4399999999999977,0],[-1.009999999999991,-0.47000000000000064],[0,0]],"v":[[146.33,15.67],[148,16.34],[146.67,16.34],[146.33999999999997,15.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.7373,0.7098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[147.0804002445437,15.987596010533679]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[147.0804002445437,15.987596010533679]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 268","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 267","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3299999999999841,-0.8699999999999974],[0.8700000000000045,-0.11999999999999744],[0,0],[0,0]],"o":[[0.6700000000000017,-0.48999999999999844],[-0.8199999999999932,0.10999999999999943],[0,0],[0,0],[0,0]],"v":[[127.33,18.33],[129.32999999999998,18.659999999999997],[126.65999999999998,18.989999999999995],[126.65999999999998,17.989999999999995],[127.32999999999998,18.319999999999993]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.2627,0.2392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[127.99501669026964,18.48474667364968]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[127.99501669026964,18.48474667364968]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 269","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 268","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.3400000000000034,0.259999999999998],[-0.589999999999975,0.00999999999999801]],"o":[[0,0],[-2.1999999999999886,0.7900000000000027],[0.5200000000000102,-0.3500000000000014],[0,0]],"v":[[144.33,31.33],[144.66000000000003,31.99],[142.66000000000003,31.66],[144.33,31.330000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.2549,0.2314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[143.66002845990775,31.82311979952175]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[143.66002845990775,31.82311979952175]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 270","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 269","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.19000000000002615,-0.629999999999999],[1.200000000000017,0.75],[-0.6599999999999966,-0.010000000000001563]],"o":[[0.5600000000000023,0],[-1.3499999999999943,-0.1700000000000017],[0.6599999999999966,-0.030000000000001137],[0,0]],"v":[[152,30.67],[154.33,31],[150,30.67],[152,30.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.4392,0.3922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[152.16504815991138,30.83007364282051]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[152.16504815991138,30.83007364282051]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 271","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 270","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.18999999999999773,-1.4699999999999989],[0.8799999999999955,-0.129999999999999],[0,0]],"o":[[1.0799999999999983,0],[-0.8900000000000006,0.129999999999999],[0,0],[0,0]],"v":[[112,21],[114.67,21],[112,21.33],[112,21]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.7451,0.7373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[113.34204993596464,20.83830617262734]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[113.34204993596464,20.83830617262734]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 272","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 271","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.5300000000000011,-0.06999999999999673],[-1.1200000000000045,-0.8499999999999979]],"o":[[0,0],[-0.37000000000000455,0.05999999999999872],[-1.8199999999999932,-0.08999999999999986],[0,0]],"v":[[139.67,16.67],[139.67,17],[138.33999999999997,17.33],[139.67,16.659999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9176,0.8353,0.8235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[138.64092610920713,16.86062789995296]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[138.64092610920713,16.86062789995296]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 273","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 272","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.21999999999999886,-0.7899999999999991],[-0.1699999999999875,0.7599999999999998],[-0.7199999999999989,-0.1899999999999995]],"o":[[-0.47999999999998977,0.39000000000000057],[-0.5800000000000125,-0.40000000000000036],[0.6899999999999977,0.16000000000000014],[0,0]],"v":[[146.33,14],[145.33,15],[144,13.67],[146.33,14]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.2157,0.1882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[145.15471813119123,14.33499387727474]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[145.15471813119123,14.33499387727474]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 274","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 273","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3100000000000023,-0.05000000000000071],[0.9399999999999977,0.26000000000000156],[-0.4300000000000068,0.6900000000000013],[-0.5,0.28000000000000114]],"o":[[0.3199999999999932,0.030000000000001137],[0.37000000000000455,1.0300000000000011],[-0.8900000000000006,0.05999999999999872],[0.29000000000000625,-0.1700000000000017],[0,0]],"v":[[105,16.67],[106,16.67],[104.33,18],[104,17.33],[105,16.659999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.3373,0.3098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[104.87031058340207,17.35820094141812]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[104.87031058340207,17.35820094141812]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 275","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 274","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.4000000000000057,-1.8000000000000007],[0.5499999999999972,-0.03999999999999915]],"o":[[-0.12000000000000455,-1.1499999999999986],[-0.6500000000000057,0.08999999999999986],[0,0]],"v":[[96.67,23.67],[98.67,23.340000000000003],[96.67,23.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.7725,0.7608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[97.83338812395155,23.00866452456748]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[97.83338812395155,23.00866452456748]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 276","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 275","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.12999999999999545,-0.1700000000000017],[0.6700000000000017,-0.08999999999999986],[-0.769999999999996,-0.6900000000000013]],"o":[[0.12999999999999545,0.10999999999999943],[-0.6700000000000017,0.08999999999999986],[-0.3299999999999983,-1.1099999999999994],[0,0]],"v":[[106,21.67],[106.33,22.340000000000003],[104.33,22.67],[106,21.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8431,0.702,0.698]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[105.30249729631245,22.020952777623506]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[105.30249729631245,22.020952777623506]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 277","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 276","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.29000000000000625,-0.11999999999999744],[0.8799999999999955,-0.129999999999999],[0,0],[-1.269999999999996,-1.3800000000000026]],"o":[[0.29000000000000625,0.08999999999999986],[-0.8499999999999943,0.129999999999999],[0,0],[0.7199999999999989,-1.75],[0,0]],"v":[[112,21],[112,21.33],[109.33,21.659999999999997],[109.33,21.33],[112,21]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.851,0.3412,0.3176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[110.66503213190941,20.824343156042517]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[110.66503213190941,20.824343156042517]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 278","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 277","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.04000000000000625,-0.22000000000000242],[-0.35999999999999943,-1.4100000000000001],[0.7600000000000051,-0.10999999999999943],[-0.09999999999999432,0.41000000000000014],[0.519999999999996,-0.6700000000000017]],"o":[[0.04999999999999716,0.1700000000000017],[0.12999999999999545,0.10999999999999943],[-0.7600000000000051,0.10999999999999943],[-0.8400000000000034,-0.4800000000000004],[0.8400000000000034,-0.1700000000000017],[0,0]],"v":[[124.33,18.33],[124.33,19],[126.33,19],[124,19.33],[124,17.659999999999997],[124.33,18.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.5647,0.5373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[124.96672402279427,18.464274880980383]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[124.96672402279427,18.464274880980383]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 279","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 278","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3300000000000125,0],[0.22999999999998977,0],[-0.8199999999999932,0.33000000000000007],[0.4800000000000182,-0.8299999999999983]],"o":[[-0.3300000000000125,0.019999999999999574],[-0.21999999999999886,0],[-0.18000000000000682,-0.8099999999999987],[0.5999999999999943,0.6199999999999992],[0,0]],"v":[[134.33,18],[133.33,18],[132.66000000000003,18],[133.66000000000003,15.33],[134.33,18]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.7569,0.7333]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[133.56378219562507,16.66942513827945]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[133.56378219562507,16.66942513827945]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 280","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 279","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3400000000000034,-0.6999999999999993],[-0.04999999999998295,-0.39000000000000057],[1.25,-0.16000000000000014],[-0.7199999999999989,0.6400000000000006],[-0.8999999999999773,-0.06999999999999673]],"o":[[0.44999999999998863,-0.5],[0.38999999999998636,-0.39000000000000057],[-1.1500000000000057,0.6700000000000017],[-0.9499999999999886,-0.10000000000000142],[0.9199999999999875,-0.120000000000001],[0,0]],"v":[[131.67,18],[132.67,18],[133.33999999999997,18],[129.33999999999997,18.67],[129.00999999999996,17.67],[131.67999999999995,18]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8824,0.6118,0.5804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[130.93919288149775,18.108451836106724]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[130.93919288149775,18.108451836106724]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 281","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 280","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.23000000000000398,-0.4399999999999977],[-1.0700000000000074,2.5],[-0.09999999999999432,-0.020000000000003126]],"o":[[0.09000000000000341,0.020000000000003126],[-2.230000000000004,1.509999999999998],[0.10999999999999943,0.00999999999999801],[0,0]],"v":[[102,37.33],[103.33,38.489999999999995],[101.67,37.33],[102,37.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.8745,0.8627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[102.2418398890409,38.38920097983561]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[102.2418398890409,38.38920097983561]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 282","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 281","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.4399999999999977,0.8800000000000026],[-0.9099999999999966,1.2700000000000031],[-0.8799999999999955,0.10999999999999943]],"o":[[0,0],[-0.4099999999999966,0.8900000000000006],[-0.6299999999999955,-0.04999999999999716],[0.8299999999999983,-0.10999999999999943],[0,0]],"v":[[119,34.67],[119,35.67],[117.67,35.67],[116.34,35],[119.01,34.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8275,0.1961,0.1529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[117.53887690799624,35.50187208064787]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[117.53887690799624,35.50187208064787]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 283","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 282","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12999999999999545,-0.3000000000000007],[0.700000000000017,-0.269999999999996],[0.6100000000000136,0.010000000000005116],[0.20000000000001705,0.8500000000000014],[-0.06999999999999318,-0.05000000000000071],[-0.5,0.46999999999999886],[-0.3900000000000148,-0.05000000000000071]],"o":[[0.0800000000000125,0.010000000000001563],[-1.0699999999999932,-0.10999999999999943],[-0.27000000000001023,0.22999999999999687],[-0.7800000000000011,-0.259999999999998],[0.19999999999998863,0.019999999999999574],[0.6200000000000045,0.25],[0.4199999999999875,0],[0,0]],"v":[[145.67,31.33],[147,31.99],[144.67,32.66],[143.33999999999997,32.989999999999995],[142.00999999999996,31.659999999999997],[142.67999999999995,31.659999999999997],[144.34999999999994,31.33],[145.67999999999995,31.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.4275,0.4]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[144.5093341686156,32.14919554819295]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[144.5093341686156,32.14919554819295]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 284","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 283","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.9099999999999966,-0.34999999999999787],[-0.37000000000000455,0],[1.019999999999996,-0.16000000000000014],[-0.29999999999999716,0.28999999999999915],[-0.5300000000000011,-0.11000000000000298]],"o":[[0.75,0.48999999999999844],[0.1599999999999966,0.5],[-0.8799999999999955,0.14000000000000057],[0.15000000000000568,-0.48999999999999844],[0.3499999999999943,-0.33999999999999986],[0,0]],"v":[[117,18.67],[117,20],[118,20.33],[115,21],[116,19],[117,18.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.2392,0.2118]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[116.50004041679267,19.813651647662795]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[116.50004041679267,19.813651647662795]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 285","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 284","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.030000000000001137,-0.03999999999999915],[-0.2300000000000182,-0.27999999999999936],[0.8500000000000227,-1.0500000000000007],[0.11000000000001364,0],[0.09999999999999432,1.7899999999999991],[-0.5500000000000114,-0.28999999999999915]],"o":[[0,0],[0.11000000000001364,0.15000000000000036],[0.1699999999999875,0.21000000000000085],[-0.11000000000001364,0],[-1.5500000000000114,-0.14000000000000057],[-0.38999999999998636,-0.5],[0,0]],"v":[[142.67,14],[143.67,14],[143.72,15.29],[144.67,16.34],[144.33999999999997,16.34],[142.33999999999997,14.34],[142.67,14.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9647,0.8549,0.8431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[143.5209755249659,15.097376573258344]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[143.5209755249659,15.097376573258344]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 286","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 285","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.37000000000000455,-0.23000000000000398],[0.730000000000004,-0.6000000000000014],[0,0],[-0.3400000000000034,0.3299999999999983],[-0.5300000000000011,0.07000000000000028]],"o":[[0.519999999999996,0.21999999999999886],[0.8799999999999955,0.14000000000000057],[0,0],[0.12000000000000455,-0.22999999999999687],[0.5300000000000011,-0.07000000000000028],[0,0]],"v":[[116.33,35],[117.66,35.67],[117.99,36.67],[114.32,36.34],[114.64999999999999,35.010000000000005],[116.32,35.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.5529,0.5216]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[116.38190712608557,35.829898471692985]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[116.38190712608557,35.829898471692985]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 287","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 286","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.0700000000000216,-0.5299999999999994],[-0.3400000000000034,-0.5299999999999994],[0.09999999999999432,-0.3200000000000003],[0.6599999999999966,0.05000000000000071],[0.22999999999998977,1.0999999999999996],[-0.28999999999999204,0.11999999999999922],[-0.0700000000000216,0.1999999999999993],[-0.19999999999998863,-0.040000000000000924]],"o":[[0.8199999999999932,0.35999999999999943],[0.36000000000001364,0.25],[0.3199999999999932,0.13000000000000078],[-0.6599999999999966,-0.019999999999999574],[-1.0999999999999943,-0.4499999999999993],[-0.28999999999999204,-0.08999999999999986],[0.3100000000000023,-0.0600000000000005],[0.4199999999999875,-0.15000000000000036],[0,0]],"v":[[144,13.67],[145.33,15],[146.33,15.67],[146.66000000000003,16.34],[144.66000000000003,16.34],[142.66000000000003,14.01],[142.66000000000003,13.68],[142.99000000000004,13.35],[143.99000000000004,13.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9176,0.2863,0.2549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[144.56912732873084,14.838637795515922]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[144.56912732873084,14.838637795515922]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 288","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 287","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.8100000000000023,-0.9400000000000013],[0.8799999999999955,-0.10999999999999943],[0.37999999999999545,1.1999999999999993],[-0.5499999999999972,-0.25]],"o":[[0.7199999999999989,0.6799999999999997],[-0.8799999999999955,0.120000000000001],[-0.030000000000001137,-1.0300000000000011],[-0.3299999999999983,-0.7600000000000016],[0,0]],"v":[[103.33,20.67],[103.33,22.67],[100.66,23],[101.66,21],[103.33,20.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.9176,0.9137]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[102.09420810855659,21.727052675865224]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[102.09420810855659,21.727052675865224]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 289","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 288","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.4499999999999886,-0.31999999999999673],[1.2199999999999989,-0.019999999999999574],[0.4199999999999875,0.6700000000000017],[-0.11999999999997613,0.08000000000000185],[0,0]],"o":[[1.3499999999999943,0.120000000000001],[-0.2599999999999909,1.4299999999999997],[-0.7299999999999898,0],[-0.03999999999999204,-0.17999999999999972],[0,0],[0,0]],"v":[[156.67,30.67],[160.33999999999997,31],[158.00999999999996,32],[156.00999999999996,31.33],[155.67999999999995,30.669999999999998],[156.67999999999995,30.669999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.4706,0.4314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[157.99908112360762,31.360927031726646]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[157.99908112360762,31.360927031726646]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 290","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 289","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.21999999999999886,3.1899999999999977],[-1.6599999999999966,0.21000000000000085]],"o":[[-1.4499999999999886,0.3299999999999983],[1.6599999999999966,-0.21000000000000085],[0,0]],"v":[[131.33,33],[126.33000000000001,33.67],[131.33,33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.2706,0.2431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[128.83003095791125,33.99745905426582]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[128.83003095791125,33.99745905426582]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 291","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 290","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3500000000000085,-0.5899999999999999],[0.6700000000000017,0.5899999999999999],[0,0],[0,0],[-1.730000000000004,0.23000000000000043]],"o":[[2.3700000000000045,0.8599999999999994],[0.14000000000000057,0.8900000000000006],[0,0],[0,0],[1.6899999999999977,-0.3800000000000008],[0,0]],"v":[[121.33,11.33],[119.66,12.66],[118.99,12.99],[115.99,12.99],[116.32,12.32],[121.32,11.32]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8588,0.1608,0.1333]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[119.13082003478013,12.354116546545413]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[119.13082003478013,12.354116546545413]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 292","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 291","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.7400000000000091,-0.5799999999999983],[1.3999999999999773,-0.22000000000000242],[-0.28999999999999204,0.11999999999999744],[-0.46000000000000796,0.3699999999999992],[-0.5599999999999739,0.46000000000000085],[-0.06999999999999318,-0.5099999999999998]],"o":[[0.5999999999999943,0.75],[-1.2700000000000102,0.6999999999999993],[-0.28999999999999204,-0.08999999999999986],[-0.030000000000001137,-0.6700000000000017],[-0.11000000000001364,-0.41999999999999993],[0.37000000000000455,-0.3100000000000005],[0,0]],"v":[[142.33,14.33],[144.33,16.33],[139.66000000000003,17],[139.66000000000003,16.67],[140.66000000000003,15.340000000000002],[141.33,14.010000000000002],[142.33,14.340000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.2471,0.2196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[141.99445853576495,15.421720629209801]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[141.99445853576495,15.421720629209801]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 293","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 292","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.759999999999991,-0.7400000000000002],[0,0],[0.6899999999999977,0.25],[-0.12000000000000455,0.8499999999999996],[-1.6999999999999886,0.02999999999999936]],"o":[[1.8899999999999864,0.5],[0,0],[-0.4199999999999875,-0.19000000000000128],[-0.7199999999999989,0.3699999999999992],[-1.0300000000000011,-0.6400000000000006],[0,0]],"v":[[146.33,14],[151.33,16],[148,16.33],[146.33,15.659999999999998],[145.33,14.989999999999998],[146.33,13.989999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8549,0.2118,0.1765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[148.0377476553506,15.159996174364409]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[148.0377476553506,15.159996174364409]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 294","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 293","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-0.01999999999999602,-0.16999999999999993],[0.12000000000000455,0.28999999999999915],[0.28999999999999204,0.7200000000000006],[0.7399999999999949,0.9499999999999993],[-0.12999999999999545,0.5099999999999998],[0,0],[0.3200000000000074,-0.3699999999999992],[-0.28000000000000114,-1.0799999999999983],[0,0],[0,0],[0.3299999999999983,0.23999999999999844],[-0.21999999999999886,0.7399999999999984],[0.12999999999999545,0.3299999999999983],[-4.390000000000001,1.129999999999999]],"o":[[0,0],[0,0],[0.1700000000000017,0.4399999999999995],[-0.09000000000000341,0.28999999999999915],[-0.5900000000000034,0.05000000000000071],[-0.5600000000000023,0.7599999999999998],[-0.23999999999999488,0.0600000000000005],[0,0],[-1.8799999999999955,-0.34999999999999964],[-0.2600000000000051,0.28999999999999915],[0,0],[0,0],[-0.3199999999999932,0.23999999999999844],[-0.4399999999999977,0.0799999999999983],[-0.5400000000000063,0.3299999999999983],[3.9000000000000057,-2.16],[0,0]],"v":[[115,12.67],[114.67,13.34],[114.34,14.34],[114.01,15.67],[113.68,15.67],[112.35000000000001,14.67],[110.35000000000001,15.34],[109.35000000000001,15.01],[110.35000000000001,14.68],[108.96000000000001,15.62],[108.02000000000001,16.349999999999998],[109.68,16.349999999999998],[107.35000000000001,17.68],[106.35000000000001,17.68],[106.02000000000001,16.68],[105.02000000000001,16.68],[115.02000000000001,12.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.2078,0.1804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[110.0200263551001,15.264992485818482]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[110.0200263551001,15.264992485818482]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 295","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 294","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.269999999999996,-1.1300000000000026],[0.6700000000000017,-0.09999999999999787],[-0.23000000000000398,0.4299999999999997],[0.39000000000000057,0.6199999999999974],[0.5699999999999932,0.4400000000000013],[0,0],[-1.039999999999992,0.20000000000000107],[-0.46999999999999886,-0.5900000000000034],[-1.3399999999999892,0.75],[0.4300000000000068,-0.5800000000000018]],"o":[[-0.8499999999999943,0.6999999999999993],[-0.6599999999999966,0.10000000000000142],[-0.9000000000000057,0.21000000000000085],[0.39000000000000057,-0.26000000000000156],[-0.12000000000000455,0.75],[0,0],[1.1500000000000057,-0.41000000000000014],[0.269999999999996,0.27999999999999936],[1.7999999999999972,2.2699999999999996],[0.7399999999999949,0.05000000000000071],[0,0]],"v":[[121.33,16.33],[120,20],[118,20.33],[117,20],[117,18.67],[116,19],[115.33,17.33],[117.66,15.999999999999998],[117.17999999999999,18],[120.99999999999999,15.66],[121.32999999999998,16.330000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.8745,0.8627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[118.47190100267105,18.04665827233248]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[118.47190100267105,18.04665827233248]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 296","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 295","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8700000000000045,-0.10000000000000142],[0.1599999999999966,-0.19000000000000483],[0,0],[0.03999999999999204,2.0600000000000023],[-0.25,0.28999999999999915],[0.789999999999992,-0.020000000000003126],[0.04000000000000625,0],[-2.769999999999996,0.36999999999999744]],"o":[[0.730000000000004,0.4399999999999977],[-0.25,0.46999999999999886],[0,0],[-1.019999999999996,1.4200000000000017],[-0.030000000000001137,-0.1599999999999966],[-0.5600000000000023,-0.7999999999999972],[-0.789999999999992,0.020000000000003126],[2.7900000000000063,-0.3400000000000034],[0,0]],"v":[[114.67,35],[114.34,36.33],[113.67,37],[112.82000000000001,37.23],[109.33000000000001,37.339999999999996],[109.66000000000001,36.669999999999995],[107.14000000000001,36.69],[106.33000000000001,36.339999999999996],[114.66000000000001,35.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.3373,0.3059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[110.72542242744527,36.80472204580917]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[110.72542242744527,36.80472204580917]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 297","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 296","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.09999999999999432,-0.3400000000000034],[0,0],[0.519999999999996,-0.6700000000000017],[0.21999999999999886,-0.01999999999999602],[0.8200000000000074,0.1700000000000017],[-0.21000000000000796,0.9200000000000017],[-0.9099999999999966,0.22999999999999687],[-2.230000000000004,0.28000000000000114]],"o":[[0.18999999999999773,0.3100000000000023],[0,0],[-0.7999999999999972,0.07000000000000028],[-0.35999999999999943,0.07000000000000028],[-0.8199999999999932,0.10000000000000142],[-0.4300000000000068,0.9299999999999997],[-0.9500000000000028,-0.020000000000003126],[2.219999999999999,-0.28999999999999915],[0,0]],"v":[[125.67,33.67],[126,34.67],[125.86,35.11],[124,36],[123,36.33],[120.33,36.33],[119,35.66],[119,34.66],[125.67,33.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.2706,0.2431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[122.15125041921775,35.21706834179659]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[122.15125041921775,35.21706834179659]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 298","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 297","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.0799999999999983,0.030000000000001137],[0.7999999999999972,-0.5100000000000016],[0.8100000000000023,-0.39000000000000057],[0.10999999999999943,-0.019999999999999574],[1.210000000000008,-0.21999999999999886],[-1.6200000000000045,0.9099999999999966],[-0.46999999999999886,0.3299999999999983],[-0.9000000000000057,-0.6700000000000017]],"o":[[0.12000000000000455,-0.019999999999999574],[0.9399999999999977,-0.3500000000000014],[0.730000000000004,0.870000000000001],[-0.10999999999999943,0.019999999999999574],[-0.5699999999999932,-0.21999999999999886],[-1.3700000000000045,-0.6900000000000013],[0.29000000000000625,-0.48999999999999844],[0.4300000000000068,-0.6700000000000017],[0,0]],"v":[[115,17.33],[115.33,17.33],[116,19],[115,21],[114.67,21],[112,21],[111.67,18.67],[113,17.340000000000003],[115,17.340000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.302,0.2784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[113.53966195115254,18.92161094735468]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[113.53966195115254,18.92161094735468]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 299","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 298","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.46999999999999886,-0.4399999999999977],[0.29000000000000625,-0.3299999999999983],[0.5600000000000023,-0.5199999999999996],[0.3199999999999932,-0.03999999999999915],[-0.8700000000000045,0.6000000000000014],[0.29000000000000625,0.11999999999999744],[-0.5699999999999932,0.14999999999999858],[0,-0.9100000000000001]],"o":[[0.25,0.4499999999999993],[-0.0799999999999983,0.39000000000000057],[-0.7000000000000028,0.28999999999999915],[-0.3199999999999932,0.03999999999999915],[-1.4899999999999949,-0.030000000000001137],[-0.37999999999999545,-0.10000000000000142],[-0.0799999999999983,-0.7399999999999984],[0.6899999999999977,-1.0799999999999983],[0,0]],"v":[[107.33,19],[107,20.33],[106,21.659999999999997],[104.33,22.659999999999997],[103.33,22.659999999999997],[103.33,20.659999999999997],[102.33,20.33],[104.33,18.33],[107.33,19]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.298,0.2745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[104.89361876931915,20.246505161792783]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[104.89361876931915,20.246505161792783]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 300","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 299","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[2.0600000000000023,-0.7300000000000004],[0.3199999999999932,0.7099999999999973],[0.5600000000000023,-0.120000000000001],[0.4000000000000057,-0.060000000000002274],[0.10999999999999943,-0.019999999999999574],[0,0],[-0.980000000000004,1.1099999999999994],[-1.0799999999999983,-0.28000000000000114],[-0.799999999999983,0.009999999999999787],[-0.5599999999999739,0.6099999999999994],[-0.6200000000000045,-0.25]],"o":[[0,0],[1.4499999999999886,0.13000000000000078],[-0.539999999999992,0.379999999999999],[-0.5600000000000023,0.3299999999999983],[-0.04000000000000625,0.39000000000000057],[-0.10999999999999943,0.019999999999999574],[0,0],[-0.8299999999999983,0.3200000000000003],[-0.25,-1.3399999999999999],[-0.269999999999996,-0.8099999999999987],[0.5600000000000023,-0.05000000000000071],[0.28999999999999204,0.10999999999999943],[0,0]],"v":[[131.33,14.33],[131.28,14.78],[131.66,18],[128.99,17.67],[127.32000000000001,18.340000000000003],[126.65,19.010000000000005],[126.32000000000001,19.010000000000005],[125.67,18.750000000000004],[124.32000000000001,18.340000000000003],[126.32000000000001,17.010000000000005],[128.32,15.010000000000005],[129.98999999999998,14.010000000000005],[131.32,14.340000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9451,0.3176,0.298]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[128.4166540107495,16.545648917847757]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[128.4166540107495,16.545648917847757]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 301","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 300","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.01999999999999602,-0.2900000000000027],[0.29000000000000625,-0.11999999999999744],[0.7800000000000011,-0.1700000000000017],[-0.8599999999999994,-0.23000000000000043],[1.8499999999999943,-0.870000000000001],[0.6899999999999977,-0.08999999999999986],[0.9099999999999966,-0.7999999999999972],[0.060000000000002274,0.3000000000000007],[-1.4699999999999989,1.0899999999999999],[-1.3499999999999943,0.8099999999999987]],"o":[[0.23999999999999488,0.16000000000000014],[0.29000000000000625,0.08999999999999986],[0.20999999999999375,0.8500000000000014],[-1.2999999999999972,0.21999999999999886],[1.1800000000000068,0.46000000000000085],[-0.5900000000000034,0.07000000000000028],[-0.4300000000000068,-0.5799999999999983],[-0.269999999999996,0.019999999999999574],[1.2999999999999972,-1.2899999999999991],[1.3700000000000045,-1.0199999999999996],[0,0]],"v":[[104,17.33],[104.33,18],[104.33,18.33],[102.33,20.33],[101.66,21],[100.66,23],[98.66,23.33],[96.66,23.659999999999997],[95.66,23.499999999999996],[99.88,19.719999999999995],[103.99,17.329999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.2078,0.1765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[100.00542840732632,20.51524595783019]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[100.00542840732632,20.51524595783019]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 302","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 301","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.060000000000002274,-0.3800000000000008],[0,0],[-0.09999999999999432,-0.11999999999999922],[0.9300000000000068,0.5700000000000003],[-0.9399999999999977,-0.33999999999999986],[0.5999999999999943,0.3100000000000005],[0.2600000000000051,-0.6600000000000001],[-0.23999999999999488,-0.5999999999999996],[0,0],[0.09999999999999432,-0.02999999999999936],[0.5799999999999983,0.27999999999999936],[0.21999999999999886,-0.02999999999999936],[-0.4200000000000017,1.4000000000000004],[0.14000000000000057,-0.040000000000000924],[-0.060000000000002274,0.47000000000000064],[-1.4599999999999937,-0.11999999999999922]],"o":[[0,0],[0,0],[-0.12999999999999545,0.6099999999999994],[0.6899999999999977,0.3699999999999992],[0.7199999999999989,-0.14000000000000057],[0.46999999999999886,0.4499999999999993],[-0.18999999999999773,0.4499999999999993],[-0.0799999999999983,-0.019999999999999574],[0,0],[-0.5,0.27999999999999936],[-0.9699999999999989,0.27999999999999936],[-0.18999999999999773,0.03999999999999915],[-0.8700000000000045,-0.15000000000000036],[-0.4899999999999949,-0.9399999999999995],[-0.39000000000000057,0.10999999999999943],[1.4399999999999977,-0.1899999999999995],[0,0]],"v":[[125.67,11],[126,11.33],[122.67,11.67],[123.33,12],[124.33,12],[126.33,12],[126,12.33],[125.33,14],[123.99,14.83],[125.33,15.33],[123.33,15],[121,15],[120.33,15],[119.66,12.67],[121.78,11.83],[121.33,11.33],[125.66,11]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.2627,0.2392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[123.02199328952472,13.185269338467208]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[123.02199328952472,13.185269338467208]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 303","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 302","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3100000000000023,-0.6600000000000001],[1,0.41999999999999993],[0.6000000000000085,-0.6400000000000006],[0,0],[1.3400000000000034,-0.21000000000000085],[-1.0999999999999943,0.010000000000001563],[-0.6200000000000045,-0.09999999999999964],[-0.7199999999999989,-1.200000000000001]],"o":[[0.35999999999999943,-0.21000000000000085],[0.7999999999999972,0.75],[-0.5100000000000051,0.7000000000000011],[0,0],[-1.3100000000000023,0.1999999999999993],[-1.6500000000000057,-0.26000000000000156],[-0.3499999999999943,-0.8200000000000003],[0.15000000000000568,-1.17],[0,0]],"v":[[125.33,14],[126.33,14.67],[125.66,15.67],[123.99,17.67],[123.99,19.340000000000003],[119.99,20.010000000000005],[121.32,16.340000000000003],[123.32,15.010000000000003],[125.32,14.010000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2863,0.2667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[123.03735957434805,16.742235850563617]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[123.03735957434805,16.742235850563617]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 304","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 303","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.259999999999991,0.4900000000000002],[1.5600000000000023,-0.7300000000000004],[0.04000000000000625,-0.5],[-0.09999999999999432,-0.5799999999999983],[0.09999999999999432,-0.879999999999999],[-0.12999999999999545,-0.28000000000000114],[0.6400000000000006,-0.3200000000000003],[0,0],[0.4399999999999977,-0.8900000000000006],[0.29000000000000625,-0.11999999999999744],[0.9599999999999937,-0.14000000000000057],[-0.5600000000000023,0.620000000000001],[-0.8700000000000045,-0.15000000000000213],[0.35999999999999943,0.7600000000000016],[0.18999999999999773,0.21999999999999886]],"o":[[-0.29000000000000625,-1.3200000000000003],[1.259999999999991,-0.4900000000000002],[-0.04000000000000625,0.019999999999999574],[0.7800000000000011,0.3100000000000005],[0.5400000000000063,-0.7300000000000004],[0.09000000000000341,-0.28999999999999915],[0.21999999999999886,0.7199999999999989],[0,0],[-0.7600000000000051,0.3200000000000003],[0.29000000000000625,0.08999999999999986],[-0.9099999999999966,0.129999999999999],[-0.7900000000000063,0.05000000000000071],[-0.5600000000000023,-0.7899999999999991],[1.0300000000000011,-1.0199999999999996],[-0.09999999999999432,0.2699999999999996],[0,0]],"v":[[107.33,17.67],[109.17999999999999,14.620000000000001],[109.63999999999999,15.200000000000001],[110.32999999999998,15.340000000000002],[111.65999999999998,16.67],[112.32999999999998,17],[112.65999999999998,17],[111.32999999999998,18.67],[111.12999999999998,19.520000000000003],[109.32999999999998,21.340000000000003],[109.32999999999998,21.67],[106.32999999999998,22.340000000000003],[105.99999999999999,21.67],[106.99999999999999,20.340000000000003],[107.99999999999999,17.67],[107.32999999999998,17.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.2588,0.2353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[109.16974532520538,18.370634094774573]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[109.16974532520538,18.370634094774573]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 305","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 304","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.9699999999999989,-0.6400000000000006],[0.75,-0.08000000000000185],[-0.3299999999999841,-0.370000000000001],[1.3600000000000136,-0.08000000000000185],[0.03999999999999204,1.0999999999999996],[-0.22999999999998977,0.9000000000000004],[-0.3300000000000125,0.9299999999999997],[0,0],[0.5099999999999909,0.7200000000000006],[-1.3099999999999739,-0.3200000000000003]],"o":[[0.13999999999998636,0.6899999999999995],[0.37000000000000455,0.7999999999999989],[-1.2199999999999989,0.0799999999999983],[-1.3199999999999932,0.19000000000000128],[-0.4000000000000057,-0.6900000000000013],[-0.7299999999999898,0.5600000000000005],[1.1899999999999977,0.2599999999999998],[0,0],[1.1500000000000057,0.46000000000000085],[1.4199999999999875,0],[0,0]],"v":[[139,13.33],[140.67,15.33],[139.67,16.66],[138.33999999999997,17.330000000000002],[134.33999999999997,18.000000000000004],[133.67,15.330000000000004],[132.67,14.660000000000004],[134,13.330000000000004],[134.36,13.060000000000004],[135.33,12.660000000000004],[139,13.330000000000004]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9255,0.2824,0.2588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[136.6968721294144,15.33000062860691]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[136.6968721294144,15.33000062860691]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 306","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 305","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.13000000000000966,0.17999999999999972],[0.1700000000000017,-0.8399999999999999],[0.5499999999999972,-0.4299999999999997],[-0.3499999999999943,-0.4900000000000002],[-0.3500000000000085,-0.8200000000000003],[0.8400000000000034,-0.2699999999999996],[0.5499999999999972,-0.019999999999999574],[-0.18999999999999773,0.7100000000000009],[0.37999999999999545,0.28000000000000114],[0.14000000000000057,0.28999999999999915],[-1.2000000000000028,0.8100000000000005],[-0.9200000000000017,0.2400000000000002],[-0.03999999999999204,0.27999999999999936],[-0.7000000000000028,0.35999999999999943],[-0.45999999999999375,0.09999999999999964]],"o":[[0.7999999999999972,0.7300000000000004],[0.09000000000000341,-0.11999999999999922],[0.29000000000000625,0.4900000000000002],[0.7900000000000063,-0.07000000000000028],[0.14000000000000057,-0.9000000000000004],[0.8799999999999955,0.15000000000000036],[-0.25,0.6400000000000006],[-0.4399999999999977,0.019999999999999574],[-0.3400000000000034,0.3099999999999987],[-0.0799999999999983,0.3000000000000007],[-1.25,0.03999999999999915],[-0.480000000000004,-0.7200000000000006],[0.18000000000000682,-0.3800000000000008],[-0.480000000000004,-0.08999999999999986],[0.45000000000000284,-0.11999999999999922],[0,0]],"v":[[116.33,12.33],[116.28,12.65],[119,12.99],[118.62,14.36],[120.33,14.99],[121,14.99],[121,15.66],[118.81,19.23],[116.43,17.5],[115.33000000000001,17.32],[115.00000000000001,17.32],[114.00000000000001,15.65],[114.33000000000001,14.32],[114.66000000000001,13.32],[114.99000000000001,12.65],[116.32000000000001,12.32]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2588,0.2353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[117.54646052783784,15.775125275630074]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[117.54646052783784,15.775125275630074]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 307","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 306","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.5699999999999932,-0.09999999999999964],[-0.5099999999999909,-0.23000000000000043],[0.020000000000010232,-0.040000000000000924],[0.5600000000000023,0.25],[0.6699999999999875,-0.019999999999999574],[0.0800000000000125,1],[0.46999999999999886,1.040000000000001],[0,0],[0.7900000000000205,0.009999999999999787],[1.450000000000017,0.9199999999999999],[-0.009999999999990905,0.8300000000000001],[-0.10999999999998522,0.7400000000000002],[-1.3799999999999955,0.16999999999999993],[0,0],[0.46000000000000796,0.2599999999999998],[-0.03999999999999204,-0.02999999999999936],[1.1599999999999966,0.5399999999999991],[-0.3200000000000074,1.450000000000001],[0.6400000000000006,-0.8499999999999996],[0.6000000000000085,0.6699999999999999],[0.6099999999999994,0.2599999999999998],[0.1599999999999966,0.75],[-0.37000000000000455,0.9500000000000011],[-0.3500000000000085,-0.030000000000001137],[-0.21999999999999886,0.4399999999999995],[-1.1500000000000057,-0.21000000000000085]],"o":[[0,0],[0.5600000000000023,0.10999999999999943],[0.6100000000000136,-0.009999999999999787],[0.020000000000010232,0.02999999999999936],[0.4099999999999966,0.46000000000000085],[-0.44999999999998863,0.1899999999999995],[-0.5099999999999909,0.9499999999999993],[-0.8100000000000023,0.34999999999999964],[0,0],[-0.09999999999999432,0.4499999999999993],[1.0699999999999932,1.1500000000000004],[-0.38999999999998636,0.8399999999999999],[-1,0.5199999999999996],[-0.28000000000000114,-0.5899999999999999],[0,0],[-0.46000000000000796,0.17999999999999972],[-0.21999999999999886,0.8800000000000008],[0.9000000000000057,0.7599999999999998],[-1.2999999999999972,0.9100000000000001],[-0.21000000000000796,-0.8200000000000003],[0.45999999999999375,0.8300000000000001],[-0.730000000000004,0.2599999999999998],[-0.20999999999999375,0.6899999999999995],[-0.4000000000000057,1.25],[0.060000000000002274,-0.16000000000000014],[0.01999999999999602,0],[0.04000000000000625,-1.2699999999999996],[0,0]],"v":[[138,12],[139.67,12.33],[141.33999999999997,12.66],[143.00999999999996,12.99],[143.00999999999996,13.32],[142.67999999999995,13.65],[141.00999999999996,13.98],[139.00999999999996,13.31],[136.65999999999997,13.01],[135.33999999999997,12.65],[134.00999999999996,13.32],[132.67999999999995,14.65],[131.34999999999994,14.32],[130.01999999999992,13.99],[131.67999999999992,12.85],[131.67999999999992,11.99],[130.01999999999992,11.99],[129.74999999999991,12.11],[129.24999999999991,13.2],[128.26999999999992,12.489999999999998],[127.01999999999992,11.659999999999998],[126.34999999999992,11.989999999999998],[124.34999999999992,11.989999999999998],[123.34999999999992,11.989999999999998],[122.38999999999993,11.439999999999998],[125.75999999999993,11.149999999999999],[125.67999999999994,10.989999999999998],[138.00999999999993,11.989999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.2157,0.1882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[132.76913428241548,12.85743204030527]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[132.76913428241548,12.85743204030527]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 308","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 307","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4299999999999784,-0.1700000000000017],[0.35000000000002274,-0.6700000000000017],[0.589999999999975,-1.1099999999999994],[0.21999999999999886,-0.04999999999999716],[0.5699999999999932,0.21000000000000085],[0.08999999999997499,0.030000000000001137],[-1.8100000000000023,0.769999999999996],[0.5400000000000205,-0.8399999999999963],[0,0],[1.3499999999999943,-0.3200000000000003],[0.799999999999983,0],[0.9799999999999898,-0.14999999999999858],[0.6199999999999761,-0.28000000000000114],[1.9299999999999784,0.9200000000000017],[0.11000000000001364,0.10999999999999943],[0.46999999999999886,0.5399999999999991],[0.4199999999999875,-0.3100000000000023],[-0.060000000000002274,-0.5499999999999972],[0,0],[1.0999999999999943,0.1599999999999966],[0.11999999999997613,0.10999999999999943],[-0.789999999999992,0.5500000000000043],[0,0],[-0.25,0.7999999999999972],[0,0],[0.8599999999999852,0.7199999999999989],[-0.18999999999999773,0.4200000000000017],[-1.5600000000000023,-0.13999999999999702],[-0.3100000000000023,-0.4399999999999977],[0.4399999999999977,0.9099999999999966],[-0.28999999999999204,0.11999999999999744],[0.05000000000001137,-0.14000000000000057],[-0.28999999999999204,0.5199999999999996],[-0.7300000000000182,0.06999999999999673],[0.6200000000000045,0.629999999999999],[-0.700000000000017,0.029999999999997584],[0.46000000000000796,0.4200000000000017],[-1.299999999999983,-0.10999999999999943]],"o":[[-0.020000000000010232,0.28000000000000114],[0.6299999999999955,0.05000000000000071],[-0.5,1.6499999999999986],[-0.18999999999999773,0.020000000000003126],[-1.6699999999999875,0.4399999999999977],[-0.1699999999999875,-0.060000000000002274],[-0.7400000000000091,1.7299999999999969],[-0.3400000000000034,-0.6199999999999974],[0,0],[1.8799999999999955,1.75],[-0.37999999999999545,0.8599999999999994],[-0.5800000000000125,-1.2800000000000011],[-0.6200000000000045,-0.22999999999999687],[-0.09999999999999432,0.07000000000000028],[-0.11000000000001364,-0.10999999999999943],[-0.6500000000000057,0.3100000000000023],[0.020000000000010232,0.46000000000000085],[0.37000000000000455,0.36999999999999744],[0,0],[-0.6500000000000057,0.8999999999999986],[-0.710000000000008,-0.4399999999999977],[-0.5,-0.6799999999999997],[0,0],[0.19999999999998863,-0.8599999999999994],[0,0],[-0.6100000000000136,0.38000000000000256],[0,-0.03999999999999915],[1.5999999999999943,-0.20000000000000284],[0.5,0.3500000000000014],[0.44999999999998863,0.6400000000000006],[-0.28999999999999204,-0.09000000000000341],[-0.4000000000000057,-1.3000000000000007],[-0.030000000000001137,0.0799999999999983],[0.47999999999998977,-0.629999999999999],[0.5699999999999932,0.370000000000001],[0.18999999999999773,-0.019999999999999574],[0.5300000000000011,0.10000000000000142],[1.2700000000000102,-0.8900000000000006],[0,0]],"v":[[156.67,30.67],[156,31.340000000000003],[156.67,32.34],[157,35.34],[156.33,35.67],[155.11,35.34],[154.66000000000003,35.34],[152.66000000000003,33.010000000000005],[151.33,33.34],[151.87,33.900000000000006],[152.66,37.010000000000005],[150.99,37.68000000000001],[147.99,37.35000000000001],[146.32000000000002,37.35000000000001],[144.65000000000003,37.68000000000001],[144.32000000000002,37.35000000000001],[142.39000000000001,36.57000000000001],[141.98000000000002,37.68000000000001],[143.31000000000003,38.68000000000001],[142.15000000000003,38.35000000000001],[139.65000000000003,39.35000000000001],[138.98000000000005,38.35000000000001],[138.98000000000005,36.68000000000001],[138.64000000000004,36.510000000000005],[139.31000000000003,34.010000000000005],[139.17000000000004,33.52],[136.97000000000006,33.010000000000005],[136.64000000000004,32.34],[141.97000000000006,31.67],[143.30000000000007,33],[144.63000000000008,33],[144.63000000000008,32.67],[146.88000000000008,31.880000000000003],[145.63000000000008,31.340000000000003],[147.9600000000001,31.010000000000005],[148.63000000000008,31.010000000000005],[149.9600000000001,30.680000000000007],[151.9600000000001,30.680000000000007],[156.63000000000008,30.680000000000007]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.2549,0.2314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[146.8722189324114,34.826551728986544]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[146.8722189324114,34.826551728986544]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 309","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 308","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[5.070000000000022,-0.4400000000000013],[15.329999999999984,-2.3000000000000007],[4.420000000000002,-1.3000000000000007],[-3.049999999999997,0.9299999999999997],[-6.660000000000011,1.0200000000000031],[-13.179999999999978,-0.9899999999999984],[1.7600000000000193,-4.330000000000002]],"o":[[-4.949999999999989,-1.3200000000000003],[-15.360000000000014,1.3399999999999999],[-4.549999999999997,0.6799999999999997],[-0.5,-3.3299999999999983],[6.489999999999995,-1.9899999999999984],[13.370000000000005,-2.039999999999999],[3.5200000000000102,0.26000000000000156],[0,0]],"v":[[162,24],[147.51,23],[100.22,29.38],[86.67,32],[90.45,26.29],[110.79,23.299999999999997],[155.51,17.659999999999997],[161.98999999999998,24.009999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0824,0.098,0.1059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[124.46628473131022,24.76097832080822]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[124.46628473131022,24.76097832080822]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 310","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 309","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-0.11000000000001364],[0,0],[-0.240000000000002,0.4800000000000182],[0,0],[-0.020000000000003126,-0.3300000000000125]],"o":[[0,0.11000000000001364],[0,0],[0,-0.30000000000001137],[0,0],[0.020000000000003126,0.3300000000000125],[0,0]],"v":[[50,131.33],[50,131.66000000000003],[49.67,131.66000000000003],[49.67,130.33],[50,130.33],[50,131.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8784,0.3843,0.3529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[49.78456803380493,130.99498231339106]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[49.78456803380493,130.99498231339106]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 311","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 310","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.01999999999999602,-0.10000000000002274],[0,0.5300000000000011],[0.030000000000001137,-0.4300000000000068]],"o":[[0,0.11000000000001364],[-0.5400000000000063,-0.3199999999999932],[0.46999999999999886,0.21999999999999886],[0,0]],"v":[[123.67,140.33],[123.67,140.66000000000003],[123.34,138.99000000000004],[123.67,140.32000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3412,0.3412,0.349]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[123.50127408260576,139.82500291830877]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[123.50127408260576,139.82500291830877]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 312","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 311","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.39000000000000057,-0.2600000000000051],[0,0],[-0.29000000000000625,-0.060000000000002274]],"o":[[-0.4899999999999949,0.4000000000000057],[0,0],[0.21999999999999886,0.0799999999999983],[0,0]],"v":[[91,95.67],[90,96.34],[90,95.67],[91,95.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6941,0.2784,0.2275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[90.50004764171928,95.99727340278372]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[90.50004764171928,95.99727340278372]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 313","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 312","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.44000000000002615,-0.009999999999990905],[1,-2.089999999999975],[1.710000000000008,0.18999999999999773],[0.4000000000000057,0.8299999999999841],[0.5799999999999841,0.2599999999999909],[1.3100000000000023,0.5800000000000409],[0,0],[0,0],[0,0],[-1.8100000000000023,-0.2400000000000091],[0.4199999999999875,0.009999999999990905],[-0.5300000000000011,0.009999999999990905]],"o":[[0.2400000000000091,0.5],[-0.25,2.3500000000000227],[-1.6399999999999864,0.22000000000002728],[0.12000000000000455,-0.9499999999999886],[-0.3400000000000034,-0.6999999999999886],[-0.539999999999992,-0.2400000000000091],[0,0],[0,0],[0,0],[1.7800000000000011,0.060000000000002274],[0.020000000000010232,-0.6000000000000227],[0.3199999999999932,-0.5400000000000205],[0,0]],"v":[[244,306],[245.33,306.33],[246.33,310.33],[241.33,311],[242.99,310.17],[241.33,309.85],[239.82000000000002,308],[238.99,309.33],[239.32000000000002,307.65999999999997],[238.66000000000003,306.99999999999994],[243.99000000000004,306.65999999999997],[242.33000000000004,306.33],[244.00000000000003,306]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4863,0.498,0.5098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[242.62387885001388,308.49935791595107]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[242.62387885001388,308.49935791595107]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 314","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 313","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.5500000000000114,-0.05000000000001137],[0.28999999999999204,0.009999999999990905],[-0.36000000000001364,0.03999999999996362]],"o":[[0,0],[-0.1599999999999966,0.029999999999972715],[-0.09000000000000341,-0.3199999999999932],[0.1599999999999966,-0.44999999999998863],[0,0]],"v":[[247,305.67],[247.67,306],[246.67,306.33],[246,306],[247,305.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4863,0.498,0.5098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[246.8349972631116,305.99998789952184]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[246.8349972631116,305.99998789952184]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 315","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 314","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0.22999999999998977],[0,0.22999999999998977],[0,0.22999999999998977],[-0.11999999999999744,-0.28999999999999204],[0.5499999999999972,-0.36000000000001364]],"o":[[0,-0.21999999999999886],[0,-0.22999999999998977],[0,-0.22999999999998977],[0.09000000000000341,-0.28999999999999204],[0,0.6299999999999955],[0,0]],"v":[[49.67,133.67],[49.67,133],[49.67,132.33],[49.67,131.66000000000003],[50,131.66000000000003],[49.67,133.66000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8235,0.2588,0.2196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[49.85676170615446,132.6649909441602]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[49.85676170615446,132.6649909441602]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 316","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 315","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.37999999999999545,0.5800000000000125],[-0.7399999999999949,-0.15000000000000568]],"o":[[-0.6299999999999955,-0.05000000000001137],[0.6099999999999994,0.12000000000000455],[0,0]],"v":[[119.67,234],[117.67,233.67],[119.67,234]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.851,0.8627,0.8549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[118.67003053522345,233.85193669610175]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[118.67003053522345,233.85193669610175]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 317","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 316","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7000000000000028,0.27000000000001023],[-0.1700000000000017,0.2600000000000051],[0,0]],"o":[[-0.20999999999999375,0.10999999999999943],[-0.23999999999999488,-0.7199999999999989],[0,0],[0,0]],"v":[[80,101.67],[79,102.33],[79.66,101.33],[79.99,101.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3608,0.149,0.1216]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[79.47607188349107,101.85711256890656]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[79.47607188349107,101.85711256890656]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 318","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 317","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3299999999999983,-0.020000000000003126],[0,0],[0.4000000000000057,0.6000000000000014],[-0.3299999999999983,-0.020000000000003126]],"o":[[0.3299999999999983,0.020000000000003126],[0,0],[-0.6099999999999994,-0.04999999999999716],[0.3299999999999983,0],[0,0]],"v":[[93,38.67],[94,38.67],[94,39],[92,38.67],[93,38.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.4784,0.4431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[93.00005460259706,38.851174797976455]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[93.00005460259706,38.851174797976455]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 319","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 318","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.21000000000000796,0.7199999999999989],[-0.21999999999999886,-0.10999999999998522]],"o":[[0,0],[-0.27000000000001023,-0.30000000000001137],[0.6999999999999886,-0.2599999999999909],[0,0]],"v":[[144.33,130.67],[144,131],[143.34,130],[144.34,130.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2353,0.1725,0.1294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[143.8181499192805,130.47441955823308]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[143.8181499192805,130.47441955823308]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 320","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 319","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.030000000000001137,-0.04999999999999716],[-0.29000000000000625,0.23999999999999488]],"o":[[0,0],[-0.37000000000000455,0.3100000000000023],[0.18999999999999773,-0.1599999999999966],[0,0]],"v":[[86,73.67],[86.66,74.33],[85.33,74.33],[86,73.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6824,0.2039,0.1608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.99503907912023,74.05863747732366]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.99503907912023,74.05863747732366]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 321","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 320","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.18000000000000682,-0.5],[-0.01999999999998181,0.5300000000000011],[0,0]],"o":[[-0.12000000000000455,0.3400000000000034],[-0.6800000000000068,-0.3199999999999932],[0,0],[0,0]],"v":[[350.33,110.27],[350,111.6],[350,109.92999999999999],[350.33,110.25999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.7765,0.6039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[350.01159823646515,110.76498968041244]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[350.01159823646515,110.76498968041244]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 322","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 321","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.46999999999999886,-0.12000000000000455],[-0.9300000000000068,-0.39999999999997726]],"o":[[-0.5300000000000011,0.5600000000000023],[-1.7299999999999898,-0.03999999999999204],[0,0]],"v":[[201.33,152.33],[200,152.66000000000003],[201.33,152.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.7255,0.5608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[200.3366990060737,152.43286047514277]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[200.3366990060737,152.43286047514277]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 323","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 322","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.549999999999983,0.09999999999999432],[-0.10000000000002274,0.4299999999999784],[0,0]],"o":[[-0.21999999999999886,0.47999999999998977],[-0.28999999999999204,-0.710000000000008],[0,0],[0,0]],"v":[[175.33,162.67],[174.67000000000002,164],[175.00000000000003,162.33],[175.33000000000004,162.66000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3176,0.3176,0.3137]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[174.9565726066027,163.16861887036532]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[174.9565726066027,163.16861887036532]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 324","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 323","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.23999999999999488,-0.20000000000000284],[-0.23999999999999488,0.4299999999999926],[0,0]],"o":[[-0.35999999999999943,0.29999999999999716],[0.010000000000005116,-0.5600000000000023],[0,0],[0,0]],"v":[[76.33,79.67],[75.33,80.34],[76,79.01],[76.33,79.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8157,0.6784,0.651]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[75.83002271889933,79.67499467570022]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[75.83002271889933,79.67499467570022]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 325","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 324","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.3400000000000034,0.03999999999996362],[0,0],[-0.5099999999999909,-0.0999999999999659]],"o":[[0,0],[-0.28999999999999204,-0.17000000000001592],[0,0],[0.8000000000000114,-0.3100000000000023],[0,0]],"v":[[245.67,286],[244.67,286.33],[243.67,285.99],[243.67,285.66],[245.67,285.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7137,0.7098,0.7098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[244.66998327318586,285.9475634361133]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[244.66998327318586,285.9475634361133]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 326","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 325","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.8099999999999739,0.6700000000000017],[-0.12000000000000455,-0.3299999999999983]],"o":[[0.12000000000000455,1.6599999999999966],[0.13999999999998636,0.3400000000000034],[0,0]],"v":[[149,67.33],[148.67,66.33],[149,67.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.7569,0.5765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[148.7024190920114,67.15248767498278]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[148.7024190920114,67.15248767498278]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 327","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 326","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.14999999999999858,-0.2599999999999909],[0,-0.11000000000001364],[0,0],[0.25,0.36000000000001364],[0,0]],"o":[[0.240000000000002,0.18999999999999773],[0,0.11000000000001364],[0,0],[-0.020000000000003126,-0.4300000000000068],[0,0],[0,0]],"v":[[49.67,133],[49.67,133.67],[49.67,134],[49.010000000000005,134.33],[48.67,133],[49.67,133]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8588,0.2588,0.2235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[49.244100764627234,133.66499372851138]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[49.244100764627234,133.66499372851138]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 328","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 327","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.14999999999999858,-0.5400000000000063],[0.10000000000000142,0.1599999999999966],[0,0],[0,0]],"o":[[-0.14999999999999858,0.4300000000000068],[-0.2700000000000031,-0.14000000000000057],[0,0],[0,0],[0,0]],"v":[[51.67,124.33],[51.34,126],[51.010000000000005,125.33],[51.35000000000001,124],[51.68000000000001,124.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.6078,0.5647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[51.34504212392352,124.99998154481722]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[51.34504212392352,124.99998154481722]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 329","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 328","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.1699999999999875,-0.4300000000000068],[0.5599999999999739,0.589999999999975],[-0.5599999999999739,-0.029999999999972715]],"o":[[0.37000000000000455,0.01999999999998181],[-0.8400000000000034,0],[0.5500000000000114,0.01999999999998181],[0,0]],"v":[[235,311.33],[236,311.65999999999997],[233.33,311.33],[235,311.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5294,0.5373,0.549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[234.66501911019762,311.51861393406153]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[234.66501911019762,311.51861393406153]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 330","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 329","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.6399999999999864,-0.07999999999998408],[-0.0999999999999659,0.19999999999998863],[-0.38999999999998636,0.07999999999998408]],"o":[[0,0],[-0.6399999999999864,0.11000000000001364],[-0.029999999999972715,-0.3100000000000023],[0.4200000000000159,-0.05000000000001137],[0,0]],"v":[[290.33,295.33],[290.65999999999997,295.65999999999997],[288.65999999999997,295.98999999999995],[288.98999999999995,295.31999999999994],[290.31999999999994,295.31999999999994]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6784,0.6863,0.6902]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[289.6589222321078,295.6490832828708]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[289.6589222321078,295.6490832828708]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 331","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 330","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.30000000000001137,-0.5500000000000114],[0.4200000000000159,0.009999999999990905],[-0.1599999999999966,1.2699999999999818],[-0.6599999999999966,-0.040000000000020464]],"o":[[0.46000000000000796,-0.2699999999999818],[-0.4199999999999875,0.040000000000020464],[-0.12999999999999545,1.1299999999999955],[0.6599999999999966,-0.009999999999990905],[0,0]],"v":[[246,306],[246.67,306.33],[245.33999999999997,306.33],[244.00999999999996,306],[246.00999999999996,306]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6039,0.6118,0.6235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[245.37838492714795,306.45815000322796]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[245.37838492714795,306.45815000322796]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 332","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 331","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.3300000000000125,0.00999999999999801],[-0.5100000000000193,-0.00999999999999801],[-0.5300000000000011,0.6000000000000014]],"o":[[0,0],[-0.3300000000000125,-0.020000000000003126],[-0.8100000000000023,-0.18999999999999773],[0.12000000000000455,0],[0,0]],"v":[[132.67,38.33],[132.67,39],[131.67,39],[131.5,38.01],[132.67,38.339999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.3882,0.3647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[131.87995983212616,38.505990715846366]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[131.87995983212616,38.505990715846366]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 333","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 332","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.14000000000000057,0.5100000000000051],[0.8100000000000023,-0.7600000000000051]],"o":[[-0.20999999999999375,-0.5499999999999972],[-0.04000000000000625,-1.8599999999999994],[0,0]],"v":[[110.67,73.33],[110.34,71.66],[110.67,73.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.8039,0.6235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[110.64687921512339,72.17949211774922]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[110.64687921512339,72.17949211774922]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 334","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 333","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5900000000000034,-0.3100000000000023],[-1.2000000000000028,0.04999999999999716]],"o":[[-0.5,0.2600000000000051],[-0.25,-1.4500000000000028],[0,0]],"v":[[71,106],[69.33,107],[71,106]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7882,0.651,0.6157]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[70.1403372908741,106.47790568955838]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[70.1403372908741,106.47790568955838]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 335","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 334","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.8499999999999943,0.21999999999999886],[-0.9900000000000091,0.060000000000002274]],"o":[[0,0],[-0.11000000000001364,-0.0800000000000125],[0.9900000000000091,-0.03999999999999204],[0,0]],"v":[[153,242.33],[152.67,242.66000000000003],[150,242.33],[153,242.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.851,0.8627,0.8549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[151.50003834651224,242.4901175948973]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[151.50003834651224,242.4901175948973]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 336","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 335","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.5200000000000102,0.020000000000010232],[0.15000000000000568,-0.5200000000000102]],"o":[[0,0],[0.2400000000000091,-0.1699999999999875],[0.2400000000000091,0.8100000000000023],[0,0]],"v":[[206.33,152.67],[206,151.67],[207,150.67],[206.34,152.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7216,0.7255,0.7255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[206.5235792897977,151.6700000708227]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[206.5235792897977,151.6700000708227]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 337","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 336","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.9599999999999937,0.25],[-0.10000000000000853,0.3400000000000034],[0,0]],"o":[[-0.29000000000000625,0.6999999999999886],[-0.23000000000000398,-0.21999999999999886],[0,0],[0,0]],"v":[[71.33,184],[70.33,185.33],[71,183.33],[71.33,184]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.451,0.451,0.451]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[70.80938772061924,184.3517192526645]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[70.80938772061924,184.3517192526645]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 338","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 337","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.8599999999999994,-0.19999999999998863],[0,0],[0.3100000000000023,0.08999999999997499]],"o":[[0.4399999999999977,-0.3100000000000023],[0,0],[0,-0.28000000000000114],[0,0]],"v":[[117,148],[118.67,147],[117.34,148.66],[117.01,147.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.702,0.7059,0.702]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[117.83503617209581,147.81551083541638]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[117.83503617209581,147.81551083541638]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 339","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 338","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.8799999999999955,-0.01999999999998181],[0.37000000000000455,-0.4500000000000455],[0.22999999999998977,0],[0.28999999999999204,0.12999999999999545],[0,0]],"o":[[0.8799999999999955,0.029999999999972715],[0.12999999999999545,0.5500000000000114],[-0.21999999999999886,0],[-0.37000000000000455,-0.07999999999998408],[0,0],[0,0]],"v":[[235,311],[237.66,311],[236.66,311.66],[235.99,311.66],[234.99,311.33000000000004],[234.99,311.00000000000006]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5647,0.5686,0.5804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[236.33238044060218,311.32755050398623]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[236.33238044060218,311.32755050398623]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 340","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 339","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.8499999999999943,-0.29999999999999716],[0.3300000000000125,0.020000000000003126],[-0.8899999999999864,0.38000000000000256],[0,0]],"o":[[1.0600000000000023,0.259999999999998],[-0.3300000000000125,-0.030000000000001137],[-0.8899999999999864,-0.060000000000002274],[0,0],[0,0]],"v":[[132.67,38],[133.67,39],[132.67,39],[132.67,38.33],[132.67,38]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.6824,0.6588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[133.23696997993508,38.50241785557981]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[133.23696997993508,38.50241785557981]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 341","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 340","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.75,-0.6299999999999955],[-0.30000000000001137,0.5],[0,0]],"o":[[-0.6299999999999955,0.75],[-0.6200000000000045,-0.4099999999999966],[0,0],[0,0]],"v":[[136.67,157],[135,158.67],[136.5,156.67999999999998],[136.66,157.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.7882,0.6118]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[135.7710733733288,157.67497300092043]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[135.7710733733288,157.67497300092043]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 342","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 341","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.0999999999999943,0.28000000000000114],[0.8199999999999932,0.28000000000000114],[-0.21999999999999886,0.14000000000000057],[-0.01999999999998181,0.030000000000001137],[-0.030000000000001137,0.3500000000000014]],"o":[[0.6399999999999864,0.5499999999999972],[-0.5800000000000125,0.13000000000000256],[0.03999999999999204,-0.00999999999999801],[0.21000000000000796,-0.13000000000000256],[0.09000000000000341,-0.13000000000000256],[0,0]],"v":[[148.33,38.67],[149.33,40],[147.33,40.33],[147.66000000000003,39.86],[148.33,40],[148.33,38.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.4471,0.4196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[148.33002553921634,39.54312537110127]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[148.33002553921634,39.54312537110127]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 343","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 342","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3299999999999983,-0.020000000000003126],[-0.7199999999999989,-1.0300000000000011],[0.39000000000000057,-0.0799999999999983],[0,0],[-0.21999999999999886,-0.00999999999999801]],"o":[[0.3299999999999983,0.020000000000003126],[0.010000000000005116,0.6400000000000006],[-0.4200000000000017,0.060000000000002274],[0,0],[0.20999999999999375,-0.020000000000003126],[0,0]],"v":[[90,39],[91,39],[90.67,39.99],[89.33,39.99],[89.33,38.99],[90,38.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.3451,0.3137]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[90.16507457528124,39.49192100878551]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[90.16507457528124,39.49192100878551]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 344","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 343","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8600000000000136,-0.28999999999999204],[-0.3100000000000023,0.660000000000025],[0,0]],"o":[[-0.36000000000001364,0.5500000000000114],[-0.11000000000001364,-0.9300000000000068],[0,0],[0,0]],"v":[[169.67,162.67],[168.33999999999997,164.67],[169.33999999999997,162.33999999999997],[169.67,162.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1765,0.1765,0.1765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[168.99984821848884,163.5049852527847]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[168.99984821848884,163.5049852527847]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 345","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 344","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12999999999999545,-0.9600000000000009],[0.030000000000001137,0],[-0.4099999999999966,0.7100000000000009],[0,0]],"o":[[-0.5400000000000063,0.7199999999999989],[-0.14000000000000057,-0.04999999999999716],[0,-1.0399999999999991],[0,0],[0,0]],"v":[[80.33,50.67],[78.97,53],[78.67,52.67],[80,50.34],[80.33,50.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9176,0.2353,0.2157]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[79.50003691837082,51.66998039439159]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[79.50003691837082,51.66998039439159]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 346","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 345","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6200000000000045,0.46000000000000085],[-0.03999999999999204,-0.6599999999999966]],"o":[[-0.9000000000000057,0.13000000000000256],[0.4300000000000068,0.490000000000002],[0,0]],"v":[[171,41],[170,39],[171,41]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6824,0.302,0.251]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[170.38390860085067,40.003586446176655]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[170.38390860085067,40.003586446176655]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 347","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 346","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.4399999999999977,0.5300000000000011],[-0.6299999999999955,-0.710000000000008]],"o":[[0,0],[-0.9499999999999886,-0.46000000000000796],[0.8799999999999955,0.46000000000000796],[0,0]],"v":[[147.67,143.33],[147.51,143.66000000000003],[145.67,141.33],[147.67,143.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.8078,0.6235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[146.67002887899903,142.49499442891505]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[146.67002887899903,142.49499442891505]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 348","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 347","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.39000000000000057,-0.5],[0.09000000000000341,-0.11999999999999744],[-0.3100000000000023,0.5899999999999963],[-0.29000000000000625,0.4799999999999969]],"o":[[1.6700000000000017,0.09000000000000341],[-0.09000000000000341,0.11999999999999744],[-0.46999999999999886,0.4399999999999977],[0.21999999999999886,-0.38000000000000256],[0,0]],"v":[[80.67,49],[80.67,50.33],[80.34,50.66],[80.01,50.33],[80.68,49]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.749,0.7333]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[80.67997650946029,49.952250691260105]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[80.67997650946029,49.952250691260105]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 349","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 348","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.05000000000001137,-0.14999999999997726],[0.8799999999999955,-0.13999999999998636],[-0.12000000000000455,0.3499999999999659],[-1.0200000000000102,-0.020000000000038654]],"o":[[0,0.05000000000001137],[-0.8799999999999955,0.11000000000001364],[-0.5699999999999932,0.12999999999999545],[1,-0.11000000000001364],[0,0]],"v":[[250,305.33],[250.34,305.65999999999997],[247.67000000000002,305.99999999999994],[247.00000000000003,305.66999999999996],[250.00000000000003,305.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5843,0.5961,0.6118]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[248.65419022645872,305.69138831416]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[248.65419022645872,305.69138831416]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 350","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 349","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.18000000000000682,0.47999999999998977],[-0.3299999999999983,-0.13000000000002387],[-0.21999999999999886,-0.6899999999999977]],"o":[[0,0],[-0.0799999999999983,-0.3100000000000023],[-0.12000000000000455,-0.5800000000000125],[0.23999999999999488,0.6800000000000068],[0,0]],"v":[[86,134.33],[85.67,134.66000000000003],[85,132.99000000000004],[85.33,132.32000000000005],[86,134.32000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1804,0.1843,0.1804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.47728286043906,133.47193984703398]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.47728286043906,133.47193984703398]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 351","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 350","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.37000000000000455,-0.910000000000025],[0.9799999999999898,0.22000000000002728]],"o":[[0.5600000000000023,-0.6200000000000045],[-0.9799999999999898,-0.160000000000025],[0,0]],"v":[[220.33,309.33],[223.33,310],[220.33,309.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6627,0.6706,0.6824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[221.84675093566105,309.51295548337765]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[221.84675093566105,309.51295548337765]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 352","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 351","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.8899999999999864,0.4399999999999977],[0.2699999999999818,-0.2400000000000091],[0.8199999999999932,-0.3100000000000023],[0,0]],"o":[[0.8700000000000045,-0.46999999999999886],[0.3300000000000125,-0.01999999999999602],[-0.6599999999999966,0.5699999999999932],[0,0],[0,0]],"v":[[151.33,112],[154,110.67],[154.18,111.01],[151.52,112.32000000000001],[151.33,112.00000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.7804,0.6039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[152.82942102886184,111.4938730793009]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[152.82942102886184,111.4938730793009]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 353","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 352","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.46999999999999886,0.11999999999997613],[0.18000000000000682,1.259999999999991],[-0.46000000000000796,-1.4300000000000068]],"o":[[-0.3400000000000034,0.1699999999999875],[0.6899999999999977,-1.2199999999999989],[0.8000000000000114,1.3400000000000034],[0,0]],"v":[[158.67,135.67],[157.67,136],[157.67,132.34],[158.67,135.67000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9569,0.8275,0.6235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[158.17002109000904,134.1845214489403]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[158.17002109000904,134.1845214489403]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 354","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 353","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.37000000000000455,-0.3400000000000034],[0.12000000000000455,0.10000000000000142],[-1.0600000000000023,0.3399999999999963],[0,0]],"o":[[-0.29999999999999716,0.2700000000000031],[-0.12000000000000455,-0.10000000000000142],[0.5100000000000051,-0.740000000000002],[0,0],[0,0]],"v":[[110.67,49.67],[109.67,50.67],[109.34,50.34],[110.51,48.68000000000001],[110.67,49.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9647,0.902,0.8863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[110.00501835152926,49.6749907632223]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[110.00501835152926,49.6749907632223]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 355","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 354","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.9000000000000057,-0.3200000000000074],[-0.769999999999996,0.6099999999999994],[-0.29999999999999716,0.3100000000000023],[0,0]],"o":[[-0.5900000000000034,0.5],[0.04999999999999716,-0.060000000000002274],[0.28000000000000114,-0.23000000000000398],[0,0],[0,0]],"v":[[71.33,83.67],[69.33,85.34],[70,84.01],[71.17,83.35000000000001],[71.33,83.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8706,0.6392,0.6275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[70.33004721399612,84.34499175500878]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[70.33004721399612,84.34499175500878]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 356","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 355","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6299999999999955,-0.060000000000002274],[-0.13000000000002387,0.19000000000000483],[0.75,-1.2800000000000011]],"o":[[-0.6500000000000057,0.020000000000003126],[0.12999999999999545,-0.20000000000000284],[0.9900000000000091,-0.21000000000000085],[0,0]],"v":[[130.33,39],[128.33,39],[128.66000000000003,38.33],[130.33,39]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.3882,0.3647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[129.4347699028587,38.552358281255295]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[129.4347699028587,38.552358281255295]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 357","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 356","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.060000000000002274,-0.21999999999999886],[0.06999999999999318,0.06999999999999318],[0.37000000000000455,-0.060000000000002274],[-0.5600000000000023,0.010000000000005116],[-0.060000000000002274,0]],"o":[[0.15000000000000568,0.4399999999999977],[-0.03999999999999204,-0.25],[-0.11000000000001364,-0.09999999999999432],[0.47999999999998977,-0.35999999999999943],[0.6899999999999977,-0.01999999999999602],[0,0]],"v":[[134.33,109.33],[134,110.33],[134,109.33],[131,109.66],[133.24,109.00999999999999],[134.33,109.32999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8627,0.8706,0.8627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[132.68107671239218,109.66956465585073]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[132.68107671239218,109.66956465585073]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 358","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 357","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.1499999999999773,-0.23999999999995225],[0,0],[-1,0.2599999999999909]],"o":[[0,0],[-1.1499999999999773,0.3100000000000023],[0,0],[1.0400000000000205,-0.18999999999999773],[0,0]],"v":[[294.67,290],[294.86,290.35],[291.34000000000003,291],[291.34000000000003,290.67],[294.67,290]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6078,0.6157,0.6314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[293.1000146158383,290.50000445562137]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[293.1000146158383,290.50000445562137]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 359","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 358","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6399999999999864,0.03999999999999915],[-0.060000000000002274,0.4099999999999966],[0,0]],"o":[[-0.6500000000000057,0.030000000000001137],[0.03999999999999204,-0.4299999999999997],[0,0],[0,0]],"v":[[145,40.67],[143,40.67],[143,39.34],[145,40.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8314,0.8157]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[143.99016472943893,40.01818640721015]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[143.99016472943893,40.01818640721015]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 360","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 359","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.2699999999999818,-0.37000000000000455],[0.6000000000000227,-0.1700000000000017],[0.21999999999999886,-0.030000000000001137],[0.060000000000002274,0.00999999999999801],[-0.37999999999999545,0.29999999999999716],[-0.20999999999997954,-0.2700000000000031],[0.30999999999997385,-0.5899999999999963]],"o":[[-0.21999999999999886,0.22999999999999687],[0.6100000000000136,0.3400000000000034],[-0.21999999999999886,0.020000000000003126],[-0.12999999999999545,-0.060000000000002274],[0.18000000000000682,-0.5399999999999991],[0.2400000000000091,-0.490000000000002],[0.46999999999999886,-0.4399999999999977],[0,0]],"v":[[129.33,37.67],[128.66000000000003,38.34],[128.33,39.010000000000005],[127.66000000000001,39.010000000000005],[127.33000000000001,38.68000000000001],[128.33,37.68000000000001],[129,37.35000000000001],[129.33,37.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.8118,0.8]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[128.4084732554875,38.06015945857547]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[128.4084732554875,38.06015945857547]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 361","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 360","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.07999999999998408,0.6299999999999955],[-0.22999999999998977,-0.9099999999999966]],"o":[[0,0],[-0.5200000000000102,-1],[0.5600000000000023,0.9099999999999966],[0,0]],"v":[[174,232.67],[173.65,232.85999999999999],[173.33,229.67],[174,232.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.9294,0.9255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[173.6623612005259,231.26498681798574]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[173.6623612005259,231.26498681798574]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 362","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 361","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.45000000000000284,-0.5],[-0.12999999999999545,0.12000000000000455],[-0.9299999999999926,0.7900000000000205],[0,0]],"o":[[-0.5799999999999983,0.4099999999999966],[-0.14000000000000057,-0.09999999999999432],[0.7600000000000051,-1.009999999999991],[0,0],[0,0]],"v":[[73,170.33],[70.33,172.66000000000003],[70.33,172.33],[72.66,170],[72.99,170.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2824,0.2863,0.2863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[71.61440588563309,171.32998713581827]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[71.61440588563309,171.32998713581827]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 363","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 362","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12000000000000455,0.21999999999999886],[0.8400000000000034,0.6299999999999955],[-0.7399999999999949,0.6500000000000057],[-0.3299999999999983,-0.23000000000000398]],"o":[[-0.09999999999999432,0.23000000000000398],[-0.1599999999999966,1.0100000000000051],[0.46999999999999886,-0.8799999999999955],[0.3100000000000023,0.2600000000000051],[0,0]],"v":[[72.33,86.67],[72,86.67],[69,88],[71.33,86],[72.33,86.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8471,0.5686,0.5451]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[70.66502028043416,87.10128923840466]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[70.66502028043416,87.10128923840466]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 364","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 363","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6099999999999994,0.010000000000005116],[-0.00999999999999801,2.280000000000001],[-0.03999999999999915,0.3199999999999932],[-0.519999999999996,-0.6099999999999994]],"o":[[0.39000000000000057,0.45999999999999375],[-0.7899999999999991,-1.2999999999999972],[0,-0.3199999999999932],[0.6000000000000014,0.5499999999999972],[0,0]],"v":[[47,124],[46.67,124.67],[45.67,123],[45.67,122],[47,124]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8314,0.4118,0.3843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[46.44019168369621,123.33516799220718]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[46.44019168369621,123.33516799220718]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 365","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 364","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.519999999999996,0.4299999999999926],[0.09000000000000341,-0.4399999999999977]],"o":[[0,0],[0.5900000000000034,-0.5],[-0.12999999999999545,0.25],[0,0]],"v":[[85.33,76],[83.66,75.67],[85.33,74.34],[85.33,76.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7373,0.4039,0.3608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[84.50620133495855,75.17499209837715]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.50620133495855,75.17499209837715]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 366","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 365","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.7800000000000011,-0.15999999999996817],[0.5900000000000034,1.0400000000000205],[0,0]],"o":[[0.6200000000000045,0.13999999999998636],[-0.9199999999999875,0.5299999999999727],[0,0],[0,0]],"v":[[221.67,304.33],[224,304.65999999999997],[221,304.48999999999995],[221.66,304.3299999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5961,0.6039,0.6118]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[222.50001708578847,304.7476953999707]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[222.50001708578847,304.7476953999707]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 367","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 366","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.23000000000000398,-0.09999999999999432],[0.5600000000000023,-0.46999999999999886],[0,0],[0,0],[0.03999999999999204,-0.8499999999999943]],"o":[[0.23000000000000398,0.09999999999999432],[-0.39000000000000057,0.3299999999999983],[0,0],[0,0],[0.5,-0.7199999999999989],[0,0]],"v":[[86.33,70.33],[87,70.66],[85.67,71.99],[85.42,71.78999999999999],[85.67,69.99],[86.34,70.32]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8941,0.5059,0.4745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[86.2100277350473,70.76980467358703]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[86.2100277350473,70.76980467358703]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 368","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 367","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5300000000000011,-0.4200000000000017],[0.75,0.3999999999999915],[0.10999999999999943,-0.01999999999999602],[0.10000000000000853,0.29999999999999716],[-0.5499999999999972,0.45000000000000284]],"o":[[0.1700000000000017,0.6599999999999966],[-0.060000000000002274,0.8599999999999994],[-0.09000000000000341,0.030000000000001137],[-0.28000000000000114,0.04000000000000625],[0.5400000000000063,-0.45000000000000284],[0,0]],"v":[[88.33,71.67],[89,72.67],[87.67,73.34],[87.34,73.34],[86.67,73.01],[88.34,71.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7451,0.3961,0.3451]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.83503225961786,72.60266208580862]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.83503225961786,72.60266208580862]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 369","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 368","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4000000000000057,-1.509999999999998],[0,0],[-0.1599999999999966,0.990000000000002]],"o":[[0.8499999999999943,1.3299999999999983],[0,0],[-0.09999999999999432,-1.0200000000000031],[0,0]],"v":[[110,58.33],[110,62.989999999999995],[109.67,61.33],[110,58.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.7451,0.5725]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[109.97577862043426,60.65999348299988]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[109.97577862043426,60.65999348299988]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 370","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 369","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-1.0800000000000125,-1.8199999999999932]],"o":[[0,0],[1.6699999999999875,1.1100000000000136],[0,0]],"v":[[154.33,137.67],[151.33,134.67],[154.33,137.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.949,0.7725,0.5882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[152.83003806879637,136.16999672240814]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[152.83003806879637,136.16999672240814]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 371","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 370","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.20000000000000284,-0.030000000000001137],[0.3399999999999892,-0.5599999999999952],[0.9300000000000068,0.269999999999996],[-2.0600000000000023,0.14999999999999858]],"o":[[0.20000000000000284,-0.00999999999999801],[0.4899999999999949,-0.4299999999999997],[-0.6200000000000045,0.09000000000000341],[0.10999999999999943,-0.07000000000000028],[0,0]],"v":[[126.67,38.67],[127.34,38.67],[127.67,39],[125,39.67],[126.67,38.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.8039,0.7882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[126.42246056014108,39.08022599305849]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[126.42246056014108,39.08022599305849]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 372","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 371","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-1.1100000000000136,-0.4899999999999949]],"o":[[0,0],[0,0],[1.1500000000000057,0.4099999999999966],[0,0]],"v":[[192,122],[190.54,121.96],[188.66,120.66999999999999],[191.99,121.99999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.7529,0.5765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[190.33002305487977,121.33500318739272]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[190.33002305487977,121.33500318739272]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 373","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 372","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.299999999999983,0.4700000000000273],[0.20999999999997954,0.040000000000020464],[0,0],[-1.1100000000000136,-0.9799999999999613]],"o":[[-1.1800000000000068,-0.3100000000000023],[-0.1599999999999966,-0.060000000000002274],[0,0],[1.25,0.39999999999997726],[0,0]],"v":[[209.33,300.67],[205.66000000000003,299.67],[204.99000000000004,299.67],[205.32000000000005,299.34000000000003],[209.32000000000005,300.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6235,0.6275,0.6431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[207.1600460300925,300.00498713094805]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[207.1600460300925,300.00498713094805]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 374","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 373","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[1,0.13999999999998636],[0,0]],"o":[[0,0],[0,0],[-1.0299999999999727,0.12000000000000455],[0,0],[0,0]],"v":[[270.33,295],[274.99,295.34],[273.33,295.66999999999996],[270.33,295.34],[270.33,295.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7725,0.7725,0.7804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[272.6599895509237,295.3485450256869]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[272.6599895509237,295.3485450256869]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 375","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 374","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.4299999999999926,0.030000000000001137],[-0.6700000000000017,0.8000000000000043],[-0.8900000000000006,0.14999999999999858],[-0.12000000000000455,-0.28999999999999915],[0,0]],"o":[[-0.4200000000000017,0.3999999999999986],[0.030000000000001137,-0.03999999999999915],[-0.3400000000000034,-0.9500000000000028],[0.09999999999999432,-0.29999999999999716],[0,0],[0,0]],"v":[[106.33,53.67],[104,55.67],[104.33,55],[105.66,53.67],[105.99,53.67],[106.32,53.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.851,0.7412,0.7255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[105.12741719099486,54.55957840817754]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[105.12741719099486,54.55957840817754]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 376","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 375","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.8200000000000216,0.28000000000000114],[-0.01999999999998181,0.010000000000019327]],"o":[[0,0],[0.37000000000000455,-0.8299999999999841],[0.18999999999999773,-0.060000000000002274],[0,0]],"v":[[254,255.33],[251,258],[253.55,255.07],[254,255.32999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.7569,0.5765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[252.50002099826642,256.53131911080595]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[252.50002099826642,256.53131911080595]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 377","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 376","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.2299999999999898,-0.9000000000000057],[0.04999999999998295,0.020000000000010232],[0.09999999999999432,1.4300000000000068],[0,0]],"o":[[-0.25,1.3199999999999932],[-0.09000000000000341,0],[0.8400000000000034,-1.0999999999999943],[0,0],[0,0]],"v":[[132.33,168.67],[130.83,171.98],[130.67000000000002,171.67],[132.00000000000003,167.83999999999997],[132.33000000000004,168.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7961,0.7961,0.7961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[131.50002246851759,169.90999910565085]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[131.50002246851759,169.90999910565085]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 378","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 377","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0.12000000000000455,-0.06999999999999318],[0.3499999999999943,0.29999999999999716],[-0.5600000000000023,-0.3299999999999983]],"o":[[0,0],[0,0],[-0.10999999999999943,0.06999999999999318],[-0.9000000000000057,0.21999999999999886],[-0.3400000000000034,-0.7800000000000011],[0,0]],"v":[[74,102.67],[75.33,102.67],[75.33,103.67],[75,104],[73.67,103.33],[74,102.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.7608,0.7176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[74.40370505327368,103.27990713555079]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[74.40370505327368,103.27990713555079]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 379","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 378","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.0100000000000051,0.18999999999999773],[0.5799999999999983,0.6000000000000085],[0,0],[0.060000000000002274,-0.030000000000001137],[-0.8499999999999943,0.46000000000000796]],"o":[[1.0100000000000051,0.18999999999999773],[0.12999999999999545,0.8299999999999983],[0,0],[-0.4200000000000017,0.6599999999999966],[0.5499999999999972,-0.8900000000000006],[0,0]],"v":[[69,88],[68.67,89.33],[68,89.66],[67.84,89.33],[66.67,89.66],[69,87.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.5922,0.5647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[68.14122742530276,89.01669067026606]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[68.14122742530276,89.01669067026606]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 380","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 379","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.10999999999999943,0.22999999999998977],[-0.6099999999999994,0.5799999999999983],[-0.010000000000005116,0.009999999999990905]],"o":[[0,0],[-0.5799999999999983,0.12000000000000455],[0.5499999999999972,-0.8700000000000045],[0.10999999999999943,-0.10999999999999943],[0,0]],"v":[[126.67,110.67],[125,114.67],[124.67,114.01],[126.33,110.53],[126.67,110.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8275,0.549,0.3961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[125.66437723918571,112.59522964904048]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[125.66437723918571,112.59522964904048]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 381","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 380","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[1.4199999999999946,-1.0100000000000051],[0.3499999999999943,0.2600000000000051],[-0.509999999999998,-0.010000000000005116]],"o":[[0,0],[0,0],[-0.46000000000000085,1.5100000000000051],[-0.5200000000000031,0.37000000000000455],[0.0799999999999983,-0.21999999999999886],[0,0]],"v":[[47.33,116],[47.65,116.34],[48.66,113.67],[47.65,117.14],[46.99,116.67],[47.32,116]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8627,0.1922,0.1608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[47.825048246618735,115.46498286234876]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[47.825048246618735,115.46498286234876]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 382","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 381","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7900000000000063,-0.6199999999999974],[0.01999999999999602,0.35999999999999943],[-0.6599999999999966,0.21999999999999886]],"o":[[-0.769999999999996,0.7700000000000031],[0.04000000000000625,-0.4099999999999966],[0.769999999999996,-0.46999999999999886],[0,0]],"v":[[119.67,42.33],[116.67,44.33],[117,43],[119.67,42.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.5843,0.5569]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[118.1700291430478,43.32998902012554]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[118.1700291430478,43.32998902012554]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 383","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 382","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.1599999999999966,1.2800000000000011],[-0.539999999999992,0.45999999999999375]],"o":[[1.75,-0.10999999999999943],[0.37999999999999545,-0.3199999999999932],[0,0]],"v":[[75.67,82.33],[74.34,83.66],[75.67,82.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8784,0.6667,0.6275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[75.3573701289869,83.16498249812025]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[75.3573701289869,83.16498249812025]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 384","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 383","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.9399999999999977,-0.4500000000000455],[0.20000000000001705,0.009999999999990905],[0.4300000000000068,0.14999999999997726],[0.12999999999999545,0.11000000000001364],[0.0800000000000125,0.22000000000002728]],"o":[[0,0],[0.3100000000000023,1.160000000000025],[-0.2599999999999909,0.12000000000000455],[-0.2599999999999909,-0.009999999999990905],[-0.5099999999999909,-0.17000000000001592],[-0.15000000000000568,-0.12000000000000455],[0,0]],"v":[[220.33,266],[220.65,265.79],[223.99,267.33000000000004],[223.16,267.90000000000003],[222.01,267.14000000000004],[220.35,266.96000000000004],[220.32999999999998,265.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8,0.8039,0.8]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[222.14225335079797,266.84504209526824]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[222.14225335079797,266.84504209526824]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 385","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 384","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.75,0.2400000000000091],[0.7700000000000102,0.21000000000003638],[0,0],[-1.450000000000017,-0.38999999999998636]],"o":[[-0.6899999999999977,0.6700000000000159],[-0.75,-0.2400000000000091],[0,0],[1.4699999999999989,0.410000000000025],[0,0]],"v":[[215,302.33],[212.67,302],[210.33999999999997,301.33],[210.67,301],[215,302.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6353,0.6471,0.6549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[212.67001360103367,301.79981696913495]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[212.67001360103367,301.79981696913495]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 386","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 385","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5900000000000034,-0.6600000000000037],[0.1599999999999966,-0.45000000000000284],[0.23999999999999488,-0.21999999999999886],[0,0],[-2.0799999999999983,-1.3700000000000045]],"o":[[0.29000000000000625,1.1400000000000006],[-0.29000000000000625,0.3299999999999983],[-0.21999999999999886,0.21000000000000085],[0,0],[-0.5400000000000063,-1.5700000000000003],[0,0]],"v":[[109,50.33],[107.49,51.32],[107,52.99],[106.33,53.660000000000004],[106,53.660000000000004],[109,50.330000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9569,0.4,0.3765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[107.46560045289232,51.82581283465203]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.46560045289232,51.82581283465203]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 387","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 386","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1,-0.1700000000000017],[0.4200000000000017,-0.3499999999999943],[-1.539999999999992,-0.39000000000000057]],"o":[[0.12000000000000455,0.15000000000000568],[-0.4200000000000017,0.3499999999999943],[-0.8799999999999955,-0.8100000000000023],[0,0]],"v":[[73.33,80.33],[74.33,81.33],[73,82.33],[73.33,80.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.8196,0.8118]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[73.29378954250564,81.29954139644835]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[73.29378954250564,81.29954139644835]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 388","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 387","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.75,0.38999999999998636],[-0.06999999999999318,-0.3400000000000034],[0,0],[0,0],[0.6200000000000045,-0.38999999999998636]],"o":[[-0.030000000000001137,-1.1599999999999966],[0.36000000000001364,0],[0,0],[0,0],[-0.6899999999999977,0.44999999999998863],[0,0]],"v":[[129.33,163.67],[132.16000000000003,162],[132.33,163.34],[131.99,164.17000000000002],[131.82000000000002,162.67000000000002],[129.32000000000002,163.67000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7882,0.7843,0.7843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[130.8380779502775,163.08498010245438]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[130.8380779502775,163.08498010245438]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 389","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 388","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3499999999999943,1.2900000000000063],[-0.3499999999999943,0.6500000000000057]],"o":[[1.5900000000000034,-0.23999999999999488],[0.37999999999999545,-0.6299999999999955],[0,0]],"v":[[82,97.33],[81,99.33],[82,97.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8784,0.7059,0.6667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[81.87370992876544,98.46635870113192]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[81.87370992876544,98.46635870113192]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 390","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 389","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6199999999999761,-0.75],[-1,0.21000000000000085],[0.28999999999999204,-0.10999999999999943],[0.4300000000000068,0.03999999999999915],[-0.6699999999999875,0.3999999999999986]],"o":[[0.11000000000001364,-1.2800000000000011],[0.03999999999999204,0.8400000000000034],[-0.37000000000000455,0.14000000000000057],[-0.4399999999999977,-0.07000000000000028],[-0.6200000000000045,-0.4099999999999966],[0,0]],"v":[[154.67,35.33],[156.33999999999997,35.66],[157.00999999999996,36.989999999999995],[156.00999999999996,37.31999999999999],[154.67999999999995,36.989999999999995],[154.67999999999995,35.31999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9451,0.5412,0.5255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[155.60305534396892,35.99704662817365]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[155.60305534396892,35.99704662817365]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 391","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 390","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.18000000000000682,-0.9799999999999969],[1.0300000000000011,-0.39000000000000057],[-1.210000000000008,-1.8200000000000003]],"o":[[0.6200000000000045,-0.8100000000000023],[-0.710000000000008,0.2700000000000031],[-0.75,-1.2000000000000028],[0,0]],"v":[[154.67,37],[156,37.33],[153.33,38.66],[154.66000000000003,36.989999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8745,0.4392,0.4157]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[154.52556428653887,37.48609336973249]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[154.52556428653887,37.48609336973249]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 392","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 391","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.060000000000002274,-0.18000000000000682],[0.6700000000000017,0.3100000000000023],[-0.01999999999999602,0.6299999999999955],[-0.12000000000000455,0.09999999999999432],[-0.01999999999999602,-0.8199999999999932]],"o":[[-0.06999999999999318,0.3199999999999932],[-0.21999999999999886,0.6200000000000045],[-0.519999999999996,-0.519999999999996],[0.12000000000000455,-0.09999999999999432],[1.0900000000000034,-0.5999999999999943],[0,0]],"v":[[85.33,76],[85,76.67],[83.67,77.67],[83.34,76],[83.67,75.67],[85.34,76]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7843,0.5216,0.4784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[84.31884014449088,76.51816860894237]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.31884014449088,76.51816860894237]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 393","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 392","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.7199999999999989,0.5300000000000011],[-1.3100000000000023,-0.35999999999999943]],"o":[[-1.759999999999991,0.5699999999999932],[1.0900000000000034,-0.23999999999999488],[0,0]],"v":[[188,112.33],[182,111],[188,112.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9451,0.7725,0.5882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[185.00003209970507,111.71748038979854]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[185.00003209970507,111.71748038979854]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 394","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 393","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.9899999999999949,-0.14999999999999147],[0,0],[0.5499999999999972,0.3199999999999932],[-0.2600000000000051,0.5900000000000034]],"o":[[0.8599999999999994,-0.20000000000000284],[0,0],[-0.45000000000000284,0.060000000000002274],[0.3299999999999983,-0.769999999999996],[0,0]],"v":[[68.67,82],[69.01,83.55],[69.01,84],[67.67,84],[68.67,82]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.949,0.8824,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[68.61790072704719,83.06959011468072]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[68.61790072704719,83.06959011468072]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 395","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 394","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8200000000000074,0.37000000000000455],[-0.8499999999999943,0.28000000000000114],[0.14000000000000057,0.35999999999999943],[-0.3400000000000034,0.46999999999999886],[-0.37999999999999545,0.3400000000000034],[0,0]],"o":[[0.5,0.75],[-0.8799999999999955,-0.21999999999999886],[-0.5300000000000011,-0.09000000000000341],[-1.0100000000000051,0.01999999999999602],[0.4399999999999977,-0.39000000000000057],[0,0],[0,0]],"v":[[74,87.33],[73.33,88],[73.33,87.33],[72.33,86.66],[71.33,85.99],[72.66,84.99],[73.99,87.32]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9255,0.8157,0.7961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[72.716080927597,86.57513331480715]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[72.716080927597,86.57513331480715]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 396","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 395","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3199999999999932,-0.4200000000000017],[-0.6099999999999994,0.6200000000000045],[0.29000000000000625,-0.5799999999999983],[0.23000000000000398,-0.4399999999999977],[0.020000000000010232,0.3199999999999932],[-0.5,1.1200000000000045]],"o":[[0.3400000000000034,-0.20000000000000284],[0.3100000000000023,0.04000000000000625],[-0.23000000000000398,0.4899999999999949],[-0.21999999999999886,0.4399999999999977],[-0.8299999999999983,-0.20999999999999375],[-0.04999999999999716,-0.5799999999999983],[0,0]],"v":[[82.33,89.67],[83.33,90],[84.66,90],[83.99,91.67],[83.32,93],[83.58999999999999,91.5],[82.32,89.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8314,0.3804,0.3373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[83.44451446166033,91.28660144907585]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[83.44451446166033,91.28660144907585]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 397","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 396","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.18000000000000682,-0.20000000000000284],[0.030000000000001137,0.04000000000000625],[0,0],[-0.01999999999999602,0.010000000000005116]],"o":[[-0.6400000000000006,0.730000000000004],[-0.6700000000000017,0.75],[0,0],[0.12999999999999545,0.030000000000001137],[0,0]],"v":[[121.33,80],[119.66,85],[119,84.33],[121.04,79.67999999999999],[121.34,79.99999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.898,0.7451,0.5725]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[120.17003471175005,82.451425575027]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[120.17003471175005,82.451425575027]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 398","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 397","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3400000000000034,-0.5700000000000003],[0.7000000000000028,-0.6499999999999986],[-1.5499999999999972,0.3999999999999986],[-0.29000000000000625,0.11999999999999744],[-0.10999999999999943,-0.0899999999999963]],"o":[[0.4899999999999949,-0.4299999999999997],[-0.8599999999999994,0.7999999999999972],[-0.21999999999999886,-1.3800000000000026],[-0.29000000000000625,-0.09000000000000341],[0.12000000000000455,0.04999999999999716],[0,0]],"v":[[109.33,50.33],[109.66,50.66],[106.99,52.989999999999995],[108.99,50.31999999999999],[108.99,49.989999999999995],[109.32,50.31999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8863,0.6039,0.5725]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[108.39205605794058,51.48999382636819]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[108.39205605794058,51.48999382636819]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 399","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 398","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.14999999999999858,-0.020000000000010232],[1.240000000000002,-0.07999999999998408],[-1.3500000000000014,-0.21000000000000796]],"o":[[-0.3999999999999986,-0.1599999999999966],[-1.240000000000002,0.18000000000000682],[0.9099999999999966,-1.4099999999999966],[0,0]],"v":[[39.33,196],[38.33,196.33],[34.66,195.99],[39.33,195.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0784,0.098,0.102]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[36.99504197751284,195.83891286115983]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[36.99504197751284,195.83891286115983]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 400","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 399","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[1.660000000000025,0.9899999999999807]],"o":[[0,0],[0,0],[-1.9799999999999898,0.009999999999990905],[0,0]],"v":[[193.33,151.33],[197.5,152.34],[198.66,152.99],[193.32999999999998,151.32000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.7686,0.5961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[195.9950467900346,152.15505317296942]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[195.9950467900346,152.15505317296942]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 401","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 400","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.8899999999999864,-0.29999999999999716],[0,0],[-1.9000000000000057,-0.35999999999999943]],"o":[[-1.960000000000008,-0.12000000000000455],[0,0],[2,-0.9899999999999949],[0,0]],"v":[[188.67,105],[182.67,105],[182.67,104.67],[188.67,105]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.7529,0.5843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[185.6700379461232,104.6175004299335]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[185.6700379461232,104.6175004299335]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 402","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 401","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.1000000000000227,-0.9699999999999704],[-0.5299999999999727,0.4399999999999977],[-0.9900000000000091,0.05000000000001137],[-0.03000000000002956,0]],"o":[[-1.3899999999999864,0.45999999999997954],[-1.0500000000000114,0.10000000000002274],[0.8000000000000114,-0.660000000000025],[0.5699999999999932,-0.01999999999998181],[0,0]],"v":[[264.33,261.67],[260.33,264],[260.16999999999996,263.34],[263.84999999999997,261.34999999999997],[264.33,261.65999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1333,0.149,0.1647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[261.99256335233076,262.6837446807618]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[261.99256335233076,262.6837446807618]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 403","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 402","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.269999999999996,0.25],[0.8199999999999932,1.2900000000000063],[-1.519999999999996,-1.269999999999996]],"o":[[-0.28000000000000114,0.7900000000000063],[-1.2999999999999972,-1.1899999999999977],[1.5499999999999972,1.230000000000004],[0,0]],"v":[[113,98],[111.83,97.67],[108.67,94],[113,98]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8118,0.549,0.3882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[110.83503658615189,96.16215244466616]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[110.83503658615189,96.16215244466616]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 404","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 403","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5400000000000063,-0.45000000000000284],[-0.10999999999999943,0.8599999999999994],[-1.230000000000004,-0.6299999999999955],[-0.28000000000000114,-0.5499999999999972]],"o":[[-0.5499999999999972,0.46999999999999886],[-0.6599999999999966,0.480000000000004],[-1.0100000000000051,-0.6500000000000057],[0.1599999999999966,0.15000000000000568],[0,0]],"v":[[88.67,69.33],[87,70.66],[86.33,70.33],[87,68.66],[88.67,69.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.7176,0.702]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.22189360975418,69.7611235211233]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.22189360975418,69.7611235211233]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 405","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 404","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.25,-0.30000000000001137],[0,0],[1.8699999999999761,0.5],[-0.8199999999999932,-0.12000000000000455]],"o":[[1.7199999999999989,0.25],[0,0],[-1.8700000000000045,-0.4900000000000091],[0.46999999999999886,-0.5699999999999932],[0,0]],"v":[[199.67,303.33],[203,304.33],[202.67,304.65999999999997],[197,303.33],[199.67,303.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5373,0.549,0.5608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[200.00003405594404,303.85390310242883]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[200.00003405594404,303.85390310242883]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 406","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 405","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.9399999999999977,-0.05000000000001137],[0.5799999999999841,0.09000000000003183],[0,0],[-2.009999999999991,-0.160000000000025]],"o":[[0,0],[-0.9499999999999886,-0.05000000000001137],[-0.589999999999975,-0.2400000000000091],[0,0],[2,0.2699999999999818],[0,0]],"v":[[275.33,291.33],[274.65999999999997,291.65999999999997],[271.65999999999997,291.65999999999997],[269.33,290.98999999999995],[269.33,290.65999999999997],[275.33,291.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7647,0.7647,0.7686]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[272.33001251750454,291.15999833148754]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[272.33001251750454,291.15999833148754]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 407","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 406","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.75,2.9499999999999957],[-0.009999999999990905,-1.1300000000000026],[0.710000000000008,-0.8299999999999983]],"o":[[-0.9199999999999875,-2.969999999999999],[0.8000000000000114,0.990000000000002],[0,1],[0,0]],"v":[[148.67,62.67],[148.67,56.34],[148.32999999999998,59.84],[148.67,62.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.7647,0.5843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[148.49774097434656,59.504994247977095]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[148.49774097434656,59.504994247977095]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 408","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 407","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5400000000000063,-0.45000000000000284],[0.0799999999999983,0.25],[-0.8599999999999994,-1.1499999999999915]],"o":[[-0.5400000000000063,0.45999999999999375],[-0.28000000000000114,-0.15000000000000568],[-0.5699999999999932,-1.7999999999999972],[0,0]],"v":[[93,65.67],[91.33,67],[91,66.33],[93,65.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.8431,0.8235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[91.94306519460747,65.93674981542884]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.94306519460747,65.93674981542884]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 409","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 408","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.25,0.1700000000000017],[-0.8299999999999983,0.8899999999999864],[0.7999999999999972,-0.6599999999999966]],"o":[[-0.6800000000000068,-0.3199999999999932],[0.9099999999999966,-0.6500000000000057],[-0.7900000000000063,0.6500000000000057],[0,0]],"v":[[77.33,78.67],[77.64999999999999,76.49],[79.66999999999999,76.67],[77.33999999999999,78.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.8706,0.8588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[78.3610210081059,77.50471594181616]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[78.3610210081059,77.50471594181616]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 410","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 409","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.539999999999992,-0.21000000000000085],[-1.3300000000000125,0.4799999999999969],[-0.6199999999999761,-0.6499999999999986],[0.030000000000001137,-1.0399999999999991]],"o":[[-0.4900000000000091,0.1599999999999966],[-1.4099999999999966,0.46000000000000085],[-0.25,-0.8599999999999994],[0.8600000000000136,-0.10000000000000142],[0,0]],"v":[[158.67,36.33],[157,37],[156.33,35.67],[157,35.34],[158.67,36.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.898,0.8941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[157.12776102239408,36.01126840344074]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[157.12776102239408,36.01126840344074]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 411","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 410","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.46999999999999886,-0.12999999999999545],[3.430000000000007,-0.13999999999998636],[0.060000000000002274,0.12999999999999545],[0.9000000000000057,1.8900000000000432]],"o":[[0.3199999999999932,-0.12999999999999545],[0.06999999999999318,2.3899999999999864],[0,-0.029999999999972715],[2.6999999999999886,-0.29000000000002046],[0,0]],"v":[[217.33,264],[218.33,263.67],[216.67000000000002,267.67],[216.33,267.35],[217.33,264]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.749,0.5137,0.3569]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[217.57130113325147,265.6551104381408]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[217.57130113325147,265.6551104381408]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 412","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 411","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4099999999999966,-0.8400000000000318],[0.2600000000000193,0.9200000000000159],[0.45999999999997954,0.009999999999990905],[-1.660000000000025,-0.05000000000001137]],"o":[[0.6100000000000136,-0.4399999999999977],[-0.18000000000000682,0.37999999999999545],[-0.6100000000000136,-0.01999999999998181],[1.4699999999999989,-0.5799999999999841],[0,0]],"v":[[242.33,306.33],[244.27,306.95],[238.66,307],[236.99,306.67],[242.32000000000002,306.34000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5843,0.5961,0.6118]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[240.6609752954444,306.79895509227373]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[240.6609752954444,306.79895509227373]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 413","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 412","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6100000000000136,-2.1000000000000227],[-0.6299999999999955,1.6400000000000148],[-0.3400000000000034,-0.8400000000000034]],"o":[[-0.7199999999999989,2.069999999999993],[-0.47999999999998977,-1.7800000000000011],[0.09000000000000341,-0.22999999999998977],[0,0]],"v":[[205.33,138],[203.33,144.33],[204.76000000000002,138.59],[205.33,138]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.7569,0.5804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[204.27735488267146,141.01772120739884]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[204.27735488267146,141.01772120739884]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 414","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 413","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.3300000000000125,-0.15999999999996817],[0,0],[-1.5299999999999727,0.36000000000001364],[0,0],[-0.6100000000000136,0.10000000000002274]],"o":[[-2.240000000000009,0.6999999999999886],[0,0],[1.3899999999999864,-0.4700000000000273],[0,0],[0.6299999999999955,-0.07999999999998408],[0,0]],"v":[[248.33,310.33],[241,311.65999999999997],[241.33,310.98999999999995],[245.72,309.73999999999995],[246.33,310.31999999999994],[248.33,310.31999999999994]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5765,0.5882,0.6039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[244.66504695370887,310.7000009859722]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[244.66504695370887,310.7000009859722]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 415","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 414","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5500000000000114,0.04000000000000625],[0.020000000000010232,-2.480000000000004],[0.6499999999999773,-0.5400000000000063],[-3.1899999999999977,-1.4300000000000068]],"o":[[0,0],[-1.3400000000000034,-0.09999999999999432],[0,0.8299999999999983],[-2.3799999999999955,-3.1899999999999977],[0,0]],"v":[[197.67,91],[197.17,91.33],[193.30999999999997,92.83],[193.67,95],[197.67,91]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.898,0.749,0.5765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[195.25646989281856,92.77969875923768]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[195.25646989281856,92.77969875923768]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 416","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 415","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-0.5799999999999983],[0.0899999999999963,-0.3499999999999943],[0,0],[1.0200000000000031,-0.3200000000000074],[0,0],[-0.8000000000000043,0.25],[0,0],[0,0],[-0.21999999999999886,-0.3299999999999983]],"o":[[0.21999999999999886,-0.12999999999999545],[-0.10000000000000142,0.3400000000000034],[0,0],[0.14999999999999858,2.239999999999995],[0,0],[-0.5399999999999991,-0.4300000000000068],[0,0],[0,0],[0.38000000000000256,0.12000000000000455],[0,0]],"v":[[51,125.33],[51.33,126],[51,127],[50,126.33],[49,128],[48.96,127.22],[48.660000000000004,125.67],[50.160000000000004,125.67],[49.99,124.34],[50.99,125.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8941,0.4,0.3647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[49.795236853319494,126.16998878341082]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[49.795236853319494,126.16998878341082]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 417","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 416","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.25,-0.14999999999997726],[-1.3600000000000136,1.3699999999999761],[-0.13999999999998636,-0.6699999999999875]],"o":[[-0.8600000000000136,1.1200000000000045],[1.2200000000000273,-1.5],[0.14999999999997726,-0.15000000000000568],[0,0]],"v":[[262,243],[257,247.67],[261,243.5],[262,243]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7373,0.7373,0.7373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[259.5000404887244,245.222071857647]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[259.5000404887244,245.222071857647]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 418","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 417","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-0.6800000000000068],[0.7600000000000051,-0.5499999999999972],[0.75,0.5900000000000034],[-0.7700000000000031,0.8199999999999932]],"o":[[0.5700000000000003,0.29000000000000625],[0.8999999999999986,0.09000000000000341],[-0.6400000000000006,0.5600000000000023],[0.18999999999999773,-0.9000000000000057],[0,0]],"v":[[45.67,123],[46.67,124.67],[47,125.67],[45,126],[45.67,123]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8549,0.2745,0.251]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[46.23636946013417,124.65139379078971]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[46.23636946013417,124.65139379078971]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 419","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 418","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.25,-0.09000000000000341],[-0.1599999999999966,0.9500000000000028],[-0.3100000000000023,2.460000000000008],[-0.14000000000000057,-0.480000000000004],[0,0]],"o":[[-0.15000000000000568,0.519999999999996],[-0.8299999999999983,-0.4099999999999966],[0.4099999999999966,-2.319999999999993],[0.01999999999999602,0],[0,0],[0,0]],"v":[[103,74.67],[102,75],[102.67,73.84],[102.67,65.66],[103.01,65.49],[103.01,74.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.7725,0.5882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[102.37048276315042,70.15663616695227]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[102.37048276315042,70.15663616695227]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 420","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 419","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3799999999999955,-1.5100000000000051],[0.28000000000000114,-0.18999999999999773],[-0.29999999999998295,0.5100000000000051],[-0.5300000000000011,1.9500000000000028],[0,0],[-0.22999999999998977,0]],"o":[[-0.539999999999992,1.7900000000000063],[-0.18000000000000682,0.20000000000000284],[-0.5200000000000102,0.23000000000000398],[2.009999999999991,-1.3400000000000034],[0,0],[0.21999999999999886,0],[0,0]],"v":[[135,109.33],[133.33,114.33],[132.33,115],[132,114.67],[134,110.34],[134.33,109.34],[135,109.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3569,0.3569,0.3608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[133.41768306272022,112.23059885671307]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[133.41768306272022,112.23059885671307]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 421","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 420","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.4699999999999989,-0.4099999999999966],[0.03999999999999204,-0.009999999999990905],[0,0],[-0.06999999999999318,-0.1599999999999966]],"o":[[-1.9099999999999966,0.18999999999999773],[-0.8100000000000023,0.22999999999998977],[0,0],[0.3400000000000034,-0.020000000000010232],[0,0]],"v":[[252.67,242.67],[247.08999999999997,245.60999999999999],[246.33999999999997,245.32999999999998],[252.50999999999996,241.99999999999997],[252.66999999999996,242.65999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7961,0.5412,0.3843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[249.51693148212976,243.83411019053733]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[249.51693148212976,243.83411019053733]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 422","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 421","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-0.17000000000001592,1.009999999999991],[-0.4899999999999807,-0.060000000000002274],[-0.04999999999998295,-2.579999999999984]],"o":[[0,0],[0,0],[0.1599999999999966,-1.0200000000000102],[0.060000000000002274,-0.3499999999999943],[-0.15000000000000568,2.569999999999993],[0,0]],"v":[[170.67,202.67],[170,200.67],[170,199.33999999999997],[170.43,196.26999999999998],[171,195.01],[170.67,202.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1529,0.1529,0.1529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[170.50003153564168,198.83868236004503]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[170.50003153564168,198.83868236004503]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 423","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 422","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3100000000000023,-0.12000000000000455],[0.5600000000000023,-0.5600000000000023],[0.8700000000000045,-0.5],[0.14000000000000057,0.5],[-0.030000000000001137,-0.21000000000000796],[-0.4000000000000057,0.8700000000000045]],"o":[[1.3199999999999932,0.04999999999999716],[0.5600000000000023,-0.10999999999999943],[-0.9699999999999989,0.6400000000000006],[-0.5400000000000063,-0.29999999999999716],[0.23000000000000398,-0.21999999999999886],[0.0799999999999983,0.6500000000000057],[0,0]],"v":[[88.67,95],[90,95.67],[90,96.34],[87.67,97.67],[87,96.34],[88.83,95.46000000000001],[88.67,95.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7255,0.4,0.3529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[88.500042073017,96.33498333989942]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[88.500042073017,96.33498333989942]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 424","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 423","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.730000000000004,-0.3100000000000023],[0.7900000000000063,0.6199999999999974],[-0.45000000000000284,0.6799999999999997]],"o":[[0,0],[-0.5600000000000023,0.7899999999999991],[-0.6400000000000006,0.4099999999999966],[0.4300000000000068,-0.7000000000000028],[0,0]],"v":[[83,45.33],[84.33,45.16],[84.67,46.16],[81.67,47.33],[83,45.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9451,0.8392,0.8275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[83.17003121332826,46.32384687834687]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[83.17003121332826,46.32384687834687]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 425","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 424","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4300000000000068,-0.7199999999999989],[0,0],[-1.6899999999999977,-1.1300000000000097]],"o":[[-0.3299999999999983,0.5900000000000034],[0,0],[0.35999999999999943,-1.2600000000000051],[0,0]],"v":[[82,95],[81,97],[79.67,97.66],[82,95]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.7882,0.7529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[80.835032673674,96.18828707157405]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[80.835032673674,96.18828707157405]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 426","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 425","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-2.089999999999975,0.4099999999999966],[0.07999999999998408,0],[2.069999999999993,0.4199999999999946],[0,0]],"o":[[2.1100000000000136,0.35999999999999943],[0.8100000000000023,0.4200000000000017],[-2.1100000000000136,0.11999999999999744],[0,0],[0,0]],"v":[[140.33,42],[148,42],[146.46,42.62],[140.17000000000002,42.32],[140.34,41.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.6863,0.498]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[144.17217160563538,42.33951054573285]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[144.17217160563538,42.33951054573285]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 427","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 426","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.2199999999999704,0.040000000000020464],[0.2300000000000182,0],[0.2300000000000182,0.6999999999999886],[0.05000000000001137,0],[-0.5600000000000023,0.009999999999990905],[-2.7799999999999727,0.11000000000001364]],"o":[[-2.089999999999975,0.18000000000000682],[-0.22000000000002728,0],[-0.37000000000000455,0.6000000000000227],[-0.5400000000000205,-0.01999999999998181],[-0.11000000000001364,-0.20999999999997954],[2.769999999999982,0.20999999999997954],[0,0]],"v":[[283.67,291.67],[277.34000000000003,292],[276.67,292],[275.67,292],[274.67,291.67],[275.34000000000003,291.34000000000003],[283.67,291.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7137,0.7176,0.7294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[279.15634521862637,291.9141007496389]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[279.15634521862637,291.9141007496389]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 428","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 427","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6000000000000227,-0.8599999999999994],[0.14999999999997726,0.21000000000000085],[-0.15000000000000568,0.6400000000000006],[0,0]],"o":[[-0.5999999999999943,1.0700000000000003],[0.12999999999999545,-0.6599999999999966],[-0.3300000000000125,-0.4799999999999969],[0,0],[0,0]],"v":[[169.67,43.67],[168.33999999999997,45.67],[167.67,44.67],[167,43],[169.67,43.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7176,0.4941,0.4431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[168.32112419493015,44.33498783749562]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[168.32112419493015,44.33498783749562]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 429","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 428","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.12999999999999545,-0.8200000000000003],[0.519999999999996,-0.44999999999999574],[0.710000000000008,-0.0799999999999983],[0.28000000000000114,0.5700000000000003],[-0.730000000000004,-0.6300000000000026]],"o":[[0.4399999999999977,-0.09000000000000341],[-0.37000000000000455,0.3100000000000023],[0.0799999999999983,-0.7100000000000009],[-0.8400000000000034,-0.09000000000000341],[-0.09000000000000341,-0.8599999999999994],[0,0]],"v":[[112.67,44.67],[114.67,46],[113.34,47.33],[112.67,46.66],[111,45.66],[112.67,44.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9569,0.5059,0.4745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[112.83579852638687,45.87970750476765]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[112.83579852638687,45.87970750476765]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 430","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 429","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.7700000000000102,-0.01999999999998181],[0.28999999999999204,-0.12000000000000455],[0.549999999999983,0.18000000000000682],[2.3600000000000136,0.7799999999999727],[-2.109999999999985,-0.17000000000001592]],"o":[[0.7700000000000102,0.060000000000002274],[0.28999999999999204,0.08999999999997499],[-0.46000000000000796,0.35000000000002274],[-2.460000000000008,-0.06999999999999318],[1.9499999999999886,0.25],[0,0]],"v":[[232.67,311],[235,311],[235,311.33],[233.33,311.33],[226,310.33],[232.67,311]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6235,0.6275,0.6392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[230.50003936059753,310.93182886075994]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[230.50003936059753,310.93182886075994]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 431","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 430","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.13999999999998636,0.010000000000005116],[-0.25,-0.1700000000000017],[0.030000000000001137,-0.19000000000000483],[0.6999999999999886,-0.19999999999999574],[0.8200000000000216,0.10999999999999943],[0,0],[0.8000000000000114,0.490000000000002]],"o":[[0.0800000000000125,-0.20000000000000284],[0.0800000000000125,0],[0.020000000000010232,0.14999999999999858],[0.6999999999999886,0.6799999999999997],[-1,-0.060000000000002274],[0,0],[-0.28000000000000114,-0.8100000000000023],[0,0]],"v":[[139.67,39.33],[141.89,37.839999999999996],[143.33999999999997,38.669999999999995],[143.00999999999996,39.339999999999996],[143.00999999999996,40.669999999999995],[140.67999999999995,40.339999999999996],[141.67999999999995,40.339999999999996],[139.67999999999995,39.339999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.3765,0.349]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[141.6025187502025,39.25498762615169]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[141.6025187502025,39.25498762615169]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 432","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 431","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4899999999999807,-0.14000000000001478],[-1.9899999999999807,-0.6200000000000045],[0,0],[2.2600000000000193,0.5800000000000125]],"o":[[0.3300000000000125,-0.6299999999999955],[2.009999999999991,0.5600000000000023],[0,0],[-2.180000000000007,-0.8300000000000125],[0,0]],"v":[[167.67,245.33],[169.26999999999998,245.23000000000002],[175.21999999999997,247.29000000000002],[175.00999999999996,247.66000000000003],[167.67999999999995,245.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.898,0.9059,0.902]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[171.4450182432423,246.32098017216214]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[171.4450182432423,246.32098017216214]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 433","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 432","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.2800000000000011,-3.1199999999999974],[0.21999999999999886,0.20000000000000284],[-1.210000000000008,1.0799999999999983],[-0.020000000000010232,0.010000000000005116]],"o":[[-1.1899999999999977,3.1400000000000006],[-0.020000000000010232,0],[-1.259999999999991,-1.1300000000000026],[0.21999999999999886,-0.20000000000000284],[0,0]],"v":[[147.67,55.33],[147.67,64.33],[147.33999999999997,64.66],[147.33999999999997,55],[147.67,55.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.7922,0.6118]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[147.04182529637362,59.83031362511554]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[147.04182529637362,59.83031362511554]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 434","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 433","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3400000000000034,-0.6099999999999994],[0.3599999999999852,1.0100000000000051],[-0.45999999999997954,0.3399999999999963],[-1.450000000000017,-1.4899999999999949]],"o":[[-0.3300000000000125,0.9299999999999997],[-0.5999999999999943,0.9299999999999997],[0.1699999999999875,-0.6899999999999977],[0.7199999999999989,-0.5200000000000031],[0,0]],"v":[[170.67,42],[169.67,43.67],[167,43],[168.79,42.31],[170.66,42]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6824,0.302,0.251]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[168.83501893789148,42.718522349439496]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[168.83501893789148,42.718522349439496]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 435","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 434","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6900000000000261,-0.19999999999998863],[-0.4800000000000182,0.020000000000038654],[0.4399999999999977,0],[2.859999999999985,0.7400000000000091],[-0.6200000000000045,-0.05000000000001137],[-1.660000000000025,-0.38999999999998636]],"o":[[0.6299999999999955,0.14999999999997726],[0.4300000000000068,0.12000000000000455],[0.09999999999999432,0.4800000000000182],[-2.8600000000000136,-0.7200000000000273],[-0.4000000000000057,-0.2699999999999818],[1.75,0.4200000000000159],[0,0]],"v":[[208.33,305.33],[210.66000000000003,306],[211.99000000000004,306.34],[211.33000000000004,306.66999999999996],[202.66000000000005,304.66999999999996],[202.99000000000007,304.34],[208.32000000000008,305.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5961,0.6078,0.6196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[207.2165350408806,305.5102572365805]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[207.2165350408806,305.5102572365805]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 436","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 435","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.10000000000002274,-0.020000000000003126],[0.05000000000001137,1.2800000000000011],[-0.38999999999998636,0.23000000000000398],[-0.5999999999999943,0.00999999999999801]],"o":[[0,0],[-0.09999999999999432,0.030000000000001137],[-0.6200000000000045,0.39000000000000057],[0.030000000000001137,-0.3400000000000034],[0.8199999999999932,-0.5499999999999972],[0,0]],"v":[[150.67,37.67],[149.67,40],[149.33999999999997,40],[148.33999999999997,38.67],[148.53999999999996,37.64],[150.67999999999995,37.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9647,0.9176,0.9059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[149.49250887151047,38.77121836515923]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[149.49250887151047,38.77121836515923]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 437","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 436","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[3.1899999999999977,-0.5699999999999932],[-0.08000000000004093,0.30000000000001137],[-1.920000000000016,0.5400000000000205],[-0.7700000000000387,-0.3100000000000023]],"o":[[-3.0400000000000205,1.1000000000000227],[-0.2799999999999727,0],[2.019999999999982,-0.38999999999998636],[1.0500000000000114,-0.30000000000001137],[0,0]],"v":[[300,293],[290.67,295.67],[290.34000000000003,295.34000000000003],[296.34000000000003,293.67],[300.01000000000005,293]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6118,0.6235,0.6353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[295.16339615717936,294.2954369979311]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[295.16339615717936,294.2954369979311]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 438","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 437","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-2.5600000000000023,-0.39999999999997726],[2.920000000000016,-0.05000000000001137],[0,0]],"o":[[2.579999999999984,0.30000000000001137],[-2.819999999999993,0.7300000000000182],[0,0],[0,0]],"v":[[257.67,288.67],[265.34000000000003,290],[256.34000000000003,289],[257.67,288.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.851,0.8549,0.8588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[260.84001237253244,289.4229911065279]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[260.84001237253244,289.4229911065279]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 439","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 438","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.09000000000000341,-0.23999999999999488],[1.0499999999999972,-0.04999999999999716],[0.3299999999999983,-0.6500000000000057],[0.10999999999999943,-0.3100000000000023],[0.4200000000000017,-0.10999999999999943],[0.060000000000002274,0.04000000000000625],[0.12000000000000455,0.09000000000000341],[-1.1500000000000057,0.37000000000000455],[-0.7199999999999989,1.9300000000000068],[0.0799999999999983,-0.6499999999999915]],"o":[[-0.0799999999999983,0.2600000000000051],[0.7399999999999949,0.7399999999999949],[-0.29999999999999716,0.7099999999999937],[-0.10999999999999943,0.20999999999999375],[0.23999999999999488,0.37999999999999545],[-0.10999999999999943,-0.030000000000001137],[-0.12000000000000455,-0.0799999999999983],[-0.7000000000000028,-0.75],[0.8299999999999983,-1.7600000000000051],[0.29999999999999716,-0.4300000000000068],[0,0]],"v":[[87.33,85.33],[87.33,86.33],[86.66,88],[85.33,90],[85,91],[84.67,92],[84.34,92],[84.01,91.67],[84.68,90],[87.01,85],[87.34,85.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3412,0.1176,0.102]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.66589803528998,88.50634888305723]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.66589803528998,88.50634888305723]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 440","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 439","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-3.25,-0.10999999999999943],[-0.25,1.8699999999999974],[0.6200000000000045,-1],[0.8800000000000239,-0.35999999999999943],[0.3199999999999932,-0.3400000000000034],[0.9399999999999977,-1.3700000000000045],[0,0],[-0.25,1.1099999999999994]],"o":[[0,0],[0.13999999999998636,1.3999999999999986],[-0.9000000000000057,-1.7800000000000011],[0.9799999999999898,-0.7100000000000009],[-0.37000000000000455,0.5200000000000031],[-0.0800000000000125,-0.6099999999999994],[-1.1599999999999966,1.2100000000000009],[0,0],[0.46000000000000796,-1.3100000000000023],[0,0]],"v":[[163.33,44.33],[164.59,46.559999999999995],[165.66,48.669999999999995],[167.66,44.669999999999995],[168.32999999999998,45.669999999999995],[166.99999999999997,47.669999999999995],[166.33999999999997,47.839999999999996],[163.49999999999997,52],[162.96999999999997,48.84],[163.32999999999998,44.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.698,0.2902,0.2314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[165.81022946488352,48.16499452065767]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[165.81022946488352,48.16499452065767]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 441","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 440","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6899999999999977,2.8499999999999943],[-0.14000000000001478,0.060000000000002274],[1.6299999999999955,-2.6200000000000045]],"o":[[0.03999999999999204,-2.9200000000000017],[0.05000000000001137,0],[0.38999999999998636,2.780000000000001],[0,0]],"v":[[152.33,78.67],[151.66000000000003,70.34],[151.99000000000004,70],[152.33000000000004,78.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8784,0.7216,0.5529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[152.35660920283712,74.33499174997357]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[152.35660920283712,74.33499174997357]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 442","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 441","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6299999999999955,-0.7000000000000028],[0.09999999999999432,-0.030000000000001137],[0.7800000000000011,0.21999999999999886],[-0.23999999999999488,0.22999999999999687],[-0.75,0.509999999999998]],"o":[[-0.060000000000002274,1.0399999999999991],[-0.09999999999999432,0.03999999999999915],[-1.0100000000000051,0.6700000000000017],[-0.01999999999999602,-0.4099999999999966],[0.0799999999999983,-0.0799999999999983],[0,0]],"v":[[119,40.67],[120,42.34],[119.67,42.34],[117,43.010000000000005],[116.67,41.010000000000005],[119,40.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9686,0.8824,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[118.30480260747535,41.88115934914359]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[118.30480260747535,41.88115934914359]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 443","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 442","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.3100000000000023,1.6899999999999977],[-0.5999999999999943,0.9299999999999926],[1.039999999999992,-3.0900000000000034]],"o":[[-0.4900000000000091,-1.5400000000000063],[0.21000000000000796,-1.1500000000000057],[0.7599999999999909,3.450000000000003],[0,0]],"v":[[213.33,117],[214.51000000000002,112.02],[214.99,108.67],[213.32000000000002,117]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.7451,0.5686]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[214.21631567717023,112.83499942492213]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[214.21631567717023,112.83499942492213]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 444","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 443","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3400000000000034,-0.4399999999999977],[-1.2899999999999991,-0.4200000000000017]],"o":[[-0.509999999999998,0.45999999999999375],[-2.1700000000000017,-1.5300000000000011],[0,0]],"v":[[58.67,113.33],[56,116],[58.67,113.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9569,0.8667,0.8471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[56.99159447006801,114.63028706693149]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[56.99159447006801,114.63028706693149]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 445","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 444","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8199999999999932,0.11000000000001364],[0.6399999999999864,-0.21999999999999886],[0,0],[1.1399999999999864,-3.509999999999991]],"o":[[-0.5099999999999909,-0.46999999999999886],[-0.4700000000000273,-0.060000000000002274],[0,0],[1.6299999999999955,-0.6299999999999955],[0,0]],"v":[[263.67,240.67],[262.15000000000003,239.32999999999998],[257.00000000000006,240.33999999999997],[257.00000000000006,240.00999999999996],[263.6700000000001,240.67999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7137,0.7176,0.7176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[260.404700650921,239.71174600545356]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[260.404700650921,239.71174600545356]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 446","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 445","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.1699999999999875,-0.06999999999999318],[2.210000000000008,-0.660000000000025],[0.3100000000000023,0.6200000000000045],[-2.980000000000018,1.2699999999999818]],"o":[[0.7599999999999909,0.3299999999999841],[-2.1699999999999875,0.8799999999999955],[-0.47999999999998977,0.13999999999998636],[3.1200000000000045,-0.8799999999999955],[0,0]],"v":[[212,266.67],[211.27,267.44],[204.27,270.11],[202.67000000000002,270],[212.00000000000003,266.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8157,0.5608,0.4039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[207.45196563270596,268.5088604221773]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[207.45196563270596,268.5088604221773]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 447","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 446","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.09000000000000341,-1.7900000000000205],[-0.09000000000000341,0.020000000000010232],[0,0],[0,0],[-0.21999999999999886,-0.3499999999999943]],"o":[[-0.5600000000000023,1.710000000000008],[0.8700000000000045,-1.0600000000000023],[0,0],[0,0],[0.5,-0.060000000000002274],[0,0]],"v":[[159,168],[158.34,173.33],[160,173],[157.67,174.33],[158.33999999999997,167],[158.99999999999997,168]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.902,0.9098,0.9059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[158.83503090340818,170.66318591615743]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[158.83503090340818,170.66318591615743]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 448","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 447","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.09999999999999432,-0.730000000000004],[1.339999999999975,-0.3399999999999963],[-0.960000000000008,-0.23000000000000398],[-0.11000000000001364,0],[-0.9399999999999977,-0.18999999999999773]],"o":[[0.3400000000000034,0.38000000000000256],[-1.259999999999991,0.490000000000002],[-0.960000000000008,-0.3200000000000003],[0.11000000000001364,0],[0.18000000000000682,-0.6400000000000006],[0,0]],"v":[[152.67,37],[153.33999999999997,38.67],[149.67,40],[150.67,37.67],[151,37.67],[152.67,37]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9176,0.4431,0.4196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[151.3102687098482,38.46703758190972]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[151.3102687098482,38.46703758190972]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 449","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 448","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.3799999999999955,-0.39000000000000057],[0.060000000000002274,0.14000000000000057],[-2.2099999999999795,-0.4799999999999969],[0,0],[0,0],[0,0]],"o":[[-2.319999999999993,-0.75],[0,-0.060000000000002274],[2.1899999999999977,-0.509999999999998],[0,0],[0,0],[0,0],[0,0]],"v":[[161.33,47],[154.66000000000003,46.67],[154.32000000000002,46.34],[160.99,46.34],[160.99,41.34],[161.33,41.17],[161.33,47]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8549,0.7176,0.5569]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[157.82503605301915,44.084997093664896]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[157.82503605301915,44.084997093664896]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 450","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 449","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4200000000000159,-2.969999999999999],[0.05000000000001137,-0.12000000000000455],[-0.6500000000000057,2.519999999999996],[0.030000000000001137,-0.5799999999999983]],"o":[[-0.7599999999999909,3.019999999999996],[-0.009999999999990905,0.0799999999999983],[-1.1299999999999955,-2.700000000000003],[0.25,-0.35999999999999943],[0,0]],"v":[[177,114.67],[175.67,122.34],[175.33999999999997,122.67],[176.67,114.34],[177,114.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1294,0.1412,0.149]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[175.9908708686098,118.40159533824931]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[175.9908708686098,118.40159533824931]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 451","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 450","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.2800000000000011,-3.8499999999999943],[0.15000000000000568,0.3199999999999932],[-0.11000000000001364,1.2299999999999898],[0,0]],"o":[[2.819999999999993,3.3300000000000125],[-0.6100000000000136,-0.060000000000002274],[1.0800000000000125,-0.7599999999999909],[0,0],[0,0]],"v":[[154.67,130.67],[155.32999999999998,139.33999999999997],[154.67,138.33999999999997],[156.03,134.49999999999997],[154.67,130.66999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8824,0.7255,0.5608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[155.60438894640814,135.00498551683347]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[155.60438894640814,135.00498551683347]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 452","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 451","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.25,-2.519999999999996],[0.10999999999999943,0.01999999999999602],[0,0],[-1.2000000000000028,-0.8500000000000085],[0.9399999999999977,-1.6200000000000045],[0.07000000000000739,0.45000000000000284],[3.3599999999999994,-0.2600000000000051],[-0.6200000000000045,0.519999999999996]],"o":[[2.299999999999997,0.45999999999999375],[-0.030000000000001137,-0.04000000000000625],[0,0],[0.269999999999996,-2],[-1.5300000000000011,0.7999999999999972],[-0.37999999999999545,0],[1.3100000000000023,-1.4099999999999966],[0.6800000000000068,-0.5799999999999983],[0,0]],"v":[[80.33,78.67],[82.66,81.67],[82.33,81.67],[81.71,81.22],[81.66,82.34],[79.33,84.34],[78.66,83.67],[78.33,80.34],[80.33,78.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8431,0.3647,0.3255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[80.53250396508813,81.50499579015997]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[80.53250396508813,81.50499579015997]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 453","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 452","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.15000000000000568,-0.710000000000008],[0.9099999999999966,0.8799999999999955],[0.10999999999999943,0.9500000000000028],[0,0],[-1.1599999999999966,0.539999999999992],[0.3400000000000034,-0.7800000000000011]],"o":[[0,0],[-0.8700000000000045,0.4099999999999966],[0.9200000000000017,0.6599999999999966],[-0.7800000000000011,0.8100000000000023],[0,0],[0.9599999999999937,-0.7000000000000028],[1.2199999999999989,-0.7800000000000011],[0,0]],"v":[[68,89.67],[68.21,90.32000000000001],[66.66999999999999,92.00000000000001],[65.66999999999999,93.33000000000001],[64.66999999999999,92.33000000000001],[63.66999999999999,92.00000000000001],[66.66999999999999,89.67000000000002],[67.99999999999999,89.67000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.2706,0.2392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[65.94002702888906,91.66113473712807]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[65.94002702888906,91.66113473712807]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 454","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 453","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.1599999999999966,-0.45999999999997954],[0.9000000000000057,0.11000000000001364],[-0.04999999999998295,0.7700000000000387],[-1.549999999999983,-0.2400000000000091]],"o":[[0.6899999999999977,0.11000000000001364],[-0.4199999999999875,0.17000000000001592],[-0.6100000000000136,-0.06999999999999318],[1.6100000000000136,0.17000000000001592],[0,0]],"v":[[215.83,275.33],[216.57000000000002,276.41999999999996],[211.16000000000003,275.98999999999995],[210.67000000000002,275.31999999999994],[215.84,275.31999999999994]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0745,0.0902,0.0941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[213.84537515389863,275.8490082482043]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[213.84537515389863,275.8490082482043]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 455","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 454","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.06999999999999318,-1.5700000000000003],[0.5900000000000034,-0.5200000000000031],[0.6599999999999966,0.10999999999999943],[0.03999999999999204,0.20000000000000284]],"o":[[0,0],[-0.3199999999999932,2.0700000000000003],[-0.6599999999999966,0.5900000000000034],[0.7000000000000028,-0.5700000000000003],[-0.06999999999999318,-0.21999999999999886],[0,0]],"v":[[94.67,61],[97,60],[98,61.33],[96,63],[95,61.67],[94.67,61]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.851,0.8314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[96.33630991098579,61.4999938314034]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[96.33630991098579,61.4999938314034]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 456","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 455","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.09000000000000341,-0.5399999999999636],[2.9000000000000057,-0.4900000000000091],[0.3300000000000125,0.6200000000000045],[-2.880000000000024,0.08999999999997499]],"o":[[0.3499999999999943,-0.009999999999990905],[-2.960000000000008,0.25],[-0.5099999999999909,0.08999999999997499],[2.9399999999999977,-0.3299999999999841],[0,0]],"v":[[177.67,294.67],[178.67,295],[170.01999999999998,296.85],[168.33999999999997,296.67],[177.67,294.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.9294,0.9216]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[173.50879787486375,295.8277262961978]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[173.50879787486375,295.8277262961978]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 457","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 456","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5200000000000031,-0.8699999999999761],[0.8999999999999986,0.1799999999999784],[-0.14000000000000057,1.5599999999999739],[-0.12999999999999545,0.44000000000002615]],"o":[[1.009999999999998,-0.020000000000010232],[0.45000000000000284,1.0699999999999932],[-0.8500000000000014,-1.1699999999999875],[0.13000000000000256,-0.4399999999999977],[0,0]],"v":[[43,133.33],[45,136],[44.33,137.33],[42.66,134.66000000000003],[42.989999999999995,133.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.6627,0.6275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[43.9363232470985,135.3494928454869]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[43.9363232470985,135.3494928454869]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 458","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 457","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3100000000000023,-1.1900000000000048],[0.4000000000000057,0.4099999999999966],[0.29999999999999716,0.04999999999999716],[-1.1700000000000017,0.18999999999999773],[-0.7600000000000051,0.6400000000000006],[0,0]],"o":[[-1.1899999999999977,1.2899999999999991],[-0.9899999999999949,-0.4099999999999966],[-0.3199999999999932,-0.03999999999999915],[-0.04999999999999716,-0.7000000000000028],[0.8700000000000045,0.6000000000000014],[0,0],[0,0]],"v":[[103.33,56.67],[99.33,60.34],[99.99,58.010000000000005],[98.99,58.010000000000005],[100.66,56.68000000000001],[103.16,56.35000000000001],[103.32,56.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.6471,0.6235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[101.15845709546113,58.344989027678366]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[101.15845709546113,58.344989027678366]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 459","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 458","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7800000000000011,-1.2100000000000009],[0.7399999999999949,-0.6700000000000017],[0.45000000000000284,-0.3999999999999986],[0.060000000000002274,0.3299999999999983],[0,0.519999999999996],[-0.9099999999999966,0.09000000000000341],[-1.3400000000000034,-0.1599999999999966],[-0.6500000000000057,-0.2700000000000031]],"o":[[1.1800000000000068,-0.9399999999999977],[-0.8700000000000045,0.759999999999998],[-0.4300000000000068,0.04999999999999716],[-0.1599999999999966,0.11999999999999744],[-0.3299999999999983,0.21999999999999886],[-0.6700000000000017,-0.6099999999999994],[0.45999999999999375,-0.7199999999999989],[0.45000000000000284,-1.0399999999999991],[0,0]],"v":[[112.67,46.67],[113.34,47.34],[110.67,49.67],[109.34,50.34],[109.01,50.010000000000005],[108.01,49.68000000000001],[108.34,48.68000000000001],[111.03,47.84],[112.68,46.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.6078,0.5608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[110.67705445837728,48.267622194943385]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[110.67705445837728,48.267622194943385]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 460","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 459","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.01999999999999602,-0.6800000000000068],[0.480000000000004,-1.0400000000000063],[1.019999999999996,0.4899999999999949],[-0.01999999999999602,0.7099999999999937],[-0.14000000000000057,-0.28000000000000114],[0.1700000000000017,0.6899999999999977],[-0.4899999999999949,0.01999999999999602]],"o":[[0.9300000000000068,0.7399999999999949],[0,0.10999999999999943],[-1.3599999999999994,0.29000000000000625],[0.29000000000000625,-0.6200000000000045],[0.0799999999999983,-0.28000000000000114],[0.39000000000000057,0.01999999999999602],[-0.5,-0.18000000000000682],[0,0]],"v":[[85.33,90],[85.33,92.81],[86.33,94.67],[83.66,94.01],[84.33,92.01],[84.66,92.01],[84.99,91.01],[85.32,90.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8118,0.6431,0.5961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.04294646001455,92.38010568803463]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.04294646001455,92.38010568803463]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 461","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 460","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.23000000000000398,0.1599999999999966],[-2.239999999999995,0.04999999999999716],[0.1799999999999926,-1.9399999999999977],[0.0799999999999983,-0.04999999999999716],[0.14999999999999147,0.5999999999999943],[-0.5900000000000034,-0.28000000000000114]],"o":[[0.060000000000002274,-0.04000000000000625],[1.269999999999996,-0.8799999999999955],[-0.20999999999999375,2.1899999999999977],[-0.0799999999999983,0.04999999999999716],[-0.5699999999999932,-0.0799999999999983],[-0.269999999999996,-0.6800000000000068],[0,0]],"v":[[74.67,102.33],[75.25,102.25],[78.33,98.33],[75.67,103.66],[75.34,103.66],[74.01,102.66],[74.68,102.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.898,0.7176,0.6745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[76.12371382326043,101.00221369175927]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[76.12371382326043,101.00221369175927]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 462","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 461","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.1699999999999875,-0.28999999999999204],[0.25,3.049999999999997],[-0.2400000000000091,0.010000000000005116],[-0.21999999999999886,-1.5999999999999943],[-0.5300000000000011,-0.8800000000000097]],"o":[[-0.21999999999999886,0.38999999999998636],[-0.5,-3.010000000000005],[-0.020000000000010232,-0.4399999999999977],[0.12000000000000455,1.4699999999999989],[0.13999999999998636,1.0100000000000051],[0,0]],"v":[[131,128],[130.33,129],[129,120],[129.33,119.33],[130.09,124.74],[131,128]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3451,0.3412,0.3412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[129.99888373469173,124.16498718168958]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[129.99888373469173,124.16498718168958]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 463","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 462","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.039999999999992,0.18999999999999773],[1.7199999999999989,0.3100000000000023],[-0.20000000000001705,0.9900000000000091],[-3.589999999999975,-0.25]],"o":[[-1.5999999999999943,-0.05000000000001137],[-1.6399999999999864,-0.14999999999997726],[-0.6200000000000045,-0.11000000000001364],[3.539999999999992,0.6200000000000045],[0,0]],"v":[[236.33,306.33],[231.33,306.33],[226.76000000000002,305.71],[225.66000000000003,304.98999999999995],[236.33,306.31999999999994]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.651,0.6588,0.6706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[230.97719037067847,305.6971606232258]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[230.97719037067847,305.6971606232258]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 464","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 463","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.030000000000001137,-0.3199999999999932],[0.2600000000000051,-0.20999999999999375],[0.7700000000000031,0.6400000000000006],[-1.0600000000000023,0.5599999999999881],[-0.14000000000000057,-0.5900000000000034]],"o":[[0.04999999999999716,0.3100000000000023],[-0.46999999999999886,0.3299999999999983],[-1.2299999999999969,0.29000000000000625],[-1.1300000000000026,0.4300000000000068],[0.14000000000000057,-0.0799999999999983],[0,0]],"v":[[61.33,110.33],[61.33,111.33],[59.66,112.33],[58.66,110.66],[58.41,109.17],[61.33,110.32000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.8392,0.8157]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[59.52637461693831,110.7670995588986]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[59.52637461693831,110.7670995588986]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 465","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 464","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.28000000000000114,-0.6799999999999997],[0,0],[2.019999999999982,0.5100000000000051],[0.8899999999999864,0.13000000000000256],[0,0],[0.14999999999997726,-1.480000000000004]],"o":[[0.8300000000000125,-0.2700000000000031],[0,0],[1.9399999999999977,-0.39000000000000057],[-1.1100000000000136,-0.1599999999999966],[0,0],[-0.12999999999999545,-1.8200000000000003],[0,0]],"v":[[139,38.33],[139.67,39.33],[140.76999999999998,39.5],[140.67,40.33],[137.67,39.66],[136.67,37.66],[139,38.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9765,0.9059,0.8941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[139.43533516824854,38.55327388890021]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[139.43533516824854,38.55327388890021]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 466","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 465","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.060000000000002274,-1.4500000000000028],[0.3400000000000034,-0.3100000000000023],[-0.17999999999999972,-1.2900000000000063],[0.6000000000000014,-1.2199999999999989],[0.13000000000000256,0.3299999999999983],[-0.8099999999999952,1.039999999999992],[1.5900000000000034,0.6099999999999994],[0.21999999999999886,0.8200000000000074],[-1.3999999999999986,-0.4399999999999977],[0.519999999999996,1.2999999999999972],[0,0]],"o":[[0.7199999999999989,-0.3299999999999983],[-0.21000000000000085,0.1700000000000017],[-1.9600000000000009,0.4899999999999949],[-0.7800000000000011,1],[-0.3299999999999983,-0.12000000000000455],[0.0799999999999983,-1.1800000000000068],[0.8400000000000034,-0.8799999999999955],[-0.5700000000000003,-0.21999999999999886],[0.14999999999999858,-0.6599999999999966],[0.8200000000000003,0.060000000000002274],[0,0],[0,0]],"v":[[58.67,110.67],[59.67,112.34],[58.67,113.34],[56,116.01],[53.33,120.68],[52.66,120.01],[53.989999999999995,116.68],[54.169999999999995,113.64],[52.66,113.02],[54.989999999999995,112.69],[58.019999999999996,111.08],[58.65,110.69]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.3176,0.2941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[56.16840348375413,115.62863777661894]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[56.16840348375413,115.62863777661894]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 467","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 466","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.8899999999999864,0.04999999999999716],[-0.060000000000002274,0],[0.6400000000000148,-1.2199999999999989],[0.21999999999999886,-0.6800000000000068],[0.35000000000002274,-1.2099999999999937],[0.4399999999999977,0.7000000000000028],[-1.1999999999999886,2.0900000000000034]],"o":[[0,0],[0.8199999999999932,-0.060000000000002274],[0.8400000000000034,-0.04999999999999716],[-1.3499999999999943,-0.0799999999999983],[-0.9099999999999966,-0.6099999999999994],[-0.37999999999999545,1.2000000000000028],[-0.09000000000000341,0.3100000000000023],[0.12000000000000455,-2.4000000000000057],[0,0]],"v":[[180.67,102.33],[181.01,103.33],[183.17999999999998,102.64],[184.33999999999997,103],[181.00999999999996,104.67],[180.24999999999997,105.07000000000001],[179.22999999999996,108.73],[178.66999999999996,109.33],[180.66999999999996,102.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3529,0.3765,0.4]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[181.50503829200906,105.95258575554976]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[181.50503829200906,105.95258575554976]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 468","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 467","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.23000000000000398,-0.6000000000000085],[0.5900000000000034,-0.980000000000004],[0.6700000000000017,-0.5600000000000023],[2.450000000000003,-0.18999999999999773],[-0.8299999999999983,-0.3199999999999932],[-0.010000000000005116,-0.45000000000000284]],"o":[[0.4399999999999977,-0.8199999999999932],[0.5900000000000034,0.3499999999999943],[-0.6599999999999966,0.5600000000000023],[-1.7800000000000011,-0.6700000000000017],[-0.5300000000000011,-0.769999999999996],[0.20999999999999375,-0.23000000000000398],[0,0]],"v":[[84.67,70.33],[85.67,70],[85.67,72],[83.67,73.67],[82.67,71.67],[84.34,70],[84.67,70.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.3686,0.3451]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[84.11075835492863,71.64483696666528]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.11075835492863,71.64483696666528]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 469","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 468","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-0.14000000000000057],[0.4300000000000068,0.12999999999999545],[0.8400000000000034,0.5600000000000023],[0.10999999999998522,0.3400000000000034],[-1.0699999999999932,-0.01999999999999602],[-2.0200000000000102,-1.2099999999999937]],"o":[[0.27000000000001023,0.730000000000004],[-0.4399999999999977,-0.1599999999999966],[-1.25,0.1599999999999966],[-0.28999999999999204,-0.20000000000000284],[0.9300000000000068,-0.23999999999999488],[2.3700000000000045,0],[0,0]],"v":[[215.67,71],[215.67,71.67],[214.33999999999997,71],[205.93999999999997,70.8],[205.33999999999997,70],[208.33999999999997,69.67],[215.67,71]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1412,0.149,0.1608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[210.56507143441942,70.6688290739649]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[210.56507143441942,70.6688290739649]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 470","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 469","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.35999999999999943,-0.29999999999999716],[0.6299999999999955,-0.23999999999999488],[-1.3599999999999994,0.8200000000000003],[-0.980000000000004,0.0799999999999983],[0.4000000000000057,-0.7999999999999972]],"o":[[0,0],[-0.5900000000000034,0.28999999999999915],[-1.2399999999999949,-0.07000000000000028],[0.45000000000000284,-0.3100000000000023],[0.75,-0.5200000000000031],[0,0]],"v":[[122,40],[122,41],[120,42.33],[119,40.66],[121,38.989999999999995],[122,39.989999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.451,0.4196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[120.25036933033371,40.57188022595389]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[120.25036933033371,40.57188022595389]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 471","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 470","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.2699999999999818,-0.7299999999999969],[0.789999999999992,-0.6099999999999994],[1.1599999999999966,0.12000000000000455],[0.30000000000001137,0.38000000000000256],[0,0],[-1.2600000000000193,-0.30000000000000426]],"o":[[0.47999999999998977,-0.7299999999999969],[0.9000000000000057,-0.35999999999999943],[-1.2700000000000102,-0.17999999999999972],[-0.37000000000000455,-0.28999999999999915],[0,0],[0.28999999999999204,-0.5200000000000031],[0,0]],"v":[[135,37.33],[136.67,37.66],[137.67,39.66],[133.67,38.989999999999995],[132.67,37.989999999999995],[132.67,37.66],[135,37.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.3882,0.3647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[135.3227241950344,38.29019592710148]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[135.3227241950344,38.29019592710148]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 472","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 471","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4300000000000068,0.1600000000000108],[3.930000000000007,0.7599999999999909],[-4.489999999999981,-1.9599999999999937]],"o":[[-0.3199999999999932,0.6899999999999977],[-3.75,-1.3799999999999955],[4.9199999999999875,0.29999999999999716],[0,0]],"v":[[201.33,108],[199.87,107.96],[188.66,105],[201.32999999999998,108]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9255,0.7569,0.5765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[194.99504400568352,106.66658057795141]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[194.99504400568352,106.66658057795141]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 473","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 472","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.09999999999999432,-1.6099999999999994],[0.3300000000000125,-0.020000000000003126],[0.1699999999999875,0.8200000000000003],[-0.8000000000000114,-0.10999999999999943],[-0.030000000000001137,0.3500000000000014],[-0.6899999999999977,-0.5399999999999991],[0,0],[0.05999999999997385,-0.3500000000000014]],"o":[[1,0.9799999999999969],[-0.3300000000000125,0.030000000000001137],[-1.1599999999999966,-0.07000000000000028],[-0.5500000000000114,-0.6199999999999974],[-0.9099999999999966,-0.3200000000000003],[0.11000000000001364,-1.1799999999999997],[0,0],[0.28999999999999204,-0.14000000000000057],[0,0]],"v":[[144.67,37.67],[146,40.67],[145,40.67],[143,39.34],[143.33,38.67],[142,37.67],[143.8,37.480000000000004],[144.33,37.330000000000005],[144.66000000000003,37.660000000000004]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.4471,0.4196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[144.00638690836504,38.803105396618804]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[144.00638690836504,38.803105396618804]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 474","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 473","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.18000000000000682,-0.6400000000000006],[0,0],[0,0],[0.6700000000000017,-0.25],[0.9099999999999966,-0.44999999999999574],[-1.1299999999999955,-0.020000000000003126],[-0.8500000000000085,-0.6299999999999955],[0.5999999999999943,0.5700000000000003],[-0.18000000000000682,0.8400000000000034],[0.04000000000000625,0.19000000000000483],[-0.5100000000000051,-0.8100000000000023]],"o":[[0.18999999999999773,-0.6400000000000006],[0,0],[0,0],[-0.45000000000000284,0.4099999999999966],[-0.9300000000000068,0.6099999999999994],[-1.1400000000000006,0.240000000000002],[-0.6299999999999955,-0.8599999999999994],[0.4200000000000017,0.22999999999999687],[-0.39000000000000057,-0.5],[-0.060000000000002274,-0.04999999999999716],[-0.23999999999999488,-0.8999999999999986],[0,0]],"v":[[124,36],[124.67,36],[124,38],[126.67,38.67],[125,39.67],[122,41],[122,40],[122.67,39.33],[123.34,39],[123.01,37],[123.01,36.33],[124.01,36]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.4353,0.4]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[123.90941614258026,38.268271104908735]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[123.90941614258026,38.268271104908735]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 475","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 474","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-2.9799999999999898,-0.9000000000000057],[0.839999999999975,-0.3100000000000023],[0.9200000000000159,2.1500000000000057],[-1.1500000000000057,0.5599999999999881],[0.28999999999999204,-0.12000000000000455]],"o":[[-2.8300000000000125,4.420000000000002],[0.21000000000000796,0.060000000000002274],[-2.210000000000008,-0.769999999999996],[-0.4900000000000091,-1.1500000000000057],[0.28999999999999204,0.09000000000000341],[0,0]],"v":[[182.67,105],[190.08999999999997,111.09],[190.67,111.67],[181.57999999999998,107.91],[182.67,104.67],[182.67,105]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8784,0.7216,0.5529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[186.17185064907457,108.16997847411847]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[186.17185064907457,108.16997847411847]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 476","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 475","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.020000000000010232,-0.12999999999999545],[0.14000000000001478,-0.8500000000000227],[0.0999999999999659,-1.259999999999991],[-0.11000000000001364,-0.1599999999999966],[-0.3100000000000023,0.030000000000001137],[0.9499999999999886,0.22999999999998977],[0,0],[-0.5699999999999932,0.21999999999999886],[0.29000000000002046,-0.12000000000000455]],"o":[[-0.19999999999998863,0.06999999999999318],[-0.11000000000001364,0.6999999999999886],[1.0600000000000023,-0.46000000000000796],[-1.3100000000000023,-1.1699999999999875],[0.19999999999998863,0.30000000000001137],[-0.36000000000001364,0.4399999999999977],[0,0],[0.09000000000000341,-0.5300000000000011],[0.29000000000002046,0.09000000000000341],[0,0]],"v":[[257,240.33],[254.64,241.53],[255.32999999999998,244.33],[256.32,245],[256.29,247.47],[256.99,247.67],[255.99,248.67],[254.09,241.48],[256.98,240],[256.98,240.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.702,0.7059,0.7059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[255.54505336203252,244.35554874431216]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[255.54505336203252,244.35554874431216]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 477","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 476","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.519999999999996,-0.4299999999999926],[0.4300000000000068,0.37000000000000455],[-0.5799999999999983,1.3599999999999994],[-0.4099999999999966,-0.7000000000000028],[-0.3299999999999983,-0.28000000000000114]],"o":[[0.06999999999999318,0.45000000000000284],[-0.4300000000000068,0.5100000000000051],[0.6099999999999994,-1.3499999999999943],[0.3499999999999943,-0.7000000000000028],[0.3400000000000034,-0.04999999999999716],[0,0]],"v":[[70,84],[69.33,85.33],[65.66,87.99],[67.66,83.99],[68.99,83.99],[69.99,83.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8745,0.2392,0.2078]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[67.83636988857663,85.94028879240491]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[67.83636988857663,85.94028879240491]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 478","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 477","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.00999999999999801,-0.9199999999999875],[-0.3200000000000003,1],[0.28999999999999915,0.8999999999999773],[-0.09000000000000341,0.3100000000000023],[-0.28999999999999915,-0.46999999999999886],[-0.6299999999999955,-0.7800000000000011]],"o":[[-1.2899999999999991,-0.25],[-1.1199999999999974,0.12000000000000455],[-1.0600000000000023,0.1599999999999966],[0.14999999999999858,-0.5099999999999909],[0.9399999999999977,-0.0800000000000125],[0.5399999999999991,0.8899999999999864],[0,0]],"v":[[46.67,136],[46.34,138],[45.010000000000005,136],[43.010000000000005,133.33],[43.68000000000001,132],[44.78000000000001,133.07],[46.68000000000001,136]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8863,0.3725,0.3373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[44.84502402564115,135.0012235636837]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[44.84502402564115,135.0012235636837]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 479","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 478","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.969999999999999,-0.18999999999999773],[1.039999999999992,0.18000000000000682],[1.3099999999999739,0.4300000000000068],[-1.210000000000008,-0.18999999999999773],[-2.9399999999999977,0.8000000000000114],[-0.3100000000000023,-0.6500000000000057]],"o":[[-2.789999999999992,0.8700000000000045],[-0.960000000000008,0.18000000000000682],[-1.4199999999999875,-0.37000000000000455],[1.1299999999999955,-0.6899999999999977],[3.039999999999992,0.46999999999999886],[0.4399999999999977,-0.12000000000000455],[0,0]],"v":[[161.33,240.33],[153,242.33],[150,242.33],[146.33,241],[150.19000000000003,241.98],[159.84000000000003,240.32999999999998],[161.34000000000003,240.32999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9137,0.9216,0.9137]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[153.8350169816525,241.17124449595013]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[153.8350169816525,241.17124449595013]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 480","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 479","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3900000000000148,-1.5100000000000051],[0.22999999999998977,-0.23999999999999488],[0.0800000000000125,0.4200000000000017],[0.22999999999998977,0.7800000000000011],[0,0],[0,0],[-0.12000000000000455,0.519999999999996],[0.13999999999998636,1.4899999999999949],[0,0]],"o":[[-0.18000000000000682,1.5499999999999972],[-0.19999999999998863,0.7800000000000011],[-0.5500000000000114,0.5600000000000023],[-0.13999999999998636,-0.769999999999996],[0,0],[0,0],[0.5699999999999932,0.7099999999999937],[0.3100000000000023,-1.4399999999999977],[0,0],[0,0]],"v":[[159.33,75],[158.5,79.67],[156.33,86],[155.68,85.5],[155.33,83],[155.66000000000003,82.17],[156.00000000000003,84.33],[158.50000000000003,77.67],[159.00000000000003,73.34],[159.33000000000004,75]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.7333,0.5686]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[157.33003069386248,79.77967251492993]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[157.33003069386248,79.77967251492993]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 481","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 480","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[3.7900000000000205,-0.44999999999998863],[-0.5400000000000205,0.8100000000000023],[-3.5200000000000387,1.3100000000000023]],"o":[[0,0],[-3.6399999999999864,1.1200000000000045],[-0.8799999999999955,0.11000000000001364],[3.730000000000018,-0.410000000000025],[0,0]],"v":[[300.33,294.67],[300.53999999999996,295.04],[289.11999999999995,297.96000000000004],[288.65999999999997,297.33000000000004],[300.33,294.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8824,0.8902,0.8824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[294.437637766992,296.34287502354243]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[294.437637766992,296.34287502354243]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 482","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 481","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.37999999999999545,-1.2000000000000028],[0.09000000000000341,-0.09000000000000341],[0.4399999999999977,0.269999999999996],[-0.39000000000000057,0.6299999999999955],[-0.4899999999999949,0.3400000000000034]],"o":[[0.8299999999999983,0.12000000000000455],[-0.2600000000000051,0.8199999999999932],[-0.10999999999999943,0.10999999999999943],[0.25,-0.5999999999999943],[0.6400000000000006,-1.0400000000000063],[0,0]],"v":[[71.33,77.67],[72.03,78.22],[72,80.67],[69,80.67],[69.67,78.67],[71.34,77.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9608,0.8627,0.851]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[70.6016841168234,79.17722258909487]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[70.6016841168234,79.17722258909487]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 483","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 482","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.1599999999999966,0.21000000000000085],[1.5,0.8999999999999986],[0.7000000000000028,-0.3299999999999983],[0.9300000000000068,0.28999999999999915],[1.3900000000000006,0.28999999999999915],[0.21999999999999886,-0.030000000000001137],[0.06999999999999318,0.46000000000000085],[-0.3499999999999943,0.5600000000000023],[0.6899999999999977,0.6599999999999966],[-0.5,0.6799999999999997],[0,0],[0,0],[-0.519999999999996,0.5500000000000043],[0.3299999999999983,-0.5499999999999972]],"o":[[-0.04000000000000625,0.4299999999999997],[0.8799999999999955,0.46999999999999886],[-0.4099999999999966,0.5600000000000023],[0.7600000000000051,0.6700000000000017],[-0.23999999999999488,1.5700000000000003],[-0.18999999999999773,0.04999999999999716],[0.06999999999999318,-0.4200000000000017],[0.3400000000000034,-0.5600000000000023],[1.5699999999999932,-0.6700000000000017],[0.45999999999999375,-0.6799999999999997],[0,0],[0,0],[0.5100000000000051,-0.509999999999998],[0.46999999999999886,-0.4099999999999966],[0,0]],"v":[[86,43.33],[87.67,43.66],[86.67,45.33],[85,46.66],[84,48.33],[81.33,50.33],[80.66,50.33],[80.66,49],[81.66,47.33],[82.99,45.33],[84.32,43.33],[84.58,43.519999999999996],[84.48,44.66],[85.65,42.989999999999995],[85.98,43.31999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9176,0.2353,0.2157]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[84.39859753216794,46.5810530085098]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.39859753216794,46.5810530085098]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 484","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 483","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.019999999999996,-0.8799999999999955],[0,0],[0.35999999999999943,-0.8500000000000085],[1.6500000000000057,-0.4099999999999966],[-0.8100000000000023,-0.8299999999999983],[0.28000000000000114,-0.14000000000000057],[0,0],[-0.46999999999999886,0.060000000000002274],[-0.6499999999999915,1.0799999999999983],[-0.09999999999999432,-0.020000000000003126],[1.3599999999999994,-1.019999999999996]],"o":[[-1,0.8800000000000026],[0,0],[-0.5100000000000051,-0.5499999999999972],[-1.230000000000004,0.20999999999999375],[-0.7999999999999972,-0.7199999999999989],[0.29000000000000625,0.0799999999999983],[0,0],[0.46999999999999886,0.06999999999999318],[0.9000000000000057,-0.9200000000000017],[0.09999999999999432,0],[1.0799999999999983,-1.0499999999999972],[0,0]],"v":[[96,63],[93,65.67],[92.31,65.89],[91,66.34],[89.33,65.34],[90.66,64.01],[90.66,64.34],[90.86999999999999,64.63000000000001],[92.32,64.68],[94.64999999999999,61.68000000000001],[94.97999999999999,61.68000000000001],[95.97999999999999,63.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.5451,0.5176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[92.8251138288777,63.83005605158078]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[92.8251138288777,63.83005605158078]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 485","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 484","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-4.420000000000002,-1.009999999999991],[0.6199999999999903,0.08999999999997499],[3.930000000000007,0.7300000000000182],[0,0]],"o":[[4.359999999999999,1.1299999999999955],[-0.45000000000000284,0.6200000000000045],[-3.9599999999999937,-0.5699999999999932],[0,0],[0,0]],"v":[[60.33,294.67],[74,297.34000000000003],[71.93,297.58000000000004],[60.150000000000006,295.02000000000004],[60.34,294.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.9137,0.9098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[67.075042131836,296.19826872918907]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[67.075042131836,296.19826872918907]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 486","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 485","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8100000000000023,-1.0900000000000034],[-0.21999999999999886,2.019999999999996],[-0.06999999999999318,-0.1700000000000017],[-0.09000000000000341,-0.6499999999999915],[-0.8200000000000074,0.20999999999999375],[-0.18000000000000682,0.12000000000000455],[-0.9599999999999937,0.5],[0,0],[0.9699999999999989,-0.060000000000002274],[-0.25,0.6899999999999977],[-0.9500000000000028,-0.3100000000000023],[0.010000000000005116,-0.6200000000000045],[0.010000000000005116,-0.030000000000001137]],"o":[[-0.25,1.2199999999999989],[-2.469999999999999,0.23999999999999488],[0.4899999999999949,-0.5600000000000023],[0.8199999999999932,0.06999999999999318],[0.21999999999999886,-0.7800000000000011],[0.10999999999999943,-0.1700000000000017],[-0.06999999999999318,-0.6099999999999994],[0,0],[0.09999999999999432,-0.7000000000000028],[-0.06999999999999318,-0.1700000000000017],[0.9399999999999977,-0.23000000000000398],[0.9500000000000028,0.3100000000000023],[0,0.2600000000000051],[0,0]],"v":[[95.67,88],[92.34,94.33],[89.67,90.5],[90,91],[91.36,92.08],[92.67,90.67],[93.34,90],[94.67,88.33],[93.98,87.95],[92.67,86.99000000000001],[92,85.99000000000001],[95.11,85.71000000000001],[95.39,87.49000000000001],[95.66,87.99000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6941,0.2784,0.2275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[92.64452017317672,89.9694003293063]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[92.64452017317672,89.9694003293063]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 487","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 486","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7900000000000063,-0.21999999999999886],[0.21999999999999886,-0.0899999999999963],[1.2099999999999937,-0.3400000000000034],[-0.6899999999999977,2.5600000000000023],[-2.9000000000000057,0.25]],"o":[[0.9099999999999966,-0.04999999999999716],[-0.09000000000000341,0.020000000000003126],[-0.7900000000000063,1.4399999999999977],[0.28000000000000114,2.3599999999999994],[1.5600000000000023,-2.0900000000000034],[0,0]],"v":[[89.33,39],[89.33,40],[88.66,40.33],[85.66,43],[84.33,43.33],[89.33,39]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9098,0.2353,0.2078]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.08431360884981,42.01088701926716]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.08431360884981,42.01088701926716]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 488","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 487","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4300000000000068,-0.3800000000000239],[-2.1500000000000057,-0.6100000000000136],[-0.29999999999998295,-0.6199999999999761],[2.740000000000009,2.490000000000009],[-0.3400000000000034,0.3300000000000125]],"o":[[-0.030000000000001137,0.75],[1.6199999999999903,1.4499999999999886],[0.75,0.21000000000000796],[-4.009999999999991,0.6200000000000045],[0.3299999999999983,-0.3199999999999932],[0,0]],"v":[[127,178.33],[127.89,179.60000000000002],[133.31,183.18000000000004],[135.66,183.66000000000003],[126,179.33],[127,178.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2392,0.2431,0.251]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[130.8300365266136,181.04348950001565]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[130.8300365266136,181.04348950001565]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 489","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 488","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7900000000000063,-2.260000000000005],[1.2800000000000011,-1.0499999999999972],[-0.12999999999999545,0.35999999999999943],[-0.3299999999999983,0.18999999999999773],[-0.6800000000000068,-0.45999999999999375]],"o":[[1.4599999999999937,-0.9300000000000068],[-1.269999999999996,1.0600000000000023],[0.09999999999999432,-0.10999999999999943],[0.15000000000000568,-0.4200000000000017],[-0.3400000000000034,-0.9500000000000028],[0,0]],"v":[[82.67,71.67],[83.67,73.67],[79.67,76.67],[80.81,73.97],[81,72.33],[82.67,71.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9647,0.9098,0.8941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[81.87878557984047,73.96716628314599]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[81.87878557984047,73.96716628314599]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 490","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 489","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.160000000000025,0.28000000000000114],[0,0],[0.5300000000000011,-0.6000000000000014],[1.1800000000000068,-0.0799999999999983],[0.7700000000000102,-0.0799999999999983],[-0.05999999999997385,0.8999999999999986],[-0.6499999999999773,-0.07000000000000028],[-0.589999999999975,-0.8999999999999986],[0.9199999999999875,-1.7800000000000011]],"o":[[-0.060000000000002274,0.29999999999999716],[0,0],[-0.6500000000000057,-0.3200000000000003],[0.5200000000000102,1.0399999999999991],[-0.6299999999999955,0.22999999999999687],[-0.6699999999999875,-0.5200000000000031],[0.46999999999999886,-0.28999999999999915],[0.6599999999999966,-0.8699999999999974],[0.12000000000000455,-1.5],[0,0]],"v":[[151,37.67],[150.67,37.67],[150.10999999999999,38.25],[148.33999999999997,38.67],[147.33999999999997,40.34],[146.00999999999996,40.67],[144.67999999999995,37.67],[146.34999999999994,37.34],[148.01999999999992,37.34],[151.01999999999992,37.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.949,0.3882,0.3608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[147.92005226395204,38.470421349293105]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[147.92005226395204,38.470421349293105]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 491","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 490","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5400000000000205,-0.17000000000001592],[1.170000000000016,-0.12000000000000455],[1.0100000000000193,0.009999999999990905],[1.9799999999999898,1.1999999999999886],[-1.329999999999984,-1.150000000000034]],"o":[[-0.060000000000002274,0.040000000000020464],[-0.4399999999999977,0.12999999999999545],[-1.0300000000000011,0.10000000000002274],[0.12999999999999545,-1.25],[1.6100000000000136,-0.2699999999999818],[0,0]],"v":[[258.33,261.67],[257.78999999999996,262.65000000000003],[253.48999999999995,262.34000000000003],[250.65999999999994,263.00000000000006],[252.98999999999995,261.00000000000006],[258.31999999999994,261.6700000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0471,0.0627,0.0627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[254.49505043846384,261.89395346897305]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[254.49505043846384,261.89395346897305]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 492","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 491","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.3400000000000034,-5.199999999999989],[-0.6299999999999955,-0.3100000000000023],[0.10999999999999943,0.14000000000001478],[0,0]],"o":[[0,0],[0.730000000000004,5.159999999999997],[0.04000000000000625,0.6699999999999875],[-0.1700000000000017,0.09999999999999432],[0,0],[0,0]],"v":[[89.33,148.67],[89.66,147.67],[90.97,163.2],[91.66,164.32999999999998],[90.66,164.99999999999997],[89.32,148.66999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9176,0.9216,0.9216]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[90.49003567116733,156.34409748001934]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[90.49003567116733,156.34409748001934]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 493","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 492","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.5600000000000023,-1.3000000000000114],[1.2399999999999949,-1.200000000000017],[0,0],[-3.6700000000000017,2.8600000000000136],[0,0]],"o":[[-1.5100000000000051,1.0999999999999943],[-1.3199999999999932,1.0999999999999943],[0,0],[3.0400000000000063,-3.6999999999999886],[0,0],[0,0]],"v":[[111,203.33],[106,207.66000000000003],[102,210.99000000000004],[101.67,210.99000000000004],[110.67,202.99000000000004],[111,203.32000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2196,0.2275,0.2314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[106.3350240565718,206.989978941404]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[106.3350240565718,206.989978941404]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 494","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 493","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.2699999999999818,0.3199999999999932],[0.5200000000000102,1.9200000000000017],[-0.6500000000000057,0.3100000000000023],[4.350000000000023,-0.1600000000000108],[1.1899999999999977,0.4900000000000091]],"o":[[0,0],[0.38999999999998636,0.010000000000005116],[1.3799999999999955,-1.6099999999999994],[-0.12000000000000455,-0.4399999999999977],[0.8300000000000125,2.489999999999995],[-1.2700000000000102,0.04999999999999716],[0,0]],"v":[[142.67,78.33],[149.19,78.67999999999999],[150.17,78.33],[149.32999999999998,69.83],[149.32999999999998,68.33],[148.83999999999997,79.37],[142.67,78.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.7569,0.5765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[146.90042362877742,73.85147129540636]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[146.90042362877742,73.85147129540636]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 495","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 494","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.23999999999998067,-0.6899999999999977],[0.30999999999997385,-0.07999999999998408],[0.589999999999975,-0.4000000000000057],[-0.799999999999983,0.3900000000000148]],"o":[[0.5600000000000023,0.8799999999999955],[0.1699999999999875,0.5099999999999909],[-0.6699999999999875,0.03999999999999204],[-0.27000000000001023,-0.37999999999999545],[0,0]],"v":[[159,168],[161.64,171.87],[160,173],[158.11,173.65],[159,168]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8431,0.851,0.8431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[159.83738242041366,170.82498971062375]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[159.83738242041366,170.82498971062375]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 496","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 495","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.240000000000002,-1.3400000000000034],[0.45999999999999375,0.5699999999999932],[0.2700000000000031,-0.18000000000000682],[0.5600000000000023,1.4300000000000068],[-0.1700000000000017,0.6699999999999875],[-0.17999999999999972,-0.28000000000000114],[-0.3500000000000014,-0.6599999999999966]],"o":[[0.509999999999998,1.1100000000000136],[-0.6000000000000014,-0.4399999999999977],[-0.25,-0.1599999999999966],[-0.9200000000000017,-1.289999999999992],[0.14999999999999858,-0.5],[1.5700000000000003,-0.8899999999999864],[0.20000000000000284,0.3100000000000023],[0,0]],"v":[[47.33,134.33],[48.33,137.66000000000003],[46.67,135.99000000000004],[45.89,136.07000000000005],[43.67,131.99000000000004],[44,129.99000000000004],[45.16,132.32000000000005],[47.339999999999996,134.33000000000004]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.5294,0.4941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[46.02357030074924,133.74142706234716]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[46.02357030074924,133.74142706234716]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 497","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 496","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.420000000000016,-0.0899999999999892],[0,0],[1.8499999999999943,0.09000000000000341],[0.17000000000001592,0.09999999999999432],[-0.020000000000010232,0.1599999999999966],[-1.3999999999999773,1.269999999999996],[-1.509999999999991,-0.3300000000000125],[-0.3400000000000034,-0.9400000000000119]],"o":[[-2.1999999999999886,-0.5400000000000063],[0,0],[-1.8499999999999943,0.14000000000000057],[-0.21999999999999886,-0.010000000000005116],[-0.05000000000001137,-0.030000000000001137],[1.740000000000009,-0.6800000000000068],[1.6899999999999977,0.09999999999999432],[1.0800000000000125,0.23999999999999488],[0,0]],"v":[[215.67,71],[208.60999999999999,70.02],[208.33999999999997,69.66],[202.79999999999998,69.8],[202.02999999999997,69.66],[201.99999999999997,69.33],[207.66999999999996,68.66],[213.76999999999995,69.06],[215.66999999999996,70.99000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3373,0.3608,0.3843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[208.8288006764785,69.82999313963151]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[208.8288006764785,69.82999313963151]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 498","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 497","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4299999999999997,-1.410000000000025],[0.12999999999999545,-0.7800000000000011],[0.259999999999998,-0.20999999999997954],[-0.8299999999999983,1.170000000000016],[-0.17999999999999972,0.06999999999999318],[-0.4100000000000037,-0.5699999999999932],[0,0],[-0.21999999999999886,-1.9699999999999989]],"o":[[-0.36999999999999744,1.4399999999999977],[-0.09000000000000341,-0.5600000000000023],[0.25,0.21999999999999886],[-1.2199999999999989,-0.4300000000000068],[0.259999999999998,-0.36000000000001364],[0.14999999999999858,-0.5799999999999983],[0,0],[-0.39000000000000057,-1.9399999999999977],[0,0]],"v":[[51,127],[50,131.33],[49.67,131.66000000000003],[49.67,132.33],[47.64,128.53],[48.34,128.33],[49.010000000000005,128],[49.830000000000005,127.65],[51.010000000000005,127]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8588,0.2588,0.2235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[49.21231325573768,129.07357967055265]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[49.21231325573768,129.07357967055265]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 499","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 498","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-4.180000000000007,-0.25],[0,0],[1.9599999999999795,0.2400000000000091],[1.5699999999999932,0.5699999999999932],[0,0],[0.7300000000000182,-0.3299999999999983],[0.15000000000000568,0.29000000000000625],[-0.7600000000000193,0.030000000000001137]],"o":[[4.1699999999999875,-0.12999999999999545],[0,0],[-1.9000000000000057,0.37000000000000455],[-1.6800000000000068,0.3499999999999943],[0,0],[-0.7400000000000091,-0.28000000000000114],[-0.06999999999999318,0.29999999999999716],[-0.5800000000000125,-0.9500000000000028],[0,0]],"v":[[194.67,68.33],[207.67,68.66],[207.79,69.13],[202,69.32],[196,68.99],[195,68.99],[192.67,68.99],[192.33999999999997,68.99],[194.67,68.32]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3686,0.3961,0.4235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[200.01597757167391,68.8768356290258]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[200.01597757167391,68.8768356290258]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 500","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 499","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8799999999999955,0.1799999999999926],[1.8299999999999983,0.1799999999999926],[1.4299999999999997,-0.35999999999999943],[-0.5200000000000031,0.37999999999999545],[-2.730000000000004,-0.5400000000000063],[-1.480000000000004,-0.7099999999999937]],"o":[[0.8100000000000023,0.45999999999999375],[-1.6200000000000045,-0.8700000000000045],[-1.5300000000000011,-0.15000000000000568],[0.04999999999999716,-0.7900000000000063],[2.6499999999999986,0.6099999999999994],[1.6500000000000057,0.3299999999999983],[0,0]],"v":[[72.67,116],[72.34,116.67],[66.13000000000001,114.71000000000001],[59.34000000000001,115.00000000000001],[60.34000000000001,113.67000000000002],[68.41000000000001,114.43000000000002],[72.67000000000002,116.00000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2706,0.2627,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[66.24890527744722,115.19241044736265]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[66.24890527744722,115.19241044736265]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 501","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 500","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-6.180000000000007,-1.4099999999999966],[0,0],[4.739999999999995,0.9699999999999989],[0.6299999999999955,0.25],[0.09999999999999432,0.020000000000010232]],"o":[[0,0],[6.3799999999999955,0.15000000000000568],[0,0],[-4.6699999999999875,-1.2299999999999898],[-0.7099999999999937,0.030000000000001137],[-0.10999999999999943,-0.020000000000010232],[0,0]],"v":[[117.33,233.67],[115.33,233.01],[134.18,236.66],[134,237],[119.67,234],[117.67,233.67],[117.34,233.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.8745,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[124.7550395161945,235.00498528875056]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[124.7550395161945,235.00498528875056]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 502","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 501","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3499999999999943,-0.3200000000000003],[0.5999999999999943,0.7199999999999989],[0.01999999999999602,1.0899999999999963],[0.769999999999996,0.2600000000000051],[1.2900000000000063,-0.13000000000000256],[-0.5799999999999983,1.2199999999999989],[-0.7399999999999949,0.6799999999999997],[-0.5700000000000074,-0.5500000000000043],[-0.6199999999999903,0],[-0.060000000000002274,0.6000000000000014],[-0.6299999999999955,0.00999999999999801],[0.480000000000004,0.3500000000000014],[0,0],[-1.2800000000000011,0.11999999999999744]],"o":[[0.4200000000000017,0.4099999999999966],[0.5100000000000051,0.8999999999999986],[-0.7099999999999937,0.7100000000000009],[-1.0100000000000051,0.4799999999999969],[0.1700000000000017,1.1700000000000017],[-0.37999999999999545,0.6000000000000014],[-0.29000000000000625,-0.4299999999999997],[-0.23999999999999488,-0.740000000000002],[0.1700000000000017,-0.6599999999999966],[0.060000000000002274,0],[0.37000000000000455,-0.5600000000000023],[0.39000000000000057,0.1700000000000017],[0,0],[1.3299999999999983,-0.020000000000003126],[0,0]],"v":[[96.67,38],[96.34,39.33],[95.01,40],[94.01,39.67],[91.34,40],[89.67,42],[88,42],[88.67,40.33],[89.34,40],[90.83,39.17],[90,39],[92,38.67],[93,38.67],[93,38.34],[96.67,38.010000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.898,0.2275,0.2039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[92.36336891264804,40.35063160036765]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[92.36336891264804,40.35063160036765]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 503","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 502","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-0.21999999999999886],[0,0],[0,-0.3299999999999983],[0,0],[-0.010000000000005116,-1.5999999999999943],[0,0],[0,-0.11000000000001364],[0,0],[-0.5699999999999932,-0.37000000000000455],[0.9500000000000028,0.21999999999999886],[0.09000000000000341,0.5100000000000193],[0.04000000000000625,0.4300000000000068],[-0.01999999999999602,0.6999999999999886],[0.6599999999999966,4.099999999999994],[-0.4200000000000017,-0.20999999999999375],[-0.0799999999999983,-0.28999999999999204]],"o":[[0.01999999999999602,0.21999999999999886],[0,0],[0,0.3299999999999983],[0,0],[0.23999999999999488,1.5],[0,0],[0,0.11000000000001364],[0,0],[0.01999999999999602,0.6299999999999955],[-0.10999999999999943,0.1699999999999875],[-0.12999999999999545,-0.37999999999999545],[0,-0.4399999999999977],[-0.23999999999999488,-0.6299999999999955],[-0.46999999999999886,-4.1299999999999955],[0.030000000000001137,-0.8700000000000045],[0.14000000000000057,-0.06999999999999318],[0,0]],"v":[[122.33,122.67],[122.33,123.34],[122.66,125.01],[122.66,126.01],[122.99,128.68],[123.32,132.68],[123.64999999999999,135.35],[123.64999999999999,135.68],[123.97999999999999,137.68],[124.30999999999999,139.68],[123.63999999999999,140.35],[123.30999999999999,139.01999999999998],[123.30999999999999,137.68999999999997],[122.97999999999999,135.68999999999997],[121.30999999999999,123.35999999999997],[121.97999999999999,122.35999999999997],[122.30999999999999,122.68999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3255,0.3255,0.3333]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[122.81001021521467,131.34554061430651]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[122.81001021521467,131.34554061430651]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 504","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 503","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.19999999999998863,-0.4200000000000159],[1.3799999999999955,-0.5199999999999818],[1.8300000000000125,-1.0500000000000114],[0.3599999999999852,0.060000000000002274],[0.030000000000001137,0.020000000000010232],[-0.3900000000000148,0.0700000000000216],[-2.7600000000000193,0.6200000000000045],[-1.2900000000000205,0.4900000000000091]],"o":[[0.4300000000000068,-0.09999999999999432],[-1.3400000000000034,0.6500000000000057],[-2.009999999999991,0.75],[-1,-0.09000000000000341],[-0.3300000000000125,-0.05000000000001137],[-0.1699999999999875,-0.13999999999998636],[2.789999999999992,-0.7199999999999989],[1.3600000000000136,-0.4199999999999875],[0,0]],"v":[[165.67,239],[166,239.33],[161.76,241.25],[155.67,243.33],[152.88,243.35000000000002],[152.67,242.66000000000003],[153,242.33],[161.33,240.33],[165.66000000000003,239]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2392,0.2431,0.2471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[159.34580063766842,241.15536069376236]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[159.34580063766842,241.15536069376236]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 505","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 504","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3900000000000148,-0.05000000000000426],[1.6699999999999875,-0.22999999999999687],[0.160000000000025,0.3200000000000003],[0.7299999999999898,-0.22999999999999687],[0.09000000000000341,0.38000000000000256],[0,0],[-1.8000000000000114,-1.490000000000002]],"o":[[-0.03999999999999204,0.04999999999999716],[-1.6899999999999977,-0.17999999999999972],[-0.25,-0.4299999999999997],[0.5699999999999932,-0.6300000000000026],[-0.2400000000000091,-0.10000000000000142],[0,0],[2.180000000000007,0.9500000000000028],[0,0]],"v":[[167.33,35.33],[167.49,36],[161.99,35.33],[161.66,33.66],[160.99,32.989999999999995],[159.99,32.81999999999999],[161.99,31.64999999999999],[167.32000000000002,35.31999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9255,0.502,0.4627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[163.80697946039598,33.82499639254186]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[163.80697946039598,33.82499639254186]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 506","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 505","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.1700000000000017,0.7800000000000011],[-1.2000000000000028,0.1799999999999926],[-0.09000000000000341,-1.0799999999999983],[0,0],[0.12000000000000455,0.07000000000000739],[0.480000000000004,0.1700000000000017]],"o":[[0.10999999999999943,-0.7800000000000011],[1.1899999999999977,0.480000000000004],[0.06999999999999318,1.0900000000000034],[0,0],[0.5400000000000063,0.6599999999999966],[-0.09000000000000341,-0.04999999999999716],[0,0]],"v":[[99.33,78.67],[99.67,76.33],[103.32000000000001,76],[103.32000000000001,79.33],[102.66000000000001,78.85],[100.68,80.30999999999999],[99.32000000000001,78.65999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7882,0.5333,0.3882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[101.32917811220838,78.15697691398566]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[101.32917811220838,78.15697691398566]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 507","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 506","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-3.2499999999999716,-0.5500000000000114],[-2.609999999999985,-0.660000000000025],[0.06999999999999318,-0.3300000000000409],[2.920000000000016,0.4800000000000182],[3.480000000000018,0.8500000000000227],[0.710000000000008,-0.23999999999995225],[0,0]],"o":[[3.1899999999999977,0.7599999999999909],[2.9799999999999898,0.5],[0.2599999999999909,0.06999999999999318],[-2.9399999999999977,0.22000000000002728],[-3.6500000000000057,-0.6000000000000227],[-0.1599999999999966,-0.040000000000020464],[0,0],[0,0]],"v":[[215.67,309.67],[225.27999999999997,311.90000000000003],[234.66999999999996,313.01000000000005],[235.99999999999997,313.6700000000001],[227.25999999999996,312.9100000000001],[215.82999999999996,310.6000000000001],[214.83999999999995,310.00000000000006],[215.65999999999994,309.6700000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.898,0.8941]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[225.4216016536042,311.696699620996]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[225.4216016536042,311.696699620996]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 508","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 507","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5300000000000011,-0.6700000000000017],[0.240000000000002,-0.12000000000000455],[-1.2199999999999989,-1.4399999999999977],[0.28000000000000114,-0.21999999999999886],[0.3500000000000014,0.8499999999999943],[0.2600000000000051,0.18000000000000682],[0.7800000000000011,-0.2400000000000091],[-0.7199999999999989,-1.5700000000000216],[-0.22999999999999687,1.460000000000008],[0,0],[-0.25,1.2399999999999949],[-0.5799999999999983,-0.39000000000000057]],"o":[[0.35999999999999943,0.8900000000000006],[0.240000000000002,0.09999999999999432],[-0.3400000000000034,1.2299999999999898],[0.2700000000000031,0.21000000000000796],[-0.10999999999999943,0.8799999999999955],[-0.22999999999999687,-0.3300000000000125],[-0.28999999999999915,-0.19999999999998863],[0.1700000000000017,1.6500000000000057],[-1.5200000000000031,0.27000000000001023],[0,0],[0.3200000000000003,-1.259999999999991],[0.490000000000002,-0.4099999999999966],[0,0]],"v":[[47,125.67],[48.33,128],[48.33,128.33],[49.66,132.33],[49.66,133],[48.66,133],[46.38999999999999,130.38],[45.32999999999999,130.01],[47.32999999999999,134.34],[44.44999999999999,130.6],[43.98999999999999,130.01],[44.98999999999999,126.00999999999999],[46.98999999999999,125.67999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8784,0.3843,0.3529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[46.928150844889814,129.93038938104587]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[46.928150844889814,129.93038938104587]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 509","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 508","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3999999999999986,-1.1500000000000057],[0.3299999999999983,-0.7399999999999949],[0.9600000000000009,1.1299999999999955],[-0.3100000000000023,0.5900000000000034],[-0.6499999999999986,0.6200000000000045],[0.030000000000001137,0.5799999999999983],[-1.1099999999999994,-1],[-0.4799999999999969,-0.269999999999996],[-0.15000000000000568,0.12000000000000455],[-0.15000000000000568,0.3100000000000023],[-0.10999999999999943,0.1600000000000108],[0.18999999999999773,-0.7800000000000011]],"o":[[-0.5499999999999972,1.1099999999999994],[-0.10999999999999943,-0.0799999999999983],[-0.7299999999999969,0.9599999999999937],[-0.45000000000000284,0.46999999999999886],[-0.8599999999999994,0.1700000000000017],[0.13000000000000256,-0.5400000000000063],[-0.28000000000000114,-1.4000000000000057],[0.22999999999999687,-0.46999999999999886],[0.07000000000000028,-0.060000000000002274],[0.03999999999999915,-0.030000000000001137],[0.25,-0.5100000000000051],[0.7800000000000011,-0.3299999999999983],[0,0]],"v":[[53.33,120.67],[51.66,124.34],[50.989999999999995,125.34],[48.66,125.67],[48.33,125.34],[48,124.67],[48.33,123],[50.28,121.9],[51.33,121.67],[51.96,121.64],[51.910000000000004,120.76],[52.660000000000004,120],[53.330000000000005,120.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8627,0.2235,0.1922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[50.50148881976742,123.08516729611938]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[50.50148881976742,123.08516729611938]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 510","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 509","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.10999999999999943,-0.4300000000000068],[-0.030000000000001137,-1.6299999999999955],[-0.29999999999999716,-0.38000000000000966],[-0.0799999999999983,-0.75],[0.5400000000000063,-0.45000000000000284],[0.5600000000000023,-0.010000000000005116],[0.09000000000000341,0.37999999999999545],[-0.5900000000000034,0.45000000000000284],[0,0],[-0.25,0.5999999999999943],[-1.1200000000000045,-0.09000000000000341],[0,0],[-0.6800000000000068,1.0300000000000011]],"o":[[0.5600000000000023,0.01999999999999602],[-0.8599999999999994,0.7000000000000028],[0.010000000000005116,0.5999999999999943],[-0.29999999999999716,0.5900000000000034],[-0.5499999999999972,0.45000000000000284],[-0.3299999999999983,0.20999999999999375],[-0.5699999999999932,0.37999999999999545],[-0.7800000000000011,-0.010000000000005116],[0,0],[0.0799999999999983,-0.18999999999999773],[0.4200000000000017,-0.5100000000000051],[0,0],[1.0499999999999972,-0.7199999999999989],[0,0]],"v":[[73,76],[74,76.67],[72.39,79.25],[73.33,80.34],[73,82.34],[71.33,83.67],[70,84],[69,84],[68.93,82.92],[68.66000000000001,82],[68.99000000000001,80.67],[71.30000000000001,80.04],[71.32000000000001,77.67],[72.99000000000001,76]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.3137,0.2902]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[71.22557120425773,79.99998562835734]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[71.22557120425773,79.99998562835734]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 511","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 510","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0.28999999999999204,-0.5400000000000063],[0.5,-0.4299999999999926],[0.4399999999999977,-0.37000000000000455],[-0.9500000000000028,0.8700000000000045],[-2.0400000000000063,-0.060000000000002274],[0.01999999999999602,-1.8100000000000023]],"o":[[0,0],[0,0],[0.1700000000000017,0.7600000000000051],[0.04999999999999716,0.45000000000000284],[-0.28000000000000114,0.23000000000000398],[-1.0900000000000034,0.6700000000000017],[-2.0400000000000063,-0.20999999999999375],[-0.7399999999999949,-1.0300000000000011],[0,0]],"v":[[75.33,76],[75.5,77.67],[76.66,77.33],[76,79],[75.33,80.33],[74.33,81.33],[73.33,80.33],[74,76.66],[75.33,75.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8941,0.2471,0.2196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[74.39347413306754,78.35434012274828]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[74.39347413306754,78.35434012274828]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 512","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 511","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.29999999999998295,-0.020000000000003126],[-0.29999999999998295,-0.5900000000000034],[0.18999999999999773,-0.3299999999999983],[0.030000000000001137,-0.12999999999999545],[0,0],[-0.37000000000000455,-0.21999999999999886],[-0.0800000000000125,0.269999999999996],[0.3499999999999943,-1.3400000000000034],[1.7800000000000011,-1.9699999999999989],[-0.18000000000000682,2.6599999999999966],[-0.05000000000001137,1.1099999999999994],[0.28999999999999204,0.9400000000000048]],"o":[[0.020000000000010232,-0.22999999999999687],[0.4099999999999966,0.7299999999999969],[0.29999999999998295,0.5900000000000034],[-0.15000000000000568,0.2700000000000031],[0,0],[-0.13999999999998636,0.46000000000000085],[0.13999999999998636,0.0799999999999983],[0.4199999999999875,-0.759999999999998],[-1.4699999999999989,2.25],[-0.0800000000000125,-2.6700000000000017],[0.060000000000002274,-0.8400000000000034],[0.28999999999999204,-0.8400000000000034],[0,0]],"v":[[163,40.67],[163.16,40.010000000000005],[165.32999999999998,41.18000000000001],[164.51999999999998,42.010000000000005],[163.32999999999998,44.34],[163.89,46.52],[163.85,50.06],[165.84,47.830000000000005],[167,47.68000000000001],[162.34,54.35000000000001],[162.67000000000002,46.35000000000001],[163.00000000000003,43.35000000000001],[163.00000000000003,40.68000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7725,0.3647,0.298]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[164.69597477005917,47.179661363139104]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[164.69597477005917,47.179661363139104]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 513","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 512","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.45000000000000284,-0.710000000000008],[0.6200000000000045,-1.289999999999992],[-0.14999999999999858,-2.6499999999999773],[1.1499999999999986,0.13999999999998636],[-1.4200000000000017,4.849999999999994]],"o":[[0.9500000000000028,-0.1699999999999875],[0.10999999999999943,1.1399999999999864],[-1.1599999999999966,2.4099999999999966],[0.030000000000001137,0.5699999999999932],[-0.6599999999999966,-4.969999999999999],[0,0]],"v":[[41.33,137.67],[43,140],[41.73,141.25],[40.769999999999996,150.73],[40.339999999999996,151.66],[41.339999999999996,137.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.7961,0.7686]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[41.50034910782216,144.67123456474798]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.50034910782216,144.67123456474798]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 514","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 513","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.8499999999999943,-0.6599999999999682],[-0.6000000000000227,0.18000000000000682],[0.10000000000002274,-0.1099999999999568],[1.8400000000000034,-0.13999999999998636],[2.5100000000000193,1.5199999999999818],[-0.8799999999999955,-0.160000000000025]],"o":[[1.9099999999999966,0.36000000000001364],[0.4000000000000057,0.13999999999998636],[-0.15000000000000568,0.9599999999999795],[-0.30000000000001137,0.3199999999999932],[-2.6899999999999977,-1.2099999999999795],[-0.21000000000000796,-0.37999999999999545],[0,0]],"v":[[245.67,286],[251.33999999999997,287.33],[252.67,287.66999999999996],[251.33999999999997,287.99999999999994],[252.00999999999996,290.3299999999999],[244.67999999999995,286.3299999999999],[245.67999999999995,285.99999999999994]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.9294,0.9255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[248.64443701458904,288.1294365494138]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[248.64443701458904,288.1294365494138]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 515","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 514","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-2.5800000000000125,-4.140000000000001],[-0.27000000000001023,-0.6899999999999977],[0.75,0.7299999999999898],[0.6400000000000148,4.530000000000001],[-0.37999999999999545,0.8299999999999983]],"o":[[-0.710000000000008,6.510000000000005],[0.5500000000000114,0.8799999999999955],[-0.9099999999999966,-0.6299999999999955],[-2.7299999999999898,-2.6599999999999966],[-0.21000000000000796,-1.4599999999999937],[0,0]],"v":[[191.67,91.67],[202.60999999999999,103.22],[203.32999999999998,105.33],[201.13,102.7],[191.07,93.74000000000001],[191.67,91.66000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1608,0.1804,0.1882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[197.1724186988155,98.4949913445493]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[197.1724186988155,98.4949913445493]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 516","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 515","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4399999999999977,-0.14999999999997726],[1.6899999999999977,-0.8100000000000023],[1.9899999999999807,-0.8000000000000114],[-0.8100000000000023,0.37000000000000455],[-2.4499999999999886,-0.19999999999998863]],"o":[[-0.09999999999999432,0.6100000000000136],[-1.6999999999999886,0.5699999999999932],[-1.9300000000000068,0.9200000000000159],[-0.9300000000000068,-1.0199999999999818],[2.219999999999999,-1.0199999999999818],[0,0]],"v":[[232.67,278.67],[231.54999999999998,279.38],[226.54999999999998,281.04],[221.01,284.33000000000004],[225.54999999999998,280.04],[232.67999999999998,278.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1765,0.1922,0.2078]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[226.7839462111705,281.47967679216106]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[226.7839462111705,281.47967679216106]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 517","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 516","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[-0.7299999999999898,0.39999999999997726],[-1.5500000000000114,-0.2899999999999636],[0,0],[2.5800000000000125,1.160000000000025],[0,0],[-1.3199999999999932,0.5999999999999659],[0.12999999999999545,1.1999999999999886],[-1.4799999999999898,-0.30000000000001137]],"o":[[0,0],[0,0],[0,0],[0.46000000000000796,1.079999999999984],[-0.5099999999999909,1.6299999999999955],[0,0],[-2.530000000000001,-0.7300000000000182],[0,0],[-0.789999999999992,-0.25],[0.6399999999999864,-0.29000000000002046],[1.6200000000000045,-0.160000000000025],[0,0]],"v":[[256,288.33],[254.67,289.15999999999997],[255.98999999999998,289.65999999999997],[255.32999999999998,289.98999999999995],[256.65999999999997,289.98999999999995],[258.21,291.94999999999993],[258,292.3299999999999],[252,290.3299999999999],[252.09,289.7099999999999],[251.47,287.69999999999993],[251.34,287.3399999999999],[256.01,288.3399999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8824,0.8824,0.8745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[254.5392384595876,289.82512200326846]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[254.5392384595876,289.82512200326846]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 518","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 517","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[2.1299999999999955,-0.8100000000000023],[0.5,0.6899999999999977],[-1.009999999999991,0.3599999999999568],[-2.5600000000000023,-0.7799999999999727]],"o":[[0,0],[-2.3400000000000034,0.5600000000000023],[-0.5999999999999943,0.2300000000000182],[-0.18000000000000682,-1],[2.3700000000000045,-0.8500000000000227],[0,0]],"v":[[239,283.67],[233.59,285.08000000000004],[227.16,288.33000000000004],[226,288.16],[232.16,284.33000000000004],[239,283.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1647,0.1804,0.1961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[232.49781562372968,285.9484591392442]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[232.49781562372968,285.9484591392442]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 519","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 518","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.7199999999999704,0.7199999999999704],[-0.7300000000000182,0.39999999999997726],[-1.5299999999999727,-1.1200000000000045]],"o":[[0,0],[-0.9399999999999977,0.3299999999999841],[-0.9300000000000068,-0.9300000000000068],[1.509999999999991,-0.8299999999999841],[0,0]],"v":[[278.33,268.67],[274.35999999999996,270.86],[268.66999999999996,274.33000000000004],[273.83,269.32000000000005],[278.34,268.6700000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1647,0.1804,0.1961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[273.45095512903947,271.2877495289855]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[273.45095512903947,271.2877495289855]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 520","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 519","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.700000000000017,-0.2599999999999909],[3.240000000000009,-1.2699999999999818],[-0.9199999999999875,0.5199999999999818],[-0.7099999999999795,0.14999999999997726],[-1.1199999999999761,0.4500000000000455]],"o":[[0.0800000000000125,1.3700000000000045],[-3.240000000000009,1.25],[0.7400000000000091,-0.8199999999999932],[0.27000000000001023,-0.14999999999997726],[1.0800000000000125,-0.22000000000002728],[0,0]],"v":[[241.33,285],[239.25,286.08],[229.66,290.32],[231.89,287.05],[237.89999999999998,285.40000000000003],[241.31999999999996,284.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0902,0.1098,0.1176]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[235.4966297059419,287.6549726487256]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[235.4966297059419,287.6549726487256]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 521","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 520","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.29000000000002046,-0.2300000000000182],[1.07000000000005,-0.6899999999999977],[1.1499999999999773,-0.5399999999999636],[-1.009999999999991,0.9200000000000159],[-0.8199999999999932,-1.25]],"o":[[0.12999999999999545,0.19999999999998863],[-0.6999999999999886,0.5500000000000114],[-1.07000000000005,0.6899999999999977],[-0.060000000000002274,-1.2799999999999727],[0.9300000000000068,-0.839999999999975],[0,0]],"v":[[280.98,270.36],[280.8,271.36],[276.7,273.53000000000003],[273.67,275.67],[274.67,272.18],[280.97,270.36]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0863,0.102,0.1098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[277.35490708178486,272.828896335991]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[277.35490708178486,272.828896335991]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 522","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 521","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.27000000000001023,-0.5700000000000003],[0.4200000000000159,-0.6700000000000017],[0.799999999999983,-0.480000000000004],[0.700000000000017,-0.22999999999999687],[0.3699999999999761,0.5300000000000011],[-1.4499999999999886,0.35999999999999943],[-0.21000000000000796,0.5],[0,0],[-0.7099999999999795,0.3099999999999987],[-0.6299999999999955,-0.28000000000000114]],"o":[[0,0],[-1.009999999999991,0.020000000000003126],[0.5900000000000034,-0.490000000000002],[1.0200000000000102,-0.030000000000001137],[-0.5300000000000011,0.07000000000000028],[-0.75,-0.14000000000000057],[-0.8100000000000023,-0.6300000000000026],[0.6800000000000068,0.28000000000000114],[0,0],[0.7599999999999909,-0.05999999999999872],[0.8000000000000114,0.17999999999999972],[0,0]],"v":[[162,31.67],[162.1,32.13],[161,33.010000000000005],[161.67,33.68000000000001],[162,35.35000000000001],[158.67,36.35000000000001],[157,35.35000000000001],[156.67,32.35000000000001],[158,32.02000000000001],[158.13,31.58000000000001],[160.32999999999998,31.02000000000001],[161.99999999999997,31.690000000000012]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.3529,0.3216]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[159.0118626059594,33.684988040927095]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[159.0118626059594,33.684988040927095]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 523","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 522","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.2299999999999898,-1.1100000000000136],[1.829999999999984,-0.339999999999975],[-3.5500000000000114,-3.2799999999999727]],"o":[[-2.5200000000000102,-0.08999999999997499],[-1.7199999999999989,0.8600000000000136],[2.030000000000001,-3.4499999999999886],[0,0]],"v":[[227.67,275],[220.32,276.82],[215.34,279.65999999999997],[227.67000000000002,274.98999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1725,0.1882,0.2039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[221.5050302389703,276.7551413444384]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[221.5050302389703,276.7551413444384]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 524","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 523","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[3.6299999999999955,-1.4399999999999977],[-2.740000000000009,-0.9700000000000273],[0.0999999999999659,-0.46999999999997044]],"o":[[-4.300000000000011,-0.5400000000000205],[0.17000000000001592,-3.3899999999999864],[0.4399999999999977,0.160000000000025],[0,0]],"v":[[273,266],[262.01,271],[272.45,265.06],[273,266]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1608,0.1725,0.1882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[267.51726026364656,267.9482298802976]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[267.51726026364656,267.9482298802976]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 525","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 524","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.009999999999991,-0.7899999999999636],[0.8100000000000023,-0.2599999999999909],[-0.06999999999999318,-0.03000000000002956],[-0.7599999999999909,-0.8100000000000023],[-0.06999999999999318,-0.6700000000000159],[0,0],[0.9499999999999886,-0.339999999999975],[1.160000000000025,-0.10000000000002274],[-2.509999999999991,-0.07999999999998408],[0,0],[-1.0600000000000023,0.40999999999996817]],"o":[[0.37000000000000455,0.12000000000000455],[-0.7300000000000182,0.5699999999999932],[0.5500000000000114,0.06999999999999318],[0.18999999999999773,0.060000000000002274],[0.160000000000025,0.6399999999999864],[0,0],[-0.9599999999999795,0.4300000000000068],[-1.2900000000000205,0.339999999999975],[-0.4800000000000182,-1.670000000000016],[0,0],[1.0500000000000114,-0.3299999999999841],[0,0]],"v":[[300.67,288],[300.91,288.4],[298.67,289.83],[299.72,290.94],[301.33000000000004,291.34],[300.67,292],[302.67,292],[300,293],[296.33,293.67],[297.21,289.72],[296.98999999999995,289.34000000000003],[300.65999999999997,288.01000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4549,0.4706,0.4824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[299.1583117389948,290.80858413646916]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[299.1583117389948,290.80858413646916]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 526","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 525","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.8299999999999983,-1.6299999999999955],[0.3999999999999915,0.3999999999999915],[0,0],[0.4300000000000068,-0.35999999999999943],[-0.18000000000000682,0.5700000000000074],[-0.9500000000000028,0.6899999999999977],[0,0],[-1.4500000000000028,-0.030000000000001137],[-0.8799999999999955,-0.35999999999999943],[-0.8700000000000045,-0.21999999999999886],[0.6099999999999994,-0.8599999999999994]],"o":[[0.9399999999999977,1.2600000000000051],[-0.6700000000000017,0.6299999999999955],[0,0],[-0.269999999999996,0.21999999999999886],[-0.6500000000000057,0.37999999999999545],[-1.4000000000000057,-1.3100000000000023],[0,0],[-0.45000000000000284,-1.0699999999999932],[0.01999999999999602,-0.9599999999999937],[-0.23000000000000398,-1.2900000000000063],[0.8299999999999983,-0.6599999999999966],[0,0]],"v":[[81,72.33],[79.67,76.66],[78.07000000000001,77],[77.33000000000001,78.66],[76.33000000000001,79.66],[76.00000000000001,78.99],[75.33000000000001,75.99],[75.83000000000001,75.67999999999999],[76.66000000000001,73.33],[77.99000000000001,72.33],[80.32000000000001,71.66],[80.99000000000001,72.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.3059,0.2863]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[78.11597653600904,75.57246533883705]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[78.11597653600904,75.57246533883705]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 527","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 526","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.9500000000000028,-1.210000000000008],[-0.5,-1.0999999999999943],[0.00999999999999801,-0.3200000000000216],[0.14000000000000057,-0.1799999999999784],[-0.21999999999999886,-0.2400000000000091],[0,0],[0,-0.12999999999999545],[0,-0.5300000000000011],[-1.7299999999999969,0.15000000000000568],[-1.4500000000000028,-0.6399999999999864],[0.17999999999999972,1.3899999999999864],[-0.46999999999999886,3.1999999999999886],[-1.4500000000000028,-0.07999999999998408],[-0.37999999999999545,-0.5500000000000114]],"o":[[0.1599999999999966,1.4099999999999966],[-0.7199999999999989,0.9099999999999966],[0.14000000000000057,0.3100000000000023],[-0.00999999999999801,0.3200000000000216],[-0.10000000000000142,0.12999999999999545],[0,0],[0.4399999999999977,0.8799999999999955],[0,0.30000000000001137],[0,0.9099999999999966],[0.030000000000001137,0.9499999999999886],[-1.9699999999999989,0.37000000000000455],[-0.10999999999999943,-3.210000000000008],[0.46999999999999886,-1.6899999999999977],[0.35999999999999943,0.5699999999999932],[0,0]],"v":[[44.33,142],[42.3,142.81],[41.739999999999995,147.5],[42.33,147.83],[41.72,148.06],[41.66,151.33],[42.31999999999999,150.99],[41.64999999999999,152.18],[41.96999999999999,153.46],[42.65999999999999,154.66],[42.65999999999999,156.66],[40.32999999999999,151.66],[40.85999999999999,142.05],[42.99999999999999,139.99],[44.32999999999999,141.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9333,0.7412,0.7098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[42.32093260279947,148.33266991867697]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[42.32093260279947,148.33266991867697]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 528","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 527","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.25,0.05000000000001137],[0.7599999999999909,0.160000000000025],[-2.1200000000000045,0.4000000000000341],[-0.44999999999998863,-2.240000000000009]],"o":[[-2.5200000000000102,-0.8700000000000045],[-0.12999999999999545,0],[1.759999999999991,-2.009999999999991],[1.3700000000000045,-0.2599999999999909],[0,0]],"v":[[230.33,277.66],[220.84,281.67],[219.34,279.5],[225.42000000000002,277.59],[230.33,277.66999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0902,0.1059,0.1137]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[224.83505543447077,279.1305659520668]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[224.83505543447077,279.1305659520668]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 529","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 528","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.38000000000000966,-0.060000000000002274],[0.09999999999999432,-0.10999999999999943],[0.7299999999999898,-0.3299999999999983],[0.29999999999999716,-0.5100000000000051],[0.4899999999999949,0.75],[-0.7400000000000091,-0.21999999999999886],[-0.2600000000000051,-0.6800000000000068]],"o":[[-0.5499999999999972,0.18000000000000682],[-0.5300000000000011,0.09000000000000341],[-0.060000000000002274,0.06999999999999318],[-0.5100000000000051,0.23000000000000398],[-0.5300000000000011,-0.7199999999999989],[0.75,-0.7399999999999949],[0.5900000000000034,0.18000000000000682],[0,0]],"v":[[98,68],[97.49,69.34],[95.66,69],[94.89,70.55],[93.32000000000001,71],[91.71000000000001,68.83],[96.44000000000001,65.02],[97.98000000000002,68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8039,0.5412,0.3882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[94.85503588215161,68.00471934725144]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[94.85503588215161,68.00471934725144]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 530","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 529","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8400000000000318,-0.339999999999975],[-1.2800000000000011,1.6999999999999886],[-0.7599999999999909,0.38999999999998636],[-0.20999999999997954,-0.020000000000038654],[-0.2899999999999636,-0.589999999999975],[0.7899999999999636,-0.06999999999999318],[-0.21000000000003638,-0.14999999999997726],[-0.049999999999954525,-0.12000000000000455]],"o":[[-0.7799999999999727,0.6899999999999977],[-3.1299999999999955,1.2900000000000205],[0.4900000000000091,-0.6499999999999773],[0.2599999999999909,-0.12999999999999545],[0.6299999999999955,0.060000000000002274],[-0.7799999999999727,0.12999999999999545],[-0.8999999999999773,-0.29000000000002046],[0.08999999999997499,0.06999999999999318],[0,0]],"v":[[260.33,264],[257.53999999999996,267.02],[256.48999999999995,264.65],[260.69999999999993,261.19],[264.7799999999999,259.73],[266.6699999999999,261.32],[264.3399999999999,261.65999999999997],[260.12999999999994,263.68999999999994],[260.3399999999999,263.98999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0627,0.0784,0.0824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[261.01501285979384,263.58348842799563]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[261.01501285979384,263.58348842799563]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 531","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 530","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.21999999999997044,-0.6700000000000159],[0.3299999999999841,-0.01999999999998181],[0,0],[0.12999999999999545,-0.11000000000001364],[-0.040000000000020464,-0.18000000000000682],[0.28000000000002956,-0.5099999999999909],[0.29000000000002046,-0.12000000000000455],[0.17000000000001592,0.029999999999972715],[0,0],[0,0],[-0.07999999999998408,-0.060000000000002274],[1.25,0.2699999999999818],[0.11000000000001364,0.08999999999997499],[-0.7400000000000091,-0.040000000000020464],[0,0],[-1.339999999999975,-0.19999999999998863]],"o":[[0.6399999999999864,-0.160000000000025],[-0.3299999999999841,0.01999999999998181],[0,0],[-0.14999999999997726,0.14999999999997726],[-0.6200000000000045,0.5500000000000114],[0.12000000000000455,0.5699999999999932],[0.29000000000002046,0.08999999999997499],[-0.5099999999999909,-0.06999999999999318],[0,0],[0,0],[1.329999999999984,-1.5500000000000114],[0.37000000000000455,0.30000000000001137],[-0.30000000000001137,-0.06999999999999318],[-0.19999999999998863,-0.160000000000025],[0,0],[0.160000000000025,-1.5699999999999932],[0,0]],"v":[[269.33,291],[271.65999999999997,291.67],[270.65999999999997,291.67],[270.98999999999995,292.67],[269.98999999999995,292.34000000000003],[270.66999999999996,293.22],[270.31999999999994,295],[270.31999999999994,295.33],[269.31999999999994,295],[269.48999999999995,294.67],[263.31999999999994,293.33000000000004],[264.6599999999999,293.33000000000004],[264.4399999999999,292.08000000000004],[263.3199999999999,292.33000000000004],[263.64999999999986,290.99000000000007],[263.97999999999985,291.6500000000001],[269.3199999999998,290.99000000000007]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.702,0.702,0.7059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[267.3955242559018,292.99304483659233]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[267.3955242559018,292.99304483659233]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 532","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 531","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.13999999999999346,1.6200000000000045],[-0.4299999999999997,-0.160000000000025],[0.45000000000000284,-0.3299999999999841],[-0.28000000000000114,-0.5600000000000023],[0,0],[1.0200000000000031,0.46999999999999886],[-0.4399999999999977,0.9300000000000068],[-1.769999999999996,-1.3700000000000045],[-0.020000000000003126,1.1299999999999955]],"o":[[-1.0200000000000031,-1.25],[-0.060000000000002274,-0.7199999999999989],[0.20000000000000284,0.06999999999999318],[0.38000000000000256,0.11000000000001364],[0,0],[0.0799999999999983,-1.0300000000000011],[-1.0399999999999991,0.060000000000002274],[-0.5900000000000034,-1.1599999999999966],[0.4200000000000017,0.020000000000010232],[0,0]],"v":[[47.33,134.33],[44.85,129.75],[46.57,129.61],[48.66,133],[49.66,134],[48.989999999999995,144.67],[48.31999999999999,141],[46.31999999999999,138],[46.64999999999999,136],[47.31999999999999,134.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8235,0.2588,0.2196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[47.25406735744883,137.00610573832085]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[47.25406735744883,137.00610573832085]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 533","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 532","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3299999999999983,-1.3299999999999983],[-0.3100000000000023,-0.5799999999999983],[1.3299999999999983,-0.7000000000000028],[0.269999999999996,-0.6200000000000045],[1.3499999999999943,-0.7600000000000051],[-0.9099999999999966,0],[-0.14999999999999147,-0.04000000000000625],[-0.8199999999999932,-0.030000000000001137],[0.4899999999999949,0.22999999999998977],[-0.6500000000000057,-0.030000000000001137],[-0.4899999999999949,0.2400000000000091],[0,0],[-0.6599999999999966,0.6300000000000097]],"o":[[1.3799999999999955,-0.7600000000000051],[0.6099999999999994,-0.6099999999999994],[-1.3299999999999983,0.7600000000000051],[-0.8400000000000034,0.04999999999999716],[-1.3900000000000006,0.75],[-0.9599999999999937,-0.14000000000000057],[0.06999999999999318,-0.2600000000000051],[0.6599999999999966,-0.4899999999999949],[0.10999999999999943,-0.37999999999999545],[0.12999999999999545,-0.46999999999999886],[0.060000000000002274,-0.6500000000000057],[0,0],[0.5400000000000063,0.29000000000000625],[0,0]],"v":[[71,101.67],[73.67,103.34],[75,104.01],[71,106.01],[69.33,107.01],[65,109.01],[65.33,107.34],[65.66,107.01],[67.99,106.34],[66.99,105.68],[68.16,105.02000000000001],[68.99,103.68],[69.17999999999999,102.19000000000001],[70.99,101.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8275,0.1961,0.1608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[69.71959567352513,105.21544198334314]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[69.71959567352513,105.21544198334314]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 534","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 533","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.01999999999999602,-0.1599999999999966],[0.5400000000000063,0.45999999999999375],[0.3100000000000023,0.8400000000000034],[-0.9000000000000057,0.8400000000000034],[-0.5300000000000011,0.4399999999999977],[0.23000000000000398,0.7000000000000028],[-0.7399999999999949,0.6299999999999955],[0.6999999999999886,-2.0600000000000023],[0.7200000000000131,-0.06999999999999318]],"o":[[0.0799999999999983,0.15000000000000568],[0.030000000000001137,0.2600000000000051],[-0.12999999999999545,0.9500000000000028],[-0.6599999999999966,-0.269999999999996],[0.6200000000000045,-0.5300000000000011],[1.1200000000000045,-0.18999999999999773],[0.8499999999999943,-0.730000000000004],[1.9699999999999989,-1.0799999999999983],[0.5300000000000011,0.5400000000000063],[0,0]],"v":[[78.67,83.67],[78.84,84.13],[75,87.33],[74,87.33],[72.67,85],[74.34,83.67],[75.67,82.34],[78.34,80.34],[80.21000000000001,81.92],[78.67,83.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8706,0.2353,0.2039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[76.44491296599679,83.90677397435047]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[76.44491296599679,83.90677397435047]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 535","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 534","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.44999999999998863,-0.060000000000002274],[1.1299999999999955,-0.3100000000000023],[2.3300000000000125,-1.2199999999999704],[-0.3400000000000034,0.5699999999999932],[-0.45999999999997954,0.1400000000000432],[-1.1500000000000057,-0.1500000000000341],[-0.10999999999998522,-0.0999999999999659]],"o":[[0.5300000000000011,0.5099999999999909],[-1.0800000000000125,0.160000000000025],[-2.6100000000000136,0.7200000000000273],[0.3199999999999932,-0.8500000000000227],[0.12000000000000455,-0.20999999999997954],[1.1299999999999955,-0.339999999999975],[0.28999999999999204,0.040000000000020464],[0,0]],"v":[[236.67,281.67],[236.17,282.32],[232.94,282.76],[226.01,286.33],[225.38,283.38],[229.67,281.15999999999997],[233.85,280.65],[236.67,281.66999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0863,0.102,0.1098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[231.10195186455408,283.4709840882367]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[231.10195186455408,283.4709840882367]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 536","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 535","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.839999999999975,-0.3299999999999841],[-0.08999999999997499,-0.38999999999998636],[-0.5699999999999932,0.4300000000000068],[-0.22000000000002728,-0.38999999999998636],[0.05000000000001137,-0.08999999999997499],[0.160000000000025,-0.2300000000000182],[0.2899999999999636,-0.15999999999996817],[-0.08000000000004093,-0.5699999999999932],[-1.5399999999999636,-0.05000000000001137],[-1.9399999999999977,0.07999999999998408],[-0.3299999999999841,-0.8100000000000023],[0,0],[4.659999999999968,1.0199999999999818],[4.520000000000039,0.12000000000000455],[0,0],[-0.25,0.6099999999999568],[-1.75,-0.5299999999999727]],"o":[[0.660000000000025,-0.589999999999975],[0.5699999999999932,-0.17000000000001592],[0.10000000000002274,0.4300000000000068],[0.19999999999998863,-0.39999999999997726],[-0.4800000000000182,0.4700000000000273],[-0.060000000000002274,0.11000000000001364],[-0.14999999999997726,0.20999999999997954],[-0.38999999999998636,0.2300000000000182],[1.5500000000000114,-0.12999999999999545],[1.8100000000000023,0.05000000000001137],[1.009999999999991,-0.8100000000000023],[0,0],[-4.7099999999999795,0.4900000000000091],[2.6499999999999773,-0.19999999999998863],[0,0],[-0.4399999999999977,-0.2400000000000091],[-1.75,-1.3600000000000136],[0,0]],"v":[[271.67,291.67],[274.67,291.67],[275.67,292],[276.67,292],[277.34000000000003,292],[277.27000000000004,293.96],[276.55,294.33],[276.35,295.16999999999996],[275.33000000000004,295.66999999999996],[279.98,295.83],[285.66,295.68],[287.66,295.68],[287.66,296.01],[273.33000000000004,295.68],[270.53000000000003,295.2],[270.33000000000004,295.01],[270.04,293.73],[271.66,291.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6588,0.6588,0.6627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[278.4736601967777,293.8652805454508]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[278.4736601967777,293.8652805454508]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 537","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 536","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.18999999999999773,-0.19999999999998863],[0.37000000000000455,-0.6299999999999955],[-0.5300000000000011,-1.5],[-0.30000000000000426,0.5100000000000193],[-0.05000000000000426,-0.23999999999998067],[0.10999999999999943,-1.2699999999999818],[0.17999999999999972,-0.6799999999999784],[0.5900000000000034,0.700000000000017],[0.4099999999999966,0.5900000000000034],[-0.46000000000000085,0.9199999999999875],[0.28000000000000114,1.5200000000000102],[-0.23999999999999488,0.8400000000000034]],"o":[[0.22999999999999687,0.12999999999999545],[0.490000000000002,0.5300000000000011],[1.5700000000000003,0.020000000000010232],[0.10000000000000142,-0.09000000000000341],[0.20000000000000284,-0.30000000000001137],[0.2700000000000031,1.259999999999991],[-0.060000000000002274,0.7700000000000102],[-0.8500000000000014,-0.28000000000000114],[-0.35999999999999943,-0.4300000000000068],[-1.2199999999999989,0.15000000000000568],[-0.8299999999999983,-0.030000000000001137],[0.259999999999998,-0.8799999999999955],[0,0]],"v":[[42.67,134.67],[43.33,135.14],[44.339999999999996,137.33999999999997],[47.739999999999995,141.90999999999997],[48.339999999999996,141.00999999999996],[48.93,140.85999999999996],[49,144.67999999999995],[48.67,146.34999999999994],[45.67,144.01999999999992],[44.34,142.01999999999992],[43.010000000000005,140.01999999999992],[41.34,137.6899999999999],[42.67,134.6899999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8471,0.2902,0.2588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[45.22384673646462,140.5099968637836]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[45.22384673646462,140.5099968637836]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 538","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 537","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-3.819999999999993,-0.1500000000000341],[-10.359999999999985,0.2300000000000182],[-3.8499999999999943,-0.06999999999999318],[-0.19000000000002615,-0.6299999999999955],[0,0],[13.469999999999999,1.079999999999984],[-0.4200000000000017,0.009999999999990905]],"o":[[3.8299999999999983,-0.11000000000001364],[10.36,0.39999999999997726],[3.8499999999999943,-0.3100000000000023],[0.5699999999999932,0.009999999999990905],[0,0],[-13.539999999999992,0.06999999999999318],[-0.01999999999999602,-0.6000000000000227],[0,0]],"v":[[92,299.67],[103.49,300.35],[134.51999999999998,300.35],[146.33999999999997,299.67],[148.67,300],[130.85,301.02],[90.34,300],[92,299.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9529,0.9608,0.9569]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[119.50490547126691,300.3234792597777]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[119.50490547126691,300.3234792597777]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 539","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 538","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.04999999999999716,-0.9699999999999989],[0.8599999999999994,-1.6200000000000045],[0.1600000000000037,-0.12999999999999545],[0.3300000000000054,-0.12999999999999545],[-0.030000000000001137,0.060000000000002274],[0.11000000000000654,0.06999999999999318],[0.4200000000000017,1.240000000000009],[-0.3999999999999986,0.5300000000000011],[-0.2600000000000051,0.37999999999999545],[-1.6900000000000048,-0.03999999999999204]],"o":[[0.9500000000000028,-0.2599999999999909],[-0.490000000000002,1.789999999999992],[-0.7800000000000011,-0.5500000000000114],[-0.09000000000000341,0.06999999999999318],[0.18999999999999773,-1.0300000000000011],[0.07000000000000028,-0.11000000000001364],[-0.2700000000000031,-0.18999999999999773],[1.7000000000000028,-0.18999999999999773],[0.5600000000000023,-0.75],[0.5600000000000023,-0.789999999999992],[0,0]],"v":[[45.67,144],[48.67,146.33],[46.34,151.33],[45.31,152.64000000000001],[43,152.32000000000002],[44.33,151.99],[44.309999999999995,149.35000000000002],[42.669999999999995,148.16000000000003],[43.339999999999996,145.00000000000003],[44.33,145.66000000000003],[45.67,144.00000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.902,0.6157,0.5882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[45.67002632273082,148.30936173275984]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[45.67002632273082,148.30936173275984]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 540","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 539","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.950000000000017,-2.5],[-2.5900000000000034,-3.539999999999992],[-0.21000000000000796,0.7299999999999898],[-0.09000000000000341,-0.6999999999999886],[0.4899999999999807,0.5600000000000023],[1.3899999999999864,3.5800000000000125],[0.1799999999999784,1.5100000000000193],[0.12000000000000455,0.2300000000000182],[0.010000000000019327,0.5099999999999909],[-0.2599999999999909,-0.3100000000000023]],"o":[[0.2400000000000091,2.6399999999999864],[1.5600000000000023,4.110000000000014],[0.12000000000000455,0.1599999999999966],[0.0800000000000125,0.5099999999999909],[-0.7700000000000102,-0.0800000000000125],[-2.5,-2.9000000000000057],[-0.5600000000000023,-1.4399999999999977],[0.12000000000000455,-0.6599999999999966],[-0.47999999999998977,-0.020000000000010232],[0.18999999999999773,-0.3100000000000023],[0,0]],"v":[[163.33,207],[165.66000000000003,215.67],[172.12000000000003,227.04999999999998],[173.00000000000003,227.67],[173.33000000000004,229.33999999999997],[171.35000000000005,227.73999999999998],[164.66000000000005,217.33999999999997],[162.99000000000007,211.00999999999996],[162.99000000000007,209.67999999999995],[162.66000000000005,207.00999999999996],[163.33000000000004,207.00999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2902,0.2941,0.298]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[167.9861511284922,218.16998618503288]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[167.9861511284922,218.16998618503288]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 541","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 540","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.05000000000001137,-0.5],[3.530000000000001,-1.5],[-1.5100000000000193,3.759999999999991],[-0.589999999999975,-0.6299999999999955]],"o":[[0.15000000000000568,0.1599999999999966],[0.36000000000001364,3.9199999999999875],[1.0900000000000034,-3.9000000000000057],[0.11000000000001364,-0.28000000000000114],[0,0]],"v":[[206.66,139.67],[207.66,143.83999999999997],[202.67,151.99999999999997],[206,140.15999999999997],[206.67,139.65999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6941,0.6902,0.6902]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[205.18746888170946,145.71636088238188]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[205.18746888170946,145.71636088238188]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 542","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 541","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.4000000000000057,1.0400000000000205],[-0.2599999999999909,0.36000000000001364],[6.3799999999999955,-3.240000000000009]],"o":[[0,0],[0.09999999999999432,-1.1299999999999955],[-0.30000000000001137,-0.5],[6.97999999999999,-4.299999999999997],[0,0]],"v":[[158.67,135.67],[158.20999999999998,135.60999999999999],[157.67,132.33999999999997],[155.67,129.34999999999997],[158.67,135.67999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9255,0.6667,0.5059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[159.01341515805294,131.8600723017164]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[159.01341515805294,131.8600723017164]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 543","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 542","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.8900000000000432,0.8100000000000023],[3.650000000000034,-1.660000000000025],[0,0],[-0.18999999999999773,0.21000000000003638],[-0.7299999999999898,0.910000000000025],[1.3499999999999943,-0.010000000000047748],[0,0],[0,0]],"o":[[1.9599999999999795,-0.6700000000000159],[0.19999999999998863,4.7900000000000205],[0,0],[-0.020000000000010232,-0.38999999999998636],[0.5,-0.5500000000000114],[-0.5999999999999943,-1.1100000000000136],[0,0],[0,0],[0,0]],"v":[[256,303.67],[261.66,301.01],[257,307.67],[254,308.34000000000003],[253.66,306.68],[255.32,307.18],[252.66,305.34000000000003],[256.2,304.05],[255.98999999999998,303.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4,0.4157,0.4314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[257.1704957859115,304.67498421025664]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[257.1704957859115,304.67498421025664]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 544","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 543","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.46000000000000796,-0.12000000000000455],[-1.3000000000000114,-0.4700000000000273],[0,0],[-0.7199999999999989,-0.3299999999999841],[0.060000000000002274,-0.5400000000000205],[0.4000000000000057,-0.2599999999999909],[0.21000000000000796,-0.13999999999998636],[-0.3199999999999932,-1.3700000000000045],[0.3900000000000148,0.5400000000000205],[-2.009999999999991,2.9399999999999977],[0,0],[-2.559999999999974,0.8700000000000045],[-1.1499999999999773,-0.5400000000000205]],"o":[[0.44999999999998863,0.12000000000000455],[0.030000000000001137,0.19999999999998863],[0,0],[0.9499999999999886,0.3199999999999932],[0.5800000000000125,0.2599999999999909],[-0.4900000000000091,0.12999999999999545],[-0.020000000000010232,0.009999999999990905],[-0.75,0.5199999999999818],[-0.5800000000000125,0.2799999999999727],[-1.5600000000000023,-1.4499999999999886],[0,0],[0.22999999999998977,-1.5699999999999932],[1.259999999999991,0.11000000000001364],[0,0]],"v":[[209.33,300.67],[210.66000000000003,301],[212.66000000000003,302],[211.66000000000003,304],[213.15000000000003,303.01],[213.65000000000003,304.67],[212.66000000000003,303.68],[212.53000000000003,304.2],[210.65000000000003,306.01],[208.32000000000002,305.34],[205.32000000000002,302.5],[205.99,303],[205.66,299.67],[209.32999999999998,300.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5333,0.5412,0.5529]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[209.16216147728093,302.88532954571485]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[209.16216147728093,302.88532954571485]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 545","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 544","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3299999999999841,-0.5700000000000003],[0.27000000000001023,-0.10999999999999943],[0.75,-0.3399999999999963],[0.3200000000000216,1.0300000000000011],[-0.13999999999998636,-1.5],[0.28999999999999204,-0.11999999999999744],[0.28999999999999204,-0.11999999999999744],[0.46999999999999886,0.1700000000000017],[0,0],[0.44000000000002615,-0.00999999999999801],[0.5699999999999932,0.14999999999999858],[-0.5099999999999909,-0.10000000000000142],[-0.46999999999999886,0.07000000000000028],[-0.1599999999999966,-1.2299999999999969],[0.35000000000002274,-0.3200000000000003],[0.5900000000000034,0.20000000000000284],[0.10000000000000853,0.4299999999999997],[0.10999999999999943,0.3499999999999943],[-1.3700000000000045,0.0799999999999983],[-0.8400000000000034,0.3999999999999986],[-0.6599999999999966,0.6599999999999966],[-0.21999999999999886,0.030000000000001137],[-0.25,-0.36999999999999744],[0,0],[-1.7700000000000102,0.23000000000000398]],"o":[[0.6399999999999864,0],[0.27000000000001023,0.10999999999999943],[0.7800000000000011,0.2700000000000031],[-0.5600000000000023,0.36999999999999744],[-1.8899999999999864,-0.4200000000000017],[0.28999999999999204,0.09000000000000341],[0.28999999999999204,0.09000000000000341],[-0.06999999999999318,0.5499999999999972],[0,0],[-0.4399999999999977,-0.020000000000003126],[-0.5500000000000114,-0.29999999999999716],[-0.4399999999999977,-0.3999999999999986],[-0.19999999999998863,-0.3999999999999986],[0.7199999999999989,-0.5499999999999972],[0.5300000000000011,0.17999999999999972],[0.27000000000001023,0.509999999999998],[-0.09000000000000341,0.36999999999999744],[-1.1800000000000068,0.18999999999999773],[-1.1800000000000068,0.490000000000002],[0.04999999999999716,-0.490000000000002],[-0.9399999999999977,-0.0799999999999983],[0.21999999999999886,-0.030000000000001137],[0.39000000000000057,0.0799999999999983],[0,0],[1.7800000000000011,-0.21999999999999886],[0,0]],"v":[[136.67,32.33],[137,33],[137,33.33],[137,34.66],[135.67,33.66],[132.67,37.66],[132.67,37.989999999999995],[132.67,38.31999999999999],[131.70999999999998,38.64999999999999],[131.67,38.989999999999995],[130.33999999999997,38.989999999999995],[128.67,38.31999999999999],[129.33999999999997,37.64999999999999],[130.00999999999996,36.64999999999999],[128.67999999999995,36.64999999999999],[128.34999999999994,37.64999999999999],[127.34999999999994,38.64999999999999],[126.67999999999994,38.64999999999999],[124.73999999999994,38.419999999999995],[124.67999999999994,35.98],[126.00999999999993,34.65],[125.67999999999994,33.65],[126.34999999999994,33.65],[127.29999999999994,34.33],[131.34999999999994,32.989999999999995],[136.67999999999995,32.31999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.949,0.298,0.2824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[130.66200261925906,35.65498755474462]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[130.66200261925906,35.65498755474462]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 546","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 545","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.549999999999983,-4.329999999999998],[0.19000000000002615,-2.8100000000000023],[0.7199999999999989,0.29999999999999716],[-0.4399999999999977,1.0500000000000114],[0,0],[-0.160000000000025,-0.01999999999999602],[-0.14000000000001478,-0.060000000000002274],[0,0],[-0.44999999999998863,-0.37000000000000455]],"o":[[-0.6800000000000068,4.540000000000006],[-0.6899999999999977,2.739999999999995],[-0.0800000000000125,0.18000000000000682],[-0.9000000000000057,-0.37999999999999545],[0,0],[0.06999999999999318,-0.1599999999999966],[0.05000000000001137,0],[0,0],[0.5500000000000114,-0.12999999999999545],[0,0]],"v":[[180.33,101],[176.66000000000003,114.33],[175.33,122.66],[174.83,123.32],[173.36,120.19999999999999],[178.67000000000002,101.82999999999998],[179.00000000000003,101.65999999999998],[179.33000000000004,101.99999999999999],[179.67000000000004,99.99999999999999],[180.33000000000004,100.99999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3255,0.3529,0.3725]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[176.79182851276371,111.68658858403987]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[176.79182851276371,111.68658858403987]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 547","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 546","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6099999999999994,0.8700000000000045],[-1.8999999999999915,1.5200000000000031],[-0.5699999999999932,-0.14999999999999858],[0,0],[0,0],[0.3500000000000085,2.9099999999999966],[1.1400000000000006,-1.4000000000000057]],"o":[[-0.2600000000000051,-0.9599999999999937],[1.9699999999999989,-1.4799999999999969],[0.3400000000000034,-0.2700000000000031],[0,0],[0,0],[0.4000000000000057,-2.989999999999995],[-1.7999999999999972,0.25],[0,0]],"v":[[99,67.67],[97.03,64.17],[102.66,59.17],[103.66,58.68],[102.99,74.68],[102.58,74.53],[102.66,65.68],[98.99,67.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7647,0.498,0.349]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[100.34503922553094,66.66270725075631]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[100.34503922553094,66.66270725075631]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 548","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 547","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-2.569999999999993,-0.01999999999998181],[-1.4499999999999886,-0.19999999999998863],[0.29000000000002046,-0.12000000000000455],[0,0],[-1.4599999999999795,-0.9600000000000364],[0,0],[0,0],[0.6700000000000159,-0.18000000000000682],[3.919999999999959,1.1299999999999955],[-3.7299999999999898,0.040000000000020464],[-0.3300000000000409,-0.5999999999999659]],"o":[[2.180000000000007,0.7099999999999795],[1.3700000000000045,0.22000000000002728],[0.29000000000002046,0.08999999999997499],[0,0],[-3.6200000000000045,-0.5600000000000023],[0,0],[0,0],[0.589999999999975,0.37999999999999545],[-4.050000000000011,-0.6999999999999886],[-2.289999999999992,-0.5099999999999909],[0.4700000000000273,0.10000000000002274],[0,0]],"v":[[257.67,288.67],[265.34000000000003,290],[269.34000000000003,290.67],[269.34000000000003,291],[268.94000000000005,291.61],[265.70000000000005,292.21000000000004],[265.89000000000004,293.19000000000005],[269.58000000000004,294.05000000000007],[269.35,294.99000000000007],[258.02000000000004,292.32000000000005],[256.02000000000004,288.32000000000005],[257.69000000000005,288.65000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7804,0.7804,0.7765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[262.15872623536745,291.6435984041108]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[262.15872623536745,291.6435984041108]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 549","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 548","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7100000000000009,-0.4199999999999875],[0.6099999999999994,-0.5799999999999841],[0.269999999999996,-1.5300000000000011],[-0.23000000000000398,-0.9099999999999966],[1.2100000000000009,-0.21999999999999886],[0.14999999999999858,0.3100000000000023],[-0.28000000000000114,2.0600000000000023],[-2.230000000000004,-1.0999999999999943],[-0.5399999999999991,0.18000000000000682],[0.5900000000000034,-0.8100000000000023]],"o":[[-0.3400000000000034,1.1100000000000136],[0.1599999999999966,0.7599999999999909],[1.2000000000000028,0.30000000000001137],[0.6000000000000014,-0.6699999999999875],[-0.5900000000000034,1.1100000000000136],[-0.3299999999999983,-0.030000000000001137],[-0.7899999999999991,-1.6200000000000045],[0.22999999999999687,-1.7299999999999898],[-0.4099999999999966,0.18999999999999773],[0.9600000000000009,-0.4000000000000057],[0,0]],"v":[[45.67,144],[44.1,146.29],[43.660000000000004,148.42999999999998],[45.050000000000004,151.17999999999998],[46.330000000000005,151.31999999999996],[42.660000000000004,156.64999999999998],[41.760000000000005,156.17],[41.2,145.01999999999998],[44.010000000000005,141.99999999999997],[44.330000000000005,141.97999999999996],[45.660000000000004,143.97999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9176,0.6784,0.6471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[43.68745710830984,149.18543901282413]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[43.68745710830984,149.18543901282413]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 550","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 549","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1,-0.4199999999999591],[-0.36000000000001364,-0.8000000000000114],[0,0],[1.9700000000000273,-0.08000000000004093],[0.22999999999996135,0.4300000000000068],[0.12000000000000455,0.4700000000000273],[0,0],[0.8999999999999773,0.160000000000025],[0,0],[0.8199999999999932,-0.6400000000000432],[-1.6800000000000068,0.3499999999999659],[-0.3699999999999477,0.07999999999998408],[-0.47999999999996135,0.3100000000000023],[-0.6699999999999591,0.21000000000003638]],"o":[[1.5500000000000114,0.10000000000002274],[-0.040000000000020464,0.7900000000000205],[0,0],[-1.6499999999999773,1.0199999999999818],[-0.2300000000000182,0.37999999999999545],[0.18000000000000682,-0.339999999999975],[0,0],[-0.14999999999997726,-0.9900000000000091],[0,0],[-0.9300000000000068,-1.6100000000000136],[-0.4700000000000273,-2.25],[0.6299999999999955,-0.12999999999999545],[1.740000000000009,-0.36000000000001364],[0.6800000000000068,-0.18000000000000682],[0,0]],"v":[[297,289.33],[296.36,290.60999999999996],[296.83000000000004,292.99999999999994],[296.34000000000003,293.65999999999997],[290.34000000000003,295.33],[289.01000000000005,295.33],[289.34000000000003,294.33],[288.35,294.99],[286.01000000000005,293.32],[286.6700000000001,292.99],[284.8300000000001,293.66],[289.7500000000001,291.57000000000005],[291.3400000000001,290.99000000000007],[294.6700000000001,289.99000000000007],[297.00000000000006,289.32000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5294,0.5373,0.549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[291.26768467323825,292.4770004061168]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[291.26768467323825,292.4770004061168]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 551","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 550","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.660000000000025,-0.03999999999996362],[0,0],[1.5800000000000125,-0.6800000000000068],[-0.020000000000010232,-1.0199999999999818],[1.5400000000000205,0.6700000000000159],[0.6200000000000045,0.660000000000025],[0.8900000000000148,0.4600000000000364],[0,0],[-0.8300000000000125,0.9399999999999977],[0.7599999999999909,0.29000000000002046],[0.03999999999999204,0.08999999999997499],[-3.8799999999999955,-1.2300000000000182]],"o":[[-0.4399999999999977,0.18000000000000682],[0,0],[1.5999999999999943,1.490000000000009],[1.9300000000000068,0.01999999999998181],[-1.6299999999999955,0.20999999999997954],[-1,0],[0.21000000000000796,-0.6100000000000136],[0,0],[0.3199999999999932,-1.160000000000025],[-0.18000000000000682,-0.2300000000000182],[-1.5500000000000114,-0.6000000000000227],[3.9399999999999977,1.0500000000000114],[0,0]],"v":[[205.33,299.33],[205.66000000000003,299.65999999999997],[205.37000000000003,300.49999999999994],[205.40000000000003,303.75999999999993],[208.33000000000004,305.31999999999994],[203.00000000000003,304.31999999999994],[199.67000000000002,303.31999999999994],[200.81,301.6599999999999],[199.34,301.6599999999999],[200.34,298.3299999999999],[194.67000000000002,296.6599999999999],[193.67000000000002,295.6599999999999],[205.34,299.3299999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4941,0.502,0.5137]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[200.96116332441463,300.5129503287315]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[200.96116332441463,300.5129503287315]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 552","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 551","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8699999999999974,0.5799999999999983],[0.3200000000000003,-0.14999999999999147],[0.28000000000000114,-0.20000000000000284],[0.6499999999999986,0.75],[0.6600000000000037,-0.9000000000000057],[0.8999999999999986,0.9099999999999966],[0.980000000000004,-0.010000000000005116],[1.0799999999999983,0.15000000000000568],[0.28000000000000114,0.09000000000000341],[0.8399999999999963,0.269999999999996],[0.8000000000000043,-0.37999999999999545],[0,0],[-0.46000000000000085,-0.1799999999999926],[0.5799999999999983,-0.6299999999999955],[0.6400000000000006,-0.18999999999999773],[0.29999999999999716,0.39000000000000057],[0.8200000000000003,0.37999999999999545],[-6.6299999999999955,4.859999999999999],[0.12999999999999545,-0.6599999999999966]],"o":[[0.5799999999999983,0.9399999999999977],[-0.03999999999999915,0.010000000000005116],[-0.5,0.23000000000000398],[0.18999999999999773,1.019999999999996],[-0.4399999999999977,0.3400000000000034],[0.6400000000000006,1.2399999999999949],[-0.13000000000000256,1.769999999999996],[0.740000000000002,0.7399999999999949],[0.060000000000002274,0.5300000000000011],[-0.04999999999999716,1.1500000000000057],[0.4299999999999997,0.37999999999999545],[0,0],[0.21000000000000085,0.04000000000000625],[0.13000000000000256,-0.9699999999999989],[0.6499999999999986,0.18000000000000682],[-0.3299999999999983,0.6800000000000068],[-0.14999999999999858,-0.20000000000000284],[3.240000000000002,-7.689999999999998],[0.7900000000000063,-0.4399999999999977],[0,0]],"v":[[64.67,92.33],[62.67,94.66],[62,94.50999999999999],[61,95.66],[59.67,96.33],[58,99.33],[56,100.66],[54.33,103.33],[53.33,105.33],[53,106],[51.67,107.33],[51.11,108.46],[50.67,109.66999999999999],[51.67,109.99999999999999],[52.34,110.66999999999999],[52.34,111.33999999999999],[49.34,111.99999999999999],[49.34,109.99999999999999],[63.67,91.99999999999999],[64.67,92.32999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8627,0.1922,0.1608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[57.055746718753596,101.94734968321504]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[57.055746718753596,101.94734968321504]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 553","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 552","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.240000000000009,0.6299999999999955],[-0.20999999999997954,-0.25],[3.9799999999999613,-1.7700000000000387],[-0.05000000000001137,0.8799999999999955],[-0.3900000000000432,0.8700000000000045],[0,0],[0.07999999999998408,0.2400000000000091]],"o":[[1.329999999999984,-0.5199999999999818],[0.4700000000000273,-0.2400000000000091],[0.7799999999999727,5.060000000000002],[-1.6299999999999955,0.5600000000000023],[-1.0500000000000114,0.2599999999999909],[0,0],[-0.2599999999999909,0.17000000000001592],[0,0]],"v":[[300.67,288],[305.23,286.06],[308,284.34],[302.67,292],[300.3,291.52],[298.47,289.4],[301.18,288.09],[300.67,287.98999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3882,0.4039,0.4196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[303.27635664453635,288.3209975923397]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[303.27635664453635,288.3209975923397]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 554","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 553","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.200000000000017,-0.12000000000000455],[-0.3900000000000432,0.44999999999998863],[0,0],[3.4799999999999898,-0.5500000000000114],[0.5800000000000125,0.2400000000000091],[0.5,1.2099999999999795],[0,0],[-0.4000000000000057,-0.19999999999998863],[-0.5800000000000125,-0.18000000000000682],[-0.4099999999999966,-0.25],[-0.10999999999998522,0.4300000000000068],[-0.1699999999999875,0.06999999999999318],[-1.7600000000000193,0.5999999999999659]],"o":[[1.670000000000016,-0.14999999999997726],[-0.060000000000002274,0.12999999999999545],[0,0],[-3.180000000000007,1.4499999999999886],[-0.7599999999999909,0.2400000000000091],[-0.6100000000000136,-1.0400000000000205],[0,0],[0.3100000000000023,-0.29000000000002046],[0.09000000000000341,-0.39999999999997726],[0.4900000000000091,-0.35000000000002274],[0.020000000000010232,0.009999999999990905],[-0.009999999999990905,-0.160000000000025],[1.8499999999999943,-0.37999999999999545],[0,0]],"v":[[256,303.67],[254.92,305.22],[256.43,307.11],[257,307.67],[248.33,310.34000000000003],[246.33,310.34000000000003],[244.66000000000003,306.97],[245.33,306.34000000000003],[246.66000000000003,306.34000000000003],[247.66000000000003,306.01000000000005],[250.26000000000002,305.59000000000003],[249.99,305.34000000000003],[250.16,305.01000000000005],[255.99,303.6700000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4549,0.4706,0.4824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[250.8300322720112,307.08999889627023]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[250.8300322720112,307.08999889627023]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 555","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 554","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.18000000000000682,-1.5199999999999818],[0.4099999999999966,-2.210000000000008],[0.839999999999975,-0.6899999999999977],[1.6099999999999994,1.5300000000000011],[-1.5000000000000142,0.9499999999999886]],"o":[[0.9900000000000091,-0.9499999999999886],[0.46000000000000796,2.25],[-0.27000000000001023,1.3100000000000023],[-2.069999999999993,-0.9099999999999966],[1.6099999999999994,-0.8199999999999932],[0,0]],"v":[[129.33,163.67],[132.33,163.33999999999997],[132.33,168.67],[130.66000000000003,171.67],[125.33000000000003,167.17],[129.33000000000004,163.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7294,0.7255,0.7255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[128.9933076864151,167.0975907972334]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[128.9933076864151,167.0975907972334]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 556","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 555","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.1699999999999875,0],[-0.3199999999999932,-0.40999999999996817],[-0.3400000000000034,-1.5199999999999818],[0.13000000000002387,-1.25],[0,0],[0.7900000000000205,-0.27000000000003865],[1.4000000000000057,0],[0.060000000000002274,-0.009999999999990905],[0.799999999999983,0.37999999999999545],[0.660000000000025,0.30000000000001137],[-1.950000000000017,-1.1200000000000045],[-1.0999999999999943,0.40999999999996817],[0,0],[-1.7199999999999989,-0.13999999999998636]],"o":[[0.1699999999999875,0],[0.8000000000000114,-0.18999999999999773],[1.3700000000000045,0.37000000000000455],[1.0600000000000023,-0.2300000000000182],[0,0],[0.5800000000000125,0.18000000000000682],[-1.3799999999999955,0.10000000000002274],[-0.3300000000000125,-0.6100000000000136],[-0.8499999999999943,0.17000000000001592],[-0.6699999999999875,0.2599999999999909],[-0.9300000000000068,-0.6499999999999773],[-0.22999999999998977,-1.839999999999975],[0,0],[1.6200000000000045,-0.13999999999998636],[0,0]],"v":[[236.33,306.33],[237,306.65999999999997],[238.67,306.98999999999995],[241.64999999999998,309.23999999999995],[243.56999999999996,310.5199999999999],[241.32999999999996,310.98999999999995],[240.99999999999994,311.65999999999997],[236.66999999999993,311.65999999999997],[237.51999999999992,311.17999999999995],[235.00999999999993,310.98999999999995],[232.67999999999992,310.98999999999995],[232.00999999999993,308.98999999999995],[233.67999999999992,308.15999999999997],[231.3499999999999,306.32],[236.3499999999999,306.32]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5294,0.5373,0.549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[237.34599791254286,308.95968961168535]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[237.34599791254286,308.95968961168535]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 557","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 556","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.21000000000000796,-0.35000000000002274],[1.0500000000000114,-0.19999999999998863],[0,0],[0.3800000000000239,-0.9699999999999704],[0,0],[0.799999999999983,0.05000000000001137],[0.6500000000000057,-0.6800000000000068],[-0.47999999999998977,3.569999999999993],[-0.19999999999998863,-0.4800000000000182]],"o":[[0.44999999999998863,0.3100000000000023],[-0.12999999999999545,1.5199999999999818],[0,0],[0.30000000000001137,1.3199999999999932],[0,0],[-0.7599999999999909,0.06999999999999318],[-0.8700000000000045,-0.05000000000001137],[-3.2700000000000102,-2.6100000000000136],[0.6399999999999864,1.079999999999984],[0,0]],"v":[[193.67,295.67],[194.67,296.67],[192.33999999999997,298.01],[193.99999999999997,298.67],[192.66999999999996,299.5],[193.66999999999996,300.33],[191.52999999999997,301],[189.33999999999997,300.33],[188.00999999999996,292],[193.66999999999996,295.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4039,0.4196,0.4392]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[190.96919680908135,296.50137466868154]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[190.96919680908135,296.50137466868154]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 558","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 557","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4700000000000273,-0.5900000000000034],[1.9800000000000182,-1.829999999999984],[0,0],[-0.11000000000001364,0.35000000000002274],[-0.4399999999999977,-0.12000000000000455],[-1.079999999999984,-0.549999999999983],[-0.05000000000001137,-0.6299999999999955]],"o":[[-0.19999999999998863,0.6100000000000136],[-1.3500000000000227,1.289999999999992],[0,0],[-0.37000000000000455,0.15000000000000568],[0.0800000000000125,-0.25],[1.0400000000000205,-0.5900000000000034],[0.589999999999975,0.30000000000001137],[0,0]],"v":[[263.67,240.67],[262,243],[257,247.67],[256.48,248.2],[254.41000000000003,241.42999999999998],[257,240.32999999999998],[262.84,239.17999999999998],[263.65999999999997,240.65999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6824,0.6784,0.6824]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[259.037618819018,243.61687232452607]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[259.037618819018,243.61687232452607]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 559","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 558","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.519999999999996,-0.8599999999999852],[0,0],[0.39000000000000057,5.25],[0.3100000000000023,-0.9300000000000068],[0.13000000000000966,-0.030000000000001137],[0.09000000000000341,0.5999999999999943],[-0.25,-0.6599999999999966],[-3.1499999999999915,-4.469999999999999]],"o":[[-1.4699999999999989,0.9099999999999966],[0,0],[-0.5300000000000011,-5.150000000000006],[-0.10999999999999943,-1.5300000000000011],[-0.01999999999999602,0.060000000000002274],[-0.6299999999999955,-0.37999999999999545],[0.9599999999999937,-0.6299999999999955],[1.8599999999999994,5.02000000000001],[0,0]],"v":[[96,161.67],[91.67,164.33999999999997],[90.97,164.47999999999996],[89.57,148.72999999999996],[89.58999999999999,148.54999999999995],[89.32999999999998,148.66999999999996],[88.99999999999999,146.66999999999996],[89.75999999999999,147.06999999999996],[95.99999999999999,161.66999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8588,0.8667,0.8588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[92.48100459050465,155.41264584195216]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[92.48100459050465,155.41264584195216]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 560","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 559","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.9700000000000273,0.4200000000000159],[0.12999999999999545,-0.9800000000000182],[1.6000000000000227,-0.3100000000000023],[0.5299999999999727,-0.22000000000002728],[0.3199999999999932,-0.029999999999972715],[-0.29000000000002046,0.12000000000000455],[0.049999999999954525,-0.8199999999999932],[0,0],[0.8100000000000023,0.5399999999999636],[-0.7699999999999818,-0.05000000000001137],[-0.5900000000000318,0.7200000000000273],[-2.1499999999999773,0.009999999999990905],[-2.5300000000000296,0.45999999999997954],[0.29000000000002046,-0.12000000000000455]],"o":[[0.12000000000000455,1.5699999999999932],[-0.7799999999999727,-0.339999999999975],[2.7799999999999727,1.25],[0.3100000000000023,0.2300000000000182],[-0.3199999999999932,0.040000000000020464],[-0.29000000000002046,-0.08999999999997499],[-0.2300000000000182,-0.4300000000000068],[0,0],[-1.2300000000000182,0.45999999999997954],[-0.4300000000000068,-0.29000000000002046],[0.4900000000000091,-1.0199999999999818],[2.069999999999993,-0.20999999999997954],[2.5400000000000205,-0.20999999999997954],[0.29000000000002046,0.08999999999997499],[0,0]],"v":[[291.33,291],[286.28999999999996,292.26],[287.22999999999996,293],[288.99999999999994,295.34],[288.66999999999996,296.01],[287.66999999999996,296.01],[287.66999999999996,295.68],[286.83,295.44],[285.66999999999996,295.68],[275.19999999999993,295.84000000000003],[275.7299999999999,294.63000000000005],[277.3399999999999,292.02000000000004],[283.6699999999999,291.69000000000005],[291.3399999999999,290.69000000000005],[291.3399999999999,291.02000000000004]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5961,0.6,0.6078]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[283.15735158173175,293.4197179991192]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[283.15735158173175,293.4197179991192]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 561","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 560","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.04999999999998295,-0.009999999999990905],[-0.09999999999999432,-0.30000000000001137],[0.11999999999997613,-0.9199999999999591],[2.0400000000000205,0],[1.079999999999984,0.11000000000001364],[2.3899999999999864,1.910000000000025],[-0.7400000000000091,-0.2899999999999636],[0.8100000000000023,2.0600000000000023],[-1.009999999999991,0.35000000000002274]],"o":[[0.09000000000000341,-0.17000000000001592],[0.7400000000000091,0.17000000000001592],[-0.3300000000000125,0.8799999999999955],[2.4499999999999886,0.18999999999999773],[-0.6999999999999886,0.11000000000001364],[-2.8000000000000114,-0.75],[-0.1599999999999966,-0.8000000000000114],[1.8600000000000136,1.5199999999999818],[0.7700000000000102,-0.5099999999999909],[0,0]],"v":[[194.67,296.67],[194.89999999999998,296.38],[200.82999999999998,298.3],[200.16,301.01],[199.67,303.34],[197,303.34],[189.33,300.34],[190.32000000000002,299.61999999999995],[192.00000000000003,297.9599999999999],[194.66000000000003,296.6699999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.4471,0.4588,0.4745]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[195.46688051052112,299.8597438921461]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[195.46688051052112,299.8597438921461]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 562","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 561","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.480000000000004,-0.4100000000000037],[0.9300000000000068,0.18999999999999773],[0.5,0.07000000000000028],[0.980000000000004,-0.10000000000000142],[0.269999999999996,-0.14000000000000057],[0.4099999999999966,-0.75],[0,0],[1.3100000000000023,0.04999999999999716],[1.8400000000000034,0.1700000000000017],[0,0],[0,0],[0.8900000000000006,0.12000000000000455],[0.39000000000000057,-0.010000000000005116],[0.23999999999999488,0.07000000000000739],[0,0],[1.4300000000000068,0.0799999999999983],[0.28999999999999204,-0.769999999999996],[0,0],[0.01999999999999602,-0.9399999999999977],[1.0799999999999983,0.7900000000000063],[1.230000000000004,-0.0799999999999983],[0.730000000000004,0.12999999999999545],[-1.3599999999999994,0.23999999999999488],[-0.8200000000000074,0.7000000000000028],[-0.3100000000000023,-0.10000000000000142],[-0.09000000000000341,-0.28999999999999915]],"o":[[0.7000000000000028,0],[0.4300000000000068,0.740000000000002],[0.04999999999999716,0.9600000000000009],[0.3100000000000023,0.3500000000000014],[0.28000000000000114,0.0799999999999983],[0.010000000000005116,0.8299999999999983],[0,0],[1.230000000000004,-0.240000000000002],[0.29000000000000625,1.2899999999999991],[0,0],[0,0],[0.6299999999999955,0.6400000000000006],[-0.060000000000002274,0.6500000000000057],[0.09999999999999432,0.9399999999999977],[0,0],[0.7900000000000063,0.7900000000000063],[-0.3499999999999943,1.2000000000000028],[0,0],[0.480000000000004,-0.8700000000000045],[0.8499999999999943,0.7800000000000011],[0.10999999999999943,1.0300000000000011],[0.1599999999999966,0.9300000000000068],[0.01999999999999602,-3.1299999999999955],[0.29000000000000625,-0.6300000000000026],[-0.09000000000000341,-0.3200000000000003],[0.3499999999999943,-0.28999999999999915],[0,0]],"v":[[81.33,50.33],[81.33,51],[80.66,52],[79.99,53.33],[78.99,54],[78.99,54.33],[78.39,56.71],[78.99,57.33],[78.99,59],[76.66,60.67],[76.03,63.34],[75,64],[74.67,64.67],[74,65.67],[73.78,66.99],[73.84,67.78999999999999],[73.33,70.33],[72.37,73.28],[73,73.66],[74,73.99],[73,75.99],[71.33,77.66],[69.66,78.66],[78.66,52.66],[80.33,50.66],[80.66,50.33],[81.33,50.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9059,0.2235,0.1961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[75.7181792546225,64.51288040502757]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[75.7181792546225,64.51288040502757]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 563","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 562","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.18999999999999773,-0.18999999999999773],[-0.20000000000000284,-2.469999999999999],[0.29000000000000625,-0.9299999999999926],[0,0],[0.35999999999999943,-0.6500000000000057],[0.519999999999996,-0.4299999999999926],[1.2399999999999949,-1.1099999999999994],[0.04999999999999716,1.1800000000000068],[-0.8200000000000074,0.4899999999999949],[-0.5499999999999972,0.6200000000000045],[-0.07000000000000739,0.29999999999999716],[-0.7199999999999989,0.519999999999996],[0,0],[0.05000000000001137,0.030000000000001137],[0.05000000000001137,0.0799999999999983],[1.6099999999999994,-0.45000000000000284],[0,0],[-1.0499999999999972,0.8799999999999955],[0.46000000000000796,-0.6200000000000045],[-0.4299999999999926,0.8199999999999932],[-0.8599999999999994,-0.01999999999999602],[-0.8299999999999983,0.8799999999999955],[-0.04999999999999716,0.3400000000000034],[-0.29999999999999716,0.25],[0.010000000000005116,-0.5]],"o":[[-0.3100000000000023,0.4399999999999977],[-1.0600000000000023,1.0900000000000034],[1.0900000000000034,0.09000000000000341],[0,0],[1.0400000000000063,-0.23999999999999488],[0.23000000000000398,0.6700000000000017],[0.09000000000000341,1.7399999999999949],[-0.5300000000000011,1.0999999999999943],[-0.769999999999996,-0.12999999999999545],[-0.29999999999999716,-1.1400000000000006],[0.18000000000000682,-0.20999999999999375],[-0.6800000000000068,-1.2800000000000011],[0,0],[-0.519999999999996,-0.06999999999999318],[-0.14000000000000057,-0.10999999999999943],[0.18999999999999773,-1.9699999999999989],[0,0],[0.9500000000000028,-0.7999999999999972],[0.8499999999999943,0.2600000000000051],[0.7900000000000063,-0.04000000000000625],[-0.6700000000000017,-0.5999999999999943],[-0.8299999999999983,-0.23999999999999488],[0.4000000000000057,-0.10999999999999943],[0.18000000000000682,-0.15000000000000568],[0.4099999999999966,-0.2600000000000051],[0,0]],"v":[[87.33,73.33],[87.16,75.67999999999999],[85.99,77.66999999999999],[86.75999999999999,80.43999999999998],[87.32999999999998,80.99999999999999],[87.65999999999998,82.66999999999999],[86.98999999999998,84.99999999999999],[84.65999999999998,89.99999999999999],[83.32999999999998,89.99999999999999],[82.99999999999999,88.66999999999999],[84.51999999999998,87.68999999999998],[84.32999999999998,85.66999999999999],[84.38999999999999,82.96999999999998],[83.99999999999999,82.33999999999999],[82.70999999999998,82.30999999999999],[82.66999999999997,81.67999999999999],[80.53999999999998,79.39999999999999],[80.33999999999997,78.67999999999999],[83.33999999999997,76.00999999999999],[83.66999999999997,77.67999999999999],[84.99999999999997,76.67999999999999],[85.32999999999997,76.00999999999999],[85.32999999999997,74.33999999999999],[85.99999999999997,73.66999999999999],[86.66999999999997,72.99999999999999],[87.33999999999997,73.32999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7647,0.2078,0.1725]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[84.18004596823133,81.85665879160354]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[84.18004596823133,81.85665879160354]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 564","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 563","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.75,-1.289999999999992],[1.710000000000008,2.469999999999999],[-0.3499999999999943,1.730000000000004],[0,0],[-3.230000000000018,1.6599999999999966]],"o":[[-0.09000000000000341,2.25],[-1.8499999999999943,1.3599999999999994],[0.5200000000000102,-1.5400000000000063],[0,0],[3.569999999999993,-0.04000000000000625],[0,0]],"v":[[144.33,107.33],[140.44000000000003,113.27],[133.33,114.33],[134.64000000000001,109.44],[135.00000000000003,109.33],[144.33000000000004,107.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8627,0.8706,0.8627]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[138.83003889690863,111.3926188164825]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[138.83003889690863,111.3926188164825]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 565","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 564","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5699999999999932,-0.5799999999999983],[0.11000000000001364,-0.3100000000000023],[1.549999999999983,-0.00999999999999801],[0.6500000000000057,-0.7199999999999989],[0.8999999999999773,-0.44000000000000483],[-1.289999999999992,3.0900000000000034],[0,0],[-0.5699999999999932,0.10999999999999943],[1.1999999999999886,0.25],[0.38999999999998636,-0.8000000000000043],[0.4300000000000068,-0.6600000000000037],[1.1499999999999773,2.979999999999997],[-1.740000000000009,-2]],"o":[[0.060000000000002274,0.8400000000000034],[0.03999999999999204,0.6400000000000006],[-1.3000000000000114,0.6599999999999966],[0.6599999999999966,0.39000000000000057],[0.6800000000000068,1.1000000000000014],[-0.9399999999999977,2.8100000000000023],[0,0],[-0.37999999999999545,-0.3500000000000014],[0.5,-1.1199999999999974],[0.38999999999998636,0.9799999999999969],[0.37000000000000455,0.6599999999999966],[-0.15000000000000568,-3.1199999999999974],[2.490000000000009,-0.04999999999999716],[0,0]],"v":[[170,39],[171,41],[170.67,42],[167,43],[167.67,44.67],[166.19,47.370000000000005],[163.94,46.74],[163.34,44.34],[164.07,42.74],[163.01,40.68],[163.01,43.35],[162.67999999999998,46.35],[162.01,37.02],[170.01,39.02]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6824,0.2314,0.1804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[166.50706659620013,43.14613102412534]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[166.50706659620013,43.14613102412534]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 566","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 565","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3100000000000023,-0.9000000000000057],[-0.6300000000000026,-0.18999999999999773],[0.8900000000000006,-0.37000000000000455],[-0.740000000000002,0.10999999999999943],[-0.4199999999999946,0.3400000000000034],[1.0600000000000023,0.980000000000004],[0.39000000000000057,0.5600000000000023],[-0.39000000000000057,-0.9699999999999989],[0.44000000000000483,-0.9699999999999989],[0.6599999999999966,1.6799999999999926],[0,0],[-0.3299999999999983,-1.2199999999999989],[1.0399999999999991,-0.21000000000000796],[-0.0799999999999983,0.8100000000000023],[0.1700000000000017,1.3900000000000006],[-0.4399999999999977,1.2999999999999972],[0,0],[-0.8100000000000023,1.9300000000000068]],"o":[[1.0399999999999991,-0.3299999999999983],[0.8200000000000003,-0.29000000000000625],[0.9699999999999989,-0.12000000000000455],[0.6300000000000026,0.35999999999999943],[0.07000000000000028,0.730000000000004],[0.060000000000002274,0.18000000000000682],[0.10999999999999943,0.6500000000000057],[-0.8699999999999974,0.2600000000000051],[0.6599999999999966,-0.09000000000000341],[0.17999999999999972,0.7000000000000028],[0,0],[-0.03999999999999915,-1.4000000000000057],[1.0300000000000011,0.37000000000000455],[-0.7100000000000009,0.3400000000000034],[-0.7199999999999989,0.04999999999999716],[0.1599999999999966,-1.3100000000000023],[0,0],[0.35999999999999943,-2.0799999999999983],[0,0]],"v":[[49.33,110],[50.16,111.48],[52.33,111.33],[52.66,113],[54.8,113.39],[55.529999999999994,113.97],[53.989999999999995,116.66],[53.31999999999999,116.99],[52.31999999999999,118.66],[52.64999999999999,119.99],[51.31999999999999,121.66],[50.629999999999995,121.47],[48.31999999999999,123],[47.989999999999995,124.67],[46.989999999999995,124],[45.66,122],[46.989999999999995,116.67],[47.31999999999999,116],[49.31999999999999,110]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8824,0.2314,0.2039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[50.59730915025844,117.37961797042038]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[50.59730915025844,117.37961797042038]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 567","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 566","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6300000000000239,-0.4899999999999949],[0,0],[0,0],[1.789999999999992,-7.1200000000000045],[0,0],[1.5699999999999932,-2.769999999999996],[0,0],[-0.21000000000000796,1.3400000000000034],[0,0],[-5.800000000000011,-1.7900000000000063]],"o":[[-0.9199999999999875,-0.04000000000000625],[0,0],[0,0],[-2.7700000000000102,6.679999999999993],[0,0],[-0.47999999999998977,3.1500000000000057],[0,0],[-0.03999999999999204,1.2600000000000051],[0,0],[1.3799999999999955,-4.200000000000003],[0,0]],"v":[[194.67,68.33],[192.33999999999997,69],[192.45,69.42],[190.58999999999997,70.73],[183.73999999999998,91.43],[183.35,91.66000000000001],[180.35,100.99000000000001],[179.9,101.11000000000001],[179.02,101.66000000000001],[186.60000000000002,75.4],[194.69000000000003,68.32000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.3529,0.3765,0.4]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[186.84115983750186,85.16777469878531]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[186.84115983750186,85.16777469878531]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 568","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 567","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6299999999999955,0.21000000000003638],[-0.030000000000001137,0.2699999999999818],[-2.3600000000000136,-0.21000000000000796],[-0.28000000000002956,-1.829999999999984],[1.2699999999999818,-0.9599999999999795],[0.9000000000000341,0.37000000000000455],[0.75,0.5]],"o":[[-0.46000000000000796,0.07999999999998408],[-0.009999999999990905,-0.2699999999999818],[0.3300000000000125,-2.3799999999999955],[1.8999999999999773,0.1699999999999875],[-1.6299999999999955,0],[-0.589999999999975,0.2599999999999909],[-1.3100000000000023,0.160000000000025],[0,0]],"v":[[253,261],[251.34,261.33],[251.35,260.52],[258.43,254.73999999999998],[263.34000000000003,259.65999999999997],[258.34000000000003,261.65999999999997],[256.11,261.49999999999994],[253.01000000000002,260.99999999999994]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0863,0.102,0.1059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[257.33502649879847,258.27700470387816]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[257.33502649879847,258.27700470387816]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 569","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 568","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.6599999999999966,-10.090000000000003],[0.6000000000000227,0.28000000000000114],[-0.12999999999999545,1.5999999999999943],[-0.07999999999998408,0.2599999999999909],[-0.4300000000000068,0.4199999999999875],[-0.2400000000000091,3],[-0.38999999999998636,2.5],[0.5200000000000102,-0.18000000000000682]],"o":[[0,10.530000000000001],[0.13999999999998636,0.7199999999999989],[-1.3499999999999943,-0.6299999999999955],[0.020000000000010232,-0.2599999999999909],[0.6299999999999955,0.47999999999998977],[2.469999999999999,-2.4099999999999966],[0.21000000000000796,-2.5900000000000034],[0.5699999999999932,-0.05000000000001137],[0,0]],"v":[[170,200.67],[173,227.67],[172.48,228.29999999999998],[165.48999999999998,216.45],[165.65999999999997,215.67],[167.33999999999997,215.19],[168.98999999999998,207.18],[169.98999999999998,199.34],[169.98999999999998,200.67000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8471,0.8549,0.8471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[169.27548592863397,213.88100131308994]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[169.27548592863397,213.88100131308994]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 570","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 569","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.23000000000000398,-0.9400000000000048],[-0.12000000000000455,-0.7700000000000031],[0.6500000000000057,-0.6700000000000017],[0.5700000000000074,0.10000000000000142],[0,0],[0.960000000000008,-1.2199999999999989],[0.4299999999999926,-0.19000000000000483],[0.5400000000000063,-0.5799999999999983],[0.18999999999999773,1.2100000000000009],[-0.1599999999999966,-1.009999999999998],[1.5,-2.009999999999998],[0,0],[0.3400000000000034,-0.29999999999999716],[0.46999999999999886,0.2700000000000031],[0.46999999999999886,0.5800000000000054],[1.3700000000000045,-0.10000000000000142],[-0.8100000000000023,0.6200000000000045],[0,0],[0,0],[-0.7099999999999937,0.7600000000000051],[0,0],[2.1099999999999994,0.5399999999999991],[0.6499999999999915,0.030000000000001137],[-1.3100000000000023,-0.23000000000000398],[-1.1299999999999955,0.07000000000000028],[-0.37999999999999545,-0.6799999999999997]],"o":[[0.9399999999999977,-0.3400000000000034],[0.9599999999999937,-0.4799999999999969],[0.8900000000000006,-0.259999999999998],[0.8199999999999932,-0.21000000000000085],[0,0],[1.1099999999999994,-0.11999999999999744],[0.21999999999999886,0.259999999999998],[-0.269999999999996,0.4099999999999966],[-1.5900000000000034,1.2100000000000009],[-0.8700000000000045,-1.1700000000000017],[1.8599999999999994,-0.6799999999999997],[0,0],[-0.5400000000000063,0.490000000000002],[-0.6599999999999966,0.060000000000002274],[-0.5900000000000034,0.29999999999999716],[-0.1599999999999966,-0.7999999999999972],[-1.0900000000000034,0.39000000000000057],[0,0],[0,0],[0.9000000000000057,-0.6499999999999986],[0,0],[1.5699999999999932,0.7800000000000011],[-0.25,-0.5799999999999983],[-1.2900000000000063,0.6899999999999977],[-0.12000000000000455,-1.1000000000000014],[0.23999999999999488,-1.1499999999999986],[0,0]],"v":[[99.33,50],[100.39,51.24],[102,51.67],[102.33,52.34],[102.71,53.7],[103,54.010000000000005],[104.33,55.010000000000005],[104,55.68000000000001],[103.33,56.68000000000001],[100.66,56.68000000000001],[98.99,58.010000000000005],[99.52,60.010000000000005],[99.33,60.34],[98,61.34],[96.3,61.03],[94.67,61.01],[94.34,59.68],[93.99000000000001,58.37],[93.68,58.01],[93.35000000000001,57.839999999999996],[95.18,55.349999999999994],[95.35000000000001,55.67999999999999],[96.35000000000001,54.00999999999999],[95.02000000000001,53.00999999999999],[95.35000000000001,51.67999999999999],[97.68,49.67999999999999],[99.35000000000001,50.00999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9412,0.2863,0.2706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[99.01687071853652,55.22809141604412]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[99.01687071853652,55.22809141604412]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 571","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 570","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.28000000000000114,-2.8900000000000006],[0.12999999999999545,-0.14000000000000057],[2.480000000000004,3.319999999999993],[-1.3799999999999955,0.060000000000002274],[-1.5100000000000051,-0.4399999999999977],[-0.6600000000000108,-0.3100000000000023],[-0.6599999999999966,-0.4899999999999949],[0.12999999999999545,0.5],[-0.8200000000000074,-1.4000000000000057]],"o":[[0.20000000000000284,2.8400000000000034],[-0.37000000000000455,0.23000000000000398],[-4.650000000000006,1.8199999999999932],[-0.480000000000004,-0.6700000000000017],[0.45999999999999375,-1.4000000000000057],[0,-0.7000000000000028],[0.25,0.6599999999999966],[0.5100000000000051,0],[-0.5400000000000063,-1.5600000000000023],[0,0]],"v":[[102.67,65.67],[102.75,74.44],[102,75],[93.33,71],[94.69,69.91],[97.02,68.58],[98,68],[98.83,69.99],[99,67.66],[102.67,65.66]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9255,0.6667,0.5059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[98.02321747415769,70.3876877656933]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[98.02321747415769,70.3876877656933]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 572","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 571","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.9499999999999886,-0.7000000000000028],[-1.5300000000000011,-1.559999999999988],[0,0],[-1.3600000000000136,-2.519999999999996],[1.410000000000025,1.3599999999999994],[-0.960000000000008,2.210000000000008],[-1,1.2999999999999972],[-0.37000000000000455,1.8600000000000136],[0.21000000000000796,-0.9000000000000057]],"o":[[-0.7800000000000011,1.4699999999999989],[-1.9699999999999989,0.980000000000004],[0,0],[-3.0600000000000023,0.3100000000000023],[-1.8799999999999955,-0.09000000000000341],[-0.6399999999999864,-2.3499999999999943],[0.1599999999999966,-1.7000000000000028],[0.6899999999999977,-1.519999999999996],[0.36000000000001364,-0.8900000000000006],[0,0]],"v":[[181,104.67],[181.67,109.84],[180.48999999999998,116.69],[183.67,118.34],[181.01,124.01],[175.67999999999998,122.35000000000001],[177.01,114.68],[178.67999999999998,109.35000000000001],[180.26,104.28],[181.01,104.68]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2941,0.3176,0.3412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[179.57455919077776,113.89349162372025]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[179.57455919077776,113.89349162372025]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 573","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 572","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.3799999999999955,-0.5799999999999841],[0.1599999999999966,-0.010000000000047748],[0.9099999999999966,0.060000000000002274],[1.4499999999999886,0.09000000000003183],[-2.039999999999992,0.9599999999999795],[-1.670000000000016,-4.699999999999989]],"o":[[-1.5300000000000011,0.01999999999998181],[-0.7800000000000011,0.3299999999999841],[-0.21999999999999886,0.01999999999998181],[-1.4799999999999898,-0.10000000000002274],[-0.3400000000000034,-2.509999999999991],[4.300000000000011,-2.009999999999991],[0,0]],"v":[[225,272.66],[220.68,273.84000000000003],[217.84,275.56000000000006],[214.83,274.6600000000001],[210.67000000000002,274.99000000000007],[215.89000000000001,269.37000000000006],[225.01000000000002,272.65000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0863,0.102,0.1098]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[217.8285868814705,271.92001641682214]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[217.8285868814705,271.92001641682214]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 574","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 573","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5,-0.17999999999999972],[-0.6400000000000006,-0.730000000000004],[0.5466666666666621,0.4133333333333316],[0.04999999999999716,-0.509999999999998],[-0.5100000000000051,0.5300000000000011],[0.8299999999999983,-1.0399999999999991],[0.7900000000000063,0.3500000000000014],[0,0],[0.6299999999999955,-0.3299999999999983],[0.789999999999992,-0.46000000000000085],[-1.4899999999999949,1.0700000000000003],[1.5799999999999983,-1],[0.5799999999999983,-0.6700000000000017],[0.12999999999999545,0.20000000000000284],[0.5400000000000063,0.6799999999999997],[-0.16666666666666666,-0.4399999999999977],[1.2600000000000051,-0.9899999999999949],[0.46999999999999886,0.030000000000001137],[-0.39000000000000057,0.8199999999999932],[-0.04999999999999716,0.509999999999998],[0.5799999999999983,-0.4000000000000057],[-1.1200000000000045,-0.2600000000000051],[-0.46000000000000796,-1.5999999999999943],[0.5300000000000011,-0.519999999999996],[0.9099999999999966,-0.769999999999996],[-0.0799999999999983,0.980000000000004],[0.6299999999999955,0.5300000000000011],[0,0],[0.29000000000000625,-0.12000000000000455],[0.21999999999999886,0.9099999999999966],[0,0],[0.269999999999996,1.3700000000000045],[-0.7600000000000051,-0.6299999999999955],[-0.9900000000000091,0.5799999999999983],[-0.4899999999999949,0.6900000000000048],[-1.1099999999999994,-0.36999999999999744],[-0.35999999999999943,0.010000000000005116],[0,0],[-0.5200000000000102,0.4899999999999949],[0,0],[-1.1599999999999966,-0.4200000000000017]],"o":[[0.9200000000000017,-0.10999999999999943],[-0.04999999999999716,0.020000000000003126],[0.5466666666666621,0.4133333333333316],[-0.4099999999999966,-0.7800000000000011],[-0.04000000000000625,0.3400000000000034],[0.519999999999996,-1.1799999999999997],[0.12000000000000455,1.4600000000000009],[0,0],[-0.28000000000000114,1.1000000000000014],[0.06999999999999318,0.5499999999999972],[-0.3299999999999983,1.1799999999999997],[0.7800000000000011,-1.5499999999999972],[0.8199999999999932,-0.3299999999999983],[-0.09000000000000341,0.21000000000000085],[0.04999999999999716,0.8299999999999983],[-0.16666666666666666,-0.4399999999999977],[0.37000000000000455,0.7899999999999991],[-0.269999999999996,0.14000000000000057],[-0.4300000000000068,0.8599999999999994],[0.4000000000000057,-0.36999999999999744],[-0.480000000000004,0.18999999999999773],[-1.2099999999999937,-0.6099999999999994],[0.6500000000000057,-0.9399999999999977],[0.75,-0.06999999999999318],[-0.8900000000000006,0.7600000000000051],[-0.6400000000000006,0.4000000000000057],[-0.9000000000000057,0.28000000000000114],[0,0],[0.29999999999999716,0.09999999999999432],[-0.75,0.2600000000000051],[0,0],[0.730000000000004,-0.480000000000004],[-0.29999999999999716,-0.9399999999999977],[0.9699999999999989,-0.6199999999999974],[-0.20999999999999375,-0.7800000000000011],[-1.0900000000000034,-0.509999999999998],[0.3100000000000023,0.22999999999999687],[0,0],[0.5600000000000023,0.21999999999999886],[0,0],[-0.6500000000000057,-0.9799999999999969],[0,0]],"v":[[92.67,53],[92.75,54.46],[93.33,54.34],[93.33,54.34],[94.78,53.46],[95,53.01],[96.33,54.01],[95.33,55.68],[95.05,55.87],[93.67,58.019999999999996],[92.59,59.529999999999994],[94.33,59.68999999999999],[94.66,61.01999999999999],[94.99,61.68999999999999],[94.66,61.68999999999999],[93.66,62.01999999999999],[93.66,62.01999999999999],[92.33,64.68999999999998],[91.22,64.84999999999998],[90.66,64.34999999999998],[91.33,63.01999999999998],[89.75,63.899999999999984],[89.33,65.35999999999999],[91,66.35999999999999],[91.33,67.02999999999999],[88.66,69.35999999999999],[86.99,68.68999999999998],[84.69,68.31999999999998],[84.33,68.68999999999998],[84.33,69.01999999999998],[82,68.34999999999998],[81.98,67.46999999999998],[82.67,64.68999999999998],[84,64.01999999999998],[86.93,62.219999999999985],[87.34,60.01999999999998],[88.01,58.34999999999998],[89.01,58.67999999999998],[89.39,58.089999999999975],[91.01,57.67999999999998],[91.52000000000001,55.299999999999976],[92.68,53.019999999999975]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2941,0.2784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[89.27024724301037,61.045912153071356]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[89.27024724301037,61.045912153071356]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 575","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 574","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.13999999999998636,-0.040000000000020464],[2.319999999999993,0.3599999999999568],[1,-1.0699999999999932],[0.4800000000000182,-0.08999999999997499],[2.5100000000000193,-0.6299999999999955],[1.700000000000017,-1.3199999999999932],[-2.2299999999999898,-0.29000000000002046],[0,0],[-1.8599999999999852,0.5199999999999818],[-2.25,1.339999999999975],[-1.8100000000000023,0.7599999999999909]],"o":[[0.1699999999999875,-0.060000000000002274],[0.710000000000008,0.2400000000000091],[-0.05000000000001137,0.3199999999999932],[-0.3199999999999932,-0.6299999999999955],[-2.6200000000000045,0.4700000000000273],[-1.8799999999999955,0.4700000000000273],[0.020000000000010232,-1.6100000000000136],[0,0],[1.8000000000000114,-0.7599999999999909],[3.069999999999993,-0.29000000000002046],[1.8000000000000114,-0.7699999999999818],[0,0]],"v":[[217.33,264],[217.8,263.94],[216.67000000000002,267.66],[211.34,271.33000000000004],[209.73,271.21000000000004],[202.42999999999998,273.25000000000006],[196.68999999999997,274.6700000000001],[198.34999999999997,271.6700000000001],[197.01999999999995,271.3400000000001],[202.68999999999994,270.0100000000001],[212.01999999999995,266.6800000000001],[217.34999999999997,264.0100000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7529,0.498,0.349]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[207.5092906330827,269.29695975027437]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[207.5092906330827,269.29695975027437]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 576","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 575","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5300000000000011,-0.9000000000000057],[-0.37000000000000455,-0.6700000000000017],[-0.5400000000000063,-0.7999999999999972],[0.4300000000000068,-0.25],[-0.010000000000005116,-0.12999999999999545],[-0.3100000000000023,-0.6200000000000045],[0.7999999999999972,-0.7600000000000051],[0,0],[0.12000000000000455,0.23000000000000398],[-1.4799999999999898,0.37999999999999545],[0,0],[0.7000000000000028,-0.5699999999999932],[0.12000000000000455,0.3100000000000023],[-0.37999999999999545,0.6400000000000006],[0,0],[0.5900000000000034,-0.480000000000004],[0.3999999999999915,-0.6899999999999977],[2.6599999999999966,-1.3700000000000045],[-0.3100000000000023,0.5900000000000034],[-0.37999999999999545,0.6400000000000006],[0.46999999999999886,1.1200000000000045],[-0.519999999999996,1.0999999999999943],[0,0],[1.4000000000000057,1.1400000000000006],[0.21000000000000796,1.2800000000000011],[-0.6899999999999977,-0.1599999999999966],[0,0],[1.4499999999999886,0.7999999999999972],[0,0],[-0.4399999999999977,0.29000000000000625],[-0.519999999999996,0.9599999999999937],[-0.20000000000000284,0.6299999999999955],[-0.8900000000000006,-0.12000000000000455]],"o":[[0.9399999999999977,-0.06999999999999318],[0.4399999999999977,0.5799999999999983],[-0.20999999999999375,1.019999999999996],[-0.6400000000000006,0.6099999999999994],[-1.0900000000000034,0.6599999999999966],[0,0.0799999999999983],[0.45000000000000284,-0.6099999999999994],[0,0],[-0.09999999999999432,0.23999999999999488],[-0.18000000000000682,2.180000000000007],[0,0],[-0.730000000000004,0.980000000000004],[-0.5499999999999972,0.3100000000000023],[-0.6400000000000006,0.35999999999999943],[0,0],[-0.519999999999996,0.4000000000000057],[0.8499999999999943,0.18999999999999773],[-2.6400000000000006,1.5300000000000011],[-0.46999999999999886,0.4399999999999977],[0.4300000000000068,-0.6200000000000045],[0.9099999999999966,-0.4099999999999966],[0.5699999999999932,-1.0699999999999932],[0,0],[1.9200000000000017,0.730000000000004],[0.7600000000000051,-1.0400000000000063],[-0.14000000000000057,-0.6599999999999966],[0,0],[1.6400000000000006,3.1599999999999966],[0,0],[-0.5999999999999943,0],[-0.04999999999999716,-1.0699999999999932],[-0.4099999999999966,-0.2600000000000051],[-0.8100000000000023,-0.45999999999999375],[0,0]],"v":[[88.33,80],[89.66,81.67],[90.88,83.54],[91.33,85.67],[90.24,86.33],[90.99,87.83],[90.33,89.33],[91.66,90.33],[90.33,91],[90,91],[91.96,93.69],[92.33,94.34],[91,95.67],[90,95.67],[89.42,95.33],[88.67,95],[87,96.33],[87.67,97.66],[80,101.66],[79.67,101.33],[81,99.33],[82,97.33],[83.67,94],[84,93.67],[84.77,93.05],[85.33999999999999,90.00999999999999],[86.66999999999999,88.00999999999999],[87.32,88.25999999999999],[87.5,87.27],[87.34,86.33999999999999],[87.34,85.33999999999999],[88.34,82.00999999999999],[88.01,80.67999999999999],[88.34,80.00999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7255,0.2039,0.1647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[85.92161132690146,90.9448309911001]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[85.92161132690146,90.9448309911001]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 577","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 576","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.4099999999999966,-1.2999999999999972],[0.23999999999999488,-1.0699999999999932],[1.2099999999999937,0.010000000000005116],[1.3400000000000034,0.3199999999999932],[0,0],[0.12999999999999545,-0.9100000000000108],[0.8499999999999943,-1.3399999999999892],[0,0],[0.3400000000000034,-1.3500000000000085],[1.4200000000000017,0.7999999999999972],[-0.06999999999999318,0.480000000000004],[0.8799999999999955,-0.4200000000000017],[0,0],[-0.10999999999999943,-0.519999999999996],[1.0399999999999991,-0.7199999999999989],[-0.8800000000000026,0.3100000000000023],[0.980000000000004,-0.0800000000000125],[0,0],[-0.8999999999999986,0.4300000000000068],[-0.6499999999999986,-0.7000000000000028],[0,0],[1.6199999999999974,0.9200000000000017],[0,2.0600000000000023],[0,0.9399999999999977],[-0.990000000000002,-0.09999999999999432],[0.17999999999999972,-0.7999999999999972],[0.9699999999999989,1.769999999999996],[0.0799999999999983,-1.7199999999999989]],"o":[[0,0],[0.8300000000000054,-0.8799999999999955],[0.45999999999999375,0.2600000000000051],[0.18999999999999773,1.1200000000000045],[0.37999999999999545,0.8400000000000034],[0,0],[0.779999999999994,0],[1.4599999999999937,-0.35999999999999943],[0,0],[0.7800000000000011,-0.23999999999999488],[3.1700000000000017,0.37999999999999545],[-0.18999999999999773,-0.14000000000000057],[-0.20000000000000284,-0.3299999999999983],[0,0],[0.7800000000000011,0],[-1.0900000000000034,0.6099999999999994],[-0.9399999999999977,-0.1599999999999966],[-0.6099999999999994,-0.8900000000000006],[0,0],[-0.9500000000000028,-0.25],[-0.28999999999999915,-0.9099999999999966],[0,0],[1.6499999999999986,-0.769999999999996],[-0.8800000000000026,0.9500000000000028],[-0.45000000000000284,-0.39000000000000057],[-0.75,-0.7800000000000011],[0.9299999999999997,0.14000000000000057],[1.3299999999999983,0.29999999999999716],[-0.740000000000002,-1.019999999999996],[0,0]],"v":[[62.67,94.67],[63.4,94.65],[66,95.01],[66.33,97.01],[65.33,99.01],[63.89,99.79],[63.87,101.03],[65,102.01],[66,103.5],[66.33,104.01],[67,105.68],[65.67,107.01],[65.5,106.07000000000001],[63.33,106.34],[63.66,108.23],[65,109.01],[61.33,111.34],[61.33,110.34],[58.48,109.49000000000001],[58.66,107.68],[58.66,106.01],[59.989999999999995,105.34],[59.959999999999994,104.88000000000001],[59.989999999999995,103.01],[58.66,101.34],[57.989999999999995,99.34],[59.66,96.34],[60.459999999999994,97.87],[60.989999999999995,95.67],[62.66,94.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8627,0.2078,0.1765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[63.0814800569739,102.63711075979768]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[63.0814800569739,102.63711075979768]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 578","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 577","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7299999999999898,-1.7799999999999727],[1.9499999999999886,0.060000000000002274],[-0.1599999999999966,3.019999999999982],[-0.1599999999999966,0.06999999999999318],[1.6599999999999966,-0.3100000000000023],[0,0],[-4.309999999999974,1.25],[0.4399999999999977,-0.8899999999999864]],"o":[[-1.6299999999999955,1.7300000000000182],[-0.7299999999999898,1.7799999999999727],[-4.27000000000001,-0.12999999999999545],[0.0800000000000125,-0.410000000000025],[1.490000000000009,-0.37999999999999545],[0,0],[4.3300000000000125,-0.839999999999975],[0.8899999999999864,-0.17000000000001592],[0,0]],"v":[[211.33,271.33],[209.36,275.53],[200.16000000000003,280.03],[196.31000000000003,271.53999999999996],[196.99000000000004,271.33],[197.39000000000004,272.39],[197.31000000000003,273.51],[210.26000000000002,270.38],[211.32000000000002,271.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.6627,0.502]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[203.8526323625185,275.1794801101227]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[203.8526323625185,275.1794801101227]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 579","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 578","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3100000000000023,-0.47999999999996135],[0.4300000000000068,-5],[1.4399999999999977,1.1899999999999977],[0.44999999999998863,0.40999999999996817],[0.9199999999999875,0.9399999999999977],[0,0]],"o":[[0.7199999999999989,1.6200000000000045],[-2.75,4.350000000000023],[-1.4099999999999966,-1.2300000000000182],[-0.5500000000000114,-0.45999999999997954],[-0.8000000000000114,-0.7099999999999795],[0,0],[0,0]],"v":[[236.33,261.33],[236.01000000000002,262.90999999999997],[232.83,277.65999999999997],[228.64000000000001,273.84999999999997],[226.76000000000002,272.89],[224.32000000000002,268.83],[236.32000000000002,261.32]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9922,0.9922,0.9922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[230.4787017215684,269.4899937272377]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[230.4787017215684,269.4899937272377]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 580","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 579","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.36000000000001364,-1.5500000000000114],[-0.30000000000001137,-3.0900000000000034],[-5.530000000000001,-2.980000000000018],[1.0400000000000205,0.3400000000000034],[-0.15000000000000568,3.920000000000016],[0.05999999999997385,7.610000000000014]],"o":[[0.8700000000000045,1.5300000000000011],[0.6800000000000068,2.8799999999999955],[0.5699999999999932,5.900000000000006],[-1.1399999999999864,0.5099999999999909],[-2.0800000000000125,-3.0500000000000114],[0.28999999999999204,-7.289999999999992],[0,0]],"v":[[160,141],[160.34,146.43],[161.18,154.33],[168.67000000000002,168.66000000000003],[162.9,171.3],[158.68,162.5],[160.01000000000002,141]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8588,0.8667,0.8588]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[163.67152924249174,156.16599188857077]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[163.67152924249174,156.16599188857077]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 581","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 580","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.22999999999998977,0.04999999999999716],[-4.450000000000017,1.1300000000000026],[0.9000000000000057,-3.1600000000000037],[-0.8200000000000216,0.259999999999998],[0.1799999999999784,-0.1599999999999966],[5.72999999999999,-0.2700000000000031],[5.989999999999995,-1.0799999999999983],[3.569999999999993,-2.6500000000000057],[1.4300000000000068,0.3500000000000014],[-6.360000000000014,-0.12999999999999545],[-2.8799999999999955,-0.490000000000002],[-2.1899999999999977,0.8599999999999994]],"o":[[0,0],[4.509999999999991,-0.9799999999999969],[0.4000000000000057,3.1400000000000006],[-0.7599999999999909,-0.3400000000000034],[0.1599999999999966,-0.21000000000000085],[-5.699999999999989,-0.740000000000002],[-5.72999999999999,0.2700000000000031],[-4.489999999999995,0.8100000000000023],[-1.1899999999999977,0.8900000000000006],[3.5999999999999943,-5.100000000000001],[3.069999999999993,0.060000000000002274],[1.9399999999999977,0.6000000000000014],[0,0]],"v":[[148,42],[148.17,41.67],[161,37.33],[161.34,47],[161.17000000000002,46.21],[161.00000000000003,41.33],[144.18000000000004,43.68],[127.92000000000003,42.42],[116.70000000000003,47.870000000000005],[112.33000000000003,50.67],[131.46000000000004,40.04],[140.33000000000004,42],[148.00000000000003,42]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7804,0.5216,0.3686]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[137.03552753094598,44.018247305899706]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[137.03552753094598,44.018247305899706]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 582","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 581","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.060000000000002274,-0.6299999999999955],[0,0],[-1.0600000000000023,-0.3499999999999943],[1.8599999999999994,0.20999999999999375],[-0.12000000000000455,0.980000000000004],[-1.019999999999996,0.4399999999999977],[0,0],[0,0],[0.7999999999999972,-1.8199999999999932],[0.3100000000000023,-0.5499999999999972],[-0.980000000000004,-0.7399999999999949],[3.069999999999993,-1.8100000000000023],[0.6299999999999955,0.14000000000000057],[-0.25,0.9500000000000028],[-1.8599999999999994,-0.8199999999999932],[-1.8499999999999943,-0.9699999999999989],[-0.09000000000000341,0.3299999999999983],[-1.8299999999999983,0.18000000000000682],[-0.5600000000000023,-0.7999999999999972],[0.269999999999996,0.7000000000000028],[0.29000000000000625,0.45000000000000284],[-1.3599999999999994,0.5600000000000023],[-0.5,0.8400000000000034],[-0.9299999999999926,-0.07000000000000739],[-1.4599999999999937,0.09000000000000341],[-0.8599999999999994,-0.25],[-0.12000000000000455,-0.29000000000000625]],"o":[[0.8199999999999932,-0.18000000000000682],[0,0],[-0.7199999999999989,0.7800000000000011],[1.9699999999999989,1.1800000000000068],[-0.7099999999999937,1.0499999999999972],[-1.230000000000004,0.12000000000000455],[0,0],[0,0],[1.269999999999996,-0.0799999999999983],[-0.4300000000000068,0.8299999999999983],[-0.7800000000000011,0.269999999999996],[-1.75,2.9099999999999966],[-0.04000000000000625,-0.7399999999999949],[-0.8499999999999943,0.4899999999999949],[-2,0.8900000000000006],[-0.04999999999999716,-1.3700000000000045],[0.29999999999999716,-0.14000000000000057],[-1.6099999999999994,-0.15000000000000568],[0.10999999999999943,-0.980000000000004],[0.37000000000000455,-0.6299999999999955],[0.4200000000000017,-0.6599999999999966],[-1.5,0.8499999999999943],[-1.3299999999999983,0.060000000000002274],[-0.29999999999999716,-0.8700000000000045],[0.04000000000000625,-1.7199999999999989],[-0.25,-0.8599999999999994],[0.09999999999999432,-0.29000000000000625],[0,0]],"v":[[82.67,81.67],[84,82.34],[84.19,83.06],[84.33,85.67],[83,88.67],[81.79,87.48],[81.82000000000001,88.96000000000001],[82.33000000000001,89.67],[82.63000000000001,90.39],[83.33000000000001,93],[82.00000000000001,95],[81.00000000000001,97],[75.67000000000002,103.67],[74.67000000000002,102.34],[72.34000000000002,100.67],[72.67000000000002,99],[75.36000000000001,98.4],[76.00000000000001,97.67],[76.33000000000001,94.67],[77.66000000000001,94.34],[77.81000000000002,92.34],[78.00000000000001,90.67],[77.39000000000001,88.39],[77.00000000000001,86.67],[79.33000000000001,84.34],[81.66000000000001,82.34],[82.33000000000001,81.67],[82.66000000000001,81.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8118,0.2,0.1647]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[78.15831343732896,92.56123676561415]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[78.15831343732896,92.56123676561415]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 583","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 582","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.37000000000000455,-0.5300000000000011],[0.730000000000004,-0.2700000000000031],[-0.35999999999999943,0.17999999999999972],[-0.18000000000000682,0.01999999999999602],[-0.0799999999999983,-0.5399999999999991]],"o":[[0.37000000000000455,-0.0799999999999983],[0.8400000000000034,0.46999999999999886],[-1.1700000000000017,0.8999999999999986],[0.15000000000000568,-0.0799999999999983],[0.7999999999999972,-0.5399999999999991],[0,0]],"v":[[106.67,41.33],[106.67,42],[106,44],[104.82,41.45],[105.33,41.330000000000005],[106.66,41.330000000000005]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2745,0.2549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[105.86095824616393,42.73520233218804]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[105.86095824616393,42.73520233218804]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 584","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 583","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.1799999999999926,0.14000000000000057],[0,0],[0.4200000000000017,0.13000000000000256],[-0.14999999999999147,-0.1600000000000037],[-1.3299999999999983,0.11999999999999744],[0.04000000000000625,-0.39000000000000057],[0.6800000000000068,-0.4799999999999969],[1.5700000000000074,-0.28999999999999915],[0,0],[0.45000000000000284,1.3900000000000006],[-1.7199999999999989,-0.10999999999999943],[-0.7999999999999972,-0.30999999999999517],[-0.6899999999999977,-0.5300000000000011],[-0.6099999999999994,-0.6400000000000006],[-1.1299999999999955,0.5200000000000031],[-0.29000000000000625,-0.8900000000000006],[0.8499999999999943,-0.25],[0.5999999999999943,1.1799999999999997],[0.7399999999999949,-0.5700000000000003],[0.8199999999999932,0.490000000000002],[1.1899999999999977,0.11999999999999744],[0.5,-0.22000000000000597],[0.7999999999999972,-0.75],[0.5699999999999932,-0.490000000000002],[0.23999999999999488,0.6999999999999957],[-0.25,0.9100000000000037],[0,0],[0.030000000000001137,-0.10000000000000142],[0.20000000000000284,1.6700000000000017],[0.1599999999999966,0.8900000000000006],[0.39000000000000057,-0.010000000000005116],[0.1599999999999966,0.4399999999999977],[0,0],[0.8599999999999994,0.4100000000000037],[-0.4899999999999949,-0.6000000000000014],[0.9299999999999926,-0.1699999999999946],[0.46999999999999886,0.8599999999999994],[-0.6400000000000006,1.0300000000000011],[0.12000000000000455,0.6499999999999986],[-0.12999999999999545,0.8900000000000006],[-0.030000000000001137,0.7600000000000051],[-0.5,0.4200000000000017],[-1.5699999999999932,-0.1599999999999966],[0.23000000000000398,0.8200000000000003],[-1.2399999999999949,0.09000000000000341]],"o":[[1.1299999999999955,0.020000000000003126],[0,0],[-0.1700000000000017,0.46999999999999886],[-0.12000000000000455,0.20000000000000284],[0.8700000000000045,0.9299999999999997],[0.28000000000000114,0.21000000000000085],[0.9500000000000028,-0.240000000000002],[0.7600000000000051,0.9699999999999989],[0,0],[-0.4399999999999977,0.7199999999999989],[-1.6599999999999966,0.6000000000000014],[-0.37999999999999545,-0.7899999999999991],[0.35999999999999943,-1.1899999999999977],[1.1700000000000017,0.25],[-1.0699999999999932,-0.3400000000000034],[0.3299999999999983,-0.8400000000000034],[0.8599999999999994,0.25],[-0.01999999999999602,1.0300000000000011],[0.9399999999999977,-0.13000000000000256],[-0.030000000000001137,0.7899999999999991],[0.14000000000000057,0.7899999999999991],[0.20999999999999375,0.6799999999999997],[0.5799999999999983,0.13000000000000256],[-0.5999999999999943,0.46999999999999886],[-0.7399999999999949,-0.09000000000000341],[-1.019999999999996,0.5799999999999983],[0,0],[-0.8199999999999932,-0.0799999999999983],[-0.45999999999999375,1.4600000000000009],[-0.5100000000000051,-0.22999999999999687],[-0.5,0.4399999999999977],[-0.29000000000000625,-0.22999999999999687],[0,0],[-0.6599999999999966,-0.6199999999999974],[-0.5400000000000063,0.21999999999999886],[-0.20000000000000284,1.2999999999999972],[0.2600000000000051,0.9699999999999989],[-1.2999999999999972,0.5799999999999983],[-1.2199999999999989,-0.00999999999999801],[-0.6400000000000006,0.6400000000000006],[-0.480000000000004,-0.35999999999999943],[-0.5300000000000011,-0.6000000000000014],[1.5900000000000034,-0.1599999999999966],[0.45000000000000284,0.8200000000000003],[1.25,-0.3400000000000034],[0,0]],"v":[[106.33,36.33],[109.78999999999999,36.16],[109.66,36.669999999999995],[108.66,36.99999999999999],[108.64999999999999,37.559999999999995],[112.52999999999999,38.87],[112.98999999999998,39.669999999999995],[113.31999999999998,40.99999999999999],[114.67999999999998,40.35999999999999],[114.31999999999998,39.669999999999995],[112.98999999999998,38.669999999999995],[113.65999999999998,36.99999999999999],[114.32999999999998,36.32999999999999],[117.99999999999999,36.65999999999999],[120.66999999999999,37.98999999999999],[120.33999999999999,36.319999999999986],[123.00999999999999,36.319999999999986],[123.00999999999999,36.98999999999999],[120.67999999999999,37.98999999999999],[121.00999999999999,38.98999999999999],[119.00999999999999,40.65999999999999],[117.44,41.65999999999999],[117.00999999999999,42.99999999999999],[116.67999999999999,44.32999999999999],[114.67999999999999,45.99999999999999],[112.67999999999999,44.669999999999995],[111.74999999999999,43.32999999999999],[111.34999999999998,43.00999999999999],[111.62999999999998,41.79999999999999],[109.01999999999998,42.33999999999999],[108.01999999999998,40.66999999999999],[106.68999999999998,41.33999999999999],[106.01999999999998,40.33999999999999],[105.53999999999998,40.54999999999999],[103.67999999999998,39.33999999999999],[103.36999999999998,40.48999999999999],[101.67999999999998,42.679999999999986],[100.67999999999998,43.009999999999984],[99.67999999999998,42.33999999999998],[97.67999999999998,41.33999999999998],[97.00999999999998,41.009999999999984],[96.33999999999997,39.33999999999998],[96.66999999999997,38.009999999999984],[101.66999999999997,37.33999999999998],[101.99999999999997,37.33999999999998],[106.32999999999997,36.33999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9373,0.2745,0.2549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[109.86487066831634,40.835545370916236]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[109.86487066831634,40.835545370916236]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 585","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 584","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-2.2099999999999795,-0.5099999999999909],[-1.170000000000016,0.34000000000003183],[-0.5699999999999932,-0.0999999999999659],[-2.1799999999999784,-0.37000000000000455],[2.2299999999999898,-1.0600000000000023],[-0.8700000000000045,-0.6299999999999955],[0,0],[2.2299999999999898,0.5400000000000205],[0.9099999999999966,0.13999999999998636],[1.0200000000000102,-0.08999999999997499],[2.960000000000008,0.75],[1.1399999999999864,0.5300000000000296],[-0.9699999999999989,0.5799999999999841],[-1,-0.22999999999996135],[-0.8100000000000023,-0.029999999999972715]],"o":[[2.1999999999999886,0.6000000000000227],[0.38999999999998636,0.5600000000000023],[0.5600000000000023,0.11000000000001364],[1.6100000000000136,0.5099999999999909],[1.3600000000000136,0.2400000000000091],[-1.240000000000009,-0.22000000000002728],[0,0],[-2.219999999999999,0.08999999999997499],[-0.9099999999999966,-0.12000000000000455],[-0.7700000000000102,-0.7200000000000273],[-3.180000000000007,-0.6999999999999886],[0.6899999999999977,0.07999999999998408],[-1.3000000000000114,-0.5699999999999932],[0.020000000000010232,-0.8199999999999932],[0.75,0.18999999999999773],[0,0]],"v":[[215,302.33],[221.67,304.33],[224,304.65999999999997],[225.67,304.98999999999995],[231.33999999999997,306.31999999999994],[233.2,308.8999999999999],[232.82,310.24999999999994],[232.68,310.98999999999995],[226.01000000000002,310.31999999999994],[223.34000000000003,309.98999999999995],[220.34000000000003,309.31999999999994],[211.34000000000003,306.6499999999999],[210.67000000000004,305.9799999999999],[211.20000000000005,303.9599999999999],[212.67000000000004,301.9799999999999],[215.00000000000006,302.3099999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.5647,0.5686,0.5804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[222.02816067643684,306.48207522907967]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[222.02816067643684,306.48207522907967]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 586","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 585","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4900000000000091,-1.5500000000000114],[2.9000000000000057,-1.8600000000000136],[1.0200000000000102,-0.9099999999999966],[1.9499999999999886,-0.6499999999999773],[-0.4099999999999966,0.7600000000000193],[-1.8800000000000239,1.2199999999999989],[-1.259999999999991,0.29000000000002046],[-2,1.1799999999999784],[0,0]],"o":[[0.7299999999999898,1.5800000000000125],[-3.259999999999991,1.1200000000000045],[-1.210000000000008,0.7800000000000011],[-1.3899999999999864,1.25],[-0.4199999999999875,-0.9499999999999886],[1.8000000000000114,-1.3400000000000034],[1.3499999999999943,-0.8700000000000045],[2.0600000000000023,-0.789999999999992],[0,0],[0,0]],"v":[[252.67,242.67],[254,247],[245.29,251.12],[241.17,254],[236.67,258.33],[234.14999999999998,252.99999999999997],[239.7,249.18999999999997],[246.33999999999997,245.32999999999996],[252.43999999999997,242.37999999999997],[252.66999999999996,242.66999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7412,0.4902,0.3412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[244.0525054392658,250.35496831499836]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[244.0525054392658,250.35496831499836]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 587","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 586","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.18000000000000682,0.3300000000000409],[0,0],[0.6099999999999852,-1.339999999999975],[1.700000000000017,-0.7900000000000205],[0.19999999999998863,0.4300000000000068]],"o":[[-0.18999999999999773,-0.5699999999999932],[0,0],[0.18000000000000682,1.490000000000009],[-0.539999999999992,1.2099999999999795],[-1.6100000000000136,0.29000000000002046],[0,0]],"v":[[220.33,266],[219.36,262.71],[232.99,253.99999999999997],[235.17000000000002,259.98999999999995],[223.99,267.34],[220.32000000000002,266.01]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7059,0.702,0.702]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[227.29995083261784,260.6924970982283]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[227.29995083261784,260.6924970982283]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 588","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 587","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.4899999999999949,-0.8199999999999932],[-5.97999999999999,-2.1899999999999977],[1.3299999999999983,-1.2099999999999937],[0.0799999999999983,-0.15000000000000568],[0.6600000000000108,-0.7399999999999949],[3.6200000000000045,1.480000000000004],[2.6400000000000006,1.3299999999999983],[0,0],[0.8200000000000074,3.1099999999999994],[-0.45000000000000284,0.539999999999992],[-0.7999999999999972,-1.25]],"o":[[1.4000000000000057,1.8400000000000034],[4.900000000000006,4.079999999999998],[-1.3899999999999864,1.0499999999999972],[-0.23000000000000398,0.15000000000000568],[-0.37000000000000455,1.1800000000000068],[-1.4000000000000057,-3.0999999999999943],[-2.5400000000000063,-1.0400000000000063],[0,0],[-1.3499999999999943,-2.9099999999999966],[-0.14000000000000057,-0.5499999999999972],[0.6299999999999955,1.230000000000004],[0,0]],"v":[[108.67,94],[113,98],[130.32999999999998,108],[126.65999999999998,110.66],[126.19999999999999,111.11],[124.65999999999998,113.99],[120.07999999999998,107.07],[112.98999999999998,104.33],[110.03999999999998,100.11],[105.96999999999997,91.16],[105.98999999999997,89.67],[108.65999999999997,94]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7412,0.4824,0.3333]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[118.03913705885412,101.8299926685547]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[118.03913705885412,101.8299926685547]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 589","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 588","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4099999999999966,-0.2600000000000051],[-2.9000000000000057,-1.7199999999999989],[0.6500000000000057,-2.960000000000008],[0.789999999999992,-0.01999999999999602],[-0.18999999999999773,0.7299999999999898],[0.03999999999999204,-1.3799999999999955],[0.7900000000000063,-0.5499999999999972],[0.1599999999999966,-0.9399999999999977],[0.7999999999999972,0.39000000000000057],[0.12000000000000455,0.18000000000000682],[-0.06999999999999318,0.28999999999999204],[0,0],[-0.6099999999999994,1.6200000000000045],[-1.8299999999999983,-0.269999999999996],[1.3500000000000085,0.46999999999999886],[0,0],[0.39000000000000057,0.5600000000000023],[0.10999999999999943,1.0799999999999983],[0.269999999999996,0.6799999999999926],[-1.019999999999996,0.18999999999999773],[-0.5400000000000063,0.22000000000001307],[-0.12000000000000455,-0.29000000000000625],[0.21000000000000796,-1.1599999999999966],[1.269999999999996,0.4200000000000017],[0.29000000000000625,0.8399999999999892],[-0.769999999999996,0.9099999999999966]],"o":[[0.5300000000000011,-0.4399999999999977],[1.4899999999999949,3.0999999999999943],[-0.3400000000000034,3.049999999999997],[-0.14000000000000057,0.6500000000000057],[-0.9000000000000057,0.6099999999999994],[-0.8199999999999932,-0.45999999999999375],[0.9099999999999966,-0.35999999999999943],[0.37999999999999545,0.39000000000000057],[0.4899999999999949,0.7600000000000051],[-0.09999999999999432,0.18000000000000682],[-0.519999999999996,0.06999999999999318],[0,0],[-1.3900000000000006,0.010000000000005116],[-1.0799999999999983,-1.5300000000000011],[0.25,-1.8499999999999943],[0,0],[-0.5,-0.5499999999999972],[-0.6099999999999994,-0.1599999999999966],[-0.5900000000000034,0.1599999999999966],[-1.0400000000000063,-0.29999999999999716],[0,-1.1400000000000006],[0.09999999999999432,-0.29000000000000625],[1.4500000000000028,-0.7399999999999949],[0.7399999999999949,0.20999999999999375],[-0.23000000000000398,-0.9099999999999966],[-1.1700000000000017,0.2600000000000051],[0,0]],"v":[[88.33,71.67],[90.99,69.67],[97.94,76.89],[97.17999999999999,86.37],[95.66,88],[95.13,86.34],[92.66,87],[92.99,88],[93.32,90],[92.64999999999999,90.67],[92.32,90.67],[91.64999999999999,90.34],[91.30999999999999,89.79],[89.91999999999999,87.93],[91.30999999999999,85.68],[89.65999999999998,82.21000000000001],[89.63999999999999,81.68],[88.30999999999999,80.01],[87.22999999999999,78.14],[85.97999999999999,77.67],[86.49999999999999,75.37],[87.30999999999999,73.33],[87.63999999999999,73.33],[89.09999999999998,75.47],[89.76999999999998,75.3],[88.97999999999998,72.67],[88.30999999999997,71.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6824,0.2039,0.1608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[91.67927067030399,80.24281074714096]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.67927067030399,80.24281074714096]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 590","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 589","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.11000000000001364,2.9000000000000057],[-1.2299999999999898,0.20000000000000284],[-0.6800000000000068,0.030000000000001137],[-0.4199999999999875,-0.1799999999999926],[0,0],[-1.0999999999999943,3.1599999999999966],[0,0],[-0.950000000000017,-0.1799999999999926],[0.009999999999990905,-0.3500000000000085],[3.3500000000000227,-2.1400000000000006],[4.200000000000017,-7.38000000000001]],"o":[[0,0],[-0.6599999999999966,-2.799999999999997],[-0.5699999999999932,-0.7800000000000011],[0.3499999999999943,-0.5799999999999983],[0,-0.4399999999999977],[0,0],[3.4099999999999966,1.9300000000000068],[0,0],[0.5099999999999909,-0.2600000000000051],[0.4300000000000068,0.0799999999999983],[-3.3700000000000045,2.1099999999999994],[-7.349999999999994,4.689999999999998],[0,0]],"v":[[131,128],[130.55,128],[129.33,119.33],[130,116],[132.33,115],[133.33,114.33],[134.05,114.17],[143.51000000000002,108.21000000000001],[144.33,107.33000000000001],[146.69000000000003,105.82000000000001],[152.66000000000003,109.50000000000001],[142.36,115.53000000000002],[131,128.00000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9882,0.9882,0.9843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[140.81270763389963,116.9021882971432]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[140.81270763389963,116.9021882971432]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 591","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 590","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5900000000000034,-1.0799999999999983],[-0.19999999999998863,-0.7900000000000063],[-1.4699999999999989,-2.8700000000000045],[-3.0700000000000074,-4.170000000000002],[0,0],[3.109999999999985,3.530000000000001],[-0.0799999999999983,2.3000000000000114],[-0.4300000000000068,3.0900000000000034]],"o":[[0.5300000000000011,-0.4899999999999949],[1.3400000000000034,-0.9300000000000068],[0.29000000000000625,3.219999999999999],[1.6200000000000045,4.8799999999999955],[0,0],[-4.180000000000007,-2.1099999999999994],[-1.5100000000000051,-1.7099999999999937],[0.09999999999999432,-2.9399999999999977],[0,0]],"v":[[99.33,78.67],[101.01,79.55],[103.33,79.34],[106,89.67],[113.29,103.58],[113,104.34],[101.68,95.83],[98,89.17999999999999],[99.34,78.66999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.6706,0.5059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[105.64399904334891,91.38970683169805]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[105.64399904334891,91.38970683169805]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 592","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 591","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.4300000000000068,-1.3200000000000074],[1.6699999999999875,-0.10999999999999943],[0.75,0.010000000000005116],[-0.160000000000025,-1.5799999999999983],[-0.15000000000000568,-2.989999999999995],[2.299999999999997,-3.4099999999999966],[-0.6700000000000017,0.3100000000000023],[0,0],[-0.29000000000000625,0.160000000000025],[0,0],[-0.5900000000000034,0.7700000000000102],[0,0],[-0.6500000000000057,0.29999999999999716],[0,0],[-0.5600000000000023,0.3200000000000074],[-0.10000000000000853,0.46999999999999886],[0.05000000000001137,1.1099999999999994],[-1.3599999999999994,-1.210000000000008],[0.09999999999999432,0.39000000000000057],[-0.06999999999999318,-0.030000000000001137],[-0.030000000000001137,-0.20000000000000284],[-4.859999999999999,0.8499999999999943]],"o":[[2.430000000000007,-0.8700000000000045],[0.6200000000000045,1.230000000000004],[-0.36000000000001364,0.6800000000000068],[-0.5999999999999943,1.2999999999999972],[0.7400000000000091,3.010000000000005],[-2.009999999999991,3.5600000000000023],[-0.7199999999999989,0.1599999999999966],[0,0],[-0.29999999999999716,-0.060000000000002274],[0,0],[-0.5400000000000063,-0.8199999999999932],[0,0],[-0.6500000000000057,-0.29999999999999716],[0,0],[-0.6500000000000057,-0.04999999999999716],[-0.23999999999999488,-0.4000000000000057],[-0.46999999999999886,-0.4099999999999966],[-0.5999999999999943,-1.1400000000000006],[1.4399999999999977,0.1700000000000017],[0.12000000000000455,0.01999999999999602],[0.1599999999999966,0.06999999999999318],[2.9099999999999966,-2.969999999999999],[0,0]],"v":[[131,109.67],[134,110.34],[132,114.67],[129.67,115.67],[129,120],[130.33,129],[124.33000000000001,139.67],[124.00000000000001,137.67],[123.67000000000002,135.67],[123.67000000000002,135.33999999999997],[123.34000000000002,132.67],[123.01000000000002,128.67],[122.68000000000002,125.99999999999999],[122.68000000000002,124.99999999999999],[122.35000000000002,123.32999999999998],[122.35000000000002,122.65999999999998],[122.02000000000002,121.32999999999998],[121.23000000000002,119.04999999999998],[121.69000000000001,117.66999999999999],[123.69000000000001,117.33999999999999],[124.02000000000001,117.33999999999999],[124.36000000000001,117.99999999999999],[131.02,109.66999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9882,0.9882,0.9843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[127.45731614854071,124.41480873715119]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[127.45731614854071,124.41480873715119]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 593","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 592","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6000000000000227,-2.4399999999999977],[0.3900000000000148,-0.17000000000001592],[0.8700000000000045,-1.339999999999975],[0.20000000000001705,-0.36000000000001364],[0.6699999999999875,-0.16999999999995907],[1.7600000000000193,4.009999999999991],[-0.8499999999999943,0.5099999999999909],[-5.570000000000022,2.1599999999999966],[0,0]],"o":[[0.7599999999999909,2.3799999999999955],[-0.01999999999998181,0.13999999999998636],[-1.1299999999999955,0.4399999999999977],[-0.6200000000000045,1.3899999999999864],[-0.20000000000001705,0.36000000000001364],[-6.039999999999992,1.5],[0.09000000000000341,-0.6499999999999773],[3.5500000000000114,-4.860000000000014],[0,0],[0,0]],"v":[[254,247],[256.36,254.13],[254,255.34],[251,258.01],[250.26,262.27],[244.34,265.84999999999997],[236.66,258.34],[238.06,256.59],[252.89000000000001,246.68999999999997],[253.99,247.00999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9255,0.6667,0.5059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[246.50999635819753,256.40623914470603]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[246.50999635819753,256.40623914470603]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 594","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 593","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.09999999999999432,0],[0.5499999999999972,3.1700000000000017],[-1.289999999999992,0.2700000000000031],[-7.790000000000006,1.1099999999999994],[-9.869999999999976,-1.8299999999999983],[0.8100000000000023,-2.120000000000001],[2.089999999999975,0.259999999999998],[7.22999999999999,-0.8499999999999979],[15.200000000000003,-1.4600000000000009]],"o":[[-0.5799999999999983,0.060000000000002274],[-2.5999999999999943,0.14999999999999858],[0.28000000000000114,-1.1700000000000017],[7.6200000000000045,-1.629999999999999],[10.909999999999997,-1.5500000000000007],[1.5300000000000011,0.28000000000000114],[-1.1200000000000045,2.9299999999999997],[-7.189999999999998,-0.879999999999999],[-15.310000000000002,1.8099999999999987],[0,0]],"v":[[90.67,37.33],[89.34,37.66],[83.37,35.19],[91.33,32.48],[115.55,28.699999999999996],[159.42,24.739999999999995],[165.51,28.629999999999995],[159.81,29.339999999999996],[136.84,30.649999999999995],[90.67,37.309999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0824,0.098,0.1059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[124.48139225745126,31.040961968859534]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[124.48139225745126,31.040961968859534]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 595","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 594","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-3.020000000000003,-10.099999999999994],[-6.789999999999999,-6.110000000000014],[-0.45000000000000284,-0.6400000000000148],[-0.1700000000000017,-0.6599999999999966],[1.1799999999999926,0.03999999999999204],[1.960000000000008,1.1800000000000068],[5.770000000000003,1.9699999999999989],[0.8800000000000026,-0.28999999999999204],[0,0],[0,0],[0.11999999999999744,0.5100000000000193],[0.1700000000000017,0.7599999999999909],[0.11999999999999744,0.37999999999999545],[-0.8100000000000023,1.3100000000000023],[0.3400000000000034,0.5200000000000102],[0,0],[-1.3000000000000043,7.22999999999999],[0.4399999999999977,-0.020000000000010232]],"o":[[0,0],[0,0],[0.9600000000000009,10.509999999999991],[2.5700000000000003,8.599999999999994],[0.8700000000000045,0.7800000000000011],[0.45000000000000284,0.6400000000000148],[0.10999999999999943,0.4399999999999977],[-1.75,-1.490000000000009],[-5.210000000000001,-3.1299999999999955],[0.5,-0.8100000000000023],[0,0],[0,0],[0.3100000000000023,-0.4900000000000091],[-1.6799999999999997,-0.25],[-0.10999999999999943,-0.5],[-0.2700000000000031,-0.8400000000000034],[-0.10999999999999943,-0.36000000000001364],[0,0],[-1.9799999999999969,-6.969999999999999],[-0.4399999999999977,0],[0,0]],"v":[[43.33,158],[45.809999999999995,155.31],[49.66,148],[55.5,179],[69.16,204.67000000000002],[73.03,207.47000000000003],[73.42,209.41000000000003],[73.51,210.66000000000003],[67.78,206.72000000000003],[51,198.66000000000003],[50,197.32000000000002],[50.66,196.83],[49.33,195.49],[50.32,194.66],[49.32,192.19],[48.78,189.98],[47.99,187.32],[47.32,185.98999999999998],[47.13,179.83999999999997],[44.660000000000004,157.98999999999998],[43.330000000000005,157.98999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.102,0.1216,0.1294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[58.68282131278221,179.33066625959003]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[58.68282131278221,179.33066625959003]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 596","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 595","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[8.820000000000022,1.009999999999991],[0.8300000000000125,0.5999999999999943],[1.490000000000009,6.700000000000017],[-1.1800000000000068,1.3400000000000034],[-0.3200000000000216,0.20000000000001705],[-0.75,-0.0700000000000216],[-1.3799999999999955,2.789999999999992],[-0.3200000000000216,0.6100000000000136],[-0.7199999999999989,1.5300000000000011],[-3.430000000000007,1.4899999999999807],[1.2099999999999795,-10.939999999999998]],"o":[[-7.060000000000002,4.72999999999999],[-0.9699999999999989,-0.11000000000001364],[4.650000000000006,-4.800000000000011],[1.6200000000000045,-0.7599999999999909],[0.5999999999999943,-0.6800000000000068],[0.4300000000000068,-0.2599999999999909],[3.0900000000000034,0.28000000000000114],[0.3199999999999932,-0.6500000000000057],[0.5500000000000114,-1.0300000000000011],[1.3100000000000023,-2.789999999999992],[0.46000000000000796,11.009999999999991],[0,0]],"v":[[156.67,170],[133.52999999999997,177.31],[129.66999999999996,176],[133.38999999999996,161.39],[137.66999999999996,157.83999999999997],[139.99999999999997,154.47999999999996],[142.49999999999997,154.99999999999997],[150.91999999999996,150.40999999999997],[151.52999999999997,148.34999999999997],[154.39999999999998,144.87999999999997],[158.83999999999997,136.98999999999998],[156.67,169.98999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9882,0.9882,0.9804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[144.29938135473546,157.23558085393495]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[144.29938135473546,157.23558085393495]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 597","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 596","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.21999999999999886,-1.019999999999996],[1.8700000000000045,-7.1299999999999955],[2.7700000000000102,-6.079999999999998],[-2.0999999999999943,-1.4100000000000108],[-1.8499999999999943,-3.1799999999999926],[0.15000000000000568,-0.8100000000000023],[6.800000000000011,0.519999999999996],[1.2099999999999795,-0.8100000000000023],[-0.09999999999999432,0.6300000000000097],[-0.950000000000017,0.8599999999999994],[-0.5300000000000011,1.3799999999999955],[0.6299999999999955,1],[0.6100000000000136,0.19999999999998863],[0,0],[0.46000000000000796,1.039999999999992],[-1.5699999999999932,-0.4399999999999977],[-1.5,-0.09000000000000341],[-1.0600000000000023,0.6099999999999994],[0,0],[-1.700000000000017,-1.0699999999999932],[-0.5500000000000114,-0.009999999999990905],[-0.0800000000000125,-0.960000000000008],[0,0],[-1.1899999999999977,-0.8900000000000006],[-1.6500000000000057,0.060000000000002274],[-0.4099999999999966,1.6400000000000006],[0,0],[-0.12000000000000455,-0.5400000000000063]],"o":[[0.05000000000001137,0.9300000000000068],[-1.5200000000000102,7.189999999999998],[-3.75,-1.7199999999999989],[-1.0699999999999932,2.6200000000000045],[3.8600000000000136,1.6700000000000017],[0.30000000000001137,0.7900000000000063],[-5.969999999999999,-3.469999999999999],[-1.1399999999999864,-0.25],[-0.19999999999998863,-0.37000000000000455],[-0.18999999999999773,-1.2800000000000011],[0.5300000000000011,-1.3700000000000045],[1.509999999999991,0.18999999999999773],[0.7800000000000011,-0.8599999999999994],[0,0],[1.4799999999999898,0.3299999999999983],[-0.06999999999999318,-1.8199999999999932],[0.2400000000000091,-1.0699999999999932],[0.21000000000000796,-1.5699999999999932],[0,0],[0.9199999999999875,-1.5999999999999943],[-0.2599999999999909,-0.7800000000000011],[0.8100000000000023,0.010000000000005116],[0,0],[0.5200000000000102,-0.9300000000000068],[1.6500000000000057,-0.3100000000000023],[0.4199999999999875,1.3199999999999932],[0,0],[0.37000000000000455,-0.4099999999999966],[0,0]],"v":[[215.67,71.67],[215.57999999999998,73.73],[208.99999999999997,95.34],[191.66999999999996,91.67],[194.76999999999995,98.07000000000001],[203.33999999999995,105.34],[204.17999999999995,108],[184.33999999999995,103],[180.82999999999996,103.84],[180.66999999999996,102.33],[181.99999999999997,98.33],[183.58999999999997,94.2],[184.73999999999998,90.84],[184.98999999999998,89.24000000000001],[186.51999999999998,84.30000000000001],[188.05999999999997,83.23000000000002],[190.30999999999997,81.17000000000002],[192.92,79.70000000000002],[194.82999999999998,76.42000000000002],[195.82999999999998,74.46000000000002],[198.67,73.59000000000002],[201.42,70.78000000000002],[202.78,71.82000000000002],[204.06,72.07000000000002],[206.62,72.01000000000002],[211.58,71.46000000000002],[212.83,70.98000000000002],[214.33,71.00000000000001],[215.66000000000003,71.67000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.2941,0.3176,0.3373]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[198.17441193456855,89.38996997393502]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[198.17441193456855,89.38996997393502]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 598","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 597","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3499999999999943,-2.700000000000003],[-7.5,-7.8500000000000085],[-0.6899999999999977,0.7600000000000051],[-0.9399999999999977,1.5900000000000034],[-5.599999999999994,-0.6300000000000097],[-0.5600000000000023,-0.12000000000000455],[-0.8600000000000136,-0.23999999999999488],[-1.1800000000000068,-0.0799999999999983],[-1.5900000000000034,-5.4199999999999875],[2.5999999999999943,-4.349999999999994],[11.959999999999994,6.700000000000003],[2.9099999999999966,6.689999999999998],[-0.4200000000000017,6.5],[-0.20000000000000284,0.4899999999999949],[-0.6200000000000045,0.490000000000002],[-0.5699999999999932,-0.14999999999999858]],"o":[[-1.3499999999999943,2.299999999999997],[-1.519999999999996,11.730000000000004],[0.4399999999999977,0.45999999999999375],[1.0900000000000034,-1.2000000000000028],[3.8499999999999943,-6.489999999999995],[0.8700000000000045,0.09999999999999432],[0.5999999999999943,0.12999999999999545],[1.0200000000000102,0.29000000000000625],[4.090000000000003,0.28000000000000114],[1.490000000000009,5.099999999999994],[-7.740000000000009,12.939999999999998],[-6.189999999999998,-3.469999999999999],[-2.5,-5.769999999999996],[0.04999999999999716,-0.7899999999999991],[0.14000000000000057,-0.3400000000000034],[0.3299999999999983,-0.259999999999998],[0,0]],"v":[[110.67,52.34],[108.37,60.870000000000005],[118.52000000000001,85.33000000000001],[119.69000000000001,86.13000000000001],[122.42000000000002,80.27000000000001],[138.17000000000002,78.67000000000002],[140.71,78.51000000000002],[142.52,79.65000000000002],[147.83,80.36000000000001],[154.58,83.93],[150.79000000000002,97.96000000000001],[122.78000000000002,103.06],[106.50000000000001,87.67],[104.31000000000002,61.5],[104.84000000000002,57.34],[109.66000000000003,52.830000000000005],[110.66000000000003,52.34]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0706,0.0902,0.0902]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[129.5649653290617,80.12845931409765]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[129.5649653290617,80.12845931409765]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 599","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 598","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.160000000000025,0.22999999999998977],[-3.7399999999999807,2.6999999999999886],[0.15000000000000568,-0.29999999999998295],[0.8100000000000023,-3.450000000000017],[-0.4000000000000057,0.789999999999992],[-2.210000000000008,7.849999999999994],[0,0],[-7.529999999999973,5.27000000000001],[0.2699999999999818,-0.9499999999999886],[0.7800000000000011,-1.3300000000000125],[11.560000000000002,-5.2099999999999795],[1.0900000000000034,1.9299999999999784],[0.3300000000000125,3.3799999999999955],[0.09000000000000341,4.310000000000002],[-0.21999999999999886,0.7299999999999898],[-0.5800000000000125,0.6700000000000159],[5.610000000000014,-1.3900000000000006],[0.6999999999999886,0.09999999999999432],[1.5200000000000102,0.2600000000000051],[-0.7299999999999898,-0.18999999999999773],[-2.719999999999999,-3.75],[2.039999999999992,-1.539999999999992],[1.8400000000000034,-4.010000000000019]],"o":[[0.060000000000002274,0.44999999999998863],[2.509999999999991,-3.8499999999999943],[0.5099999999999909,0.27000000000001023],[-1.5,2.990000000000009],[-0.18000000000000682,1.009999999999991],[3.3700000000000045,-7.280000000000001],[0,0],[3.009999999999991,8.210000000000008],[0.4900000000000091,-0.28999999999999204],[-0.4199999999999875,1.4399999999999977],[-12.379999999999995,2.6999999999999886],[-2.289999999999992,0.3400000000000034],[-1.6899999999999977,-2.990000000000009],[-0.21999999999999886,-4.389999999999986],[0,-1.1299999999999955],[0.1599999999999966,-0.5300000000000011],[3.5200000000000102,-4.069999999999993],[-0.8100000000000023,0.20000000000000284],[-0.960000000000008,-0.13999999999998636],[1.509999999999991,-0.9300000000000068],[2.289999999999992,0.5999999999999943],[0.38999999999998636,3.1399999999999864],[-3.539999999999992,2.6699999999999875],[0,0]],"v":[[169.33,162.33],[169.66000000000003,162.66000000000003],[178.83,153.00000000000003],[178.59,154.10000000000002],[174.99,162.34000000000003],[175.32000000000002,162.67000000000004],[186.66000000000003,141.01000000000005],[187.07000000000002,145.43000000000004],[205.99,151.68000000000004],[206.32000000000002,152.68000000000004],[204.92000000000002,156.95000000000005],[168.65,168.68000000000004],[163,164.01000000000005],[160.47,154.05000000000004],[159.99,141.01000000000005],[159.71,136.91000000000005],[161.98000000000002,134.83000000000004],[157.64000000000001,127.16000000000004],[154.54000000000002,128.60000000000005],[148.32000000000002,124.51000000000005],[160.76000000000002,116.04000000000005],[181.51000000000002,148.01000000000005],[176.35000000000002,153.54000000000005],[169.32000000000002,162.34000000000006]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9882,0.9843,0.9804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[177.3919695149725,142.3712480652544]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[177.3919695149725,142.3712480652544]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 600","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 599","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.299999999999983,-7.280000000000001],[2.1899999999999977,-1.5300000000000011],[0.9900000000000091,-0.3499999999999943],[1.9300000000000068,-0.9300000000000068],[-3.3400000000000034,-3.950000000000003],[1.6999999999999886,-1.4199999999999875],[0.25,0.09999999999999432],[0.10000000000002274,0.1799999999999784],[1.1299999999999955,0.8600000000000136],[2.3499999999999943,1.259999999999991],[-0.29999999999998295,-0.4300000000000068],[7.6200000000000045,-7.550000000000011],[4.019999999999982,1.3700000000000045],[-1.0600000000000023,-1.2800000000000011],[-0.7199999999999989,-0.46000000000000796],[-0.28999999999999204,-1.460000000000008],[3.4499999999999886,1.4299999999999784],[0,0],[0,0],[0.8499999999999943,-0.789999999999992],[-0.04999999999998295,-0.47999999999998977],[1.1500000000000057,-1.3700000000000045],[0.28000000000000114,-0.7199999999999989],[1.759999999999991,-1.1999999999999886],[1,0.1599999999999966],[-1.3799999999999955,4.689999999999998],[-0.6099999999999994,0.8000000000000114],[-0.980000000000004,1.5500000000000114],[-6.6200000000000045,4.510000000000005],[-3.8000000000000114,2.049999999999997],[-0.009999999999990905,0.4399999999999977]],"o":[[2.039999999999992,-1.019999999999996],[-0.5600000000000023,1.7800000000000011],[-1.3199999999999932,0.9200000000000017],[-1.8000000000000114,0.6299999999999955],[4.400000000000006,2.3599999999999994],[1.4699999999999989,1.5200000000000102],[-0.09000000000000341,0.0800000000000125],[-0.09000000000000341,-0.19999999999998863],[-0.8300000000000125,-1.1699999999999875],[-2.219999999999999,-1.4699999999999989],[-0.5200000000000102,-0.21000000000000796],[3.8799999999999955,4.289999999999992],[-2.1500000000000057,-3.539999999999992],[1.0300000000000011,1.3000000000000114],[0.6100000000000136,0.8700000000000045],[0.9199999999999875,1.039999999999992],[0.8100000000000023,4.099999999999994],[0,0],[0,0],[-0.3400000000000034,-0.6699999999999875],[-0.28999999999999204,0.27000000000001023],[0.1699999999999875,1.5800000000000125],[-0.6399999999999864,0.37000000000000455],[-2.530000000000001,2.1200000000000045],[-0.7599999999999909,0.5200000000000102],[-3.25,-3.3799999999999955],[0.1599999999999966,-0.5600000000000023],[1.1099999999999994,-1.460000000000008],[4.400000000000006,-6.889999999999986],[3.5500000000000114,-2.4200000000000017],[0.8899999999999864,-0.04000000000000625],[0,0]],"v":[[154,110.67],[166.18,109.69],[153.56,119.07],[147.31,123.83999999999999],[141.66,122.83999999999999],[154.66,130.67],[155.21,138.42999999999998],[154.66,138.33999999999997],[154.32999999999998,137.67],[151.32999999999998,134.67],[144.32999999999998,130.67],[143.99999999999997,131],[151.49999999999997,146.33],[142.32999999999998,137.67000000000002],[145.66,141.33],[147.66,143.33],[150.26,147.24],[140.66,153.32000000000002],[142,149.99],[143.99,150.83],[140.33,147.33],[141,148.84],[136.66,157],[134.99,158.67],[128.87,161.70999999999998],[124.54,165.98],[118.4,149.91],[121.99000000000001,145.82999999999998],[125.14000000000001,141.30999999999997],[139.69000000000003,118.85999999999997],[151.33000000000004,111.99999999999997],[154.00000000000003,110.66999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.6706,0.5059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[142.29806208810786,136.23285517768244]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[142.29806208810786,136.23285517768244]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 601","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 600","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.7800000000000011,-2.0600000000000023],[-0.5600000000000023,-2.5900000000000034],[0.9499999999999886,-2.700000000000003],[0.8599999999999852,-2.3499999999999943],[-0.14999999999997726,-0.46999999999999886],[1.4799999999999898,-4.25],[0.1599999999999966,-2.140000000000015],[0.5,-0.5300000000000011],[-0.7099999999999795,-0.13000000000002387],[0.8000000000000114,0],[1.740000000000009,0.6699999999999875],[-0.8400000000000034,4.469999999999999],[-1.4199999999999875,0.21999999999999886],[0.46000000000000796,0.799999999999983],[-0.9699999999999989,2.4099999999999966],[-0.47999999999998977,0.07999999999998408],[-0.9399999999999977,0.5],[0.5600000000000023,3.3900000000000006],[-1.9000000000000057,-0.6800000000000068],[-1.1900000000000261,-0.20999999999999375],[-2.6999999999999886,-1.2399999999999949],[0.37000000000000455,0.3400000000000034],[5.219999999999999,2.8100000000000023],[-2.079999999999984,0.45000000000000284],[-2.0200000000000102,-0.3100000000000023],[-5.650000000000006,-2.6899999999999977],[0.46999999999999886,0.25],[3.430000000000007,1.2000000000000028],[2.079999999999984,0.539999999999992],[-2.259999999999991,1.8799999999999955],[-2.1399999999999864,-0.5900000000000034],[-4.069999999999993,-1.3700000000000045],[-0.7299999999999898,-0.37999999999999545],[-1.1000000000000227,-0.3400000000000034],[0.1799999999999784,0.4099999999999966],[0.5100000000000193,0.769999999999996],[2.309999999999974,2.469999999999999],[2,2.680000000000007],[-3.509999999999991,-0.4899999999999949]],"o":[[2.6299999999999955,0.4000000000000057],[1.7800000000000011,2.0600000000000023],[-0.1599999999999966,2.8499999999999943],[-0.8000000000000114,2.4000000000000057],[-0.4300000000000068,0.3100000000000023],[-1.5600000000000023,4.239999999999995],[-0.7800000000000011,1.1899999999999977],[-0.38999999999998636,1.3400000000000034],[-1.5900000000000034,0.09000000000000341],[-0.46999999999999886,0.12000000000000455],[-1.8100000000000023,-0.4399999999999977],[-3.8600000000000136,-2.280000000000001],[1.1100000000000136,0.060000000000002274],[-0.05000000000001137,-0.9099999999999966],[-1.259999999999991,-2.210000000000008],[0.21000000000000796,-0.5200000000000102],[0.6899999999999977,-0.12000000000000455],[-1.789999999999992,-3.2700000000000102],[-0.7299999999999898,-4.450000000000003],[1.0300000000000011,0.6700000000000017],[2.710000000000008,1.2099999999999937],[0.13999999999998636,-0.6400000000000006],[-4.930000000000007,-4.5],[-2.319999999999993,-1.25],[1.9799999999999898,0.5799999999999983],[6.060000000000002,1.6899999999999977],[0.6200000000000045,-0.5999999999999943],[-3.1899999999999977,-1.7600000000000051],[-1.8400000000000034,-0.6899999999999977],[-2.3799999999999955,-0.6500000000000057],[1.8600000000000136,-0.5900000000000034],[4.3799999999999955,0.6299999999999955],[0.7400000000000091,0.3199999999999932],[1.509999999999991,0.7999999999999972],[0.4199999999999875,0.12999999999999545],[-0.4000000000000057,-0.9399999999999977],[-1.3799999999999955,-2.0799999999999983],[-2.309999999999974,-2.469999999999999],[-1.5699999999999932,-3.9399999999999977],[0,0]],"v":[[197.67,91],[210.01,98.16],[215,108.67],[213.33,117],[210.66000000000003,124],[210.33,125.33],[205.33,138],[203.33,144.33],[201.33,152.33],[200,152.66000000000003],[198.67,152.99000000000004],[193.33999999999997,151.32000000000005],[188.33999999999997,140.66000000000005],[190.99999999999997,142.32000000000005],[189.59999999999997,140.22000000000006],[188.69999999999996,132.52000000000007],[190.54999999999995,130.36000000000007],[193.66999999999996,131.83000000000007],[181.33999999999995,122.14000000000007],[188.66999999999996,120.67000000000007],[191.99999999999997,122.00000000000007],[199.99999999999997,126.00000000000007],[199.30999999999997,124.86000000000007],[182.43999999999997,116.73000000000008],[182.00999999999996,111.00000000000007],[188.00999999999996,112.33000000000007],[205.33999999999997,119.33000000000007],[201.00999999999996,115.83000000000007],[190.66999999999996,111.67000000000007],[184.78999999999996,109.82000000000008],[182.66999999999996,105.00000000000009],[188.66999999999996,105.00000000000009],[201.33999999999995,108.00000000000009],[203.56999999999994,108.94000000000008],[209.17999999999995,112.66000000000008],[209.66999999999996,112.17000000000009],[206.51999999999995,109.32000000000009],[202.84999999999997,101.32000000000009],[193.66999999999996,95.00000000000009],[197.66999999999996,91.00000000000009]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.6706,0.5059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[197.78340766116506,121.91968833446526]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[197.78340766116506,121.91968833446526]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 602","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 601","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.0800000000000125,-1.0200000000000387],[-2.3799999999999955,2.6100000000000136],[-0.11000000000001364,-0.7900000000000205],[-0.8300000000000125,-0.6899999999999977],[-0.9300000000000068,-0.7000000000000455],[-4.150000000000006,0.6299999999999955],[-0.9000000000000057,0.05000000000001137],[0,0],[-3.5600000000000023,1.2000000000000455],[-3.8400000000000034,-2.080000000000041],[-2.6200000000000045,-3.1100000000000136],[2.569999999999993,-1.3199999999999932],[10.800000000000011,2.8999999999999773],[6.5,2.579999999999984],[-0.12000000000000455,2.6000000000000227],[-0.8000000000000114,2.5400000000000205],[-1.3899999999999864,2.2999999999999545],[0,0],[-4.150000000000006,1.2899999999999636],[-0.5600000000000023,0],[-1.6500000000000057,0.07999999999998408]],"o":[[0.15000000000000568,0],[-3.460000000000008,3.2200000000000273],[-0.28000000000000114,1.1899999999999977],[0.11000000000001364,0.7900000000000205],[1.740000000000009,1.4499999999999886],[1.6599999999999966,2.1999999999999886],[0.9900000000000091,-0.14999999999997726],[0,0],[3.3300000000000125,-1.7200000000000273],[4.9199999999999875,-1.670000000000016],[3.6399999999999864,1.9700000000000273],[2.1000000000000227,2.480000000000018],[-10.189999999999998,5.230000000000018],[-6.840000000000003,-1.839999999999975],[-1.9300000000000068,-0.7699999999999818],[0.12000000000000455,-2.6000000000000227],[0.7599999999999909,-2.3999999999999773],[0,0],[1.1500000000000057,4.350000000000023],[1.3000000000000114,-0.39999999999997726],[1.6599999999999966,0],[0,0]],"v":[[215.17,277.33],[215.67,277.49],[218.67,279.33],[219.95,282.56],[220.01,285.16],[224.35999999999999,284.14000000000004],[227.16,289.64000000000004],[229.35,288.66],[228.35,292.32000000000005],[238.62,287.1],[247.45000000000002,289.71000000000004],[259.67,296.82000000000005],[258.11,301.26000000000005],[218.99,302.1700000000001],[195.5,294.6600000000001],[189.02,289.87000000000006],[191.8,280.02000000000004],[194.34,272.99000000000007],[194.75,276.4100000000001],[203.68,280.8300000000001],[210.17000000000002,277.3200000000001],[215.17000000000002,277.3200000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0863,0.102,0.1059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[224.89767503557695,288.87832398489206]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[224.89767503557695,288.87832398489206]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 603","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 602","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.9899999999999523,-1.240000000000009],[0.39999999999997726,-0.07999999999998408],[0.6199999999999477,-0.9900000000000091],[-0.4000000000000341,-1.410000000000025],[-1.339999999999975,0.7800000000000296],[-0.6399999999999864,0.3499999999999659],[-1.8799999999999955,-0.7099999999999795],[0,0],[0,0],[0,0],[0,0],[-0.8499999999999659,-1.490000000000009],[-0.18000000000000682,-0.2300000000000182],[-0.17000000000001592,-1.5500000000000114],[-2.509999999999991,-0.3199999999999932],[-1.5400000000000205,-0.5099999999999909],[-2.6499999999999773,-3.3899999999999864],[1.6899999999999977,-0.8100000000000023],[20.439999999999998,3.769999999999982],[0.36000000000001364,1.2200000000000273],[-1.1399999999999864,-0.060000000000002274],[-2.3799999999999955,-0.6399999999999864],[0.6299999999999955,1.5300000000000296],[0.4800000000000182,1.3000000000000114],[-2.0200000000000102,-0.4199999999999591],[-5.6299999999999955,-1.1399999999999864],[0.4399999999999977,-0.82000000000005],[-2.559999999999974,1.1200000000000045],[-1.0699999999999932,0.7699999999999818],[-2.5500000000000114,-3.170000000000016]],"o":[[-2.2799999999999727,0.5199999999999818],[-0.589999999999975,0.36000000000001364],[-0.6999999999999886,0.14999999999997726],[2.319999999999993,1.25],[0.8500000000000227,3.0500000000000114],[0.5199999999999818,-0.30000000000001137],[1.7099999999999795,-0.9399999999999977],[0,0],[0,0],[0,0],[0,0],[0.6399999999999864,1.4499999999999886],[1.6499999999999773,2.8899999999999864],[-0.36000000000001364,1.5500000000000114],[1.8700000000000045,-1.6800000000000068],[1.1100000000000136,0.13999999999998636],[4.25,1.3999999999999773],[1.5400000000000205,1.9800000000000182],[-19.970000000000027,9.689999999999998],[-1,-1.4300000000000068],[-0.36000000000001364,-1.2200000000000273],[1.6100000000000136,1.7699999999999818],[-1.259999999999991,-1.25],[-0.4000000000000057,-0.9399999999999977],[1.2299999999999898,1.3100000000000023],[5.219999999999999,1.079999999999984],[-0.03999999999999204,0.9300000000000068],[-1.4699999999999989,2.75],[1.6000000000000227,-0.6999999999999886],[2.579999999999984,-1.839999999999975],[0,0]],"v":[[270.33,264],[263.55,266.73],[261.78000000000003,268.29],[260.00000000000006,268.17],[260.80000000000007,271.02000000000004],[266.93000000000006,269.41],[268.86000000000007,268.39000000000004],[275.6500000000001,267.35],[269.7700000000001,270.98],[268.6600000000001,270.02000000000004],[268.6600000000001,271.69000000000005],[267.99000000000007,271.3500000000001],[267.63000000000005,274.5300000000001],[272.65000000000003,274.0200000000001],[272.65000000000003,278.3500000000001],[282.45000000000005,271.68000000000006],[288.80000000000007,274.36000000000007],[306.32000000000005,281.18000000000006],[303.72,285.26000000000005],[241.08000000000004,283.75000000000006],[234.72000000000003,278.78000000000003],[235.48000000000002,269.36],[241.98000000000002,273.68],[235.81000000000003,269.01],[236.66000000000003,264.02],[240.57000000000002,267.60999999999996],[255.99,263.35999999999996],[254.59,265.46],[257.77,268.31],[261,265.54],[270.32,264.02000000000004]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0824,0.102,0.1059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[270.654649572464,276.31710270440624]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[270.654649572464,276.31710270440624]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 604","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 603","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.09000000000000341,-1.8599999999999994],[0.5900000000000034,-0.7800000000000011],[0.12000000000000455,-2.75],[-2.0900000000000034,-0.10999999999999943],[-0.18000000000000682,-1.1699999999999946],[0.1599999999999966,-2.3699999999999974],[0.03999999999999204,-3.5900000000000034],[0.5500000000000114,-0.3499999999999943],[0.6899999999999977,-0.13999999999998636],[-0.23999999999998067,0.5400000000000063],[0.36000000000001364,0.12999999999999545],[0.37000000000000455,0.519999999999996],[0.38999999999998636,0.4399999999999977],[0,0.030000000000001137],[0.06999999999999318,1.2399999999999949],[0.4200000000000159,0.0799999999999983],[0.0700000000000216,0.1700000000000017],[0.7800000000000011,2.510000000000005],[-0.4300000000000068,2.1299999999999955],[0.28000000000000114,1.3900000000000006],[0.5699999999999932,-0.25],[-1.5500000000000114,-2.009999999999998],[-0.21999999999999886,-0.5100000000000051],[-0.29000000000002046,0.730000000000004],[-0.11000000000001364,-0.3499999999999943],[-0.47999999999998977,-1.3599999999999994],[6,0.6299999999999955],[1.049999999999983,0.21000000000000796],[0.9099999999999966,0.6800000000000068],[0,0],[4.389999999999986,-3.0500000000000114],[0.7999999999999972,-0.47999999999998977],[0.4200000000000017,-1.6299999999999955],[0,0],[1.9200000000000017,5.109999999999999],[0.37000000000000455,-0.8299999999999983],[-0.8900000000000006,3.539999999999992],[0.10000000000000853,0.990000000000002],[-1.2600000000000051,1.7899999999999991],[0,0],[-8.509999999999991,-2.049999999999997],[-3.829999999999984,0.5],[-4.359999999999985,-0.1599999999999966],[0,0]],"o":[[0.19999999999998863,1.6700000000000017],[-2.1100000000000136,-0.46999999999999886],[0.05000000000001137,0.5200000000000031],[-0.13999999999998636,3.1600000000000037],[1.009999999999991,0.04999999999999716],[0.28000000000000114,1.8400000000000034],[-0.22999999999998977,3.5400000000000063],[0,0.5699999999999932],[-0.18000000000000682,0.8700000000000045],[-0.6899999999999977,0.13999999999998636],[0.020000000000010232,-0.04999999999999716],[-0.1699999999999875,-0.5999999999999943],[-0.7199999999999989,-1.0100000000000051],[-0.3300000000000125,-0.37000000000000455],[0.37000000000000455,-1.2000000000000028],[-0.0800000000000125,-1.3499999999999943],[-0.1599999999999966,0.010000000000005116],[-0.5099999999999909,-2.6200000000000045],[-0.4300000000000068,-2.0900000000000034],[0.3100000000000023,-1.2100000000000009],[-0.8700000000000045,0.28000000000000114],[-1.490000000000009,2.1199999999999974],[0.5800000000000125,0.23999999999999488],[-0.09000000000000341,0.5400000000000063],[0.12999999999999545,0.3499999999999943],[0.1699999999999875,1.3499999999999943],[1.1800000000000068,5.340000000000003],[-1.0500000000000114,-0.10999999999999943],[-1.0600000000000023,-0.4399999999999977],[0,0],[-4.780000000000001,-0.030000000000001137],[-0.9599999999999937,0.6700000000000017],[-0.8299999999999983,1.230000000000004],[0,0],[-3.4399999999999977,-3.7099999999999937],[0.09999999999999432,-0.28000000000000114],[-0.980000000000004,-3.4099999999999966],[0.4099999999999966,-0.8500000000000014],[0.37999999999999545,-2.270000000000003],[0,0],[5.859999999999999,-5.920000000000002],[3.8300000000000125,1.0700000000000003],[4.050000000000011,-1.3500000000000014],[0,0],[0,0]],"v":[[161,41.33],[161.17,46.62],[154.67,46.66],[150.32,50.169999999999995],[157.82999999999998,50.64999999999999],[161.01999999999998,52.51999999999999],[159.67999999999998,62.16999999999999],[159.67999999999998,73.16999999999999],[159.33999999999997,74.99999999999999],[156.34999999999997,84.92999999999998],[155.66999999999996,82.17999999999998],[155.33999999999995,83.00999999999998],[154.33999999999995,80.83999999999997],[152.13999999999996,79.34999999999998],[152.33999999999995,78.67999999999998],[152.65999999999994,75.00999999999998],[151.66999999999993,70.33999999999997],[151.33999999999992,70.16999999999997],[148.66999999999993,62.66999999999997],[148.66999999999993,56.339999999999975],[149.66999999999993,52.66999999999997],[147.66999999999993,55.339999999999975],[147.66999999999993,64.33999999999997],[148.66999999999993,66.33999999999997],[148.99999999999994,67.33999999999997],[149.32999999999996,68.33999999999997],[150.30999999999995,72.40999999999997],[145.81999999999994,78.79999999999997],[142.65999999999994,78.34999999999997],[139.81999999999994,76.34999999999997],[139.48999999999992,77.67999999999996],[123.66999999999993,77.18999999999997],[121.31999999999994,80.00999999999996],[119.44999999999993,84.30999999999996],[118.97999999999993,84.33999999999996],[110.64999999999993,73.33999999999996],[110.31999999999994,71.66999999999996],[109.64999999999993,61.33999999999996],[109.97999999999993,58.33999999999996],[112.30999999999993,50.66999999999996],[113.58999999999993,49.829999999999956],[135.92999999999992,42.01999999999995],[147.4099999999999,42.88999999999995],[160.1999999999999,40.57999999999995],[160.9799999999999,41.32999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9294,0.6667,0.502]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[135.21030349985094,62.750365545351684]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[135.21030349985094,62.750365545351684]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 605","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 604","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[3.049999999999997,-2.6699999999999875],[-1.1400000000000006,1.0500000000000114],[-1.5300000000000011,0.29000000000002046],[0.44000000000001194,-0.7800000000000011],[0.9200000000000017,-1.160000000000025],[-8.950000000000003,-3.6799999999999784],[-10.490000000000009,2.240000000000009],[-6.439999999999998,5.009999999999991],[0,0],[-2.8700000000000045,-3.490000000000009],[-0.009999999999990905,-0.11000000000001364],[-0.339999999999975,-0.2599999999999909],[-0.05000000000001137,-3.1299999999999955],[0.25,0.0800000000000125],[1.009999999999991,0.37999999999999545],[2.440000000000026,0.030000000000001137],[4.039999999999992,0.36000000000001364],[-0.2400000000000091,0.09000000000000341],[-3.1899999999999977,1.0500000000000114],[-0.1599999999999966,-0.03999999999999204],[-0.7199999999999989,0.09000000000000341],[0.21000000000000796,-0.04999999999998295],[0.7300000000000182,0.11000000000001364],[1.1200000000000045,0.5799999999999841],[0,0],[4.930000000000007,2.030000000000001],[4.100000000000023,1.0800000000000125],[0.020000000000010232,0],[6.359999999999999,1.0400000000000205],[0.15000000000000568,-0.4399999999999977],[0,0],[3.5900000000000034,2.5900000000000034],[0.6500000000000057,1.1900000000000261],[0.5499999999999972,0.910000000000025],[-1.9099999999999966,-0.030000000000001137],[-10.170000000000002,9.810000000000002],[-0.18000000000000682,0.710000000000008],[-0.75,0.7700000000000102],[0,0],[-7.110000000000014,4.730000000000018],[0,0],[0.4099999999999966,-0.45999999999997954],[14.040000000000006,-10.909999999999968]],"o":[[-2.950000000000003,2.6599999999999966],[-0.9200000000000017,1.0500000000000114],[1.0400000000000063,-1.2800000000000011],[0.6899999999999977,0.5699999999999932],[-0.769999999999996,1.3700000000000045],[-4.930000000000007,6.27000000000001],[9.960000000000008,4.090000000000003],[8.069999999999993,-1.7199999999999989],[0,0],[1.9300000000000068,4.22999999999999],[0.009999999999990905,0.11000000000001364],[0.11000000000001364,1.740000000000009],[0.9399999999999977,3.719999999999999],[0,0.25],[-0.9699999999999989,-0.539999999999992],[-2.009999999999991,-1],[-3.9499999999999886,-1.0200000000000102],[0.009999999999990905,-0.3199999999999932],[3.1699999999999875,-1.0900000000000034],[0.12999999999999545,-0.03999999999999204],[0.4399999999999977,-0.5900000000000034],[0.21000000000000796,-0.27000000000001023],[-0.5800000000000125,0.5],[-1.0200000000000102,0.7599999999999909],[0,0],[-4.9199999999999875,1.7700000000000102],[-4.039999999999992,-1.3400000000000034],[0.009999999999990905,-0.11000000000001364],[-6.260000000000005,-1.5300000000000011],[-0.10999999999999943,-0.020000000000010232],[0,0],[-3.319999999999993,-0.539999999999992],[-1.9899999999999949,-1.4399999999999977],[-0.4899999999999949,-0.9099999999999966],[1.8299999999999983,0.47999999999998977],[14.599999999999994,0.2599999999999909],[0.4899999999999949,0.03999999999999204],[0.7800000000000011,-0.7599999999999909],[0,0],[8.379999999999995,3.240000000000009],[0,0],[-0.12000000000000455,1.0600000000000023],[-15.569999999999993,8.530000000000001],[0,0]],"v":[[110.67,203],[101.67,211],[102,211],[106,207.67],[106.35,208.51],[103.35,211.84],[105.00999999999999,225.82],[142.07,228.89],[164.67,217.32],[165.6,217.82999999999998],[173.34,229.32],[173.34,229.65],[174.01,232.65],[178.35,248.81],[178.18,249.31],[175.01000000000002,247.65],[167.68,245.32],[155.68,243.32],[155.98000000000002,242.48],[165.57000000000002,239.26999999999998],[166.01000000000002,239.30999999999997],[168.01000000000002,238.30999999999997],[168.01000000000002,237.97999999999996],[165.68,238.97999999999996],[161.35,240.30999999999997],[160.7,240.25999999999996],[146.35,240.97999999999996],[134.01999999999998,236.97999999999996],[134.01999999999998,236.78999999999996],[115.34999999999998,232.98999999999995],[117.34999999999998,233.64999999999995],[106.20999999999998,232.61999999999995],[87.78999999999998,219.70999999999995],[75.42999999999998,211.06999999999994],[74.34999999999998,207.98999999999992],[80.19999999999997,209.32999999999993],[126.00999999999998,179.31999999999994],[127.00999999999998,178.31999999999994],[129.67999999999998,175.98999999999992],[130.46999999999997,175.67999999999992],[155.40999999999997,170.02999999999992],[156.67999999999998,169.98999999999992],[156.01999999999998,175.1599999999999],[110.67999999999998,202.9899999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.851,0.8627,0.8549]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[126.35615862394135,209.6561089762905]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[126.35615862394135,209.6561089762905]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 606","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 605","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.14000000000000057,0.2600000000000051],[0.1700000000000017,0.4899999999999949],[0.8999999999999915,0.7000000000000028],[1.1200000000000045,0.769999999999996],[4.170000000000002,7.019999999999996],[-0.1599999999999966,0.75],[0.010000000000005116,-0.6700000000000017],[-0.09000000000000341,-0.7800000000000011],[-7.8799999999999955,-3.2099999999999937],[-1.4300000000000068,-0.6400000000000006],[-0.3300000000000125,-0.23000000000000398],[0.6400000000000006,-0.8399999999999892],[0.010000000000005116,-4.130000000000024],[-0.23999999999999488,-0.6299999999999955],[0.46999999999999886,-0.19000000000002615],[0,0],[0.5900000000000034,-0.30000000000001137],[0.6299999999999955,-0.09000000000000341],[2.980000000000004,-2.0999999999999943],[1.8900000000000006,-1.1800000000000068],[0,0],[1.1099999999999994,4.9599999999999795],[0.5599999999999881,0.3699999999999761],[1.2199999999999989,3.960000000000008],[-0.12000000000000455,0.7199999999999989],[6.150000000000006,3.3999999999999915],[0,0],[0,0],[4.160000000000004,-0.21999999999999886],[0,0],[-8.349999999999994,4.469999999999999],[-1.2900000000000063,2.269999999999996],[-0.5200000000000102,-0.4099999999999966],[-6.469999999999999,-2.9599999999999937],[-1.039999999999992,-1.1300000000000097],[-0.6400000000000006,-2.069999999999993]],"o":[[-0.0799999999999983,0.269999999999996],[-0.0799999999999983,0.5100000000000051],[-1.3199999999999932,0.2600000000000051],[-1.3799999999999955,-0.12000000000000455],[-7.730000000000004,-2.25],[-0.7000000000000028,-0.269999999999996],[-0.20999999999999375,-0.45000000000000284],[0.5300000000000011,0.6099999999999994],[5.269999999999996,6.840000000000003],[1.5499999999999972,0.15000000000000568],[0.4000000000000057,-0.09999999999999432],[0.3100000000000023,0.21999999999999886],[1.4500000000000028,3.8599999999999994],[-0.01999999999999602,0.6999999999999886],[0.519999999999996,0.1599999999999966],[0,0],[-0.1700000000000017,0.8199999999999932],[-0.4200000000000017,0.21000000000000796],[-2.3400000000000034,0.3499999999999943],[-1.8299999999999983,1.289999999999992],[0,0],[-2.5600000000000023,-4.569999999999993],[0.480000000000004,0.30000000000001137],[-0.6599999999999966,-4.110000000000014],[-0.5499999999999972,-0.46999999999999886],[-2.980000000000004,-5.959999999999994],[0,0],[0,0],[-3.5900000000000034,-1.5699999999999932],[0,0],[7.699999999999996,-5.599999999999994],[2.430000000000007,-1.2999999999999972],[0.2600000000000051,-0.45999999999999375],[1.6599999999999966,7.200000000000003],[2.019999999999996,0.9200000000000017],[1.3599999999999994,1.480000000000004],[0,0]],"v":[[124,117.33],[123.67,117.33],[122.67,117.33],[119.34,116.66],[115.01,115.33],[94.68,101],[93.35000000000001,98.67],[93.02000000000001,99],[94.35000000000001,101.33],[114.68,115.66],[119.35000000000001,116.99],[120.78000000000002,117.25],[121.35000000000001,123.32],[123.02000000000001,135.65],[123.35000000000001,137.65],[123.35000000000001,138.98000000000002],[123.68,140.65],[120.35000000000001,145.84],[118.60000000000001,145.71],[101.65,158.12],[96.01,161.65],[94.86,161.14000000000001],[89.36,146.85000000000002],[89.01,146.65000000000003],[86.01,134.32000000000002],[85.34,132.32000000000002],[72.94,116.55000000000003],[72.67,115.99000000000002],[72.24,116.19000000000003],[60.62,114.17000000000003],[60.339999999999996,113.66000000000003],[85.67999999999999,100.50000000000003],[94.08,94.56000000000003],[96.67,89.33000000000003],[113.12,106.05000000000003],[121.36,109.14000000000003],[124.01,117.33000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9882,0.9882,0.9843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[92.17501249647933,125.47842634830943]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[92.17501249647933,125.47842634830943]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 607","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 606","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.8200000000000003,-0.14000000000001478],[0.040000000000000924,-0.3100000000000023],[0.02999999999999936,-0.5],[-0.17999999999999972,-0.710000000000008],[-0.23999999999999844,-0.6700000000000159],[-0.17999999999999972,-0.8799999999999955],[-0.5300000000000011,-2.030000000000001],[-0.14000000000000057,-0.3199999999999932],[-0.39000000000000057,-1.210000000000008],[-2.900000000000002,-5.900000000000006],[-0.05999999999999872,-0.030000000000001137],[-0.23999999999999844,-0.21000000000000796],[-0.2799999999999976,-0.4000000000000057],[-1.1199999999999974,-0.9200000000000159],[-0.08000000000000185,-0.060000000000002274],[-0.030000000000001137,-0.27000000000001023],[-0.5200000000000031,-0.5300000000000011],[-0.020000000000003126,-1.9599999999999795],[0.5700000000000003,-0.8700000000000045],[-0.259999999999998,-1.3100000000000023],[-2.259999999999998,-1.8000000000000114],[-2.5799999999999983,-1.6200000000000045],[-1.8400000000000034,-1.349999999999966],[-0.060000000000002274,-0.03999999999996362],[-0.4299999999999997,-0.2899999999999636],[-0.5599999999999881,-0.2300000000000182],[-0.2799999999999869,-0.07999999999998408],[-0.5100000000000051,-0.2400000000000091],[-2.1700000000000017,-0.6999999999999886],[-1.8500000000000085,-0.19999999999998863],[0,0],[-1.4299999999999926,-1.079999999999984],[0,0],[-0.4399999999999977,-0.2599999999999909],[-2.1700000000000017,-0.9499999999999886],[-1.8700000000000045,-0.4199999999999591],[-5.219999999999999,-0.38999999999998636],[-0.6099999999999994,0.11000000000001364],[-0.27000000000001023,-0.12000000000000455],[-1.2199999999999989,0.01999999999998181],[-0.6800000000000068,-0.30000000000001137],[-0.29000000000000625,0.009999999999990905],[-0.6700000000000017,0.2300000000000182],[-0.25,0.01999999999998181],[-1.4699999999999989,0.029999999999972715],[-1.1899999999999977,-0.1099999999999568],[-0.06999999999999318,0.3100000000000023],[-0.46999999999999886,-0.14999999999997726],[-0.7199999999999989,0.10000000000002274],[-1.4300000000000068,0.6299999999999955],[-1.5700000000000216,0.4800000000000182],[-0.9800000000000182,0.5],[-0.029999999999972715,0.060000000000002274],[-0.17000000000001592,0.19999999999998863],[-0.5999999999999943,0.5099999999999909],[-0.25,0.6100000000000136],[0.0800000000000125,3.8799999999999955],[0.03999999999999204,0.5600000000000023],[0.3400000000000034,0.7200000000000273],[1.8199999999999932,1.4000000000000057],[0.28000000000000114,0.18000000000000682],[0.20000000000001705,0.2400000000000091],[0.25,0.2300000000000182],[0.6100000000000136,1.740000000000009],[-1.5600000000000023,-0.2599999999999909],[0.05000000000001137,0.2599999999999909],[2.259999999999991,1.509999999999991],[-8.409999999999997,-3.140000000000015],[-1.539999999999992,-4.369999999999948],[-7.8799999999999955,2.1100000000000136],[2.009999999999991,-6.389999999999986],[14.599999999999994,-1.0199999999999818],[24.799999999999997,16.210000000000036],[1.6700000000000017,21.390000000000015],[-1.6999999999999993,5.240000000000009]],"o":[[0.17999999999999972,-0.5600000000000023],[0.39000000000000057,0.8499999999999943],[-0.08999999999999986,0.710000000000008],[-0.03999999999999915,0.6299999999999955],[0.08000000000000007,0.3300000000000125],[0.21000000000000085,0.5800000000000125],[0.40000000000000036,2.009999999999991],[0.10999999999999943,0.4199999999999875],[0.5299999999999994,1.2199999999999989],[2.0500000000000007,6.340000000000003],[0.2699999999999996,0.5500000000000114],[0.14999999999999858,0.06999999999999318],[0.16000000000000014,0.12999999999999545],[1.0399999999999991,1.4799999999999898],[0.23999999999999844,0.19999999999998863],[0.030000000000001137,0.020000000000010232],[0.05000000000000071,0.37999999999999545],[0.7899999999999991,0.789999999999992],[0.5900000000000034,-0.7599999999999909],[-0.10999999999999943,0.160000000000025],[2.799999999999997,1.339999999999975],[2.259999999999998,1.8000000000000114],[2.1099999999999994,1.329999999999984],[0.6400000000000006,0.4700000000000273],[0.1599999999999966,0.12000000000000455],[0.10000000000000142,0.06999999999999318],[0.3100000000000023,0.040000000000020464],[0.4899999999999949,0.13999999999998636],[2.1099999999999994,1],[1.75,0.5699999999999932],[0,0],[1.769999999999996,-0.6899999999999977],[0,0],[0.01999999999999602,0.36000000000001364],[1.730000000000004,1.0600000000000023],[0.8299999999999983,1.1299999999999955],[5.180000000000007,1.170000000000016],[1.0499999999999972,0.07999999999998408],[0.3199999999999932,-0.060000000000002274],[1,0.4300000000000068],[0.20999999999999375,0],[0.4200000000000017,0.18999999999999773],[0.269999999999996,0],[0.8199999999999932,-0.2799999999999727],[1.4099999999999966,-0.11000000000001364],[1.2700000000000102,-0.029999999999972715],[0.3400000000000034,0.029999999999972715],[0.6800000000000068,-0.11000000000001364],[0.28999999999999204,0.08999999999997499],[1.740000000000009,-0.2400000000000091],[1.3000000000000114,-0.5699999999999932],[1.4300000000000068,-0.4399999999999977],[0.6899999999999977,-0.35000000000002274],[0.09000000000000341,-0.18000000000000682],[0.13999999999998636,-0.160000000000025],[0.5600000000000023,-0.4700000000000273],[1.710000000000008,-4.220000000000027],[-0.009999999999990905,-0.5500000000000114],[-0.030000000000001137,-0.36000000000001364],[-1.0500000000000114,-2.1899999999999977],[-0.5699999999999932,-0.4399999999999977],[-0.12000000000000455,-0.0800000000000125],[-0.060000000000002274,-0.06999999999999318],[-1.3199999999999932,-1.210000000000008],[2.1599999999999966,1.0200000000000102],[0.18999999999999773,0.030000000000001137],[-1.75,-1.9799999999999898],[9.120000000000005,-0.3199999999999932],[1.6999999999999886,4.319999999999993],[2.1699999999999875,6.149999999999977],[-3.6500000000000057,5.740000000000009],[-14.110000000000014,3.6999999999999886],[-29.159999999999997,2.0500000000000114],[-18.48,-12.069999999999993],[-0.46000000000000085,-5.900000000000006],[0,0]],"v":[[10.33,204],[11.66,202.34],[11,203.20000000000002],[11.58,205.77],[11.05,207.76000000000002],[12,209.19000000000003],[12.65,212.85000000000002],[13.790000000000001,219.18000000000004],[14.700000000000001,219.91000000000003],[15.620000000000001,224.22000000000003],[24.130000000000003,242.01000000000002],[24.01,243.33],[24.92,243.41000000000003],[25.46,244.72000000000003],[30.79,251.59000000000003],[31.68,251.68000000000004],[31.46,252.46000000000004],[34.32,255.86000000000004],[36.68,258.67],[38.339999999999996,259],[37.349999999999994,259.33],[44.38999999999999,265.46],[54.13999999999999,272.21],[61.66,275.85999999999996],[62.36,276.99999999999994],[63.68,276.3299999999999],[64.85,278.3299999999999],[65.16999999999999,277.6599999999999],[67.82,278.69999999999993],[75.00999999999999,282.1499999999999],[80.35,283.6599999999999],[80.02,284.6499999999999],[84.67999999999999,285.6499999999999],[85.35,284.6499999999999],[85.19999999999999,285.6499999999999],[94.46,288.0399999999999],[99.57,289.2499999999999],[116.52,291.89999999999986],[122.47999999999999,292.32999999999987],[122.85,291.64999999999986],[126.21,292.6199999999999],[126.85,291.9899999999999],[127.52,292.9899999999999],[128.16,292.2499999999999],[129.52,292.4899999999999],[133.17000000000002,292.1499999999999],[136.19000000000003,292.2999999999999],[136.36,290.9799999999999],[136.87,291.9999999999999],[142.38,291.7599999999999],[151.57,289.6799999999999],[153.68,288.82999999999987],[156.61,287.02999999999986],[158,286.9499999999999],[158.08,286.0499999999999],[159.86,285.3099999999999],[164.83,278.9399999999999],[165.78,269.0699999999999],[166.21,267.59999999999985],[163.66,261.16999999999985],[156.53,251.29999999999984],[155.1,250.89999999999984],[153.64,248.36999999999983],[152.86999999999998,248.31999999999982],[149.36999999999998,244.2999999999998],[159.2,249.2999999999998],[159.7,249.12999999999982],[152.7,244.45999999999984],[178.95999999999998,250.69999999999985],[183.20999999999998,263.9499999999998],[193.7,271.6299999999998],[187.13,290.6399999999998],[144.19,298.2899999999998],[38.19,283.62999999999977],[9.459999999999997,228.44999999999976],[10.369999999999997,203.95999999999975]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.102,0.1216,0.1294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[101.39490281750147,250.73655775327063]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[101.39490281750147,250.73655775327063]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 608","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 607","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.10999999999999943,-0.060000000000002274],[-1.6100000000000136,-6.11999999999999],[0.1799999999999926,-0.47999999999998977],[-0.5900000000000034,-5.269999999999982],[-0.18000000000000682,-4.150000000000006],[0.06999999999999318,0],[0,0],[2.6099999999999994,-2.2299999999999898],[0.9599999999999937,-0.6900000000000261],[-0.21999999999999886,0.21999999999999886],[-0.9899999999999949,0.17000000000001592],[-3.990000000000009,-0.539999999999992],[0.5400000000000063,-0.4399999999999977],[2.3599999999999994,-8.340000000000003],[-0.5300000000000011,1.0600000000000023],[-11.560000000000002,7.939999999999998],[-5.260000000000005,3.719999999999999],[0.480000000000004,-0.8799999999999955],[-0.2400000000000091,-2.030000000000001],[-4.209999999999994,-3.6100000000000136],[0.22999999999998977,-0.5999999999999943],[0.9799999999999898,-0.9499999999999886],[13.730000000000004,0.1699999999999875],[3.6199999999999903,5.990000000000009],[-4.830000000000005,17.440000000000012],[-2.730000000000004,0.7000000000000028],[-1.9000000000000057,-0.3299999999999983],[-0.8799999999999955,-1.3699999999999903]],"o":[[0.20000000000000284,-0.12999999999999545],[5.760000000000005,3.010000000000005],[0.480000000000004,0],[1.3499999999999943,4.939999999999998],[0.45999999999999375,4.139999999999986],[-0.12000000000000455,0.1599999999999966],[0,0],[-3.530000000000001,0],[-0.5999999999999943,0.8600000000000136],[-0.21999999999999886,0.4300000000000068],[0.5999999999999943,-0.9099999999999966],[3.239999999999995,-2.319999999999993],[0.45000000000000284,0.060000000000002274],[-7.900000000000006,3.1200000000000045],[-0.3100000000000023,1.509999999999991],[5.840000000000003,-14.129999999999995],[5.310000000000002,-3.6500000000000057],[0.8599999999999994,-0.7299999999999898],[-0.010000000000005116,1.7800000000000011],[0.6599999999999966,5.560000000000002],[0.37000000000000455,0.5999999999999943],[-0.18999999999999773,0.5],[-9.560000000000002,9.219999999999999],[-7.569999999999993,-0.09000000000000341],[-9.399999999999999,-15.580000000000013],[0.7299999999999969,-2.6500000000000057],[1.3800000000000026,-1.1299999999999955],[1.7600000000000051,0.29999999999999716],[0,0]],"v":[[72.33,116.67],[72.82,116.51],[85,133.01],[85.67,134.67999999999998],[88.33,152.84999999999997],[89.33,165.34999999999997],[88.83,165.01999999999995],[83.5,165.01999999999995],[72.67,170.01999999999995],[70.34,172.34999999999997],[70.34,172.67999999999998],[73.01,170.34999999999997],[86.85000000000001,166.01999999999995],[87.34,166.67999999999995],[71.01,183.34999999999997],[71.34,184.01999999999995],[101.65,159.82999999999996],[117.01,148.01999999999995],[117.34,148.68999999999994],[117.04,154.14999999999995],[127,170.85999999999996],[130,173.17999999999995],[122.51,180.70999999999995],[80.12,207.89999999999995],[64.07000000000001,196.12999999999994],[52.17000000000001,127.35999999999994],[59.33000000000001,115.01999999999994],[66.87000000000002,114.52999999999994],[72.33000000000001,116.68999999999994]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9882,0.9882,0.9843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[90.32679875169157,161.0632587089566]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[90.32679875169157,161.0632587089566]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 609","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 608","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.03999999999999915,-1.3900000000000148],[-1.9600000000000009,-6.8700000000000045],[0,0],[0,0],[-1.5200000000000031,-1.3700000000000045],[0.13000000000000256,-2.319999999999993],[0.6899999999999977,-1.039999999999992],[1.75,-0.06999999999999318],[3.969999999999999,0.6299999999999955],[-1.6599999999999966,-0.45000000000001705],[-17.680000000000007,-13.409999999999997],[-1.8199999999999932,-0.9199999999999875],[0.36999999999999034,-0.020000000000010232],[5.329999999999998,-0.6699999999999875],[0,0],[-6.939999999999998,-0.3100000000000023],[-14.110000000000014,-6.640000000000015],[0,0],[-0.46999999999999886,-1.3700000000000045],[-1.9000000000000057,-3.5500000000000114],[0.7299999999999898,-2.099999999999966],[2.969999999999999,-4.439999999999998],[2.030000000000001,-0.6099999999999568],[1.1099999999999852,0.010000000000047748],[4.060000000000002,-0.7200000000000273],[5.450000000000017,0.060000000000002274],[1.5200000000000102,0.589999999999975],[0.5600000000000023,0.040000000000020464],[8.709999999999994,1.8899999999999864],[0.1599999999999966,0.21000000000003638],[4.030000000000001,1.6200000000000045],[0.20000000000000284,0.8999999999999773],[4.439999999999998,2.3799999999999955],[0.5,1.1000000000000227],[0.4299999999999997,0.8199999999999932],[6.1200000000000045,6.6299999999999955],[0.720000000000006,1.6000000000000227],[0.9700000000000024,2.219999999999999],[1.5500000000000007,2.9499999999999886],[-0.1999999999999993,1.0999999999999943],[2.380000000000001,6.340000000000003],[1.1300000000000008,1.0700000000000216],[0,0],[-0.7699999999999996,1.2399999999999807],[-0.33999999999999986,1],[0.6099999999999994,0],[-17.549999999999997,16.700000000000017],[-2.1599999999999966,-4.97999999999999],[-1.740000000000002,0.05000000000001137]],"o":[[1.009999999999998,-0.6800000000000068],[-1.0300000000000011,7.1699999999999875],[0,0],[0,0],[-1.0700000000000003,-0.47999999999998977],[1.4200000000000017,1.960000000000008],[0.8400000000000034,0.5900000000000034],[0.759999999999998,0.8600000000000136],[-3.799999999999997,-1.3000000000000114],[-2.3200000000000003,-0.22999999999998977],[22.230000000000004,4.719999999999999],[1.6299999999999955,1.2299999999999898],[0.09000000000000341,0.5500000000000114],[-5.340000000000003,0.27000000000001023],[0,0],[6.939999999999998,0.03999999999999204],[15.590000000000003,0.6999999999999886],[0,0],[0.9900000000000091,0.25],[3.6599999999999966,1.6399999999999864],[1.1100000000000136,2.0600000000000023],[0.5500000000000114,5.25],[-1.1899999999999977,1.7699999999999818],[-0.09000000000000341,0.7400000000000091],[-3.319999999999993,2.519999999999982],[-5.530000000000001,0.9900000000000091],[-1.0400000000000063,0.9300000000000068],[-0.37000000000000455,0.4800000000000182],[-8.909999999999997,-0.5500000000000114],[-0.23999999999999488,-0.05000000000001137],[-4.299999999999997,-0.910000000000025],[-1.1200000000000045,0.339999999999975],[-4.790000000000006,-1.4300000000000068],[-1.2999999999999972,0.8999999999999773],[-0.8100000000000023,0.7799999999999727],[-8.11,-3.6899999999999977],[-1.7000000000000028,-0.9700000000000273],[-2.009999999999998,-1.3000000000000114],[-2.5100000000000016,-2.1999999999999886],[-0.8399999999999999,-0.0800000000000125],[-3.25,-5.939999999999998],[-0.02999999999999936,-2.1100000000000136],[0,0],[-1.1099999999999994,-1.289999999999992],[-0.2699999999999996,-1],[0.33999999999999986,-1],[3.0199999999999996,-23.629999999999995],[-0.7999999999999972,5.189999999999998],[0.9399999999999977,2.1500000000000057],[0,0]],"v":[[43.33,158],[45.21,158.55],[47.79,179.73000000000002],[47.98,185.51000000000002],[47.33,186.00000000000003],[48,187.33000000000004],[49.94,193.75000000000003],[50.48,195.70000000000002],[51,198.67000000000002],[39.33,196.00000000000003],[38.33,196.33000000000004],[96.69,228.47000000000003],[101.99,232.00000000000003],[101.17,232.33000000000004],[85.17,233.00000000000003],[80.67,233.99000000000004],[101.51,233.65000000000003],[149.33,244.33000000000004],[153.21,247.79000000000005],[155.4,250.22000000000006],[164.08,260.63000000000005],[166.42000000000002,269.02000000000004],[163.79000000000002,281.56000000000006],[158.66000000000003,286.58000000000004],[156.87000000000003,287.67],[145.17000000000004,291.97],[128.28000000000003,292.91],[123.13000000000002,292.57000000000005],[121.72000000000003,293.03000000000003],[94.75000000000003,289.16],[94.06000000000003,288.62],[81.42000000000003,285.05],[79.44000000000003,284.22],[65.59000000000003,278.52000000000004],[63.26000000000003,277.17],[61.35000000000004,276.49],[39.290000000000035,261.48],[35.66000000000003,257.62],[30.72000000000003,252.28],[24.44000000000003,244.02],[23.49000000000003,242.24],[14.91000000000003,224.22],[13.18000000000003,219.45],[11.42000000000003,209.60999999999999],[10.90000000000003,205.82],[10.90000000000003,203],[10.32000000000003,204.01],[39.32000000000003,139.33999999999997],[39.82000000000003,156.33999999999997],[43.32000000000003,158.00999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.149,0.1725,0.1843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[88.49003010246506,216.35389832587288]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[88.49003010246506,216.35389832587288]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 610","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 609","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-2.6400000000000006,1.710000000000008],[-30.120000000000005,5.560000000000002],[-8.349999999999994,-22.319999999999993],[-5.490000000000009,-17.44999999999999],[3.640000000000015,-1.6900000000000261],[23.659999999999997,-1.3000000000000114],[0.9399999999999977,1.1899999999999977],[0.7400000000000091,2.32000000000005],[0.3100000000000023,16.590000000000032],[-0.09999999999999432,1.0900000000000034],[0,0],[-0.15000000000000568,-3.910000000000025],[1.7900000000000205,2.25],[0.18999999999999773,1.6299999999999955],[-0.46000000000000796,1.3699999999999761],[0.2599999999999909,-0.6899999999999977],[0.23999999999998067,-0.7399999999999807],[0.11000000000001364,-0.5],[0,0],[0,0],[0,0],[0.10999999999998522,-0.22999999999998977],[2.819999999999993,-1.1699999999999875],[12.260000000000005,3.240000000000009],[-9.86,9.560000000000002],[0,0],[-0.06999999999999318,0.0700000000000216],[-1.690000000000012,0.8300000000000125]],"o":[[2.3599999999999994,-1.710000000000008],[25.47999999999999,-16.539999999999992],[25.78,-4.759999999999991],[6.4199999999999875,17.150000000000006],[-4,-1.0900000000000034],[-20.099999999999994,9.349999999999994],[-1.4000000000000057,0.07999999999998408],[-1.1299999999999955,-1.4300000000000068],[-5.110000000000014,-15.939999999999998],[-0.19999999999998863,-1.0699999999999932],[0,0],[-0.37000000000000455,3.9799999999999898],[0.19999999999998863,1.9699999999999989],[-0.9900000000000091,-0.5],[-0.4199999999999875,-1.6299999999999955],[-0.18999999999999773,-0.6899999999999977],[0.5699999999999932,0.6999999999999886],[0.11000000000001364,0.37999999999999545],[0,0],[0,0],[0,0],[-0.05000000000001137,0.25],[-0.9799999999999898,2.1899999999999977],[-11.860000000000014,4.9199999999999875],[-15.239999999999995,-4.030000000000001],[0,0],[-0.06999999999999318,-0.22999999999998977],[1.4699999999999989,-1.3700000000000045],[0,0]],"v":[[111,203.33],[119.69,197.86],[206.32,158.16000000000003],[247.91,185.25000000000003],[264.33,237.66000000000003],[251.98999999999998,240.49000000000004],[191.51,270.68000000000006],[186.98999999999998,269.75000000000006],[182.57999999999998,257.59000000000003],[170.67,202.67000000000002],[170.36999999999998,199.45000000000002],[170.00999999999996,199.34],[169.69999999999996,211.23000000000002],[165.67999999999995,215.67000000000002],[163.91999999999996,212.48000000000002],[163.34999999999997,207.00000000000003],[162.67999999999998,207.00000000000003],[163.01,209.67000000000002],[163.01,211.00000000000003],[163.64999999999998,211.39000000000001],[165.12999999999997,216.64000000000001],[164.66999999999996,217.33],[164.44999999999996,218.06],[149.54999999999995,227.2],[109.80999999999995,228.14],[105.79999999999994,208.45],[105.99999999999994,207.67],[105.95999999999994,207.17999999999998],[110.99999999999994,203.33999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9882,0.9882,0.9843]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[181.34817081701956,213.85160234588278]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[181.34817081701956,213.85160234588278]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 611","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 610","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.44000000000002615,0.0999999999999659],[-0.549999999999983,-0.7900000000000205],[0,0]],"o":[[-0.44999999999998863,-0.11000000000001364],[-0.19999999999998863,-1.2699999999999818],[0,0],[0,0]],"v":[[211,309.67],[209.67,309.34000000000003],[211.32999999999998,309.51000000000005],[210.99999999999997,309.6700000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.8784,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[210.48975275336872,309.14673232992874]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[210.48975275336872,309.14673232992874]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 612","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 611","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.2600000000000193,-0.7799999999999727],[0.5999999999999943,0.13999999999998636]],"o":[[-0.46999999999999886,-1.339999999999975],[-0.5099999999999909,-0.12000000000000455],[0,0]],"v":[[207,308.67],[208.67,309],[207,308.67]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.8784,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[207.95351957697497,308.48992317630575]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[207.95351957697497,308.48992317630575]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 613","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 612","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.1699999999999875,-0.160000000000025],[-0.8100000000000023,-1.0400000000000205],[2.059999999999974,0]],"o":[[0,0],[1.1100000000000136,-0.30000000000001137],[0.18000000000000682,0.17000000000001592],[-2.009999999999991,0.18000000000000682],[0,0]],"v":[[241.67,315],[241.67,313.67],[242.33999999999997,314.67],[247.33999999999997,314.67],[241.67,315]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.8784,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[244.50505447001834,314.30996326664615]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[244.50505447001834,314.30996326664615]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 614","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 613","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6299999999999955,-0.06999999999999318],[-2.5999999999999943,-0.4200000000000159],[0,0],[3.0900000000000034,0.7900000000000205]],"o":[[0.25,-0.7699999999999818],[2.539999999999992,0.2599999999999909],[0,0],[-3.069999999999993,-0.7599999999999909],[0,0]],"v":[[196.67,306.33],[198.07,305.72999999999996],[206.45,307.65999999999997],[206,308.33],[196.67,306.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.8784,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[201.56003043772617,307.00651936447144]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[201.56003043772617,307.00651936447144]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 615","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 614","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-5.680000000000007,-1.3599999999999568],[0.4899999999999807,-0.5099999999999909],[0.13999999999998636,0.029999999999972715],[0.45000000000001705,-0.5099999999999909],[0.2400000000000091,0.060000000000002274],[0.47999999999998977,-0.29000000000002046],[0.25,0.060000000000002274],[2.880000000000024,-0.3100000000000023],[0.75,0.19999999999998863],[0.09999999999999432,0.5200000000000387],[-1.1599999999999966,-0.07000000000005002]],"o":[[5.460000000000008,1.660000000000025],[-0.21000000000000796,0.7799999999999727],[-0.28999999999999204,-0.06999999999999318],[-0.28999999999999204,-0.5099999999999909],[-0.4199999999999875,-0.10000000000002274],[-0.4900000000000091,-0.8500000000000227],[-0.4199999999999875,-0.10000000000002274],[-2.6500000000000057,-1.1299999999999955],[-0.8000000000000114,-0.19999999999998863],[0.5099999999999909,-0.18000000000000682],[-1.1200000000000045,0.18000000000000682],[0,0]],"v":[[195.33,304.67],[213.33,309],[211.66000000000003,310],[210.99000000000004,309.67],[209.66000000000003,309.34000000000003],[208.66000000000003,309.01000000000005],[206.99000000000004,308.68000000000006],[205.99000000000004,308.3500000000001],[196.66000000000003,306.3500000000001],[194.33,305.68000000000006],[195.66000000000003,305.02000000000004],[195.33,304.68000000000006]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8784,0.8824,0.8784]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[203.83002083459203,307.3350035593391]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[203.83002083459203,307.3350035593391]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 616","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 615","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.829999999999984,0.22000000000002728],[-0.5400000000000205,-0.8100000000000023],[2.009999999999991,0.4399999999999977],[-0.13999999999998636,-1.0699999999999932],[0.5800000000000409,0.3300000000000409],[-0.339999999999975,-0.040000000000020464],[-4.96999999999997,-0.5099999999999909]],"o":[[0,0],[-1.8999999999999773,-0.08999999999997499],[-0.8799999999999955,-0.11000000000001364],[-2.160000000000025,-0.5],[-0.6299999999999955,-0.13999999999998636],[-0.36000000000001364,-0.4700000000000273],[-0.4900000000000091,-0.3299999999999841],[4.560000000000002,0.5099999999999909],[0,0]],"v":[[274,297.33],[274.5,298],[268.8,297.03],[268.34000000000003,297.65999999999997],[262.28000000000003,295.88],[261.34000000000003,296.33],[259.18,294.65999999999997],[259.5,294.33],[274.01,297.33]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.902,0.9098,0.9059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[266.7342963001664,296.1586189372618]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[266.7342963001664,296.1586189372618]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 617","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 616","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.03999999999999204,-0.05000000000001137],[-0.11000000000001364,-0.6499999999999773],[-1.460000000000008,1.25],[0.2500000000000284,0.8500000000000227],[0.9699999999999989,-0.22999999999996135],[2.480000000000018,-0.03000000000002956],[-0.15000000000000568,-0.10000000000002274],[-0.44000000000002615,-0.009999999999990905],[0.8499999999999943,-0.06999999999999318],[1.8799999999999955,-0.4199999999999591],[0.11000000000001364,0],[1.4099999999999966,0.6100000000000136],[-0.5300000000000011,0.07999999999998408],[-0.03999999999999204,0.009999999999990905],[-4.630000000000024,1.7799999999999727]],"o":[[1.6799999999999784,0],[0.9799999999999898,1.1399999999999864],[0.2799999999999727,1.5500000000000114],[0.13999999999998636,-0.12000000000000455],[-1.6899999999999977,0.4800000000000182],[-2.2700000000000102,0.5500000000000114],[0.27000000000001023,0.3199999999999932],[0.28999999999999204,0.18999999999999773],[-0.5800000000000125,0.6399999999999864],[-1.9000000000000057,-0.19999999999998863],[-0.11000000000001364,0],[0,-2.3000000000000114],[0,-0.3299999999999841],[0.28999999999999204,-0.040000000000020464],[4.8799999999999955,-0.6499999999999773],[0,0]],"v":[[255.67,310],[255.67,310.5],[258.33,311.51],[255.54999999999998,312],[255.99999999999997,311.34],[254.83999999999997,310.67999999999995],[247.65999999999997,312.66999999999996],[248.37999999999997,314.28],[249.98999999999998,314.33],[247.32,314.65999999999997],[241.65,314.98999999999995],[241.32,314.98999999999995],[237.65,313.48999999999995],[240.81,313.30999999999995],[241.32,312.98999999999995],[255.65,309.98999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8706,0.8784,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[247.9962664200506,312.48997412273826]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[247.9962664200506,312.48997412273826]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 618","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 617","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-6.659999999999997,-0.6899999999999977],[0.040000000000020464,0.6299999999999955],[0,0],[0.15000000000000568,-0.589999999999975],[10.169999999999987,2.410000000000025],[-1.4599999999999795,0.05000000000001137],[-0.6800000000000068,-0.17000000000001592]],"o":[[0,0],[6.5,1.8100000000000023],[0.09000000000000341,0.040000000000020464],[0,0],[0.28999999999999204,0.4900000000000091],[-10.669999999999987,-0.029999999999972715],[-0.3400000000000034,-0.6100000000000136],[0.8300000000000125,0.19999999999998863],[0,0]],"v":[[215.67,309.67],[216.05999999999997,310.21000000000004],[235.90999999999997,313.54],[234.66999999999996,313.01000000000005],[241.33999999999995,313.01000000000005],[241.33999999999995,315.01000000000005],[211.66999999999996,310.01000000000005],[213.33999999999995,309.01000000000005],[215.66999999999996,309.68000000000006]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.8784,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[226.54095190401765,312.0100165761806]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[226.54095190401765,312.0100165761806]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 619","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 618","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6899999999999977,-1.4600000000000364],[2.2700000000000102,0.060000000000002274],[-0.4399999999999977,1.8999999999999773],[-1.990000000000009,1.0699999999999932],[-0.7400000000000091,0.45999999999997954]],"o":[[0.5799999999999841,1.1000000000000227],[-1,2.1499999999999773],[-1.6200000000000045,0.6100000000000136],[2.819999999999993,-0.37000000000000455],[0.9099999999999966,-0.35000000000002274],[0,0]],"v":[[260,308],[261.5,310.99],[250,314.33],[247.35,312.43],[255.66,310],[259.99,308]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.8784,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[254.47001055982693,311.27880434915187]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[254.47001055982693,311.27880434915187]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 620","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 619","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.07999999999998408,-0.3199999999999932],[4.409999999999968,-1.7699999999999818],[8.909999999999968,2.0400000000000205],[-1.0300000000000296,0.339999999999975],[-1.8899999999999864,0.07999999999998408],[-4.689999999999998,0.5199999999999818],[-0.12999999999999545,0.01999999999998181],[-3.2799999999999727,1.4799999999999613],[-1.7200000000000273,0.37999999999999545]],"o":[[-0.2799999999999727,0.22000000000002728],[2.9700000000000273,0.839999999999975],[-8.259999999999991,3.3000000000000114],[-0.8999999999999773,-0.36000000000001364],[2.0600000000000023,0.589999999999975],[4.699999999999989,0.4800000000000182],[0.14999999999997726,0.17000000000001592],[3.7099999999999795,-0.37000000000000455],[1.579999999999984,-0.589999999999975],[0,0]],"v":[[305.33,292.33],[304.33,293.33],[305.99,298.83],[268.33000000000004,297.66999999999996],[268.07000000000005,296.58],[274.00000000000006,297.34],[288.6700000000001,297.34],[289.0900000000001,297.63],[300.3400000000001,294.67],[305.3400000000001,292.34000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.8784,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[287.82285024087196,296.39237754990944]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[287.82285024087196,296.39237754990944]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 621","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 620","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.7600000000000051,1.8900000000000006],[-0.09999999999999432,0.10999999999999943],[-2.6999999999999886,2.150000000000002],[-1.4599999999999937,0.9500000000000028],[-0.8900000000000006,0.7799999999999976],[-16.879999999999995,-6.370000000000001],[-1.4699999999999989,-0.41999999999999815],[-1.6099999999999852,-0.490000000000002],[0.539999999999992,-3.66],[-0.009999999999990905,-0.060000000000002274],[6,-3.349999999999998],[-1.1599999999999966,-1.1300000000000026],[0.030000000000001137,-0.05000000000000426],[0.18000000000000682,0.020000000000003126],[0.539999999999992,0.8599999999999994],[0.07999999999998408,0.860000000000003],[0.8799999999999955,0.5399999999999991],[0.1599999999999966,-0.5],[1.1599999999999966,-0.3000000000000007],[0.7299999999999898,0.25],[0.9400000000000261,0.3400000000000034],[0.25,0.4800000000000004],[1.3300000000000125,0.3100000000000023],[0.4900000000000091,0.7000000000000028],[0.47999999999998977,0.39000000000000057],[0.3199999999999932,0.5200000000000031],[1.2800000000000011,0.4100000000000037],[0.8199999999999932,0.8000000000000043],[1.9300000000000068,0.28999999999999915],[1.5600000000000023,0.46999999999999886],[0.4099999999999966,0.6300000000000026],[2.1500000000000057,0.8599999999999994],[0.6099999999999994,0.5399999999999991],[0.5300000000000011,0.9099999999999966],[0,0],[2.3499999999999943,0.10999999999999943],[1.2600000000000051,0.39000000000000057],[0.10999999999999943,0.28000000000000114],[0.8400000000000034,0.9799999999999969],[1.6000000000000085,0.8599999999999994],[0.8799999999999955,0],[0,0],[0,0],[-17.690000000000026,2.2600000000000016],[-6.039999999999992,-1.4500000000000028],[1.6599999999999966,0.1700000000000017],[6.140000000000015,-0.7399999999999984],[15.239999999999995,-2.4499999999999957],[0.45000000000000284,-1.0900000000000034],[-1.0300000000000011,0.3999999999999986],[0,0],[0.4000000000000057,-0.020000000000003126],[1.789999999999992,0.35999999999999943]],"o":[[-2.3599999999999994,-0.46999999999999886],[0.7800000000000011,-0.8400000000000034],[0.23999999999999488,-0.240000000000002],[1.8900000000000006,-1.5],[0.6299999999999955,-0.41000000000000014],[13.790000000000006,-12.05],[1.960000000000008,0.7400000000000002],[1.4699999999999989,0.41999999999999815],[3.1599999999999966,0.9600000000000009],[-0.0800000000000125,0.5100000000000016],[0,0.48999999999999844],[1.4399999999999977,0.8500000000000014],[-0.05000000000001137,0.5700000000000003],[-0.18999999999999773,0.0799999999999983],[-0.8300000000000125,-0.10000000000000142],[-1.0300000000000011,0.4099999999999966],[-0.9000000000000057,0.9600000000000009],[-0.5999999999999943,-0.1700000000000017],[-1.1899999999999977,-0.6400000000000006],[-0.6100000000000136,0.25],[0.060000000000002274,0.5599999999999987],[-0.1699999999999875,0.5199999999999996],[-0.21999999999999886,0.5300000000000011],[-0.22999999999998977,0.8299999999999983],[-0.21999999999999886,0.6099999999999994],[0.05000000000001137,0.6599999999999966],[-0.539999999999992,0.7800000000000011],[-0.8600000000000136,0.5200000000000031],[-1.6200000000000045,0.740000000000002],[-1.7700000000000102,0.9200000000000017],[-0.12999999999999545,0.7999999999999972],[-1.8900000000000006,1.0700000000000003],[-0.37000000000000455,0.7700000000000031],[-0.45999999999999375,0.990000000000002],[0,0],[-2.3499999999999943,0.4200000000000017],[-0.5400000000000063,1.240000000000002],[-0.10999999999999943,0.28000000000000114],[-0.8400000000000034,0.8299999999999983],[-0.8499999999999943,1.0799999999999983],[-0.8900000000000006,0.00999999999999801],[0,0],[0,0],[17.700000000000003,-2.8999999999999986],[6.340000000000003,-0.7899999999999991],[3.3499999999999943,-2.09],[-6.110000000000014,-0.629999999999999],[-15.170000000000002,2.0500000000000007],[-1.1800000000000068,0.18999999999999773],[-0.6400000000000006,1.5600000000000023],[0,0],[1.1400000000000006,2.1300000000000026],[-1.019999999999996,0.060000000000002274],[0,0]],"v":[[85,39],[83.03,33.86],[85.67,32.66],[86.88,26.379999999999995],[93.46,23.959999999999994],[96.49,20.649999999999995],[147.89,12.929999999999996],[154.04999999999998,16.099999999999994],[158.58999999999997,16.899999999999995],[163.64999999999998,23.149999999999995],[163.01999999999998,24.159999999999997],[164.67,31.489999999999995],[168.33999999999997,34.66],[167.33999999999997,35.33],[166.78999999999996,35.449999999999996],[162.00999999999996,31.659999999999997],[160.33999999999997,30.989999999999995],[156.67,30.659999999999997],[155.53,31.159999999999997],[152,30.659999999999997],[150,30.659999999999997],[148.67,30.989999999999995],[148,30.989999999999995],[145.67,31.319999999999993],[144.33999999999997,31.319999999999993],[142.67,31.64999999999999],[142,31.64999999999999],[139.27,32.19999999999999],[136.67000000000002,32.319999999999986],[131.34,32.98999999999999],[126.34,33.65999999999999],[125.67,33.65999999999999],[119,34.65999999999999],[116.33,34.98999999999999],[114.66,34.98999999999999],[113.38,35.84999999999999],[106.33,36.319999999999986],[102,37.319999999999986],[101.67,37.319999999999986],[96.67,37.98999999999999],[93,38.319999999999986],[90.34,38.319999999999986],[90.67,37.319999999999986],[92.14,36.72999999999998],[145.23000000000002,28.98999999999998],[163.92000000000002,29.519999999999982],[158.93,25.339999999999982],[140.72,25.78999999999998],[95.18,32.38999999999998],[84.09,35.41999999999998],[88.94,37.009999999999984],[89.33,37.649999999999984],[87.55,38.039999999999985],[85,38.97999999999998]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0118,0.0118,0.0118]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[125.28587300058649,24.219665109784728]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[125.28587300058649,24.219665109784728]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 622","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 621","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-4.710000000000008,-0.37000000000000455],[0,0],[-0.060000000000002274,-0.009999999999990905],[-18.350000000000023,1.0499999999999545],[0.0800000000000125,0.2999999999999545],[0,0],[-2.9000000000000057,0.7700000000000387],[0.13999999999998636,0.11000000000001364],[0,0],[-6.329999999999984,-1.919999999999959],[1.5800000000000125,0.2599999999999909],[8.350000000000023,-0.410000000000025],[5.889999999999986,-0.4800000000000182],[33.64999999999999,5.539999999999964],[4.190000000000001,4.5],[-2.360000000000001,1.160000000000025],[-4.800000000000004,0.5],[0,0.8899999999999864],[-11.719999999999999,-3.0399999999999636]],"o":[[4.400000000000006,1.410000000000025],[0,0],[0,0.3299999999999841],[19.269999999999996,1.1100000000000136],[0.030000000000001137,0],[0,0],[2.9000000000000057,-0.2300000000000182],[0.009999999999990905,0],[0,0],[-2.759999999999991,7.610000000000014],[1.5600000000000023,0.8500000000000227],[-8.430000000000007,-2.160000000000025],[-5.860000000000014,0.29000000000002046],[-34.03999999999999,2.769999999999982],[-6.920000000000002,-1.1399999999999864],[-2.0700000000000003,-2.2200000000000273],[4.33,-2.1299999999999955],[0.7600000000000016,-0.07999999999998408],[8.57,8.649999999999977],[0,0]],"v":[[60.33,294.67],[74,297.34000000000003],[92,299.67],[90.78,299.84000000000003],[146.8,299.88000000000005],[146.33,299.6700000000001],[168.33,296.6700000000001],[177.89000000000001,294.87000000000006],[177.66000000000003,294.6700000000001],[186.66000000000003,292.3400000000001],[195.33,304.6700000000001],[194.33,305.6700000000001],[165.5,299.3400000000001],[147.49,301.3300000000001],[45.250000000000014,296.2400000000001],[9.110000000000014,286.21000000000015],[10.580000000000014,281.42000000000013],[26.840000000000018,278.35000000000014],[27.990000000000016,277.33000000000015],[60.320000000000014,294.66000000000014]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8667,0.8784,0.8706]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[102.07973752686422,291.5387016152269]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[102.07973752686422,291.5387016152269]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 623","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 622","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.8400000000000034,-4.979999999999997],[0.5099999999999909,-7.579999999999998],[0.37000000000000455,-4.049999999999997],[3.6100000000000136,-5.8700000000000045],[0,0],[-1.4800000000000182,-0.1700000000000017],[-1.0200000000000102,-6.989999999999995],[2.319999999999993,-2.049999999999997],[-6.869999999999976,-10.640000000000015],[-0.19999999999998863,0.37999999999999545],[-0.20999999999997954,0.8100000000000023],[-0.6500000000000057,2.1699999999999875],[-0.44999999999998863,1.3100000000000023],[1.7199999999999989,0.4399999999999977],[0.13999999999998636,6.02000000000001],[0,0],[-2.0900000000000034,0.18999999999999773],[-7,-0.6899999999999977],[0.3800000000000239,-3.3299999999999983],[0,0],[-0.6899999999999977,-3.8900000000000006],[1.3400000000000034,-3.719999999999999],[0.12999999999999545,-1.9300000000000068],[-0.2400000000000091,-0.9499999999999886],[1.6299999999999955,-5.339999999999975],[-7.319999999999993,-3.0800000000000125],[-4.27000000000001,-11.70999999999998],[-5.229999999999961,-17.069999999999993],[1.5600000000000023,-1.7199999999999989],[0.2599999999999909,-0.6100000000000136],[-0.2300000000000182,-0.3100000000000023],[-1.1899999999999977,-0.8700000000000045],[-1.0199999999999818,-0.75],[-0.5600000000000023,-0.39999999999997726],[-8.739999999999952,-3.009999999999991],[1.8899999999999864,-11.200000000000045],[1.5,-1.170000000000016],[0,0],[0.9399999999999977,0.8500000000000227],[3.759999999999991,0.22999999999996135],[0.2400000000000091,-0.14999999999997726],[1.349999999999966,0.7799999999999727],[0.21000000000003638,0.18999999999999773],[3.9600000000000364,1.079999999999984],[-0.06999999999999318,-0.6299999999999955],[3.8899999999999864,-2.420000000000016],[1.1099999999999852,0.4700000000000273],[0,0],[4.240000000000009,-0.7300000000000182],[0,0],[1.1499999999999773,0.05000000000001137],[1.5500000000000114,0.7699999999999818],[0.12000000000000455,0.009999999999990905],[5.939999999999998,1.589999999999975],[0.17000000000001592,0.2899999999999636],[0.21000000000000796,1],[0.960000000000008,0.660000000000025],[0.8700000000000045,0.4900000000000091],[0.36000000000001364,0.6399999999999864],[3.0800000000000125,0.5200000000000387],[0.4800000000000182,0.75],[1.7700000000000102,1.25],[-1,3.8500000000000227],[0,0],[0.5199999999999818,-0.1400000000000432],[3.160000000000025,-0.3199999999999932],[0,0],[0,0],[1.1500000000000057,-0.3199999999999932],[17.659999999999997,1.6899999999999977],[0.1799999999999926,-0.5699999999999932],[0,0],[0,0],[4.400000000000006,1.2800000000000296],[0.30000000000000426,-0.040000000000020464],[3.1799999999999997,1.6999999999999886],[1.1699999999999982,2.7600000000000477],[0.07000000000000028,0.30000000000001137],[-29.310000000000002,31.950000000000017],[-0.6199999999999974,1],[-1.6900000000000048,5.760000000000005],[-6.579999999999998,6.659999999999997],[-1.6999999999999957,2.969999999999999],[-2.3599999999999994,7.300000000000011],[-4.989999999999995,7.309999999999995],[0.6100000000000136,1.1199999999999974],[-1.3699999999999903,-0.35999999999999943],[0,0],[-0.45000000000000284,-0.8999999999999986],[-0.8299999999999983,-0.3200000000000003],[0.29000000000000625,-0.11999999999999744],[0.3400000000000034,0.1700000000000017],[0.12000000000000455,0.8100000000000023],[0,0],[0.2600000000000051,0.6300000000000026],[0,0],[1.0699999999999932,-1.8700000000000045],[0,0],[1.2099999999999937,-0.3999999999999986],[1.0499999999999972,-0.18999999999999773],[1.0699999999999932,-0.1700000000000017],[0.6099999999999994,-0.18999999999999773],[0.5799999999999983,-0.7800000000000011],[0,0],[0,0],[1.8700000000000045,-5.519999999999996],[0.9399999999999977,-1.230000000000004],[1.0600000000000023,-0.12999999999999545],[0.980000000000004,-0.060000000000002274],[0.8400000000000034,-0.030000000000001137],[0.6099999999999994,-0.8200000000000074],[-0.6400000000000006,-0.28000000000000114],[-0.8499999999999943,0.18000000000000682],[-1.1000000000000085,-0.29000000000000625],[-0.9399999999999977,-0.37000000000000455],[-0.8599999999999994,-0.45999999999999375],[-0.46999999999999886,-0.23999999999999488],[-0.5600000000000023,-0.4099999999999966],[-1.4399999999999977,0.060000000000002274],[-1.6599999999999966,0.10999999999999943],[-1.0699999999999932,0.04999999999999716],[-0.9699999999999989,-0.4399999999999977],[-1.0400000000000063,-0.3500000000000085],[-1.4300000000000068,-0.04000000000000625],[-1.0400000000000063,-0.35999999999999943],[-1.3199999999999932,0.19000000000000483],[-1.3599999999999994,-0.4200000000000017],[-0.8499999999999943,-0.6099999999999994],[-1.7900000000000063,0.6799999999999997],[-0.9000000000000057,-0.22999999999999687],[-0.7800000000000011,0.6099999999999994],[-0.4099999999999966,-0.11999999999999744],[-0.9699999999999989,0.30999999999999517],[-0.6500000000000057,-0.3400000000000034],[-0.8100000000000023,-0.1700000000000017],[-0.7600000000000051,-0.3299999999999983],[-0.8599999999999994,-0.6499999999999986],[-1.3900000000000006,0.3500000000000014],[-0.12999999999999545,-0.14000000000000057],[-0.8199999999999932,-0.6499999999999986],[-0.07000000000000739,0.10999999999999943],[-0.480000000000004,0.15000000000000568],[-0.12999999999999545,-0.10000000000000142],[-0.8100000000000023,-0.21000000000000085],[-0.18000000000000682,-0.7100000000000009],[-0.19999999999998863,-0.740000000000002],[-0.5900000000000034,-0.8100000000000023],[-0.38999999999998636,-0.28999999999999915],[-0.28000000000000114,-0.6099999999999994],[-1.1100000000000136,-1.2600000000000051],[-1.2700000000000102,-1.1400000000000006],[0,0],[-0.09999999999999432,-0.9099999999999966],[-0.9799999999999898,-0.5300000000000011],[-0.4099999999999966,-0.8100000000000023],[-0.5300000000000011,-0.7600000000000051],[-0.05000000000001137,0.38999999999999346],[-0.37000000000000455,0.14999999999999858],[-0.13000000000002387,-0.28999999999999915],[-1.289999999999992,-0.6099999999999994],[-1.4099999999999966,-0.1700000000000017],[-0.7800000000000011,-0.13000000000000256],[-0.6499999999999773,-0.6999999999999957],[-0.5700000000000216,-0.9799999999999969],[0.040000000000020464,-0.29999999999999716],[-0.5999999999999943,0.3400000000000034],[-0.6800000000000068,-0.19999999999999574]],"o":[[3.680000000000007,3.5900000000000034],[-3.5200000000000102,6.170000000000002],[-0.27000000000001023,4.089999999999996],[-0.6100000000000136,6.739999999999995],[0,0],[1.9000000000000057,0.010000000000005116],[2.3700000000000045,0.269999999999996],[0.5500000000000114,3.769999999999996],[8.129999999999995,9.760000000000005],[0.13999999999998636,0],[0.5500000000000114,-1.0600000000000023],[0.28999999999999204,-1.1100000000000136],[0.4399999999999977,-1.4799999999999898],[-2.280000000000001,-0.18999999999999773],[-3.4000000000000057,-0.8799999999999955],[0,0],[0.8000000000000114,-1.8400000000000034],[7.069999999999993,0.39000000000000057],[3.2700000000000102,0.3199999999999932],[0,0],[2.530000000000001,3.010000000000005],[0.5999999999999943,3.4099999999999966],[-0.9399999999999977,2.6200000000000045],[-0.05000000000001137,0.7700000000000102],[1.3799999999999955,5.550000000000011],[7.650000000000006,-1.1500000000000057],[12.419999999999987,5.22999999999999],[6.1200000000000045,16.77000000000001],[0.12999999999999545,2.4099999999999966],[-0.9399999999999977,1.039999999999992],[-0.160000000000025,0.37000000000000455],[0.44999999999998863,0.6100000000000136],[1.3199999999999932,0.960000000000008],[0.5500000000000114,0.39999999999997726],[7.470000000000027,5.319999999999993],[7.560000000000002,2.6000000000000227],[-0.37999999999999545,2.230000000000018],[0,0],[-0.5699999999999932,0.8500000000000227],[-3.5,1.490000000000009],[-0.20999999999997954,0.18999999999999773],[-1.339999999999975,0.7900000000000205],[-0.2400000000000091,-0.13999999999998636],[-4.009999999999991,0.040000000000020464],[-0.660000000000025,-0.19999999999998863],[2.6000000000000227,3.3500000000000227],[0.10000000000002274,1.3600000000000136],[0,0],[-4.150000000000006,1.1800000000000068],[0,0],[-1.1200000000000045,0.17000000000001592],[-0.6100000000000136,0.6499999999999773],[-0.13999999999998636,0.18999999999999773],[-6.030000000000001,-0.5],[-0.22999999999998977,-0.060000000000002274],[-1.3400000000000034,0.5600000000000023],[-1.0999999999999943,0.5699999999999932],[-0.9900000000000091,0],[-0.5999999999999943,0.4200000000000159],[-3.030000000000001,-0.7699999999999818],[-0.8199999999999932,0.37999999999999545],[-1.960000000000008,0.5400000000000205],[-3.289999999999992,-2.3000000000000114],[0,0],[-0.19999999999998863,-0.6200000000000045],[-3.0500000000000114,1.009999999999991],[0,0],[0,0],[-0.4399999999999977,-0.5500000000000114],[-17.72999999999999,1.6100000000000136],[-0.980000000000004,-0.2699999999999818],[0,0],[0,0],[-4.569999999999993,-0.2699999999999818],[-0.28999999999999915,0.10000000000002274],[-2.9200000000000017,0.38999999999998636],[-3.1799999999999997,-1.6999999999999886],[-0.120000000000001,-0.2799999999999727],[-32.39,-32.71000000000001],[1.2199999999999989,-1.3300000000000125],[2.979999999999997,-4.789999999999992],[2.6599999999999966,-9.069999999999993],[2.1099999999999994,-2.1299999999999955],[3.8699999999999974,-6.719999999999999],[2.730000000000004,-8.439999999999998],[0.6800000000000068,-0.990000000000002],[0.9399999999999977,-1.1199999999999974],[0,0],[-0.06999999999999318,-1.009999999999998],[0.730000000000004,0.3500000000000014],[0.29000000000000625,0.09000000000000341],[-0.269999999999996,0.29999999999999716],[-0.12999999999999545,0.7199999999999989],[0,0],[-0.0799999999999983,0.6599999999999966],[0,0],[-1.8299999999999983,0.7700000000000031],[0,0],[0.04000000000000625,1.240000000000002],[0.4399999999999977,1.0700000000000003],[0.3499999999999943,1.0200000000000031],[0.5699999999999932,0.4299999999999997],[-0.29999999999999716,0.7700000000000031],[0,0],[0,0],[-1.8700000000000045,5.399999999999999],[0.28000000000000114,1.4699999999999989],[0.6099999999999994,0.7900000000000063],[0.7000000000000028,0.5999999999999943],[0.7900000000000063,0.6099999999999994],[0.37000000000000455,0.7000000000000028],[0.7199999999999989,-0.9200000000000017],[0.46999999999999886,-0.730000000000004],[-0.04999999999999716,-1.1400000000000006],[-0.2600000000000051,-1.0999999999999943],[-0.480000000000004,-0.8199999999999932],[0.23999999999999488,-0.4300000000000068],[-0.09999999999999432,-0.6299999999999955],[0.10999999999999943,-1.269999999999996],[1.0100000000000051,-1.8900000000000006],[0.23999999999999488,-1.0499999999999972],[0.04000000000000625,-0.8299999999999983],[-0.15000000000000568,-1.0999999999999943],[0.18000000000000682,-1.4000000000000057],[-0.15000000000000568,-1.0999999999999943],[0.3499999999999943,-1.2800000000000011],[0.269999999999996,-1.0900000000000034],[-0.14000000000000057,-0.9799999999999969],[0.6200000000000045,-1.7999999999999972],[-0.480000000000004,-0.759999999999998],[0.769999999999996,-0.7199999999999989],[0.06999999999999318,-0.3999999999999986],[0.46999999999999886,-1.2999999999999972],[-0.04999999999999716,-0.5399999999999991],[0.269999999999996,-0.7999999999999972],[0.12000000000000455,-1.2199999999999989],[-0.39000000000000057,-0.9299999999999997],[0.6099999999999994,-0.990000000000002],[0.09000000000000341,-0.14999999999999858],[-0.29000000000000625,-0.9200000000000017],[-0.01999999999999602,-0.1599999999999966],[0.0799999999999983,-0.11999999999999744],[0.09000000000000341,-0.030000000000001137],[0.6200000000000045,-0.5],[0.04000000000000625,-0.740000000000002],[0.47999999999998977,-0.509999999999998],[0.28999999999999204,-0.8100000000000023],[0.0800000000000125,-0.5300000000000011],[0.05000000000001137,-0.6899999999999977],[1.210000000000008,-0.740000000000002],[0.7299999999999898,-0.6899999999999977],[0,0],[0.3400000000000034,-0.8400000000000034],[0.3499999999999943,-0.5300000000000011],[0.21999999999999886,-0.8999999999999986],[0.12999999999999545,-0.8800000000000026],[0.7700000000000102,-0.09000000000000341],[0.1599999999999966,0.46000000000000085],[0.09000000000000341,-0.28999999999999915],[0.9699999999999989,-1.1799999999999997],[0.37000000000000455,-1.0600000000000023],[-0.11000000000001364,-0.3500000000000014],[-0.18999999999999773,-1.0200000000000031],[-0.12000000000000455,-1.0600000000000023],[0.03999999999999204,-1.5399999999999991],[-0.020000000000010232,0.14999999999999858],[-0.21000000000000796,-0.8599999999999994],[0,0]],"v":[[168.33,34.67],[170.8,44.64],[160.98000000000002,62.82],[160.98000000000002,75.49],[150.92000000000002,100.1],[147.65,104.99],[154.20000000000002,108.58],[167.63000000000002,107.85],[161.66000000000003,115.16],[182.49,146.99],[184.05,144.56],[187.12,138.01],[187.08,132.59],[188.99,129.34],[181.74,125.42],[171.98000000000002,120.52],[186.93,70.44],[191.16,67],[212.82,67.67],[217.23999999999998,73.08],[210.05999999999997,96.24],[216.50999999999996,108.66],[211.99999999999997,124.85],[207.04999999999998,137.6],[208.23,140.60999999999999],[206.66,156.33999999999997],[229.10999999999999,157.39],[250.14,187.01999999999998],[265.90999999999997,238.26],[261.99999999999994,245.51999999999998],[256.80999999999995,250.35],[257.68999999999994,253.15],[261.43999999999994,254.73000000000002],[264.1499999999999,258.02000000000004],[265.9799999999999,258.86],[289.3199999999999,273.19],[309.3099999999999,288.16],[305.32999999999987,292.34000000000003],[304.21999999999986,293.03000000000003],[300.32999999999987,294.67],[288.65999999999985,297.34000000000003],[287.98999999999984,297.86],[274.65999999999985,297.86],[273.98999999999984,297.35],[261.9499999999998,295.27000000000004],[261.3199999999998,296.35],[259.98999999999984,308.02000000000004],[255.65999999999983,310.02000000000004],[255.22999999999982,310.66],[242.63999999999982,313.52000000000004],[241.3299999999998,313.02000000000004],[237.90999999999983,313.20000000000005],[234.66999999999982,313.02000000000004],[234.2699999999998,313.34000000000003],[216.2499999999998,310.27000000000004],[215.6699999999998,309.68000000000006],[213.33999999999978,309.01000000000005],[210.59999999999977,308.59000000000003],[207.80999999999977,307.87],[206.37999999999977,307.54],[197.19999999999976,305.5],[195.32999999999976,304.67],[188.77999999999975,302.53000000000003],[185.60999999999976,293.3],[178.75999999999976,295.07],[177.65999999999977,294.67],[168.32999999999976,296.67],[168.10999999999976,297.37],[148.70999999999975,300.02],[146.32999999999976,299.66999999999996],[91.99999999999976,299.66999999999996],[90.25999999999976,300.11999999999995],[74.29999999999976,298.04999999999995],[73.98999999999975,297.34],[60.31999999999975,294.66999999999996],[59.43999999999975,294.9],[41.93999999999975,288.32],[28.24999999999975,278.21999999999997],[27.98999999999975,277.34],[34.48999999999975,141.99999999999997],[40.13999999999975,136.64999999999998],[45.909999999999755,115.74999999999997],[58.81999999999975,93.99999999999997],[63.82999999999975,88.67999999999998],[71.56999999999975,66.08999999999997],[82.91999999999975,42.769999999999975],[84.98999999999974,39.00999999999998],[88.97999999999973,38.13999999999998],[89.31999999999974,37.67999999999998],[90.64999999999974,37.34999999999998],[92.97999999999973,38.34999999999998],[92.97999999999973,38.67999999999998],[91.97999999999973,38.67999999999998],[90.79999999999973,38.82999999999998],[89.97999999999973,39.00999999999998],[89.30999999999973,39.00999999999998],[89.13999999999973,39.46999999999998],[84.78999999999974,43.42999999999998],[84.29999999999974,43.339999999999975],[82.96999999999974,45.339999999999975],[81.63999999999974,47.339999999999975],[80.63999999999974,49.00999999999998],[79.96999999999974,50.339999999999975],[78.63999999999974,52.66999999999997],[78.82999999999974,53.25999999999998],[76.61999999999975,57.619999999999976],[70.99999999999974,73.99999999999997],[69.62999999999974,78.67999999999998],[68.95999999999974,80.67999999999998],[68.62999999999974,82.00999999999998],[67.62999999999974,84.00999999999998],[67.26999999999974,86.29999999999998],[69.29999999999974,85.33999999999999],[71.29999999999974,83.66999999999999],[72.96999999999974,82.33999999999999],[74.29999999999974,81.33999999999999],[75.29999999999974,80.33999999999999],[76.29999999999974,79.66999999999999],[77.29999999999974,78.66999999999999],[79.62999999999974,76.66999999999999],[83.62999999999974,73.66999999999999],[85.62999999999974,71.99999999999999],[86.95999999999974,70.66999999999999],[88.62999999999974,69.33999999999999],[91.29999999999974,67.00999999999999],[92.96999999999974,65.67999999999999],[95.96999999999974,63.00999999999999],[97.96999999999974,61.33999999999999],[99.29999999999974,60.33999999999999],[103.29999999999974,56.66999999999999],[103.96999999999974,55.66999999999999],[106.29999999999974,53.66999999999999],[106.96999999999974,52.999999999999986],[109.63999999999974,50.66999999999999],[110.63999999999974,49.66999999999999],[113.30999999999975,47.33999999999999],[114.63999999999974,46.00999999999999],[116.63999999999974,44.33999999999999],[119.63999999999974,42.33999999999999],[119.96999999999974,42.33999999999999],[121.96999999999974,41.00999999999999],[122.02999999999975,40.58999999999999],[124.61999999999975,39.52999999999999],[124.96999999999974,39.66999999999999],[127.63999999999974,38.999999999999986],[128.30999999999975,38.999999999999986],[130.30999999999975,38.999999999999986],[131.63999999999976,38.999999999999986],[132.63999999999976,38.999999999999986],[133.63999999999976,38.999999999999986],[137.63999999999976,39.66999999999999],[140.63999999999976,40.33999999999999],[141.48999999999975,40.40999999999999],[142.96999999999974,40.66999999999999],[144.96999999999974,40.66999999999999],[145.96999999999974,40.66999999999999],[147.29999999999976,40.33999999999999],[148.51999999999975,39.60999999999999],[149.29999999999976,40.00999999999999],[149.62999999999977,40.00999999999999],[153.29999999999976,38.67999999999999],[155.96999999999974,37.349999999999994],[156.96999999999974,37.019999999999996],[158.63999999999973,36.349999999999994],[161.96999999999974,35.349999999999994],[167.35999999999973,35.669999999999995],[167.29999999999973,35.349999999999994],[168.29999999999973,34.67999999999999]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0157,0.0196,0.0196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[158.59790842789116,174.1098515638135]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[158.59790842789116,174.1098515638135]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 624","it":[{"ty":"rc","bm":0,"hd":false,"nm":"Rectangle 1","d":1,"p":{"a":0,"k":[160.5,160.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[321,321]}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9961,0.9961,0.9922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[160.50004350115844,160.50000077122638]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[160.50004350115844,160.50000077122638]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"tr","a":{"a":0,"k":[175.1650126774173,160.50000077122638]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[175.1650126774173,160.50000077122638]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":1}]}]} \ No newline at end of file diff --git a/assets/animations/lottie/onboarding_2.json b/assets/animations/lottie/onboarding_2.json new file mode 100644 index 0000000..635c634 --- /dev/null +++ b/assets/animations/lottie/onboarding_2.json @@ -0,0 +1 @@ +{"nm":"Main Scene","ddd":0,"h":600,"w":600,"meta":{"g":"@lottiefiles/creator 1.53.2"},"layers":[{"ty":3,"nm":"▽ Pointer","sr":1,"st":33,"op":333,"ip":33,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[18,18,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0,"y":1},"s":[0,0,100],"t":33},{"s":[100,100,100],"t":52.662109375}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[200.366,132,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ind":1},{"ty":4,"nm":"Oval","sr":1,"st":33,"op":333,"ip":33,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0,"y":1},"s":[0,0,100],"t":33},{"s":[100,100,100],"t":52.662109375}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[154.13194788100154,97.92115383279175],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Oval","ix":1,"cix":2,"np":2,"it":[{"ty":"el","bm":0,"hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"타원 패스 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"s":{"a":0,"k":[9,9],"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"ì¹  1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2,"parent":1},{"ty":4,"nm":"Oval","sr":1,"st":33,"op":333,"ip":33,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0,"y":1},"s":[0,0,100],"t":33},{"s":[100,100,100],"t":52.662109375}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[154.13194788100154,97.92115383279175],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Oval","ix":1,"cix":2,"np":2,"it":[{"ty":"el","bm":0,"hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"타원 패스 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"s":{"a":0,"k":[12,12],"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"ì¹  1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3,"parent":1},{"ty":4,"nm":"선 그래프","sr":1,"st":0,"op":300,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[63.614528597175166,63.614528597175166],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[328.28903648459885,231.7706925301814],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Line","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"패스 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-9.34,-12.12],[-3.82,5.83],[-3.99,2.03],[-5.83,3.86],[-9.09,-5.68],[-2.66,3.05],[-6.56,0]],"o":[[0,0],[2.63,3.81],[3.82,-5.82],[3.99,-2.03],[5.82,-3.87],[9.1,5.68],[2.66,-3.05],[6.56,0]],"v":[[-52.5,1.017],[-33.58,13.137],[-22.36,12.217],[-13.46,9.267],[-1.34,-8.113],[19.74,-1.993],[42.39,-9.973],[52.5,-16.293]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"선 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"패스 다듬어 자르기 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"s":[100],"t":60}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":0,"k":0,"ix":1},"m":1}],"ind":4},{"ty":4,"nm":"Combined Shape","sr":1,"st":0,"op":300,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[259.509,218.988],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Combined Shape","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"패스 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[],"o":[],"v":[]},"ix":2}},{"ty":"mm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Merge","nm":"패스 병합 1","mm":2},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"ì¹  1","c":{"a":0,"k":[1,0.6314,0.4863],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5,"parent":7},{"ty":0,"nm":"Nested Scene 1","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[169,184]},"s":{"a":0,"k":[181.12952124890413,181.12952124890418]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[293.89113357369826,333.27832519762273]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"w":338,"h":368,"refId":"precomp_Shape Layer - SVG_E1IBxryKEm_33dbc843-0e3c-4c8e-ba87-49acf21664f0","ind":6},{"ty":3,"nm":"▽ Graph","sr":1,"st":0,"op":300,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[157.5,62.994,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[187.866,177.006,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ind":7}],"v":"5.7.0","fr":60,"op":150,"ip":0,"assets":[{"nm":"Nested Scene 1","id":"precomp_Shape Layer - SVG_E1IBxryKEm_33dbc843-0e3c-4c8e-ba87-49acf21664f0","fr":60,"layers":[{"ty":4,"nm":"Layer_1-2","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ln":"Layer_1-2","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[169,184]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[169,184]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","bm":0,"hd":false,"nm":"Group 1","it":[{"ty":"gr","bm":0,"hd":false,"nm":"Group 2","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.0699999999999932,1.0799999999999983],[-0.28999999999999204,-0.30000000000001137]],"o":[[0.3499999999999943,0.3499999999999943],[-0.8100000000000023,-1.4300000000000068],[0,0]],"v":[[73.5,110.5],[69.01,114.99],[73.5,110.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.898,0.898]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[71.22216071428574,112.80899107142858]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[71.22216071428574,112.80899107142858]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 3","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-3.319999999999993,-1.1399999999999935],[0.4300000000000068,-1.2000000000000028]],"o":[[0,0],[0.05000000000001137,-2.280000000000001],[1.009999999999991,0.7199999999999989],[0,0]],"v":[[144.98,64.49],[142.48,63.669999999999995],[145.04,59.21999999999999],[144.98,64.49]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8902,0.898,0.898]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[144.00317857142852,61.73891071428571]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[144.00317857142852,61.73891071428571]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 4","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-1.8099999999999454,-4.170000000000002],[2.819999999999993,0.0799999999999983],[0.410000000000025,3.8799999999999955],[0,0]],"o":[[-0.660000000000025,4.75],[-2.8000000000000114,2.230000000000004],[1.1999999999999886,-3.5900000000000034],[0,0],[0,0]],"v":[[296,105.5],[298.53,117.7],[290.5,116],[292,105.5],[296.01,105.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9725,0.9765,0.9765]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[294.515,111.94702232142858]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[294.515,111.94702232142858]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 5","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 4","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.6500000000000057,-0.9300000000000068],[-0.4899999999999949,-0.3400000000000034],[-0.21999999999999886,-0.7199999999999989],[1.3199999999999932,0.18000000000000682],[0,0],[3.6699999999999875,-0.7800000000000011],[4.02000000000001,-1.9100000000000108],[2.3000000000000043,-0.7600000000000193],[1.3599999999999994,3.7700000000000102],[-0.3299999999999983,0.7699999999999818],[-1.6400000000000006,2.480000000000004],[-0.980000000000004,1.7199999999999989],[-5.210000000000008,-5.170000000000002],[-0.3400000000000034,0.3999999999999915],[-1.7399999999999949,0.5600000000000023]],"o":[[1.8499999999999943,-0.5900000000000034],[0.3400000000000034,0.5],[0.75,0.5100000000000051],[0.730000000000004,2.4200000000000017],[0,0],[-0.18999999999999773,1.0600000000000023],[-5.290000000000006,1.1299999999999955],[-2.1499999999999986,1.0300000000000011],[-1.4799999999999969,0.4900000000000091],[0.10000000000000142,-1.2299999999999898],[1.1400000000000006,-2.6599999999999966],[1.3299999999999983,-2.010000000000005],[1.5399999999999991,-2.719999999999999],[0.3400000000000034,0.060000000000002274],[1.230000000000004,-1.4699999999999989],[0,0]],"v":[[71.25,104.5],[73.48,107.26],[76.73,110.51],[79.5,111.74000000000001],[74.98,113.26],[72.05,116.81],[73.23,121.46000000000001],[63.53,128.76000000000002],[55.36,131.09000000000003],[50.57,131.81000000000003],[52.74,128.96000000000004],[55.78,119.50000000000003],[62.03,113.25000000000003],[66.82000000000001,111.93000000000004],[70.30000000000001,109.49000000000004],[71.26,104.47000000000004]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 5","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.8200000000000074,-1.4200000000000017],[0.3500000000000085,0.3399999999999892]],"o":[[-0.29999999999999716,-0.29999999999999716],[1.0799999999999983,1.0799999999999983],[0,0]],"v":[[73.5,110.5],[69.01,114.99],[73.5,110.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1725,0.2196,0.2235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[65.07983928571426,118.91038392857142]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[65.07983928571426,118.91038392857142]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 6","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 6","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.2699999999999818,-1.980000000000004],[6.200000000000017,0.2600000000000051],[1.759999999999991,3.789999999999992],[-2.509999999999991,2.3999999999999986],[-0.9200000000000159,0.3299999999999983],[-5,-2.3400000000000034],[-0.37000000000000455,-0.29999999999999716]],"o":[[1.4499999999999886,1.2100000000000009],[-0.7800000000000011,5.780000000000001],[-4.310000000000002,-0.18000000000000682],[-1.4300000000000068,-3.0799999999999983],[0.3400000000000034,-0.3200000000000003],[5.849999999999994,-2.0900000000000034],[0.8000000000000114,0.36999999999999744],[0,0]],"v":[[156.38,57.12],[157.37,67.62],[143.79,81.47],[132.06,72.18],[131.72,57.470000000000006],[140.15,53.400000000000006],[153.5,56.24000000000001],[156.38,57.11000000000001]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 7","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.009999999999991,0.7099999999999937],[0.05000000000001137,-2.280000000000001],[0,0]],"o":[[0.4300000000000068,-1.2000000000000028],[-3.319999999999993,-1.1400000000000006],[0,0],[0,0]],"v":[[144.98,64.49],[145.04,59.22],[142.48,63.67],[144.98,64.49]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1529,0.2039,0.2078]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[143.9506785714285,67.05408482142856]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[143.9506785714285,67.05408482142856]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 7","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 8","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.21000000000000796,-0.29999999999999716],[4.329999999999984,-1.6000000000000014],[0.5699999999999932,0.8800000000000026],[-5.640000000000015,-6.340000000000003]],"o":[[0.3100000000000023,0.3500000000000014],[-4.6299999999999955,1.4600000000000009],[-0.6999999999999886,0.259999999999998],[-3.1599999999999966,-8.829999999999998],[0,0]],"v":[[240.34,42.65],[240.99,44.48],[227.36,52.12],[225.23000000000002,52.019999999999996],[240.34000000000003,42.65]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1647,0.2157,0.2196]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[232.88324999999998,46.34743526785714]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[232.88324999999998,46.34743526785714]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 8","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 9","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[7.909999999999997,3.6500000000000057],[-2.430000000000007,1.6799999999999997],[-3.0100000000000193,1.3400000000000034],[-0.7600000000000193,-0.20000000000000284]],"o":[[2.569999999999993,8.090000000000003],[-2.0600000000000023,-0.9500000000000028],[2.75,-1.8999999999999986],[0.5900000000000034,-0.259999999999998],[0,0]],"v":[[242.5,46],[229.81,57.44],[228.34,53.58],[240.73000000000002,46.47],[242.50000000000003,46]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1725,0.2235,0.2275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[235.1024285714285,52.18986607142857]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[235.1024285714285,52.18986607142857]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 9","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 10","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8700000000000045,0.0800000000000054],[0.30000000000001137,-0.4299999999999997],[-1.8100000000000023,-1.1700000000000017],[-0.1599999999999966,-1.5300000000000011],[0.6200000000000045,4.310000000000002],[-2.5600000000000023,1.9200000000000017],[-2.25,0.6999999999999993],[2.5999999999999943,-5.140000000000001],[-1.0999999999999943,3.3100000000000023],[0.5999999999999943,2.1099999999999994],[2.6899999999999977,-2.1899999999999977],[0,0]],"o":[[-2.1500000000000057,0.9699999999999989],[-0.36000000000001364,-0.030000000000001137],[-1.1399999999999864,1.6300000000000026],[1.0800000000000125,0.7000000000000028],[0.37999999999999545,3.6599999999999966],[-0.4900000000000091,-3.3800000000000026],[2.1299999999999955,-1.6000000000000014],[5.6299999999999955,-1.7600000000000016],[-1.1599999999999966,2.280000000000001],[0.4900000000000091,-1.490000000000002],[-1.5200000000000102,-5.359999999999999],[0,0],[0,0]],"v":[[230.5,40],[226.76,37.62],[220.48,41.36],[221.22,47.03],[224.03,48.75],[217.03,45.21],[220.34,38.08],[234.64000000000001,29.88],[242.44000000000003,39.17],[239.39000000000001,38.63],[240.19000000000003,35.09],[229.72000000000003,35.980000000000004],[230.50000000000003,39.99]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1922,0.2392,0.2431]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[230.04664285714284,39.99126339285714]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[230.04664285714284,39.99126339285714]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 10","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 11","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[2.170000000000016,-6.6000000000000085],[3.2100000000000364,0.21999999999999886],[2.569999999999993,8.950000000000003],[-1.2600000000000477,0],[0,0]],"o":[[0,0],[0,0],[-1.9599999999999795,7.409999999999997],[-1.1999999999999886,3.6599999999999966],[-18.45999999999998,-1.2800000000000011],[-2.3600000000000136,0.04999999999999716],[0,0],[0,0]],"v":[[299.75,102.5],[300.47,104.71],[298.47,105.80999999999999],[305.28000000000003,128.54],[290.23,131.53],[289.54,105.81],[288.26000000000005,102.5],[299.76000000000005,102.5]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 12","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.1999999999999886,-3.5900000000000034],[-2.7999999999999545,2.230000000000004],[-0.660000000000025,4.75]],"o":[[0,0],[0.410000000000025,3.8799999999999955],[2.829999999999984,0.0799999999999983],[-1.8199999999999932,-4.170000000000002],[0,0]],"v":[[296,105.5],[291.99,105.5],[290.49,116],[298.52,117.7],[295.99,105.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1725,0.2235,0.2275]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[293.98592857142853,117.08683928571429]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[293.98592857142853,117.08683928571429]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 11","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 13","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-8.780000000000001,-0.6200000000000045],[-0.5799999999999983,-8.909999999999997],[0.5499999999999972,-8.510000000000005],[9.290000000000006,-0.5999999999999943],[8.509999999999998,0.5500000000000114],[0.6000000000000014,9.289999999999992],[-0.5499999999999972,8.509999999999991],[-8.649999999999999,0.769999999999996]],"o":[[8.729999999999997,-0.769999999999996],[8.780000000000001,0.6200000000000045],[0.5499999999999972,8.510000000000005],[-0.5999999999999943,9.300000000000011],[-8.510000000000005,0.5500000000000114],[-9.300000000000004,-0.5999999999999943],[-0.5499999999999972,-8.510000000000005],[0.5399999999999991,-8.469999999999999],[0,0]],"v":[[48.9,92.65],[80.25,92.51],[91.53,104.23],[91.53,133.77],[79.78,145.52],[50.24,145.52],[38.49,133.77],[38.49,104.23000000000002],[48.910000000000004,92.65000000000002]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 14","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[1.2399999999999949,-1.4699999999999989],[0.3400000000000034,0.060000000000002274],[1.5399999999999991,-2.7299999999999898],[1.3399999999999963,-2.010000000000005],[1.1400000000000006,-2.6599999999999966],[0.10999999999999943,-1.2399999999999807],[-1.4799999999999969,0.47999999999998977],[-2.1600000000000037,1.0300000000000011],[-5.289999999999992,1.1299999999999955],[-0.18999999999999773,1.0600000000000023],[0,0],[0.730000000000004,2.4200000000000017],[0.75,0.5100000000000051],[0.3400000000000034,0.5],[1.8500000000000085,-0.5999999999999943]],"o":[[-1.7399999999999949,0.5600000000000023],[-0.3400000000000034,0.4000000000000057],[-5.210000000000001,-5.170000000000002],[-0.9699999999999989,1.7199999999999989],[-1.6400000000000006,2.480000000000004],[-0.3299999999999983,0.7599999999999909],[1.3599999999999994,3.7700000000000102],[2.289999999999999,-0.7599999999999909],[4.020000000000003,-1.9200000000000017],[3.6599999999999966,-0.7800000000000011],[0,0],[1.3299999999999983,0.18000000000000682],[-0.21999999999999886,-0.730000000000004],[-0.4899999999999949,-0.3400000000000034],[-0.6400000000000006,-0.9300000000000068],[0,0]],"v":[[71.25,104.5],[70.29,109.52],[66.81,111.96],[62.02,113.27999999999999],[55.77,119.52999999999999],[52.730000000000004,128.98999999999998],[50.56,131.83999999999997],[55.35,131.11999999999998],[63.52,128.78999999999996],[73.22,121.48999999999997],[72.03999999999999,116.83999999999996],[74.97,113.28999999999996],[79.49,111.76999999999997],[76.72,110.53999999999996],[73.47,107.28999999999996],[71.24,104.52999999999996]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9922,0.9922,0.9922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[65.01,118.78880357142857]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[65.01,118.78880357142857]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 12","it":[{"ty":"rc","bm":0,"hd":false,"nm":"Rectangle 1","d":1,"p":{"a":0,"k":[87.495,160.495]},"r":{"a":0,"k":0},"s":{"a":0,"k":[0.99,0.99]}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.149,0.1843,0.1882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[87.495,160.495]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[87.495,160.495]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 13","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 15","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.8400000000000034,-0.009999999999990905],[2.6299999999999955,0.3300000000000125],[0.05000000000001137,0.6899999999999977],[-4.150000000000006,-0.5200000000000102]],"o":[[-0.5200000000000102,0.8300000000000125],[-2.819999999999993,0.030000000000001137],[-0.4900000000000091,-0.060000000000002274],[4.27000000000001,0.37999999999999545],[0,0]],"v":[[176,239],[173.26,239.51],[163.73,239.51999999999998],[162.51,238.99999999999997],[176.01,238.99999999999997]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7608,0.0863,0.1255]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[169.26,239.25221428571427]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[169.26,239.25221428571427]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 14","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 16","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[4.47999999999999,0.6499999999999773],[-0.8400000000000034,0.009999999999990905],[-3.039999999999992,-0.37999999999999545],[-0.05000000000001137,-0.6899999999999977]],"o":[[-4.650000000000006,-0.4800000000000182],[0.5200000000000102,-0.8299999999999841],[3.25,-0.029999999999972715],[0.4900000000000091,0.060000000000002274],[0,0]],"v":[[143,258],[128,258],[130.74,257.49],[141.77,257.48],[142.99,258]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.8706,0.0196,0.0667]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[135.5,257.75715178571426]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[135.5,257.75715178571426]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 15","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 17","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5699999999999932,4.610000000000014],[-0.009999999999990905,-0.8400000000000034],[0.2599999999999909,-3.210000000000008],[0.6699999999999875,-0.6700000000000159]],"o":[[0.4199999999999875,-4.740000000000009],[0.8300000000000125,0.5200000000000102],[0.030000000000001137,3.3100000000000023],[-0.06999999999999318,0.8100000000000023],[0,0]],"v":[[143,238.5],[143,223.5],[143.51,226.24],[143.53,236.79000000000002],[143,238.50000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7804,0.0078,0.0314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[143.23257142857148,231]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[143.23257142857148,231]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 16","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 18","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6999999999999886,-0.0800000000000125],[4.700000000000003,-0.4000000000000057],[-0.589999999999975,0.5900000000000034]],"o":[[-0.4900000000000091,0.4900000000000091],[-4.599999999999994,0.5],[2.3800000000000097,-1.3899999999999864],[0,0]],"v":[[143,238.5],[141.8,239.03],[127.00000000000001,239],[143,238.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.6863,0.3176,0.3412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[135,238.78253571428573]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[135,238.78253571428573]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 17","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 19","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[4.030000000000001,-0.38999999999998636],[-0.8400000000000034,0.009999999999990905],[-3.4899999999999807,-0.03999999999999204],[-0.5200000000000102,-0.8299999999999841]],"o":[[-4.039999999999992,-0.37999999999999545],[0.5200000000000102,-0.8300000000000125],[3.5,-0.03999999999999204],[0.8499999999999943,0.009999999999990905],[0,0]],"v":[[160.5,221.5],[144.5,221.5],[147.24,220.99],[157.75,220.99],[160.49,221.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.7804,0.0078,0.0314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[152.5,221.21675]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[152.5,221.21675]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 18","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 20","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-4.039999999999992,-0.37999999999999545],[-0.25,-0.19999999999998863],[-0.09999999999999432,-5.819999999999993],[-0.4900000000000091,-0.060000000000002274],[-2.819999999999993,0.030000000000001137],[-0.5200000000000102,0.8299999999999841],[-0.3499999999999943,-2.5700000000000216],[0.4000000000000057,-2.080000000000041],[0.3300000000000125,0],[0,0],[0,0],[0.8400000000000034,-0.160000000000025],[2.1899999999999977,0.2799999999999727],[0.5699999999999932,0.36000000000001364],[0.5200000000000102,3.6399999999999864],[0.4900000000000091,0.060000000000002274],[3.25,-0.029999999999972715],[0.519999999999996,-0.8299999999999841],[0.18000000000000682,1.6100000000000136],[-0.8599999999999994,1.5400000000000205],[-0.37000000000000455,0.20999999999997954],[-4.599999999999994,0.5],[-0.4899999999999807,0.4900000000000091],[-0.06999999999999318,0.8200000000000216],[0.030000000000001137,3.3100000000000023],[0.8299999999999841,0.5200000000000102],[-0.28999999999999204,0.5900000000000034],[-0.28000000000000114,0.01999999999998181]],"o":[[4.030000000000001,-0.38999999999998636],[0.28000000000000114,0.030000000000001137],[1.5600000000000023,5.6299999999999955],[0.05000000000001137,0.6899999999999977],[2.6399999999999864,0.3300000000000125],[0.8499999999999943,0],[2.5200000000000102,0.3100000000000023],[0.3199999999999932,2.2700000000000102],[-0.12000000000000455,0.6499999999999773],[0,0],[0,0],[0,0.6499999999999773],[-1.9699999999999989,0.38999999999998636],[-0.6399999999999864,-0.07999999999998408],[-3.0600000000000023,-1.9700000000000273],[-0.05000000000001137,-0.6899999999999977],[-3.039999999999992,-0.37999999999999545],[-0.8499999999999943,0],[-1.8499999999999943,-0.2699999999999818],[-0.25,-2.289999999999992],[0.21999999999999886,-0.38999999999998636],[4.700000000000003,-0.4000000000000057],[0.6999999999999886,-0.0800000000000125],[0.6699999999999875,-0.6699999999999875],[0.2599999999999909,-3.210000000000008],[0,-0.8499999999999943],[0.0800000000000125,-0.6500000000000057],[0.2599999999999909,-0.19999999999998863],[0,0]],"v":[[144.5,221.5],[160.5,221.5],[161.41,221.57],[162.5,239],[163.72,239.52],[173.25,239.51000000000002],[175.99,239.00000000000003],[179.94,242.80000000000004],[179.97,256.24000000000007],[178.23,258.50000000000006],[162.48,258.50000000000006],[162.48,274.25000000000006],[160.22,276.49000000000007],[146.2,276.5300000000001],[144.69,276.0400000000001],[142.97,258.0100000000001],[141.75,257.4900000000001],[130.72,257.5000000000001],[127.98,258.0100000000001],[125.48,253.7600000000001],[126.05,239.8000000000001],[126.99,239.0100000000001],[141.79,239.0400000000001],[142.98999999999998,238.5100000000001],[143.51999999999998,236.8000000000001],[143.49999999999997,226.25000000000009],[142.98999999999998,223.51000000000008],[143.57999999999998,221.58000000000007],[144.48999999999998,221.51000000000008]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9216,0.1137,0.1686]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[152.77558928571432,248.98633035714283]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[152.77558928571432,248.98633035714283]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 19","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 21","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-8.719999999999999,-0.6700000000000017],[-0.5699999999999932,-8.240000000000002],[0.5900000000000034,-8.61],[8.599999999999994,-0.5900000000000034],[8.609999999999985,0.5900000000000034],[0.5900000000000034,8.599999999999994],[-0.5900000000000034,8.600000000000001],[-7.969999999999999,0.779999999999994]],"o":[[8.650000000000006,-0.8400000000000034],[8.719999999999999,0.6700000000000017],[0.5699999999999932,8.240000000000002],[-0.5900000000000034,8.61],[-8.599999999999994,0.5900000000000034],[-8.609999999999985,-0.5900000000000034],[-0.5900000000000034,-8.599999999999994],[0.5400000000000063,-7.780000000000001],[0,0]],"v":[[127.4,40.65],[159.74,40.51],[170.52,51.73],[170.52,82.27],[159.27,93.52],[128.73000000000002,93.52],[117.48000000000002,82.27],[117.48000000000002,51.73],[127.40000000000002,40.65]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 22","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.799999999999983,0.36999999999999744],[5.849999999999994,-2.0899999999999963],[0.3400000000000034,-0.3299999999999983],[-1.4300000000000068,-3.0799999999999983],[-4.310000000000002,-0.1799999999999926],[-0.7900000000000205,5.769999999999996],[1.450000000000017,1.2100000000000009]],"o":[[-0.36000000000001364,-0.3100000000000023],[-5,-2.3400000000000034],[-0.9199999999999875,0.3299999999999983],[-2.509999999999991,2.4100000000000037],[1.759999999999991,3.780000000000001],[6.199999999999989,0.2600000000000051],[0.27000000000001023,-1.980000000000004],[0,0]],"v":[[156.38,57.12],[153.5,56.25],[140.15,53.41],[131.72,57.48],[132.06,72.19],[143.79,81.47999999999999],[157.37,67.63],[156.38,57.129999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9922,0.9922,0.9922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[144.21751785714284,66.7665]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[144.21751785714284,66.7665]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 20","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 23","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-8.719999999999999,-0.6699999999999982],[-0.5699999999999648,-8.239999999999998],[0.589999999999975,-8.61],[8.599999999999994,-0.5900000000000034],[8.609999999999985,0.5900000000000034],[0.5900000000000034,8.599999999999994],[-0.5900000000000034,8.600000000000001],[-7.969999999999999,0.7799999999999976]],"o":[[8.650000000000006,-0.8399999999999999],[8.719999999999999,0.6699999999999982],[0.5699999999999648,8.239999999999998],[-0.589999999999975,8.61],[-8.599999999999994,0.5900000000000034],[-8.609999999999985,-0.5900000000000034],[-0.5900000000000034,-8.599999999999994],[0.539999999999992,-7.780000000000001],[0,0]],"v":[[213.4,17.65],[245.74,17.509999999999998],[256.52,28.729999999999997],[256.52,59.269999999999996],[245.26999999999998,70.52],[214.73,70.52],[203.48,59.269999999999996],[203.48,28.729999999999997],[213.39999999999998,17.65]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 24","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-1.5200000000000102,-5.350000000000001],[0.5,-1.4799999999999969],[-1.160000000000025,2.280000000000001],[5.640000000000015,-1.7600000000000016],[2.140000000000015,-1.6000000000000014],[-0.4900000000000091,-3.3900000000000006],[0.37999999999999545,3.6600000000000037],[1.0800000000000125,0.6899999999999977],[-1.1399999999999864,1.6300000000000026],[-0.37000000000000455,-0.030000000000001137],[-2.1599999999999966,0.9699999999999989]],"o":[[0,0],[2.6899999999999977,-2.1799999999999997],[0.5999999999999943,2.1099999999999994],[-1.0999999999999943,3.3100000000000023],[2.6100000000000136,-5.140000000000001],[-2.240000000000009,0.6999999999999993],[-2.5600000000000023,1.9099999999999966],[0.6200000000000045,4.299999999999997],[-0.1599999999999966,-1.5300000000000011],[-1.8199999999999932,-1.1700000000000017],[0.30000000000001137,-0.4299999999999997],[0.8700000000000045,0.0799999999999983],[0,0]],"v":[[230.5,40],[229.72,35.99],[240.19,35.1],[239.39,38.64],[242.44,39.18],[234.64,29.89],[220.33999999999997,38.09],[217.02999999999997,45.220000000000006],[224.02999999999997,48.760000000000005],[221.21999999999997,47.040000000000006],[220.47999999999996,41.370000000000005],[226.75999999999996,37.63],[230.49999999999997,40.010000000000005]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 25","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-3.160000000000025,-8.829999999999998],[-0.6999999999999886,0.259999999999998],[-4.6299999999999955,1.4600000000000009],[0.3100000000000023,0.3500000000000014]],"o":[[-5.639999999999986,-6.339999999999996],[0.5699999999999932,0.8699999999999974],[4.3300000000000125,-1.5900000000000034],[0.21000000000000796,-0.29999999999999716],[0,0]],"v":[[240.34,42.65],[225.23000000000002,52.019999999999996],[227.36,52.12],[240.99,44.48],[240.34,42.65]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 26","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5800000000000125,-0.259999999999998],[2.75,-1.8999999999999986],[-2.0600000000000023,-0.9500000000000028],[2.569999999999993,8.089999999999996]],"o":[[-0.7700000000000102,-0.20000000000000284],[-3.009999999999991,1.3400000000000034],[-2.430000000000007,1.6799999999999997],[7.909999999999997,3.6499999999999986],[0,0]],"v":[[242.5,46],[240.73,46.47],[228.33999999999997,53.58],[229.80999999999997,57.44],[242.49999999999997,46]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9922,0.9922,0.9922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[230.2175357142857,43.7665]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[230.2175357142857,43.7665]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 21","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 27","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-8.78000000000003,-0.6200000000000045],[-0.5799999999999841,-8.909999999999997],[0.5500000000000114,-8.510000000000005],[9.29000000000002,-0.5999999999999943],[8.510000000000048,0.5500000000000114],[0.6000000000000227,9.289999999999992],[-0.5500000000000114,8.509999999999991],[-8.650000000000034,0.769999999999996]],"o":[[8.730000000000018,-0.769999999999996],[8.78000000000003,0.6200000000000045],[0.5500000000000114,8.510000000000005],[-0.6000000000000227,9.300000000000011],[-8.509999999999991,0.5500000000000114],[-9.300000000000011,-0.5999999999999943],[-0.5500000000000114,-8.510000000000005],[0.5400000000000205,-8.469999999999999],[0,0]],"v":[[277.9,90.65],[309.25,90.51],[320.53,102.23],[320.53,131.77],[308.78,143.52],[279.23999999999995,143.52],[267.48999999999995,131.77],[267.48999999999995,102.23000000000002],[277.90999999999997,90.65000000000002]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 28","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-2.349999999999966,0.04999999999999716],[-18.45999999999998,-1.2800000000000011],[-1.1999999999999886,3.6500000000000057],[-1.9599999999999795,7.420000000000002],[0,0],[0,0]],"o":[[0,0],[-1.259999999999991,0],[2.579999999999984,8.939999999999998],[3.2099999999999795,0.21999999999999886],[2.170000000000016,-6.599999999999994],[0,0],[0,0],[0,0]],"v":[[299.75,102.5],[288.25,102.5],[289.53,105.81],[290.21999999999997,131.53],[305.27,128.54],[298.46,105.80999999999999],[300.46,104.71],[299.73999999999995,102.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9922,0.9922,0.9922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[294.01,116.7888080357143]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[294.01,116.7888080357143]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 22","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 29","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-0.28000000000000114,-0.06999999999999318]],"o":[[0,0],[0,0],[0.3199999999999932,0.05000000000001137],[0,0]],"v":[[175,183.5],[174.27,184],[174,183.5],[175,183.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.102,0.1412,0.1412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[174.5,183.7387232142857]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[174.5,183.7387232142857]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 23","it":[{"ty":"rc","bm":0,"hd":false,"nm":"Rectangle 2","d":1,"p":{"a":0,"k":[96.495,159.495]},"r":{"a":0,"k":0},"s":{"a":0,"k":[0.99,0.99]}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1529,0.1961,0.2039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[96.495,159.495]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[96.495,159.495]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 24","it":[{"ty":"rc","bm":0,"hd":false,"nm":"Rectangle 3","d":1,"p":{"a":0,"k":[200.745,178.995]},"r":{"a":0,"k":0},"s":{"a":0,"k":[1.49,0.99]}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1529,0.1961,0.2039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[200.745,178.995]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[200.745,178.995]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 25","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 30","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.7899999999999991,0.8400000000000034],[-1.2900000000000063,0.030000000000001137]],"o":[[-0.769999999999996,0.8300000000000125],[1.2199999999999989,-0.13999999999998636],[0,0]],"v":[[65.5,154],[61.5,154],[65.5,154]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0667,0.102,0.1059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[63.5,154.2850982142857]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[63.5,154.2850982142857]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 26","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 31","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-8.590000000000003,-0.7700000000000102],[-0.5900000000000034,-6.519999999999996],[0.7199999999999989,-9.14],[6.900000000000006,-0.6200000000000045],[9.139999999999993,0.7199999999999989],[0.6199999999999974,6.900000000000006],[-0.9199999999999946,8.719999999999999],[-5.890000000000001,0.7399999999999949]],"o":[[8.380000000000003,-1.0600000000000023],[6.510000000000005,0.5799999999999983],[0.8199999999999932,9.070000000000007],[-0.5300000000000011,6.77000000000001],[-9.069999999999993,0.8199999999999932],[-6.770000000000003,-0.5300000000000011],[-0.7999999999999972,-8.799999999999997],[0.6199999999999974,-5.859999999999999],[0,0]],"v":[[46.39,91.14],[82.74000000000001,91.01],[92.99000000000001,101.26],[93.02000000000001,136.27],[82.74000000000001,146.99],[47.73000000000001,147.02],[37.01000000000001,136.74],[37.06000000000001,100.81],[46.39000000000001,91.14]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 32","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5399999999999991,-8.469999999999999],[-0.5499999999999972,-8.510000000000005],[-9.299999999999997,-0.5999999999999943],[-8.510000000000005,0.5500000000000114],[-0.5999999999999943,9.300000000000011],[0.5499999999999972,8.509999999999991],[9.090000000000003,0.6299999999999955],[8.729999999999997,-0.769999999999996]],"o":[[-8.649999999999999,0.769999999999996],[-0.5499999999999972,8.510000000000005],[0.6000000000000014,9.289999999999992],[8.509999999999998,0.5500000000000114],[9.290000000000006,-0.5999999999999943],[0.5499999999999972,-8.510000000000005],[-0.5699999999999932,-8.920000000000002],[-9.090000000000003,-0.6299999999999955],[0,0]],"v":[[48.9,92.65],[38.48,104.23],[38.48,133.77],[50.23,145.52],[79.77,145.52],[91.52,133.77],[91.52,104.23000000000002],[80.24,92.51000000000002],[48.88999999999999,92.65000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1765,0.2196,0.2314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[64.98630357142858,118.98565625]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[64.98630357142858,118.98565625]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 27","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 33","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-1.8200000000000074,-2.6000000000000227],[0,0],[1.5899999999999892,3.1000000000000227],[3.4599999999999937,5.139999999999986],[-0.13000000000000256,4.099999999999994],[2.259999999999998,0.3199999999999932],[0,0],[0,0],[0,0],[-1.5399999999999991,0.8100000000000023],[0.00999999999999801,0.8300000000000125],[-2.680000000000007,0.5999999999999943],[0,0],[-0.3400000000000034,-1.5900000000000034],[0,0],[-1.5499999999999972,-0.5999999999999943],[0,0],[0.05999999999998806,-1.1999999999999886],[-2.489999999999995,0.960000000000008],[0.10999999999999943,-0.46000000000000796],[-0.5699999999999932,1.4000000000000057],[0,0],[0,0],[-0.7800000000000011,0.5699999999999932],[-1.789999999999992,0.05000000000001137],[2.969999999999999,0.5199999999999818],[1.0499999999999972,-1.5699999999999932],[-1.019999999999996,0.9699999999999989],[0,0],[-0.5900000000000034,0.36000000000001364],[-0.14000000000000057,0.6599999999999966],[0,0],[0,0],[0,0],[-1.1899999999999977,0.03999999999999204],[-1.1299999999999955,-1.6299999999999955],[0,0],[0,0],[0,0],[-0.15000000000000568,-0.09000000000000341],[0.12999999999999545,0.5099999999999909],[0,0],[0,0],[0.8100000000000023,0.46000000000000796],[-0.12000000000000455,-1.8899999999999864],[0,0],[0,0],[0,0],[-1.4699999999999989,0.5199999999999818],[0,0],[0,0],[0,0],[0,0],[0.3300000000000125,0.8799999999999955],[-0.009999999999990905,0.9199999999999875],[0,0],[-1.950000000000017,-2.1399999999999864],[0,0],[-1.6899999999999977,-2.240000000000009],[-0.21999999999999886,-1.0200000000000102],[-0.30000000000001137,-0.35000000000002274],[-0.5400000000000205,-0.6999999999999886],[-1.3799999999999955,-0.4899999999999807],[0,0],[-1.6099999999999852,-0.45000000000001705],[-0.5600000000000023,0.13999999999998636],[-0.3299999999999841,0.009999999999990905],[-1.9499999999999886,-0.09000000000000341],[-2.079999999999984,0.05000000000001137],[0,0],[0,0],[0,0],[0.4299999999999784,1.579999999999984],[0,0],[0,0],[-1.6199999999999761,-0.08999999999997499],[-1.6599999999999966,-0.14000000000001478],[-1.0199999999999818,0.010000000000019327],[-1.0300000000000011,0.19000000000002615],[-1.8000000000000114,1.3199999999999932],[0,0],[0,0],[0,0],[0,0],[-0.9399999999999977,0.4199999999999875],[-0.339999999999975,-0.2599999999999909],[0.9900000000000091,-0.030000000000001137],[0,0],[0,0],[0.8499999999999943,2.8499999999999943],[0,0],[0,0],[-2.569999999999993,1],[-1.3400000000000034,-0.2300000000000182],[0.030000000000001137,0.7800000000000011],[-4.060000000000002,-0.1699999999999875],[-2.430000000000007,-6.719999999999999],[-0.6599999999999966,-6.289999999999992],[1.490000000000009,0.2599999999999909],[0.11000000000001364,0.789999999999992],[0.06999999999999318,0.4199999999999875],[2.0200000000000102,3.780000000000001],[2.5,0.12999999999999545],[2.799999999999983,0],[55.70000000000002,-0.4900000000000091],[0,0],[0,0],[0,0],[1.1599999999999966,-0.5200000000000102],[0.09000000000000341,1.1500000000000057]],"o":[[0,0],[0,0],[2.3200000000000003,-0.47999999999998977],[0,0],[-0.04000000000000625,-2.5500000000000114],[0.5900000000000034,-0.5500000000000114],[-1.6299999999999955,0.1599999999999966],[-1.2899999999999991,1.8499999999999943],[0,0],[0,0],[0,0],[-0.8100000000000023,-1.9799999999999898],[0.6799999999999997,-0.3499999999999943],[2.700000000000003,0.9799999999999898],[0,0],[-0.8700000000000045,-0.44999999999998863],[0,0],[-0.14000000000000057,1.4699999999999989],[0,0],[1.4099999999999966,-0.11000000000001364],[3.0799999999999983,-0.18000000000000682],[0.5799999999999983,1.3799999999999955],[-0.29999999999999716,1.3400000000000034],[0,0],[0,0],[0.7600000000000051,3.8799999999999955],[1.5100000000000051,-1.0999999999999943],[-0.769999999999996,2.289999999999992],[-1.1099999999999994,-0.18999999999999773],[-0.10999999999999943,2.0200000000000102],[0,0],[0.9200000000000017,0.3199999999999932],[1.9500000000000028,-1.210000000000008],[0,0],[0,0],[0,0],[0.060000000000002274,1.6699999999999875],[1.8299999999999983,-0.060000000000002274],[0,0],[0,0],[0,0],[0.29000000000000625,0.19999999999998863],[-0.010000000000005116,-0.5600000000000023],[0,0],[0,0],[-1.1400000000000006,0.25],[0.04000000000000625,1.710000000000008],[0,0],[0,0],[0,0],[1.0699999999999932,0.9300000000000068],[0,0],[0,0],[0,0],[0,0],[0.960000000000008,-1.1100000000000136],[-0.3300000000000125,-0.8799999999999955],[0,0],[1.1399999999999864,0],[0,0],[3.9499999999999886,-0.1599999999999966],[0.7700000000000102,1.0200000000000102],[0.1599999999999966,0.7599999999999909],[0.1599999999999966,0.18999999999999773],[0.75,0.960000000000008],[0,0],[2.469999999999999,-0.8300000000000125],[0.8700000000000045,0.2400000000000091],[0.38999999999998636,-0.09999999999999432],[2.3100000000000023,-0.11000000000001364],[2.0800000000000125,0.09999999999999432],[0,0],[0,0],[0,0],[1.5,0.37000000000000455],[0,0],[0,0],[2.460000000000008,-2.469999999999999],[1.6199999999999761,0.08999999999997499],[1.4099999999999966,0.12000000000000455],[1.0199999999999818,-0.010000000000019327],[0.960000000000008,-0.18000000000000682],[0,0],[0,0],[0,0],[0,0],[2.8100000000000023,1.259999999999991],[0.6599999999999966,-0.28999999999999204],[0.28999999999999204,1.4000000000000057],[0,0],[0,0],[-0.060000000000002274,1.6800000000000068],[0,0],[0,0],[1.960000000000008,0.09000000000000341],[0.28999999999999204,1.0800000000000125],[1.2700000000000102,0.21000000000000796],[4.1699999999999875,0.5200000000000102],[6.509999999999991,0.28000000000000114],[2,5.509999999999991],[0.09999999999999432,0.960000000000008],[-0.009999999999990905,-1.1699999999999875],[-0.1699999999999875,-1.1599999999999966],[-0.8199999999999932,-4.819999999999993],[-1.1699999999999875,-2.1999999999999886],[-2.680000000000007,-0.13999999999998636],[-55.68000000000001,-0.1699999999999875],[0,0],[0,0],[0,0],[-1.1000000000000014,-0.05000000000001137],[-0.060000000000002274,-1.1599999999999966],[0,0]],"v":[[59.5,177],[61,175.51],[59.5,174.01],[64.76,174.5],[65.5,174.5],[67.01,169.51],[68.76,167.01],[63.50000000000001,169.01],[59.080000000000005,170.44],[58.00000000000001,162.51],[59.50000000000001,162.51],[58.63000000000001,161.92],[61.32000000000001,159.79999999999998],[63.02000000000001,157.01999999999998],[69.00000000000001,157.01],[69.00000000000001,158.51],[66.51000000000002,159.51],[69.51000000000002,159.01],[71.01000000000002,162.51],[71.01000000000002,156.51],[73.02000000000002,159.01],[79.51000000000002,156.01],[78.01000000000002,158.76],[80.98000000000002,159.22],[80.01000000000002,156.51],[87.51000000000002,156.51],[89.52000000000002,157.29],[95.51000000000002,156.51],[91.79000000000002,160.5],[89.02000000000002,160.26],[93.45000000000002,162.41],[93.52000000000001,161],[98.43,160.92],[97.52000000000001,157.76],[99.26,156.48999999999998],[100.77000000000001,157.39],[102.94000000000001,156.08999999999997],[105.26,156.48999999999998],[109.25,157.99999999999997],[109.75,156.47999999999996],[118.49,156.49999999999997],[118.53999999999999,158.46999999999997],[119.49,158.50999999999996],[118.99,157.00999999999996],[121.69999999999999,157.44999999999996],[121.99,159.49999999999997],[119.49,158.49999999999997],[117.49,161.49999999999997],[120.97999999999999,160.99999999999997],[119.44999999999999,162.26999999999998],[119.47999999999999,164.74999999999997],[122.47999999999999,162.61999999999998],[124.75999999999999,156.02999999999997],[127.46999999999998,156.51999999999998],[127.17999999999998,160.01999999999998],[129.71999999999997,161.01],[128.88999999999996,159.32999999999998],[128.47999999999996,156.51],[129.72999999999996,158.01],[133.46999999999997,158.01],[133.46999999999997,156.51],[139.63999999999996,161.34],[144.45999999999995,167.86],[144.53999999999996,170.44000000000003],[146.52999999999997,171.20000000000002],[148.98999999999998,175.8],[148.48,177],[153.92999999999998,178.71],[160.14,179.51000000000002],[160.76999999999998,178.51000000000002],[167.80999999999997,179.31000000000003],[173.97999999999996,179.01000000000002],[173.97999999999996,183.51000000000002],[174.24999999999997,184.01000000000002],[174.97999999999996,183.51000000000002],[178.71999999999997,180.50000000000003],[176.97999999999996,181.01000000000002],[176.97999999999996,179.76000000000002],[182.70999999999995,179.96],[188.12999999999994,178.61],[190.22999999999993,180.03],[191.94999999999993,178.7],[196.47999999999993,178.51],[196.47999999999993,180.01],[198.98999999999992,179.25],[200.23999999999992,182.51],[200.98999999999992,180.51],[204.08999999999992,179.85],[209.4799999999999,179.01],[207.9799999999999,180.01],[208.5099999999999,181.73],[207.4699999999999,182.25],[210.0399999999999,181.54],[211.3799999999999,181.42999999999998],[211.99999999999991,178.51],[215.9499999999999,179.01999999999998],[217.7299999999999,181.51],[218.4799999999999,178.51],[231.24999999999991,178.48],[245.2199999999999,186.01999999999998],[249.9199999999999,212.82999999999998],[248.9799999999999,214.51],[248.4799999999999,212.01],[247.9799999999999,210.01],[243.8599999999999,189.88],[236.0999999999999,184.64],[226.74999999999991,185.04999999999998],[59.979999999999905,184.51999999999998],[63.479999999999905,182.52999999999997],[61.549999999999905,181.94999999999996],[61.479999999999905,179.51999999999995],[59.479999999999905,180.51999999999995],[59.479999999999905,177.01999999999995]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 34","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[88,160],[87.01,160],[87.01,160.99],[88,160.99],[88,160]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1529,0.1961,0.2039]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[154.03082142857147,185.28123214285714]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[154.03082142857147,185.28123214285714]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 28","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 35","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.1699999999999875,-1.1599999999999966],[0,0],[0.1599999999999966,0.8300000000000125],[0,0]],"o":[[0.06999999999999318,0.4199999999999875],[0,0],[-0.1599999999999966,-0.8400000000000034],[0,0],[0,0]],"v":[[248,210],[248.5,212],[245.5,212],[245,209.5],[248,210]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1098,0.149,0.149]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[246.75,210.75]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[246.75,210.75]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 29","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 36","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.5,-2.1500000000000057],[-0.05000000000001137,-0.20000000000001705],[0.11000000000001364,-0.46999999999999886],[1.8899999999999864,0.2600000000000193],[0.6699999999999875,4.530000000000001]],"o":[[1.9699999999999989,1.759999999999991],[0.09000000000000341,0.4000000000000057],[0.37999999999999545,1.460000000000008],[-0.27000000000001023,1.1699999999999875],[0.5900000000000034,-4.530000000000001],[0,0]],"v":[[193,241.5],[194.01,248.66],[195.01,249.25],[194.01,250.83],[193,255],[193,241.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1216,0.1373,0.1412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[194.04035714285715,248.25735714285716]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[194.04035714285715,248.25735714285716]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 30","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 37","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.009999999999990905,-1.1699999999999875],[0.14000000000001478,-1.1399999999999864],[0,0],[0.4099999999999966,2.1399999999999864],[0,0]],"o":[[0.11000000000001364,0.789999999999992],[0.009999999999990905,1.1699999999999875],[0,0],[-0.4199999999999875,-2.180000000000007],[0,0],[0,0]],"v":[[248.5,212],[249,214.5],[248.94,217.95],[247,218.5],[245.5,212],[248.5,212]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.102,0.1412,0.1412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[247.26314285714284,215.25]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[247.26314285714284,215.25]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 31","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 38","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.0400000000000205,-1.259999999999991],[0.4299999999999784,-0.3900000000000432],[0.7599999999999909,-0.3299999999999841],[0,0],[1.3799999999999955,-0.9600000000000364],[4.689999999999998,0.12000000000000455],[0.5100000000000193,0.9900000000000091],[-6.189999999999998,9.45999999999998]],"o":[[0,0],[-3.430000000000007,0.35000000000002274],[-0.5099999999999909,0.6200000000000045],[-0.12999999999999545,0.12000000000000455],[0,0],[0.46999999999999886,3.1899999999999977],[-3.9099999999999966,2.6999999999999886],[-1.0699999999999932,-0.029999999999972715],[10.900000000000006,-2.0500000000000114],[0,0]],"v":[[186.5,272.5],[186.28,275.54],[183.04,278.81],[181.12,279.66],[179.24,282.5],[177.99,281.5],[176.23000000000002,284.47],[159.70000000000002,291.01000000000005],[157.99,290.00000000000006],[186.49,272.50000000000006]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1255,0.1569,0.1608]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[172.245,281.75633928571426]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[172.245,281.75633928571426]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 32","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 39","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5900000000000034,-4.530000000000001],[3.240000000000009,-4.949999999999989],[10.900000000000006,-2.0500000000000114],[3.8700000000000045,0.05000000000001137],[0.3699999999999761,0.1300000000000523],[6.309999999999988,5.3700000000000045],[-24.700000000000003,14.26000000000002],[-4.090000000000003,-27.74000000000001]],"o":[[0.6699999999999875,4.530000000000001],[-0.7700000000000102,5.8700000000000045],[-6.189999999999998,9.45999999999998],[-3.509999999999991,0.660000000000025],[-0.30000000000001137,0],[-7.280000000000001,-2.6899999999999977],[-21.58,-18.370000000000005],[24.569999999999993,-14.180000000000007],[0,0]],"v":[[193,241.5],[193,255],[186.5,272.5],[158,290],[144.79,290],[144.12,289.03],[126.73,280.51],[132.34,212.08999999999997],[192.99,241.48999999999998]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 40","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.2599999999999909,-0.19999999999998863],[0.0800000000000125,-0.6500000000000057],[0.4199999999999875,-4.740000000000009],[2.3799999999999955,-1.3899999999999864],[0.21999999999999886,-0.38999999999998636],[-0.25,-2.2900000000000205],[-1.8499999999999943,-0.2699999999999818],[-4.650000000000006,-0.4800000000000182],[-3.069999999999993,-1.9699999999999704],[-0.6399999999999864,-0.07999999999998408],[-1.9800000000000182,0.3900000000000432],[0,0.6500000000000341],[0,0],[0,0],[-0.12999999999999545,0.6499999999999773],[0.3100000000000023,2.2700000000000102],[2.519999999999982,0.3200000000000216],[4.27000000000001,0.37999999999999545],[1.5600000000000023,5.6299999999999955],[0.28000000000000114,0.030000000000001137],[0.8400000000000034,0.009999999999990905],[3.4899999999999807,-0.03999999999999204],[0.5200000000000102,-0.8299999999999841]],"o":[[-0.28999999999999204,0.030000000000001137],[-0.28999999999999204,0.5900000000000034],[-0.5699999999999932,4.610000000000014],[-0.5900000000000034,0.5900000000000034],[-0.37000000000000455,0.21000000000000796],[-0.8599999999999994,1.5500000000000114],[0.18000000000000682,1.6100000000000136],[4.47999999999999,0.6499999999999773],[0.5200000000000102,3.6499999999999773],[0.5600000000000023,0.36000000000001364],[2.1899999999999977,0.29000000000002046],[0.8400000000000034,-0.160000000000025],[0,0],[0,0],[0.3300000000000125,0],[0.4000000000000057,-2.0800000000000125],[-0.36000000000001364,-2.5600000000000023],[-4.150000000000006,-0.5200000000000102],[-0.09999999999999432,-5.819999999999993],[-0.25,-0.19999999999998863],[-0.5200000000000102,-0.8300000000000125],[-3.5,-0.03999999999999204],[-0.8499999999999943,0],[0,0]],"v":[[144.5,221.5],[143.59,221.57],[143,223.5],[143,238.5],[127,239],[126.06,239.79],[125.49000000000001,253.75],[127.99000000000001,258],[142.99,258],[144.71,276.03],[146.22,276.52],[160.24,276.47999999999996],[162.5,274.23999999999995],[162.5,258.48999999999995],[178.25,258.48999999999995],[179.99,256.22999999999996],[179.96,242.78999999999996],[176.01000000000002,238.98999999999995],[162.51000000000002,238.98999999999995],[161.42000000000002,221.55999999999995],[160.51000000000002,221.48999999999995],[157.77,220.97999999999996],[147.26000000000002,220.97999999999996],[144.52,221.48999999999995]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9922,0.9922,0.9922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[152.7601607142857,248.55134821428575]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[152.7601607142857,248.55134821428575]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 33","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 41","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.06999999999999318,0.75],[-0.5,0]],"o":[[-0.06999999999999318,0.75],[0.5,0],[0,0]],"v":[[89,154],[87.5,154],[89,154]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0667,0.102,0.1059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[88.25,154]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[88.25,154]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 34","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 42","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3299999999999983,0.789999999999992],[-0.8299999999999983,0]],"o":[[-0.3299999999999983,0.789999999999992],[0.8299999999999983,0],[0,0]],"v":[[98.5,154],[96,154],[98.5,154]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0667,0.102,0.1059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[97.25,154]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[97.25,154]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 35","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 43","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.3300000000000125,0.789999999999992],[-0.7800000000000011,-0.09000000000000341]],"o":[[-0.3300000000000125,0.789999999999992],[0.8199999999999932,0.030000000000001137],[0,0]],"v":[[135,154],[132.5,154],[135,154]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0667,0.102,0.1059]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[133.75,153.9854107142857]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[133.75,153.9854107142857]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 36","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 44","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5,0.8199999999999932],[-0.9900000000000091,-0.060000000000002274]],"o":[[-0.4700000000000273,0.8000000000000114],[1,0.020000000000010232],[0,0]],"v":[[268.5,167.5],[265.5,167.5],[268.5,167.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0235,0.0353,0.0353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[267,167.792375]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[267,167.792375]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 37","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 45","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-0.020000000000003126,-0.25],[-0.060000000000002274,-1.1599999999999966],[0.5600000000000023,0.0800000000000125],[0.0799999999999983,0.18999999999999773],[0.14999999999999858,0.5600000000000023]],"o":[[0,0],[0,0],[-0.28999999999999915,0.4900000000000091],[0.09000000000000341,1.1500000000000057],[-0.030000000000001137,0.009999999999990905],[0.6300000000000026,-1.4300000000000068],[-0.20000000000000284,-0.5300000000000011],[0,0]],"v":[[57.5,177],[58.75,176],[59.49,176],[59.49,177],[59.49,180.5],[59,181],[57.99,178.5],[57.49,177]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.102,0.1412,0.1412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[58.50480357142858,178.5038482142857]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[58.50480357142858,178.5038482142857]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 38","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 46","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[2.039999999999992,-0.05000000000001137],[-1.8000000000000114,1.1999999999999886]],"o":[[-0.6699999999999875,1.8199999999999932],[1.1399999999999864,-2.030000000000001],[0,0]],"v":[[223.5,170],[218.5,174.5],[223.5,170]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.149,0.1843,0.1882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[221,172.25]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[221,172.25]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 39","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 47","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-8.030000000000001,-0.06999999999999318]],"o":[[0,0],[7.9199999999999875,-0.47999999999998977],[0,0]],"v":[[256,167.5],[231,167.5],[256,167.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0235,0.0353,0.0353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[243.5,167.385125]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[243.5,167.385125]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 40","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 48","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[9.189999999999998,0.38999999999998636],[0,0]],"o":[[-9.069999999999993,1.5699999999999932],[0,0],[0,0]],"v":[[215.5,175.5],[186,175.5],[215.5,175.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.0235,0.0353,0.0353]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[200.75,175.89638392857142]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[200.75,175.89638392857142]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 41","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 49","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6200000000000045,-1.4300000000000068],[-0.030000000000001137,0.009999999999990905],[-1.1099999999999994,-0.03999999999999204],[0,0],[0,0],[0,0],[0.5,0],[0,0]],"o":[[0.07000000000000028,0.18999999999999773],[0.5600000000000023,0.0800000000000125],[1.1499999999999986,-0.5200000000000102],[0,0],[0,0],[0,0],[-0.5,0],[0,0],[0,0]],"v":[[58,178.5],[59.01,181],[59.5,180.5],[61.5,179.5],[61.57,181.93],[63.5,182.51000000000002],[60,184.50000000000003],[58.5,184.50000000000003],[58,178.50000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.149,0.1843,0.1882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[60.75,181.5]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[60.75,181.5]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 42","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 50","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-8.689999999999998,-0.7899999999999991],[-0.5500000000000114,-6.979999999999997],[0.7299999999999898,-9.260000000000005],[7.02000000000001,-0.6299999999999955],[9.159999999999997,0.7199999999999989],[0.5699999999999932,7.239999999999995],[-0.9200000000000017,8.920000000000002],[-6.079999999999998,0.730000000000004]],"o":[[8.549999999999997,-1.0200000000000031],[7.099999999999994,0.6499999999999986],[0.7299999999999898,9.259999999999998],[-0.539999999999992,6.900000000000006],[-9.099999999999994,0.8199999999999932],[-7.269999999999996,-0.5699999999999932],[-0.7099999999999937,-9.049999999999997],[0.6299999999999955,-6.049999999999997],[0,0]],"v":[[125.39,39.14],[161.74,39.01],[172.02,49.73],[172.02,84.27],[161.74,94.99],[126.73000000000002,95.02],[115.98000000000002,84.27],[116.06000000000002,48.809999999999995],[125.39000000000001,39.13999999999999]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 51","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5400000000000063,-7.780000000000001],[-0.5900000000000034,-8.599999999999994],[-8.63000000000001,-0.5900000000000034],[-8.609999999999985,0.5900000000000034],[-0.5900000000000034,8.629999999999995],[0.5900000000000034,8.61],[8.400000000000006,0.6400000000000006],[8.650000000000006,-0.8400000000000034]],"o":[[-7.969999999999999,0.7800000000000011],[-0.5900000000000034,8.600000000000001],[0.5900000000000034,8.599999999999994],[8.63000000000001,0.5900000000000034],[8.609999999999985,-0.5900000000000034],[0.5900000000000034,-8.629999999999995],[-0.5900000000000034,-8.61],[-8.400000000000006,-0.6400000000000006],[0,0]],"v":[[127.4,40.65],[117.48,51.73],[117.48,82.27],[128.73000000000002,93.52],[159.27,93.52],[170.52,82.27],[170.52,51.73],[159.74,40.51],[127.4,40.65]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1765,0.2196,0.2314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[143.71432142857148,66.98940401785714]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[143.71432142857148,66.98940401785714]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 43","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 52","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-8.689999999999998,-0.7900000000000009],[-0.5500000000000114,-6.980000000000004],[0.7300000000000182,-9.259999999999998],[7.02000000000001,-0.6300000000000097],[9.169999999999987,0.7099999999999937],[0.5699999999999932,7.319999999999993],[-0.9200000000000159,8.920000000000002],[-6.0800000000000125,0.730000000000004]],"o":[[8.550000000000011,-1.0199999999999996],[7.099999999999994,0.6499999999999986],[0.7300000000000182,9.259999999999998],[-0.5400000000000205,6.899999999999999],[-9.109999999999985,0.8199999999999932],[-7.340000000000003,-0.5799999999999983],[-0.710000000000008,-9.049999999999997],[0.6299999999999955,-6.050000000000001],[0,0]],"v":[[211.39,16.14],[247.73999999999998,16.01],[258.02,26.730000000000004],[258.02,61.27],[247.73999999999998,71.99000000000001],[212.73,72.02000000000001],[201.98,61.27000000000001],[202.06,25.81000000000001],[211.39000000000001,16.140000000000008]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 53","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.539999999999992,-7.779999999999998],[-0.5900000000000034,-8.599999999999994],[-8.629999999999995,-0.5900000000000034],[-8.609999999999985,0.5900000000000034],[-0.589999999999975,8.629999999999995],[0.589999999999975,8.61],[8.400000000000006,0.6400000000000006],[8.650000000000006,-0.8399999999999999]],"o":[[-7.969999999999999,0.7800000000000011],[-0.5900000000000034,8.600000000000001],[0.5900000000000034,8.599999999999994],[8.629999999999995,0.5900000000000034],[8.609999999999985,-0.5900000000000034],[0.589999999999975,-8.629999999999995],[-0.589999999999975,-8.61],[-8.400000000000006,-0.6400000000000006],[0,0]],"v":[[213.4,17.65],[203.48000000000002,28.729999999999997],[203.48000000000002,59.269999999999996],[214.73000000000002,70.52],[245.27,70.52],[256.52,59.269999999999996],[256.52,28.729999999999997],[245.73999999999998,17.509999999999998],[213.39999999999998,17.65]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1765,0.2196,0.2314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[229.71432142857145,43.98755580357143]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[229.71432142857145,43.98755580357143]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 44","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 54","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-8.689999999999998,-0.7900000000000063],[-1.3899999999999864,-4.6000000000000085],[0.5400000000000205,-6.909999999999997],[4.8700000000000045,-1.4699999999999989],[6.909999999999968,0.5400000000000205],[0.5699999999999932,7.319999999999993],[-0.9199999999999591,8.91000000000001],[-6.079999999999984,0.730000000000004]],"o":[[8.550000000000011,-1.019999999999996],[4.529999999999973,0.4099999999999966],[1.6800000000000068,5.560000000000002],[-0.37000000000000455,4.740000000000009],[-5.560000000000002,1.6800000000000068],[-7.339999999999975,-0.5800000000000125],[-0.7099999999999795,-9.049999999999997],[0.6299999999999955,-6.049999999999997],[0,0]],"v":[[275.39,89.14],[311.74,89.01],[321.26,95.49000000000001],[322.02,134.27],[315.51,144.26000000000002],[276.73,145.02],[265.98,134.27],[266.06,98.81],[275.39,89.14]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 55","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.5400000000000205,-8.469999999999999],[-0.5500000000000114,-8.510000000000005],[-9.300000000000011,-0.5999999999999943],[-8.509999999999991,0.5500000000000114],[-0.6000000000000227,9.300000000000011],[0.5500000000000114,8.509999999999991],[9.089999999999975,0.6299999999999955],[8.730000000000018,-0.769999999999996]],"o":[[-8.649999999999977,0.769999999999996],[-0.5500000000000114,8.510000000000005],[0.6000000000000227,9.289999999999992],[8.509999999999991,0.5500000000000114],[9.29000000000002,-0.5999999999999943],[0.5500000000000114,-8.510000000000005],[-0.5699999999999932,-8.920000000000002],[-9.089999999999975,-0.6299999999999955],[0,0]],"v":[[277.9,90.65],[267.47999999999996,102.23],[267.47999999999996,131.77],[279.22999999999996,143.52],[308.77,143.52],[320.52,131.77],[320.52,102.23000000000002],[309.24,90.51000000000002],[277.89,90.65000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1765,0.2196,0.2314]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[293.94364285714283,116.93747767857143]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[293.94364285714283,116.93747767857143]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 45","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 56","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-55.68000000000001,-0.1699999999999875],[-2.680000000000007,-0.14000000000001478],[-1.1699999999999875,-2.200000000000017],[-0.8300000000000125,-4.810000000000002],[0,0],[2.069999999999993,4.019999999999982],[2.6000000000000227,0.6299999999999955],[0,0],[0.6700000000000017,-1.5999999999999943],[0.22999999999999687,-0.6799999999999784],[-1.5399999999999991,-2.210000000000008],[0,0],[-0.04999999999999716,-1.1999999999999886],[0.7800000000000011,-0.7600000000000193],[-8.809999999999995,1.5],[-2.190000000000005,0.03999999999999204],[-0.5,0]],"o":[[55.7,-0.5],[2.8000000000000114,0],[2.5,0.12999999999999545],[2.009999999999991,3.789999999999992],[0,0],[-0.9199999999999875,-4.699999999999989],[-1.3000000000000114,-2.530000000000001],[0,0],[-1.6899999999999977,0.11000000000001364],[-0.39000000000000057,0.9300000000000068],[-0.1599999999999966,0.47999999999998977],[0,0],[-0.11999999999999744,0.9000000000000057],[0.03999999999999915,1.0300000000000011],[-0.9500000000000028,-6.289999999999992],[2.1400000000000006,-0.36000000000001364],[0.5,0],[0,0]],"v":[[60,184.5],[226.77,185.03],[236.12,184.62],[243.88,189.86],[248,209.99],[245,209.49],[241.6,192.14000000000001],[234.76999999999998,187.98000000000002],[49.75,187.98000000000002],[44.37,191.11],[43.97,193.62],[43.46,196.78],[42.51,196.99],[43.559999999999995,198.21],[42.49999999999999,201.48000000000002],[48.86999999999999,185.10000000000002],[58.49999999999999,184.48000000000002],[59.99999999999999,184.48000000000002]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.102,0.1412,0.1412]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[144.884375,197.16783035714286]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[144.884375,197.16783035714286]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 46","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 57","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.06999999999999318,0.75],[-2.3299999999999983,0],[-0.3299999999999983,0.789999999999992],[-11.39,-0.47999999999998977],[-0.3300000000000125,0.789999999999992],[-0.9900000000000091,-0.46999999999999886],[-3.719999999999999,-4.049999999999983],[-1.0900000000000034,-0.4199999999999875],[-9.389999999999986,-0.8300000000000125],[-0.7299999999999898,-0.030000000000001137],[-9.069999999999993,1.5699999999999932],[-0.7700000000000102,0.5999999999999943],[-0.030000000000001137,-0.8199999999999932],[1.259999999999991,0.21999999999999886],[0.28999999999999204,1.0800000000000125],[1.9599999999999795,0.07999999999998408],[0,0],[0,0],[-0.060000000000002274,1.6799999999999784],[0,0],[0,0],[0.28999999999999204,1.4000000000000057],[0.6599999999999966,-0.28999999999999204],[2.8100000000000023,1.259999999999991],[0,0],[0,0],[0,0],[0,0],[0.960000000000008,-0.18999999999999773],[1.0200000000000102,0],[1.4099999999999966,0.11999999999997613],[1.549999999999983,0.09000000000000341],[2.469999999999999,-2.469999999999999],[0,0],[0,0],[1.5,0.37000000000000455],[0.3199999999999932,0.05000000000001137],[0,0],[2.079999999999984,0.08999999999997499],[2.3100000000000023,-0.10999999999998522],[0.38999999999998636,-0.09999999999999432],[0.8600000000000136,0.25],[2.469999999999999,-0.8299999999999841],[0,0],[0.7600000000000193,0.960000000000008],[0.17000000000001592,0.18999999999999773],[0.15000000000000568,0.7600000000000193],[0.7800000000000011,1.0200000000000102],[3.9399999999999977,-0.1599999999999966],[0,0],[1.1399999999999864,0],[0,0],[-0.3199999999999932,-0.8599999999999852],[0.9599999999999795,-1.1100000000000136],[0,0],[0,0],[0,0],[0,0],[1.0699999999999932,0.9300000000000068],[0,0],[0,0],[0,0],[0.030000000000001137,1.710000000000008],[-1.1400000000000006,0.2400000000000091],[0,0],[0,0],[-0.010000000000005116,-0.5600000000000023],[0.29000000000000625,0.19999999999998863],[0,0],[0,0],[0,0],[1.8299999999999983,-0.05000000000001137],[0.04999999999999716,1.6599999999999966],[0,0],[0,0],[0,0],[1.9500000000000028,-1.210000000000008],[0.9200000000000017,0.3299999999999841],[0,0],[-0.12000000000000455,2.0200000000000102],[-1.1099999999999994,-0.20000000000001705],[-0.7600000000000051,2.2900000000000205],[1.509999999999991,-1.0999999999999943],[0.7600000000000051,3.8700000000000045],[0,0],[0,0],[-0.29000000000000625,1.3400000000000034],[0.5699999999999932,1.3799999999999955],[3.0799999999999983,-0.18000000000000682],[1.4000000000000057,-0.11000000000001364],[0,0],[-0.14000000000000057,1.4699999999999989],[0,0],[-0.8599999999999994,-0.44999999999998863],[0,0],[2.700000000000003,0.9800000000000182],[0.6799999999999997,-0.3499999999999943],[-0.8200000000000003,-1.9800000000000182],[0,0],[0,0],[0,0],[-1.2899999999999991,1.8499999999999943],[-1.6299999999999955,0.1599999999999966],[0.5900000000000034,-0.5500000000000114],[-0.03999999999999204,-2.5600000000000023],[0,0],[2.3299999999999983,-0.46999999999999886],[0,0],[0,0],[-0.28999999999999915,0.4800000000000182],[0,0],[0,0],[0.0800000000000054,1.8400000000000034],[0.0899999999999963,0.3900000000000148],[-0.25,1.789999999999992],[-1.5600000000000023,0.5],[-0.3200000000000003,0.03999999999999204],[-0.7700000000000102,0.8300000000000125],[-3.8900000000000006,0.020000000000010232],[-3.239999999999995,0.020000000000010232]],"o":[[0.06999999999999318,0.75],[2.3299999999999983,-0.009999999999990905],[0.3299999999999983,0.789999999999992],[11.379999999999995,0],[0.3300000000000125,0.789999999999992],[1.0800000000000125,0.12000000000000455],[4.659999999999997,2.1699999999999875],[0.8000000000000114,0.8700000000000045],[9.490000000000009,1.0699999999999932],[0.9699999999999989,0.09000000000000341],[9.189999999999998,0.38999999999998636],[0.8000000000000114,-0.13999999999998636],[-0.12000000000000455,0.8000000000000114],[0.030000000000001137,0.8199999999999932],[-1.3400000000000034,-0.22999999999998977],[-2.5800000000000125,1],[0,0],[0,0],[0.8400000000000034,2.8499999999999943],[0,0],[0,0],[0.9900000000000091,-0.030000000000001137],[-0.3499999999999943,-0.2599999999999909],[-0.9399999999999977,0.4199999999999875],[0,0],[0,0],[0,0],[0,0],[-1.8000000000000114,1.3100000000000023],[-1.0300000000000011,0.18999999999999773],[-1.0200000000000102,0],[-1.6599999999999966,-0.13999999999998636],[-1.549999999999983,-0.09000000000000341],[0,0],[0,0],[0.4300000000000068,1.5800000000000125],[-0.28000000000000114,-0.06999999999999318],[0,0],[-2.0800000000000125,0.05000000000001137],[-1.9399999999999977,-0.09000000000000341],[-0.3300000000000125,0.020000000000010232],[-0.5600000000000023,0.15000000000000568],[-1.6100000000000136,-0.44999999999998863],[0,0],[-1.3799999999999955,-0.4900000000000091],[-0.539999999999992,-0.6899999999999977],[-0.30000000000001137,-0.3499999999999943],[-0.21000000000000796,-1.0200000000000102],[-1.6899999999999977,-2.240000000000009],[0,0],[-1.960000000000008,-2.1299999999999955],[0,0],[-0.009999999999990905,0.9199999999999875],[0.3199999999999932,0.8599999999999852],[0,0],[0,0],[0,0],[0,0],[-1.4699999999999989,0.5300000000000011],[0,0],[0,0],[0,0],[-0.12000000000000455,-1.8799999999999955],[0.8100000000000023,0.44999999999998863],[0,0],[0,0],[0.12999999999999545,0.5099999999999909],[-0.15000000000000568,-0.0800000000000125],[0,0],[0,0],[0,0],[-1.1400000000000006,-1.6299999999999955],[-1.2000000000000028,0.03999999999999204],[0,0],[0,0],[0,0],[-0.14000000000000057,0.6500000000000057],[-0.5900000000000034,0.36000000000001364],[0,0],[-1.019999999999996,0.9699999999999989],[1.0499999999999972,-1.5800000000000125],[2.969999999999999,0.5200000000000102],[-1.7900000000000063,0.05000000000001137],[-0.7800000000000011,0.5699999999999932],[0,0],[0,0],[-0.5699999999999932,1.4099999999999966],[0.09999999999999432,-0.46000000000000796],[-2.489999999999995,0.960000000000008],[0.04999999999999716,-1.210000000000008],[0,0],[-1.5499999999999972,-0.5999999999999943],[0,0],[-0.3299999999999983,-1.5800000000000125],[0,0],[-2.6700000000000017,0.5999999999999943],[0,0.8400000000000034],[-1.5499999999999972,0.8000000000000114],[0,0],[0,0],[0,0],[2.259999999999998,0.3199999999999932],[-0.14000000000000057,4.110000000000014],[3.4599999999999937,5.139999999999986],[1.5900000000000034,3.0999999999999943],[0,0],[-1.8200000000000003,-2.6100000000000136],[0,0],[0,0],[-0.020000000000003126,-0.25],[0,0],[0,0],[-0.7299999999999969,-2.6699999999999875],[-0.00999999999999801,-0.30000000000001137],[-0.4200000000000017,-1.6999999999999886],[0.25,-1.789999999999992],[0.240000000000002,-0.0800000000000125],[0.7899999999999991,0.8400000000000034],[4.090000000000003,-0.09999999999999432],[2.950000000000003,-0.020000000000010232],[0,0]],"v":[[87.5,154],[89,154],[96,154],[98.5,154],[132.5,154],[135,154],[138,154.75],[151.27,172.98],[153.98000000000002,174.76999999999998],[183.27,174.98999999999998],[186,175.51],[215.5,175.51],[218,175.01],[218.5,178.51],[217.75,181.51],[215.97,179.01999999999998],[212.02,178.51],[211.4,181.42999999999998],[210.06,181.54],[207.49,182.25],[208.53,181.73],[208,180.01],[209.5,179.01],[204.11,179.85],[201.01000000000002,180.51],[200.26000000000002,182.51],[199.01000000000002,179.25],[196.50000000000003,180.01],[196.50000000000003,178.51],[191.97000000000003,178.7],[190.25000000000003,180.03],[188.15000000000003,178.61],[182.73000000000005,179.96],[176.99000000000004,179.76000000000002],[176.99000000000004,181.01000000000002],[178.74000000000004,180.50000000000003],[175.00000000000003,183.51000000000002],[174.00000000000003,183.51000000000002],[174.00000000000003,179.01000000000002],[167.83000000000004,179.31000000000003],[160.79000000000005,178.51000000000002],[160.16000000000005,179.51000000000002],[153.95000000000005,178.71],[148.50000000000006,177],[149.01000000000005,175.8],[146.55000000000004,171.20000000000002],[144.56000000000003,170.44000000000003],[144.48000000000002,167.86],[139.66000000000003,161.34],[133.50000000000003,156.51],[133.50000000000003,158.01],[129.75000000000003,158.01],[128.50000000000003,156.51],[128.91000000000003,159.32999999999998],[129.74000000000004,161.01],[127.20000000000003,160.01999999999998],[127.49000000000004,156.51999999999998],[124.78000000000004,156.02999999999997],[122.50000000000004,162.61999999999998],[119.50000000000004,164.74999999999997],[119.47000000000004,162.26999999999998],[121.00000000000004,160.99999999999997],[117.51000000000005,161.49999999999997],[119.51000000000005,158.49999999999997],[122.01000000000005,159.49999999999997],[121.72000000000004,157.44999999999996],[119.01000000000005,157.00999999999996],[119.51000000000005,158.50999999999996],[118.56000000000004,158.46999999999997],[118.51000000000005,156.49999999999997],[109.77000000000005,156.47999999999996],[109.27000000000005,157.99999999999997],[105.28000000000006,156.48999999999998],[102.96000000000006,156.08999999999997],[100.79000000000006,157.39],[99.28000000000006,156.48999999999998],[97.54000000000006,157.76],[98.45000000000006,160.92],[93.54000000000006,161],[93.47000000000007,162.41],[89.04000000000008,160.26],[91.81000000000007,160.5],[95.53000000000007,156.51],[89.54000000000008,157.29],[87.53000000000007,156.51],[80.03000000000007,156.51],[81.00000000000007,159.22],[78.03000000000007,158.76],[79.53000000000007,156.01],[73.04000000000008,159.01],[71.04000000000008,156.51],[71.04000000000008,162.51],[69.54000000000008,159.01],[66.54000000000008,159.51],[69.03000000000007,158.51],[69.03000000000007,157.01],[63.06000000000007,157.01999999999998],[61.36000000000007,159.79999999999998],[58.67000000000007,161.92],[59.54000000000007,162.5],[58.04000000000007,162.5],[59.12000000000007,170.44],[63.54000000000007,169.01],[68.80000000000007,167.01],[67.05000000000007,169.51],[65.54000000000006,174.51],[64.80000000000007,174.51],[59.54000000000007,174.01],[61.04000000000007,175.51],[59.54000000000007,177],[59.54000000000007,176.01],[58.80000000000007,176.01],[57.55000000000007,177],[57.560000000000066,170.79],[56.55000000000007,170.17],[56.09000000000007,159.79999999999998],[60.54000000000007,153.99999999999997],[61.54000000000007,153.99999999999997],[65.54000000000008,153.99999999999997],[78.04000000000008,153.49999999999997],[87.54000000000008,153.99999999999997]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 58","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[97,159],[96.01,159],[96.01,159.99],[97,159.99],[97,159]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 59","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[201.5,178.5],[200.01,178.5],[200.01,179.49],[201.5,179.49],[201.5,178.5]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.149,0.1843,0.1882]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[137.30582142857148,168.5472589285714]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[137.30582142857148,168.5472589285714]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 47","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 60","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[4.090000000000003,-0.09999999999999432],[1.2199999999999989,-0.13999999999998636],[0.240000000000002,-0.0800000000000125],[2.8500000000000014,0.5199999999999818],[3.279999999999994,8],[-0.00999999999999801,6.8700000000000045],[-21.58,2.780000000000001],[-5.240000000000009,-0.0799999999999983],[-5.540000000000006,-6.969999999999999],[0.09000000000000341,-9.849999999999994],[2.030000000000001,-5],[7.739999999999995,-1.6300000000000239],[-0.010000000000005116,-1.5199999999999818]],"o":[[-3.8900000000000006,0.020000000000010232],[-1.2900000000000063,0.030000000000001137],[-0.3200000000000003,0.03999999999999204],[-2.4099999999999966,-1.7199999999999989],[-8,-1.4699999999999989],[-2.7699999999999996,-6.75],[0.03999999999999915,-16.510000000000005],[5.189999999999998,-0.6700000000000017],[8.150000000000006,0.12999999999999545],[6.310000000000002,7.939999999999998],[-0.04999999999999716,5.150000000000006],[-3.219999999999999,7.9199999999999875],[-1.0699999999999932,0.21999999999999886],[0,0]],"v":[[78,153.5],[65.5,154],[61.5,154],[60.5,154],[51.29,152.46],[33.34,140.41],[31.450000000000003,122.19999999999999],[50.81,85.55999999999999],[68.77000000000001,84.97999999999999],[94.00000000000001,92.74999999999999],[98.48000000000002,126.26999999999998],[96.36000000000001,140.6],[79.75000000000001,151.99],[78.00000000000001,153.5]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 61","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6199999999999974,-5.859999999999999],[-0.8000000000000043,-8.800000000000011],[-6.759999999999998,-0.539999999999992],[-9.070000000000007,0.8300000000000125],[-0.5400000000000063,6.759999999999991],[0.8299999999999983,9.069999999999993],[6.510000000000005,0.5799999999999983],[8.380000000000003,-1.0499999999999972]],"o":[[-5.890000000000001,0.7399999999999949],[-0.9200000000000017,8.719999999999999],[0.6300000000000026,6.889999999999986],[9.14,0.7199999999999989],[6.890000000000001,-0.6299999999999955],[0.7199999999999989,-9.14],[-0.5900000000000034,-6.519999999999996],[-8.590000000000003,-0.769999999999996],[0,0]],"v":[[46.39,91.14],[37.06,100.81],[37.010000000000005,136.74],[47.730000000000004,147.02],[82.74000000000001,146.99],[93.02000000000001,136.27],[92.99000000000001,101.26000000000002],[82.74000000000001,91.01000000000002],[46.39000000000001,91.14000000000001]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9804,0.9804,0.9804]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[65.03957142857142,119.47547321428571]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[65.03957142857142,119.47547321428571]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 48","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 62","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-3.160000000000025,-0.0800000000000125],[-0.4700000000000273,0.8000000000000114],[-1.0500000000000114,-0.2300000000000182],[-0.14999999999997726,-3.920000000000016],[0.6700000000000159,-5.52000000000001],[2.490000000000009,-22.20999999999998],[2.2800000000000296,-12.490000000000009],[6.289999999999992,-0.2300000000000182],[0,0],[1.7899999999999991,4.939999999999998],[5.280000000000001,32.55000000000001],[0.5900000000000034,-1.1300000000000239],[0,0],[-3.269999999999996,-19.610000000000014],[-2.8599999999999994,-9.860000000000014],[-5.25,-0.6500000000000341],[0,0],[0.25,5.949999999999989],[0.9899999999999807,10.689999999999998],[2.9399999999999977,15.409999999999997],[0,0],[0.009999999999990905,1.1399999999999864],[0.09999999999999432,0.9699999999999989],[2,5.5],[6.509999999999991,0.28000000000000114],[4.170000000000016,0.5200000000000102],[-0.12000000000000455,0.8000000000000114],[-0.0800000000000125,0.13999999999998636],[-0.6699999999999875,1.8199999999999932],[-4.090000000000003,0.25]],"o":[[0,0],[3.160000000000025,0.030000000000001137],[0.5,0.8199999999999932],[1.0500000000000114,0.060000000000002274],[3.910000000000025,0.8499999999999943],[0.18999999999999773,5.259999999999991],[-2.7099999999999795,22.210000000000008],[-1.4399999999999977,12.870000000000005],[-1.1200000000000045,6.170000000000016],[0,0],[-5.650000000000006,-0.5799999999999841],[-4.950000000000003,-32.610000000000014],[2.4099999999999966,-0.5999999999999943],[0,0],[3.6899999999999977,19.53],[1.7299999999999969,10.379999999999995],[1.3999999999999986,4.850000000000023],[0,0],[6.4199999999999875,-0.410000000000025],[-0.44999999999998863,-10.399999999999977],[-2.759999999999991,-15.219999999999999],[0,0],[0.13999999999998636,-1.1399999999999864],[1.490000000000009,0.27000000000001023],[-0.6599999999999966,-6.289999999999992],[-2.4399999999999977,-6.719999999999999],[-4.060000000000002,-0.1699999999999875],[-0.030000000000001137,-0.8199999999999932],[0.030000000000001137,-0.21000000000000796],[2.039999999999992,-0.05000000000001137],[3.259999999999991,-2.1699999999999875],[0,0]],"v":[[231,167.5],[256,167.5],[265.5,167.5],[268.5,167.5],[271.63,167.61],[278.82,176.66000000000003],[276.07,195.31000000000003],[268.51,261.75],[264.46,302.2],[251.49999999999997,313.49],[70,313.49],[59.63,303.61],[43.5,205.99],[44.51,209.26000000000002],[45.47,209.03000000000003],[55.44,267.81000000000006],[61.239999999999995,302.51000000000005],[70.75,311.50000000000006],[252.27,311.52000000000004],[261.52,299.28000000000003],[255.30999999999997,264.90000000000003],[246.99999999999997,218.50000000000003],[248.93999999999997,217.95000000000002],[248.99999999999997,214.50000000000003],[249.93999999999997,212.82000000000002],[245.23999999999998,186.01000000000002],[231.26999999999998,178.47000000000003],[218.49999999999997,178.50000000000003],[217.99999999999997,175.00000000000003],[218.49999999999997,174.50000000000003],[223.49999999999997,170.00000000000003],[230.99999999999997,167.50000000000003]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1098,0.149,0.149]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[161.16557142857147,240.480125]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[161.16557142857147,240.480125]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 49","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 63","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.1599999999999966,-0.8400000000000034],[-0.4199999999999875,-2.180000000000007],[-2.759999999999991,-15.21999999999997],[-0.44999999999998863,-10.399999999999977],[6.420000000000016,-0.4000000000000341],[0,0],[1.3999999999999986,4.850000000000023],[1.7399999999999949,10.379999999999995],[3.6899999999999977,19.53],[0,0],[2.4099999999999966,-0.5900000000000034],[0.22999999999999687,1.5500000000000114],[0.03999999999999915,1.0300000000000011],[-0.12000000000000455,0.9000000000000057],[0,0],[-0.1599999999999966,0.47999999999998977],[-0.39000000000000057,0.9299999999999784],[-1.6900000000000048,0.09999999999999432],[0,0],[-1.3000000000000114,-2.530000000000001],[-0.9200000000000159,-4.689999999999998]],"o":[[0.1599999999999966,0.8300000000000125],[0.4099999999999966,2.1399999999999864],[2.9399999999999977,15.400000000000006],[0.9900000000000091,10.689999999999998],[0.2599999999999909,5.949999999999989],[0,0],[-5.260000000000005,-0.6399999999999864],[-2.8599999999999994,-9.860000000000014],[-3.280000000000001,-19.610000000000014],[0,0],[0.5900000000000034,-1.1299999999999955],[-0.21999999999999886,-1.3600000000000136],[0.7700000000000031,-0.7700000000000102],[-0.04999999999999716,-1.210000000000008],[0,0],[-1.5300000000000011,-2.219999999999999],[0.22999999999999687,-0.6800000000000068],[0.6700000000000017,-1.5999999999999943],[0,0],[2.5999999999999943,0.6200000000000045],[2.0600000000000023,4.02000000000001],[0,0]],"v":[[245,209.5],[245.5,212],[247,218.5],[255.31,264.9],[261.52,299.28],[252.26999999999998,311.52],[70.74999999999997,311.5],[61.239999999999974,302.51],[55.439999999999976,267.81],[45.46999999999998,209.03],[44.50999999999998,209.26],[43.49999999999998,205.98999999999998],[42.49999999999998,201.48999999999998],[43.55999999999998,198.21999999999997],[42.509999999999984,196.99999999999997],[43.45999999999999,196.78999999999996],[43.969999999999985,193.62999999999997],[44.36999999999998,191.11999999999998],[49.749999999999986,187.99999999999997],[234.76999999999998,187.99999999999997],[241.6,192.14999999999998],[245,209.49999999999997]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 64","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[24.57000000000002,-14.179999999999978],[-21.58,-18.370000000000005],[-7.280000000000001,-2.6899999999999977],[-0.29999999999998295,0],[-3.5100000000000193,0.660000000000025],[-1.0700000000000216,-0.029999999999972715],[-3.9099999999999966,2.7000000000000455],[0.46999999999999886,3.1900000000000546],[0,0],[-0.12999999999999545,0.1199999999999477],[-0.5099999999999909,0.6100000000000136],[-3.430000000000007,0.3499999999999659],[0,0],[-0.7700000000000102,5.8700000000000045],[-0.2699999999999818,1.1799999999999784],[0.37999999999999545,1.460000000000008],[0.09000000000000341,0.4000000000000057],[1.9799999999999898,1.75]],"o":[[-4.090000000000003,-27.74000000000001],[-24.700000000000003,14.259999999999991],[6.309999999999988,5.3700000000000045],[0.37000000000000455,0.13999999999998636],[3.8700000000000045,0.05000000000001137],[0.5099999999999909,0.9800000000000182],[4.689999999999998,0.12000000000000455],[1.3899999999999864,-0.9599999999999795],[0,0],[0.7599999999999909,-0.3299999999999841],[0.4300000000000068,-0.38999999999998636],[1.0300000000000011,-1.259999999999991],[0,0],[3.240000000000009,-4.949999999999989],[1.8899999999999864,0.2599999999999909],[0.11000000000001364,-0.47999999999998977],[-0.05000000000001137,-0.19999999999998863],[-0.5,-2.1500000000000057],[0,0]],"v":[[193,241.5],[132.35,212.1],[126.74,280.52],[144.13,289.03999999999996],[144.79999999999998,290.01],[158.01,290.01],[159.72,291.02],[176.25,284.47999999999996],[178.01,281.50999999999993],[179.26,282.50999999999993],[181.14,279.66999999999996],[183.05999999999997,278.81999999999994],[186.29999999999998,275.54999999999995],[186.51999999999998,272.50999999999993],[193.01999999999998,255.00999999999993],[194.02999999999997,250.83999999999995],[195.02999999999997,249.25999999999993],[194.02999999999997,248.66999999999993],[193.01999999999998,241.50999999999993]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1529,0.1961,0.2]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[152.01757142857147,249.76]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[152.01757142857147,249.76]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","bm":0,"hd":false,"nm":"Group 50","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 65","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[338,0],[338,368],[0,368],[0,0],[338,0]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 66","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6300000000000239,-6.050000000000001],[-0.7099999999999795,-9.060000000000002],[-7.340000000000003,-0.5800000000000125],[-9.109999999999985,0.8200000000000074],[-0.5399999999999636,6.900000000000006],[0.7300000000000182,9.259999999999998],[7.099999999999994,0.6400000000000006],[8.539999999999992,-1.0199999999999996]],"o":[[-6.0800000000000125,0.7300000000000004],[-0.9199999999999875,8.909999999999997],[0.5699999999999932,7.32],[9.169999999999987,0.7199999999999989],[7.02000000000001,-0.6299999999999955],[0.7300000000000182,-9.259999999999998],[-0.5500000000000114,-6.990000000000002],[-8.699999999999989,-0.7899999999999991],[0,0]],"v":[[211.39,16.14],[202.05999999999997,25.810000000000002],[201.97999999999996,61.27],[212.72999999999996,72.02000000000001],[247.73999999999995,71.99000000000001],[258.0199999999999,61.27000000000001],[258.0199999999999,26.73000000000001],[247.73999999999992,16.010000000000012],[211.38999999999993,16.14000000000001]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 67","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6299999999999955,-6.050000000000004],[-0.710000000000008,-9.060000000000002],[-7.269999999999996,-0.5699999999999932],[-9.099999999999994,0.8200000000000074],[-0.539999999999992,6.900000000000006],[0.7299999999999898,9.259999999999998],[7.099999999999994,0.6400000000000006],[8.539999999999992,-1.0200000000000031]],"o":[[-6.079999999999998,0.7299999999999969],[-0.9200000000000017,8.909999999999997],[0.5699999999999932,7.239999999999995],[9.16000000000001,0.7199999999999989],[7.02000000000001,-0.6299999999999955],[0.7299999999999898,-9.260000000000005],[-0.5500000000000114,-6.990000000000002],[-8.699999999999989,-0.7899999999999991],[0,0]],"v":[[125.39,39.14],[116.06,48.81],[115.98,84.27000000000001],[126.73,95.02000000000001],[161.74,94.99000000000001],[172.02,84.27000000000001],[172.02,49.73000000000001],[161.74,39.01000000000001],[125.39000000000001,39.140000000000015]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 68","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.25,-1.7900000000000205],[-0.4200000000000017,-1.700000000000017],[-0.00999999999999801,-0.30000000000001137],[-0.740000000000002,-2.6599999999999966],[-0.20000000000000284,-0.5300000000000011],[0,0],[2.1400000000000006,-0.36000000000001364],[-0.9500000000000028,-6.289999999999992],[-0.21999999999999886,-1.3600000000000136],[-4.950000000000003,-32.60999999999996],[-5.650000000000006,-0.589999999999975],[0,0],[-1.1299999999999955,6.170000000000016],[-1.4499999999999886,12.870000000000005],[-2.7099999999999795,22.210000000000008],[0.18999999999999773,5.260000000000019],[3.910000000000025,0.8600000000000136],[1.0500000000000114,0.060000000000002274],[1,0.020000000000010232],[3.160000000000025,0.030000000000001137],[7.920000000000016,-0.47999999999998977],[3.259999999999991,-2.1699999999999875],[1.1399999999999864,-2.030000000000001],[0.030000000000001137,-0.21000000000000796],[0.8000000000000114,-0.13999999999998636],[0,0],[0.9799999999999898,0.09000000000000341],[9.48999999999998,1.0699999999999932],[0.8000000000000114,0.8700000000000045],[4.660000000000025,2.1699999999999875],[1.0699999999999932,0.12999999999999545],[0.8199999999999932,0.030000000000001137],[11.379999999999995,0],[0.8299999999999983,0],[2.3299999999999983,-0.009999999999990905],[0.5,0],[2.950000000000003,-0.020000000000010232],[-1.0699999999999932,0.22999999999998977],[-3.219999999999999,7.920000000000016],[-0.04000000000000625,5.1499999999999915],[6.320000000000007,7.939999999999998],[8.150000000000006,0.12999999999999545],[5.190000000000005,-0.6700000000000017],[0.03999999999999915,-16.519999999999996],[-2.780000000000001,-6.75],[-8,-1.4699999999999989],[-2.4100000000000037,-1.7199999999999989]],"o":[[-1.5700000000000003,0.5],[-0.25,1.7900000000000205],[0.09000000000000341,0.37999999999999545],[0.0799999999999983,1.8499999999999943],[0.14999999999999858,0.5600000000000023],[0,0],[-2.1899999999999977,0.03999999999999204],[-8.810000000000002,1.5],[0.22999999999999687,1.5500000000000114],[5.280000000000001,32.54999999999998],[1.7899999999999991,4.939999999999998],[0,0],[6.2900000000000205,-0.2400000000000091],[2.2799999999999727,-12.490000000000009],[2.490000000000009,-22.22],[0.6700000000000159,-5.52000000000001],[-0.13999999999998636,-3.9199999999999875],[-1.0500000000000114,-0.22999999999998977],[-0.9900000000000091,-0.060000000000002274],[-3.160000000000025,-0.0800000000000125],[-8.030000000000001,-0.06999999999999318],[-4.090000000000003,0.25],[-1.8000000000000114,1.1999999999999886],[-0.0800000000000125,0.13999999999998636],[-0.7700000000000102,0.5999999999999943],[0,0],[-0.7199999999999989,-0.030000000000001137],[-9.390000000000015,-0.8300000000000125],[-1.0900000000000034,-0.4300000000000068],[-3.719999999999999,-4.050000000000011],[-1,-0.46000000000000796],[-0.7800000000000011,-0.09000000000000341],[-11.39,-0.47999999999998977],[-0.8299999999999983,0],[-2.3299999999999983,0],[-0.5,0],[-3.239999999999995,0.020000000000010232],[-0.010000000000005116,-1.5200000000000102],[7.739999999999995,-1.6299999999999955],[2.030000000000001,-5],[0.09000000000000341,-9.849999999999994],[-5.540000000000006,-6.969999999999999],[-5.240000000000002,-0.0799999999999983],[-21.58,2.780000000000001],[-0.019999999999999574,6.88000000000001],[3.280000000000001,8],[2.8500000000000014,0.5200000000000102],[0,0]],"v":[[60.5,154],[56.05,159.8],[56.51,170.17000000000002],[57.519999999999996,170.79000000000002],[57.51,177.00000000000003],[58.01,178.50000000000003],[58.51,184.50000000000003],[48.879999999999995,185.12000000000003],[42.51,201.50000000000003],[43.51,206.00000000000003],[59.64,303.62],[70.01,313.5],[251.51,313.5],[264.46999999999997,302.21],[268.52,261.76],[276.08,195.32],[278.83,176.67],[271.64,167.61999999999998],[268.51,167.50999999999996],[265.51,167.50999999999996],[256.01,167.50999999999996],[231.01,167.50999999999996],[223.51,170.00999999999996],[218.51,174.50999999999996],[218.01,175.00999999999996],[215.51,175.50999999999996],[186.01,175.50999999999996],[183.28,174.98999999999995],[153.99,174.76999999999995],[151.28,172.97999999999996],[138.01,154.74999999999997],[135.01,153.99999999999997],[132.51,153.99999999999997],[98.50999999999999,153.99999999999997],[96.00999999999999,153.99999999999997],[89.00999999999999,153.99999999999997],[87.50999999999999,153.99999999999997],[78.00999999999999,153.49999999999997],[79.75999999999999,151.98999999999998],[96.36999999999999,140.59999999999997],[98.49,126.26999999999997],[94.00999999999999,92.74999999999997],[68.77999999999999,84.97999999999998],[50.819999999999986,85.55999999999997],[31.459999999999987,122.19999999999997],[33.34999999999999,140.40999999999997],[51.29999999999998,152.45999999999998],[60.509999999999984,153.99999999999997]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 69","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.6299999999999955,-6.049999999999997],[-0.7100000000000364,-9.050000000000011],[-7.339999999999975,-0.5800000000000125],[-5.559999999999945,1.6799999999999784],[-0.37000000000000455,4.740000000000009],[1.6800000000000068,5.560000000000002],[4.539999999999964,0.4100000000000108],[8.54000000000002,-1.019999999999996]],"o":[[-6.079999999999984,0.730000000000004],[-0.9200000000000159,8.909999999999997],[0.5699999999999932,7.319999999999993],[6.910000000000025,0.539999999999992],[4.8700000000000045,-1.4699999999999989],[0.5400000000000205,-6.909999999999997],[-1.3899999999999864,-4.609999999999999],[-8.699999999999989,-0.7900000000000063],[0,0]],"v":[[275.39,89.14],[266.06,98.81],[265.98,134.27],[276.73,145.02],[315.51,144.26000000000002],[322.02,134.27],[321.26,95.49000000000001],[311.74,89.01],[275.39,89.14]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.9961,0.9961,0.9961]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[169,184]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[169,184]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"tr","a":{"a":0,"k":[169,184]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[169,184]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":1}]}]} \ No newline at end of file diff --git a/assets/animations/lottie/pending_loading_animation.json b/assets/animations/lottie/pending_loading_animation.json new file mode 100644 index 0000000..177ef65 --- /dev/null +++ b/assets/animations/lottie/pending_loading_animation.json @@ -0,0 +1 @@ +{"nm":"loader","ddd":0,"h":720,"w":720,"meta":{"g":"@lottiefiles/toolkit-js 0.33.2"},"layers":[{"ty":4,"nm":"bubble","sr":1,"st":30,"op":50,"ip":27,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-23.672,-43.28,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[3.698,50.595,0],"t":27,"ti":[-3.16098022460938,1.98855590820312,0],"to":[4.02357578277588,0.35728123784065,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":0.833},"s":[27.839,52.739,0],"t":35,"ti":[12.7697801589966,16.6396007537842,0],"to":[3.16098022460938,-1.98855590820312,0]},{"s":[11.589,25.489,0],"t":50}],"ix":2},"r":{"a":0,"k":-155.955,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Rectangle 1","ix":1,"cix":2,"np":3,"it":[{"ty":"rc","bm":0,"hd":false,"mn":"ADBE Vector Shape - Rect","nm":"Rectangle Path 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"s":{"a":0,"k":[9.485,9.485],"ix":2}},{"ty":"st","bm":0,"hd":true,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"c":{"a":0,"k":[0.0078,0.0627,0.1882],"ix":3}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,0.6863,0.0824],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-23.672,-43.28],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1,"parent":6},{"ty":4,"nm":"timeline","sr":1,"st":35,"op":60,"ip":35,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[144,144,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[360,347.04,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Shape 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.25,1],[1.25,0.5]]}],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.236,3.52],[1,56.5]]}],"t":52},{"s":[{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.07,46.291],[1,56.75]]}],"t":59}],"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"c":{"a":0,"k":[1,0.6863,0.0824],"ix":3}},{"ty":"fl","bm":0,"hd":true,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.0078,0.0627,0.1882],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":2,"cix":2,"np":1,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.07,44.041],[1,54.25]]},"ix":2}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"top","sr":1,"st":0,"op":60,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[-0.237,-75.448,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"top","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-74.495,-9.31],[74.495,-9.31],[74.495,9.31],[-74.495,9.31]]},"ix":2}},{"ty":"rd","bm":0,"hd":false,"mn":"ADBE Vector Filter - RC","nm":"Round Corners 1","ix":2,"r":{"a":0,"k":9.31,"ix":1}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.0078,0.0627,0.1882],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3,"parent":6},{"ty":4,"nm":"time-down","sr":1,"st":7,"op":60,"ip":53,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,-100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[-1.53,-33,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"time 2","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[{"c":true,"i":[[-6.69,0],[0,0],[-0.111,5.244],[1.215,8.14],[7.97,0.125],[2.32,-2.28],[0.22,-5.32],[0,0]],"o":[[0,0],[6.59,0],[-0.5,-6.85],[-0.598,-4.008],[-7.97,-0.125],[0,0],[0,0],[0,6.71]],"v":[[-0.89,25.5],[3.223,25.5],[6.75,20.35],[5.815,7.985],[-0.355,9],[-3.245,12.395],[-5,15.93],[-6,20.35]]}],"t":53},{"s":[{"c":true,"i":[[-6.69,0],[0,0],[-0.111,5.244],[9.57,9.95],[7.97,0.125],[2.32,-2.28],[0.22,-5.32],[0,0]],"o":[[0,0],[6.59,0],[-0.5,-6.85],[-2.81,-2.92],[-7.97,-0.125],[0,0],[0,0],[0,6.71]],"v":[[-18.39,25.5],[20.723,25.5],[30.5,13.35],[16.39,-6.14],[-0.28,-14.5],[-16.795,-5.98],[-30.5,13.18],[-30.5,13.35]]}],"t":59}],"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,0.6863,0.0824],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"time","ix":2,"cix":2,"np":1,"it":[{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,0.6863,0.0824],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4,"parent":6},{"ty":4,"nm":"time-up","sr":1,"st":0,"op":53,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[-1.53,32.5,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"time 2","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[-6.69,0],[0,0],[-0.125,5.9],[9.57,9.95],[0,0],[2.32,-2.28],[0.22,-5.32],[0,0]],"o":[[0,0],[6.59,0],[0.125,-5.6],[-2.81,-2.92],[-5.98,0],[0,0],[0,0],[0,6.71]],"v":[[-18.39,25.5],[21.015,25.5],[30.5,13.35],[10.41,-21.82],[-0.19,-25.5],[-10.65,-21.99],[-30.5,13.18],[-30.5,13.35]]}],"t":-5},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[-6.69,0],[0,0],[-0.111,5.244],[9.57,9.95],[7.97,0.125],[2.32,-2.28],[0.22,-5.32],[0,0]],"o":[[0,0],[6.59,0],[-0.5,-6.85],[-2.81,-2.92],[-7.97,-0.125],[0,0],[0,0],[0,6.71]],"v":[[-18.39,25.5],[20.723,25.5],[30.5,13.35],[16.39,-6.14],[-0.28,-14.5],[-16.795,-5.98],[-30.5,13.18],[-30.5,13.35]]}],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":1},"s":[{"c":true,"i":[[-6.69,0],[0,0],[2.905,4.906],[7.706,11.409],[7.334,-3.123],[3.795,-7.031],[0.22,-5.32],[0,0]],"o":[[0,0],[6.59,0],[-3.838,-8.41],[-6.823,-6.658],[-5.759,2.452],[0,0],[0,0],[0,6.71]],"v":[[-18.39,25.5],[16.753,25.987],[26.53,13.837],[12.972,-9.051],[-7.23,-22.451],[-20.652,-6.377],[-30.5,13.18],[-30.5,13.35]]}],"t":20},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[-6.69,0],[0,0],[2.905,4.906],[7.706,11.409],[7.742,-1.897],[3.795,-7.031],[0.22,-5.32],[0,0]],"o":[[0,0],[6.59,0],[-3.838,-8.41],[-6.823,-6.658],[-8.432,2.066],[0,0],[0,0],[0,6.71]],"v":[[-15.709,24.889],[20.723,25.5],[30.5,13.35],[18.526,-10.751],[-0.661,-21.798],[-17.97,-6.988],[-27.819,12.569],[-27.819,12.739]]}],"t":25},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[-8.78,-0.135],[-6.861,2.709],[-3.043,7.511],[6.829,11.691],[9.846,-0.973],[3.076,-4.716],[0.22,-5.32],[2.646,-6.27]],"o":[[6.522,0.135],[6.397,-2.699],[2.728,-8.693],[-4.868,-4.837],[-10.263,1.059],[0,0],[0,0],[-2.646,6.27]],"v":[[-26.717,26.233],[2.736,24.462],[21.011,11.794],[17.963,-13.07],[-0.928,-23.139],[-18.387,-11.491],[-29.14,7.995],[-29.14,8.165]]}],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.667,"y":1},"s":[{"c":true,"i":[[-8.78,-0.135],[-4.173,2.699],[-3.043,7.511],[6.829,11.691],[9.846,-0.973],[3.076,-4.716],[3.17,-6.745],[0,0]],"o":[[6.522,0.135],[6.397,-2.699],[2.728,-8.693],[-4.868,-4.837],[-10.263,1.059],[0,0],[0,0],[0,6.71]],"v":[[-23.11,18.54],[6.222,16.368],[20.511,4.794],[17.963,-13.07],[-0.928,-23.139],[-18.387,-11.491],[-26.765,0.995],[-28.89,5.665]]}],"t":40},{"o":{"x":1,"y":0},"i":{"x":0.971,"y":1},"s":[{"c":true,"i":[[-10.45,-3.5],[-5.337,1.625],[0.065,4.325],[5.045,5.015],[12.06,0],[2.32,-2.28],[0.22,-5.32],[0,0]],"o":[[10.45,3.5],[5.337,-1.625],[0.435,-3.575],[-2.81,-2.92],[-12.19,0],[0,0],[0,0],[-2.69,7.15]],"v":[[-23.12,12.5],[8.857,7.25],[24.72,-4.05],[18.36,-16.14],[-0.31,-24.5],[-18.825,-16.23],[-25.78,-3.32],[-24.28,-7.15]]}],"t":46},{"s":[{"c":true,"i":[[0.17,-0.125],[0,0],[-0.095,0.4],[0.046,-0.11],[0.81,-0.125],[0.325,0.105],[0.28,-0.305],[0,0]],"o":[[0,0],[0.182,0.125],[-0.22,0.15],[-0.11,-0.36],[0.185,0],[0,0],[0,0],[-0.095,0.275]],"v":[[-1.67,-24.25],[-0.807,-24.375],[-0.28,-23.525],[0.391,-24.39],[-0.31,-24.5],[-0.294,-24.543],[-1.03,-24.32],[-1.405,-24.4]]}],"t":53}],"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,0.6863,0.0824],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"time","ix":2,"cix":2,"np":1,"it":[{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.0078,0.0627,0.1882],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5,"parent":6},{"ty":4,"nm":"outline-shape","sr":1,"st":0,"op":60,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[144,144,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[360,360,0],"ix":2},"r":{"a":1,"k":[{"o":{"x":0.185,"y":4.757},"i":{"x":0.575,"y":-11.69},"s":[0],"t":0},{"o":{"x":0.341,"y":0.192},"i":{"x":0.703,"y":1},"s":[7],"t":20},{"o":{"x":0.167,"y":0},"i":{"x":0.703,"y":1},"s":[193],"t":30},{"o":{"x":0.167,"y":0},"i":{"x":0.703,"y":1},"s":[176],"t":39},{"s":[180],"t":43}],"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"shape","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,7.99],[0,0],[0,0],[0,0],[19.09,-27.84],[0,0],[-0.19,-8.53],[0,0],[0,0],[0,0],[0,0],[-17.24,26.68],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,8.5],[0,0],[18.52,27.1],[0,0],[0,0],[0,0],[0,0],[0,-7.99],[0,0],[0,0],[-17.24,-26.68]],"v":[[-50.5,-54.51],[-50.5,-71],[50.5,-71],[50.5,-54.51],[21.86,0],[22.43,0.83],[50.5,54.26],[50.5,54.51],[50.5,71],[-50.5,71],[-50.5,54.51],[-24.64,2.5],[-23.02,0],[-24.64,-2.5]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"c":{"a":0,"k":[0.0078,0.0627,0.1882],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6},{"ty":4,"nm":"bottom","sr":1,"st":0,"op":60,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[-0.237,75.839,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"bottom","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-74.495,-9.31],[74.495,-9.31],[74.495,9.31],[-74.495,9.31]]},"ix":2}},{"ty":"rd","bm":0,"hd":false,"mn":"ADBE Vector Filter - RC","nm":"Round Corners 1","ix":2,"r":{"a":0,"k":9.31,"ix":1}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.0078,0.0627,0.1882],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":7,"parent":6}],"v":"5.2.1","fr":60,"op":60,"ip":0,"assets":[]} \ No newline at end of file diff --git a/assets/animations/lottie/register.json b/assets/animations/lottie/register.json new file mode 100755 index 0000000..986bd80 --- /dev/null +++ b/assets/animations/lottie/register.json @@ -0,0 +1 @@ +{"nm":"Ani Nop ho so","h":250,"w":250,"meta":{"g":"LottieFiles AE 0.1.20"},"layers":[{"ty":4,"nm":"sao1/File Quet thong tin Outlines","sr":1,"st":80,"op":135,"ip":80,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[49,205.5,0]},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[0,0,100],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[120,120,100],"t":94},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[120,120,100],"t":112},{"s":[0,0,100],"t":128}]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41,85.152,0]},"r":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[0],"t":80},{"s":[80],"t":128}]},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[0],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":94},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":112},{"s":[0],"t":128}]}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[1.273,-1.218],[1.686,-0.463],[0,0],[0,0],[-1.232,-1.242],[-0.455,-1.698],[0,0],[0,0],[-1.242,1.233],[-1.682,0.485],[0,0],[0,0],[0.951,3.441]],"o":[[0,0],[-0.495,1.69],[-1.244,1.228],[0,0],[0,0],[1.679,0.489],[1.235,1.251],[0,0],[0,0],[0.489,-1.679],[1.25,-1.226],[0,0],[0,0],[-3.429,-0.994],[0,0]],"v":[[0.12,-17.919],[-2.37,-9.462],[-5.068,-5.023],[-9.538,-2.443],[-17.993,-0.195],[-9.507,2.294],[-5.068,4.933],[-2.49,9.432],[-0.12,17.919],[2.368,9.462],[5.008,5.022],[9.476,2.414],[17.993,0.045],[9.536,-2.415],[2.489,-9.551]]}}},{"ty":"mm","nm":"Merge Paths 1","mm":4},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[49.098,206.159]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":1},{"ty":1,"nm":"White Solid 3","sr":1,"st":91,"op":118,"ip":91,"hasMask":true,"ao":0,"ks":{"a":{"a":0,"k":[125,125,0]},"s":{"a":0,"k":[34.801,34.801,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[184.375,161.875,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":91},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":100},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":110},{"s":[0],"t":117}]}},"ef":[],"masksProperties":[{"nm":"Mask 1","inv":false,"mode":"f","x":{"a":0,"k":0},"o":{"a":0,"k":100},"pt":{"a":0,"k":{"c":true,"i":[[0.096,0],[2.65,2.651],[0,0],[-5.513,5.513],[-5.514,-5.514],[0,0],[0,0],[-5.735,-5.283],[5.283,-5.734],[0,0],[3.844,-0.079]],"o":[[-3.74,0],[0,0],[-5.513,-5.513],[5.513,-5.513],[0,0],[0,0],[5.283,-5.735],[5.734,5.283],[0,0],[-2.605,2.827],[-0.096,0.002]],"v":[[111.477,179.381],[101.495,175.246],[55.605,129.356],[55.605,109.391],[75.571,109.391],[111.061,144.881],[173.859,76.719],[193.808,75.902],[194.625,95.851],[121.861,174.829],[111.767,179.378]]}}}],"sc":"#ffffff","sh":250,"sw":250,"ind":2},{"ty":4,"nm":"tick","sr":1,"st":80,"op":148,"ip":80,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[185.163,160.599,0]},"s":{"a":1,"k":[{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[0,0,100],"t":80},{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[110,110,100],"t":90},{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[100,100,100],"t":100},{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[100,100,100],"t":113},{"s":[0,0,100],"t":126}]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[185.163,160.599,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":80},{"o":{"x":0.167,"y":0},"i":{"x":0.75,"y":1},"s":[100],"t":87},{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[100],"t":113},{"s":[0],"t":123}]}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-19.508,0],[0,19.508],[19.508,0],[0,-19.507]],"o":[[19.508,0],[0,-19.507],[-19.508,0],[0,19.508]],"v":[[0,35.322],[35.321,0],[0,-35.322],[-35.321,0]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[185.164,160.599]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[-22.619,0],[0,22.619],[22.619,0],[0,-22.619]],"o":[[22.619,0],[0,-22.619],[-22.619,0],[0,22.619]],"v":[[0,40.955],[40.955,-0.001],[0,-40.956],[-40.955,-0.001]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[185.163,160.599]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":3},{"ty":4,"nm":"Bia ho so","sr":1,"st":15,"op":150,"ip":30,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[125,125,0]},"s":{"a":1,"k":[{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[70,70,100],"t":28},{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[105,105,100],"t":44},{"s":[100,100,100],"t":54}]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[153,125,0],"t":31,"ti":[4.667,0,0],"to":[-4.667,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[125,125,0],"t":49,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[125,125,0],"t":116,"ti":[-4.667,0,0],"to":[4.667,0,0]},{"s":[153,125,0],"t":132}]},"r":{"a":1,"k":[{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[4],"t":31},{"o":{"x":0.25,"y":0},"i":{"x":0.667,"y":1},"s":[0],"t":49},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":116},{"s":[4],"t":132}]},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.24,"y":0},"i":{"x":0.53,"y":1},"s":[0],"t":26},{"o":{"x":0.24,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":40},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":127},{"s":[1],"t":132}]}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.407,0.127],[0,0],[0.13,-2.403],[0,0],[-2.381,-0.126],[0,0],[-0.128,2.387],[0,0]],"o":[[0,0],[-2.402,-0.127],[0,0],[-0.129,2.381],[0,0],[2.388,0.126],[0,0],[0.13,-2.407]],"v":[[15.887,3.499],[-10.461,2.107],[-15.065,6.245],[-15.067,6.293],[-10.972,10.85],[15.471,12.247],[20.025,8.154],[20.028,8.106]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.129,-2.389],[0,0],[2.414,0.128],[0,0],[-0.13,2.407],[-2.414,-0.128],[0,0]],"o":[[0,0],[-0.13,2.414],[0,0],[-2.407,-0.127],[0.13,-2.414],[0,0],[2.389,0.126]],"v":[[20.785,-5.953],[20.783,-5.905],[16.178,-1.767],[-16.644,-3.5],[-20.784,-8.107],[-16.179,-12.245],[16.691,-10.509]]}}},{"ty":"mm","nm":"Merge Paths 1","mm":1},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[182.788,69.441]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.69,0.745],[1.029,0.054],[0,0],[0,0],[0.082,-1.837],[0,0],[1.939,-1.796],[0.028,-0.025],[0,0],[0,0],[0,0],[-0.11,2.037],[0,0]],"o":[[-0.689,-0.746],[0,0],[0,0],[0.875,1.612],[0,0],[-0.118,2.646],[-0.028,0.025],[0,0],[0,0],[0,0],[2.099,0.087],[0,0],[0.054,-1]],"v":[[55.916,-82.36],[53.25,-83.6],[-42.043,-88.633],[-31.995,-71.851],[-30.761,-66.589],[-36.433,61.005],[-39.769,67.615],[-39.845,67.695],[-56.956,83.213],[43.976,88.544],[44.023,88.546],[48.029,85.008],[56.903,-79.654]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.18,0.188,0.224]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[154.926,125.682]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":4},{"ty":4,"nm":"ho so","sr":1,"st":0,"op":150,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[107.969,124.018,0]},"s":{"a":1,"k":[{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[100,100,100],"t":47},{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[97,97,100],"t":51},{"s":[100,100,100],"t":56}]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.33,"y":0},"i":{"x":0.67,"y":1},"s":[125,125,0],"t":0,"ti":[3.987,0.361,0],"to":[-3.987,-0.361,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[101.079,122.833,0],"t":17,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.33,"y":0},"i":{"x":0.667,"y":1},"s":[101.079,122.833,0],"t":24,"ti":[-1.167,0,0],"to":[-2.167,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[88.079,122.833,0],"t":42,"ti":[-3.333,0,0],"to":[1.167,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[108.079,122.833,0],"t":56,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[108.079,122.833,0],"t":116,"ti":[-2.82,-0.361,0],"to":[2.82,0.361,0]},{"s":[125,125,0],"t":132}]},"r":{"a":1,"k":[{"o":{"x":0.33,"y":0},"i":{"x":0.67,"y":1},"s":[4],"t":0},{"o":{"x":0.33,"y":0},"i":{"x":0.67,"y":1},"s":[-5],"t":17},{"o":{"x":0.33,"y":0},"i":{"x":0.667,"y":1},"s":[-5],"t":24},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[1],"t":42},{"o":{"x":0.167,"y":0},"i":{"x":0.75,"y":1},"s":[0],"t":56},{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[0],"t":116},{"s":[4],"t":132}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"ef":[],"shapes":[{"ty":"gr","nm":"Bong ho so","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0.347,5.336],[0,0],[5.337,-0.347],[0,0],[0,0],[0.168,-4.91],[0,0],[3.429,-3.441]],"o":[[0,0],[5.338,-0.347],[0,0],[-0.347,-5.337],[0,0],[0,0],[3.252,3.682],[0,0],[-0.166,4.854],[0,0]],"v":[[-36.517,78.121],[27.134,73.975],[36.17,63.683],[27.545,-68.739],[17.252,-77.774],[-25.786,-74.971],[-21.807,-70.467],[-17.004,-57.087],[-20.845,55.098],[-26.438,68.005]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.898,0.902,0.922]},"r":1,"o":{"a":1,"k":[{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[0],"t":42},{"o":{"x":0.25,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":56},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":116},{"s":[0],"t":132}]}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[132.788,122.856]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.323,4.974],[0,0],[4.972,-0.324],[0,0],[-0.324,-4.974],[0,0],[-4.973,0.324],[0,0]],"o":[[0,0],[-0.323,-4.973],[0,0],[-4.974,0.324],[0,0],[0.323,4.972],[0,0],[4.974,-0.323]],"v":[[48.526,27.743],[47.464,11.451],[37.874,3.033],[-36.994,7.908],[-45.413,17.5],[-44.352,33.792],[-34.761,42.21],[40.107,37.334]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.105,1.625],[0,0],[1.625,-0.106],[0,0],[-0.106,-1.626],[-1.625,0.105],[0,0]],"o":[[0,0],[-0.107,-1.625],[0,0],[-1.625,0.106],[0.106,1.625],[0,0],[1.625,-0.107]],"v":[[46,-11.05],[46,-11.05],[42.865,-13.801],[-44.128,-8.136],[-46.879,-5.001],[-43.745,-2.25],[43.249,-7.915]]}}},{"ty":"sh","nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.106,1.626],[0,0],[1.625,-0.106],[0,0],[-0.106,-1.625],[-1.625,0.105],[0,0]],"o":[[0,0],[-0.106,-1.625],[0,0],[-1.625,0.106],[0.106,1.625],[0,0],[1.625,-0.106]],"v":[[45.011,-26.225],[45.011,-26.225],[41.877,-28.976],[-45.116,-23.311],[-47.867,-20.176],[-44.733,-17.425],[42.26,-23.09]]}}},{"ty":"sh","nm":"Path 4","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.625,-0.106],[0,0],[0.106,1.626],[-1.625,0.106],[0,0],[-0.106,-1.625]],"o":[[0,0],[-1.625,0.106],[-0.106,-1.625],[0,0],[1.625,-0.106],[0.106,1.625]],"v":[[41.384,-36.542],[-45.609,-30.877],[-48.743,-33.628],[-45.992,-36.762],[41.001,-42.427],[44.135,-39.676]]}}},{"ty":"mm","nm":"Merge Paths 1","mm":1},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.898,0.902,0.922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.105,145.872]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[7.717,-0.543],[0,0],[-0.573,-7.385],[-2.602,0.183],[0,0],[0.193,2.49]],"o":[[0,0],[-7.717,0.544],[0.194,2.49],[0,0],[2.603,-0.184],[-0.574,-7.385]],"v":[[3.42,2.572],[-5.118,3.173],[-18.052,17.529],[-12.99,21.706],[14.069,19.801],[18.432,14.959]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.442,5.703],[-5.96,0.42],[-0.444,-5.703],[5.96,-0.419]],"o":[[-0.443,-5.703],[5.96,-0.419],[0.442,5.703],[-5.959,0.42]],"v":[[-12.728,-10.383],[-2.74,-21.47],[8.854,-11.903],[-1.136,-0.816]]}}},{"ty":"mm","nm":"Merge Paths 1","mm":1},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[75.317,77.865]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 4","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[5.466,-0.356],[0,0],[0.356,5.467],[0,0],[-5.466,0.356],[0,0],[-0.356,-5.466],[0,0]],"o":[[0,0],[-5.465,0.355],[0,0],[-0.356,-5.467],[0,0],[5.466,-0.355],[0,0],[0.356,5.466]],"v":[[51.721,72.828],[-41.839,78.921],[-52.38,69.669],[-60.973,-62.287],[-51.721,-72.829],[41.838,-78.922],[52.38,-69.669],[60.973,62.286]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.969,124.018]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 5","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[6.766,-0.441],[0,0],[0.44,6.766],[0,0],[-6.766,0.441],[0,0],[-0.44,-6.766],[0,0]],"o":[[0,0],[-6.767,0.441],[0,0],[-0.44,-6.767],[0,0],[6.765,-0.441],[0,0],[0.441,6.766]],"v":[[54.159,77.318],[-43.674,83.689],[-56.723,72.236],[-65.613,-64.268],[-54.16,-77.317],[43.674,-83.688],[56.722,-72.235],[65.612,64.268]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.898,0.902,0.922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.969,124.018]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":5},{"ty":4,"nm":"ho so 3","sr":1,"st":0,"op":77,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[107.969,124.018,0]},"s":{"a":0,"k":[100,100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.33,"y":0},"i":{"x":0.67,"y":1},"s":[125,125,0],"t":0,"ti":[-3.833,0,0],"to":[3.833,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[148,125,0],"t":17,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.33,"y":0},"i":{"x":0.667,"y":1},"s":[148,125,0],"t":24,"ti":[9.987,0.361,0],"to":[-9.987,-0.361,0]},{"s":[88.079,122.833,0],"t":42}]},"r":{"a":1,"k":[{"o":{"x":0.33,"y":0},"i":{"x":0.67,"y":1},"s":[4],"t":0},{"o":{"x":0.33,"y":0},"i":{"x":0.67,"y":1},"s":[15],"t":17},{"o":{"x":0.33,"y":0},"i":{"x":0.667,"y":1},"s":[15],"t":24},{"s":[1],"t":42}]},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":42},{"s":[0],"t":43}]}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.323,4.974],[0,0],[4.972,-0.324],[0,0],[-0.324,-4.974],[0,0],[-4.973,0.324],[0,0]],"o":[[0,0],[-0.323,-4.973],[0,0],[-4.974,0.324],[0,0],[0.323,4.972],[0,0],[4.974,-0.323]],"v":[[48.526,27.743],[47.464,11.451],[37.874,3.033],[-36.994,7.908],[-45.413,17.5],[-44.352,33.792],[-34.761,42.21],[40.107,37.334]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.105,1.625],[0,0],[1.625,-0.106],[0,0],[-0.106,-1.626],[-1.625,0.105],[0,0]],"o":[[0,0],[-0.107,-1.625],[0,0],[-1.625,0.106],[0.106,1.625],[0,0],[1.625,-0.107]],"v":[[46,-11.05],[46,-11.05],[42.865,-13.801],[-44.128,-8.136],[-46.879,-5.001],[-43.745,-2.25],[43.249,-7.915]]}}},{"ty":"sh","nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.106,1.626],[0,0],[1.625,-0.106],[0,0],[-0.106,-1.625],[-1.625,0.105],[0,0]],"o":[[0,0],[-0.106,-1.625],[0,0],[-1.625,0.106],[0.106,1.625],[0,0],[1.625,-0.106]],"v":[[45.011,-26.225],[45.011,-26.225],[41.877,-28.976],[-45.116,-23.311],[-47.867,-20.176],[-44.733,-17.425],[42.26,-23.09]]}}},{"ty":"sh","nm":"Path 4","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.625,-0.106],[0,0],[0.106,1.626],[-1.625,0.106],[0,0],[-0.106,-1.625]],"o":[[0,0],[-1.625,0.106],[-0.106,-1.625],[0,0],[1.625,-0.106],[0.106,1.625]],"v":[[41.384,-36.542],[-45.609,-30.877],[-48.743,-33.628],[-45.992,-36.762],[41.001,-42.427],[44.135,-39.676]]}}},{"ty":"mm","nm":"Merge Paths 1","mm":1},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.898,0.902,0.922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.105,145.872]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[7.717,-0.543],[0,0],[-0.573,-7.385],[-2.602,0.183],[0,0],[0.193,2.49]],"o":[[0,0],[-7.717,0.544],[0.194,2.49],[0,0],[2.603,-0.184],[-0.574,-7.385]],"v":[[3.42,2.572],[-5.118,3.173],[-18.052,17.529],[-12.99,21.706],[14.069,19.801],[18.432,14.959]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.442,5.703],[-5.96,0.42],[-0.444,-5.703],[5.96,-0.419]],"o":[[-0.443,-5.703],[5.96,-0.419],[0.442,5.703],[-5.959,0.42]],"v":[[-12.728,-10.383],[-2.74,-21.47],[8.854,-11.903],[-1.136,-0.816]]}}},{"ty":"mm","nm":"Merge Paths 1","mm":1},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.929,0.11,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[75.317,77.865]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 4","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[5.466,-0.356],[0,0],[0.356,5.467],[0,0],[-5.466,0.356],[0,0],[-0.356,-5.466],[0,0]],"o":[[0,0],[-5.465,0.355],[0,0],[-0.356,-5.467],[0,0],[5.466,-0.355],[0,0],[0.356,5.466]],"v":[[51.721,72.828],[-41.839,78.921],[-52.38,69.669],[-60.973,-62.287],[-51.721,-72.829],[41.838,-78.922],[52.38,-69.669],[60.973,62.286]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.969,124.018]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 5","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[6.766,-0.441],[0,0],[0.44,6.766],[0,0],[-6.766,0.441],[0,0],[-0.44,-6.766],[0,0]],"o":[[0,0],[-6.767,0.441],[0,0],[-0.44,-6.767],[0,0],[6.765,-0.441],[0,0],[0.441,6.766]],"v":[[54.159,77.318],[-43.674,83.689],[-56.723,72.236],[-65.613,-64.268],[-54.16,-77.317],[43.674,-83.688],[56.722,-72.235],[65.612,64.268]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0.898,0.902,0.922]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[107.969,124.018]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":6},{"ty":4,"nm":"nen ho so","sr":1,"st":15,"op":150,"ip":30,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[125,125,0]},"s":{"a":1,"k":[{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[70,70,100],"t":28},{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[105,105,100],"t":44},{"s":[100,100,100],"t":54}]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[153,125,0],"t":31,"ti":[4.667,0,0],"to":[-4.667,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[125,125,0],"t":49,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[125,125,0],"t":116,"ti":[-4.667,0,0],"to":[4.667,0,0]},{"s":[153,125,0],"t":132}]},"r":{"a":1,"k":[{"o":{"x":0.25,"y":0},"i":{"x":0.75,"y":1},"s":[4],"t":31},{"o":{"x":0.25,"y":0},"i":{"x":0.667,"y":1},"s":[0],"t":49},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":116},{"s":[4],"t":132}]},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.24,"y":0},"i":{"x":0.53,"y":1},"s":[0],"t":26},{"o":{"x":0.24,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":40},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100],"t":125},{"s":[1],"t":132}]}},"ef":[],"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.218,2.125],[0.089,0.132],[3.745,0.198],[38.467,2.032],[2.43,-0.861],[0.274,-5.05],[0.35,-6.475],[0.701,-12.949],[0.702,-12.948],[0.701,-12.949],[0.41,-7.575],[-3.557,-2.328],[-2.14,-0.114],[-39.403,-2.082],[-2.33,1.899],[-0.183,3.396],[-2.935,54.486]],"o":[[-0.079,-0.137],[-2.103,-3.104],[-38.467,-2.031],[-2.574,-0.136],[-5.824,2.065],[-0.35,6.474],[-0.702,12.948],[-0.702,12.948],[-0.702,12.948],[-0.411,7.575],[-0.231,4.244],[1.792,1.173],[39.402,2.082],[3.003,0.158],[2.637,-2.149],[2.934,-54.486],[0.134,-2.476]],"v":[[73.269,-85.713],[73.017,-86.117],[62.874,-89.912],[-52.528,-96.007],[-60.185,-95.407],[-65.658,-81.951],[-66.71,-62.528],[-68.815,-23.683],[-70.92,15.162],[-73.025,54.007],[-74.256,76.731],[-70.772,88.365],[-64.588,89.8],[53.618,96.046],[62.261,94.369],[65.466,85.01],[74.269,-78.448]]}}},{"ty":"fl","nm":"Fill 1","c":{"a":0,"k":[0,0.169,0.169]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[143.607,124.993]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":7}],"v":"5.5.7","fr":60,"op":150,"ip":0,"assets":[]} \ No newline at end of file diff --git a/assets/animations/lottie/rrt_ambulance.json b/assets/animations/lottie/rrt_ambulance.json new file mode 100644 index 0000000..a15eee6 --- /dev/null +++ b/assets/animations/lottie/rrt_ambulance.json @@ -0,0 +1 @@ +{"nm":"Main Scene","ddd":0,"h":500,"w":500,"meta":{"g":"@lottiefiles/creator 1.47.1"},"layers":[{"ty":4,"nm":"Layer 12","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,298.786,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,293.786,0],"t":10},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,298.786,0],"t":20},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,293.786,0],"t":30},{"s":[450.232,298.786,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.518,-3.779],[3.781,-0.517],[0.518,3.779],[-3.781,0.517]],"o":[[0.518,3.779],[-3.781,0.517],[-0.518,-3.779],[3.781,-0.517]],"v":[[6.846,-0.937],[0.938,6.842],[-6.846,0.937],[-0.938,-6.842]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Layer 6","sr":1,"st":0,"op":180,"ip":0,"hd":true,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,395.682,0],"t":1},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,400.682,0],"t":11},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,395.682,0],"t":21},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,400.682,0],"t":31},{"s":[63.907,395.682,0],"t":41}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.518,-3.779],[3.781,-0.517],[0.518,3.779],[-3.781,0.517]],"o":[[0.518,3.779],[-3.781,0.517],[-0.518,-3.779],[3.781,-0.517]],"v":[[6.846,-0.937],[0.938,6.842],[-6.846,0.937],[-0.938,-6.842]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Layer 2","sr":1,"st":0,"op":180,"ip":0,"hd":true,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,424.922,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,420.922,0],"t":10},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,424.922,0],"t":20},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,420.922,0],"t":30},{"s":[121.127,424.922,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.746,-5.442],[5.445,-0.745],[0.746,5.442],[-5.445,0.745]],"o":[[0.746,5.442],[-5.445,0.745],[-0.746,-5.442],[5.445,-0.745]],"v":[[9.859,-1.349],[1.351,9.853],[-9.859,1.349],[-1.351,-9.853]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":3,"nm":"Null 3","sr":1,"st":0,"op":129,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[131.911,173.859,0],"ix":2},"r":{"a":0,"k":138,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":0,"ix":11}},"ind":4},{"ty":4,"nm":"Layer 11","sr":1,"st":43,"op":129,"ip":43,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":43},{"s":[-100,100,100],"t":48}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[54.892,46.827,0],"t":43},{"s":[44.23,56.705,0],"t":48}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5,"parent":4},{"ty":4,"nm":"Layer 10","sr":1,"st":31,"op":41,"ip":31,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":31},{"s":[-134,134,100],"t":41}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":31},{"s":[23.889,75.927,0],"t":41}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":36},{"s":[0],"t":41}],"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6,"parent":4},{"ty":4,"nm":"Layer 9","sr":1,"st":18,"op":28,"ip":18,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":18},{"s":[-134,134,100],"t":28}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":18},{"s":[23.889,75.927,0],"t":28}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":23},{"s":[0],"t":28}],"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":7,"parent":4},{"ty":4,"nm":"Layer 8","sr":1,"st":7,"op":17,"ip":7,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":7},{"s":[-134,134,100],"t":17}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":7},{"s":[23.889,75.927,0],"t":17}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":12},{"s":[0],"t":17}],"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":8,"parent":4},{"ty":4,"nm":"Layer 7","sr":1,"st":0,"op":5,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-100,100,100],"t":0},{"s":[-134,134,100],"t":5}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[44.23,56.705,0],"t":0},{"s":[23.889,75.927,0],"t":5}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":0},{"s":[0],"t":5}],"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":9,"parent":4},{"ty":4,"nm":"Layer 5","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[396.051,136.57,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":4},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":8},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":12},{"o":{"x":0.191,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":16},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":23},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":27},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":31},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":35},{"s":[100,100,100],"t":39}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[396.051,136.57,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-6.092,-10.552],[0,0],[12.184,0],[0,0],[-6.092,10.552],[0,0]],"o":[[0,0],[6.092,10.552],[0,0],[-12.185,0],[0,0],[6.092,-10.552]],"v":[[13.709,-53.595],[66.454,37.767],[52.746,61.509],[-52.746,61.509],[-66.454,37.767],[-13.706,-53.595]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,146.499],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[-13.769,0],[0,0],[-7.045,-11.709],[0,0]],"o":[[0,0],[7.01,-11.85],[0,0],[13.665,0],[0,0],[0,0]],"v":[[-64.065,49.563],[-17.385,-30.444],[16.14,-49.563],[16.14,-49.563],[49.516,-30.693],[64.065,-6.511]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"d":[{"nm":"dash","n":"d","v":{"a":0,"k":6,"ix":1}},{"nm":"gap","n":"g","v":{"a":0,"k":10,"ix":2}},{"nm":"gap2","n":"g","v":{"a":0,"k":10,"ix":4}},{"nm":"gap3","n":"g","v":{"a":0,"k":10,"ix":6}}],"c":{"a":0,"k":[0.6627,0.6863,0.7686],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[386.167,114.696],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.779,7.779],[-7.779,7.779],[-7.779,-7.779],[7.779,-7.779]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.391,184.828],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-10.361,-23.305],[-10.361,5.407],[-7.127,23.336],[-0.018,23.336],[-0.018,23.348],[7.103,23.34],[10.348,5.39],[10.361,-23.348]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,140.911],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tr","a":{"a":0,"k":[401.402,140.911],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,140.911],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-6.092,-10.552],[0,0],[12.184,0],[0,0],[-6.092,10.552],[0,0]],"o":[[0,0],[6.092,10.552],[0,0],[-12.185,0],[0,0],[6.092,-10.552]],"v":[[13.709,-53.595],[66.454,37.767],[52.746,61.509],[-52.746,61.509],[-66.454,37.767],[-13.706,-53.595]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,146.499],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":10},{"ty":4,"nm":"Layer 4","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[351.654,335.209,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[351.654,335.209,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-5.899],[5.899,0],[0,5.899],[-5.899,0]],"o":[[0,5.899],[-5.899,0],[0,-5.899],[5.899,0]],"v":[[10.682,0],[0,10.682],[-10.682,0],[0,-10.682]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.652,334.504],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.654,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.654,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":11},{"ty":4,"nm":"Layer 3","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[91.751,335.209,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.751,335.209,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-5.899],[5.899,0],[0,5.899],[-5.899,0]],"o":[[0,5.899],[-5.899,0],[0,-5.899],[5.899,0]],"v":[[10.682,0],[0,10.682],[-10.682,0],[0,-10.682]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.749,334.504],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.751,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.751,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":12},{"ty":0,"nm":"Nested Scene 2","sr":1,"st":0,"op":61,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[32.09649981558323,13.458049893379211]},"s":{"a":0,"k":[-166.7344,166.7344]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[271.5349,244.9784]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"w":500,"h":500,"refId":"precomp_Shape Layer - SVG_25397d66-42bd-4739-a446-0631d3585a8b","ind":13},{"ty":4,"nm":"Layer 1","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[221.146,268.245,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":5},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":10},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":15},{"o":{"x":0.324,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":20},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":25},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":30},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":35},{"s":[221.146,268.245,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[11.166,0],[4.286,-9.562],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-4.276,-9.562],[-11.156,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,-64.707],[59.545,64.707],[14.358,64.707],[-10.685,48.483],[-35.729,64.707],[-59.545,64.707],[-59.545,11.067],[-23.247,-12.056],[1.777,-64.707]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.433,259.275],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[44.92,72.136],[-119.713,72.136],[-119.713,-72.136],[119.713,-72.136],[119.713,72.136],[95.007,72.136]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0.02204895019528408],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.691,251.8690489501953],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[5.305,0],[0,0],[0,-5.305],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.305,0],[0,0],[0,0],[0,0],[0,-5.305]],"v":[[0,-10.37],[0,-10.37],[-9.605,-0.765],[-9.605,10.37],[9.605,10.37],[9.605,-0.765]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0.022049903869628906],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[131.871,184.22404990386963],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":true,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[30.878,-9.505],[9.504,-9.505],[9.504,-30.878],[-9.504,-30.878],[-9.504,-9.505],[-30.878,-9.505],[-30.878,9.504],[-9.504,9.504],[-9.504,30.878],[9.504,30.878],[9.504,9.504],[30.878,9.504]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0.022049903869628906],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[280.853,235.31804990386962],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 7","ix":5,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-31.952,16.61],[31.952,16.61],[31.952,-16.61],[-14.701,-16.61]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.6627,0.6863,0.7686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[111.137,230.612],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 8","ix":6,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.691],[0,0],[4.691,0],[0,0],[0,1.98],[1.554,3.425],[0,0]],"o":[[0,0],[0,4.691],[0,0],[0.396,-1.861],[0,-3.999],[0,0],[4.691,0]],"v":[[17.798,0],[17.798,0],[9.305,8.493],[-15.996,8.493],[-15.392,2.732],[-17.798,-8.493],[9.305,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[394.495,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 9","ix":7,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,1.98],[1.554,3.425]],"o":[[-1.554,3.425],[0,1.98],[0,0],[0.396,-1.861],[0,-3.999],[0,0]],"v":[[104.91,-8.493],[102.505,2.732],[103.108,8.493],[-103.109,8.493],[-102.505,2.732],[-104.91,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[221.701,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 10","ix":8,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,4.691],[0,0],[-4.691,0]],"o":[[-1.544,3.425],[0,1.98],[0,0],[-4.691,0],[0,0],[0,-4.691],[0,0]],"v":[[18.352,-8.493],[15.947,2.732],[16.55,8.493],[-9.859,8.493],[-18.352,0],[-18.352,0],[-9.859,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[48.352,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 11","ix":9,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.691],[0,0],[4.691,0],[0,0],[0,1.98],[1.554,3.425],[0,0]],"o":[[0,0],[0,4.691],[0,0],[0.396,-1.861],[0,-3.999],[0,0],[4.691,0]],"v":[[17.798,0],[17.798,0],[9.305,8.493],[-15.996,8.493],[-15.392,2.732],[-17.798,-8.493],[9.305,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[394.495,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 12","ix":10,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,1.98],[1.554,3.425]],"o":[[-1.554,3.425],[0,1.98],[0,0],[0.396,-1.861],[0,-3.999],[0,0]],"v":[[104.91,-8.493],[102.505,2.732],[103.108,8.493],[-103.109,8.493],[-102.505,2.732],[-104.91,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[221.701,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 13","ix":11,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,4.691],[0,0],[-4.691,0]],"o":[[-1.544,3.425],[0,1.98],[0,0],[-4.691,0],[0,0],[0,-4.691],[0,0]],"v":[[18.352,-8.493],[15.947,2.732],[16.55,8.493],[-9.859,8.493],[-18.352,0],[-18.352,0],[-9.859,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[48.352,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":1,"hd":false,"mn":"ADBE Vector Group","nm":"Group 14","ix":12,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[5.721,9.918],[-3.465,8.879]],"o":[[0,0],[0,0],[-11.453,0],[-4.89,-8.463],[0,0]],"v":[[42.236,-21.524],[42.236,21.524],[-10.514,21.524],[-37.943,5.687],[-40.081,-21.524]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[41.298,-0.235],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0,0.792156862745098,0.8117647058823529,0.8666666666666667,0.5,0.8627450980392157,0.8745098039215686,0.9058823529411765,1,0.9333333333333333,0.9411764705882353,0.9450980392156862],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[-43.173,-0.235],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[359.173,201.235],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 15","ix":13,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[119.713,9.09],[-119.713,9.09],[-119.713,-9.09],[119.713,-9.09]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.689,297.261],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 16","ix":14,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,9.09],[-59.545,9.09],[-59.545,-9.09],[59.545,-9.09]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.432,297.261],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 17","ix":15,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[11.166,0],[4.286,-9.562],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-4.276,-9.562],[-11.156,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,-64.707],[59.545,64.707],[14.358,64.707],[-10.685,48.483],[-35.729,64.707],[-59.545,64.707],[-59.545,11.067],[-23.247,-12.056],[1.777,-64.707]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.433,259.275],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 18","ix":16,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[44.92,72.136],[-119.713,72.136],[-119.713,-72.136],[119.713,-72.136],[119.713,72.136],[95.007,72.136]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.691,251.847],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":14},{"ty":0,"nm":"Pre-comp 1","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":true,"ao":0,"ks":{"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[250,250,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"masksProperties":[{"nm":"Mask 1","inv":false,"mode":"a","x":{"a":0,"k":0,"ix":4},"o":{"a":0,"k":100,"ix":3},"pt":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[27,346],[27,380],[458,380],[458,349]]},"ix":1}}],"w":500,"h":500,"refId":"comp_0_f77fbf55-eb10-4e38-b70c-2a5f270c971e","ind":15}],"v":"5.7.0","fr":30,"op":61,"ip":0,"assets":[{"nm":"Pre-comp 1","id":"comp_0_f77fbf55-eb10-4e38-b70c-2a5f270c971e","layers":[{"ty":4,"nm":"Layer 8","sr":1,"st":22,"op":75,"ip":22,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-197.04,362.657,0],"t":22},{"s":[241.96,362.657,0],"t":42}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Layer 7","sr":1,"st":20,"op":40,"ip":20,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[241.96,362.657,0],"t":20},{"s":[678.96,362.657,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Layer 6","sr":1,"st":2,"op":22,"ip":2,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-197.04,362.657,0],"t":2},{"s":[241.96,362.657,0],"t":22}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Layer 2","sr":1,"st":0,"op":20,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[241.96,362.657,0],"t":0},{"s":[678.96,362.657,0],"t":20}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4}]},{"nm":"Nested Scene 2","id":"precomp_Shape Layer - SVG_25397d66-42bd-4739-a446-0631d3585a8b","layers":[{"ty":4,"nm":"Shape Layer - SVG","sr":1,"st":0,"op":61,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","bm":0,"hd":false,"nm":"Group 1","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.3680000000000003,-0.696],[-0.6720000000000006,-1.1759999999999997],[0,-1.4400000000000004],[0.9600000000000009,-1.3440000000000012],[1.8960000000000008,-0.5039999999999996],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.943999999999999,0],[1.3679999999999986,0.6720000000000002],[0.6960000000000015,1.1520000000000001],[0,1.6559999999999988],[-0.9599999999999973,1.3200000000000003],[0,0],[0,0],[0,0]],"v":[[13.444,26],[7.9,16.208],[5.524,16.208],[5.524,26],[0.484,26],[0.484,0.872],[9.916,0.872],[14.884,1.916],[17.944,4.688],[18.988,8.576],[17.548,13.076],[13.264,15.812],[19.276,26],[13.444,26]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.6719999999999988,0.6479999999999997],[0,1.1760000000000002],[0.6720000000000006,0.6240000000000006],[1.3679999999999986,0],[0,0],[0,0]],"o":[[0,0],[1.3679999999999986,0],[0.6720000000000006,-0.6719999999999988],[0,-1.1519999999999992],[-0.6719999999999988,-0.6479999999999997],[0,0],[0,0],[0,0]],"v":[[5.524,12.428],[9.736,12.428],[12.796,11.456],[13.804,8.684],[12.796,6.02],[9.736,5.048],[5.524,5.048],[5.524,12.428]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.368000000000002,-0.696],[-0.6720000000000041,-1.1759999999999997],[0,-1.4400000000000004],[0.9600000000000009,-1.3440000000000012],[1.8959999999999937,-0.5039999999999996],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.9440000000000026,0],[1.368000000000002,0.6720000000000002],[0.695999999999998,1.1520000000000001],[0,1.6559999999999988],[-0.9600000000000009,1.3200000000000003],[0,0],[0,0],[0,0]],"v":[[36.5065,26],[30.9625,16.208],[28.5865,16.208],[28.5865,26],[23.5465,26],[23.5465,0.872],[32.9785,0.872],[37.9465,1.916],[41.0065,4.688],[42.0505,8.576],[40.6105,13.076],[36.3265,15.812],[42.3385,26],[36.5065,26]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 4","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.671999999999997,0.6479999999999997],[0,1.1760000000000002],[0.6720000000000041,0.6240000000000006],[1.368000000000002,0],[0,0],[0,0]],"o":[[0,0],[1.368000000000002,0],[0.6720000000000041,-0.6719999999999988],[0,-1.1519999999999992],[-0.671999999999997,-0.6479999999999997],[0,0],[0,0],[0,0]],"v":[[28.5865,12.428],[32.7985,12.428],[35.8585,11.456],[36.8665,8.684],[35.8585,6.02],[32.7985,5.048],[28.5865,5.048],[28.5865,12.428]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 5","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[63.709,0.872],[63.709,4.94],[57.013,4.94],[57.013,26],[51.973,26],[51.973,4.94],[45.277,4.94],[45.277,0.872],[63.709,0.872]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1804,0.1882,0.2235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":1}]}]} \ No newline at end of file diff --git a/assets/animations/lottie/splash_launching.json b/assets/animations/lottie/splash_launching.json new file mode 100644 index 0000000..9510a6c --- /dev/null +++ b/assets/animations/lottie/splash_launching.json @@ -0,0 +1 @@ +{"nm":"Splash Launch 1","ddd":0,"h":927,"w":430,"meta":{"g":"LottieFiles Figma v92"},"layers":[{"ty":4,"nm":"Ellipse 54","sr":1,"st":0,"op":121.06,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":1,"k":[{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[19.5,19.5],"t":0},{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[19.5,19.5],"t":60},{"s":[628.5,628.5],"t":120}]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[216,464],"t":0},{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[216.5,464.5],"t":60},{"s":[225.5,473.5],"t":120}]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[0],"t":0},{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[0],"t":60},{"s":[100],"t":120}]}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":1,"k":[{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[10.493846153846153,0],[0,10.493846153846153],[-10.493846153846153,0],[0,-10.493846153846153]],"o":[[0,10.493846153846153],[-10.493846153846153,0],[0,-10.493846153846153],[10.493846153846153,0],[0,0]],"v":[[38,19],[19,38],[0,19],[19,0],[38,19]]}],"t":0},{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[{"c":true,"i":[[0,0],[10.493846153846153,0],[0,10.493846153846153],[-10.493846153846153,0],[0,-10.493846153846153]],"o":[[0,10.493846153846153],[-10.493846153846153,0],[0,-10.493846153846153],[10.493846153846153,0],[0,0]],"v":[[38,19],[19,38],[0,19],[19,0],[38,19]]}],"t":60},{"s":[{"c":true,"i":[[0,0],[341.5871678599841,0],[0,341.5871678599841],[-341.5871678599841,0],[0,-341.5871678599841]],"o":[[0,341.5871678599841],[-341.5871678599841,0],[0,-341.5871678599841],[341.5871678599841,0],[0,0]],"v":[[1237,618.5],[618.5,1237],[0,618.5],[618.5,0],[1237,618.5]]}],"t":120}]}},{"ty":"st","bm":0,"hd":false,"nm":"","lc":1,"lj":1,"ml":4,"o":{"a":1,"k":[{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[20],"t":0},{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[20],"t":60},{"s":[100],"t":120}]},"w":{"a":1,"k":[{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[1],"t":0},{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[1],"t":60},{"s":[20],"t":120}]},"c":{"a":0,"k":[0.9295,0.1098,0.1687]}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}}],"ind":1},{"ty":4,"nm":"Group 8232","sr":1,"st":0,"op":121.06,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[155,404]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0,"y":0},"i":{"x":1,"y":1},"s":[0],"t":0},{"o":{"x":0,"y":0},"i":{"x":1,"y":1},"s":[0],"t":60.06},{"s":[100],"t":120}]}},"shapes":[],"ind":2},{"ty":4,"nm":"Rectangle 17364","sr":1,"st":0,"op":121.06,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[200,326.5]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[-207.54,1178.76],"t":0},{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[565.46,-310.24],"t":60},{"s":[565.46,-310.24],"t":120.12}]},"r":{"a":0,"k":30},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[100],"t":0},{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[100],"t":60},{"s":[0],"t":120.12}]}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-110.38],[0,0],[110.38,0],[0,0],[0,110.38],[0,0],[-110.38,0],[0,0]],"o":[[0,0],[0,110.38],[0,0],[-110.38,0],[0,0],[0,-110.38],[0,0],[110.38,0]],"v":[[400,200],[400,453],[200,653],[200,653],[0,453],[0,200],[200,0],[200,0]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":0,"k":[0.9295,0.1098,0.1687]},"r":1,"o":{"a":0,"k":100}}],"ind":3},{"ty":4,"nm":"Symptoms Checker Bg","sr":1,"st":0,"op":121.06,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[215,463.5]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[215,463.5]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"sh","bm":0,"hd":false,"nm":"","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[430,0],[430,927],[0,927],[0,0]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"","c":{"a":1,"k":[{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":0},{"o":{"x":0.82,"y":-0.01},"i":{"x":0.58,"y":1},"s":[1,1,1],"t":60},{"s":[0.9295,0.1098,0.1687],"t":120}]},"r":1,"o":{"a":0,"k":100}}],"ind":4}],"v":"5.7.0","fr":60,"op":120.06,"ip":0,"assets":[]} \ No newline at end of file diff --git a/assets/animations/lottie/warningAnimation.json b/assets/animations/lottie/warningAnimation.json new file mode 100644 index 0000000..43dace1 --- /dev/null +++ b/assets/animations/lottie/warningAnimation.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.1.1","a":"Bilal Arief","k":"warning, pending, icon, animation, web, mobile, app, yellow, simple, indicator, caution, alertness, attention, notice, cautionary, warning icon, pending icon.","d":"Conveying caution and alertness, this simple yet eye-catching yellow animation icon is the perfect addition to any web or mobile application as a warning or pending indicator.","tc":"Yellow"},"fr":60,"ip":0,"op":104,"w":1080,"h":1080,"nm":"Warning","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"White-CircleExclamationMark","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.964],"y":[0]},"t":53,"s":[3]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":60,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.759],"y":[0]},"t":65,"s":[-3]},{"t":67,"s":[0]}],"ix":10},"p":{"a":0,"k":[540.306,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.779,0.779,0.333],"y":[0,0,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.216,0.216,0.667],"y":[1,1,1]},"o":{"x":[0.597,0.597,0.333],"y":[0,0,0]},"t":56,"s":[115,115,100]},{"t":67,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[50,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,175],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.19],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[100]},{"t":77,"s":[0]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gr","it":[{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.19],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[100]},{"t":77,"s":[0]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":1,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":666,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"White-BodyExclamationMark","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.964],"y":[0]},"t":53,"s":[3]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":60,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.759],"y":[0]},"t":65,"s":[-3]},{"t":67,"s":[0]}],"ix":10},"p":{"a":0,"k":[539.694,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.779,0.779,0.333],"y":[0,0,0]},"t":47,"s":[87,87,100]},{"i":{"x":[0.216,0.216,0.667],"y":[1,1,1]},"o":{"x":[0.597,0.597,0.333],"y":[0,0,0]},"t":56,"s":[115,115,100]},{"t":67,"s":[87,87,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[51.5,-203.25],[-49.5,-203.25],[1,129.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":55,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[70.455,95.556],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.19],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[0]},{"t":77,"s":[100]}],"ix":1},"e":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gr","it":[{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":1,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.19],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[0]},{"t":77,"s":[100]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":1,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":666,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"LightYellow-CircleExclamationMark","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540.306,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[50,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.803921568627,0.301960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,175],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.19],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[0]},{"t":67,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.221],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[0]},{"t":31,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":666,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"DarkYellow-CircleExclamationMark","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540.306,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[50,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.929411764706,0.666666666667,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,175],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.19],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[0]},{"t":74,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.221],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[0]},{"t":38,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":666,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"LightYellow-BodyExclamationMark","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[539.694,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[87,87,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[51.5,-203.25],[-49.5,-203.25],[1,129.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.803921568627,0.301960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":55,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[70.455,95.556],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.19],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[0]},{"t":67,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.221],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[0]},{"t":31,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":666,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"DarkYellow-BodyExclamationMark","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[539.694,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[87,87,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[51.5,-203.25],[-49.5,-203.25],[1,129.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.929411764706,0.666666666667,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":55,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[70.455,95.556],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.19],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[0]},{"t":74,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.221],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[0]},{"t":38,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":666,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"DarkYellow-CircleStroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[539.013,535.349,0],"ix":2},"a":{"a":0,"k":[27.013,127.349,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[784,784],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.057],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17,"s":[100]},{"t":47,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.329],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17,"s":[100]},{"t":75,"s":[0]}],"ix":2},"o":{"a":0,"k":9000,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.929411764706,0.666989614449,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":35,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[28,132],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":666,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"LightYellow-CircleStroke","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[539.013,535.349,0],"ix":2},"a":{"a":0,"k":[27.013,127.349,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[784,784],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.057],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"t":41,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.329],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"t":71,"s":[0]}],"ix":2},"o":{"a":0,"k":9000,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.802906589882,0.301960754395,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":35,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[28,132],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":666,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Yellow-Circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":28,"s":[25]},{"t":39,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[544.794,562.601,0],"ix":2},"a":{"a":0,"k":[32.429,152.879,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.354,0.354,0.667],"y":[1.438,1.438,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":13,"s":[0,0,100]},{"t":37,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[784,784],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.717647058824,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28,132],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":666,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/fonts/gess_two/GE_SS_Two_Bold.otf b/assets/fonts/gess_two/GE_SS_Two_Bold.otf new file mode 100755 index 0000000..da99274 Binary files /dev/null and b/assets/fonts/gess_two/GE_SS_Two_Bold.otf differ diff --git a/assets/fonts/gess_two/GE_SS_Two_Light.otf b/assets/fonts/gess_two/GE_SS_Two_Light.otf new file mode 100755 index 0000000..60ea874 Binary files /dev/null and b/assets/fonts/gess_two/GE_SS_Two_Light.otf differ diff --git a/assets/fonts/gess_two/GE_SS_Two_Medium.otf b/assets/fonts/gess_two/GE_SS_Two_Medium.otf new file mode 100755 index 0000000..ff4a1bf Binary files /dev/null and b/assets/fonts/gess_two/GE_SS_Two_Medium.otf differ diff --git a/assets/fonts/poppins/Poppins-Black.ttf b/assets/fonts/poppins/Poppins-Black.ttf new file mode 100644 index 0000000..a9520b7 Binary files /dev/null and b/assets/fonts/poppins/Poppins-Black.ttf differ diff --git a/assets/fonts/poppins/Poppins-Bold.ttf b/assets/fonts/poppins/Poppins-Bold.ttf new file mode 100644 index 0000000..b94d47f Binary files /dev/null and b/assets/fonts/poppins/Poppins-Bold.ttf differ diff --git a/assets/fonts/poppins/Poppins-ExtraBold.ttf b/assets/fonts/poppins/Poppins-ExtraBold.ttf new file mode 100644 index 0000000..8f008c3 Binary files /dev/null and b/assets/fonts/poppins/Poppins-ExtraBold.ttf differ diff --git a/assets/fonts/poppins/Poppins-ExtraLight.ttf b/assets/fonts/poppins/Poppins-ExtraLight.ttf new file mode 100644 index 0000000..ee62382 Binary files /dev/null and b/assets/fonts/poppins/Poppins-ExtraLight.ttf differ diff --git a/assets/fonts/poppins/Poppins-Light.ttf b/assets/fonts/poppins/Poppins-Light.ttf new file mode 100644 index 0000000..2ab0221 Binary files /dev/null and b/assets/fonts/poppins/Poppins-Light.ttf differ diff --git a/assets/fonts/poppins/Poppins-Medium.ttf b/assets/fonts/poppins/Poppins-Medium.ttf new file mode 100644 index 0000000..e90e87e Binary files /dev/null and b/assets/fonts/poppins/Poppins-Medium.ttf differ diff --git a/assets/fonts/poppins/Poppins-Regular.ttf b/assets/fonts/poppins/Poppins-Regular.ttf new file mode 100644 index 0000000..be06e7f Binary files /dev/null and b/assets/fonts/poppins/Poppins-Regular.ttf differ diff --git a/assets/fonts/poppins/Poppins-SemiBold.ttf b/assets/fonts/poppins/Poppins-SemiBold.ttf new file mode 100644 index 0000000..dabf7c2 Binary files /dev/null and b/assets/fonts/poppins/Poppins-SemiBold.ttf differ diff --git a/assets/fonts/poppins/Poppins-Thin.ttf b/assets/fonts/poppins/Poppins-Thin.ttf new file mode 100644 index 0000000..f5c0fdd Binary files /dev/null and b/assets/fonts/poppins/Poppins-Thin.ttf differ diff --git a/assets/images/new/Boo_ Appointment.svg b/assets/images/new/Boo_ Appointment.svg deleted file mode 100644 index c25652c..0000000 --- a/assets/images/new/Boo_ Appointment.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/CS/Family_Files.svg b/assets/images/new/CS/Family_Files.svg deleted file mode 100644 index ce47d95..0000000 --- a/assets/images/new/CS/Family_Files.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/CS/Help.svg b/assets/images/new/CS/Help.svg deleted file mode 100644 index 31d49e7..0000000 --- a/assets/images/new/CS/Help.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/CS/My_File.svg b/assets/images/new/CS/My_File.svg deleted file mode 100644 index fc5c009..0000000 --- a/assets/images/new/CS/My_File.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/CS/Todo.svg b/assets/images/new/CS/Todo.svg deleted file mode 100644 index 98232af..0000000 --- a/assets/images/new/CS/Todo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/CS/emergency_request_CS.svg b/assets/images/new/CS/emergency_request_CS.svg deleted file mode 100644 index 1796a80..0000000 --- a/assets/images/new/CS/emergency_request_CS.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/CS/home_health_care_CS.svg b/assets/images/new/CS/home_health_care_CS.svg deleted file mode 100644 index 8cf044b..0000000 --- a/assets/images/new/CS/home_health_care_CS.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/assets/images/new/CS/livecare_CS.svg b/assets/images/new/CS/livecare_CS.svg deleted file mode 100644 index 8af91e8..0000000 --- a/assets/images/new/CS/livecare_CS.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/new/CS/loader.gif b/assets/images/new/CS/loader.gif deleted file mode 100644 index 3e34372..0000000 Binary files a/assets/images/new/CS/loader.gif and /dev/null differ diff --git a/assets/images/new/CS/pharmacy_CS.svg b/assets/images/new/CS/pharmacy_CS.svg deleted file mode 100644 index a3ad2b0..0000000 --- a/assets/images/new/CS/pharmacy_CS.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/assets/images/new/Comprehensive checkup.svg b/assets/images/new/Comprehensive checkup.svg deleted file mode 100644 index b3f2feb..0000000 --- a/assets/images/new/Comprehensive checkup.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/CoronaIcon.svg b/assets/images/new/CoronaIcon.svg deleted file mode 100644 index c02f907..0000000 --- a/assets/images/new/CoronaIcon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/new/DriveThru.svg b/assets/images/new/DriveThru.svg deleted file mode 100644 index faa727b..0000000 --- a/assets/images/new/DriveThru.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/new/E_Referral.svg b/assets/images/new/E_Referral.svg deleted file mode 100644 index fb6b859..0000000 --- a/assets/images/new/E_Referral.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/HHC.svg b/assets/images/new/HHC.svg deleted file mode 100644 index 692623c..0000000 --- a/assets/images/new/HHC.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/InPatient.svg b/assets/images/new/InPatient.svg deleted file mode 100644 index d865a66..0000000 --- a/assets/images/new/InPatient.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/assets/images/new/Indoor_nav_appo.svg b/assets/images/new/Indoor_nav_appo.svg deleted file mode 100644 index 81bf654..0000000 --- a/assets/images/new/Indoor_nav_appo.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/Live Care.svg b/assets/images/new/Live Care.svg deleted file mode 100644 index b5a367d..0000000 --- a/assets/images/new/Live Care.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/images/new/Live_Care.svg b/assets/images/new/Live_Care.svg deleted file mode 100644 index b5a367d..0000000 --- a/assets/images/new/Live_Care.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/images/new/NFCCheckIn_QR_gps_HMG.png b/assets/images/new/NFCCheckIn_QR_gps_HMG.png deleted file mode 100644 index 20fc0ef..0000000 Binary files a/assets/images/new/NFCCheckIn_QR_gps_HMG.png and /dev/null differ diff --git a/assets/images/new/NFC_Hold.svg b/assets/images/new/NFC_Hold.svg deleted file mode 100644 index fbfa19e..0000000 --- a/assets/images/new/NFC_Hold.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/Pharmacy.svg b/assets/images/new/Pharmacy.svg deleted file mode 100644 index bdb101e..0000000 --- a/assets/images/new/Pharmacy.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/WalkIn.svg b/assets/images/new/WalkIn.svg deleted file mode 100644 index c60829c..0000000 --- a/assets/images/new/WalkIn.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/new/add-to-cart.svg b/assets/images/new/add-to-cart.svg deleted file mode 100644 index f01f603..0000000 --- a/assets/images/new/add-to-cart.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/add_to_cart.svg b/assets/images/new/add_to_cart.svg deleted file mode 100644 index f01f603..0000000 --- a/assets/images/new/add_to_cart.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/admission_notice.png b/assets/images/new/admission_notice.png deleted file mode 100644 index 50b5c1d..0000000 Binary files a/assets/images/new/admission_notice.png and /dev/null differ diff --git a/assets/images/new/ancillary.svg b/assets/images/new/ancillary.svg deleted file mode 100644 index bde8d0e..0000000 --- a/assets/images/new/ancillary.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/app_setting.svg b/assets/images/new/app_setting.svg deleted file mode 100644 index d97a11a..0000000 --- a/assets/images/new/app_setting.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/appointment-rating/1.svg b/assets/images/new/appointment-rating/1.svg deleted file mode 100644 index 8c73276..0000000 --- a/assets/images/new/appointment-rating/1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/appointment-rating/2.svg b/assets/images/new/appointment-rating/2.svg deleted file mode 100644 index 60ae290..0000000 --- a/assets/images/new/appointment-rating/2.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/appointment-rating/3.svg b/assets/images/new/appointment-rating/3.svg deleted file mode 100644 index 324918d..0000000 --- a/assets/images/new/appointment-rating/3.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/appointment-rating/4.svg b/assets/images/new/appointment-rating/4.svg deleted file mode 100644 index a983815..0000000 --- a/assets/images/new/appointment-rating/4.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/appointment-rating/5.svg b/assets/images/new/appointment-rating/5.svg deleted file mode 100644 index 4600b41..0000000 --- a/assets/images/new/appointment-rating/5.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/birth.png b/assets/images/new/birth.png deleted file mode 100644 index 39bd3f8..0000000 Binary files a/assets/images/new/birth.png and /dev/null differ diff --git a/assets/images/new/blood donation.svg b/assets/images/new/blood donation.svg deleted file mode 100644 index 95d0904..0000000 --- a/assets/images/new/blood donation.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/blood.svg b/assets/images/new/blood.svg deleted file mode 100644 index 7b1f2d0..0000000 --- a/assets/images/new/blood.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/images/new/blood_pressure.svg b/assets/images/new/blood_pressure.svg deleted file mode 100644 index 22cf1a2..0000000 --- a/assets/images/new/blood_pressure.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/book appointment.svg b/assets/images/new/book appointment.svg deleted file mode 100644 index 590ea8d..0000000 --- a/assets/images/new/book appointment.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/booth_image.png b/assets/images/new/booth_image.png deleted file mode 100644 index 0a3427e..0000000 Binary files a/assets/images/new/booth_image.png and /dev/null differ diff --git a/assets/images/new/bottom_nav/family_files.svg b/assets/images/new/bottom_nav/family_files.svg deleted file mode 100644 index ce47d95..0000000 --- a/assets/images/new/bottom_nav/family_files.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/bottom_nav/help.svg b/assets/images/new/bottom_nav/help.svg deleted file mode 100644 index 31d49e7..0000000 --- a/assets/images/new/bottom_nav/help.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/bottom_nav/home.svg b/assets/images/new/bottom_nav/home.svg deleted file mode 100644 index b363bbc..0000000 --- a/assets/images/new/bottom_nav/home.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/bottom_nav/my_file.svg b/assets/images/new/bottom_nav/my_file.svg deleted file mode 100644 index fc5c009..0000000 --- a/assets/images/new/bottom_nav/my_file.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/bottom_nav/todo.svg b/assets/images/new/bottom_nav/todo.svg deleted file mode 100644 index 98232af..0000000 --- a/assets/images/new/bottom_nav/todo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/car_icon.svg b/assets/images/new/car_icon.svg deleted file mode 100644 index f6062e6..0000000 --- a/assets/images/new/car_icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/cart.svg b/assets/images/new/cart.svg deleted file mode 100644 index 334b86b..0000000 --- a/assets/images/new/cart.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/cart_old.svg b/assets/images/new/cart_old.svg deleted file mode 100644 index 334b86b..0000000 --- a/assets/images/new/cart_old.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/child vaccines.svg b/assets/images/new/child vaccines.svg deleted file mode 100644 index d3f38a5..0000000 --- a/assets/images/new/child vaccines.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/cloudy.svg b/assets/images/new/cloudy.svg deleted file mode 100644 index 88ccdf8..0000000 --- a/assets/images/new/cloudy.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/images/new/comprehensive_checkup.svg b/assets/images/new/comprehensive_checkup.svg deleted file mode 100644 index b3f2feb..0000000 --- a/assets/images/new/comprehensive_checkup.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/consent.jpg b/assets/images/new/consent.jpg deleted file mode 100644 index 0d0e7df..0000000 Binary files a/assets/images/new/consent.jpg and /dev/null differ diff --git a/assets/images/new/copy.svg b/assets/images/new/copy.svg deleted file mode 100644 index c34c96d..0000000 --- a/assets/images/new/copy.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/assets/images/new/covid drive thru.svg b/assets/images/new/covid drive thru.svg deleted file mode 100644 index 563de15..0000000 --- a/assets/images/new/covid drive thru.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/covid_test_drive_thru.svg b/assets/images/new/covid_test_drive_thru.svg deleted file mode 100644 index 563de15..0000000 --- a/assets/images/new/covid_test_drive_thru.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/direction.svg b/assets/images/new/direction.svg deleted file mode 100644 index 05d10bc..0000000 --- a/assets/images/new/direction.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/drive-thru.svg b/assets/images/new/drive-thru.svg deleted file mode 100644 index 3bbb836..0000000 --- a/assets/images/new/drive-thru.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/ear.svg b/assets/images/new/ear.svg deleted file mode 100644 index c514602..0000000 --- a/assets/images/new/ear.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/email.svg b/assets/images/new/email.svg deleted file mode 100644 index 642db68..0000000 --- a/assets/images/new/email.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/emergency.svg b/assets/images/new/emergency.svg deleted file mode 100644 index a1a0178..0000000 --- a/assets/images/new/emergency.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/emergency_services.svg b/assets/images/new/emergency_services.svg deleted file mode 100644 index ab63f29..0000000 --- a/assets/images/new/emergency_services.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/emergency_services_back.svg b/assets/images/new/emergency_services_back.svg deleted file mode 100644 index 13d9f2d..0000000 --- a/assets/images/new/emergency_services_back.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/empty.svg b/assets/images/new/empty.svg deleted file mode 100644 index 6a0ddab..0000000 --- a/assets/images/new/empty.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/new/family_files.svg b/assets/images/new/family_files.svg deleted file mode 100644 index ce3c5c8..0000000 --- a/assets/images/new/family_files.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/h2o.svg b/assets/images/new/h2o.svg deleted file mode 100644 index cab6a70..0000000 --- a/assets/images/new/h2o.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/head.svg b/assets/images/new/head.svg deleted file mode 100644 index 50da3a8..0000000 --- a/assets/images/new/head.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/health calculator.svg b/assets/images/new/health calculator.svg deleted file mode 100644 index ac73e86..0000000 --- a/assets/images/new/health calculator.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/assets/images/new/health converter.svg b/assets/images/new/health converter.svg deleted file mode 100644 index 961adc5..0000000 --- a/assets/images/new/health converter.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/assets/images/new/heart_rate.svg b/assets/images/new/heart_rate.svg deleted file mode 100644 index fe476c3..0000000 --- a/assets/images/new/heart_rate.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/height.svg b/assets/images/new/height.svg deleted file mode 100644 index 6ee1bef..0000000 --- a/assets/images/new/height.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/hmg_icon.svg b/assets/images/new/hmg_icon.svg deleted file mode 100644 index e09967e..0000000 --- a/assets/images/new/hmg_icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/hospital-visit.svg b/assets/images/new/hospital-visit.svg deleted file mode 100644 index df4d481..0000000 --- a/assets/images/new/hospital-visit.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/hospital.png b/assets/images/new/hospital.png deleted file mode 100644 index 10c6a1f..0000000 Binary files a/assets/images/new/hospital.png and /dev/null differ diff --git a/assets/images/new/hourglass.svg b/assets/images/new/hourglass.svg deleted file mode 100644 index 564ff28..0000000 --- a/assets/images/new/hourglass.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/ic_zoom.svg b/assets/images/new/ic_zoom.svg deleted file mode 100644 index f7449ee..0000000 --- a/assets/images/new/ic_zoom.svg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/icon.png b/assets/images/new/icon.png deleted file mode 100644 index e802ae3..0000000 Binary files a/assets/images/new/icon.png and /dev/null differ diff --git a/assets/images/new/indoor_nav_home.svg b/assets/images/new/indoor_nav_home.svg deleted file mode 100644 index bfe32ee..0000000 --- a/assets/images/new/indoor_nav_home.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/images/new/inpatient/admission.svg b/assets/images/new/inpatient/admission.svg deleted file mode 100644 index 3c94692..0000000 --- a/assets/images/new/inpatient/admission.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/inpatient/admission_notice.svg b/assets/images/new/inpatient/admission_notice.svg deleted file mode 100644 index befcf08..0000000 --- a/assets/images/new/inpatient/admission_notice.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/assets/images/new/inpatient/advance_payment.svg b/assets/images/new/inpatient/advance_payment.svg deleted file mode 100644 index fe41e6e..0000000 --- a/assets/images/new/inpatient/advance_payment.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/new/inpatient/birth_notification.svg b/assets/images/new/inpatient/birth_notification.svg deleted file mode 100644 index 7e0c720..0000000 --- a/assets/images/new/inpatient/birth_notification.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/images/new/inpatient/general_instructions.svg b/assets/images/new/inpatient/general_instructions.svg deleted file mode 100644 index 9f42040..0000000 --- a/assets/images/new/inpatient/general_instructions.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/inpatient/help_pro.svg b/assets/images/new/inpatient/help_pro.svg deleted file mode 100644 index 90b7f30..0000000 --- a/assets/images/new/inpatient/help_pro.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/inpatient/meal_plan.svg b/assets/images/new/inpatient/meal_plan.svg deleted file mode 100644 index e5fd1e5..0000000 --- a/assets/images/new/inpatient/meal_plan.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/assets/images/new/inpatient/medical_instructions.svg b/assets/images/new/inpatient/medical_instructions.svg deleted file mode 100644 index dc060b3..0000000 --- a/assets/images/new/inpatient/medical_instructions.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/inpatient/receive_prescription.svg b/assets/images/new/inpatient/receive_prescription.svg deleted file mode 100644 index 21cadf7..0000000 --- a/assets/images/new/inpatient/receive_prescription.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/instructions.jpg b/assets/images/new/instructions.jpg deleted file mode 100644 index 0b6025f..0000000 Binary files a/assets/images/new/instructions.jpg and /dev/null differ diff --git a/assets/images/new/latest news.svg b/assets/images/new/latest news.svg deleted file mode 100644 index 5b9cd80..0000000 --- a/assets/images/new/latest news.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/logo.png b/assets/images/new/logo.png deleted file mode 100644 index 29719b3..0000000 Binary files a/assets/images/new/logo.png and /dev/null differ diff --git a/assets/images/new/logo.svg b/assets/images/new/logo.svg deleted file mode 100644 index e777d9e..0000000 --- a/assets/images/new/logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/logout.svg b/assets/images/new/logout.svg deleted file mode 100644 index b767fbf..0000000 --- a/assets/images/new/logout.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/mass/health_BMI.svg b/assets/images/new/mass/health_BMI.svg deleted file mode 100644 index 081110d..0000000 --- a/assets/images/new/mass/health_BMI.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/meal_plan.png b/assets/images/new/meal_plan.png deleted file mode 100644 index 4368a1d..0000000 Binary files a/assets/images/new/meal_plan.png and /dev/null differ diff --git a/assets/images/new/medical file.svg b/assets/images/new/medical file.svg deleted file mode 100644 index 0849b7a..0000000 --- a/assets/images/new/medical file.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/medical_file.svg b/assets/images/new/medical_file.svg deleted file mode 100644 index 7130396..0000000 --- a/assets/images/new/medical_file.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/medical_instructions.png b/assets/images/new/medical_instructions.png deleted file mode 100644 index a6d0e0e..0000000 Binary files a/assets/images/new/medical_instructions.png and /dev/null differ diff --git a/assets/images/new/medical_instructions.svg b/assets/images/new/medical_instructions.svg deleted file mode 100644 index dc060b3..0000000 --- a/assets/images/new/medical_instructions.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/menu.svg b/assets/images/new/menu.svg deleted file mode 100644 index 05654cd..0000000 --- a/assets/images/new/menu.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/my family.svg b/assets/images/new/my family.svg deleted file mode 100644 index 41d0b8a..0000000 --- a/assets/images/new/my family.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/national_id.svg b/assets/images/new/national_id.svg deleted file mode 100644 index a76fd98..0000000 --- a/assets/images/new/national_id.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/notifications.svg b/assets/images/new/notifications.svg deleted file mode 100644 index 5866a81..0000000 --- a/assets/images/new/notifications.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/parking details.svg b/assets/images/new/parking details.svg deleted file mode 100644 index dc25eb0..0000000 --- a/assets/images/new/parking details.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/passport.svg b/assets/images/new/passport.svg deleted file mode 100644 index 883287f..0000000 --- a/assets/images/new/passport.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/assets/images/new/payment.svg b/assets/images/new/payment.svg deleted file mode 100644 index c49fee3..0000000 --- a/assets/images/new/payment.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/payment/Apple_Pay.svg b/assets/images/new/payment/Apple_Pay.svg deleted file mode 100755 index 0c6ecaf..0000000 --- a/assets/images/new/payment/Apple_Pay.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/payment/installments.png b/assets/images/new/payment/installments.png deleted file mode 100644 index b2b231b..0000000 Binary files a/assets/images/new/payment/installments.png and /dev/null differ diff --git a/assets/images/new/payment/instalmt.svg b/assets/images/new/payment/instalmt.svg deleted file mode 100644 index 76fe7a0..0000000 --- a/assets/images/new/payment/instalmt.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/images/new/payment/tamara_ar.png b/assets/images/new/payment/tamara_ar.png deleted file mode 100644 index f1587ad..0000000 Binary files a/assets/images/new/payment/tamara_ar.png and /dev/null differ diff --git a/assets/images/new/paymentMethods.png b/assets/images/new/paymentMethods.png deleted file mode 100644 index a2836f1..0000000 Binary files a/assets/images/new/paymentMethods.png and /dev/null differ diff --git a/assets/images/new/pendingPayment.svg b/assets/images/new/pendingPayment.svg deleted file mode 100644 index 79f29f0..0000000 --- a/assets/images/new/pendingPayment.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/pharma.svg b/assets/images/new/pharma.svg deleted file mode 100644 index c3071ac..0000000 --- a/assets/images/new/pharma.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/assets/images/new/pharmaicon.svg b/assets/images/new/pharmaicon.svg deleted file mode 100644 index af0f0e2..0000000 --- a/assets/images/new/pharmaicon.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/assets/images/new/qr_code.svg b/assets/images/new/qr_code.svg deleted file mode 100644 index a8674f0..0000000 --- a/assets/images/new/qr_code.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/reach us.svg b/assets/images/new/reach us.svg deleted file mode 100644 index b463417..0000000 --- a/assets/images/new/reach us.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/reach_us.svg b/assets/images/new/reach_us.svg deleted file mode 100644 index b463417..0000000 --- a/assets/images/new/reach_us.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/red-star.svg b/assets/images/new/red-star.svg deleted file mode 100644 index 12631b0..0000000 --- a/assets/images/new/red-star.svg +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - - - - - image/svg+xml - - - - - Openclipart - - - red star - 2010-12-31T17:15:10 - - https://openclipart.org/detail/102793/red-star-by-worker - - - worker - - - - - red - revolution - socialism - star - - - - - - - - - - - diff --git a/assets/images/new/referral.svg b/assets/images/new/referral.svg deleted file mode 100644 index fb6b859..0000000 --- a/assets/images/new/referral.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/respiration_rate.svg b/assets/images/new/respiration_rate.svg deleted file mode 100644 index f544f54..0000000 --- a/assets/images/new/respiration_rate.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/active_medication.svg b/assets/images/new/services/active_medication.svg deleted file mode 100644 index aa6eeae..0000000 --- a/assets/images/new/services/active_medication.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/services/add_reminder.svg b/assets/images/new/services/add_reminder.svg deleted file mode 100644 index 5866a81..0000000 --- a/assets/images/new/services/add_reminder.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/services/allergies_diagnosed.svg b/assets/images/new/services/allergies_diagnosed.svg deleted file mode 100644 index 258658c..0000000 --- a/assets/images/new/services/allergies_diagnosed.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/ancillary.svg b/assets/images/new/services/ancillary.svg deleted file mode 100644 index bde8d0e..0000000 --- a/assets/images/new/services/ancillary.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/services/appointment_list.svg b/assets/images/new/services/appointment_list.svg deleted file mode 100644 index 40f61de..0000000 --- a/assets/images/new/services/appointment_list.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/services/ask_doctor.svg b/assets/images/new/services/ask_doctor.svg deleted file mode 100644 index 90b7f30..0000000 --- a/assets/images/new/services/ask_doctor.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/services/audio_call.svg b/assets/images/new/services/audio_call.svg deleted file mode 100644 index ff22a10..0000000 --- a/assets/images/new/services/audio_call.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/balance_credit.svg b/assets/images/new/services/balance_credit.svg deleted file mode 100644 index 268f284..0000000 --- a/assets/images/new/services/balance_credit.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/assets/images/new/services/bmi.svg b/assets/images/new/services/bmi.svg deleted file mode 100644 index ce3be18..0000000 --- a/assets/images/new/services/bmi.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/services/bmr_calc.svg b/assets/images/new/services/bmr_calc.svg deleted file mode 100644 index 991cdd0..0000000 --- a/assets/images/new/services/bmr_calc.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/services/body_fat_calc.svg b/assets/images/new/services/body_fat_calc.svg deleted file mode 100644 index 552715b..0000000 --- a/assets/images/new/services/body_fat_calc.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/services/calories_calc.svg b/assets/images/new/services/calories_calc.svg deleted file mode 100644 index 2d4de2f..0000000 --- a/assets/images/new/services/calories_calc.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/assets/images/new/services/carbs_proteitn_fat.svg b/assets/images/new/services/carbs_proteitn_fat.svg deleted file mode 100644 index ba1c700..0000000 --- a/assets/images/new/services/carbs_proteitn_fat.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/services/chatbot.svg b/assets/images/new/services/chatbot.svg deleted file mode 100644 index cf2a509..0000000 --- a/assets/images/new/services/chatbot.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/services/cholesterol.svg b/assets/images/new/services/cholesterol.svg deleted file mode 100644 index e5686e1..0000000 --- a/assets/images/new/services/cholesterol.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/services/contactless.svg b/assets/images/new/services/contactless.svg deleted file mode 100644 index 4eb2d47..0000000 --- a/assets/images/new/services/contactless.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/new/services/delivery.svg b/assets/images/new/services/delivery.svg deleted file mode 100644 index 2b350b8..0000000 --- a/assets/images/new/services/delivery.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/services/eye_measurement.svg b/assets/images/new/services/eye_measurement.svg deleted file mode 100644 index 563329c..0000000 --- a/assets/images/new/services/eye_measurement.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/assets/images/new/services/fat.svg b/assets/images/new/services/fat.svg deleted file mode 100644 index 552715b..0000000 --- a/assets/images/new/services/fat.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/services/hosp_location.svg b/assets/images/new/services/hosp_location.svg deleted file mode 100644 index 4d55f56..0000000 --- a/assets/images/new/services/hosp_location.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/services/ideal_weight_calc.svg b/assets/images/new/services/ideal_weight_calc.svg deleted file mode 100644 index 60d7ecb..0000000 --- a/assets/images/new/services/ideal_weight_calc.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/insurance_approval.svg b/assets/images/new/services/insurance_approval.svg deleted file mode 100644 index f6a5885..0000000 --- a/assets/images/new/services/insurance_approval.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/services/insurance_card.svg b/assets/images/new/services/insurance_card.svg deleted file mode 100644 index 81d91b5..0000000 --- a/assets/images/new/services/insurance_card.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/images/new/services/internet_connection.svg b/assets/images/new/services/internet_connection.svg deleted file mode 100644 index 0917640..0000000 --- a/assets/images/new/services/internet_connection.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/invoice_list.svg b/assets/images/new/services/invoice_list.svg deleted file mode 100644 index 18fe134..0000000 --- a/assets/images/new/services/invoice_list.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/services/lab_result.svg b/assets/images/new/services/lab_result.svg deleted file mode 100644 index e850759..0000000 --- a/assets/images/new/services/lab_result.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/services/location.svg b/assets/images/new/services/location.svg deleted file mode 100644 index e727476..0000000 --- a/assets/images/new/services/location.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/new/services/medical_instructions.svg b/assets/images/new/services/medical_instructions.svg deleted file mode 100644 index dc060b3..0000000 --- a/assets/images/new/services/medical_instructions.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/medical_report.svg b/assets/images/new/services/medical_report.svg deleted file mode 100644 index 186af7a..0000000 --- a/assets/images/new/services/medical_report.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/new/services/medicine_prescription.svg b/assets/images/new/services/medicine_prescription.svg deleted file mode 100644 index 21cadf7..0000000 --- a/assets/images/new/services/medicine_prescription.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/services/monthly_report.svg b/assets/images/new/services/monthly_report.svg deleted file mode 100644 index d218855..0000000 --- a/assets/images/new/services/monthly_report.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/new/services/my_doc.svg b/assets/images/new/services/my_doc.svg deleted file mode 100644 index 8bec48a..0000000 --- a/assets/images/new/services/my_doc.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/online_payment.svg b/assets/images/new/services/online_payment.svg deleted file mode 100644 index 238417d..0000000 --- a/assets/images/new/services/online_payment.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/services/ovulation.svg b/assets/images/new/services/ovulation.svg deleted file mode 100644 index 29650a7..0000000 --- a/assets/images/new/services/ovulation.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/services/pendingPayment.svg b/assets/images/new/services/pendingPayment.svg deleted file mode 100644 index 79f29f0..0000000 --- a/assets/images/new/services/pendingPayment.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/services/phone_call.svg b/assets/images/new/services/phone_call.svg deleted file mode 100644 index 10dbdbd..0000000 --- a/assets/images/new/services/phone_call.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/qr_code.svg b/assets/images/new/services/qr_code.svg deleted file mode 100644 index 55b7091..0000000 --- a/assets/images/new/services/qr_code.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/assets/images/new/services/radiology.svg b/assets/images/new/services/radiology.svg deleted file mode 100644 index 8f1d8a4..0000000 --- a/assets/images/new/services/radiology.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/raise_comp.svg b/assets/images/new/services/raise_comp.svg deleted file mode 100644 index 74a87ba..0000000 --- a/assets/images/new/services/raise_comp.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/reminder_icon.svg b/assets/images/new/services/reminder_icon.svg deleted file mode 100644 index 9d73af2..0000000 --- a/assets/images/new/services/reminder_icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/images/new/services/reschedule.svg b/assets/images/new/services/reschedule.svg deleted file mode 100644 index 28dbc92..0000000 --- a/assets/images/new/services/reschedule.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/services/sick_leave.svg b/assets/images/new/services/sick_leave.svg deleted file mode 100644 index 4d8eea5..0000000 --- a/assets/images/new/services/sick_leave.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/services/smart_watch.svg b/assets/images/new/services/smart_watch.svg deleted file mode 100644 index 236f64b..0000000 --- a/assets/images/new/services/smart_watch.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/assets/images/new/services/sugar-blood-level.svg b/assets/images/new/services/sugar-blood-level.svg deleted file mode 100644 index f1c103f..0000000 --- a/assets/images/new/services/sugar-blood-level.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/new/services/survey.svg b/assets/images/new/services/survey.svg deleted file mode 100644 index 69fb7ad..0000000 --- a/assets/images/new/services/survey.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/images/new/services/tracker.svg b/assets/images/new/services/tracker.svg deleted file mode 100644 index 7d727ce..0000000 --- a/assets/images/new/services/tracker.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/new/services/vaccine_list.svg b/assets/images/new/services/vaccine_list.svg deleted file mode 100644 index 7096feb..0000000 --- a/assets/images/new/services/vaccine_list.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/services/video_call.svg b/assets/images/new/services/video_call.svg deleted file mode 100644 index 3257991..0000000 --- a/assets/images/new/services/video_call.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/images/new/services/vital_signs.svg b/assets/images/new/services/vital_signs.svg deleted file mode 100644 index fe476c3..0000000 --- a/assets/images/new/services/vital_signs.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/new/smart watch.svg b/assets/images/new/smart watch.svg deleted file mode 100644 index 0667e31..0000000 --- a/assets/images/new/smart watch.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/assets/images/new/strips.svg b/assets/images/new/strips.svg deleted file mode 100644 index d93430b..0000000 --- a/assets/images/new/strips.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/new/tap.svg b/assets/images/new/tap.svg deleted file mode 100644 index cf73ddd..0000000 --- a/assets/images/new/tap.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/temperature.svg b/assets/images/new/temperature.svg deleted file mode 100644 index 3330c31..0000000 --- a/assets/images/new/temperature.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/assets/images/new/todo.svg b/assets/images/new/todo.svg deleted file mode 100644 index be869c1..0000000 --- a/assets/images/new/todo.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/tooth.svg b/assets/images/new/tooth.svg deleted file mode 100644 index 2b2e343..0000000 --- a/assets/images/new/tooth.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/new/ultrasound.svg b/assets/images/new/ultrasound.svg deleted file mode 100644 index bc43453..0000000 --- a/assets/images/new/ultrasound.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/assets/images/new/update insurance card.svg b/assets/images/new/update insurance card.svg deleted file mode 100644 index 0139e27..0000000 --- a/assets/images/new/update insurance card.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/new/verify_face.svg b/assets/images/new/verify_face.svg deleted file mode 100644 index e50d1a6..0000000 --- a/assets/images/new/verify_face.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/verify_sms.svg b/assets/images/new/verify_sms.svg deleted file mode 100644 index ae5fa9f..0000000 --- a/assets/images/new/verify_sms.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/images/new/verify_thumb.svg b/assets/images/new/verify_thumb.svg deleted file mode 100644 index e626baf..0000000 --- a/assets/images/new/verify_thumb.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/verify_whatsapp.svg b/assets/images/new/verify_whatsapp.svg deleted file mode 100644 index 09ac85c..0000000 --- a/assets/images/new/verify_whatsapp.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/assets/images/new/virtual tour.svg b/assets/images/new/virtual tour.svg deleted file mode 100644 index 733f433..0000000 --- a/assets/images/new/virtual tour.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/assets/images/new/virtual.svg b/assets/images/new/virtual.svg deleted file mode 100644 index d0819a8..0000000 --- a/assets/images/new/virtual.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/images/new/waitingAppo.svg b/assets/images/new/waitingAppo.svg deleted file mode 100644 index c9bd009..0000000 --- a/assets/images/new/waitingAppo.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/new/weight.svg b/assets/images/new/weight.svg deleted file mode 100644 index 013e645..0000000 --- a/assets/images/new/weight.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/images/new/workplace-icon.svg b/assets/images/new/workplace-icon.svg deleted file mode 100644 index 4a2c73a..0000000 --- a/assets/images/new/workplace-icon.svg +++ /dev/null @@ -1 +0,0 @@ -workplace \ No newline at end of file diff --git a/assets/images/new/zoom/chat-send@2x.png b/assets/images/new/zoom/chat-send@2x.png deleted file mode 100644 index 73e7cd3..0000000 Binary files a/assets/images/new/zoom/chat-send@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/chat-send@3x.png b/assets/images/new/zoom/chat-send@3x.png deleted file mode 100644 index 2c18a6b..0000000 Binary files a/assets/images/new/zoom/chat-send@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/default-avatar.png b/assets/images/new/zoom/default-avatar.png deleted file mode 100644 index c5fd1e7..0000000 Binary files a/assets/images/new/zoom/default-avatar.png and /dev/null differ diff --git a/assets/images/new/zoom/hamburger@2x.png b/assets/images/new/zoom/hamburger@2x.png deleted file mode 100644 index 9b490c2..0000000 Binary files a/assets/images/new/zoom/hamburger@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/hamburger@3x.png b/assets/images/new/zoom/hamburger@3x.png deleted file mode 100644 index 434601f..0000000 Binary files a/assets/images/new/zoom/hamburger@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/index.ts b/assets/images/new/zoom/index.ts deleted file mode 100644 index fce1d50..0000000 --- a/assets/images/new/zoom/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -export const icons = { - chatSend: require('./chat-send.png'), - defaultAvatar: require('./default-avatar.png'), - locked: require('./locked.png'), - more: require('./more.png'), - mute: require('./mute.png'), - muted: require('./muted.png'), - shareOn: require('./share-on.png'), - shareOff: require('./share-off.png'), - speakerOn: require('./speaker-on.png'), - speakerOff: require('./speaker-off.png'), - switchCamera: require('./switch-camera.png'), - hamburger: require('./hamburger.png'), - questionBalloon: require('./question-ballon.png'), - talking: require('./talking.png'), - unmute: require('./unmute.png'), - unlocked: require('./unlocked.png'), - videoOn: require('./video-on.png'), - videoOff: require('./video-off.png'), -}; - -export type IconTypes = keyof typeof icons; diff --git a/assets/images/new/zoom/locked@2x.png b/assets/images/new/zoom/locked@2x.png deleted file mode 100644 index c6d9806..0000000 Binary files a/assets/images/new/zoom/locked@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/locked@3x.png b/assets/images/new/zoom/locked@3x.png deleted file mode 100644 index 170f6e2..0000000 Binary files a/assets/images/new/zoom/locked@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/more@2x.png b/assets/images/new/zoom/more@2x.png deleted file mode 100644 index e98bc18..0000000 Binary files a/assets/images/new/zoom/more@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/more@3x.png b/assets/images/new/zoom/more@3x.png deleted file mode 100644 index e69710c..0000000 Binary files a/assets/images/new/zoom/more@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/mute@2x.png b/assets/images/new/zoom/mute@2x.png deleted file mode 100644 index 65b555a..0000000 Binary files a/assets/images/new/zoom/mute@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/mute@3x.png b/assets/images/new/zoom/mute@3x.png deleted file mode 100644 index da7b29c..0000000 Binary files a/assets/images/new/zoom/mute@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/muted@2x.png b/assets/images/new/zoom/muted@2x.png deleted file mode 100644 index 3504363..0000000 Binary files a/assets/images/new/zoom/muted@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/muted@3x.png b/assets/images/new/zoom/muted@3x.png deleted file mode 100644 index 808ef3e..0000000 Binary files a/assets/images/new/zoom/muted@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/question-ballon@2x.png b/assets/images/new/zoom/question-ballon@2x.png deleted file mode 100644 index ba79fd3..0000000 Binary files a/assets/images/new/zoom/question-ballon@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/question-ballon@3x.png b/assets/images/new/zoom/question-ballon@3x.png deleted file mode 100644 index 019c69d..0000000 Binary files a/assets/images/new/zoom/question-ballon@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/share-off@2x.png b/assets/images/new/zoom/share-off@2x.png deleted file mode 100644 index 1dba94c..0000000 Binary files a/assets/images/new/zoom/share-off@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/share-off@3x.png b/assets/images/new/zoom/share-off@3x.png deleted file mode 100644 index 46989fe..0000000 Binary files a/assets/images/new/zoom/share-off@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/share-on@2x.png b/assets/images/new/zoom/share-on@2x.png deleted file mode 100644 index 285118e..0000000 Binary files a/assets/images/new/zoom/share-on@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/share-on@3x.png b/assets/images/new/zoom/share-on@3x.png deleted file mode 100644 index 9ed5713..0000000 Binary files a/assets/images/new/zoom/share-on@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/speaker-off.png b/assets/images/new/zoom/speaker-off.png deleted file mode 100644 index 9763a5a..0000000 Binary files a/assets/images/new/zoom/speaker-off.png and /dev/null differ diff --git a/assets/images/new/zoom/speaker-on.png b/assets/images/new/zoom/speaker-on.png deleted file mode 100644 index f3355ba..0000000 Binary files a/assets/images/new/zoom/speaker-on.png and /dev/null differ diff --git a/assets/images/new/zoom/switch-camera.png b/assets/images/new/zoom/switch-camera.png deleted file mode 100644 index 5927b7b..0000000 Binary files a/assets/images/new/zoom/switch-camera.png and /dev/null differ diff --git a/assets/images/new/zoom/talking@2x.png b/assets/images/new/zoom/talking@2x.png deleted file mode 100644 index 676d61d..0000000 Binary files a/assets/images/new/zoom/talking@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/talking@3x.png b/assets/images/new/zoom/talking@3x.png deleted file mode 100644 index 7028a35..0000000 Binary files a/assets/images/new/zoom/talking@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/unlocked@2x.png b/assets/images/new/zoom/unlocked@2x.png deleted file mode 100644 index aa5403e..0000000 Binary files a/assets/images/new/zoom/unlocked@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/unlocked@3x.png b/assets/images/new/zoom/unlocked@3x.png deleted file mode 100644 index 25f9390..0000000 Binary files a/assets/images/new/zoom/unlocked@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/unmute@2x.png b/assets/images/new/zoom/unmute@2x.png deleted file mode 100644 index 4c6d239..0000000 Binary files a/assets/images/new/zoom/unmute@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/unmute@3x.png b/assets/images/new/zoom/unmute@3x.png deleted file mode 100644 index dad68fa..0000000 Binary files a/assets/images/new/zoom/unmute@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/video-off@2x.png b/assets/images/new/zoom/video-off@2x.png deleted file mode 100644 index 3e209dd..0000000 Binary files a/assets/images/new/zoom/video-off@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/video-off@3x.png b/assets/images/new/zoom/video-off@3x.png deleted file mode 100644 index 0667405..0000000 Binary files a/assets/images/new/zoom/video-off@3x.png and /dev/null differ diff --git a/assets/images/new/zoom/video-on@2x.png b/assets/images/new/zoom/video-on@2x.png deleted file mode 100644 index cdd8544..0000000 Binary files a/assets/images/new/zoom/video-on@2x.png and /dev/null differ diff --git a/assets/images/new/zoom/video-on@3x.png b/assets/images/new/zoom/video-on@3x.png deleted file mode 100644 index 03e6976..0000000 Binary files a/assets/images/new/zoom/video-on@3x.png and /dev/null differ diff --git a/assets/images/new/payment/Apple_Pay.png b/assets/images/png/Apple_Pay.png similarity index 100% rename from assets/images/new/payment/Apple_Pay.png rename to assets/images/png/Apple_Pay.png diff --git a/assets/images/new/payment/Mada.png b/assets/images/png/Mada.png similarity index 100% rename from assets/images/new/payment/Mada.png rename to assets/images/png/Mada.png diff --git a/assets/images/new/payment/Mastercard.png b/assets/images/png/Mastercard.png similarity index 100% rename from assets/images/new/payment/Mastercard.png rename to assets/images/png/Mastercard.png diff --git a/assets/images/png/baby_girl_img.png b/assets/images/png/baby_girl_img.png new file mode 100644 index 0000000..55cee71 Binary files /dev/null and b/assets/images/png/baby_girl_img.png differ diff --git a/assets/images/png/baby_img.png b/assets/images/png/baby_img.png new file mode 100644 index 0000000..a4f3f86 Binary files /dev/null and b/assets/images/png/baby_img.png differ diff --git a/assets/images/new/body_parts/female/abdomin.png b/assets/images/png/body_parts/female/abdomin.png similarity index 100% rename from assets/images/new/body_parts/female/abdomin.png rename to assets/images/png/body_parts/female/abdomin.png diff --git a/assets/images/new/body_parts/female/anal.png b/assets/images/png/body_parts/female/anal.png similarity index 100% rename from assets/images/new/body_parts/female/anal.png rename to assets/images/png/body_parts/female/anal.png diff --git a/assets/images/new/body_parts/female/axilla.png b/assets/images/png/body_parts/female/axilla.png similarity index 100% rename from assets/images/new/body_parts/female/axilla.png rename to assets/images/png/body_parts/female/axilla.png diff --git a/assets/images/new/body_parts/female/back.png b/assets/images/png/body_parts/female/back.png similarity index 100% rename from assets/images/new/body_parts/female/back.png rename to assets/images/png/body_parts/female/back.png diff --git a/assets/images/new/body_parts/female/bikini.png b/assets/images/png/body_parts/female/bikini.png similarity index 100% rename from assets/images/new/body_parts/female/bikini.png rename to assets/images/png/body_parts/female/bikini.png diff --git a/assets/images/new/body_parts/female/bikini_line.png b/assets/images/png/body_parts/female/bikini_line.png similarity index 100% rename from assets/images/new/body_parts/female/bikini_line.png rename to assets/images/png/body_parts/female/bikini_line.png diff --git a/assets/images/new/body_parts/female/buttocks.png b/assets/images/png/body_parts/female/buttocks.png similarity index 100% rename from assets/images/new/body_parts/female/buttocks.png rename to assets/images/png/body_parts/female/buttocks.png diff --git a/assets/images/new/body_parts/female/cheeks.svg b/assets/images/png/body_parts/female/cheeks.svg similarity index 100% rename from assets/images/new/body_parts/female/cheeks.svg rename to assets/images/png/body_parts/female/cheeks.svg diff --git a/assets/images/new/body_parts/female/chest.png b/assets/images/png/body_parts/female/chest.png similarity index 100% rename from assets/images/new/body_parts/female/chest.png rename to assets/images/png/body_parts/female/chest.png diff --git a/assets/images/new/body_parts/female/chest_line.png b/assets/images/png/body_parts/female/chest_line.png similarity index 100% rename from assets/images/new/body_parts/female/chest_line.png rename to assets/images/png/body_parts/female/chest_line.png diff --git a/assets/images/new/body_parts/female/chin.svg b/assets/images/png/body_parts/female/chin.svg similarity index 100% rename from assets/images/new/body_parts/female/chin.svg rename to assets/images/png/body_parts/female/chin.svg diff --git a/assets/images/new/body_parts/female/ears.svg b/assets/images/png/body_parts/female/ears.svg similarity index 100% rename from assets/images/new/body_parts/female/ears.svg rename to assets/images/png/body_parts/female/ears.svg diff --git a/assets/images/new/body_parts/female/eyebrows.svg b/assets/images/png/body_parts/female/eyebrows.svg similarity index 100% rename from assets/images/new/body_parts/female/eyebrows.svg rename to assets/images/png/body_parts/female/eyebrows.svg diff --git a/assets/images/new/body_parts/female/full_body_female.png b/assets/images/png/body_parts/female/full_body_female.png similarity index 100% rename from assets/images/new/body_parts/female/full_body_female.png rename to assets/images/png/body_parts/female/full_body_female.png diff --git a/assets/images/new/body_parts/female/full_legs.png b/assets/images/png/body_parts/female/full_legs.png similarity index 100% rename from assets/images/new/body_parts/female/full_legs.png rename to assets/images/png/body_parts/female/full_legs.png diff --git a/assets/images/new/body_parts/female/full_neck.svg b/assets/images/png/body_parts/female/full_neck.svg similarity index 100% rename from assets/images/new/body_parts/female/full_neck.svg rename to assets/images/png/body_parts/female/full_neck.svg diff --git a/assets/images/new/body_parts/female/half_neck.svg b/assets/images/png/body_parts/female/half_neck.svg similarity index 100% rename from assets/images/new/body_parts/female/half_neck.svg rename to assets/images/png/body_parts/female/half_neck.svg diff --git a/assets/images/new/body_parts/female/hydra_facial.svg b/assets/images/png/body_parts/female/hydra_facial.svg similarity index 100% rename from assets/images/new/body_parts/female/hydra_facial.svg rename to assets/images/png/body_parts/female/hydra_facial.svg diff --git a/assets/images/new/body_parts/female/lower_arm.png b/assets/images/png/body_parts/female/lower_arm.png similarity index 100% rename from assets/images/new/body_parts/female/lower_arm.png rename to assets/images/png/body_parts/female/lower_arm.png diff --git a/assets/images/new/body_parts/female/lower_leg.png b/assets/images/png/body_parts/female/lower_leg.png similarity index 100% rename from assets/images/new/body_parts/female/lower_leg.png rename to assets/images/png/body_parts/female/lower_leg.png diff --git a/assets/images/new/body_parts/female/shoulders.png b/assets/images/png/body_parts/female/shoulders.png similarity index 100% rename from assets/images/new/body_parts/female/shoulders.png rename to assets/images/png/body_parts/female/shoulders.png diff --git a/assets/images/new/body_parts/female/side_burn.svg b/assets/images/png/body_parts/female/side_burn.svg similarity index 100% rename from assets/images/new/body_parts/female/side_burn.svg rename to assets/images/png/body_parts/female/side_burn.svg diff --git a/assets/images/new/body_parts/female/upper_arm.png b/assets/images/png/body_parts/female/upper_arm.png similarity index 100% rename from assets/images/new/body_parts/female/upper_arm.png rename to assets/images/png/body_parts/female/upper_arm.png diff --git a/assets/images/new/body_parts/female/upper_legs.png b/assets/images/png/body_parts/female/upper_legs.png similarity index 100% rename from assets/images/new/body_parts/female/upper_legs.png rename to assets/images/png/body_parts/female/upper_legs.png diff --git a/assets/images/new/body_parts/female/upper_lips.svg b/assets/images/png/body_parts/female/upper_lips.svg similarity index 100% rename from assets/images/new/body_parts/female/upper_lips.svg rename to assets/images/png/body_parts/female/upper_lips.svg diff --git a/assets/images/new/body_parts/male/abdomin.png b/assets/images/png/body_parts/male/abdomin.png similarity index 100% rename from assets/images/new/body_parts/male/abdomin.png rename to assets/images/png/body_parts/male/abdomin.png diff --git a/assets/images/new/body_parts/male/axilla.png b/assets/images/png/body_parts/male/axilla.png similarity index 100% rename from assets/images/new/body_parts/male/axilla.png rename to assets/images/png/body_parts/male/axilla.png diff --git a/assets/images/new/body_parts/male/back.png b/assets/images/png/body_parts/male/back.png similarity index 100% rename from assets/images/new/body_parts/male/back.png rename to assets/images/png/body_parts/male/back.png diff --git a/assets/images/new/body_parts/male/back.svg b/assets/images/png/body_parts/male/back.svg similarity index 100% rename from assets/images/new/body_parts/male/back.svg rename to assets/images/png/body_parts/male/back.svg diff --git a/assets/images/new/body_parts/male/bikini.png b/assets/images/png/body_parts/male/bikini.png similarity index 100% rename from assets/images/new/body_parts/male/bikini.png rename to assets/images/png/body_parts/male/bikini.png diff --git a/assets/images/new/body_parts/male/bikini_line.png b/assets/images/png/body_parts/male/bikini_line.png similarity index 100% rename from assets/images/new/body_parts/male/bikini_line.png rename to assets/images/png/body_parts/male/bikini_line.png diff --git a/assets/images/new/body_parts/male/cheek.svg b/assets/images/png/body_parts/male/cheek.svg similarity index 100% rename from assets/images/new/body_parts/male/cheek.svg rename to assets/images/png/body_parts/male/cheek.svg diff --git a/assets/images/new/body_parts/male/chest.png b/assets/images/png/body_parts/male/chest.png similarity index 100% rename from assets/images/new/body_parts/male/chest.png rename to assets/images/png/body_parts/male/chest.png diff --git a/assets/images/new/body_parts/male/chest_line.png b/assets/images/png/body_parts/male/chest_line.png similarity index 100% rename from assets/images/new/body_parts/male/chest_line.png rename to assets/images/png/body_parts/male/chest_line.png diff --git a/assets/images/new/body_parts/male/chin.svg b/assets/images/png/body_parts/male/chin.svg similarity index 100% rename from assets/images/new/body_parts/male/chin.svg rename to assets/images/png/body_parts/male/chin.svg diff --git a/assets/images/new/body_parts/male/ears.svg b/assets/images/png/body_parts/male/ears.svg similarity index 100% rename from assets/images/new/body_parts/male/ears.svg rename to assets/images/png/body_parts/male/ears.svg diff --git a/assets/images/new/body_parts/male/eyebrows.svg b/assets/images/png/body_parts/male/eyebrows.svg similarity index 100% rename from assets/images/new/body_parts/male/eyebrows.svg rename to assets/images/png/body_parts/male/eyebrows.svg diff --git a/assets/images/new/body_parts/male/full_body_male.png b/assets/images/png/body_parts/male/full_body_male.png similarity index 100% rename from assets/images/new/body_parts/male/full_body_male.png rename to assets/images/png/body_parts/male/full_body_male.png diff --git a/assets/images/new/body_parts/male/full_legs.png b/assets/images/png/body_parts/male/full_legs.png similarity index 100% rename from assets/images/new/body_parts/male/full_legs.png rename to assets/images/png/body_parts/male/full_legs.png diff --git a/assets/images/new/body_parts/male/full_neck.png b/assets/images/png/body_parts/male/full_neck.png similarity index 100% rename from assets/images/new/body_parts/male/full_neck.png rename to assets/images/png/body_parts/male/full_neck.png diff --git a/assets/images/new/body_parts/male/full_neck.svg b/assets/images/png/body_parts/male/full_neck.svg similarity index 100% rename from assets/images/new/body_parts/male/full_neck.svg rename to assets/images/png/body_parts/male/full_neck.svg diff --git a/assets/images/new/body_parts/male/half_neck.png b/assets/images/png/body_parts/male/half_neck.png similarity index 100% rename from assets/images/new/body_parts/male/half_neck.png rename to assets/images/png/body_parts/male/half_neck.png diff --git a/assets/images/new/body_parts/male/half_neck.svg b/assets/images/png/body_parts/male/half_neck.svg similarity index 100% rename from assets/images/new/body_parts/male/half_neck.svg rename to assets/images/png/body_parts/male/half_neck.svg diff --git a/assets/images/new/body_parts/male/hydra_facial.svg b/assets/images/png/body_parts/male/hydra_facial.svg similarity index 100% rename from assets/images/new/body_parts/male/hydra_facial.svg rename to assets/images/png/body_parts/male/hydra_facial.svg diff --git a/assets/images/new/body_parts/male/lower_arm.png b/assets/images/png/body_parts/male/lower_arm.png similarity index 100% rename from assets/images/new/body_parts/male/lower_arm.png rename to assets/images/png/body_parts/male/lower_arm.png diff --git a/assets/images/new/body_parts/male/lower_legs.png b/assets/images/png/body_parts/male/lower_legs.png similarity index 100% rename from assets/images/new/body_parts/male/lower_legs.png rename to assets/images/png/body_parts/male/lower_legs.png diff --git a/assets/images/new/body_parts/male/shoulders.png b/assets/images/png/body_parts/male/shoulders.png similarity index 100% rename from assets/images/new/body_parts/male/shoulders.png rename to assets/images/png/body_parts/male/shoulders.png diff --git a/assets/images/new/body_parts/male/side_burn.svg b/assets/images/png/body_parts/male/side_burn.svg similarity index 100% rename from assets/images/new/body_parts/male/side_burn.svg rename to assets/images/png/body_parts/male/side_burn.svg diff --git a/assets/images/new/body_parts/male/upper_arm.png b/assets/images/png/body_parts/male/upper_arm.png similarity index 100% rename from assets/images/new/body_parts/male/upper_arm.png rename to assets/images/png/body_parts/male/upper_arm.png diff --git a/assets/images/new/body_parts/male/upper_legs.png b/assets/images/png/body_parts/male/upper_legs.png similarity index 100% rename from assets/images/new/body_parts/male/upper_legs.png rename to assets/images/png/body_parts/male/upper_legs.png diff --git a/assets/images/new/body_parts/male/upper_lips.svg b/assets/images/png/body_parts/male/upper_lips.svg similarity index 100% rename from assets/images/new/body_parts/male/upper_lips.svg rename to assets/images/png/body_parts/male/upper_lips.svg diff --git a/assets/images/png/dummy_user.png b/assets/images/png/dummy_user.png new file mode 100644 index 0000000..b4bace4 Binary files /dev/null and b/assets/images/png/dummy_user.png differ diff --git a/assets/images/png/female_img.png b/assets/images/png/female_img.png new file mode 100644 index 0000000..7d3354a Binary files /dev/null and b/assets/images/png/female_img.png differ diff --git a/assets/images/new/hmg_logo.png b/assets/images/png/hmg_logo.png similarity index 100% rename from assets/images/new/hmg_logo.png rename to assets/images/png/hmg_logo.png diff --git a/assets/images/png/livecare_service.png b/assets/images/png/livecare_service.png new file mode 100644 index 0000000..d900403 Binary files /dev/null and b/assets/images/png/livecare_service.png differ diff --git a/assets/images/png/lock-icon.png b/assets/images/png/lock-icon.png new file mode 100644 index 0000000..3964588 Binary files /dev/null and b/assets/images/png/lock-icon.png differ diff --git a/assets/images/png/male_img.png b/assets/images/png/male_img.png new file mode 100644 index 0000000..f849800 Binary files /dev/null and b/assets/images/png/male_img.png differ diff --git a/assets/images/new/payment/tamara_en.png b/assets/images/png/tamara_en.png similarity index 100% rename from assets/images/new/payment/tamara_en.png rename to assets/images/png/tamara_en.png diff --git a/assets/images/new/payment/visa.png b/assets/images/png/visa.png similarity index 100% rename from assets/images/new/payment/visa.png rename to assets/images/png/visa.png diff --git a/assets/images/new/Saudi_Riyal_Symbol.svg b/assets/images/svg/Saudi_Riyal_Symbol.svg similarity index 100% rename from assets/images/new/Saudi_Riyal_Symbol.svg rename to assets/images/svg/Saudi_Riyal_Symbol.svg diff --git a/assets/images/svg/accessibility.svg b/assets/images/svg/accessibility.svg new file mode 100644 index 0000000..fbe3d12 --- /dev/null +++ b/assets/images/svg/accessibility.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/active-check.svg b/assets/images/svg/active-check.svg new file mode 100644 index 0000000..c94a3a0 --- /dev/null +++ b/assets/images/svg/active-check.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/add_family.svg b/assets/images/svg/add_family.svg new file mode 100644 index 0000000..e873f89 --- /dev/null +++ b/assets/images/svg/add_family.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/add_icon.svg b/assets/images/svg/add_icon.svg new file mode 100644 index 0000000..f89b62a --- /dev/null +++ b/assets/images/svg/add_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/alarm_clock_icon.svg b/assets/images/svg/alarm_clock_icon.svg new file mode 100644 index 0000000..50b64bd --- /dev/null +++ b/assets/images/svg/alarm_clock_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/alert-square.svg b/assets/images/svg/alert-square.svg new file mode 100644 index 0000000..87b52e3 --- /dev/null +++ b/assets/images/svg/alert-square.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/all_medications_icon.svg b/assets/images/svg/all_medications_icon.svg new file mode 100644 index 0000000..3d3449b --- /dev/null +++ b/assets/images/svg/all_medications_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/allergy_info_icon.svg b/assets/images/svg/allergy_info_icon.svg new file mode 100644 index 0000000..fc962cc --- /dev/null +++ b/assets/images/svg/allergy_info_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/ambulance.svg b/assets/images/svg/ambulance.svg new file mode 100644 index 0000000..a73cfdb --- /dev/null +++ b/assets/images/svg/ambulance.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/apple-finder.svg b/assets/images/svg/apple-finder.svg new file mode 100644 index 0000000..014083f --- /dev/null +++ b/assets/images/svg/apple-finder.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/appointment_calendar_icon.svg b/assets/images/svg/appointment_calendar_icon.svg new file mode 100644 index 0000000..74d9684 --- /dev/null +++ b/assets/images/svg/appointment_calendar_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/appointment_checkin_icon.svg b/assets/images/svg/appointment_checkin_icon.svg new file mode 100644 index 0000000..ed824bf --- /dev/null +++ b/assets/images/svg/appointment_checkin_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/appointment_pay_icon.svg b/assets/images/svg/appointment_pay_icon.svg new file mode 100644 index 0000000..7a52680 --- /dev/null +++ b/assets/images/svg/appointment_pay_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/appointment_time_icon.svg b/assets/images/svg/appointment_time_icon.svg new file mode 100644 index 0000000..a09e8e3 --- /dev/null +++ b/assets/images/svg/appointment_time_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/arrow-back.svg b/assets/images/svg/arrow-back.svg new file mode 100644 index 0000000..69297e5 --- /dev/null +++ b/assets/images/svg/arrow-back.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/arrow-down.svg b/assets/images/svg/arrow-down.svg new file mode 100644 index 0000000..48a4e38 --- /dev/null +++ b/assets/images/svg/arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/arrow-right.svg b/assets/images/svg/arrow-right.svg new file mode 100644 index 0000000..8818d72 --- /dev/null +++ b/assets/images/svg/arrow-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/arrow_forward.svg b/assets/images/svg/arrow_forward.svg new file mode 100644 index 0000000..2638c5b --- /dev/null +++ b/assets/images/svg/arrow_forward.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/ask_doctor_icon.svg b/assets/images/svg/ask_doctor_icon.svg new file mode 100644 index 0000000..fe4e103 --- /dev/null +++ b/assets/images/svg/ask_doctor_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/bell.svg b/assets/images/svg/bell.svg new file mode 100644 index 0000000..af6a5e5 --- /dev/null +++ b/assets/images/svg/bell.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/birthday-cake.svg b/assets/images/svg/birthday-cake.svg new file mode 100644 index 0000000..3f5c875 --- /dev/null +++ b/assets/images/svg/birthday-cake.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/blood_icon.svg b/assets/images/svg/blood_icon.svg new file mode 100644 index 0000000..c83b20c --- /dev/null +++ b/assets/images/svg/blood_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/book_appo_bottom.svg b/assets/images/svg/book_appo_bottom.svg new file mode 100644 index 0000000..d09107e --- /dev/null +++ b/assets/images/svg/book_appo_bottom.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/calendar.svg b/assets/images/svg/calendar.svg new file mode 100644 index 0000000..06bdb26 --- /dev/null +++ b/assets/images/svg/calendar.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/call.svg b/assets/images/svg/call.svg new file mode 100644 index 0000000..3389135 --- /dev/null +++ b/assets/images/svg/call.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/call_ambulance_icon.svg b/assets/images/svg/call_ambulance_icon.svg new file mode 100644 index 0000000..de3bbc2 --- /dev/null +++ b/assets/images/svg/call_ambulance_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/call_fill.svg b/assets/images/svg/call_fill.svg new file mode 100644 index 0000000..25509ed --- /dev/null +++ b/assets/images/svg/call_fill.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/cancel.svg b/assets/images/svg/cancel.svg new file mode 100755 index 0000000..c48bc12 --- /dev/null +++ b/assets/images/svg/cancel.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/cancel_circle.svg b/assets/images/svg/cancel_circle.svg new file mode 100644 index 0000000..3ceda6f --- /dev/null +++ b/assets/images/svg/cancel_circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/card_user.svg b/assets/images/svg/card_user.svg new file mode 100644 index 0000000..ee8bb0e --- /dev/null +++ b/assets/images/svg/card_user.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/svg/cardiology_clinic_icon.svg b/assets/images/svg/cardiology_clinic_icon.svg new file mode 100644 index 0000000..a4e73f1 --- /dev/null +++ b/assets/images/svg/cardiology_clinic_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/checkin_location_icon.svg b/assets/images/svg/checkin_location_icon.svg new file mode 100644 index 0000000..de096c9 --- /dev/null +++ b/assets/images/svg/checkin_location_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/checkin_nfc_icon.svg b/assets/images/svg/checkin_nfc_icon.svg new file mode 100644 index 0000000..b754bc5 --- /dev/null +++ b/assets/images/svg/checkin_nfc_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/checkin_qr_icon.svg b/assets/images/svg/checkin_qr_icon.svg new file mode 100644 index 0000000..8588453 --- /dev/null +++ b/assets/images/svg/checkin_qr_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/svg/checkmark_icon.svg b/assets/images/svg/checkmark_icon.svg new file mode 100644 index 0000000..e514106 --- /dev/null +++ b/assets/images/svg/checkmark_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/close_bottom_nav.svg b/assets/images/svg/close_bottom_nav.svg new file mode 100644 index 0000000..185b857 --- /dev/null +++ b/assets/images/svg/close_bottom_nav.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/close_bottom_sheet_icon.svg b/assets/images/svg/close_bottom_sheet_icon.svg new file mode 100644 index 0000000..599ce85 --- /dev/null +++ b/assets/images/svg/close_bottom_sheet_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/new/cloud_logo.svg b/assets/images/svg/cloud_logo.svg similarity index 100% rename from assets/images/new/cloud_logo.svg rename to assets/images/svg/cloud_logo.svg diff --git a/assets/images/svg/confirm.svg b/assets/images/svg/confirm.svg new file mode 100755 index 0000000..62cfa01 --- /dev/null +++ b/assets/images/svg/confirm.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/confirm_appointment_icon.svg b/assets/images/svg/confirm_appointment_icon.svg new file mode 100644 index 0000000..f5e8728 --- /dev/null +++ b/assets/images/svg/confirm_appointment_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/contact_icon.svg b/assets/images/svg/contact_icon.svg new file mode 100644 index 0000000..695ab03 --- /dev/null +++ b/assets/images/svg/contact_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/critical_low_result.svg b/assets/images/svg/critical_low_result.svg new file mode 100644 index 0000000..2706852 --- /dev/null +++ b/assets/images/svg/critical_low_result.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/cross-circle.svg b/assets/images/svg/cross-circle.svg new file mode 100644 index 0000000..7fc10c2 --- /dev/null +++ b/assets/images/svg/cross-circle.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/cross_circle.svg b/assets/images/svg/cross_circle.svg new file mode 100644 index 0000000..bcf9f90 --- /dev/null +++ b/assets/images/svg/cross_circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/delete_icon.svg b/assets/images/svg/delete_icon.svg new file mode 100644 index 0000000..2e37d0d --- /dev/null +++ b/assets/images/svg/delete_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/directions_icon.svg b/assets/images/svg/directions_icon.svg new file mode 100644 index 0000000..cf28cd3 --- /dev/null +++ b/assets/images/svg/directions_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/doctor_calendar_icon.svg b/assets/images/svg/doctor_calendar_icon.svg new file mode 100644 index 0000000..f76c49f --- /dev/null +++ b/assets/images/svg/doctor_calendar_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/doctor_contact_icon.svg b/assets/images/svg/doctor_contact_icon.svg new file mode 100644 index 0000000..00cba33 --- /dev/null +++ b/assets/images/svg/doctor_contact_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/doctor_profile_icon.svg b/assets/images/svg/doctor_profile_icon.svg new file mode 100644 index 0000000..120c3c1 --- /dev/null +++ b/assets/images/svg/doctor_profile_icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/svg/down_cheveron.svg b/assets/images/svg/down_cheveron.svg new file mode 100644 index 0000000..b7e1e5c --- /dev/null +++ b/assets/images/svg/down_cheveron.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/download.svg b/assets/images/svg/download.svg new file mode 100644 index 0000000..37aef2b --- /dev/null +++ b/assets/images/svg/download.svg @@ -0,0 +1,4 @@ + + + diff --git a/assets/images/new/download_1.svg b/assets/images/svg/download_1.svg similarity index 100% rename from assets/images/new/download_1.svg rename to assets/images/svg/download_1.svg diff --git a/assets/images/svg/dropdow-icon.svg b/assets/images/svg/dropdow-icon.svg new file mode 100644 index 0000000..9ae2e61 --- /dev/null +++ b/assets/images/svg/dropdow-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/dual_arrow.svg b/assets/images/svg/dual_arrow.svg new file mode 100644 index 0000000..1ec5a60 --- /dev/null +++ b/assets/images/svg/dual_arrow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/edit_icon.svg b/assets/images/svg/edit_icon.svg new file mode 100644 index 0000000..3f82a2e --- /dev/null +++ b/assets/images/svg/edit_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/email.svg b/assets/images/svg/email.svg new file mode 100644 index 0000000..09c68a3 --- /dev/null +++ b/assets/images/svg/email.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/email_icon.svg b/assets/images/svg/email_icon.svg new file mode 100644 index 0000000..9e052e7 --- /dev/null +++ b/assets/images/svg/email_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/email_transparent.svg b/assets/images/svg/email_transparent.svg new file mode 100644 index 0000000..6f45a86 --- /dev/null +++ b/assets/images/svg/email_transparent.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/emergency.svg b/assets/images/svg/emergency.svg new file mode 100644 index 0000000..7a5a6e3 --- /dev/null +++ b/assets/images/svg/emergency.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/emergency_services_icon.svg b/assets/images/svg/emergency_services_icon.svg new file mode 100644 index 0000000..e6dabad --- /dev/null +++ b/assets/images/svg/emergency_services_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/external_link.svg b/assets/images/svg/external_link.svg new file mode 100644 index 0000000..822ebc2 --- /dev/null +++ b/assets/images/svg/external_link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/eye_results_icon.svg b/assets/images/svg/eye_results_icon.svg new file mode 100644 index 0000000..fd9c754 --- /dev/null +++ b/assets/images/svg/eye_results_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/feedback.svg b/assets/images/svg/feedback.svg new file mode 100644 index 0000000..2c93252 --- /dev/null +++ b/assets/images/svg/feedback.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/svg/female_avatar.svg b/assets/images/svg/female_avatar.svg new file mode 100644 index 0000000..98bec63 --- /dev/null +++ b/assets/images/svg/female_avatar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/file_icon.svg b/assets/images/svg/file_icon.svg new file mode 100644 index 0000000..7bfc655 --- /dev/null +++ b/assets/images/svg/file_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/filters.svg b/assets/images/svg/filters.svg new file mode 100644 index 0000000..521f6fa --- /dev/null +++ b/assets/images/svg/filters.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/fingerprint.svg b/assets/images/svg/fingerprint.svg new file mode 100644 index 0000000..e189bc6 --- /dev/null +++ b/assets/images/svg/fingerprint.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/forward_arrow_icon.svg b/assets/images/svg/forward_arrow_icon.svg new file mode 100644 index 0000000..e4fd254 --- /dev/null +++ b/assets/images/svg/forward_arrow_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/forward_arrow_icon_small.svg b/assets/images/svg/forward_arrow_icon_small.svg new file mode 100644 index 0000000..c97ff8b --- /dev/null +++ b/assets/images/svg/forward_arrow_icon_small.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/forward_arrow_medium.svg b/assets/images/svg/forward_arrow_medium.svg new file mode 100644 index 0000000..3c2d4bf --- /dev/null +++ b/assets/images/svg/forward_arrow_medium.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/forward_chevron_icon.svg b/assets/images/svg/forward_chevron_icon.svg new file mode 100644 index 0000000..656d80e --- /dev/null +++ b/assets/images/svg/forward_chevron_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/free_med_delivery_icon.svg b/assets/images/svg/free_med_delivery_icon.svg new file mode 100644 index 0000000..626e035 --- /dev/null +++ b/assets/images/svg/free_med_delivery_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/generic_clinic_icon.svg b/assets/images/svg/generic_clinic_icon.svg new file mode 100644 index 0000000..adb1303 --- /dev/null +++ b/assets/images/svg/generic_clinic_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/globe.svg b/assets/images/svg/globe.svg new file mode 100644 index 0000000..f17981f --- /dev/null +++ b/assets/images/svg/globe.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/globe_black.svg b/assets/images/svg/globe_black.svg new file mode 100644 index 0000000..a11766c --- /dev/null +++ b/assets/images/svg/globe_black.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/graph.svg b/assets/images/svg/graph.svg new file mode 100644 index 0000000..8c79844 --- /dev/null +++ b/assets/images/svg/graph.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/habib_logo_background.svg b/assets/images/svg/habib_logo_background.svg new file mode 100644 index 0000000..597c7b2 --- /dev/null +++ b/assets/images/svg/habib_logo_background.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/habiblogo.svg b/assets/images/svg/habiblogo.svg new file mode 100644 index 0000000..8c33d82 --- /dev/null +++ b/assets/images/svg/habiblogo.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/health_calculators_icon.svg b/assets/images/svg/health_calculators_icon.svg new file mode 100644 index 0000000..b3a8913 --- /dev/null +++ b/assets/images/svg/health_calculators_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/heart.svg b/assets/images/svg/heart.svg new file mode 100644 index 0000000..6b0939a --- /dev/null +++ b/assets/images/svg/heart.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/hmc.svg b/assets/images/svg/hmc.svg new file mode 100644 index 0000000..824ca06 --- /dev/null +++ b/assets/images/svg/hmc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/hmg.svg b/assets/images/svg/hmg.svg new file mode 100644 index 0000000..ccaed0c --- /dev/null +++ b/assets/images/svg/hmg.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/home_bottom.svg b/assets/images/svg/home_bottom.svg new file mode 100644 index 0000000..1bf82f9 --- /dev/null +++ b/assets/images/svg/home_bottom.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/home_calendar_icon.svg b/assets/images/svg/home_calendar_icon.svg new file mode 100644 index 0000000..8701a13 --- /dev/null +++ b/assets/images/svg/home_calendar_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/home_lab_result_icon.svg b/assets/images/svg/home_lab_result_icon.svg new file mode 100644 index 0000000..245048d --- /dev/null +++ b/assets/images/svg/home_lab_result_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/hospital.svg b/assets/images/svg/hospital.svg new file mode 100644 index 0000000..e805352 --- /dev/null +++ b/assets/images/svg/hospital.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/ic_close.svg b/assets/images/svg/ic_close.svg new file mode 100644 index 0000000..615b42d --- /dev/null +++ b/assets/images/svg/ic_close.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/ic_date_filter.svg b/assets/images/svg/ic_date_filter.svg new file mode 100644 index 0000000..43d28f2 --- /dev/null +++ b/assets/images/svg/ic_date_filter.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/svg/ic_list.svg b/assets/images/svg/ic_list.svg new file mode 100644 index 0000000..e68f20b --- /dev/null +++ b/assets/images/svg/ic_list.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/immediate_service_icon.svg b/assets/images/svg/immediate_service_icon.svg new file mode 100644 index 0000000..261ac9a --- /dev/null +++ b/assets/images/svg/immediate_service_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/indoor_nav_icon.svg b/assets/images/svg/indoor_nav_icon.svg new file mode 100644 index 0000000..566a7e0 --- /dev/null +++ b/assets/images/svg/indoor_nav_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/insurance.svg b/assets/images/svg/insurance.svg new file mode 100644 index 0000000..c8d3c38 --- /dev/null +++ b/assets/images/svg/insurance.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/insurance_active_icon.svg b/assets/images/svg/insurance_active_icon.svg new file mode 100644 index 0000000..33a25bb --- /dev/null +++ b/assets/images/svg/insurance_active_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/insurance_history_icon.svg b/assets/images/svg/insurance_history_icon.svg new file mode 100644 index 0000000..4ae2a1c --- /dev/null +++ b/assets/images/svg/insurance_history_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/insurance_update.svg b/assets/images/svg/insurance_update.svg new file mode 100644 index 0000000..49a3e29 --- /dev/null +++ b/assets/images/svg/insurance_update.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/ksa.svg b/assets/images/svg/ksa.svg new file mode 100644 index 0000000..d91255a --- /dev/null +++ b/assets/images/svg/ksa.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/images/svg/lab_result_icon.svg b/assets/images/svg/lab_result_icon.svg new file mode 100644 index 0000000..a8c442d --- /dev/null +++ b/assets/images/svg/lab_result_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/language.svg b/assets/images/svg/language.svg new file mode 100644 index 0000000..0a97644 --- /dev/null +++ b/assets/images/svg/language.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/language_change.svg b/assets/images/svg/language_change.svg new file mode 100644 index 0000000..e84f0c3 --- /dev/null +++ b/assets/images/svg/language_change.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/images/svg/livecare_book_icon.svg b/assets/images/svg/livecare_book_icon.svg new file mode 100644 index 0000000..3d38ac7 --- /dev/null +++ b/assets/images/svg/livecare_book_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/livecare_clinic_icon.svg b/assets/images/svg/livecare_clinic_icon.svg new file mode 100644 index 0000000..2b60209 --- /dev/null +++ b/assets/images/svg/livecare_clinic_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/livecare_icon.svg b/assets/images/svg/livecare_icon.svg new file mode 100644 index 0000000..553f1a5 --- /dev/null +++ b/assets/images/svg/livecare_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/livecare_online_icon.svg b/assets/images/svg/livecare_online_icon.svg new file mode 100644 index 0000000..e063de8 --- /dev/null +++ b/assets/images/svg/livecare_online_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/locate_me.svg b/assets/images/svg/locate_me.svg new file mode 100644 index 0000000..f919130 --- /dev/null +++ b/assets/images/svg/locate_me.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/images/svg/location.svg b/assets/images/svg/location.svg new file mode 100644 index 0000000..19b8bd3 --- /dev/null +++ b/assets/images/svg/location.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/assets/images/svg/location_pickup.svg b/assets/images/svg/location_pickup.svg new file mode 100644 index 0000000..11863f6 --- /dev/null +++ b/assets/images/svg/location_pickup.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/location_red.svg b/assets/images/svg/location_red.svg new file mode 100644 index 0000000..ba8c131 --- /dev/null +++ b/assets/images/svg/location_red.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/location_unavailable.svg b/assets/images/svg/location_unavailable.svg new file mode 100644 index 0000000..0ba34eb --- /dev/null +++ b/assets/images/svg/location_unavailable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/login1.svg b/assets/images/svg/login1.svg new file mode 100644 index 0000000..b3ee755 --- /dev/null +++ b/assets/images/svg/login1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/logout.svg b/assets/images/svg/logout.svg new file mode 100644 index 0000000..b52e142 --- /dev/null +++ b/assets/images/svg/logout.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/low_result.svg b/assets/images/svg/low_result.svg new file mode 100644 index 0000000..52a2ef1 --- /dev/null +++ b/assets/images/svg/low_result.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/male_avatar.svg b/assets/images/svg/male_avatar.svg new file mode 100644 index 0000000..a62e9d6 --- /dev/null +++ b/assets/images/svg/male_avatar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/message.svg b/assets/images/svg/message.svg new file mode 100644 index 0000000..1e09ced --- /dev/null +++ b/assets/images/svg/message.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/minus.svg b/assets/images/svg/minus.svg new file mode 100644 index 0000000..01d8ebd --- /dev/null +++ b/assets/images/svg/minus.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/more.svg b/assets/images/svg/more.svg new file mode 100644 index 0000000..4dbe5fd --- /dev/null +++ b/assets/images/svg/more.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/my_account_icon.svg b/assets/images/svg/my_account_icon.svg new file mode 100644 index 0000000..4bfe5b1 --- /dev/null +++ b/assets/images/svg/my_account_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/my_address.svg b/assets/images/svg/my_address.svg new file mode 100644 index 0000000..59faec9 --- /dev/null +++ b/assets/images/svg/my_address.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/my_files_bottom.svg b/assets/images/svg/my_files_bottom.svg new file mode 100644 index 0000000..813805e --- /dev/null +++ b/assets/images/svg/my_files_bottom.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/my_prescription_icon.svg b/assets/images/svg/my_prescription_icon.svg new file mode 100644 index 0000000..4c9eaa4 --- /dev/null +++ b/assets/images/svg/my_prescription_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/nearest_er_icon.svg b/assets/images/svg/nearest_er_icon.svg new file mode 100644 index 0000000..73637da --- /dev/null +++ b/assets/images/svg/nearest_er_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/news.svg b/assets/images/svg/news.svg new file mode 100644 index 0000000..82f9dcf --- /dev/null +++ b/assets/images/svg/news.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/no_visit_icon.svg b/assets/images/svg/no_visit_icon.svg new file mode 100644 index 0000000..2c8616a --- /dev/null +++ b/assets/images/svg/no_visit_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/normal_result.svg b/assets/images/svg/normal_result.svg new file mode 100644 index 0000000..abe036f --- /dev/null +++ b/assets/images/svg/normal_result.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/new/not_found.svg b/assets/images/svg/not_found.svg similarity index 100% rename from assets/images/new/not_found.svg rename to assets/images/svg/not_found.svg diff --git a/assets/images/svg/note-edit.svg b/assets/images/svg/note-edit.svg new file mode 100644 index 0000000..daed336 --- /dev/null +++ b/assets/images/svg/note-edit.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/notes_icon.svg b/assets/images/svg/notes_icon.svg new file mode 100644 index 0000000..5d7ab0e --- /dev/null +++ b/assets/images/svg/notes_icon.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/assets/images/svg/password-validation.svg b/assets/images/svg/password-validation.svg new file mode 100644 index 0000000..c9d641d --- /dev/null +++ b/assets/images/svg/password-validation.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/pay_with_apple_pay.svg b/assets/images/svg/pay_with_apple_pay.svg new file mode 100644 index 0000000..7c45f1b --- /dev/null +++ b/assets/images/svg/pay_with_apple_pay.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/permission.svg b/assets/images/svg/permission.svg new file mode 100644 index 0000000..00d6f5c --- /dev/null +++ b/assets/images/svg/permission.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/pickup_bed.svg b/assets/images/svg/pickup_bed.svg new file mode 100644 index 0000000..3e5c402 --- /dev/null +++ b/assets/images/svg/pickup_bed.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/pin_location.svg b/assets/images/svg/pin_location.svg new file mode 100644 index 0000000..1a8012d --- /dev/null +++ b/assets/images/svg/pin_location.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/prescription_item_icon.svg b/assets/images/svg/prescription_item_icon.svg new file mode 100644 index 0000000..6aba05f --- /dev/null +++ b/assets/images/svg/prescription_item_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/prescription_refill_icon.svg b/assets/images/svg/prescription_refill_icon.svg new file mode 100644 index 0000000..7a9706b --- /dev/null +++ b/assets/images/svg/prescription_refill_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/prescription_remarks_icon.svg b/assets/images/svg/prescription_remarks_icon.svg new file mode 100644 index 0000000..a8d7adb --- /dev/null +++ b/assets/images/svg/prescription_remarks_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/prescription_reminder_icon.svg b/assets/images/svg/prescription_reminder_icon.svg new file mode 100644 index 0000000..3a854c3 --- /dev/null +++ b/assets/images/svg/prescription_reminder_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/privacy_terms.svg b/assets/images/svg/privacy_terms.svg new file mode 100644 index 0000000..ee79318 --- /dev/null +++ b/assets/images/svg/privacy_terms.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/radiology_icon.svg b/assets/images/svg/radiology_icon.svg new file mode 100644 index 0000000..e1ae996 --- /dev/null +++ b/assets/images/svg/radiology_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/range_calender.svg b/assets/images/svg/range_calender.svg new file mode 100644 index 0000000..940c002 --- /dev/null +++ b/assets/images/svg/range_calender.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/rate.svg b/assets/images/svg/rate.svg new file mode 100644 index 0000000..bfdaf3f --- /dev/null +++ b/assets/images/svg/rate.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/rating_icon.svg b/assets/images/svg/rating_icon.svg new file mode 100644 index 0000000..dee25d4 --- /dev/null +++ b/assets/images/svg/rating_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/rebook_appointment_icon.svg b/assets/images/svg/rebook_appointment_icon.svg new file mode 100644 index 0000000..da4533a --- /dev/null +++ b/assets/images/svg/rebook_appointment_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/recharge_icon.svg b/assets/images/svg/recharge_icon.svg new file mode 100644 index 0000000..a6f26ce --- /dev/null +++ b/assets/images/svg/recharge_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/refernce_range_indicator.svg b/assets/images/svg/refernce_range_indicator.svg new file mode 100644 index 0000000..a3508b9 --- /dev/null +++ b/assets/images/svg/refernce_range_indicator.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/svg/reminder_bell.svg b/assets/images/svg/reminder_bell.svg new file mode 100644 index 0000000..82be912 --- /dev/null +++ b/assets/images/svg/reminder_bell.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/report_icon.svg b/assets/images/svg/report_icon.svg new file mode 100644 index 0000000..97b6db8 --- /dev/null +++ b/assets/images/svg/report_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/requests.svg b/assets/images/svg/requests.svg new file mode 100644 index 0000000..7d90098 --- /dev/null +++ b/assets/images/svg/requests.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/robort_svg.svg b/assets/images/svg/robort_svg.svg new file mode 100644 index 0000000..8b4875a --- /dev/null +++ b/assets/images/svg/robort_svg.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/svg/rrt_icon.svg b/assets/images/svg/rrt_icon.svg new file mode 100644 index 0000000..0530487 --- /dev/null +++ b/assets/images/svg/rrt_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/search_by_clinic_icon.svg b/assets/images/svg/search_by_clinic_icon.svg new file mode 100644 index 0000000..ce00f8c --- /dev/null +++ b/assets/images/svg/search_by_clinic_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/search_by_doctor_icon.svg b/assets/images/svg/search_by_doctor_icon.svg new file mode 100644 index 0000000..2ca5eb9 --- /dev/null +++ b/assets/images/svg/search_by_doctor_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/search_by_region_icon.svg b/assets/images/svg/search_by_region_icon.svg new file mode 100644 index 0000000..00abe12 --- /dev/null +++ b/assets/images/svg/search_by_region_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/search_doctor_icon.svg b/assets/images/svg/search_doctor_icon.svg new file mode 100644 index 0000000..d19aed7 --- /dev/null +++ b/assets/images/svg/search_doctor_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/search_icon.svg b/assets/images/svg/search_icon.svg new file mode 100644 index 0000000..1a64ce5 --- /dev/null +++ b/assets/images/svg/search_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/select_hospital_icon.svg b/assets/images/svg/select_hospital_icon.svg new file mode 100644 index 0000000..ce00f8c --- /dev/null +++ b/assets/images/svg/select_hospital_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/services_bottom.svg b/assets/images/svg/services_bottom.svg new file mode 100644 index 0000000..baa3d6b --- /dev/null +++ b/assets/images/svg/services_bottom.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/share_location.svg b/assets/images/svg/share_location.svg new file mode 100644 index 0000000..88860aa --- /dev/null +++ b/assets/images/svg/share_location.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/show_icon.svg b/assets/images/svg/show_icon.svg new file mode 100644 index 0000000..541fd55 --- /dev/null +++ b/assets/images/svg/show_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/small_livecare_icon.svg b/assets/images/svg/small_livecare_icon.svg new file mode 100644 index 0000000..a496914 --- /dev/null +++ b/assets/images/svg/small_livecare_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/smart-phone.svg b/assets/images/svg/smart-phone.svg new file mode 100644 index 0000000..a276f85 --- /dev/null +++ b/assets/images/svg/smart-phone.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/smart_phone_fill.svg b/assets/images/svg/smart_phone_fill.svg new file mode 100644 index 0000000..70beb7f --- /dev/null +++ b/assets/images/svg/smart_phone_fill.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/sms.svg b/assets/images/svg/sms.svg new file mode 100644 index 0000000..4237c0d --- /dev/null +++ b/assets/images/svg/sms.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/student-card.svg b/assets/images/svg/student-card.svg new file mode 100644 index 0000000..441a83f --- /dev/null +++ b/assets/images/svg/student-card.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/svg/success.svg b/assets/images/svg/success.svg new file mode 100644 index 0000000..343589b --- /dev/null +++ b/assets/images/svg/success.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/svg/switch_user.svg b/assets/images/svg/switch_user.svg new file mode 100644 index 0000000..fa8e47e --- /dev/null +++ b/assets/images/svg/switch_user.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/tamara.svg b/assets/images/svg/tamara.svg new file mode 100644 index 0000000..714a808 --- /dev/null +++ b/assets/images/svg/tamara.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/svg/to_arrow.svg b/assets/images/svg/to_arrow.svg new file mode 100644 index 0000000..80f26e4 --- /dev/null +++ b/assets/images/svg/to_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/todo_bottom.svg b/assets/images/svg/todo_bottom.svg new file mode 100644 index 0000000..ab49757 --- /dev/null +++ b/assets/images/svg/todo_bottom.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/touch_face_id.svg b/assets/images/svg/touch_face_id.svg new file mode 100644 index 0000000..07808bd --- /dev/null +++ b/assets/images/svg/touch_face_id.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/uae.svg b/assets/images/svg/uae.svg new file mode 100644 index 0000000..1047f41 --- /dev/null +++ b/assets/images/svg/uae.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/images/svg/uae_dirham_symbol.svg b/assets/images/svg/uae_dirham_symbol.svg new file mode 100644 index 0000000..4cd83ec --- /dev/null +++ b/assets/images/svg/uae_dirham_symbol.svg @@ -0,0 +1,7 @@ + + Layer copy + + + \ No newline at end of file diff --git a/assets/images/svg/update_insurance_card.svg b/assets/images/svg/update_insurance_card.svg new file mode 100644 index 0000000..9b21aab --- /dev/null +++ b/assets/images/svg/update_insurance_card.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/user-circle.svg b/assets/images/svg/user-circle.svg new file mode 100644 index 0000000..8dc74ed --- /dev/null +++ b/assets/images/svg/user-circle.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/user-full.svg b/assets/images/svg/user-full.svg new file mode 100644 index 0000000..ed1159a --- /dev/null +++ b/assets/images/svg/user-full.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/vaccine_info_icon.svg b/assets/images/svg/vaccine_info_icon.svg new file mode 100644 index 0000000..d8d22b2 --- /dev/null +++ b/assets/images/svg/vaccine_info_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/view_report_icon.svg b/assets/images/svg/view_report_icon.svg new file mode 100644 index 0000000..0f7d866 --- /dev/null +++ b/assets/images/svg/view_report_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/visa_mastercard.svg b/assets/images/svg/visa_mastercard.svg new file mode 100644 index 0000000..22e19fa --- /dev/null +++ b/assets/images/svg/visa_mastercard.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/images/svg/waiting_icon.svg b/assets/images/svg/waiting_icon.svg new file mode 100644 index 0000000..40e8645 --- /dev/null +++ b/assets/images/svg/waiting_icon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/images/svg/waiting_time_clock.svg b/assets/images/svg/waiting_time_clock.svg new file mode 100644 index 0000000..6207841 --- /dev/null +++ b/assets/images/svg/waiting_time_clock.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/walkin_appointment_icon.svg b/assets/images/svg/walkin_appointment_icon.svg new file mode 100644 index 0000000..ceafb38 --- /dev/null +++ b/assets/images/svg/walkin_appointment_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/wallet.svg b/assets/images/svg/wallet.svg new file mode 100644 index 0000000..3382609 --- /dev/null +++ b/assets/images/svg/wallet.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/warning.svg b/assets/images/svg/warning.svg new file mode 100644 index 0000000..191fe58 --- /dev/null +++ b/assets/images/svg/warning.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/whatsapp.svg b/assets/images/svg/whatsapp.svg new file mode 100644 index 0000000..4b2a40a --- /dev/null +++ b/assets/images/svg/whatsapp.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/json/countriesList.json b/assets/json/countriesList.json new file mode 100644 index 0000000..25a65b3 --- /dev/null +++ b/assets/json/countriesList.json @@ -0,0 +1,1212 @@ +[ + { + "ID": "AFG", + "Name": "Afghan", + "NameN": "أفغاني" + }, + { + "ID": "CAF", + "Name": "African", + "NameN": "أفريقي" + }, + { + "ID": "ALB", + "Name": "Albanian", + "NameN": "ألباني" + }, + { + "ID": "DZA", + "Name": "Algerian", + "NameN": "جزائري" + }, + { + "ID": "USA", + "Name": "American", + "NameN": "أمريكي" + }, + { + "ID": "UMI", + "Name": "American (Minor Outlying Islands)", + "NameN": "أمريكي (الجزر الصغرى النائية)" + }, + { + "ID": "ASM", + "Name": "American Samoa", + "NameN": "ساموا الأمريكية" + }, + { + "ID": "AND", + "Name": "Andorrian", + "NameN": "أندوري" + }, + { + "ID": "AGO", + "Name": "Angolan", + "NameN": "أنغولي" + }, + { + "ID": "AIA", + "Name": "Anguillan", + "NameN": "أنغيلي" + }, + { + "ID": "ATA", + "Name": "Antarctica", + "NameN": "أنتاركتيكا" + }, + { + "ID": "ATG", + "Name": "Antiguans, Barbudans", + "NameN": "أنتيغوي، باربودي" + }, + { + "ID": "ARG", + "Name": "Argentine", + "NameN": "أرجنتيني" + }, + { + "ID": "ARM", + "Name": "Armenian", + "NameN": "أرمني" + }, + { + "ID": "ABW", + "Name": "Arubian", + "NameN": "أروبي" + }, + { + "ID": "AUS", + "Name": "Australian", + "NameN": "أسترالي" + }, + { + "ID": "AUT", + "Name": "Austrian", + "NameN": "نمساوي" + }, + { + "ID": "AZE", + "Name": "Azeri", + "NameN": "أذربيجاني" + }, + { + "ID": "BHS", + "Name": "Bahamian", + "NameN": "باهامي" + }, + { + "ID": "BHR", + "Name": "Bahraini", + "NameN": "بحريني" + }, + { + "ID": "BRB", + "Name": "Barbadian or Bajuns", + "NameN": "باربادوسي" + }, + { + "ID": "BLR", + "Name": "Belarusian", + "NameN": "بيلاروسي" + }, + { + "ID": "BEL", + "Name": "Belgian", + "NameN": "بلجيكي" + }, + { + "ID": "BLZ", + "Name": "Belizean", + "NameN": "بليزي" + }, + { + "ID": "BGD", + "Name": "Bengali", + "NameN": "بنغلاديشي" + }, + { + "ID": "BEN", + "Name": "Beninese", + "NameN": "بنيني" + }, + { + "ID": "BMU", + "Name": "Bermudian", + "NameN": "برمودي" + }, + { + "ID": "BTN", + "Name": "Bhutanese", + "NameN": "بوتاني" + }, + { + "ID": "BOL", + "Name": "Bolivian", + "NameN": "بوليفي" + }, + { + "ID": "BIH", + "Name": "Bosnian And Herzegovinian", + "NameN": "بوسني وهرسكي" + }, + { + "ID": "BWA", + "Name": "Botswanian", + "NameN": "بوتسواني" + }, + { + "ID": "BVT", + "Name": "Bouvet Island (Bouvetoya)", + "NameN": "جزيرة بوفيه" + }, + { + "ID": "BRA", + "Name": "Brazilian", + "NameN": "برازيلي" + }, + { + "ID": "GBR", + "Name": "British", + "NameN": "بريطاني" + }, + { + "ID": "IOT", + "Name": "British (Chagos Archipelago)", + "NameN": "بريطاني (أرخبيل شاغوس)" + }, + { + "ID": "VGB", + "Name": "British (Virgin Islands)", + "NameN": "بريطاني (الجزر العذراء)" + }, + { + "ID": "BRN", + "Name": "Bruneian", + "NameN": "بروني" + }, + { + "ID": "BGR", + "Name": "Bulgarian", + "NameN": "بلغاري" + }, + { + "ID": "MMR", + "Name": "Burmese or Myanmarese", + "NameN": "بورمي أو ميانماري" + }, + { + "ID": "BFA", + "Name": "Burnikabe", + "NameN": "بوركيني" + }, + { + "ID": "BDI", + "Name": "Burundi", + "NameN": "بوروندي" + }, + { + "ID": "KHM", + "Name": "Cambodian", + "NameN": "كمبودي" + }, + { + "ID": "CMR", + "Name": "Cameroonian", + "NameN": "كاميروني" + }, + { + "ID": "CAN", + "Name": "Canadian", + "NameN": "كندي" + }, + { + "ID": "CPV", + "Name": "Cape Verdian or Cape Verdean", + "NameN": "رأس أخضري" + }, + { + "ID": "CYM", + "Name": "Cayman Islander", + "NameN": "جزر كايماني" + }, + { + "ID": "TCD", + "Name": "Chadian", + "NameN": "تشادي" + }, + { + "ID": "CHL", + "Name": "Chilean", + "NameN": "تشيلي" + }, + { + "ID": "HKG", + "Name": "Chinese (Hong Kong)", + "NameN": "صيني (هونغ كونغ)" + }, + { + "ID": "MAC", + "Name": "Chinese (Macao)", + "NameN": "صيني (ماكاو)" + }, + { + "ID": "CHN", + "Name": "Chinese", + "NameN": "صيني" + }, + { + "ID": "CXR", + "Name": "Christmas Island", + "NameN": "جزيرة الكريسماس" + }, + { + "ID": "CCK", + "Name": "Cocos (Keeling) Islands", + "NameN": "جزر كوكوس (كيلنغ)" + }, + { + "ID": "COL", + "Name": "Colombian", + "NameN": "كولومبي" + }, + { + "ID": "COM", + "Name": "Comoran", + "NameN": "قمري" + }, + { + "ID": "COG", + "Name": "Congolese", + "NameN": "كونغولي" + }, + { + "ID": "COD", + "Name": "Congolese (Zaire)", + "NameN": "كونغولي (زائير)" + }, + { + "ID": "COK", + "Name": "Cook Islander", + "NameN": "جزر كوك" + }, + { + "ID": "CRI", + "Name": "Costa Rican", + "NameN": "كوستاريكي" + }, + { + "ID": "HRV", + "Name": "Croat", + "NameN": "كرواتي" + }, + { + "ID": "CUB", + "Name": "Cuban", + "NameN": "كوبي" + }, + { + "ID": "CYP", + "Name": "Cypriot, Greek", + "NameN": "قبرصي، يوناني" + }, + { + "ID": "CZE", + "Name": "Czech", + "NameN": "تشيكي" + }, + { + "ID": "DNK", + "Name": "Danish", + "NameN": "دنماركي" + }, + { + "ID": "DJI", + "Name": "Djibouti", + "NameN": "جيبوتي" + }, + { + "ID": "DOM", + "Name": "Dominican", + "NameN": "دومينيكاني" + }, + { + "ID": "DMA", + "Name": "Dominican (Commonwealth)", + "NameN": "دومينيكي (الكومنولث)" + }, + { + "ID": "ANT", + "Name": "Dutch (Antilles)", + "NameN": "هولندي (الأنتيل)" + }, + { + "ID": "NLD", + "Name": "Dutch (Netherlands)", + "NameN": "هولندي (هولندا)" + }, + { + "ID": "ECU", + "Name": "Ecuadorean", + "NameN": "إكوادوري" + }, + { + "ID": "EGY", + "Name": "Egyptians", + "NameN": "مصري" + }, + { + "ID": "ARE", + "Name": "Emirati", + "NameN": "إماراتي" + }, + { + "ID": "GNQ", + "Name": "Equatorial Guinean or Equatoguinean", + "NameN": "غيني استوائي" + }, + { + "ID": "ERI", + "Name": "Eritrean", + "NameN": "إريتري" + }, + { + "ID": "EST", + "Name": "Estonian", + "NameN": "إستوني" + }, + { + "ID": "ETH", + "Name": "Ethiopian", + "NameN": "إثيوبي" + }, + { + "ID": "FRO", + "Name": "Faeroe Islander", + "NameN": "جزر فارو" + }, + { + "ID": "FLK", + "Name": "Falkland Islander", + "NameN": "جزر فوكلاند" + }, + { + "ID": "FJI", + "Name": "Fijian", + "NameN": "فيجي" + }, + { + "ID": "PHL", + "Name": "Filipino", + "NameN": "فلبيني" + }, + { + "ID": "FIN", + "Name": "Finnish", + "NameN": "فنلندي" + }, + { + "ID": "FRA", + "Name": "French", + "NameN": "فرنسي" + }, + { + "ID": "GUF", + "Name": "French Guianian", + "NameN": "غويانا الفرنسية" + }, + { + "ID": "PYF", + "Name": "French Polynesian", + "NameN": "بولينيزيا الفرنسية" + }, + { + "ID": "ATF", + "Name": "French Southern Territories", + "NameN": "الأقاليم الجنوبية الفرنسية" + }, + { + "ID": "GAB", + "Name": "Gabonese", + "NameN": "غابوني" + }, + { + "ID": "GMB", + "Name": "Gambian", + "NameN": "غامبي" + }, + { + "ID": "GEO", + "Name": "Georgian", + "NameN": "جورجي" + }, + { + "ID": "SGS", + "Name": "Georgian (South)", + "NameN": "جورجي (جنوبي)" + }, + { + "ID": "DEU", + "Name": "German", + "NameN": "ألماني" + }, + { + "ID": "GHA", + "Name": "Ghanaian", + "NameN": "غاني" + }, + { + "ID": "GIB", + "Name": "Gibraltarian", + "NameN": "جبل طارقي" + }, + { + "ID": "GRC", + "Name": "Greek", + "NameN": "يوناني" + }, + { + "ID": "GRL", + "Name": "Greenlander", + "NameN": "غرينلاندي" + }, + { + "ID": "GRD", + "Name": "Grenadian or Grenadan", + "NameN": "غرينادي" + }, + { + "ID": "GLP", + "Name": "Guadeloupian", + "NameN": "غوادلوبي" + }, + { + "ID": "GUM", + "Name": "Guamanian", + "NameN": "غوامي" + }, + { + "ID": "GTM", + "Name": "Guatemalan", + "NameN": "غواتيمالي" + }, + { + "ID": "GNB", + "Name": "Guinea-Bissauan", + "NameN": "غيني بيساوي" + }, + { + "ID": "GIN", + "Name": "Guinean", + "NameN": "غيني" + }, + { + "ID": "GUY", + "Name": "Guyanese", + "NameN": "غيانيزي" + }, + { + "ID": "HTI", + "Name": "Haitian", + "NameN": "هايتيني" + }, + { + "ID": "HMD", + "Name": "Heard and McDonald Islands", + "NameN": "جزر هيرد وماكدونالد" + }, + { + "ID": "HND", + "Name": "Honduran", + "NameN": "هندوراسي" + }, + { + "ID": "HUN", + "Name": "Hungarian", + "NameN": "مجري" + }, + { + "ID": "ISL", + "Name": "Icelander", + "NameN": "آيسلندي" + }, + { + "ID": "KIR", + "Name": "I-Kiribati", + "NameN": "كيريباتي" + }, + { + "ID": "IND", + "Name": "Indian", + "NameN": "هندي" + }, + { + "ID": "IDN", + "Name": "Indonesian", + "NameN": "إندونيسي" + }, + { + "ID": "IRN", + "Name": "Iranian", + "NameN": "إيراني" + }, + { + "ID": "IRQ", + "Name": "Iraqi", + "NameN": "عراقي" + }, + { + "ID": "IRL", + "Name": "Irish", + "NameN": "إيرلندي" + }, + { + "ID": "ITA", + "Name": "Italian", + "NameN": "إيطالي" + }, + { + "ID": "CIV", + "Name": "Ivoirian", + "NameN": "إيفواري" + }, + { + "ID": "JAM", + "Name": "Jamaican", + "NameN": "جامايكي" + }, + { + "ID": "JPN", + "Name": "Japanese", + "NameN": "ياباني" + }, + { + "ID": "JOR", + "Name": "Jordanian", + "NameN": "أردني" + }, + { + "ID": "KAZ", + "Name": "Kazakhstani", + "NameN": "كازاخستاني" + }, + { + "ID": "KEN", + "Name": "Kenyan", + "NameN": "كيني" + }, + { + "ID": "KGZ", + "Name": "Kirghiz", + "NameN": "قيرغيزي" + }, + { + "ID": "KOR", + "Name": "Korean", + "NameN": "كوري" + }, + { + "ID": "PRK", + "Name": "Korean", + "NameN": "كوري" + }, + { + "ID": "KWT", + "Name": "Kuwaiti", + "NameN": "كويتي" + }, + { + "ID": "LAO", + "Name": "Laotian", + "NameN": "لاوسي" + }, + { + "ID": "LVA", + "Name": "Latvian", + "NameN": "لاتفي" + }, + { + "ID": "LBN", + "Name": "Lebanese", + "NameN": "لبناني" + }, + { + "ID": "LBR", + "Name": "Liberian", + "NameN": "ليبيري" + }, + { + "ID": "LBY", + "Name": "Libyan", + "NameN": "ليبي" + }, + { + "ID": "LIE", + "Name": "Liechtensteiner", + "NameN": "ليختنشتايني" + }, + { + "ID": "LTU", + "Name": "Lithuanian", + "NameN": "ليتواني" + }, + { + "ID": "LUX", + "Name": "Luxembourger", + "NameN": "لوكسمبورغي" + }, + { + "ID": "MKD", + "Name": "Macedonia, the former Yugoslav Republic of", + "NameN": "مقدوني، جمهورية يوغوسلافيا السابقة" + }, + { + "ID": "MYT", + "Name": "Mahorais", + "NameN": "مايوتي" + }, + { + "ID": "MDG", + "Name": "Malagasy", + "NameN": "مدغشقري" + }, + { + "ID": "MWI", + "Name": "Malawian", + "NameN": "مالاوي" + }, + { + "ID": "MYS", + "Name": "Malaysian", + "NameN": "ماليزي" + }, + { + "ID": "MDV", + "Name": "Maldivan", + "NameN": "مالديفي" + }, + { + "ID": "MLI", + "Name": "Malian", + "NameN": "مالي" + }, + { + "ID": "MLT", + "Name": "Maltese", + "NameN": "مالطي" + }, + { + "ID": "MHL", + "Name": "Marshallese", + "NameN": "مارشالي" + }, + { + "ID": "MTQ", + "Name": "Martiniquais", + "NameN": "مارتينيكي" + }, + { + "ID": "MRT", + "Name": "Mauritanian", + "NameN": "موريتاني" + }, + { + "ID": "MUS", + "Name": "Mauritian", + "NameN": "موريشيوسي" + }, + { + "ID": "MEX", + "Name": "Mexican", + "NameN": "مكسيكي" + }, + { + "ID": "FSM", + "Name": "Micronesian", + "NameN": "ميكرونيزي" + }, + { + "ID": "MDA", + "Name": "Moldovian", + "NameN": "مولدوفي" + }, + { + "ID": "MCO", + "Name": "Monegasque or Monacan", + "NameN": "موناكي" + }, + { + "ID": "MNG", + "Name": "Mongolian", + "NameN": "منغولي" + }, + { + "ID": "MNE", + "Name": "Montenegrin", + "NameN": "جبل أسودي" + }, + { + "ID": "MSR", + "Name": "Montserratian", + "NameN": "مونتسيراتي" + }, + { + "ID": "MAR", + "Name": "Moroccan", + "NameN": "مغربي" + }, + { + "ID": "LSO", + "Name": "Mosotho", + "NameN": "ليسوتي" + }, + { + "ID": "MOZ", + "Name": "Mozambican", + "NameN": "موزمبيقي" + }, + { + "ID": "NAM", + "Name": "Namibian", + "NameN": "ناميبي" + }, + { + "ID": "NRU", + "Name": "Nauruan", + "NameN": "ناوروي" + }, + { + "ID": "NPL", + "Name": "Nepalese", + "NameN": "نيبالي" + }, + { + "ID": "NCL", + "Name": "New Caledonian", + "NameN": "كاليدوني جديد" + }, + { + "ID": "NZL", + "Name": "New Zealand", + "NameN": "نيوزيلندي" + }, + { + "ID": "VUT", + "Name": "Ni- Vanuatu", + "NameN": "فانواتي" + }, + { + "ID": "NIC", + "Name": "Nicaraguan", + "NameN": "نيكاراغوي" + }, + { + "ID": "NGA", + "Name": "Nigerian", + "NameN": "نيجيري" + }, + { + "ID": "NER", + "Name": "Nigerien", + "NameN": "نيجري" + }, + { + "ID": "NIU", + "Name": "Niuean", + "NameN": "نيوي" + }, + { + "ID": "VAT", + "Name": "None (Vatican City)", + "NameN": "لا شيء (مدينة الفاتيكان)" + }, + { + "ID": "NFK", + "Name": "Norfolk Islander", + "NameN": "جزيرة نورفولك" + }, + { + "ID": "MNP", + "Name": "Northern Mariana Islander", + "NameN": "جزر ماريانا الشمالية" + }, + { + "ID": "NOR", + "Name": "Norwegean", + "NameN": "نرويجي" + }, + { + "ID": "OMN", + "Name": "Omani", + "NameN": "عماني" + }, + { + "ID": "OTH", + "Name": "OTHERS", + "NameN": "آخرون" + }, + { + "ID": "PAK", + "Name": "Pakistani", + "NameN": "باكستاني" + }, + { + "ID": "PLW", + "Name": "Palauan", + "NameN": "بالاوي" + }, + { + "ID": "PSE", + "Name": "Palestinian", + "NameN": "فلسطيني" + }, + { + "ID": "PAN", + "Name": "Panamanian", + "NameN": "بنمي" + }, + { + "ID": "PNG", + "Name": "Papua New Guinean", + "NameN": "بابوا غيني جديد" + }, + { + "ID": "PRY", + "Name": "Paraguayan", + "NameN": "باراغوايي" + }, + { + "ID": "PER", + "Name": "Peruvian", + "NameN": "بيروفي" + }, + { + "ID": "PCN", + "Name": "Pitcairn Islander", + "NameN": "جزر بيتكايرن" + }, + { + "ID": "POL", + "Name": "Polish", + "NameN": "بولندي" + }, + { + "ID": "PRT", + "Name": "Portuguese", + "NameN": "برتغالي" + }, + { + "ID": "PRI", + "Name": "Puerto Rican", + "NameN": "بورتوريكي" + }, + { + "ID": "QAT", + "Name": "Qatari", + "NameN": "قطري" + }, + { + "ID": "RKS", + "Name": "Republic of Kosovo", + "NameN": "جمهورية كوسوفو" + }, + { + "ID": "REU", + "Name": "Reunionese", + "NameN": "ريونيوني" + }, + { + "ID": "ROU", + "Name": "Romanian", + "NameN": "روماني" + }, + { + "ID": "RUS", + "Name": "Russian", + "NameN": "روسي" + }, + { + "ID": "RWA", + "Name": "Rwandan", + "NameN": "رواندي" + }, + { + "ID": "ESH", + "Name": "Sahrawi", + "NameN": "صحراوي" + }, + { + "ID": "SLV", + "Name": "Salvadoran", + "NameN": "سلفادوري" + }, + { + "ID": "SMR", + "Name": "Sammarinese", + "NameN": "سان مارينو" + }, + { + "ID": "WSM", + "Name": "Samoan", + "NameN": "ساموي" + }, + { + "ID": "STP", + "Name": "Sao Tomean", + "NameN": "ساو تومي" + }, + { + "ID": "SAU", + "Name": "Saudi", + "NameN": "سعودي" + }, + { + "ID": "SCT", + "Name": "Scottish", + "NameN": "اسكتلندي" + }, + { + "ID": "SEN", + "Name": "Senegalese", + "NameN": "سنغالي" + }, + { + "ID": "SRB", + "Name": "Serbian", + "NameN": "صربي" + }, + { + "ID": "SYC", + "Name": "Seychellois", + "NameN": "سيشيلي" + }, + { + "ID": "SLE", + "Name": "Sierra Leonean", + "NameN": "سيراليوني" + }, + { + "ID": "SGP", + "Name": "Singaporian", + "NameN": "سنغافوري" + }, + { + "ID": "SVK", + "Name": "Slovak", + "NameN": "سلوفاكي" + }, + { + "ID": "SVN", + "Name": "Slovene", + "NameN": "سلوفيني" + }, + { + "ID": "SLB", + "Name": "Solomon Islander", + "NameN": "جزر سليمان" + }, + { + "ID": "SOM", + "Name": "Somalian", + "NameN": "صومالي" + }, + { + "ID": "ZAF", + "Name": "South African", + "NameN": "جنوب أفريقي" + }, + { + "ID": "ESP", + "Name": "Spanish", + "NameN": "إسباني" + }, + { + "ID": "LKA", + "Name": "Sri Lankan", + "NameN": "سريلانكي" + }, + { + "ID": "SHN", + "Name": "St. Helena", + "NameN": "سانت هيلينا" + }, + { + "ID": "KNA", + "Name": "St. Kitts and Nevis", + "NameN": "سانت كيتس ونيفيس" + }, + { + "ID": "LCA", + "Name": "St. Lucia", + "NameN": "سانت لوسيا" + }, + { + "ID": "SPM", + "Name": "St. Pierre and Miquelon", + "NameN": "سانت بيير وميكيلون" + }, + { + "ID": "VCT", + "Name": "St. Vincent and the Grenadines", + "NameN": "سانت فنسنت والغرينادين" + }, + { + "ID": "SDN", + "Name": "Sudanese", + "NameN": "سوداني" + }, + { + "ID": "SUR", + "Name": "Surinamer", + "NameN": "سورينامي" + }, + { + "ID": "SJM", + "Name": "Svalbard and Jan Mayen islander", + "NameN": "سفالبارد وجان ماين" + }, + { + "ID": "SWZ", + "Name": "Swazi", + "NameN": "سوازي" + }, + { + "ID": "SWE", + "Name": "Swedish", + "NameN": "سويدي" + }, + { + "ID": "CHE", + "Name": "Swiss", + "NameN": "سويسري" + }, + { + "ID": "SYR", + "Name": "Syrian", + "NameN": "سوري" + }, + { + "ID": "TWN", + "Name": "Taiwan, Province of China", + "NameN": "تايوان، مقاطعة الصين" + }, + { + "ID": "TJK", + "Name": "Tajik", + "NameN": "طاجيكي" + }, + { + "ID": "TZA", + "Name": "Tanzania, United Republic o", + "NameN": "تنزاني، الجمهورية المتحدة" + }, + { + "ID": "THA", + "Name": "Thai", + "NameN": "تايلندي" + }, + { + "ID": "TLS", + "Name": "Timorese", + "NameN": "تيموري" + }, + { + "ID": "TGO", + "Name": "Togolese", + "NameN": "توغولي" + }, + { + "ID": "TKL", + "Name": "Tokelauan", + "NameN": "توكيلاوي" + }, + { + "ID": "TON", + "Name": "Tongan", + "NameN": "تونغي" + }, + { + "ID": "TTO", + "Name": "Trinidadian", + "NameN": "ترينيدادي" + }, + { + "ID": "TUN", + "Name": "Tunisian", + "NameN": "تونسي" + }, + { + "ID": "TCA", + "Name": "Turk", + "NameN": "تركي" + }, + { + "ID": "TUR", + "Name": "Turkish", + "NameN": "تركي" + }, + { + "ID": "TKM", + "Name": "Turkmen", + "NameN": "تركماني" + }, + { + "ID": "TUV", + "Name": "Tuvaluan", + "NameN": "توفالوي" + }, + { + "ID": "UGA", + "Name": "Ugandan", + "NameN": "أوغندي" + }, + { + "ID": "UKR", + "Name": "Ukrainian", + "NameN": "أوكراني" + }, + { + "ID": "URY", + "Name": "Uruguayan", + "NameN": "أوروغوايي" + }, + { + "ID": "UZB", + "Name": "Uzbek", + "NameN": "أوزبكي" + }, + { + "ID": "VEN", + "Name": "Venenzuelan", + "NameN": "فنزويلي" + }, + { + "ID": "VNM", + "Name": "Vietnamese", + "NameN": "فيتنامي" + }, + { + "ID": "VIR", + "Name": "Virgin Islander", + "NameN": "جزر عذراء" + }, + { + "ID": "WLF", + "Name": "Wallis and Futuna Islander", + "NameN": "واليس وفوتونا" + }, + { + "ID": "YEM", + "Name": "Yemeni", + "NameN": "يمني" + }, + { + "ID": "ZMB", + "Name": "Zambian", + "NameN": "زامبي" + }, + { + "ID": "ZWE", + "Name": "Zimbabwean", + "NameN": "زيمبابوي" + } +] \ No newline at end of file diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index d3236ae..787a718 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1,9 +1,880 @@ { - "english": "English", - "arabic": "عربي", + "english": "الإنجليزية", + "arabic": "العربية", "login": "تسجيل الدخول", - "noDataAvailable": "لا تتوافر بيانات", - "ok": "موافق", + "noDataAvailable": "لا توجد بيانات متاحة", "confirm": "تأكيد", - "loadingText": "جاري التحميل، الرجاء الانتظار..." + "loadingText": "جاري التحميل، يرجى الانتظار...", + "kilometerUnit": "كم", + "dashboardScreenToolbarTitle": "الرئيسية", + "settings": "الإعدادات", + "language": "لغة التطبيق", + "lanEnglish": "الإنجليزية", + "lanArabic": "العربية", + "cancel": "إلغاء", + "done": "تم", + "replay2": "إعادة التشغيل", + "home": "الرئيسية", + "services": "الخدمات", + "mySchedule": "جدولي", + "logout": "تسجيل الخروج", + "respirationRate": "معدل التنفس", + "bookAppo": "حجز موعد", + "searchBy": "البحث بواسطة:", + "clinic": "عيادة", + "byClinic": "حسب العيادة", + "hospital": "مستشفى", + "byHospital": "حسب المستشفى", + "name": "الاسم", + "doctor": "طبيب", + "clinicName": "اسم العيادة", + "hospitalName": "اسم المستشفى", + "noClinicFound": "لم يتم العثور على عيادة", + "doctorName": "اسم الطبيب", + "nearestAppo": "أقرب موعد", + "searchByDocText": "اكتب اسم الطبيب لمساعدتك في العثور عليه", + "enterDocName": "أدخل اسم الطبيب", + "search": "بحث", + "noResultFound": "لم يتم العثور على نتائج", + "noSearchResultFound": "لم يتم العثور على نتائج", + "pleaseEnterProductName": "يرجى إدخال اسم المنتج", + "bookNow": "احجز الآن", + "docInfo": "معلومات الطبيب", + "appoInfo": "معلومات الموعد", + "availableAppo": "المواعيد المتاحة", + "gender": "الجنس", + "nationality": "الجنسية", + "neverWait": "لا تنتظر في الطابور أبدًا", + "reminderTitle": "لديك موعد مع الدكتور.", + "appointmentCalendar": "هل ترغب في ضبط تذكير لهذا الموعد في تقويمك؟", + "appointmentSuccess": "تم حجز الموعد بنجاح", + "docQualifications": "مؤهلات الطبيب", + "pressAgain": "اضغط مرة أخرى للخروج من التطبيق", + "laserMaxLimitReach": "الحد الأقصى هو 90 دقيقة", + "confirmAppoHeading": "يرجى مراجعة موعدك", + "patientInfo": "معلومات المريض", + "doctorFilter": "سيتم تصفية الأطباء بناءً على جنسك وعمرك", + "bookSuccess": "تم الحجز بنجاح", + "patientShare": "نسبة المريض", + "patientShareWithTax": "نسبة المريض مع الضريبة", + "confirmAppo": "تأكيد الموعد", + "confirmLiveCare": "تأكيد الرعاية الحية", + "waitingForDoctor": "في انتظار الطبيب", + "appointment": "موعد", + "confirmLater": "تأكيد لاحقًا", + "todoList": "قائمة المهام", + "appoActions": "إجراءات الموعد", + "date": "التاريخ", + "time": "الوقت", + "pendingPayment": "معلق للدفع", + "payNow": "ادفع الآن", + "viewQR": "عرض رمز الاستجابة السريعة", + "instruction": "تعليمات", + "livecare": "الرعاية الحية", + "livecareAppo": "موعد الرعاية الحية", + "agreeTo": "أوافق على", + "termsConditoins": "الشروط والأحكام", + "cancelAppoMsg": "هل أنت متأكد أنك تريد إلغاء هذا الموعد؟", + "changePayment": "تغيير طريقة الدفع", + "upcomingNoAction": "لا حاجة لإجراء أي إجراء", + "upcomingConfirm": "يرجى تأكيد الموعد لتجنب الإلغاء", + "bookSuccessConfirmMore2412": "ستكون عملية الدفع عبر الإنترنت متاحة قبل 24 ساعة ��ن الموعد.", + "upcomingPaymentPending": "سيتم تفعيل الدفع عبر الإنترنت قبل 24 ساعة من موعد الموعد", + "upcomingPaymentNow": "ادفع عبر الإنترنت الآن لتجنب الانتظار الطويل", + "upcomingQR": "استخدم رمز الاستجابة السريعة لتسجيل الوصول في المستشفى", + "upcomingVirtual": "هذا موعد افتراضي، يرجى الالتزام بالتعليمات لتجربة سلسة.", + "upcomingLivecare": "هذا موعد رعاية حية", + "upcomingDetails": "المزيد من التفاصيل", + "reschedule": "إعادة جدولة", + "raise": "رفع", + "complaint": "شكوى", + "add": "إضافة", + "reminder": "تذكير", + "location": "المواقع", + "online": "عبر الإنترنت", + "payment": "الالكتروني", + "onlinePayment": "عبر الإنترنت", + "onlinePaymentSubtitle": "الدفع", + "cancelNocaps": "إلغاء", + "setReminder": "ضبط تذكير", + "nationalIdNumber": "رقم الهوية الوطنية", + "medicalFileNumber": "رقم الملف الطبي", + "loginregister": "تسجيل الدخول / التسجيل", + "poweredBy": "مدعوم من", + "welcome": "مرحبًا", + "welcomeToDrSulaiman": "مرحباً بكم في مجموعة الدكتور سليمان الحبيب الطبية", + "patientApp": "تطبيق المريض", + "welcomeText": "تطبيق الدكتور سليمان الحبيب للهاتف المحمول", + "drSulaimanText": "الدكتور سليمان الحبيب", + "welcomeText2": "هل زرت مستشفيات أو مراكز الدكتور سليمان الحبيب من قبل؟", + "yes": "نعم", + "no": "لا", + "logintyperadio": "اختر من الخيارات أدناه لتسجيل الدخول إلى ملفك الطبي.", + "registernow": "سجل الآن", + "nationalID": "أدخل رقم الهوية", + "nationalId": "الهوية الوطنية", + "fileNo": "رقم الملف", + "fileno": "رقم الملف", + "forgotFileNo": "نسيت رقم الملف؟", + "forgotFileNoTitle": "نسيت الملف الطبي", + "enterNationalId": "يرجى إدخال رقم الهاتف المحمول ورقم الهوية", + "profileInfo": "يرجى إدخال معلومات الملف الشخصي", + "submit": "إرسال", + "forgotDesc": "أدخل رقم الهاتف المحمول لاستلام رقم الملف الطبي عبر الرسائل القصيرة", + "dob": "تاريخ الميلاد:", + "hijriDate": "الت��ريخ الهجري", + "gregorianDate": "التاريخ الميلادي", + "verifyLoginWith": "يرجى اختيار واحدة من الخيارات التالية للتحقق", + "registerUser": "تسجيل", + "verifyWithFingerprint": "البيومترية", + "verifyWithFaceid": "معرف الوجه", + "verifyWithSms": "رسالة قصيرة", + "verifyWithWhatsapp": "واتساب", + "verifyThrough": "التحقق من خلال", + "lastLogin": "آخر تسجيل دخول في:", + "lastLoginWith": "نوع التحقق:", + "verifyFingerprint": "لتفعيل خدمة تسجيل الدخول ببصمة الإصبع، يرجى التحقق من البيانات باستخدام واحدة من الخيارات التالية.", + "searchMedicine": "ابحث عن دواء", + "pharmaciesList": "قائمة الصيدليات", + "searchMedicineHere": "ابحث عن دواء هنا", + "description": "الوصف", + "howToUse": "كيفية الاستخدام", + "price": "السعر", + "youCanFindItIn": "يمكنك العثور عليه في", + "pleaseEnterMedicineName": "يرجى إدخال اسم الدواء", + "verificationMessage": "يرجى إدخال رمز التحقق المرسل إلى", + "validationMessage": "ينتهي رمز التحقق في", + "notification": "الإشعارات", + "appSettings": "إعدادات التطبيق", + "rateApp": "قيم تطبيقنا", + "before": "قبل", + "minute": "دقائق", + "hour": "ساعة", + "reminderSuccess": "تمت إضافة التذكير بنجاح", + "reminderCancelSuccess": "تم إلغاء التذكير بنجاح", + "patientShareToDo": "المبلغ قبل الضريبة: ", + "patientTaxToDo": "قيمة الضريبة: ", + "patientShareTotalToDo": "إجمالي المبلغ المستحق: ", + "paymentMethod": "طريقة الدفع", + "noNeedToWaitInLine": "لا حاجة للانتظار في الطابور.", + "useQRAppoAttend": "استخدم رمز الاستجابة السريعة لتسجيل حضور الموعد.", + "passQRAppoAttend": "مرر رمز الاستجابة السريعة عبر أجهزة الحضور المتاحة في المستشفى.", + "sitWaitingQR": "اجلس في غرف الانتظار حتى يتم استدعاؤك من قبل الممرضة.", + "attendRegisterCode": "رمز تسجيل الحضور", + "scanQRHospital": "اقترب من لوحة التسجيل عبر الإنترنت في المستشفى وامسح عبر NFC أو رمز الاستجابة السريعة لتسجيل الوصول", + "scanNFC": "امسح NFC لتسجيل الوصول", + "sendEmail": "إرسال بريد إلكتروني", + "success": "تم بنجاح", + "emailSentSuccessfully": "تم إرسال البريد الإلكتروني بنجاح", + "emailSentError": "خطأ في إرسال البريد الإلكتروني", + "close": "إغلاق", + "closeIt": "أغلق", + "booked": "محجوز", + "confirmed": "مؤكد", + "arrived": "وصل", + "payNowBookSuccess": "ادفع الآن عبر تطبيق الحبيب", + "payNowBookSuccesstext1": "ادفع الآن باستخدام خدمة الدفع عبر الإنترنت من بوابات الدفع الآمنة", + "payNowBookSuccesstext2": "يمكنك أيضًا الدفع لاحقًا عبر الدفع عبر الإنترنت أو في المستشفى", + "payLater": "ادفع لاحقًا", + "askDocNotAllowed": "هذه الخدمة ستكون متاحة فقط لزيارة الطبيب قبل 15 يومًا", + "moreVerify": "خيارات تحقق إضافية", + "welcomeBack": "مرحبًا بعودتك!", + "accountInfo": "هل ترغب في تسجيل الدخول باستخدام اسم المستخدم الحالي؟", + "anotherAcc": "استخدم حسابًا آخر", + "next": "التالي", + "firstName": "الاسم الأول", + "middleName": "اسم الأب", + "lastName": "اسم العائلة", + "female": "أنثى", + "male": "ذكر", + "preferredLanguage": "اللغة المفضلة *", + "locationsRegister": "أين ترغب في إنشاء هذا الملف؟", + "ksa": "السعودية", + "dubai": "دبي", + "enterEmail": "يرجى إدخال البريد الإلكتروني", + "family": "عائلتي", + "familyTitle": "ملفات عائلتي", + "myFamily": "عائلتي", + "addNewMember": "إضافة فرد جديد للعائلة", + "sentRequests": "الطلبات المرسلة", + "recievedRequests": "الطلبات المستلمة", + "manageFiles": "إدارة ملفات العائلة", + "oxygenation": "تشبع الأكسجين", + "bodyMeasurements": "مؤشر كتلة الجسم", + "temperature": "درجة الحرارة", + "pulse": "النبض", + "respiration": "التنفس", + "bloodPressure": "ضغط الدم", + "painScale": "مقياس الألم", + "weight": "الوزن", + "height": "الطول", + "heart": "معدل ضربات القلب", + "heightUnit": "وحدة الطول", + "weightUnit": "وحدة الوزن", + "unit": "الوحدة", + "request": "طلب", + "memberName": "اسم العضو", + "switchLogin": "تبديل", + "removeMember": "إزالة", + "allowView": "السماح", + "rejectView": "رفض", + "deleteView": "حذف", + "myFamily": "عائلتي", + "approvals": "الموافقات", + "approvalNo": "رقم الموافقة:", + "companyName": "اسم الشركة:", + "receiptOn": "الإيصال على:", + "expiryDate": "تاريخ الانتهاء:", + "expiryPoints": "منتهي الصلاحية", + "expiryOn": "ينتهي في:", + "procedureName": "اسم الإجراء:", + "procedure": "الإجراء", + "procedureStatus": "حالة الإجراء: ", + "usageStatus": "حالة الاستخدام", + "unusedCount": "عدد غير المستخدم:", + "totalApproval": "إجمالي الموافقة غير المستخدمة", + "category": "الفئة: ", + "expirationDate": "تاريخ انتهاء الصلاحية: ", + "patientCard": "رقم بطاقة المريض: ", + "policyNumber": "رقم الوثيقة: ", + "seeDetails": "عرض التفاصيل", + "insuranceCards": "بطاقات التأمين", + "requestType": "نوع الطلب", + "registerInfoFamily": "كيف تود إضافة عضو جديد؟", + "removeFamilyMember": "هل تريد إزالة هذا العضو؟", + "myMedicalFile": "ملفي الطبي", + "myMedicalFileSubTitle": "جميع سجلاتك الطبية", + "viewMore": "عرض المزيد", + "homeHealthCareService": "خدمة الرعاية الصحية المنزلية", + "onlinePharmacy": "صيدلية عبر الإنترنت", + "emergencyService": "خدمة الطوارئ", + "onlinePaymentService": "خدمة الدفع عبر الإنترنت", + "offersAndPackages": "طلب تحويل عبر الإنترنت", + "comprehensiveMedicalCheckup": "فحص طبي شامل", + "hmgService": "خدمة HMG", + "viewAllHabibMedicalService": "عرض جميع خدمات حبيب الطبية", + "viewAll": "عرض الكل", + "view": "عرض", + "contactUs": "اتصل بنا", + "contactUsLocation": "ص.ب: 91877 - الرياض 11643، طريق الملك فهد - العليا - المملكة العربية السعودية", + "contactUsTime": "السبت - الأربعاء 8:00 صباحًا - 10 مساءً، الخميس 8:00 صباحًا- 8:00 مساءً، الجمعة 2:00 مساءً - 8:00 مساءً", + "viewAllWaysReachUs": "عرض جميع طرق التواصل معنا", + "medicalProfile": "الملف الطبي", + "consultation": "استشارة", + "logs": "السجلات", + "textToSpeech": "كيف يمكنني مساعدتك؟", + "locationDialogMessage": "سيساعدك السماح لتطبيق HMG بالوصول إلى موقعك في عرض المستشفيات الأقرب إليك.", + "userViewRequester": "يريد المستخدم عرض ملفك الطبي", + "userView": "يمكن للمستخدم عرض ملفك الطبي", + "parking": "موقف السيارات", + "alhabiServices": "خدمة HMG", + "parkingTitle": "خدمة السيارة، خدمة السيارة، خدمة لحفظ معلومات الموقف، العودة إليها لاحقًا، 1- من خلال النقر على (قراءة الرمز)، حفظ بيانات الموقف. 2- من خلال النقر على زر (عرض موقف سيارتي)، يظهر لك موقع السيارة في خرائط Google. 3- قراءة موضع آخر بالضغط على زر مسح بيانات الموضع.", + "parkingDescription": "خدمة المواقف هي لك لمسح موقع السيارة حتى تتمكن من العثور عليها بسهولة عند مغادرتك. انقر على زر (مسح الموقف) لحفظ موقع الموقف، ثم سيظهر زر (عرض موقفي) لإظهار الطريق إلى الموقف. إذا كنت ترغب في إعادة مسح موقف السيارة QR فقط انقر على (مسح بياناتي).", + "appointments": "المواعيد", + "all2": "الكل", + "checkinOption": "تسجيل الوصول", + "readBarcode": "قراءة الكود", + "showMyPark": "عرض الموقف", + "clearMyData": "امسح البيانات", + "floor": "الطابق:", + "gate": "البوابة:", + "building": "المبنى:", + "branch": "الفرع:", + "emergencyServices": "خدمات الطوارئ", + "nearester": "أقرب طوارئ", + "locationa": "الموقع", + "callNow": "اتصل الآن", + "ambulancerequest": "طلب إسعاف", + "requestA": "طلب", + "noBookedAppointments": "لا توجد مواعيد محجوزة", + "noConfirmedAppointments": "لا توجد مواعيد مؤكدة", + "noArrivedAppointments": "لا توجد مواعيد وصلت", + "myAppointmentsList": "المواعيد", + "myAppointments": "مواعيدي", + "radiology": "الأشعة", + "radiologySubtitle": "النتيجة", + "lab": "المختبر", + "labSubtitle": "النتائج", + "medicines": "الأدوية", + "medicinesSubtitle": "الوصفات", + "vitalSigns": "علامات حيوية", + "vitalSignsSubTitle": "التقارير", + "myMedical": "نشط", + "myMedicalSubtitle": "الأدوية", + "myDoctor": "طبيبي", + "myDoctorSubtitle": "القائمة", + "eye": "العين", + "eyeSubtitle": "القياس", + "insurance": "التأمين", + "insuranceSubtitle": "البطاقة", + "updateInsurance": "تحديث", + "updateInsuranceSubtitle": "التأمين", + "insuranceApproval": "التأمين", + "insuranceApprovalSubtitle": "الموافقات", + "allergies": "الحساسية", + "allergiesSubtitle": "القائمة", + "myVaccines": "لقاحاتي", + "myVaccinesSubtitle": "القائمة", + "medical": "طبي", + "medicalSubtitle": "التقرير", + "monthly": "شهري", + "monthlySubtitle": "التقرير", + "sick": "مريض", + "sickSubtitle": "الإجازات", + "myBalance": "رصيدي", + "myBalanceSubtitle": "الرصيد", + "patientCall": "مكالمة المريض", + "patientCallSubtitle": "الخدمة", + "smartWatches": "الساعات الذكية", + "smartWatchesSubtitle": "الاقتران", + "myTrackers": "متعقباتي", + "myTrackersSubtitle": "الخدمة", + "askYour": "اسأل", + "askYourSubtitle": "طبيبك", + "internet": "الإنترنت", + "internetSubtitle": "الاقتران", + "chatbot": "الدرد��ة الآلية", + "chatbotSubtitle": "", + "timeLine": "الخط الزمني", + "labOrders": "طلبات المختبر", + "billNo": "رقم الفاتورة:", + "prescriptions": "الوصفات", + "history": "التاريخ", + "orderNo": "رقم الطلب", + "orderDetails": "تفاصيل الطلب", + "deliveryDriverTrack": "تتبع السائق", + "deliveryLocation": "موقع التسليم", + "driver": "السائق", + "vitalSign": "علامة حيوية", + "monthlyReports": "تقارير شهرية", + "km": "كم:", + "km_": "كم", + "patientHealthSummaryReport": "تقرير ملخص صحة المريض", + "toViewTheTermsAndConditions": "لعرض الشروط والأحكام", + "clickHere": "انقر هنا", + "iAgreeToTheTermsAndConditions": "أوافق على الشروط والأحكام ", + "iAgreeToTheTermsAndConditionsSubtitle": "أوافق على الشروط والأحكام ", + "save": "حفظ", + "userAgreement": "اتفاقية المستخدم", + "updateSuccessfully": "تم التحديث بنجاح", + "checkVaccineAvailability": "تحقق من توفر اللقاح", + "myVaccinesAvailability": "توفر لقاحاتي", + "paymentService": "خدمة الدفع", + "paymentOnline": "الخدمة", + "onlineCheckIn": "تسجيل الوصول عبر الإنترنت", + "myBalances": "أرصدةي", + "myWallet": "محف��تي", + "balanceAmount": "مبلغ المحفظة", + "totalBalance": "إجمالي الرصيد", + "createAdvancedPayment": "إعادة شحن المحفظة", + "advancePayment": "دفع مسبق", + "advancePaymentLabel": "يمكنك إنشاء وإضافة دفعة مقدمة لحسابك أو حسابات أخرى.", + "fileNumber": "رقم الملف", + "amount": "المبلغ *", + "depositorEmail": "البريد الإلكتروني للودائع *", + "notes": "ملاحظات", + "selectPatientName": "اختر اسم المريض", + "selectFamilyPatientName": "أفراد العائلة", + "selectHospital": "اختر المستشفى", + "selectCity": "اختر المدينة", + "city": "المدينة", + "distance": "المسافة", + "myAccount": "حسابي", + "otherAccount": "حساب آخر", + "selectBeneficiary": "اختر المستفيد", + "confirmThePayment": "تأكيد الدفع", + "depositorName": "اسم الوديع", + "mobileNumber": "رقم الجوال", + "phoneNumber": "رقم الهاتف", + "country": "البلد", + "ok": "حسنا", + "averageWaitingTime": "متوسط وقت الانتظار:", + "waitingTime": "وقت الانتظار المتوقع:", + "waterConsumedInWeek": "الماء المستهلك في أسبوع", + "waterConsumedInMonth": "الماء المستهلك في شهر", + "theVerificationCodeExpiresIn": "ينتهي رمز التحقق في", + "pleaseEnterTheVerificationCode": "يرجى إدخال رمز التحقق المرسل إلى", + "eyeMeasurements": "قياسات العين", + "measurements": "قياسات", + "classes": "نظارات", + "contactLens": "عدسات لاصقة", + "rightEye": "العين اليمنى", + "sphere": "الكرة", + "cylinder": "الأسطوانة", + "axis": "المحور", + "prism": "الهرم", + "va": "VA", + "leftEye": "العين اليسرى", + "brand": "العلامة التجارية", + "power": "القوة", + "diameter": "القطر", + "remarks": "ملاحظات", + "activeMedications": "الأدوية النشطة", + "expDate": "تاريخ انتهاء الصلاحية النشط:", + "route": "الطريق", + "frequency": "التكرار", + "dailyQuantity": "��لكمية اليومية:", + "addReminder": "إضافة تذكير", + "cancelReminder": "إلغاء التذكير", + "reminderDes": "يرجى تحديد يوم ووقت بدء العلاج ليتم إعلامك عندما يحين وقت تناول الدواء", + "pleaseSelectAllQuestionToContinue": "يرجى الإجابة على جميع الأسئلة للمتابعة...", + "startDay": "يوم البدء", + "endDay": "يوم الانتهاء", + "days": "أيام ", + "pleaseVerify": "يرجى التحقق ", + "scheduleTime": "وقت الجدولة", + "askDoctor": "اسأل الطبيب", + "doctorResponses": "ردود الطبيب", + "ne_w": "جديد", + "all": "الكل", + "dailyWater": "فحص الماء اليومي", + "questionHere": "أدخل السؤال هنا...", + "viewDoctorResponses": "عرض ردود الطبيب", + "serviceInformationButton": "تسجيل الدخول / التسجيل", + "serviceInformationTitle": "معلومات الخدمة", + "serviceInformation": "معلومات الخدمة", + "homeHealthCare": "الرعاية الصحية المنزلية", + "noAppointmentAvailable": "لا توجد مواعيد متاحة", + "homeHealthCareText": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية، والمتابعة المستمرة والشاملة في أماكن إقامتهم لأولئك الذين لا يمكنهم الوصول إلى المرافق الصحية، مثل (تحليلات المختبر - الأشعة - التطعيمات - العلاج الطبيعي)، إلخ.", + "loginRegister": "تسجيل الدخول / التسجيل", + "orderLog": "سجل الطلب", + "infoLab": "تتيح لك هذه الخدمة عرض نتائج جميع الفحوصات المخبرية التي أجريت في مجموعة الحبيب الطبية بالإضافة إلى إرسال التقرير عبر البريد الإلكتروني.", + "infoRadiology": "تتيح لك هذه الخدمة عرض تقارير وصور الأشعة في مجموعة الحبيب الطبية بالإضافة إلى إرسال التقرير عبر البريد الإلكتروني.", + "noReviewsAvailable": "لا توجد تقييمات متاحة", + "noLocationAvailable": "لا توجد مواقع متاحة", + "orders": "الطلبات", + "lakum": "لكم", + "lakumMsg": "لا توجد تفاصيل عن النقاط", + "lakumPoint": "نقطة", + "wishlist": "قائمة الرغبات", + "products": "المنتجات", + "reviews": "التقييمات", + "brands": "العلامات التجارية", + "productDetails": "تفاصيل المنتج", + "medicationRefill": "إعادة تعبئة الدواء", + "pillReminder": "تذكير بالحبوب", + "shippingAddresses": "عناوين الشحن", + "reachUs": "تواصل معنا", + "ourLocations": "مواقعنا", + "edit": "تعديل", + "whatsApp": "واتساب", + "phone": "الهاتف", + "delete": "حذف", + "deleteAddress": "هل أنت متأكد أنك تريد الحذف", + "deletedAddres": "تم حذف العنوان", + "addAddress": "إضافة عنوان جديد", + "addNewAddress": "إضافة عنوان جديد", + "order": "طلبي", + "delivered": "تم التوصيل", + "pending": "قيد الانتظار", + "enterNameHere": "أدخل اسمك هنا", + "processing": "جاري المعالجة", + "cancelled": "ملغى", + "writeReview": "اكتب تقييمًا", + "shareReview": "شارك التقييم", + "review": " تقييمات", + "viewMedicalFile": "عرض التفاصيل", + "viewAllServices": "عرض جميع الخدمات", + "medicalFile": "الملف الطبي", + "verified": "تم التحقق", + "checkup": "فحص", + "hhcHome": "الرئيسية", + "refferal": "إحالة إلكترونية", + "refferalTitle": "إحالة إلكترونية", + "refferalSubTitle": "الخدمة", + "healthCare": "الرعاية الصحية", + "emergency": "حالة طوارئ", + "erservices": "خدمات الطوارئ", + "services2": "الخدمات", + "cantSeeProfile": "لرؤية ملفك الطبي، يرجى تسجيل الدخول أو التسجيل الآن", + "loginRegisterNow": "تسجيل الدخول أو التسجيل الآن", + "hmgPharmacy": "صيدلية HMG", + "ecommerceSolution": "حلول التجارة الإلكترونية", + "comprehensive": "شامل", + "onlineConsulting": "استشارات عبر الإنترنت", + "pendingOrder": " قيد الانتظار", + "deliveredOrder": " تم التوصيل", + "processingOrder": " جارٍ المعالجة", + "cancelledOrder": " ملغى", + "compare": " قارن", + "medicationsRefill": " إعادة تعبئة الأدوية", + "recommended": " موصى به لك", + "myPrescription": " وصفتي", + "quantity": " الكمية ", + "reviewAppointment": " مراجعة الموعد ", + "backMyAccount": "العودة إلى حسابي ", + "reviewSuccessful": "تمت مراجعة الطلب بنجاح", + "reviewShared": "تمت مشاركة تقييمك في قسم تقييم المنتج", + "reviewComment": "تساعد تقييماتك الآخرين على اختيار منتج أفضل", + "shippedMethod": "الشحن بواسطة:", + "orderDetail": "تفاصيل الطلب", + "orderSummary": "ملخص الطلب", + "subtotal": "المجموع الفرعي", + "shipping": "الشحن", + "shipBy": "الشحن بواسطة:", + "lakumPoints": "نقاط لكم", + "useLakumPoints": "استخدم نقاط لكم", + "use": "استخدم", + "proceedPay": "المتابعة للدفع", + "vat": "ضريبة القيمة المضافة (15%)", + "inclusiveVat": "(شاملة ضريبة القيمة المضافة)", + "items": "عنصر(عناصر)", + "checkOut": "الدفع", + "sar": "ريال سعودي", + "aed": "درهم إماراتي", + "payOnline": "الدفع عبر الإنترنت", + "cancelOrder": "إلغاء الطلب", + "confirmAddress": "تأكيد العنوان ", + "confirmLocation": "��أكيد الموقع ", + "conditionsHMG": "الشروط والأحكام ", + "conditions": "الشروط والأحكام لكوم", + "confirmDeleteMsg": "هل أنت متأكد! تريد الحذف ", + "confirmDelete": "حذف", + "confirmCancellation": "هل أنت متأكد! تريد إلغاء هذا الطلب ", + "orderNumber": "رقم الطلب: ", + "orderDate": "التاريخ", + "itemsNo": "عنصر(عناصر)", + "noOrder": "ليس لديك أي طلبات.", + "noResult": "لا توجد نتيجة.", + "nonRecommended": "لا توجد منتجات موصى بها.", + "termsService": "شروط الخدمة", + "beforeusing": "قبل استخدام الفحص، يرجى قراءة شروط الخدمة.", + "accept": "أقرأ وأقبل شروط الخدمة وسياسة الخصوصية", + "dataSafeInfo": "المعلومات التي تقدمها مجهولة الهوية وليست مشتركة مع أي شخص.", + "dataSafe": " بياناتك آمنة.", + "informational": "الفحص لأغراض معلوماتية وليس رأيًا طبيًا مؤهلاً", + "notUseInEmerbency": "لا تستخدم في حالات الطوارئ.", + "notUseInEmerbencyDetails": "في حالة الطوارئ الصحية، ", + "notUseInEmerbencyDetailsCall": "اتصل بأقرب رقم طوارئ على الفور", + "checkDiagnosis": "الفحص ليس تشخيصًا.", + "remeberthat": "تذكر أن", + "loginToUseService": "تحتاج إلى تسجيل الدخول لاستخدام هذه الخدمة", + "offersAndPromotions": "عروض وترويجيات خاصة", + "offers": "عروض", + "myPrescriptions": "وصفاتي", + "searchAndScanMedication": "البحث والمسح الضوئي للدواء", + "shopByBrands": "تسوق حسب العلامات التجارية", + "recentlyViewed": "تمت مشاهدته مؤخرًا", + "bestSellers": "الأكثر مبيعًا", + "deleteAllItems": "حذف جميع العناصر", + "total": "الإجمالي", + "totalWithColonRight": "الإجمالي:", + "selectAddress": "اختر العنوان", + "shippingAddress": "عنوان الشحن", + "changeAddress": "تغيير العنوان", + "selectPaymentOption": "اختر طريقة الدفع", + "selectTamaraPlan": "اختر خطة دفع تمارا", + "changeMethod": "تغيير الطريقة", + "reviewOrder": "مراجعة الطلب", + "active": "نشط", + "inactive": "غير نشط", + "balance": "الرصيد", + "gained": "المكتسب", + "consumed": "المستهلك", + "transferred": "المحول", + "riyal": "ريال", + "membersince": "عضو منذ", + "identification": "رقم الهوية", + "lakumMobile": "رقم الجوال", + "waitinggained": "انتظار المكتسب", + "expired": "منتهي", + "willBeExpired": "سينتهي", + "lakumPoint": "نقاط لكم", + "activateLAKUMAccount": "تفعيل حساب لكم", + "checkBeneficiary": "تحقق من المستفيد", + "beneficiaryName": "اسم المستفيد", + "accountActivation": "تفعيل الحساب", + "lakumTransfer": "تحويل لكم", + "acceptLbl": "قبول", + "declineLbl": "رفض", + "selectGender": "اختر الجنس", + "iAmA": "أنا ...", + "selectAge": "اختر عمرك", + "select": "اختر", + "iAm": "أنا", + "yearsOld": "سنوات", + "dragPoint": "اسحب النقطة لتغيير عمرك", + "refine": "تنقيح", + "subGroup": "مجموعة فرعية", + "max": "الحد الأقصى", + "compeleteOrderMsg": "تم تقديم الطلب بنجاح!!", + "addToCompareMsg": "لقد أضفت منتجًا إلى قائمة المقارنة", + "itInListMsg": "العنصر موجود بالفعل في القائمة", + "compareListFull": "قائمة المقارنة ممتلئة", + "addQuantity": "يجب عليك إضافة الكمية", + "addToCartMsg": "لقد أضفت منتجًا إلى عربة التسوق", + "addToWishlistMsg": "لقد أضفت منتجًا إلى قائمة الرغبات", + "notifyMeMsg": "سوف يتم إبلاغك عند توفر المنتج", + "removeFromWishlistMsg": "لقد أزلت منتجًا من قائمة الرغبات", + "min": "الحد الأدنى", + "reset": "إعادة تعيين", + "apply": "تطبيق", + "viewCategorise": "عرض جميع الفئات", + "viewSubCategorise": "عرض جميع الفئات الفرعية", + "categorise": "الفئات", + "wishList": "قائمة الرغبات", + "myAccount": "حسابي", + "cart": "عربة التسوق", + "alhabibapp": "تطبيق الحبيب", + "searchProductHere": "ابحث عن المنتج هنا", + "hhcNotAuthMsg": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية، والمتابعة المستمرة والشاملة في أماكن إقامتهم لأولئك الذين لا يمكنهم الوصول إلى المرافق الصحية، مثل (تحليلات المختبر - الأشعة - التطعيمات - العلاج الطبيعي)، إلخ.", + "email": "البريد الإلكتروني *", + "book": "احجز", + "appointmentLabel": "موعد", + "bloodType": "فصيلة الدم", + "maritalStatus": "الحالة الاجتماعية", + "general": "عام", + "profile": "ملفي", + "notifications": "إشعارات", + "notificationDetails": "تفاصيل الإشعار", + "notificationDetailsa": "تفاصيل الإشعار", + "infoMyDoctorPoints": "", + "infoMyDoctor": "تتيح لك هذه الخدمة رؤية جميع الأطباء الذين زرتهم في مجموعة الحبيب الطبية، ومن خلال هذه الخدمة:", + "infoPrescriptions": "تتيح لك هذه الخدمة عرض جميع الوصفات الطبية التي أصدرتها مجموعة الحبيب الطبية، ومن خلال هذه الخدمة، يمكنك:", + "infoMyPrescriptionPoints": "", + "infoInsuranceCards": "تتيح لك هذه الخدمة عرض جميع بطاقات التأمين التي تم تسجيلها خلال زياراتك لمجموعة الحبيب الطبية بالإضافة إلى:", + "infoInsuranceCardsPoints": "", + "infoAllergies": "تتيح لك هذه الخدمة عرض جميع أنواع الحساسية المسجلة خلال زياراتك لمجموعة الحبيب الطبية.", + "infoSickLeaves": "تتيح لك هذه الخدمة عرض جميع إجازات المرضى التي تم أخذها في مجموعة الحبيب الطبية بالإضافة إلى:", + "infoSickLeavePoints": "", + "infoApprovals": "تتيح لك هذه الخدمة عرض جميع طلبات الموافقة التي تم إرسالها إلى شركات التأمين بالإضافة إلى:", + "infoApprovalPoints": "", + "infoMonthReport": "عند تفعيل هذه الخدمة، سيقوم النظام بإرسال تقرير شهري تلقائيًا إلى البريد الإلكتروني المسجل يتضمن العلامات الحيوية والنتائج لآخر الزيارات التي تمت في مجموعة الحبيب الطبية.", + "languageSetting": "لغة الرسائل القصيرة، واتساب، ومكالمات التأكيد", + "alert": "تنبيهات", + "emailAlert": "تنبيه عبر البريد الإلكتروني", + "smsAlert": "تنبيه عبر الرسائل القصيرة", + "contactInfo": "معلومات الاتصال", + "emrgName": "اسم جهة الاتصال في حالات الطوارئ", + "emrgNo": "رقم جهة الاتصال في حالات الطوارئ", + "modes": "الأوضاع", + "vibration": "اهتزاز ردود الفعل اللمسية", + "blindModes": "أوضاع للمكفوفين جزئيًا", + "invertTheme": "عكس", + "offTheme": "إيقاف", + "dimTheme": "خافت", + "bwTheme": "أسود وأبيض", + "permissions": "إذن", + "cameraPermission": "الكاميرا", + "locationPermission": "الموقع", + "needPrescription": "يتطلب هذا المنتج وصفة طبية", + "outOfStockMsg": "لقد أضفت منتجًا غير متوفر حاليًا، يرجى إزالته!", + "noArabicLetters": "لا يُسمح باستخدام الحروف العربية", + "noOffersAvailable": "لا توجد عروض متاحة!", + "accessibility": "وضع الوصول", + "orderStatus": "حالة الطلب", + "findUs": "اعثر علينا", + "liveChat": "دردشة مباشرة", + "service": "خدمة", + "hmgServiceLabel": "خدمة HMG", + "healthWeatherIndicators": "مؤشرات الطقس الصحية", + "healthTipsBasedOnCurrentWeather": "نصائح صحية بناءً على الطقس الحالي", + "moreDetails": "المزيد من التفاصيل", + "resendOrder": "إعادة التعبئة والتوصيل", + "ports": "المنافذ", + "way": "الطريقة", + "dailyDoses": "الجرعات اليومية", + "period": "الفترة", + "duration": "المدة", + "cm": "سم", + "ft": "قدم", + "kg": "كجم", + "lb": "رطل", + "birthDate": "تاريخ الميلاد", + "dateOfBirth": "تاريخ الميلاد", + "mass": "الكتلة", + "tempC": "°م", + "bpm": "نبضة في الدقيقة", + "respirationSigns": "التنفس", + "sysDias": "SBP/DBP", + "body": "مؤشر كتلة الجسم", + "bodyString": "الجسم", + "face": "وجه", + "retouch": "روتوش", + "bikini": "بيكيني", + "totalMinutes": "إجمالي الدقائق", + "feedback": "ملاحظات", + "send": "أرسل", + "status": "الحالة", + "likeToHear": "نود سماع ملاحظاتك، ومخاوفك بشأن خدمات الرعاية الصحية وتجربة الخدمات الإلكترونية. يرجى استخدام النموذج أدناه", + "subject": "الموضوع", + "message": "رسالة", + "emptySubject": "يرجى إدخال الموضوع", + "emptyMessage": "يرجى إدخال الرسالة", + "selectAttachment": "اختر المرفق", + "complainAppo": "شكوى بخصوص الموعد", + "complainAppoAlt": "شكوى بدون موعد", + "messageType": "نوع الرسالة", + "feedbackType": "نوع الملاحظات", + "compliment": "تقدير", + "suggestion": "اقتراح", + "yourFeedback": "تم إرسال ملاحظاتك", + "selectPart": "يرجى اختيار الجزء الذي تشتك�� منه", + "number": "رقم", + "notClassified": "غير مصنف", + "selectClinic": "اختر العيادة", + "selectProject": "اختر المستشفى", + "searchItemError": "يجب أن يكون اسم العنصر أكثر من 3 أحرف", + "youCanFind": "يمكنك العثور على ", + "itemInSearch": " عنصر في البحث", + "bloodDonation": "التبرع بالدم", + "bloodDonationInfo": "من خلال هذه الخدمة، يمكنك تسجيل اسمك كمتبرع بالدم ��يث سيتواصل معك بنك الدم في مجموعة الحبيب الطبية في حالة الحاجة إلى فصيلة الدم.", + "bloodInstruction": "أدخل المعلومات المطلوبة، من أجل التسجيل في خدمة التبرع بالدم", + "viewTerms": "لعرض الشروط والأحكام", + "wantConnectHmgNetwork": "عزيزي العميل، لا يوجد وصول إلى الإنترنت، هل ترغب في الاتصال بشبكة HMG لاستخدام تطبيقنا، تأكد من أنك في نطاق شبكة HMG", + "failedToAccessHmgServices": "متصل بشبكة HMG،\n\nلكن فشل في الوصول إلى خدمات HMG", + "offerAndPackages": "عروض وباقات", + "offerAndPackagesDetails": "تتيح لك هذه الخدمة عرض جميع عروض HMG:", + "invoiceNo": "رقم الفاتورة", + "invoiceDate": "تاريخ الفاتورة", + "specialResult": "نتيجة خاصة", + "generalResult": "نتيجة عامة", + "showMoreBtn": "مخطط التدفق", + "value": "القيمة", + "report": "تقرير الأشعة", + "openRad": "فتح الصورة", + "sendCopy": "إرسال التقرير عبر البريد الإلكتروني", + "appoSurvey": "استطلاع", + "appoSurveySubtitle": "استطلاع", + "labResults": "نتائج المختبر", + "doctorRating": "تقييم الطبيب", + "good": "جيد", + "vGood": "جيد جدًا", + "excellent": "ممتاز", + "average": "متوسط", + "infoSigns": "تتيح لك هذه الخدمة عرض جميع العلامات الحيوية التي تم قياسها في مجموعة الحبيب الطبية، مثل (الطول، الوزن، مؤشر كتلة الجسم، معدل ضربات القلب، إلخ.) بالإضافة إلى عرض بعض الرسوم البيانية الإحصائية.", + "infoAdvancePayment": "تم تصميم هذه الخدمة بحيث يمكنك إيداع مبلغ مقدم إما في حسابك أو في حساب شخص آخر في مجموعة الحبيب الطبية.", + "infoMyBalance": "تتيح لك هذه الخدمة التحقق من رصيدك في جميع الفروع", + "erContant": "تظهر هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي.", + "infoAmbulance": "من خلال هذه الخدمة، يمكنك طلب الإخلاء بواسطة سيارة إسعاف، سواء من المنزل أو إلى المنزل، بالإضافة إلى مجموعة من الخدمات الأخرى", + "infoMyAppointments": "تتيح لك هذه الخدمة رؤية جميع المواعيد التي زرتها في مجموعة الحبيب الطبية، ومن خلال هذه الخدمة:", + "infoTodo": "تم تصميم هذه الخدمة لتمكينك من الحصول على رابط سريع لقائمة المهام التي تحتاج إلى القيام بها", + "familyInfo": "من خلال هذه الخدمة، ستتمكن من ربط ملفات عائلتك الطبية بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.", + "rrtdDetails": "تقدم فريق الاستجابة السريعة خدمة طبية شاملة لجميع أنواع الحالات العاجلة والمستقرة من جميع الأعمار، بما في ذلك البالغين والمرضى الأطفال، وتغطي الخدمة فريق طبي مدرب تدريبًا عاليًا ومجهز تجهيزًا كاملاً قادرًا على تقديم أفضل رعاية طبية في منزل المريض.", + "homeHealthCareText": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية، والمتابعة المستمرة والشاملة في أماكن إقامتهم لأولئك الذين لا يمكنهم الوصول إلى المرافق الصحية، مثل (تحليلات المختبر - الأشعة - التطعيمات - العلاج الطبيعي)، إلخ.", + "onlineCheckInAgreement": "تسجيل الوصول عبر الإنترنت مخصص للحال��ت التي لا تهدد الحياة. اتصل بالهلال الأحمر (997) أو اذهب إلى أقرب قسم طوارئ إذا كان هناك: \n\nعلامات السكتة الدماغية أو النوبة القلبية \nhالة من النوبات أو الإغماء \nهناك إصابة تهدد الطرف أو الحياة \nصورة لإصابات خطيرة", + "infoEreferral": "تتيح لك هذه الخدمة تقديم طلب إحالة من أي مقدم رعاية صحية سواء داخل أو خارج المملكة العربية السعودية إلى أي من مستشفيات HMG، عن طريق ملء بعض بيانات المريض وإرفاق التقارير الطبية، علاوة على ذلك يمكنك تتبع حالة الطلب (قيد المعالجة، مقبول أو مرفوض)", + "erConsultation": "تتيح لك هذه الخدمة إجراء استشارة افتراضية عبر الإنترنت عبر مكالمة فيديو مباشرة مع الطبيب من أي مكان وفي أي وقت.", + "myInvoice": "القائمة", + "invoiceList": "فواتيري", + "thisItemIsNotAvailable": "هذا العنصر غير متوفر", + "beforeAfterImages": "صور قبل وبعد", + "clinicAcceptLivecare": "لا حاجة للانتظار أو الزيارة يمكنك الآن الحصول على استشارة طبية عبر مكالمة فيديو (خدمة الرعاية الحية) في اسم العيادة وسيتصل بك الطبيب على الور", + "livecareModalTop": "تقبل هذه العيادة خدمات الرعاية الحية", + "livecarePoint2": "��يتصل بك طبيب متخصص", + "livecarePoint3": "سيكون لدى الطبيب القدرة على رؤية تاريخ ملفك الطبي الكامل", + "livecarePoint4": "تتوفر خدمة توصيل الأدوية المجانية", + "livecarePoint5": "لا حاجة للزيارة، الخدمة في مكانك", + "bookImmediateLivecare": "أوافق على الحصول على الخدمة على الفور", + "bookVideoLivecare2": "لا أحتاج لزيارة العيادة", + "noThankyou": "لا شكرًا", + "visitClinic": "جدولة موعد مع الطبيب", + "generateCovidCertificate": "إصدار شهادة كوفيد-19", + "isReportOutsideKsa": "هل الشهادة مطلوبة خارج المملكة العربية السعودية؟", + "passportNumber": "رقم جواز السفر", + "enterPassportNumber": "يرجى تأكيد أو تحديث رقم جواز السفر الخاص بك:", + "validPassportNumber": "يرجى إدخال رقم جواز سفر صالح", + "continuePlan": "متابعة خطة العلاج؟", + "aboutApp": "حول التطبيق", + "dontHaveAccount": "ليس لديك حساب؟", + "loginOrRegister": "تسجيل الدخول أو التسجيل", + "myFiles": "ملفاتي", + "resultsPending": "النتائج معلقة", + "resultsAvailable": "النتائج متاحة", + "viewReport": "عرض التقرير", + "checkAvailability": "التحقق من التوفر", + "readInstructions": "قراءة التعليمات", + "searchLabReport": "ابحث عن تقرير المختبر", + "prescriptionDeliveryError": "هذه العيادة لا تدعم إعادة التعبئة والتسليم.", + "receiveOtpToast": "أين تود تلقي رمز التحقق OTP؟", + "enterPhoneNumber": "أدخل رقم الهاتف", + "enterEmailDesc": "أدخل عنوان بريدك الإلكتروني لإكمال عملية إنشاء ملف طبي", + "enterPhoneDesc": "أدخل رقم هاتفك لتلقي رمز التحقق ", + "pleaseChooseOption": "الرجاء اختيار من الخيارات أدناه لتلقي رمز التحقق OTP", + "prepareToElevate": "هل أنت مستعد لتحسين صحتك ورفاهتك؟", + "iAcceptTermsConditions": "أوافق على الشروط والأحكام", + "alreadyHaveAccount": "هل لديك حساب بالفعل؟", + "loginNow": "تسجيل الدخول الآن", + "notice": "إشعار", + "oR": "أو", + "sendOTPWHATSAPP": "أرسل لي OTP عبر واتساب", + "sendOTPSMS": "أرسل لي OTP عبر الرسائل القصيرة", + "fullName": "الاسم الكامل", + "married": "متزوج", + "uae": "الإمارات العربية المتحدة", + "malE": "ذكر", + "loginBy": "تسجيل الدخول بواسطة", + "loginByOTP": "تسجيل الدخول بواسطة OTP", + "guest": "زائر", + "switchAccount": "تبديل الحساب", + "lastLoginBy": "آخر تسجيل دخول بواسطة", + "allSet": "جاهز! الآن يمكنك تسجيل الدخول باستخدام Face ID / Biometric أو البصمة", + "enableQuickLogin": "تمكين تسجيل الدخول السريع", + "enableMsg": "تمكين تسجيل الدخول السريع سيسمح بالتحقق من خلال Face ID / Biometric الخاص بجهازك الحالي", + "notNow": "ليس الآن", + "pendingActivation": "في انتظار التنشيط", + "awaitingApproval": "انتظر القبول", + "news": "أخبار", + "ready": "جاهز", + "enterValidNationalId": "الرجاء إدخال رقم الهوية الوطنية أو رقم الملف الصحيح", + "enterValidPhoneNumber": "الرجاء إدخال رقم هاتف صالح", + "medicalCentersWithCount": "{count} مراكز طبية", + "medicalCenters": "مراكز طبية", + "hospitalsWithCount": "{count} مستشفيات", + "selectRegion": "اختر المنطقة", + "selectFacility": "اختر المرافق", + "selectFacilitiesSubTitle": "يرجى اختيار المرفق للموعد", + "selectHospitalSubTitle": "يرجى اختيار المستشفى للموعد", + "iAcceptThe": "أوافق على", + "personalDetailsVerification": "التحقق من التفاصيل الشخصية", + "otpVerification": "التحقق من OTP", + "weHaveSendOTP": "لقد أرسلنا OTP إلى", + "via": "عبر", + "forRegistrationVerification": "للتحقق من التسجيل", + "didntReceiveIt": "لم تستلمه؟", + "resendOTP": "إعادة إرسال", + "resendIn": "إعادة الإرسال في", + "pleaseEnterAnationalID": "يرجى إدخال رقم الهوية الوطنية", + "pleaseEnterAFileNumber": "يرجى إدخال رقم الملف", + "pleaseEnterAValidEmail": "يرجى إدخال بريد إلكتروني صالح", + "pleaseEnterFullName": "يرجى إدخال الاسم الكامل", + "pleaseAcceptTermsConditions": "يرجى قبول الشروط والأحكام", + "pleaseEnterAValidIqamaID": "يرجى إدخال رقم إقامة صالح", + "pleaseEnterAValidNationalID": "يرجى إدخال رقم هوية وطنية صالح", + "pleaseEnterAValidDateOfBirth": "يرجى إدخال تاريخ ميلاد صالح", + "pleaseEnterAValidName": "يرجى إدخال اسم صالح", + "pleaseSelectAGender": "يرجى اختيار الجنس", + "pleaseSelectAMaritalStatus": "يرجى اختيار الحالة الاجتماعية", + "pleaseSelectACountry": "يرجى اختيار الدولة", + "pleaseEnterEmail": "يرجى إدخال البريد الإلكتروني", + "pleaseEnterAValidEmailFormat": "يرجى إدخال تنسيق بريد إلكتروني صالح", + "selectCountry": "اختر الدولة", + "forLoginVerification": "للتحقق من تسجيل الدخول", + "searchHospital": "بحث في المستشفى", + "skip": "تخطي", + "getStarted": "ابدأ الآن", + "onboardingHeading1": "حجز المواعيد لم يكن أسهل من قبل", + "onboardingBody1": "ببضع نقرات فقط يمكنك استشارة الطبيب الذي تختاره.", + "onboardingHeading2": "الوصول إلى السجل الطبي بين يديك", + "onboardingBody2": "تتبع تاريخك الطبي بما في ذلك الفحوصات المخبرية، الوصفات الطبية، التأمين، وغيرها.", + "hmgHospitals": "مستشفيات HMG", + "hmcMedicalClinic": "مراكز HMC الطبية", + "applyFilter": "تطبيق الفلتر", + "facilityAndLocation": "المرفق والموقع", + "regionAndLocation": "المنطقة والمواقع", + "clearAllFilters": "مسح جميع الفلاتر", + "filters": "فلاتر", + "searchClinic": "بحث عن عيادة", + "normal": "عادي", + "attention": "انتباه", + "monitor": "مراقبة", + "noSpecialResult": "لا توجد نتائج خاصة", + "setTheDateRange": "تعيين النطاق الزمني", + "historyFlowchart": "مخطط تدفق التاريخ", + "to": "إلى", + "startDate": "تاريخ البدء", + "endDate": "تاريخ الانتهاء", + "walkin": "زيارة بدون موعد", + "laserClinic": "عيادة الليزر", + "continueString": "يكمل" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 4df77b3..7b8c4b8 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1,9 +1,877 @@ { "english": "English", - "arabic": "عربي", + "arabic": "Arabic", "login": "Login", "noDataAvailable": "No Data Available", "confirm": "Confirm", - "ok": "OK", - "loadingText": "Loading, please wait..." + "loadingText": "Loading, please wait...", + "kilometerUnit": "KM", + "dashboardScreenToolbarTitle": "Home", + "settings": "Settings", + "language": "App Language", + "lanEnglish": "English", + "lanArabic": "العربية", + "cancel": "Cancel", + "done": "Done", + "replay2": "Replay", + "home": "Home", + "services": "SERVICES", + "mySchedule": "My Schedule", + "logout": "Logout", + "respirationRate": "Respiration Rate", + "bookAppo": "Book Appointment", + "searchBy": "Search By:", + "clinic": "Clinic", + "byClinic": "By Clinic", + "hospital": "Hospital", + "byHospital": "By Hospital", + "name": "Name", + "doctor": "Doctor", + "clinicName": "Clinic Name", + "hospitalName": "Hospital Name", + "noClinicFound": "No Clinic Found", + "doctorName": "Doctor Name", + "nearestAppo": "Nearest Appointment", + "searchByDocText": "Type the name of the doctor to help you find him", + "enterDocName": "Enter Doctor name", + "search": "Search", + "noResultFound": "No Result Found", + "noSearchResultFound": "No Result Found", + "pleaseEnterProductName": "Please Enter Product Name", + "bookNow": "Book Now", + "docInfo": "Doctor Information", + "appoInfo": "Appointment Information", + "availableAppo": "Available Appointments", + "gender": "Gender", + "nationality": "Nationality", + "neverWait": "Never wait in queue", + "reminderTitle": "You have appointment with Dr. ", + "appointmentCalendar": "Would you like to set a reminder for this appointment in your calendar?", + "appointmentSuccess": "Appointment is successfully booked", + "docQualifications": "Doctor Qualifications", + "pressAgain": "Press again to exit the app", + "laserMaxLimitReach": "Maximum limit is 90 minutes", + "confirmAppoHeading": "Kindly review your Appointment", + "patientInfo": "Patient Information", + "doctorFilter": "Doctors will be filtered based on your gender and age", + "bookSuccess": "Book Success", + "patientShare": "Patient Share", + "patientShareWithTax": "Patient Share with Tax", + "confirmAppo": "Confirm Appointment", + "confirmLiveCare": "Confirm LiveCare", + "waitingForDoctor": "Waiting for doctor", + "appointment": "Appointment", + "confirmLater": "Confirm Later", + "todoList": "Todo List", + "appoActions": "Appointment Actions", + "date": "Date", + "time": "Time", + "pendingPayment": "Pending for payment", + "payNow": "Pay Now", + "viewQR": "View QR Code", + "instruction": "Instructions", + "livecare": "LiveCare", + "livecareAppo": "LiveCare Appointment", + "agreeTo": "I agree to the", + "termsConditoins": "Terms and Conditions", + "cancelAppoMsg": "Are you sure you want to cancel this appointment?", + "changePayment": "Change Payment Method", + "upcomingNoAction": "No Action Required", + "upcomingConfirm": "Please confirm the appointment to avoid cancellation", + "bookSuccessConfirmMore2412": "The online payment process will be available 24 hours before the appointment.", + "upcomingPaymentPending": "Online Payment will be Activated before 24 Hours of Appointment Time", + "upcomingPaymentNow": "Pay Online now to avoid long waiting queue", + "upcomingQR": "Use the QR Code to Check-In in hospital", + "upcomingVirtual": "This is a virtual appointment, Please adhere to the instructions for a seamless experience.", + "upcomingLivecare": "This is a LiveCare appointment", + "upcomingDetails": "More Details", + "reschedule": "Reschedule", + "raise": "Raise", + "complaint": "Complaint", + "add": "Add", + "reminder": "Reminder", + "location": "Locations", + "online": "Online", + "payment": "الالكتروني", + "onlinePayment": "Online", + "onlinePaymentSubtitle": "Payment", + "cancelNocaps": "Cancel", + "setReminder": "Set Reminder", + "nationalIdNumber": "National ID Number", + "medicalFileNumber": "Medical File Number", + "loginregister": "Login / Register", + "poweredBy": "Powered by", + "welcome": "Welcome", + "welcomeToDrSulaiman": "Welcome to Dr. Sulaiman Al Habib Medical Group", + "patientApp": "Patient App", + "welcomeText": "Dr. Sulaiman Al Habib Mobile Application", + "drSulaimanText": "Dr. Sulaiman Al Habib", + "welcomeText2": "Have you previously visited the hospitals or medical centers of Dr. Sulaiman Al Habib?", + "yes": "Yes", + "no": "No", + "logintyperadio": " Choose from the below options to login to your medical file.", + "registernow": "Register Now", + "nationalID": "Enter the Identification Number", + "nationalId": "National ID", + "fileNo": "File Number", + "fileno": "File No", + "forgotFileNo": "Forgot file Number?", + "forgotFileNoTitle": "Forgot medical file", + "enterNationalId": "Please enter mobile number and identification number", + "profileInfo": "Please enter profile information", + "submit": "Submit", + "forgotDesc": "Enter the mobile number to receive the Medical File Number via SMS", + "dob": "Birth Date:", + "hijriDate": "Hijri Date", + "gregorianDate": "Gregorian Date", + "verifyLoginWith": "Please choose one of the following options to verify", + "registerUser": "Register", + "verifyWithFingerprint": "Biometric", + "verifyWithFaceid": "Face ID", + "verifyWithSms": "SMS", + "verifyWithWhatsapp": "Whatsapp", + "verifyThrough": "Verify Through", + "lastLogin": "LAST LOGIN AT:", + "lastLoginWith": "VERIFICATION TYPE:", + "verifyFingerprint": "To activate the fingerprint login service, please verify data by using one of the following options.", + "searchMedicine": "Search Medicine", + "pharmaciesList": "Pharmacies List", + "searchMedicineHere": "Search Medicine Here", + "description": "Description", + "howToUse": "How to Use", + "price": "Price", + "youCanFindItIn": "You can find it in", + "pleaseEnterMedicineName": "Please Enter Medicine Name", + "verificationMessage": "Please enter the Verification Code sent to", + "validationMessage": "The verification code expires in", + "notification": "Notifications", + "appSettings": "App Settings", + "rateApp": "Rate Our App", + "before": "Before", + "minute": "Minutes", + "hour": "Hour", + "reminderSuccess": "The reminder has been added successfully", + "reminderCancelSuccess": "The reminder has been cancelled successfully", + "patientShareToDo": "Amount before tax: ", + "patientTaxToDo": "Tax amount: ", + "patientShareTotalToDo": "Total amount due: ", + "paymentMethod": "Payment Method", + "noNeedToWaitInLine": "No need to stand in line.", + "useQRAppoAttend": "Use the QR code to register the appointment attendance.", + "passQRAppoAttend": "Pass the QR code through the attendance devices available in the Hospital.", + "sitWaitingQR": "Sit in the waiting rooms until called by the nurse.", + "attendRegisterCode": "Attendance registration code", + "scanQRHospital": "Approach the Online Check-In board in the hospital & scan via NFC or QR Code to Check-In", + "scanNFC": "Scan NFC to Check-In", + "sendEmail": "Send Email", + "success": "Done successfully", + "emailSentSuccessfully": "Email Sent Successfully", + "emailSentError": "Error Sending Email", + "close": "Close", + "closeIt": "Close", + "booked": "Booked", + "confirmed": "Confirmed", + "arrived": "Arrived", + "payNowBookSuccess": "Pay now via Al Habib App", + "payNowBookSuccesstext1": "Pay Now using online payment service from secure payment gateways", + "payNowBookSuccesstext2": "You can also Pay Later via online payment or in Hospital", + "payLater": "Pay Later", + "askDocNotAllowed": "This service will be available for last 15 days’ doctor Visit only", + "moreVerify": "More Verification Options", + "welcomeBack": "Welcome back!", + "accountInfo": "Would you like to login with current username?", + "anotherAcc": "Use Another Account", + "next": "Next", + "firstName": "First Name", + "middleName": "Middle Name", + "lastName": "Last Name", + "female": "Female", + "male": "Male", + "preferredLanguage": "Preferred Language *", + "locationsRegister": "Where do you want to create this file?", + "ksa": "KSA", + "dubai": "Dubai", + "enterEmail": "Please Enter Email", + "family": "My Family", + "familyTitle": "My Family Files", + "addNewMember": "Add Family Member", + "sentRequests": "Sent Requests", + "recievedRequests": "Recieved Requests", + "manageFiles": "Manage Family Files", + "oxygenation": "Oxygenation", + "bodyMeasurements": "body Mass Index", + "temperature": "Temperature", + "pulse": "Pulse", + "respiration": "Respiration", + "bloodPressure": "Blood Pressure", + "painScale": "Pain Scale", + "weight": "Weight", + "height": "Height", + "heart": "Heart Rate", + "heightUnit": "height unit", + "weightUnit": "Weight Unit", + "unit": "Unit", + "request": "Request", + "memberName": "Member Name", + "switchLogin": "Switch", + "removeMember": "Remove", + "allowView": "Allow", + "rejectView": "Reject", + "deleteView": "Delete", + "myFamily": "MY FAMILY", + "approvals": "Approvals", + "approvalNo": "Approval No:", + "companyName": "Company Name:", + "receiptOn": "Receipt on:", + "expiryDate": "Expiry Date:", + "expiryPoints": "Expired", + "expiryOn": "Expiry on:", + "procedureName": "Procedure Name:", + "procedure": "Procedure", + "procedureStatus": "Procedure Status: ", + "usageStatus": "Usage Status", + "unusedCount": "Unused Count:", + "totalApproval": "Total approval unused", + "category": "Category: ", + "expirationDate": "Expiration Date: ", + "patientCard": "Patient Card ID: ", + "policyNumber": "Policy Number: ", + "seeDetails": "SEE DETAILS", + "insuranceCards": "Insurance Cards", + "requestType": "Request Type", + "registerInfoFamily": "How would like to add the new member?", + "removeFamilyMember": "Remove this member?", + "myMedicalFile": "My Medical File", + "myMedicalFileSubTitle": "All your medical records", + "viewMore": "View More", + "homeHealthCareService": "Home Health Care Service", + "onlinePharmacy": "Online Pharmacy", + "emergencyService": "Emergency Service", + "onlinePaymentService": "Online Payment Service", + "offersAndPackages": "Online transfer request", + "comprehensiveMedicalCheckup": "Comprehensive Medical Check-up", + "hmgService": "HMG Service", + "viewAllHabibMedicalService": "View All Habib Medical Service", + "viewAll": "View All", + "view": "View", + "contactUs": "Contact Us", + "contactUsLocation": "P.O.Box: 91877 - Riyadh 11643, King Fahad Road - Olaya - Kingdom of Saudi Arabia", + "contactUsTime": "Saturday - Wednesday 8:00 AM - 10 PM, Thursday 8:00 AM- 8:00 PM, Friday 2:00 PM - 8:00 PM", + "viewAllWaysReachUs": "View All Ways Reach Us", + "medicalProfile": "Medical Profile", + "consultation": "Consultation", + "logs": "Logs", + "textToSpeech": "How May I Help You?", + "locationDialogMessage": "Allow the HMG app to access your location will assist you in showing the hospitals according to the nearest to you.", + "userViewRequester": "User Wants to View Your Medical File", + "userView": "User Can View Your Medical File", + "parking": "Parking", + "alhabiServices": "HMG Service", + "parkingTitle": "Car service, car service, service to save parking information, return to it later, 1- By clicking on (Read the code), save the parking data. 2- By clicking on the button (view my car park), it shows you the car’s location in Google Maps. 3- Read another position by pressing the Clear Position Data button.", + "parkingDescription": "Parking service is for you to scan the car location so you can find it easy on you way out. click on (scan parking) button to save the parking location, then (show my park) button will appear to show you the way for the parking. if you want to rescan parking QR just click on (Clear My Data).", + "appointments": "Appointments", + "all2": "All", + "checkinOption": "Check-In", + "readBarcode": "قراءة الكود", + "showMyPark": "عرض الموقف", + "clearMyData": "امسح البيانات", + "floor": "Floor:", + "gate": "Gate:", + "building": "Building:", + "branch": "Branch:", + "emergencyServices": "Emergency Services", + "nearester": "Nearest ER", + "locationa": "Location", + "callNow": "Call now", + "ambulancerequest": "Ambulance", + "requestA": "Request", + "noBookedAppointments": "No Booked Appointments", + "noConfirmedAppointments": "No Confirmed Appointments", + "noArrivedAppointments": "No Arrived Appointments", + "myAppointmentsList": "Appointments", + "myAppointments": "My", + "radiology": "Radiology", + "radiologySubtitle": "Result", + "lab": "Lab", + "labSubtitle": "Results", + "medicines": "Medicines", + "medicinesSubtitle": "Prescriptions", + "vitalSigns": "Vital Signs", + "vitalSignsSubTitle": "Reports", + "myMedical": "Active", + "myMedicalSubtitle": "Medications", + "myDoctor": "My Doctor", + "myDoctorSubtitle": "List", + "eye": "Eye", + "eyeSubtitle": "Measurement", + "insurance": "Insurance", + "insuranceSubtitle": "Card", + "updateInsurance": "Update", + "updateInsuranceSubtitle": "Insurance", + "insuranceApproval": "Insurance", + "insuranceApprovalSubtitle": "Approvals", + "allergies": "Allergies", + "allergiesSubtitle": "List", + "myVaccines": "My Vaccines", + "myVaccinesSubtitle": "List", + "medical": "Medical", + "medicalSubtitle": "Report", + "monthly": "Monthly", + "monthlySubtitle": "Report", + "sick": "Sick", + "sickSubtitle": "Leaves", + "myBalance": "My Balance", + "myBalanceSubtitle": "Credit", + "patientCall": "Patient Call", + "patientCallSubtitle": "Service", + "smartWatches": "Smart Watches", + "smartWatchesSubtitle": "Pairing", + "myTrackers": "My Trackers", + "myTrackersSubtitle": "Service", + "askYour": "Ask Your", + "askYourSubtitle": "Doctor", + "internet": "Internet", + "internetSubtitle": "Pairing", + "chatbot": "Chatbot", + "chatbotSubtitle": "", + "timeLine": "Timeline", + "labOrders": "Lab Orders", + "billNo": "Bill No:", + "prescriptions": "Prescriptions", + "history": "History", + "orderNo": "Order No", + "orderDetails": "Order Details", + "deliveryDriverTrack": "Driver Tracking", + "deliveryLocation": "Delivery Location", + "driver": "Driver", + "vitalSign": "Vital Sign", + "monthlyReports": "Monthly Reports", + "km": "KMs:", + "km_": "KM", + "patientHealthSummaryReport": "Patient Health Summary Report", + "toViewTheTermsAndConditions": "To View the Terms and Conditions Report", + "clickHere": "Click here", + "iAgreeToTheTermsAndConditions": "I agree to the terms and conditions ", + "iAgreeToTheTermsAndConditionsSubtitle": "I agree to the terms and conditions ", + "save": "Save", + "userAgreement": "User Agreement", + "updateSuccessfully": "Update Successfully", + "checkVaccineAvailability": "CHECK VACCINE AVAILABILITY", + "myVaccinesAvailability": "MyVaccinesAvailability", + "paymentService": "Payment Service", + "paymentOnline": "Service", + "onlineCheckIn": "Online Check-In", + "myBalances": "My Balances", + "myWallet": "My Wallet", + "balanceAmount": "Wallet Amount", + "totalBalance": "Total Balance", + "createAdvancedPayment": "Recharge Wallet", + "advancePayment": "Advance Payment", + "advancePaymentLabel": "You can create and add an Advanced Payment for your account or other accounts.", + "fileNumber": "File Number", + "amount": "Amount *", + "depositorEmail": "Depositor Email *", + "notes": "Notes", + "selectPatientName": "Select Patient Name", + "selectFamilyPatientName": "Family Members", + "selectHospital": "Select Hospital", + "selectCity": "Select City", + "city": "City", + "distance": "Distance", + "otherAccount": "Other Account", + "selectBeneficiary": "Select Beneficiary", + "confirmThePayment": "Confirm The Payment", + "depositorName": "Depositor Name", + "mobileNumber": "Mobile Number", + "phoneNumber": "Phone Number", + "country": "Country", + "ok": "Ok", + "averageWaitingTime": "Average Waiting Time:", + "waitingTime": "Expected waiting time:", + "waterConsumedInWeek": "Water consumed in a week", + "waterConsumedInMonth": "Water consumed in a month", + "theVerificationCodeExpiresIn": "The Verification Code Expires in", + "pleaseEnterTheVerificationCode": "Please enter the verification code send to", + "eyeMeasurements": "Eye Measurements", + "measurements": "قياسات", + "classes": "Glasses", + "contactLens": "Contact Lens", + "rightEye": "Right Eye", + "sphere": "Sphere", + "cylinder": "Cylinder", + "axis": "Axis", + "prism": "Prism", + "va": "VA", + "leftEye": "Left Eye", + "brand": "Brand", + "power": "Power", + "diameter": "Diameter", + "remarks": "Remarks", + "activeMedications": "Active Medications", + "expDate": "Active Exp Date :", + "route": "Route", + "frequency": "Frequency", + "dailyQuantity": "Daily Quantity :", + "addReminder": "Add Reminder", + "cancelReminder": "Cancel Reminder", + "reminderDes": "Please select treatment start day and time to be notified when it's time to take the medicine", + "pleaseSelectAllQuestionToContinue": "Please answer all questions to continue...", + "startDay": "Start Day", + "endDay": "End Day", + "days": "Days ", + "pleaseVerify": "Please Verify ", + "scheduleTime": "Schedule time", + "askDoctor": "Ask Doctor", + "doctorResponses": "Doctor Responses", + "ne_w": "New", + "all": "All", + "dailyWater": "Daily Water Check", + "questionHere": "Enter the question here...", + "viewDoctorResponses": "View Doctor Responses", + "serviceInformationButton": "LOGIN / REGISTER", + "serviceInformationTitle": "Service Information", + "serviceInformation": "Service Information", + "homeHealthCare": "Home Health Care", + "noAppointmentAvailable": "No Available Appointments", + "homeHealthCareText": "This service provides a set of home health care services, continuous and comprehensive follow-up in their places of residence for those who cannot access health facilities, such as (laboratory analyzes - radiology - vaccinations - physical therapy), etc.", + "loginRegister": "Login/Register", + "orderLog": "Order Log", + "infoLab": "This service allows you to view the results of all laboratory tests performed in Al Habib Medical Group as well as sending the report via e-mail.", + "infoRadiology": "This service allows you to view the reports and photos of radiology in Al Habib Medical Group as well as send the report by e-mail.", + "noReviewsAvailable": "No Reviews Available", + "noLocationAvailable": "No Location Available", + "orders": "Orders", + "wishlist": "Wishlist", + "products": "Products", + "reviews": "Reviews", + "brands": "Brands", + "productDetails": "Product Details", + "medicationRefill": "Medication Refill", + "pillReminder": "Pill Reminder", + "shippingAddresses": "Shipping Addresses", + "reachUs": "Reach Us", + "ourLocations": "Our Locations", + "edit": "Edit", + "whatsApp": "Whats App", + "phone": "Phone", + "delete": "Delete", + "deleteAddress": "Are you sure want to delete", + "deletedAddres": "Address has been deleted", + "addAddress": "ADD A NEW ADDRESS", + "addNewAddress": "Add New Address", + "order": "My Order", + "delivered": "Delivered", + "pending": "Pending", + "enterNameHere": "Enter Your Name", + "processing": "Processing", + "cancelled": "Cancelled", + "writeReview": "Write Review", + "shareReview": "SHARE REVIEW", + "review": " reviews", + "viewMedicalFile": "View Details", + "viewAllServices": "View All Services", + "medicalFile": "Medical File", + "verified": "Verified", + "checkup": "Checkup", + "hhcHome": "Home", + "refferal": "E-Refferal", + "refferalTitle": "E-Refferal", + "refferalSubTitle": "Service", + "healthCare": "Health Care", + "emergency": "Emergency", + "erservices": "Emergency", + "services2": "Services", + "cantSeeProfile": "To view your medical profile, please log in or register now", + "loginRegisterNow": "Login or Register Now", + "hmgPharmacy": "HMG Pharmacy", + "ecommerceSolution": "Ecommerce Solution", + "comprehensive": "Comprehensive", + "onlineConsulting": "Online Consulting", + "pendingOrder": " PENDING", + "deliveredOrder": " DELIVERED", + "processingOrder": " PROCESSING", + "cancelledOrder": " CANCELLED", + "compare": " Compare", + "medicationsRefill": " Medication Refill", + "recommended": " Recommended for You", + "myPrescription": " My Prescriptions", + "quantity": " QTY ", + "reviewAppointment": " Review Appointment ", + "backMyAccount": "BACK TO MY ACCOUNT ", + "reviewSuccessful": "Review Successful", + "reviewShared": "Your review has been shared on product review section", + "reviewComment": "Your reviews help other to choose better product", + "shippedMethod": "SHIP BY:", + "orderDetail": "Order Details", + "orderSummary": "Order Summary", + "subtotal": "Subtotal", + "shipping": "Shipping", + "shipBy": "SHIP BY:", + "lakumPoints": "Lakum Points", + "useLakumPoints": "Use Lakum points", + "use": "USE", + "proceedPay": "PROCEED TO PAY", + "vat": "VAT (15%)", + "inclusiveVat": "(inclusive VAT)", + "items": "item(s)", + "checkOut": "CHECK OUT", + "sar": "SAR", + "aed": "AED", + "payOnline": "PAY ONLINE", + "cancelOrder": "CANCEL ORDER", + "confirmAddress": "CONFIRM ADDRESS ", + "confirmLocation": "CONFIRM LOCATION ", + "conditionsHMG": "Terms & Conditions ", + "conditions": "Terms & Conditions of Lakum", + "confirmDeleteMsg": "Are you sure! want to delete ", + "confirmDelete": "DELETE", + "confirmCancellation": "Are you sure! want to cancel this order ", + "orderNumber": "Order#: ", + "orderDate": "Date", + "itemsNo": "items(s)", + "noOrder": "You Don't have any orders.", + "noResult": "No Result.", + "nonRecommended": "No Recommended Products.", + "termsService": "Terms of Service", + "beforeusing": "Before using the checkup, please read Terms of Service.", + "accept": "I read and accept Terms of Service and Privacy Policy", + "dataSafeInfo": "Information that you provide is anonymous and not shared with anyone.", + "dataSafe": " Your data is safe.", + "informational": "Checkup is for informational purposes and is not a qualified medical opinion", + "notUseInEmerbency": "Do not use in emergencies.", + "notUseInEmerbencyDetails": "In case of health emergency, ", + "notUseInEmerbencyDetailsCall": "call the nearest emergency number immediately", + "checkDiagnosis": "Checkup is not a diagnosis.", + "remeberthat": "Remember that", + "loginToUseService": "You need to login to use this service", + "offersAndPromotions": "OFFERS & SPECIAL PROMOTIONS", + "offers": "OFFERS", + "myPrescriptions": "MY PRESCRIPTIONS", + "searchAndScanMedication": "SEARCH & SCAN FOR MEDICATION", + "shopByBrands": "Shop by Brands", + "recentlyViewed": "Recently Viewed", + "bestSellers": "Best Seller", + "deleteAllItems": "Delete All Items", + "total": "Total", + "totalWithColonRight": "Total:", + "selectAddress": "Select Address", + "shippingAddress": "SHIPPING ADDRESS", + "changeAddress": "Change Address", + "selectPaymentOption": "Select Payment Option", + "selectTamaraPlan": "Select Tamara Payment Plan", + "changeMethod": "Change Method", + "reviewOrder": "Review Order", + "active": "Active", + "inactive": "InActive", + "balance": "Balance", + "gained": "GAINED", + "consumed": "Consumed", + "transferred": "Transferred", + "riyal": "RIYAL", + "membersince": "MEMBER SINCE", + "identification": "رقم الهوية", + "lakumMobile": "رقم الجوال", + "waitinggained": "Waiting gained", + "expired": "Expired", + "willBeExpired": "Will Be Expired", + "lakumPoint": "Lakum Points", + "activateLAKUMAccount": "Activate LAKUM Account", + "checkBeneficiary": "CHECK BENEFICIARY", + "beneficiaryName": "Beneficiary Name", + "accountActivation": "Account Activation", + "lakumTransfer": "Lakum Transfer", + "acceptLbl": "Accept", + "declineLbl": "Decline", + "selectGender": "Select Gender", + "iAmA": "I am a ...", + "selectAge": "Select Your Age", + "select": "Select", + "iAm": "I am", + "yearsOld": "years old", + "dragPoint": "Drag point to change your age", + "refine": "Refine", + "subGroup": "Subgroup", + "max": "Max", + "compeleteOrderMsg": "Order has been placed successfully!!", + "addToCompareMsg": "You have added a product to the Compare list", + "itInListMsg": "Item is already in the list", + "compareListFull": "Your compare list is full", + "addQuantity": "You should add quantity", + "addToCartMsg": "You have added a product to the cart", + "addToWishlistMsg": "You have added a product to the Wishlist", + "notifyMeMsg": "You will be notified when product available", + "removeFromWishlistMsg": "You have removed a product from the Wishlist", + "min": "Min", + "reset": "Reset", + "apply": "Apply", + "viewCategorise": "View All Categories", + "viewSubCategorise": "View All Sub Categories", + "categorise": "Categories", + "wishList": "WishList", + "myAccount": "My Account", + "cart": "Cart", + "alhabibapp": "Al Habib app", + "searchProductHere": "Search Product here", + "hhcNotAuthMsg": "This service provides a set of home health care services, continuous and comprehensive follow-up in their places of residence for those who cannot access health facilities, such as (laboratory analyzes - radiology - vaccinations - physical therapy), etc.", + "email": "Email *", + "book": "Book", + "appointmentLabel": "Appointment", + "bloodType": "Blood Type", + "maritalStatus": "Marital status", + "general": "General", + "profile": "ملفي", + "notifications": "إشعارات", + "notificationDetails": "تفاصيل الاشعار", + "notificationDetailsa": "تفاصيل الاشعار", + "infoMyDoctorPoints": "", + "infoMyDoctor": "This service allows you to see all the doctors you have visited in Al Habib Medical Group, and through this service:", + "infoPrescriptions": "This service allows you to view all the medical prescriptions issued by Al Habib Medical Group, and through this service, you can:", + "infoMyPrescriptionPoints": "", + "infoInsuranceCards": "This service allows you to view all the insurance cards that recorded during your visits to Al Habib Medical Group in addition to:", + "infoInsuranceCardsPoints": "", + "infoAllergies": "This service allows you to view all types of allergies recorded during your visits to Al Habib Medical Group.", + "infoSickLeaves": "This service allows you to view all sick leaves that were taken in Al Habib Medical Group in addition to:", + "infoSickLeavePoints": "", + "infoApprovals": "This service allows you to view all approvals requests that have been sent to the insurance companies in addition to:", + "infoApprovalPoints": "", + "infoMonthReport": "Upon activation of this service, the system will send a monthly report automatically to the registered email which lists the vital signs and the results for the last visits made in AlHabib Medical Group.", + "languageSetting": "SMS, WhatsApp and Confirmation Calls Language", + "alert": "Alerts", + "emailAlert": "Alert by Email", + "smsAlert": "Alert by SMS", + "contactInfo": "Contact Information", + "emrgName": "Emergency Contact Name", + "emrgNo": "Emergency Contact Number", + "modes": "Modes", + "vibration": "Vibration Touch Feedback", + "blindModes": "Modes for Partially Blind", + "invertTheme": "Invert", + "offTheme": "Off", + "dimTheme": "Dim", + "bwTheme": "Black and White", + "permissions": "Permission", + "cameraPermission": "Camera", + "locationPermission": "Location", + "needPrescription": "This product requires a prescription", + "outOfStockMsg": "You have added product which is out of stock now, Please remove that!", + "noArabicLetters": "It Is Not Allow to Use Arabic Letters", + "noOffersAvailable": "No Offers Available!", + "accessibility": "Accessibility Mode", + "orderStatus": "Order Status", + "findUs": "Find Us", + "liveChat": "Live Chat", + "service": "Service", + "hmgServiceLabel": "HMG Service", + "healthWeatherIndicators": "Health Weather Indicators", + "healthTipsBasedOnCurrentWeather": "Health Tips Based On Current Weather", + "moreDetails": "More details", + "resendOrder": "Refill and Delivery", + "ports": "Ports", + "way": "Way", + "dailyDoses": "Daily Doses", + "period": "Period", + "duration": "المدة", + "cm": "CM", + "ft": "ft", + "kg": "kg", + "lb": "lb", + "birthDate": "Birth Date", + "dateOfBirth": "Date of Birth", + "mass": "Mass", + "tempC": "°C", + "bpm": "bpm", + "respirationSigns": "Respiration", + "sysDias": "SBP/DBP", + "body": "Body Mass", + "bodyString": "Body", + "face": "Face", + "retouch": "Re-touch", + "bikini": "Bikini", + "totalMinutes": "Total Minutes", + "feedback": "Feedback", + "send": "أرسل", + "status": "الحالة", + "likeToHear": "We would love to hear the feedback, concerns on healthcare services and eServices experience. Please use the below form", + "subject": "الموضوع", + "message": "رسالة", + "emptySubject": "Please enter the subject", + "emptyMessage": "Please enter message", + "selectAttachment": "Select Attachment", + "complainAppo": "Complaint for appointment", + "complainAppoAlt": "Complaint without appointment", + "messageType": "Message Type", + "feedbackType": "Feedback Type", + "compliment": "Appreciation", + "suggestion": "Suggestion", + "yourFeedback": "Your feedback was sent", + "selectPart": "Please select the part that complain about", + "number": "Number", + "notClassified": "Not classified", + "selectClinic": "Select Clinic", + "selectProject": "Select Hospital", + "searchItemError": "Item name should be more than 3 character", + "youCanFind": "You Can Find ", + "itemInSearch": " Item in Search", + "bloodDonation": "Blood Donation", + "bloodDonationInfo": "Through this service, you can register your name as a blood donor where the blood bank in the Habib Medical Group will communicate you in case of need for blood type.", + "bloodInstruction": "Enter the required information, in order to register for Blood Donation Service", + "viewTerms": "To view the terms and conditions", + "wantConnectHmgNetwork": "Dear customer there is no internet access, do you want to connect with HMG network to use our app, make sure you are in range of HMG network", + "failedToAccessHmgServices": "Connected with HMG Network,\n\nBut failed to access HMG services", + "offerAndPackages": "Offers and Packages", + "offerAndPackagesDetails": "This service allows you to view all HMG Offers:", + "invoiceNo": "Invoice No", + "invoiceDate": "Invoice Date", + "specialResult": "Special Result", + "generalResult": "General Result", + "showMoreBtn": "Flow Chart", + "value": "Value", + "report": "Radiology Report", + "openRad": "Open Image", + "sendCopy": "Email the Report", + "appoSurvey": "Survey", + "appoSurveySubtitle": "Survey", + "labResults": "Lab Results", + "doctorRating": "Doctor Rating", + "good": "Good", + "vGood": "Very Good", + "excellent": "Excellent", + "average": "Average", + "infoSigns": "This service allows you to view all vital signs were performed in the Habib Medical Group, e.x (height, weight, body mass index, heart rate, etc.) as well shows some statistics charts.", + "infoAdvancePayment": "This service designed so that you can deposit an amount in advance either in your account or in someone else's account with Al Habib Medical Group.", + "infoMyBalance": "This service allows you to check your balance in all branchs", + "erContant": "This service displays nearest branch among all the branches of Al Habib Medical Group based on your current location.", + "infoAmbulance": "Through this service, you can request evacuation by ambulance, whether from home or to home, in addition to a set of other services", + "infoMyAppointments": "This service allows you to see all the appointment you have visited in Al Habib Medical Group, and through this service:", + "infoTodo": "This service is designed to enable you to have a quick link to the list of tasks that need to be done", + "familyInfo": "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.", + "rrtdDetails": "The Rapid response team provides a comprehensive medical service for all sorts of urgent and stable cases of all ages, including adult and paediatric patients, the service is covered by a fully equipped and highly trained medical team capable of providing the best medical care at the patient’s home.", + "onlineCheckInAgreement": "The online check-in is for non-life threatening situation. Call the red crescent (997) or go to the nearest emergency department if there are: \n\nsigns of stroke or heart attack \nhistory of seizure or syncope \nthere is limb or life threatening injury \npicture of severe injuries", + "infoEreferral": "This service allows you to submit a Referral request from any health care providers either inside or outside the kingdom of Saudi Arabia to any of HMG Hospitals, by filling some of the patient's data and attaching the medical reports, moreover you can track the request status (Under process, Accepted or Rejected)", + "erConsultation": "This service allows you to make an online virtual consultation via video call directly with the doctor from anywhere at any time.", + "myInvoice": "List", + "invoiceList": "My Invoice", + "thisItemIsNotAvailable": "This item is not available", + "beforeAfterImages": "Before & After Images", + "clinicAcceptLivecare": "No need to wait or visit You can now get medical consultation via Video call (LiveCare service) in The name of the clinic clinic and the doctor will contact you immediately", + "livecareModalTop": "This Clinic is Accepting LiveCare services", + "livecarePoint2": "A Specialized doctor will contact you", + "livecarePoint3": "A Doctor will be able to see your full medical file history", + "livecarePoint4": "Free Medicine Delivery Available", + "livecarePoint5": "No need to visit the service is in your place", + "bookImmediateLivecare": "I accept to get the service immediately", + "bookVideoLivecare2": "I don't need to visit the clinic", + "noThankyou": "No Thanks", + "visitClinic": "Schedule appointment with the doctor", + "generateCovidCertificate": "Generate Covid-19 Certificate", + "isReportOutsideKsa": "Is the certificate needed for outside KSA?", + "passportNumber": "Passport Number", + "enterPassportNumber": "Please confirm or update your passport number:", + "validPassportNumber": "Please enter valid passport number", + "continuePlan": "Continue with the treatment plan?", + "aboutApp": "About the app", + "aboutPoints": "Online Appointment Booking & rescheduling, Insurance approval status, Find A doctor, Ask your doctor, Medical prescriptions, Lab results, Hospitals contact numbers, Doctor profiles, Hospitals locations, Pharmacies Locations, Hospital's Virtual Tour, Official Social Media, Vaccines Schedule, Health Calculators, Other Services", + "termsConditions": "These Online Services Terms of Use (Service Terms) govern certain online services provided by Dr Sulaiman Al Habib Medical Services Group Company (HMG, we, us, our)...", + "receiveOtpToast": "Where would you like to receive OTP?", + "enterPhoneNumber": "Enter Phone Number", + "enterEmailDesc": "Enter your email address to complete the process of creating a medical file", + "enterPhoneDesc": "Enter your phone number to receive OTP verification code", + "pleaseChooseOption": "Please select from the below options to receive OTP", + "dontHaveAccount": "Don't have an account?", + "loginOrRegister": "Login or Register", + "myFiles": "My Files", + "resultsPending": "Results Pending", + "resultsAvailable": "Results Available", + "viewReport": "View Report", + "checkAvailability": "Check Availability", + "readInstructions": "Read Instructions", + "searchLabReport": "Search Lab Report", + "prescriptionDeliveryError": "This clinic doesn't support refill", + "prepareToElevate": "Prepared to elevate your health and well-being?", + "iAcceptTermsConditions": "I Accept the Terms and Conditions", + "alreadyHaveAccount": "Already have an account?", + "loginNow": "Login Now", + "notice": "Notice", + "oR": "OR", + "sendOTPWHATSAPP": "Send me OTP on Whatsapp", + "sendOTPSMS": "Send me OTP on SMS", + "fullName": "Full Name", + "married": "Married", + "uae": "United Arab Emirates", + "malE": "Male", + "loginBy": "Login By", + "loginByOTP": "Login By OTP", + "guest": "Guest", + "switchAccount": "Switch Account", + "allSet": "All Set! Now you can login with Face ID or Biometric", + "enableQuickLogin": "Enable Quick Login", + "enableMsg": "Enabling the quick login will verify through your existing device Face ID / Biometric", + "notNow": "Not Now", + "pendingActivation": "Pending Activation", + "awaitingApproval": "Awaiting Approval", + "enterValidNationalId": "Please enter a valid national ID or file number", + "enterValidPhoneNumber": "Please enter a valid phone number", + "ready": "Ready", + "medicalCentersWithCount": "{count} Medical Centers", + "medicalCenters": " Medical Centers", + "hospitalsWithCount": "{count} Hospitals", + "selectRegion": "Select Region", + "selectFacility": "Select Facilities", + "selectFacilitiesSubTitle": "Please select the facility for the appointment", + "selectHospitalSubTitle": "Please select the hospital for the appointment", + "news": "News", + "iAcceptThe": "I Accept the", + "personalDetailsVerification": "Personal Details Verification", + "otpVerification": "OTP Verification", + "weHaveSendOTP": "We have sent you the OTP code on", + "via": "via", + "forRegistrationVerification": "for registration verification", + "didntReceiveIt": "Didn't receive it?", + "resendOTP": "Resend", + "resendIn": "resend in", + "pleaseEnterAnationalID": "Please enter a national ID", + "pleaseEnterAFileNumber": "Please enter a file number", + "pleaseEnterAValidEmail": "Please enter a valid email", + "pleaseEnterFullName": "Please enter full name", + "pleaseAcceptTermsConditions": "Please accept the terms and conditions", + "pleaseEnterAValidIqamaID": "Please enter a valid Iqama ID", + "pleaseEnterAValidNationalID": "Please enter a valid national ID", + "pleaseEnterAValidDateOfBirth": "Please enter a valid date of birth", + "pleaseEnterAValidName": "Please enter a valid name", + "pleaseSelectAGender": "Please select a gender", + "pleaseSelectAMaritalStatus": "Please select a marital status", + "pleaseSelectACountry": "Please select a country", + "pleaseEnterEmail": "Please enter email", + "pleaseEnterAValidEmailFormat": "Please enter a valid email format", + "selectCountry": "Select Country", + "forLoginVerification": "for login verification", + "lastLoginBy": "Last login by", + "searchHospital": "Search Hospital", + "skip": "Skip", + "getStarted": "Get Started", + "onboardingHeading1": "Booking appointment has never been easy", + "onboardingBody1": "In few clicks find yourself having consultation with the doctor of your choice.", + "onboardingHeading2": "Access the medical history on finger tips", + "onboardingBody2": "Keep track on your medical history including labs, prescription, insurance, etc", + "normal": "Normal", + "attention": "Attention", + "monitor": "Monitor", + "noSpecialResult": "No Special Results", + "setTheDateRange": "Set The Date Range", + "historyFlowchart": "History FlowChart", + "to": "to", + "startDate" : "Start Date", + "endDate": "End Date", + "hmgHospitals": "HMG Hospitals", + "hmcMedicalClinic": "HMC Medical Centers", + "applyFilter": "AppLy Filter", + "facilityAndLocation": "Facility and Location", + "regionAndLocation": "Region And Locations", + "clearAllFilters": "Clear all filters", + "filters": "Filters", + "searchClinic": "Search Clinic", + "walkin": "Walk In", + "continueString": "Continue", + "laserClinic": "Laser Clinic" + } \ No newline at end of file diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..1dc6cf7 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 13.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/GoogleService-Info.plist b/ios/GoogleService-Info.plist new file mode 100644 index 0000000..633037c --- /dev/null +++ b/ios/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt + ANDROID_CLIENT_ID + 815750722565-m14h8mkosm7cnq6uh6rhqr54dn02d705.apps.googleusercontent.com + API_KEY + AIzaSyDiXnCO00li4V7Ioa2YZ_M4ECxRsu_P9tA + GCM_SENDER_ID + 815750722565 + PLIST_VERSION + 1 + BUNDLE_ID + com.HMG.HMG-Smartphone + PROJECT_ID + api-project-815750722565 + STORAGE_BUCKET + api-project-815750722565.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:815750722565:ios:328ec247a81a2ca23c186c + DATABASE_URL + https://api-project-815750722565.firebaseio.com + + \ No newline at end of file diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..9249e54 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,102 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '14.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' +# use_frameworks! :linkage => :static +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + +# pod 'OpenTok', '~> 2.22.0' +# pod 'VTO2Lib' + pod 'MapboxMaps', '10.19.0' + pod 'MapboxNavigation', '2.19.0' + pod 'FLAnimatedImage' + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + target.build_configurations.each do |build_configuration| + build_configuration.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse] + 'PERMISSION_LOCATION=1', + 'PERMISSION_CAMERA=1', + 'PERMISSION_MICROPHONE=1', + ## dart: PermissionGroup.calendar + 'PERMISSION_EVENTS_FULL_ACCESS=1', + ## dart: PermissionGroup.reminders + 'PERMISSION_REMINDERS=1', + ] + build_configuration.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64 i386' + build_configuration.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' + build_configuration.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES' + xcconfig_path = build_configuration.base_configuration_reference.real_path + xcconfig = File.read(xcconfig_path) + xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR") + File.open(xcconfig_path, "w") { |file| file << xcconfig_mod } + + if build_configuration.build_settings['WRAPPER_EXTENSION'] == 'bundle' + build_configuration.build_settings['DEVELOPMENT_TEAM'] = '3A359E86ZF' + end + if target.name == 'MapboxMobileEvents' + `xcrun -sdk iphoneos bitcode_strip -r Pods/MapboxMobileEvents/MapboxMobileEvents.xcframework/ios-arm64_armv7/MapboxMobileEvents.framework/MapboxMobileEvents -o Pods/MapboxMobileEvents/MapboxMobileEvents.xcframework/ios-arm64_armv7/MapboxMobileEvents.framework/MapboxMobileEvents` + end + + if target.name == 'MapboxCommon' + `xcrun -sdk iphoneos bitcode_strip -r Pods/MapboxCommon/MapboxCommon.xcframework/ios-arm64/MapboxCommon.framework/MapboxCommon -o Pods/MapboxCommon/MapboxCommon.xcframework/ios-arm64/MapboxCommon.framework/MapboxCommon` + end + + if target.name == 'MapboxCoreMaps' + `xcrun -sdk iphoneos bitcode_strip -r Pods/MapboxCoreMaps/MapboxCoreMaps.xcframework/ios-arm64/MapboxCoreMaps.framework/MapboxCoreMaps -o Pods/MapboxCoreMaps/MapboxCoreMaps.xcframework/ios-arm64/MapboxCoreMaps.framework/MapboxCoreMaps` + end + end + end +end + +post_integrate do |installer| + compiler_flags_key = 'COMPILER_FLAGS' + project_path = 'Pods/Pods.xcodeproj' + + project = Xcodeproj::Project.open(project_path) + project.targets.each do |target| + target.build_phases.each do |build_phase| + if build_phase.is_a?(Xcodeproj::Project::Object::PBXSourcesBuildPhase) + build_phase.files.each do |file| + if !file.settings.nil? && file.settings.key?(compiler_flags_key) + compiler_flags = file.settings[compiler_flags_key] + file.settings[compiler_flags_key] = compiler_flags.gsub(/-DOS_OBJECT_USE_OBJC=0\s*/, '') + end + end + end + end + end + project.save() +end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..2eab03a --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,730 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 478CFA942E638C8E0064F3D7 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 478CFA932E638C8E0064F3D7 /* GoogleService-Info.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B976FB9C47411C32B24D5E01 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ACE60DF9393168FD748550B3 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 478CFA932E638C8E0064F3D7 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 478CFA952E6E20A60064F3D7 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7595037DD52211B91157B0F3 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 769C9BF82E6F106D009F68A9 /* RunnerDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerDebug.entitlements; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8E12CEEB8E334EE22D5259D7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + ACE60DF9393168FD748550B3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D6BB17A036DF7FCE75271203 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B976FB9C47411C32B24D5E01 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 79DD2093A1D9674C94359FC8 /* Pods */ = { + isa = PBXGroup; + children = ( + 8E12CEEB8E334EE22D5259D7 /* Pods-Runner.debug.xcconfig */, + 7595037DD52211B91157B0F3 /* Pods-Runner.release.xcconfig */, + D6BB17A036DF7FCE75271203 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + 79DD2093A1D9674C94359FC8 /* Pods */, + A07D637C76A0ABB38659D189 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 769C9BF82E6F106D009F68A9 /* RunnerDebug.entitlements */, + 478CFA952E6E20A60064F3D7 /* Runner.entitlements */, + 478CFA932E638C8E0064F3D7 /* GoogleService-Info.plist */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + A07D637C76A0ABB38659D189 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ACE60DF9393168FD748550B3 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + BFED6CCFE59BB148875A533B /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 8372B02399CDF54531650AD4 /* [CP] Embed Pods Frameworks */, + 81DE7C26F41956799E954FCE /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 478CFA942E638C8E0064F3D7 /* GoogleService-Info.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 81DE7C26F41956799E954FCE /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 8372B02399CDF54531650AD4 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + BFED6CCFE59BB148875A533B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = 3A359E86ZF; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ejada.hmg.hmgPatientAppNew.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ejada.hmg.hmgPatientAppNew.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.ejada.hmg.hmgPatientAppNew.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = 3A359E86ZF; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = 3A359E86ZF; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..e3773d4 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..b276dd7 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,22 @@ +import Flutter +import UIKit +import FirebaseCore +import FirebaseMessaging +import GoogleMaps +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GMSServices.provideAPIKey("AIzaSyB6TERnxIr0yJ3qG4ULBZbu0sAD4tGqtng") + FirebaseApp.configure() + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } + + override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken:Data){ + Messaging.messaging().apnsToken = deviceToken + super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..dc9ada4 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..7353c41 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..797d452 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..6ed2d93 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..4cd7b00 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..fe73094 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..321773c Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..797d452 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..502f463 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..0ec3034 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..0ec3034 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..e9f5fea Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..84ac32a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..8953cba Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..0467bf1 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..c179ec6 --- /dev/null +++ b/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,38 @@ + + + + + CLIENT_ID + 815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt + ANDROID_CLIENT_ID + 815750722565-m14h8mkosm7cnq6uh6rhqr54dn02d705.apps.googleusercontent.com + API_KEY + AIzaSyDiXnCO00li4V7Ioa2YZ_M4ECxRsu_P9tA + GCM_SENDER_ID + 815750722565 + PLIST_VERSION + 1 + BUNDLE_ID + com.HMG.HMG-Smartphone + PROJECT_ID + api-project-815750722565 + STORAGE_BUCKET + api-project-815750722565.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:815750722565:ios:328ec247a81a2ca23c186c + DATABASE_URL + https://api-project-815750722565.firebaseio.com + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..8f2ef94 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,126 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Dr. Alhabib + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + FIVKIconName + AppIcon-VoIPKit + FIVKLocalizedName + VoIP-Kit + FIVKSkipRecallScreen + + FIVKSupportVideo + + LSApplicationQueriesSchemes + + comgooglemaps + baidumap + iosamap + + LSRequiresIPhoneOS + + MBXAccessToken + pk.eyJ1IjoicndhaWQiLCJhIjoiY2x5cGo4aHNjMGNsbTJyc2djempobGQxaSJ9.RCaC6WrUt4A4YnZNfxnONQ + MinimumOSVersion + 13.0 + NFCReaderUsageDescription + This app requires NFC Usage access to allow for Online CheckIn for appointments. + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsArbitraryLoadsForMedia + + NSAllowsArbitraryLoadsInWebContent + + + NSAppleMusicUsageDescription + Required by another plugin, Please let us know if you find this functionality anywhere in the app. + NSBluetoothAlwaysUsageDescription + This App requires access to Bluetooth to connect blood pressure & blood sugar devices with the app to analyze the data. + NSBluetoothPeripheralUsageDescription + This App requires access to Bluetooth to connect blood pressure & blood sugar devices with the app to analyze the data. + NSCalendarsFullAccessUsageDescription + This app requires calendar access to set reminders for Virtual & Normal Appointments. + NSCalendarsUsageDescription + This app requires calendar access to set reminders for Virtual & Normal Appointments. + NSCalendarsWriteOnlyAccessUsageDescription + This app requires calendar access to set reminders for Virtual & Normal Appointments. + NSCameraUsageDescription + This app requires camera access to enable virtual consultation between patient & doctor + NSContactsUsageDescription + This app requires contacts access to show incoming virtual consultation request. + NSFaceIDUsageDescription + This app requires Face ID to allow biometric authentication for app login. + NSHealthShareUsageDescription + This App need access to HealthKit to read heart rate & other data from your smart watch. + NSHealthUpdateUsageDescription + This App need access to HealthKit to read heart rate & other data from your smart watch. + NSLocationAlwaysAndWhenInUseUsageDescription + This App requires access to your location to show the nearest hospitals & ER Locations from your location. + NSLocationAlwaysUsageDescription + This App requires access to your location to show the nearest hospitals from your location. + NSLocationWhenInUseUsageDescription + This App requires access to your location to show the nearest hospitals from your location. + NSMicrophoneUsageDescription + This app requires microphone access to enable virtual consultation between patient & doctor + NSMotionUsageDescription + This app requires motion detection access to function properly. + NSPhotoLibraryUsageDescription + This app requires photo library access to select image as document & upload it. + NSRemindersUsageDescription + This app requires calendar access to set reminders for Virtual & Normal Appointments. + NSSpeechRecognitionUsageDescription + This app requires speech recognition access to access voice command features. + NSUserActivityTypes + + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + audio + fetch + location + remote-notification + voip + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + io.flutter.embedded_views_preview + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..319178a --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,17 @@ + + + + + aps-environment + development + com.apple.developer.in-app-payments + + merchant.com.hmgwebservices + merchant.com.hmgwebservices.uat + + com.apple.developer.nfc.readersession.formats + + TAG + + + diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart new file mode 100644 index 0000000..3d5f337 --- /dev/null +++ b/lib/core/api/api_client.dart @@ -0,0 +1,538 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/routes/app_routes.dart'; +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:http/http.dart' as http; + +import '../exceptions/api_failure.dart'; + +abstract class ApiClient { + static final NavigationService _navigationService = getIt.get(); + + Future post( + String endPoint, { + required Map body, + required Function(dynamic response, int statusCode, {int? messageStatus, String? errorMessage}) onSuccess, + required Function(String error, int statusCode, {int? messageStatus, Failure? failureType}) onFailure, + bool isAllowAny, + bool isExternal, + bool isRCService, + bool isPaymentServices, + bool bypassConnectionCheck, + }); + + Future get( + String endPoint, { + required Function(dynamic response, int statusCode) onSuccess, + required Function(String error, int statusCode) onFailure, + Map? queryParams, + bool isAllowAny, + bool isExternal, + bool isRCService, + }); + + String getSessionId(String id); + +// Future simplePost( +// String fullUrl, { +// required Map body, +// required Map headers, +// required Function(dynamic response, int statusCode) onSuccess, +// required Function(String error, int statusCode) onFailure, +// }); + +// +// Future simpleGet( +// String fullUrl, { +// Function(dynamic response, int statusCode)? onSuccess, +// Function(String error, int statusCode)? onFailure, +// Map? queryParams, +// Map? headers, +// }); +// +// Future simplePut( +// String fullUrl, { +// Map? body, +// Map? headers, +// Function(dynamic response, int statusCode)? onSuccess, +// Function(String error, int statusCode)? onFailure, +// }); +// +// Future simpleDelete( +// String fullUrl, { +// Function(dynamic response, int statusCode)? onSuccess, +// Function(String error, int statusCode)? onFailure, +// Map? queryParams, +// Map? headers, +// }); + +// Future handleUnauthorized(int statusCode, {required String forUrl}); +// Future generatePackagesToken(); +} + +class ApiClientImp implements ApiClient { + final _analytics = getIt(); + final AppState _appState; + + ApiClientImp({ + required AppState appState, + }) : _appState = appState; + + @override + post( + String endPoint, { + required Map body, + required Function(dynamic response, int statusCode, {int? messageStatus, String? errorMessage}) onSuccess, + required Function(String error, int statusCode, {int? messageStatus, Failure? failureType}) onFailure, + bool isAllowAny = false, + bool isExternal = false, + bool isRCService = false, + bool isPaymentServices = false, + bool bypassConnectionCheck = true, + }) async { + String url; + if (isExternal) { + url = endPoint; + } else { + if (isRCService) { + url = RC_BASE_URL + endPoint; + } else { + url = ApiConsts.baseUrl + endPoint; + } + } + // try { + var user = _appState.getAuthenticatedUser(); + Map headers = {'Content-Type': 'application/json', 'Accept': 'application/json'}; + if (!isExternal) { + String? token = _appState.appAuthToken; + + if (body.containsKey('SetupID')) { + body['SetupID'] = body.containsKey('SetupID') ? body['SetupID'] ?? body[''] : SETUP_ID; + } else {} + + if (body.containsKey('isDentalAllowedBackend')) { + body['isDentalAllowedBackend'] = body.containsKey('isDentalAllowedBackend') ? body['isDentalAllowedBackend'] ?? IS_DENTAL_ALLOWED_BACKEND : IS_DENTAL_ALLOWED_BACKEND; + } + + if (!body.containsKey('IsPublicRequest')) { + // if (!body.containsKey('PatientType')) { + if (user != null && user.patientType != null) { + body['PatientType'] = user.patientType; + } else { + body['PatientType'] = PATIENT_TYPE.toString(); + } + + if (user != null && user.patientType != null) { + body['PatientTypeID'] = user.patientType; + } else { + body['PatientType'] = PATIENT_TYPE_ID.toString(); + } + + // TODO : These should be from the appState + if (user != null) { + body['TokenID'] = body['TokenID'] ?? token; + body['PatientID'] = body['PatientID'] ?? user.patientId; + + body['PatientOutSA'] = body.containsKey('PatientOutSA') ? body['PatientOutSA'] ?? user.outSa : user.outSa; + body['SessionID'] = body['TokenID'] == null ? ApiConsts.sessionID : getSessionId(body['TokenID'] ?? ""); //getSe + } + // else { + // body['SessionID'] = body['TokenID'] == null ? ApiConsts.sessionID : getSessionId(body['TokenID'] ?? ""); //getSe + // + // } + } + } + + // request.versionID = VERSION_ID; + // request.channel = CHANNEL; + // request.iPAdress = IP_ADDRESS; + // request.generalid = GENERAL_ID; + // request.languageID = (languageID == 'ar' ? 1 : 2); + // request.patientOutSA = (request.zipCode == '966' || request.zipCode == '+966') ? 0 : 1; + + // body['VersionID'] = ApiConsts.appVersionID.toString(); + if (!isExternal) { + body['VersionID'] = "50.0"; + body['Channel'] = ApiConsts.appChannelId.toString(); + body['IPAdress'] = ApiConsts.appIpAddress; + body['generalid'] = ApiConsts.appGeneralId; + + body['LanguageID'] = _appState.getLanguageID().toString(); + body['Latitude'] = _appState.userLat.toString(); + body['Longitude'] = _appState.userLong.toString(); + body['DeviceTypeID'] = _appState.deviceTypeID; + if (_appState.appAuthToken.isNotEmpty) { + body[_appState.isAuthenticated ? 'TokenID' : 'LogInTokenID'] = _appState.appAuthToken; + } + + // body['TokenID'] = "@dm!n"; + // body['PatientID'] = 1231755; + // body['PatientTypeID'] = 1; + // + // body['PatientOutSA'] = 0; + // body['SessionID'] = "45786230487560q"; + } + + body.removeWhere((key, value) => value == null); + log("body: ${json.encode(body)}"); + log("uri: ${Uri.parse(url.trim())}"); + + final bool networkStatus = await Utils.checkConnection(bypassConnectionCheck: bypassConnectionCheck); + + if (!networkStatus) { + onFailure( + 'Please Check The Internet Connection 1', + -1, + failureType: ConnectivityFailure("Please Check The Internet Connection 1"), + ); + _analytics.errorTracking.log("internet_connectivity", error: "no internet available"); + return; + } + + final response = await http.post(Uri.parse(url.trim()), body: json.encode(body), headers: headers); + final int statusCode = response.statusCode; + log("response.body: ${response.body}"); + if (statusCode < 200 || statusCode >= 400) { + onFailure('Error While Fetching data', statusCode, failureType: StatusCodeFailure("Error While Fetching data")); + logApiEndpointError(endPoint, 'Error While Fetching data', statusCode); + } else { + var parsed = json.decode(utf8.decode(response.bodyBytes)); + if (isAllowAny) { + if (isPaymentServices) { + onSuccess(parsed, statusCode, messageStatus: 1, errorMessage: ""); + } else { + onSuccess(parsed, statusCode, + messageStatus: parsed.contains('MessageStatus') ? parsed['MessageStatus'] : 1, errorMessage: parsed.contains('ErrorEndUserMessage') ? parsed['ErrorEndUserMessage'] : ""); + } + } else { + if (parsed['Response_Message'] != null) { + onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); + } else { + if (parsed['ErrorType'] == 4) { + //TODO : handle app update + onFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], statusCode, failureType: AppUpdateFailure("parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']")); + logApiEndpointError(endPoint, parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], statusCode); + } + if (parsed['ErrorType'] == 2) { + // todo: handle Logout + onFailure( + parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode, + failureType: UnAuthenticatedUserFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'] ?? "User is not Authenticated", url: url), + ); + // logApiEndpointError(endPoint, "session logged out", statusCode); + } + if (isAllowAny) { + onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); + } else if (parsed['IsAuthenticated'] == null) { + if (parsed['isSMSSent'] == true) { + onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); + } else if (parsed['MessageStatus'] == 1) { + onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); + } else if (parsed['Result'] == 'OK') { + onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); + } else { + onFailure( + parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode, + failureType: MessageStatusFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']), + ); + logApiEndpointError(endPoint, parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], statusCode); + } + } else if (parsed['MessageStatus'] == 1 || parsed['SMSLoginRequired'] == true) { + onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); + } else if (parsed['IsAuthenticated'] == false) { + onFailure( + "User is not Authenticated", + statusCode, + failureType: UnAuthenticatedUserFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'] ?? "User is not Authenticated", url: url), + ); + } else if (parsed['MessageStatus'] == 2 && parsed['IsAuthenticated']) { + if (parsed['SameClinicApptList'] != null) { + onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); + } else { + if (parsed['message'] == null && parsed['ErrorEndUserMessage'] == null) { + if (parsed['ErrorSearchMsg'] == null) { + onFailure( + "Server Error found with no available message", + statusCode, + failureType: ServerFailure("Error While Fetching data"), + ); + logApiEndpointError(endPoint, "Server Error found with no available message", statusCode); + } else { + onFailure( + parsed['ErrorSearchMsg'], + statusCode, + failureType: ServerFailure("Error While Fetching data"), + ); + logApiEndpointError(endPoint, parsed['ErrorSearchMsg'], statusCode); + } + } else { + + onFailure( + parsed['message'] ?? parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode, + failureType: UserIntimationFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']), + ); + logApiEndpointError(endPoint, parsed['message'] ?? parsed['message'], statusCode); + } + } + } else { + if (parsed['SameClinicApptList'] != null) { + onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); + } else { + if (parsed['message'] != null) { + onFailure( + parsed['message'] ?? parsed['message'], + statusCode, + failureType: ServerFailure("Error While Fetching data"), + ); + logApiEndpointError(endPoint, parsed['message'] ?? parsed['message'], statusCode); + } else { + onFailure( + parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode, + failureType: ServerFailure("Error While Fetching data"), + ); + logApiEndpointError(endPoint, parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], statusCode); + } + } + } + } + } + } + // } catch (e, stackTrace) { + // _loggerService.errorLogs(stackTrace.toString()); + // if (e.toString().contains("ClientException")) { + // onFailure('ClientException: Something went wrong, Please try again', -1, failureType: InvalidCredentials('ClientException: Something went wrong, plase try again')); + // _analytics.errorTracking.log("internet_connectivity", error: "no internet available"); + // } else { + // onFailure(e.toString(), -1); + // } + // _analytics.errorTracking.log(endPoint, error: "api exception: $e - API Path: $url"); + // } + } + + logout() async { + ApiClient._navigationService.pushAndReplace(AppRoutes.landingScreen); + } + + @override + get(String endPoint, + {required Function(dynamic response, int statusCode) onSuccess, + required Function(String error, int statusCode) onFailure, + Map? queryParams, + bool isAllowAny = false, + bool isExternal = false, + bool isRCService = false}) async { + String url; + if (isExternal) { + url = endPoint; + } else { + if (isRCService) { + url = RC_BASE_URL + endPoint; + } else { + url = BASE_URL + endPoint; + } + } + if (queryParams != null) { + String queryString = Uri(queryParameters: queryParams).query; + url += '?$queryString'; + } + + debugPrint("URL : $url"); + // print("Body : ${json.encode(body)}"); + + if (await Utils.checkConnection()) { + final response = await http.get( + Uri.parse(url.trim()), + headers: {'Content-Type': 'application/json', 'Accept': 'application/json'}, + ); + final int statusCode = response.statusCode; + // print("statusCode :$statusCode"); + + if (statusCode < 200 || statusCode >= 400) { + onFailure('Error While Fetching data', statusCode); + logApiEndpointError(endPoint, 'Error While Fetching data', statusCode); + } else { + var parsed = json.decode(utf8.decode(response.bodyBytes)); + onSuccess(parsed, statusCode); + } + } else { + onFailure('Please Check The Internet Connection', -1); + _analytics.errorTracking.log("internet_connectivity", error: "no internet available"); + } + } + + // @override + // simplePost( + // String fullUrl, { + // required Map body, + // required Map headers, + // required Function(dynamic response, int statusCode) onSuccess, + // required Function(String error, int statusCode) onFailure, + // }) async { + // String url = fullUrl; + // // print("URL Query String: $url"); + // // print("body: $body"); + // + // if (await Utils.checkConnection()) { + // headers!.addAll({'Content-Type': 'application/json', 'Accept': 'application/json'}); + // final response = await http.post( + // Uri.parse(url.trim()), + // body: json.encode(body), + // headers: headers, + // ); + // final int statusCode = response.statusCode; + // // print("statusCode :$statusCode"); + // if (await handleUnauthorized(statusCode, forUrl: fullUrl)) { + // simplePost(fullUrl, onFailure: onFailure, onSuccess: onSuccess, body: body, headers: headers); + // } + // + // // print(response.body.toString()); + // + // if (statusCode < 200 || statusCode >= 400) { + // onFailure!('Error While Fetching data', statusCode); + // logApiFullUrlError(fullUrl, 'Error While Fetching data', statusCode); + // } else { + // onSuccess!(response.body.toString(), statusCode); + // } + // } else { + // onFailure!('Please Check The Internet Connection', -1); + // _analytics.errorTracking.log("internet_connectivity", error: "no internet available"); + // } + // } + + // simpleGet(String fullUrl, + // {Function(dynamic response, int statusCode)? onSuccess, + // Function(String error, int statusCode)? onFailure, + // Map? queryParams, + // Map? headers}) async { + // headers = headers ?? {}; + // String url = fullUrl; + // + // var haveParams = (queryParams != null); + // if (haveParams) { + // String queryString = Uri(queryParameters: queryParams).query; + // url += '?$queryString'; + // // print("URL Query String: $url"); + // } + // + // if (await Utils.checkConnection()) { + // headers.addAll({'Content-Type': 'application/json', 'Accept': 'application/json'}); + // final response = await http.get( + // Uri.parse(url.trim()), + // headers: headers, + // ); + // + // final int statusCode = response.statusCode; + // // print("statusCode :$statusCode"); + // if (await handleUnauthorized(statusCode, forUrl: fullUrl)) + // simpleGet(fullUrl, onFailure: onFailure, onSuccess: onSuccess, headers: headers, queryParams: queryParams); + // + // if (statusCode < 200 || statusCode >= 400) { + // onFailure!('Error While Fetching data', statusCode); + // logApiFullUrlError(fullUrl, 'Error While Fetching data', statusCode); + // } else { + // onSuccess!(response.body.toString(), statusCode); + // } + // } else { + // onFailure!('Please Check The Internet Connection', -1); + // _analytics.errorTracking.log("internet_connectivity", error: "no internet available"); + // } + // } + + // simplePut(String fullUrl, + // {Map? body, + // Map? headers, + // Function(dynamic response, int statusCode)? onSuccess, + // Function(String error, int statusCode)? onFailure}) async { + // String url = fullUrl; + // // print("URL Query String: $url"); + // + // if (await Utils.checkConnection()) { + // headers!.addAll({'Content-Type': 'application/json', 'Accept': 'application/json'}); + // final response = await http.put( + // Uri.parse(url.trim()), + // body: json.encode(body), + // headers: headers, + // ); + // + // final int statusCode = response.statusCode; + // // print("statusCode :$statusCode"); + // if (await handleUnauthorized(statusCode, forUrl: fullUrl)) + // simplePut(fullUrl, onFailure: onFailure, onSuccess: onSuccess, headers: headers, body: body); + // + // if (statusCode < 200 || statusCode >= 400) { + // onFailure!('Error While Fetching data', statusCode); + // logApiFullUrlError(fullUrl, 'Error While Fetching data', statusCode); + // } else { + // onSuccess!(response.body.toString(), statusCode); + // } + // } else { + // onFailure!('Please Check The Internet Connection', -1); + // _analytics.errorTracking.log("internet_connectivity", error: "no internet available"); + // } + // } + // + // simpleDelete(String fullUrl, + // {Function(dynamic response, int statusCode)? onSuccess, + // Function(String error, int statusCode)? onFailure, + // Map? queryParams, + // Map? headers}) async { + // String url = fullUrl; + // // print("URL Query String: $url"); + // + // var haveParams = (queryParams != null); + // if (haveParams) { + // String queryString = Uri(queryParameters: queryParams).query; + // url += '?$queryString'; + // // print("URL Query String: $url"); + // } + // + // if (await Utils.checkConnection()) { + // headers!.addAll({'Content-Type': 'application/json', 'Accept': 'application/json'}); + // final response = await http.delete( + // Uri.parse(url.trim()), + // headers: headers, + // ); + // + // final int statusCode = response.statusCode; + // // print("statusCode :$statusCode"); + // if (await handleUnauthorized(statusCode, forUrl: fullUrl)) + // simpleDelete(fullUrl, onFailure: onFailure, onSuccess: onSuccess, queryParams: queryParams, headers: headers); + // + // if (statusCode < 200 || statusCode >= 400) { + // onFailure!('Error While Fetching data', statusCode); + // logApiFullUrlError(fullUrl, 'Error While Fetching data', statusCode); + // } else { + // onSuccess!(response.body.toString(), statusCode); + // } + // } else { + // onFailure!('Please Check The Internet Connection', -1); + // _analytics.errorTracking.log("internet_connectivity", error: "no internet available"); + // } + // } + + @override + String getSessionId(String id) { + return id.replaceAll(RegExp('/[^a-zA-Z]'), ''); + } + + logApiFullUrlError(String fullUrl, error, code) { + final endpoint = Uri.parse(fullUrl).pathSegments.last; + logApiEndpointError(endpoint, error, code); + } + + logApiEndpointError(String endPoint, error, code) { + _analytics.errorTracking.log(endPoint, error: error); + } +} diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart new file mode 100644 index 0000000..29ec562 --- /dev/null +++ b/lib/core/api_consts.dart @@ -0,0 +1,858 @@ +import 'package:amazon_payfort/amazon_payfort.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; + +var MAX_SMALL_SCREEN = 660; +final OPENTOK_API_KEY = '46209962'; +// final OPENTOK_API_KEY = '47464241'; + +// PACKAGES and OFFERS +var EXA_CART_API_BASE_URL = 'https://mdlaboratories.com/offersdiscounts'; +// var EXA_CART_API_BASE_URL = 'http://10.200.101.75:9000'; +var PACKAGES_CATEGORIES = '/api/categories'; +var PACKAGES_STORES = '/api/stores'; +var PACKAGES_TOKEN = '/api/token'; +var PACKAGES_PRODUCTS = '/api/products'; +var PACKAGES_CUSTOMER = '/api/customers'; +var PACKAGES_SHOPPING_CART = '/api/shopping_cart_items'; +var PACKAGES_ORDERS = '/api/orders'; +var PACKAGES_ORDER_HISTORY = '/api/orders/items'; +var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; +// var BASE_URL = 'http://10.50.100.198:2018/'; +// var BASE_URL = 'https://uat.hmgwebservices.com/'; +var BASE_URL = 'https://hmgwebservices.com/'; +// var BASE_URL = 'http://10.201.204.103/'; +// var BASE_URL = 'https://orash.cloudsolutions.com.sa/'; +// var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; +// var BASE_URL = 'https://vidamergeuat.cloudsolutions.com.sa/'; + +// var BASE_URL = 'https://webservices.hmg.com/'; + +// var BASE_URL = 'http://10.50.100.198:4422/'; + +// Pharmacy UAT URLs +// var BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; +// var PHARMACY_BASE_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; + +// // Pharmacy Production URLs +var BASE_PHARMACY_URL = 'https://mdlaboratories.com/exacartapi/api/'; +var PHARMACY_BASE_URL = 'https://mdlaboratories.com/exacartapi/api/'; + +var PHARMACY_REDIRECT_URL = 'https://bit.ly/AlhabibPharmacy'; + +// Pharmacy VidaPlus URLs +// var BASE_PHARMACY_URL = 'https://mdlaboratories.com/exacartapitest/api/'; +// var PHARMACY_BASE_URL = 'https://mdlaboratories.com/exacartapitest/api/'; + +// // Pharmacy Pre-Production URLs +// var BASE_PHARMACY_URL = 'https://mdlaboratories.com/exacartapitest/api/'; +// var PHARMACY_BASE_URL = 'https://mdlaboratories.com/exacartapitest/api/'; + +// RC API URL +// var RC_BASE_URL = 'https://rc.hmg.com/'; + +var RC_BASE_URL = 'https://rc.hmg.com/uat/'; + +// var RC_BASE_URL = 'https://ms.hmg.com/rc/'; + +var PING_SERVICE = 'Services/Weather.svc/REST/CheckConnectivity'; + +var GET_PROJECT_LIST = 'Services/Lists.svc/REST/GetProject'; + +///Geofencing +var GET_GEO_ZONES = 'Services/Patients.svc/REST/GeoF_GetAllPoints'; +var LOG_GEO_ZONES = 'Services/Patients.svc/REST/GeoF_InsertPatientFileInfo'; + +// Delivery Driver +var DRIVER_LOCATION = 'Services/Patients.svc/REST/PatientER_GetDriverLocation'; + +//weather +var WEATHER_INDICATOR = 'Services/Weather.svc/REST/GetCityInfo'; + +var GET_PRIVILEGE = 'Services/Patients.svc/REST/Service_Privilege'; + +// Wifi Credentials +var WIFI_CREDENTIALS = "Services/Patients.svc/Hmg_SMS_Get_By_ProjectID_And_PatientID"; + +///Doctor +var GET_MY_DOCTOR = 'Services/Doctors.svc/REST/GetPatientDoctorAppointmentResult'; +var GET_DOCTOR_PROFILE = 'Services/Doctors.svc/REST/GetDocProfiles'; +var GET_DOCTOR_PRE_POST_IMAGES = 'Services/Doctors.svc/REST/GetDoctorPrePostImages'; +var GET_DOCTOR_RATING_NOTES = 'Services/Doctors.svc/REST/dr_GetNotesDoctorRating'; +var GET_DOCTOR_RATING_DETAILS = 'Services/Doctors.svc/REST/dr_GetDoctorRatingDetails'; + +var GET_DOCTOR_RATING = 'Services/Doctors.svc/REST/dr_GetAvgDoctorRating'; + +///Prescriptions +// var PRESCRIPTIONS = 'Services/Patients.svc/REST/GetPrescriptionApptList'; +var PRESCRIPTIONS = 'Services/Patients.svc/REST/GetPrescriptionApptList_Async'; + +var GET_PRESCRIPTIONS_ALL_ORDERS = 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; +var GET_PRESCRIPTION_REPORT = 'Services/Patients.svc/REST/INP_GetPrescriptionReport'; +var SEND_PRESCRIPTION_EMAIL = 'Services/Notifications.svc/REST/SendPrescriptionEmail'; +var GET_PRESCRIPTION_REPORT_ENH = 'Services/Patients.svc/REST/GetPrescriptionReport_enh'; + +///Lab Order +var GET_Patient_LAB_ORDERS = 'Services/Patients.svc/REST/GetPatientLabOrders'; +var GET_Patient_LAB_SPECIAL_RESULT = 'Services/Patients.svc/REST/GetPatientLabSpecialResults'; +var SEND_LAB_RESULT_EMAIL = 'Services/Notifications.svc/REST/SendLabReportEmail'; +var GET_Patient_LAB_RESULT = 'Services/Patients.svc/REST/GetPatientLabResults'; +var GET_Patient_LAB_ORDERS_RESULT = 'Services/Patients.svc/REST/GetPatientLabOrdersResults'; +var SEND_COVID_LAB_RESULT_EMAIL = 'Services/Notifications.svc/REST/GenerateCOVIDReport'; +var COVID_PASSPORT_UPDATE = 'Services/Patients.svc/REST/Covid19_Certificate_PassportUpdate'; +var GET_PATIENT_PASSPORT_NUMBER = 'Services/Patients.svc/REST/Covid19_Certificate_GetPassport'; +var SEND_LAB_RESULT_EMAIL_NEW = 'ReportsAPI/api/reports/labReport'; + +var UPDATE_WORKPLACE_NAME = 'Services/Patients.svc/REST/ActivateSickLeave_FromVida'; +var GET_SICKLEAVE_STATUS_ADMISSION_NO = 'Services/ChatBot_Service.svc/REST/GetSickLeaveStatusByAdmissionNo'; + +/// +var GET_PATIENT_ORDERS = 'Services/Patients.svc/REST/GetPatientRadOrders'; +var GET_PATIENT_LAB_ORDERS_BY_APPOINTMENT = 'Services/Patients.svc/REST/GetPatientLabResultsByAppointmentNo'; + +var GET_PATIENT_ORDERS_DETAILS = 'Services/Patients.svc/REST/Rad_UpdatePatientRadOrdersToRead'; +var GET_RAD_IMAGE_URL = 'Services/Patients.svc/Rest/GetRadImageURL'; +var SEND_RAD_REPORT_EMAIL = 'Services/Notifications.svc/REST/SendRadReportEmail'; + +///Feedback +var SEND_FEEDBACK = 'Services/COCWS.svc/REST/InsertCOCItemInSPList'; +var GET_STATUS_FOR_COCO = 'Services/COCWS.svc/REST/GetStatusforCOC'; +// var GET_PATIENT_AppointmentHistory = 'Services' +// '/Doctors.svc/REST/PateintHasAppoimentHistory'; + +var GET_PATIENT_APPOINTMENT_HISTORY_ASYNC = 'Services' + '/Doctors.svc/REST/PateintHasAppoimentHistory_Async'; + +///VITAL SIGN +var GET_PATIENT_VITAL_SIGN = 'Services/Doctors.svc/REST/Doctor_GetPatientVitalSign'; + +///Er Nearest +var GET_NEAREST_HOSPITAL = 'Services/Patients.svc/REST/Patient_GetProjectAvgERWaitingTime'; + +///ED Online +var ER_GET_VISUAL_TRIAGE_QUESTIONS = "services/Doctors.svc/REST/ER_GetVisualTriageQuestions"; +var ER_SAVE_TRIAGE_INFORMATION = "services/Doctors.svc/REST/ER_SaveTriageInformation"; +var ER_GetPatientPaymentInformationForERClinic = "services/Doctors.svc/REST/ER_GetPatientPaymentInformationForERClinic"; + +///Er Nearest +var GET_AMBULANCE_REQUEST = 'Services/Patients.svc/REST/PatientER_RRT_GetAllTransportationMethod'; +var GET_PATIENT_ALL_PRES_ORDERS = 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; +var GET_PICK_UP_REQUEST_BY_PRES_ORDER_ID = 'Services/Patients.svc/REST/PatientER_RRT_GetPickUpRequestByPresOrderID'; +var UPDATE_PRESS_ORDER = 'Services/Patients.svc/REST/PatientER_UpdatePresOrder'; +var INSERT_ER_INERT_PRES_ORDER = 'Services/Patients.svc/REST/PatientER_InsertPresOrder'; + +/// ER RRT +var GET_ALL_RC_TRANSPORTATION = 'api/Transportation/getalltransportation'; +var GET_ALL_TRANSPORTATIONS_RC = 'api/Transportation/getalltransportation'; +var GET_ALL_RRT_QUESTIONS = 'Services/Patients.svc/REST/PatientER_RRT_GetAllQuestions'; +var GET_RRT_SERVICE_PRICE = 'Services/Patients.svc/REST/PatientE_RealRRT_GetServicePrice'; + +var GET_ALL_TRANSPORTATIONS_ORDERS = 'api/Transportation/get'; + +var CANCEL_AMBULANCE_REQUEST = "api/Transportation/update"; + +var INSERT_TRANSPORTATION_ORDER_RC = "api/Transportation/add"; + +///FindUs +var GET_FINDUS_REQUEST = 'Services/Lists.svc/REST/Get_HMG_Locations'; + +///LiveChat +var GET_LIVECHAT_REQUEST = 'Services/Patients.svc/REST/GetPatientICProjects'; + +///babyInformation +var GET_BABYINFORMATION_REQUEST = 'Services/Community.svc/REST/GetBabyByUserID'; + +///Get Baby By User ID +var GET_BABY_BY_USER_ID = 'Services/Community.svc/REST/GetBabyByUserID'; + +///userInformation +var GET_USERINFORMATION_REQUEST = 'Services/Community.svc/REST/GetUserInformation_New'; + +///Update email +var UPDATE_PATENT_EMAIL = 'Services/Patients.svc/REST/UpdatePateintEmail'; +var UPDATE_PATENT_INFO = 'Services/Community.svc/REST/UpdateUserInfo_New'; + +///addNewChild +var GET_NEWCHILD_REQUEST = 'Services/Community.svc/REST/CreateNewBaby'; + +///newUserId +var GET_NEW_USER_REQUEST = 'Services/Community.svc/REST/CreateNewUser_New'; + +///delete Child +var DELETE_CHILD_REQUEST = 'Services/Community.svc/REST/DeleteBaby'; + +///addNewTABLE +var GET_TABLE_REQUEST = 'Services/Community.svc/REST/CreateVaccinationTable'; + +///BloodDenote +var GET_CITIES_REQUEST = 'Services/Lists.svc/REST/GetAllCities'; + +///BloodDetails +var GET_BLOOD_REQUEST = 'services/PatientVarification.svc/REST/BloodDonation_GetBloodGroupDetails'; + +var SAVE_BLOOD_REQUEST = 'Services/PatientVarification.svc/REST/BloodDonation_RegisterBloodType'; + +var GET_BLOOD_AGREEMENT = 'Services/PatientVarification.svc/REST/CheckUserAgreementForBloodDonation'; +var SAVE_BLOOD_AGREEMENT = 'Services/PatientVarification.svc/REST/AddUserAgreementForBloodDonation'; + +///Reports +var REPORTS = 'Services/Doctors.svc/REST/GetPatientMedicalReportStatusInfo'; +var INSERT_REQUEST_FOR_MEDICAL_REPORT = 'Services/Doctors.svc/REST/InsertRequestForMedicalReport'; +var SEND_MEDICAL_REPORT_EMAIL = 'Services/Notifications.svc/REST/SendMedicalReportEmail'; +var GET_INPATIENT_ADMISSIONS = 'Services/inps.svc/REST/getAdmissionForMedicalReport'; +var GET_MEDICAL_REPORT_PDF = 'Services/inps.svc/REST/getMedicalReportPDF'; + +///Rate +// var IS_LAST_APPOITMENT_RATED = 'Services/Doctors.svc/REST/IsLastAppoitmentRated'; +var IS_LAST_APPOITMENT_RATED = 'Services/Doctors.svc/REST/IsLastAppoitmentRated_Async'; +var GET_APPOINTMENT_DETAILS_BY_NO = 'Services/MobileNotifications.svc/REST/GetAppointmentDetailsByApptNo'; +var NEW_RATE_APPOINTMENT_URL = "Services/Doctors.svc/REST/AppointmentsRating_InsertAppointmentRate"; +var NEW_RATE_DOCTOR_URL = "Services/Doctors.svc/REST/DoctorsRating_InsertDoctorRate"; + +var GET_QR_PARKING = 'Services/SWP.svc/REST/GetQRParkingByID'; + +//URL to get clinic list +var GET_CLINICS_LIST_URL = "Services/lists.svc/REST/GetClinicCentralized"; +var GET_CLINICS_LIST_WRT_HOSPITAL_ID_URL = "Services/Lists.svc/REST/GetClinicFromDoctorSchedule"; + +//URL to get active appointment list +var GET_ACTIVE_APPOINTMENTS_LIST_URL = "Services/Doctors.svc/Rest/Dr_GetAppointmentActiveNumber"; + +//URL to get doctors list +var GET_DOCTORS_LIST_URL = "Services/Doctors.svc/REST/SearchDoctorsByTime"; + +//URL to dental doctors list +var GET_DENTAL_DOCTORS_LIST_URL = "Services/Doctors.svc/REST/Dental_DoctorChiefComplaintMapping"; + +//URL to get doctor free slots +var GET_DOCTOR_FREE_SLOTS = "Services/Doctors.svc/REST/GetDoctorFreeSlots"; + +//URL to insert appointment +var INSERT_SPECIFIC_APPOINTMENT = "Services/Doctors.svc/REST/InsertSpecificAppointment"; + +//URL to get patient share +var GET_PATIENT_SHARE = "Services/Doctors.svc/REST/GetCheckinScreenAppointmentDetailsByAppointmentNO"; + +//URL to get patient appointment history +var GET_PATIENT_APPOINTMENT_HISTORY = "Services/Doctors.svc/REST/PateintHasAppoimentHistory"; + +var GET_OBGYNE_ORDERS_LIST = "services/Patients.svc/REST/HIS_OBGYNEProcedureGet"; + +var GET_OBGYNE_DOCTORS_LIST = "services/Doctors.svc/REST/HIS_ObgyneUltrasoundDoctors"; + +var OBGYNE_PROCEDURE_UPDATE = "services/Patients.svc/REST/HIS_OBGYNEProcedure_Update"; + +var GET_RRT_PROCEDURE_LIST = "Services/Patients.svc/REST/GetRRTProcedureDetailsListFromVida"; + +var DOCTOR_SCHEDULE_URL = 'Services/Doctors.svc/REST/GetDoctorWorkingHoursTable'; + +var SEND_REPORT_EYE_EMAIL = "Services/Notifications.svc/REST/SendGlassesPrescriptionEmail"; + +var SEND_CONTACT_LENS_PRESCRIPTION_EMAIL = "Services/Notifications.svc/REST/SendContactLensPrescriptionEmail"; + +//URL to get patient appointment curfew history +// var GET_PATIENT_APPOINTMENT_CURFEW_HISTORY = "Services/Doctors.svc/REST/AppoimentHistoryForCurfew"; +var GET_PATIENT_APPOINTMENT_CURFEW_HISTORY = "Services/Doctors.svc/REST/AppoimentHistoryForCurfew_Async"; + +//URL to confirm appointment +var CONFIRM_APPOINTMENT = "Services/MobileNotifications.svc/REST/ConfirmAppointment"; + +var INSERT_VIDA_REQUEST = "Services/ER_VirtualCall.svc/REST/PatientER_VidaRequestInseart"; + +//URL to cancel appointment +var CANCEL_APPOINTMENT = "Services/Doctors.svc/REST/CancelAppointment"; + +//URL get appointment QR +var GENERATE_QR_APPOINTMENT = "Services/Doctors.svc/REST/GenerateQRAppointmentNo"; + +//URL send email appointment QR +var EMAIL_QR_APPOINTMENT = "Services/Notifications.svc/REST/sendEmailForOnLineCheckin"; + +//URL check payment status +var CHECK_PAYMENT_STATUS = "Services/PayFort_Serv.svc/REST/GetRequestStatusByRequestID"; + +//URL create advance payment +var CREATE_ADVANCE_PAYMENT = "Services/Doctors.svc/REST/CreateAdvancePayment"; + +var HIS_CREATE_ADVANCE_PAYMENT = "Services/Patients.svc/REST/HIS_CreateAdvancePayment"; + +var ER_CREATE_ADVANCE_PAYMENT = "services/Doctors.svc/REST/ER_CreateAdvancePaymentForClinic"; + +var ER_INSERT_ADVANCE_PAYMENT = "services/Doctors.svc/REST/ER_InsertEROnlinePaymentDetails"; + +var ADD_ADVANCE_NUMBER_REQUEST = 'Services/PayFort_Serv.svc/REST/AddAdvancedNumberRequest'; + +var GENERATE_ANCILLARY_ORDERS_INVOICE = 'Services/Doctors.svc/REST/AutoGenerateAncillaryOrderInvoice'; + +var IS_ALLOW_ASK_DOCTOR = 'Services/Doctors.svc/REST/GetPatientDoctorAppointmentResult'; +var GET_CALL_REQUEST_TYPE = 'Services/Doctors.svc/REST/GetCallRequestType_LOV'; +var ADD_VIDA_REQUEST = 'Services/ER_VirtualCall.svc/REST/PatientER_VidaRequestInseart'; + +var SEND_CALL_REQUEST = 'Services/Doctors.svc/REST/InsertCallInfo'; + +var GET_LIVECARE_CLINICS = 'Services/ER_VirtualCall.svc/REST/PatientER_GetClinics'; + +var GET_LIVECARE_SCHEDULE_CLINICS = 'Services/Doctors.svc/REST/PatientER_GetClinicsHaveSchedule'; + +var GET_LIVECARE_SCHEDULE_CLINIC_DOCTOR_LIST = 'Services/Doctors.svc/REST/PatientER_GetDoctorByClinicID'; + +var GET_LIVECARE_SCHEDULE_DOCTOR_TIME_SLOTS = 'Services/Doctors.svc/REST/PatientER_GetDoctorFreeSlots'; + +var INSERT_LIVECARE_SCHEDULE_APPOINTMENT = 'Services/Doctors.svc/REST/InsertSpecificAppoitmentForSchedule'; + +var GET_PATIENT_SHARE_LIVECARE = "Services/Doctors.svc/REST/GetCheckinScreenAppointmentDetailsByAppointmentNOForLiveCare"; + +var SET_ONLINE_CHECKIN_FOR_APPOINTMENT = "Services/Patients.svc/REST/SetOnlineCheckInForAppointment"; + +var GET_LIVECARE_CLINIC_TIMING = 'Services/ER_VirtualCall.svc/REST/PatientER_GetClinicsServiceTimingsSchedule'; + +var GET_ER_APPOINTMENT_FEES = 'Services/DoctorApplication.svc/REST/GetERAppointmentFees'; +var GET_ER_APPOINTMENT_TIME = 'Services/ER_VirtualCall.svc/REST/GetRestTime'; + +var CHECK_PATIENT_DERMA_PACKAGE = 'Services/OUTPs.svc/REST/getPatientPackageComponentsForOnlineCheckIn'; + +var ADD_NEW_CALL_FOR_PATIENT_ER = 'Services/DoctorApplication.svc/REST/NewCallForPatientER'; + +var GET_LIVECARE_HISTORY = 'Services/ER_VirtualCall.svc/REST/GetPatientErVirtualHistory'; +var CANCEL_LIVECARE_REQUEST = 'Services/ER_VirtualCall.svc/REST/DeleteErRequest'; +var SEND_LIVECARE_INVOICE_EMAIL = 'Services/Notifications.svc/REST/SendInvoiceForLiveCare'; + +var CHANGE_PATIENT_ER_SESSION = 'Services/DoctorApplication.svc/REST/ChangePatientERSession'; + +var APPLE_PAY_INSERT_REQUEST = 'Services/PayFort_Serv.svc/REST/PayFort_ApplePayRequestData_Insert'; + +var GET_USER_TERMS = 'Services/Patients.svc/REST/GetUserTermsAndConditions'; + +var TAMARA_REQUEST_INSERT = 'Services/PayFort_Serv.svc/REST/AddTamaraRequest'; + +var UPDATE_HEALTH_TERMS = 'services/Patients.svc/REST/UpdatePateintHealthSummaryReport'; + +var GET_PATIENT_HEALTH_STATS = 'Services/Patients.svc/REST/Med_GetTransactionsSts'; + +var SEND_CHECK_IN_NFC_REQUEST = 'Services/Patients.svc/REST/Patient_CheckAppointmentValidation_ForNFC'; + +var CHECK_SCANNED_NFC_QR_CODE = 'Services/Patients.svc/REST/Patient_ValidationMachine_ForNFC'; + +var HAS_DENTAL_PLAN = 'Services/Doctors.svc/REST/Dental_IsPatientHasOnGoingEstimation'; + +var LASER_BODY_PARTS = 'Services/Patients.svc/REST/Laser_GetBodyPartsByCategory'; + +var INSERT_COVID_QUESTIONNAIRE = 'Services/Doctors.svc/REST/COVID19_Questionnarie_Insert'; + +var UPDATE_COVID_QUESTIONNAIRE = 'Services/Doctors.svc/REST/COVID19_Questionnarie_Update'; + +var GET_PATIENT_SHARE_FOR_WALKIN_APPOINTMENT = 'Services/Doctors.svc/REST/GetCheckinScreenAppointmentDetailsByAppointmentNOForWalkIn'; + +var CAN_PAY_FOR_FOR_WALKIN_APPOINTMENT = 'Services/Doctors.svc/REST/CanPayForWalkinAppointment'; + +//URL to get medicine and pharmacies list +var CHANNEL = 3; +var GENERAL_ID = 'Cs2020@2016\$2958'; +var IP_ADDRESS = '10.20.10.20'; +var SETUP_ID = '91877'; +var LANGUAGE = 2; +// var PATIENT_OUT_SA = 0; +var SESSION_ID = 'TMRhVmkGhOsvamErw'; +var IS_DENTAL_ALLOWED_BACKEND = false; +var PATIENT_TYPE = 1; +var PATIENT_TYPE_ID = 1; +var DEVICE_TOKEN = ""; +var IS_VOICE_COMMAND_CLOSED = true; +var IS_TEXT_COMPLETED = false; +// var DeviceTypeID = Platform.isIOS ? 1 : 2; +// var LANGUAGE_ID = 2; + +var GET_PHARMCY_ITEMS = "Services/Lists.svc/REST/GetPharmcyItems_Region"; +var GET_PHARMACY_LIST = "Services/Patients.svc/REST/GetPharmcyList"; +var GET_PAtIENTS_INSURANCE = "Services/Patients.svc/REST/Get_PatientInsuranceDetails"; +var GET_PAtIENTS_INSURANCE_UPDATED = "Services/Patients.svc/REST/PatientER_GetPatientInsuranceCardUpdateHistory"; + +var INSURANCE_DETAILS = "Services/Patients.svc/REST/Get_InsuranceCheckList"; +var INSURANCE_SCHEMES = "Services/Patients.svc/REST/PatientER_SchemesOfAactiveCompaniesGet"; +var UPDATE_MANUAL_INSURANCE = "Services/Patients.svc/REST/PatientER_PatientInfoForInsuranceCardUpdate"; +var INSURANCE_COMPANIES = "Services/Patients.svc/REST/PatientER_InsuranceCompanyGet"; +var GET_PATIENT_INSURANCE_DETAILS = "Services/Patients.svc/REST/PatientER_GetPatientInsuranceDetails"; +var UPLOAD_INSURANCE_CARD = 'Services/Patients.svc/REST/PatientER_PatientInfoForInsuranceCardUpdate'; + +var GET_VACCINES = "Services/Patients.svc/REST/GetDoneVaccinesByPatientID"; +var GET_VACCINES_EMAIL = "Services/Notifications.svc/REST/SendVaccinesEmail"; +var GET_PAtIENTS_INSURANCE_APPROVALS = "Services/Patients.svc/REST/GetApprovalStatus_Async"; +// var GET_PAtIENTS_INSURANCE_APPROVALS = "Services/Patients.svc/REST/GetApprovalStatus"; +var SEARCH_BOT = 'HabibiChatBotApi/BotInterface/GetVoiceCommandResponse'; + +var GET_VACCINATIONS_ITEMS = "/Services/ERP.svc/REST/GET_VACCINATIONS_ITEMS"; +var GET_VACCINATION_ONHAND = "/Services/ERP.svc/REST/GET_VACCINATION_ONHAND"; + +var GET_PATIENT_SICK_LEAVE = 'Services/Patients.svc/REST/GetPatientSickLeave'; + +var GET_PATIENT_SICK_LEAVE_STATUS = 'Services/Patients.svc/REST/GetPatientSickLeave_Status'; + +var SendSickLeaveEmail = 'Services/Notifications.svc/REST/SendSickLeaveEmail'; + +var GET_PATIENT_AdVANCE_BALANCE_AMOUNT = 'Services/Patients.svc/REST/GetPatientAdvanceBalanceAmount'; +var GET_PATIENT_INFO_BY_ID = 'Services/Doctors.svc/REST/GetPatientInfoByPatientID'; +var GET_PATIENT_INFO_BY_ID_AND_MOBILE_NUMBER = 'Services/Patients.svc/REST/AP_GetPatientInfoByPatientIDandMobileNumber'; +var SEND_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = 'Services/Authentication.svc/REST/SendActivationCodeForAdvancePayment'; +var CHECK_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = 'Services/Authentication.svc/REST/CheckActivationCodeForAdvancePayment'; + +var GET_COVID_DRIVETHRU_PROJECT_LIST = 'Services/Doctors.svc/REST/COVID19_ProjectDriveThroughTestingCenter'; + +var GET_COVID_DRIVETHRU_PAYMENT_INFO = 'Services/Doctors.svc/REST/COVID19_GetPatientPaymentInormation'; + +var GET_COVID_DRIVETHRU_FREE_SLOTS = 'Services/Doctors.svc/REST/COVID19_GetFreeSlots'; + +var GET_COVID_DRIVETHRU_PROCEDURES_LIST = 'Services/Doctors.svc/REST/COVID19_GetTestProcedures'; + +///Smartwatch Integration Services +var GET_PATIENT_LAST_RECORD = 'Services/Patients.svc/REST/Med_GetPatientLastRecord'; +var INSERT_PATIENT_HEALTH_DATA = 'Services/Patients.svc/REST/Med_InsertTransactions'; + +///My Trackers +var GET_DIABETIC_RESULT_AVERAGE = 'Services/Patients.svc/REST/Patient_GetDiabeticResultAverage'; +var GET_DIABTEC_RESULT = 'Services/Patients.svc/REST/Patient_GetDiabtecResults'; +var ADD_DIABTEC_RESULT = 'Services/Patients.svc/REST/Patient_AddDiabtecResult'; + +var GET_BLOOD_PRESSURE_RESULT_AVERAGE = 'Services/Patients.svc/REST/Patient_GetBloodPressureResultAverage'; +var GET_BLOOD_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_GetBloodPressureResult'; +var ADD_BLOOD_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_AddBloodPressureResult'; + +var GET_WEIGHT_PRESSURE_RESULT_AVERAGE = 'Services/Patients.svc/REST/Patient_GetWeightMeasurementResultAverage'; +var GET_WEIGHT_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_GetWeightMeasurementResult'; +var ADD_WEIGHT_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_AddWeightMeasurementResult'; + +var ADD_ACTIVE_PRESCRIPTIONS_REPORT_BY_PATIENT_ID = 'Services/Patients.svc/Rest/GetActivePrescriptionReportByPatientID'; + +var GET_CALL_INFO_HOURS_RESULT = 'Services/Doctors.svc/REST/GetCallInfoHoursResult'; +var GET_CALL_REQUEST_TYPE_LOV = 'Services/Doctors.svc/REST/GetCallRequestType_LOV'; + +var GET_QUESTION_TYPES = 'Services/OUTPs.svc/REST/getQuestionsTypes'; + +var UPDATE_DIABETIC_RESULT = 'Services/Patients.svc/REST/Patient_UpdateDiabeticResult'; + +var SEND_AVERAGE_BLOOD_SUGAR_REPORT = 'Services/Notifications.svc/REST/SendAverageBloodSugarReport'; +var DEACTIVATE_DIABETIC_STATUS = 'services/Patients.svc/REST/Patient_DeactivateDiabeticStatus'; +var DEACTIVATE_BLOOD_PRESSURES_STATUS = 'services/Patients.svc/REST/Patient_DeactivateBloodPressureStatus'; + +var UPDATE_BLOOD_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_UpdateBloodPressureResult'; +var SEND_AVERAGE_BLOOD_WEIGHT_REPORT = 'Services/Notifications.svc/REST/SendAverageBodyWeightReport'; +var SEND_AVERAGE_BLOOD_PRESSURE_REPORT = 'Services/Notifications.svc/REST/SendAverageBloodPressureReport'; + +var UPDATE_WEIGHT_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_UpdateWeightMeasurementResult'; +var DEACTIVATE_WEIGHT_PRESSURE_RESULT = 'services/Patients.svc/REST/Patient_DeactivateWeightMeasurementStatus'; +var GET_DOCTOR_RESPONSE = 'Services/Patients.svc/REST/GetDoctorResponse'; +var UPDATE_READ_STATUS = 'Services/Patients.svc/REST/UpdateReadStatus'; + +var INSERT_CALL_INFO = 'Services/Doctors.svc/REST/InsertCallInfo'; +var INSERT_APPOINTMENT_QUESTION = 'Services/OUTPs.svc/REST/insertAppointmentQuestion'; +var RATE_DOCTOR_RESPONSE = 'Services/OUTPs.svc/REST/insertAppointmentQuestionRating'; + +var GET_PATIENT_ALLERGIES = 'Services/Patients.svc/REST/GetPatientAllergies'; + +// H2O +var H2O_GET_USER_PROGRESS = "Services/H2ORemainder.svc/REST/H2O_GetUserProgress"; +var H2O_INSERT_USER_ACTIVITY = "Services/H2ORemainder.svc/REST/H2O_InsertUserActivity"; +var H2O_GET_USER_DETAIL = "Services/H2ORemainder.svc/REST/H2O_GetUserDetails_New"; +var H2O_UPDATE_USER_DETAIL = "Services/H2ORemainder.svc/REST/H2O_UpdateUserDetails_New"; +var H2O_UNDO_USER_ACTIVITY = "Services/H2ORemainder.svc/REST/H2o_UndoUserActivity"; +//E_Referral Services + +var GET_ALL_RELATIONSHIP_TYPES = "Services/Patients.svc/REST/GetAllRelationshipTypes"; +var SEND_ACTIVATION_CODE_FOR_E_REFERRAL = 'Services/Authentication.svc/REST/SendActivationCodeForEReferral'; +var CHECK_ACTIVATION_CODE_FOR_E_REFERRAL = 'Services/Authentication.svc/REST/CheckActivationCodeForEReferral'; +var GET_ALL_CITIES = 'services/Lists.svc/rest/GetAllCities'; +var CREATE_E_REFERRAL = "Services/Patients.svc/REST/CreateEReferral"; +var GET_E_REFERRALS = "Services/Patients.svc/REST/GetEReferrals"; + +// Encillary Orders + +var GET_ANCILLARY_ORDERS = 'Services/Doctors.svc/REST/GetOnlineAncillaryOrderList'; + +var GET_ANCILLARY_ORDERS_DETAILS = 'Services/Doctors.svc/REST/GetOnlineAncillaryOrderProcList'; + +//Pharmacy wishlist +// var GET_WISHLIST = "http://swd-pharapp-01:7200/api/shopping_cart_items/"; + +var GET_DOCTOR_LIST_BY_TIME = "Services/Doctors.svc/REST/SearchDoctorsByTime"; + +// pharmacy +var PHARMACY_AUTORZIE_CUSTOMER = "AutorizeCustomer"; +var PHARMACY_VERIFY_CUSTOMER = "VerifyCustomer"; +var PHARMACY_GET_COUNTRY = "countries"; +// var PHARMACY_CREATE_CUSTOMER = "epharmacy/api/CreateCustomer"; +var PHARMACY_CREATE_CUSTOMER = "getorcreateCustomer"; +var GET_PHARMACY_BANNER = "promotionbanners"; +var GET_PHARMACY_TOP_MANUFACTURER = "topmanufacturer"; +var GET_PHARMACY_BEST_SELLER_PRODUCT = "bestsellerproducts"; +var GET_PHARMACY_PRODUCTs_BY_IDS = "productsbyids/"; +var GET_PHARMACY_PRODUCTs_BY_SKU = "productbysku/"; +var GET_CUSTOMERS_ADDRESSES = "Customers/"; +var SUBSCRIBE_PRODUCT = "subscribe?"; +var GET_ORDER = "orders?"; +var GET_ORDER_DETAILS = "orders/"; +var ADD_CUSTOMER_ADDRESS = "addcustomeraddress"; +var EDIT_CUSTOMER_ADDRESS = "editcustomeraddress"; +var DELETE_CUSTOMER_ADDRESS = "deletecustomeraddress"; +var GET_ADDRESS = "Customers/"; +var GET_Cancel_ORDER = "cancelorder/"; +var WRITE_REVIEW = "Content-Type" + "text/plain; charset=utf-8"; +var GET_SHOPPING_CART = "shopping_cart_items/"; +var GET_SHIPPING_OPTIONS = "get_shipping_option/"; +var DELETE_SHOPPING_CART = "delete_shopping_cart_items/"; +var DELETE_SHOPPING_CART_ALL = "delete_shopping_cart_item_by_customer/"; +var ORDER_SHOPPING_CART = "orders"; +var GET_LACUM_ACCOUNT_INFORMATION = "Services/Patients.svc/REST/GetLakumAccountInformation"; +var GET_LACUM_GROUP_INFORMATION = "Services/Patients.svc/REST/GetlakumInQueryInfoGrouping"; +var LACUM_ACCOUNT_ACTIVATE = "Services/Patients.svc/REST/LakumAccountActivation"; +var LACUM_ACCOUNT_DEACTIVATE = "Services/Patients.svc/REST/LakumAccountDeactivation"; +var CREATE_LAKUM_ACCOUNT = "Services/Patients.svc/REST/PHR_CreateLakumAccount"; +var TRANSFER_YAHALA_LOYALITY_POINTS = "Services/Patients.svc/REST/TransferYaHalaLoyaltyPoints"; +var LAKUM_GET_USER_TERMS_AND_CONDITIONS = "Services/ERP.svc/REST/GetUserTermsAndConditionsForEPharmcy"; + +// var PRESCRIPTION = 'Services/Patients.svc/REST/GetPrescriptionApptList'; +var PRESCRIPTION = 'Services/Patients.svc/REST/GetPrescriptionApptList_Async'; + +var GET_RECOMMENDED_PRODUCT = 'alsoProduct/'; +var GET_MOST_VIEWED_PRODUCTS = "mostview"; +var GET_NEW_PRODUCTS = "newproducts"; + +// Home Health Care +var HHC_GET_ALL_SERVICES = "Services/Patients.svc/REST/PatientER_HHC_GetAllServices"; +var HHC_GET_ALL_CMC_SERVICES = "Services/Patients.svc/REST/PatientER_CMC_GetAllServices"; +var PATIENT_ER_UPDATE_PRES_ORDER = "Services/Patients.svc/REST/PatientER_UpdatePresOrder"; +var GET_ORDER_DETAIL_BY_ID = "Services/Patients.svc/REST/PatientER_HHC_GetTransactionsForOrder"; +var GET_CMC_ORDER_DETAIL_BY_ID = "Services/Patients.svc/REST/PatientER_CMC_GetTransactionsForOrder"; +var GET_CHECK_UP_ITEMS = "Services/Patients.svc/REST/GetCheckUpItems"; +var PUSH_NOTIFICATION_GET_ALL_NOTIFICATIONS = 'Services/MobileNotifications.svc/REST/PushNotification_GetAllNotifications'; +var PUSH_NOTIFICATION_SET_MESSAGES_FROM_POOL_AS_READ = 'Services/MobileNotifications.svc/REST/PushNotification_SetMessagesFromPoolAsRead'; +var GET_PATIENT_ALL_PRES_ORD = 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; +var PATIENT_ER_INSERT_PRES_ORDER = 'Services/Patients.svc/REST/PatientER_InsertPresOrder'; +var BLOOD_DONATION_REGISTER_BLOOD_TYPE = 'Services/PatientVarification.svc/REST/BloodDonation_RegisterBloodType'; +var ADD_USER_AGREEMENT_FOR_BLOOD_DONATION = 'Services/PatientVarification.svc/REST/AddUserAgreementForBloodDonation'; + +// HHC RC SERVICES +var HHC_GET_ALL_SERVICES_RC = "api/HHC/getallhhc"; +var ADD_HHC_ORDER_RC = "api/HHC/add"; +var GET_ALL_HHC_ORDERS_RC = 'api/hhc/list'; +var UPDATE_HHC_ORDER_RC = 'api/hhc/update'; + +// CMC RC SERVICES +var GET_ALL_CMC_SERVICES_RC = 'api/cmc/getallcmc'; +var ADD_CMC_ORDER_RC = 'api/cmc/add'; +var GET_ALL_CMC_ORDERS_RC = 'api/cmc/list'; +var UPDATE_CMC_ORDER_RC = 'api/cmc/update'; + +// RRT RC SERVICES +var ADD_RRT_ORDER_RC = "api/rrt/add"; +var GET_ALL_RRT_ORDERS_RC = "api/rrt/list"; +var UPDATE_RRT_ORDER_RC = 'api/rrt/update'; + +// PRESCRIPTION RC SERVICES +var ADD_PRESCRIPTION_ORDER_RC = "api/prescription/add"; +var GET_ALL_PRESCRIPTION_ORDERS_RC = "api/prescription/list"; +var GET_ALL_PRESCRIPTION_INFO_RC = "api/Prescription/info"; +var UPDATE_PRESCRIPTION_ORDER_RC = 'api/prescription/update'; + +//Pharmacy wishlist +var GET_WISHLIST = "shopping_cart_items/"; +var DELETE_WISHLIST = "delete_shopping_cart_item_by_product?customer_id="; +var GET_REVIEW = "customerreviews/"; +var GET_BRANDS = "manufacturer"; +var GET_TOP_BRANDS = "topmanufacturer?page=1&limit=8"; +var GET_PRODUCT_DETAIL = "products/"; +var GET_LOCATION = "Services/Patients.svc/REST/GetPharmcyListBySKU"; +var GET_SPECIFICATION = "productspecification/"; +var GET_BRAND_ITEMS = "products"; +var PHARMACY_MAKE_REVIEW = 'insertreviews'; + +// External API +var ADD_ADDRESS_INFO = "addcustomeraddress"; +var GET_CUSTOMER_ADDRESSES = "Customers/"; +var GET_CUSTOMER_INFO = "VerifyCustomer"; + +//Pharmacy + +var GET_PHARMACY_CATEGORISE = + 'categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id=0'; +var GET_OFFERS_CATEGORISE = 'discountcategories'; +var GET_OFFERS_PRODUCTS = 'offerproducts/'; +var GET_CATEGORISE_PARENT = 'categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id='; +var GET_PARENT_PRODUCTS = 'products?categoryid='; +var GET_SUB_CATEGORISE = 'categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id='; +var GET_SUB_PRODUCTS = 'products?categoryid='; +var GET_FINAL_PRODUCTS = + 'products?fields=id,reviews,discount_ids,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage&CategoryId='; +var GET_CLINIC_CATEGORY = 'Services/Doctors.svc/REST/DP_GetClinicCategory'; +var GET_DISEASE_BY_CLINIC_ID = 'Services/Doctors.svc/REST/DP_GetDiseasesByClinicID'; +var SEARCH_DOCTOR_BY_TIME = 'Services/Doctors.svc/REST/SearchDoctorsByTime'; + +var TIMER_MIN = 10; + +var GOOGLE_API_KEY = "AIzaSyCmevVlr2Bh-c8W1VUzo8gt8JRY7n5PANw"; + +var GET_BRANDS_LIST = 'categoryManufacturer?categoryids='; + +var GET_SEARCH_PRODUCTS = + 'searchproducts?fields=id,discount_ids,reviews,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage&search_key='; + +var SCAN_QR_CODE = 'productbysku/'; + +var FILTERED_PRODUCTS = 'products?categoryids='; + +var GET_DOCTOR_LIST_CALCULATION = "Services/Doctors.svc/REST/GetCallculationDoctors"; + +var GET_ALL_APPOINTMENTS_FOR_DENTAL_CLINIC = "Services/Patients.svc/REST/GetDentalAppointments"; + +var GET_DENTAL_APPOINTMENT_INVOICE = "Services/Patients.svc/REST/HIS_eInvoiceForDentalByAppointmentNo"; + +var SEND_DENTAL_APPOINTMENT_INVOICE_EMAIL = "Services/Notifications.svc/REST/SendInvoiceForDental"; + +var GET_TAMARA_PLAN = 'https://mdlaboratories.com/tamaralive/Home/GetInstallments'; + +var GET_TAMARA_PAYMENT_STATUS = 'https://mdlaboratories.com/tamaralive/api/OnlineTamara/order_status?orderid='; + +var UPDATE_TAMARA_STATUS = 'Services/PayFort_Serv.svc/REST/Tamara_UpdateRequestStatus'; + +var MARK_APPOINTMENT_TAMARA_STATUS = 'Services/Patients.svc/REST/MarkAppointmentForTamaraPayment_FromVida'; + +var AUTO_GENERATE_INVOICE_TAMARA = 'Services/PayFort_Serv.svc/REST/Tamara_GetinfoByAppointmentNo_AutoGenerateInvoice'; + +var GET_ONESIGNAL_VOIP_TOKEN = 'https://onesignal.com/api/v1/players'; + +var CANCEL_PHARMA_LIVECARE_REQUEST = 'https://vcallapi.hmg.com/api/PharmaLiveCare/SendPaymentStatus'; + +var INSERT_FREE_SLOTS_LOGS = 'Services/Doctors.svc/Rest/InsertDoctorFreeSlotsLogs'; + +var GET_NATIONALITY = 'Services/Lists.svc/REST/GetNationality'; + +var PAYFORT_TEST_URL = 'https://sbpaymentservices.payfort.com/FortAPI/paymentApi'; +var PAYFORT_PROD_URL = 'https://paymentservices.payfort.com/FortAPI/paymentApi'; + +// Check If InPatient API +var CHECK_IF_INPATIENT = 'Services/Patients.svc/REST/GetInPatientAdmissionInfo'; + +var CHECK_IF_PATIENT_ADMITTED = 'Services/Inps.svc/REST/checkIsPatientAdmittedOrAdmissionRequest'; + +// Get General Instructions API +var GET_GENERAL_INSTRUCTIONS = 'Services/INPs.svc/REST/getGeneralInstructions'; + +// Get Medical Instructions API +var GET_MEDICAL_INSTRUCTIONS = 'Services/INPs.svc/REST/getPatientAdmissionRequest'; + +var GET_INPATIENT_ADVANCE_PAYMENT_REQUESTS = 'Services/INPs.svc/REST/getInpatientAdvancePendingPayment'; + +var GET_INPATIENT_PAID_ADVANCE_PAYMENT = 'Services/INPs.svc/REST/getInpatientAdvanceHistory'; + +var GET_INPATIENT_ADVANCE_PAYMENT_LINK = 'Services/PayFort_Serv.svc/REST/InsertInPatientAdvanceDetails'; + +var INSERT_INPATIENT_ORDER = 'Services/INPs.svc/REST/Inpcp_insertOrder'; + +var INPATIENT_DISCHARGE_MEDICATIONS = 'Services/INPs.svc/REST/chekPatientHasDischargeMedicine'; + +var GET_BIRTH_NOTIFICATION = 'Services/INPs.svc/REST/getBirthNotification_bymothermrn'; + +var SAVE_BIRTH_NOTIFICATION = 'Services/INPs.svc/REST/SaveBirthNotification'; + +var INSERT_GENERAL_ADMISSION_CONSENT = 'Services/INPs.svc/REST/Inp_insertAAForGeneralAdmissionConsent'; + +//Meal Plan APIs +var GET_ADMITTED_PATIENTS = 'Services/MOP.svc/REST/GetAdmittedPatients'; +var GET_CURRENT_WEEKID_WEEKDAY = 'Services/MOP.svc/REST/GetCurrentWeekAndDayHMGMP'; +var GET_MEALS_OF_SCHEDULE_ID = 'Services/MOP.svc/REST/GetMealsOfScheduleID_Mobile'; +var GET_MEAL_ITEMS_OF_SCHEDULE_ID = 'Services/MOP.svc/REST/GetDefaultItemsOfScheduleID'; +var PLACE_MEAL_PLAN_ORDER = 'Services/MOP.svc/REST/UpdateOrMakeNewOrder'; + +var CHECK_PATIENT_NPHIES_ELIGIBILITY = 'Services/Doctors.svc/REST/checkPatientInsuranceCompanyValidity'; +var CONVERT_PATIENT_TO_CASH = 'Services/Doctors.svc/REST/deActivateInsuranceCompany'; + +var GET_BLOOD_DONATION_PROJECTS_LIST = 'Services/OUTPs.svc/REST/BD_getProjectsHaveBDClinics'; + +var GET_BLOOD_DONATION_FREE_SLOTS = 'Services/OUTPs.svc/REST/BD_GetFreeSlots'; + +var GET_WE_CARE_TOUR_URL = 'Services/Consent.svc/Rest/Consent_VirtualJurny_Url_GetByProjectID'; + +var GET_DENTAL_INSTRUCTIONS = 'Services/OUTPs.svc/Rest/getProcedureNotification'; + +var INSERT_WALKIN_APPOINTMENT = "Services/Doctors.svc/REST/InsertWalkinAppointment"; + +//Usage Agreement APIs +var CHECK_USAGE_AGREEMENT = "Services/Patients.svc/REST/CheckForUsageAgreement"; +var GET_USAGE_AGREEMENT = "Services/Patients.svc/REST/GetUsageAgreementText"; +var ADD_USAGE_AGREEMENT = "Services/Patients.svc/REST/AddUsageAgreement"; + +var GET_ER_ONLINE_PAYMENT_DETAILS = 'Services/OUTPs.svc/Rest/Outp_GetPatientPaymentInformationForERClinic'; + +var AUTO_GENERATE_INVOICE_ER = 'Services/OUTPs.svc/Rest/Outp_AutoGenerateInvoiceForER'; + +var CHECK_IF_PATIENT_ARRIVED_ER_ONLINE_CHECKIN = 'Services/OUTPs.svc/Rest/IsPatientArrived'; + +var CHECK_PATIENT_ER_ADVANCE_BALANCE = 'Services/OUTPs.svc/Rest/getPatientAdvanceBalanceAmountByClinic'; + +var GET_PROJECT_FROM_NFC = 'Services/OUTPs.svc/Rest/GetProjectByNFC'; + +var GET_PATIENT_OCCUPATION_LIST = 'Services/Authentication.svc/REST/GetPatientOccupation'; + +var IS_DOCTOR_AVAILABLE_BY_CALENDAR_SCHEDULE = 'Services/OUTPs.svc/REST/HIS_IsDoctorAvailableByCalendarSchedule'; + +//PAYFORT +var getPayFortProjectDetails = "Services/PayFort_Serv.svc/REST/GetPayFortProjectDetails"; +var addPayFortApplePayResponse = "Services/PayFort_Serv.svc/REST/AddResponse"; +// var payFortEnvironment = FortEnvironment.production; +// var applePayMerchantId = "merchant.com.hmgwebservices"; +// var payFortEnvironment = FortEnvironment.test; +// var applePayMerchantId = "merchant.com.hmgwebservices.uat"; + +// Auth Provider Consts + +const String INSERT_DEVICE_IMEI = 'Services/Patients.svc/REST/Patient_INSERTDeviceIMEI'; +const String SELECT_DEVICE_IMEI = 'Services/Patients.svc/REST/Patient_SELECTDeviceIMEIbyIMEI'; +const String CHECK_PATIENT_AUTH = 'Services/Authentication.svc/REST/CheckPatientAuthentication'; +const GET_MOBILE_INFO = 'Services/Authentication.svc/REST/GetMobileLoginInfo'; + +const FORGOT_PASSWORD = 'Services/Authentication.svc/REST/CheckActivationCodeForSendFileNo'; +const CHECK_PATIENT_FOR_REGISTRATION = "Services/Authentication.svc/REST/CheckPatientForRegisteration"; + +const CHECK_USER_STATUS = "Services/NHIC.svc/REST/GetPatientInfo"; +const REGISTER_USER = 'Services/Authentication.svc/REST/PatientRegistration'; +const LOGGED_IN_USER_URL = 'Services/MobileNotifications.svc/REST/Insert_PatientMobileDeviceInfo'; + +const FORGOT_PATIENT_ID = 'Services/Authentication.svc/REST/SendPatientIDSMSByMobileNumber'; +const DASHBOARD = 'Services/Patients.svc/REST/PatientDashboard'; +const PROFILE_SETTING = 'Services/Patients.svc/REST/GetPateintInfoForUpdate'; +const SAVE_SETTING = 'Services/Patients.svc/REST/UpdatePateintInfo'; + +const DEACTIVATE_ACCOUNT = 'Services/Patients.svc/REST/PatientAppleActivation_InsertUpdate'; + +//family Files + +const FAMILY_FILES = 'Services/Authentication.svc/REST/GetAllSharedRecordsByStatus'; + +var GET_PRESCRIPTION_INSTRUCTIONS_PDF = 'Services/ChatBot_Service.svc/REST/Chatbot_SendMedicationInstructionByWhatsApp'; + +class ApiConsts { + static const maxSmallScreen = 660; + + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; + + // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT + + static String baseUrl = 'https://hmgwebservices.com/'; // HIS API URL PROD + + static String RCBaseUrl = 'https://rc.hmg.com/'; // RC API URL PROD + + static String SELECT_DEVICE_IMEI = 'Services/Patients.svc/REST/Patient_SELECTDeviceIMEIbyIMEI'; + + static num VERSION_ID = 18.9; + + static var payFortEnvironment = FortEnvironment.production; + static var applePayMerchantId = "merchant.com.hmgwebservices"; + + static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE + // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT + + static String TAMARA_URL = "https://mdlaboratories.com/tamaralive/Home/Checkout"; + static String GET_TAMARA_INSTALLMENTS_URL = "https://mdlaboratories.com/tamaralive/Home/GetInstallments"; + static String GET_TAMARA_PAYMENT_STATUS = 'https://mdlaboratories.com/tamaralive/api/OnlineTamara/order_status?orderid='; + + // static String GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; + +// var payFortEnvironment = FortEnvironment.test; +// var applePayMerchantId = "merchant.com.hmgwebservices.uat"; + + static setBackendURLs() { + switch (appEnvironmentType) { + case AppEnvironmentTypeEnum.prod: + baseUrl = "https://hmgwebservices.com/"; + payFortEnvironment = FortEnvironment.production; + applePayMerchantId = "merchant.com.hmgwebservices"; + SERVICE_URL = "https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx"; + TAMARA_URL = "https://mdlaboratories.com/tamaralive/Home/Checkout"; + GET_TAMARA_INSTALLMENTS_URL = "https://mdlaboratories.com/tamaralive/Home/GetInstallments"; + GET_TAMARA_PAYMENT_STATUS = 'https://mdlaboratories.com/tamaralive/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/'; + break; + case AppEnvironmentTypeEnum.dev: + baseUrl = "https://uat.hmgwebservices.com/"; + payFortEnvironment = FortEnvironment.test; + applePayMerchantId = "merchant.com.hmgwebservices.uat"; + SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; + TAMARA_URL = "https://epharmacy.hmg.com/tamara/Home/Checkout"; + GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; + GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/test/'; + break; + case AppEnvironmentTypeEnum.uat: + baseUrl = "https://uat.hmgwebservices.com/"; + payFortEnvironment = FortEnvironment.test; + applePayMerchantId = "merchant.com.hmgwebservices.uat"; + SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; + TAMARA_URL = "https://epharmacy.hmg.com/tamara/Home/Checkout"; + GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; + GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/test/'; + break; + case AppEnvironmentTypeEnum.preProd: + baseUrl = "https://webservices.hmg.com/"; + payFortEnvironment = FortEnvironment.production; + applePayMerchantId = "merchant.com.hmgwebservices"; + SERVICE_URL = "https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx"; + TAMARA_URL = "https://epharmacy.hmg.com/tamara/Home/Checkout"; + GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; + GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/'; + break; + case AppEnvironmentTypeEnum.qa: + baseUrl = "https://uat.hmgwebservices.com/"; + payFortEnvironment = FortEnvironment.test; + applePayMerchantId = "merchant.com.hmgwebservices.uat"; + SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; + TAMARA_URL = "https://epharmacy.hmg.com/tamara/Home/Checkout"; + GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; + GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/test/'; + break; + case AppEnvironmentTypeEnum.staging: + baseUrl = "https://uat.hmgwebservices.com/"; + payFortEnvironment = FortEnvironment.test; + applePayMerchantId = "merchant.com.hmgwebservices.uat"; + SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; + TAMARA_URL = "https://epharmacy.hmg.com/tamara/Home/Checkout"; + GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; + GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/test/'; + break; + } + } + + static final String selectDeviceImei = 'Services/Patients.svc/REST/Patient_SELECTDeviceIMEIbyIMEI'; + static final String checkPatientAuth = 'Services/Authentication.svc/REST/CheckPatientAuthentication'; + + static final String sendActivationCode = 'Services/Authentication.svc/REST/SendActivationCodebyOTPNotificationType'; + static final String sendActivationCodeRegister = 'Services/Authentication.svc/REST/SendActivationCodebyOTPNotificationTypeForRegistration'; + static final String checkActivationCode = 'Services/Authentication.svc/REST/CheckActivationCode'; + static final String checkActivationCodeRegister = 'Services/Authentication.svc/REST/CheckActivationCodeForRegistration'; + static final String checkUsageAgreement = 'Services/Patients.svc/REST/CheckForUsageAgreement'; + static final String getUserAgreementContent = 'Services/Patients.svc/REST/GetUsageAgreementText'; + + static final String checkPatientForRegistration = 'Services/Authentication.svc/REST/CheckPatientForRegisteration'; + static final String checkUserStatus = 'Services/NHIC.svc/REST/GetPatientInfo'; + + static final String insertPatientDeviceIMEIData = 'Services/Patients.svc/REST/Patient_INSERTDeviceIMEI'; + static final String insertPatientMobileData = 'Services/MobileNotifications.svc/REST/Insert_PatientMobileDeviceInfo'; + static final String getPatientMobileData = '/Services/Authentication.svc/REST/GetMobileLoginInfo'; + static final String getPrivileges = 'Services/Patients.svc/REST/Service_Privilege'; + static final String registerUser = 'Services/Authentication.svc/REST/PatientRegistration'; + + static final String addFamilyFile = 'Services/Patients.svc/REST/ShareFamilyFileService'; + static final String sendFamilyFileActivation = 'Services/Authentication.svc/REST/SendActivationCodeForFamilyFile'; + static final String checkActivationCodeForFamily = 'Services/Authentication.svc/REST/CheckActivationCodeForFamilyFile'; + static final String getAllPendingRecordsByResponseId = 'Services/Authentication.svc/REST/GetAllPendingRecordsByResponseId'; + static final String getAllSharedRecordsByStatus = 'Services/Authentication.svc/REST/GetAllSharedRecordsByStatus'; + static final String removeFileFromFamilyMembers = 'Services/Authentication.svc/REST/ActiveDeactive_PatientFile'; + static final String acceptAndRejectFamilyFile = 'Services/Authentication.svc/REST/Update_FileStatus'; + + // static values for Api + static final double appVersionID = 18.7; + static final int appChannelId = 3; + static final String appIpAddress = "10.20.10.20"; + static final String appGeneralId = "Cs2020@2016\$2958"; + static final String sessionID = 'TMRhVmkGhOsvamErw'; +} diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart new file mode 100644 index 0000000..e8215ba --- /dev/null +++ b/lib/core/app_assets.dart @@ -0,0 +1,223 @@ +class AppAssets { + static const String svgBasePath = 'assets/images/svg'; + static const String pngBasePath = 'assets/images/png'; + + static const String hmg = '$svgBasePath/hmg.svg'; + static const String arrow_back = '$svgBasePath/arrow-back.svg'; + static const String arrow_forward = '$svgBasePath/arrow_forward.svg'; + static const String externalLink = '$svgBasePath/external_link.svg'; + static const String calendar = '$svgBasePath/calendar.svg'; + static const String rangeCalendar = '$svgBasePath/range_calender.svg'; + static const String hmc = '$svgBasePath/hmc.svg'; + static const String ksa = '$svgBasePath/ksa.svg'; + static const String sms = '$svgBasePath/sms.svg'; + static const String uae = '$svgBasePath/uae.svg'; + static const String call = '$svgBasePath/call.svg'; + static const String email = '$svgBasePath/email.svg'; + static const String globe = '$svgBasePath/globe.svg'; + static const String cancel = '$svgBasePath/cancel.svg'; + static const String bell = '$svgBasePath/bell.svg'; + static const String login1 = '$svgBasePath/login1.svg'; + static const String tamara = '$svgBasePath/tamara.svg'; + static const String confirm = '$svgBasePath/confirm.svg'; + static const String message = '$svgBasePath/message.svg'; + static const String success = '$svgBasePath/success.svg'; + static const String download = '$svgBasePath/download.svg'; + static const String language = '$svgBasePath/language.svg'; + static const String location = '$svgBasePath/location.svg'; + static const String pin_location = '$svgBasePath/pin_location.svg'; + static const String whatsapp = '$svgBasePath/whatsapp.svg'; + static const String card_user = '$svgBasePath/card_user.svg'; + static const String habiblogo = '$svgBasePath/habiblogo.svg'; + static const String note_edit = '$svgBasePath/note-edit.svg'; + static const String user_full = '$svgBasePath/user-full.svg'; + static const String arrow_down = '$svgBasePath/arrow-down.svg'; + static const String download_1 = '$svgBasePath/download_1.svg'; + static const String robort_svg = '$svgBasePath/robort_svg.svg'; + static const String fingerprint = '$svgBasePath/fingerprint.svg'; + static const String globe_black = '$svgBasePath/globe_black.svg'; + static const String smart_phone = '$svgBasePath/smart-phone.svg'; + static const String user_circle = '$svgBasePath/user-circle.svg'; + static const String apple_finder = '$svgBasePath/apple-finder.svg'; + static const String cross_circle = '$svgBasePath/cross-circle.svg'; + static const String dropdow_icon = '$svgBasePath/dropdow-icon.svg'; + static const String student_card = '$svgBasePath/student-card.svg'; + static const String birthday_cake = '$svgBasePath/birthday-cake.svg'; + static const String password_validation = '$svgBasePath/password-validation.svg'; + static const String cloud_logo = '$svgBasePath/cloud_logo.svg'; + static const String contact_icon = '$svgBasePath/contact_icon.svg'; + static const String emergency_services_icon = '$svgBasePath/emergency_services_icon.svg'; + static const String indoor_nav_icon = '$svgBasePath/indoor_nav_icon.svg'; + static const String search_doctor_icon = '$svgBasePath/search_doctor_icon.svg'; + static const String health_calculators_icon = '$svgBasePath/health_calculators_icon.svg'; + static const String lab_result_icon = '$svgBasePath/lab_result_icon.svg'; + static const String my_prescription_icon = '$svgBasePath/my_prescription_icon.svg'; + static const String insurance_update_icon = '$svgBasePath/insurance_update.svg'; + static const String home_calendar_icon = '$svgBasePath/home_calendar_icon.svg'; + static const String add_icon = '$svgBasePath/add_icon.svg'; + static const String add_family = '$svgBasePath/add_family.svg'; + static const String wallet = '$svgBasePath/wallet.svg'; + static const String livecare_icon = '$svgBasePath/livecare_icon.svg'; + static const String file_icon = '$svgBasePath/file_icon.svg'; + static const String checkmark_icon = '$svgBasePath/checkmark_icon.svg'; + static const String blood_icon = '$svgBasePath/blood_icon.svg'; + static const String insurance_active_icon = '$svgBasePath/insurance_active_icon.svg'; + static const String saudi_riyal_icon = '$svgBasePath/Saudi_Riyal_Symbol.svg'; + static const String habib_background_icon = '$svgBasePath/habib_logo_background.svg'; + static const String show_icon = '$svgBasePath/show_icon.svg'; + static const String recharge_icon = '$svgBasePath/recharge_icon.svg'; + static const String eye_result_icon = '$svgBasePath/eye_results_icon.svg'; + static const String search_icon = '$svgBasePath/search_icon.svg'; + static const String view_report_icon = '$svgBasePath/view_report_icon.svg'; + static const String forward_arrow_icon = '$svgBasePath/forward_arrow_icon.svg'; + static const String prescription_refill_icon = '$svgBasePath/prescription_refill_icon.svg'; + static const String rating_icon = '$svgBasePath/rating_icon.svg'; + static const String doctor_calendar_icon = '$svgBasePath/doctor_calendar_icon.svg'; + static const String prescription_remarks_icon = '$svgBasePath/prescription_remarks_icon.svg'; + static const String prescription_reminder_icon = '$svgBasePath/prescription_reminder_icon.svg'; + static const String insurance_history_icon = '$svgBasePath/insurance_history_icon.svg'; + static const String cancel_circle_icon = '$svgBasePath/cancel_circle.svg'; + static const String update_insurance_card_icon = '$svgBasePath/update_insurance_card.svg'; + static const String close_bottom_sheet_icon = '$svgBasePath/close_bottom_sheet_icon.svg'; + static const String insurance = '$svgBasePath/insurance.svg'; + static const String requests = '$svgBasePath/requests.svg'; + static const String more = '$svgBasePath/more.svg'; + static const String appointment_calendar_icon = '$svgBasePath/appointment_calendar_icon.svg'; + static const String appointment_time_icon = '$svgBasePath/appointment_time_icon.svg'; + static const String confirm_appointment_icon = '$svgBasePath/confirm_appointment_icon.svg'; + static const String appointment_pay_icon = '$svgBasePath/appointment_pay_icon.svg'; + static const String appointment_checkin_icon = '$svgBasePath/appointment_checkin_icon.svg'; + static const String ask_doctor_icon = '$svgBasePath/ask_doctor_icon.svg'; + static const String uae_dirham_symbol = '$svgBasePath/uae_dirham_symbol.svg'; + static const String directions_icon = '$svgBasePath/directions_icon.svg'; + static const String apple_pay_button = '$svgBasePath/pay_with_apple_pay.svg'; + static const String reminder_bell = '$svgBasePath/reminder_bell.svg'; + static const String rebook_appointment_icon = '$svgBasePath/rebook_appointment_icon.svg'; + static const String report_icon = '$svgBasePath/report_icon.svg'; + static const String radiology_icon = '$svgBasePath/radiology_icon.svg'; + static const String prescription_item_icon = '$svgBasePath/prescription_item_icon.svg'; + static const String checkin_location_icon = '$svgBasePath/checkin_location_icon.svg'; + static const String checkin_nfc_icon = '$svgBasePath/checkin_nfc_icon.svg'; + static const String checkin_qr_icon = '$svgBasePath/checkin_qr_icon.svg'; + static const String my_account_icon = '$svgBasePath/my_account_icon.svg'; + static const String select_hospital_icon = '$svgBasePath/select_hospital_icon.svg'; + static const String email_icon = '$svgBasePath/email_icon.svg'; + static const String notes_icon = '$svgBasePath/notes_icon.svg'; + static const String forward_chevron_icon = '$svgBasePath/forward_chevron_icon.svg'; + static const String logout = '$svgBasePath/logout.svg'; + static const String alarm_clock_icon = '$svgBasePath/alarm_clock_icon.svg'; + static const String all_medications_icon = '$svgBasePath/all_medications_icon.svg'; + static const String allergy_info_icon = '$svgBasePath/allergy_info_icon.svg'; + static const String vaccine_info_icon = '$svgBasePath/vaccine_info_icon.svg'; + static const String search_by_clinic_icon = '$svgBasePath/search_by_clinic_icon.svg'; + static const String search_by_doctor_icon = '$svgBasePath/search_by_doctor_icon.svg'; + static const String search_by_region_icon = '$svgBasePath/search_by_region_icon.svg'; + static const String location_red = '$svgBasePath/location_red.svg'; + static const String location_unavailable = '$svgBasePath/location_unavailable.svg'; + static const String livecare_clinic_icon = '$svgBasePath/livecare_clinic_icon.svg'; + static const String immediate_service_icon = '$svgBasePath/immediate_service_icon.svg'; + static const String no_visit_icon = '$svgBasePath/no_visit_icon.svg'; + static const String doctor_contact_icon = '$svgBasePath/doctor_contact_icon.svg'; + static const String free_med_delivery_icon = '$svgBasePath/free_med_delivery_icon.svg'; + static const String livecare_book_icon = '$svgBasePath/livecare_book_icon.svg'; + static const String doctor_profile_icon = '$svgBasePath/doctor_profile_icon.svg'; + static const String accessibility = '$svgBasePath/accessibility.svg'; + static const String call_fill = '$svgBasePath/call_fill.svg'; + static const String email_transparent = '$svgBasePath/email_transparent.svg'; + static const String emergency = '$svgBasePath/emergency.svg'; + static const String language_change = '$svgBasePath/language_change.svg'; + static const String my_address = '$svgBasePath/my_address.svg'; + static const String permission = '$svgBasePath/permission.svg'; + static const String privacy_terms = '$svgBasePath/privacy_terms.svg'; + static const String rate = '$svgBasePath/rate.svg'; + static const String smart_phone_fill = '$svgBasePath/smart_phone_fill.svg'; + static const String touch_face_id = '$svgBasePath/touch_face_id.svg'; + static const String minus = '$svgBasePath/minus.svg'; + static const String home_lab_result_icon = '$svgBasePath/home_lab_result_icon.svg'; + static const String visa_mastercard_icon = '$svgBasePath/visa_mastercard.svg'; + static const String small_livecare_icon = '$svgBasePath/small_livecare_icon.svg'; + static const String walkin_appointment_icon = '$svgBasePath/walkin_appointment_icon.svg'; + static const String cardiology_clinic_icon = '$svgBasePath/cardiology_clinic_icon.svg'; + static const String generic_clinic_icon = '$svgBasePath/generic_clinic_icon.svg'; + static const String lab_result_indicator = '$svgBasePath/refernce_range_indicator.svg'; + static const String ic_date_filter = '$svgBasePath/ic_date_filter.svg'; + static const String ic_list = '$svgBasePath/ic_list.svg'; + static const String ic_graph = '$svgBasePath/graph.svg'; + static const String ic_normal_result = '$svgBasePath/normal_result.svg'; + static const String ic_low_result = '$svgBasePath/low_result.svg'; + static const String ic_critical_low_result = '$svgBasePath/critical_low_result.svg'; + static const String livecare_online_icon = '$svgBasePath/livecare_online_icon.svg'; + static const String edit_icon = '$svgBasePath/edit_icon.svg'; + static const String waiting_icon = '$svgBasePath/waiting_icon.svg'; + static const String forward_arrow_icon_small = '$svgBasePath/forward_arrow_icon_small.svg'; + static const String ic_filters = '$svgBasePath/filters.svg'; + static const String ic_close = '$svgBasePath/ic_close.svg'; + static const String ic_cross_circle = '$svgBasePath/cross_circle.svg'; + static const String switch_user = '$svgBasePath/switch_user.svg'; + static const String activeCheck = '$svgBasePath/active-check.svg'; + static const String deleteIcon = '$svgBasePath/delete_icon.svg'; + static const String call_ambulance_icon = '$svgBasePath/call_ambulance_icon.svg'; + static const String ambulance = '$svgBasePath/ambulance.svg'; + static const String nearest_er_icon = '$svgBasePath/nearest_er_icon.svg'; + static const String rrt_icon = '$svgBasePath/rrt_icon.svg'; + static const String waiting_time_clock = '$svgBasePath/waiting_time_clock.svg'; + static const String location_pickup = '$svgBasePath/location_pickup.svg'; + static const String locate_me = '$svgBasePath/locate_me.svg'; + static const String pickup_bed = '$svgBasePath/pickup_bed.svg'; + static const String hospital = '$svgBasePath/hospital.svg'; + static const String down_cheveron = '$svgBasePath/down_cheveron.svg'; + static const String warning = '$svgBasePath/warning.svg'; + static const String share_location = '$svgBasePath/share_location.svg'; + static const String to_arrow = '$svgBasePath/to_arrow.svg'; + static const String dual_arrow = '$svgBasePath/to_arrow.svg'; + static const String forward_arrow_medium = '$svgBasePath/forward_arrow_medium.svg'; + + + //bottom navigation// + static const String homeBottom = '$svgBasePath/home_bottom.svg'; + static const String bookAppoBottom = '$svgBasePath/book_appo_bottom.svg'; + static const String myFilesBottom = '$svgBasePath/my_files_bottom.svg'; + static const String toDoBottom = '$svgBasePath/todo_bottom.svg'; + static const String servicesBottom = '$svgBasePath/services_bottom.svg'; + static const String closeBottomNav = '$svgBasePath/close_bottom_nav.svg'; + static const String feedback = '$svgBasePath/feedback.svg'; + static const String news = '$svgBasePath/news.svg'; + static const String heart = '$svgBasePath/heart.svg'; + static const String alertSquare = '$svgBasePath/alert-square.svg'; + static const String arrowRight = '$svgBasePath/arrow-right.svg'; + + // PNGS // + static const String hmg_logo = '$pngBasePath/hmg_logo.png'; + static const String livecare_service = '$pngBasePath/livecare_service.png'; + static const String male_img = '$pngBasePath/male_img.png'; + static const String femaleImg = '$pngBasePath/female_img.png'; + static const String babyGirlImg = '$pngBasePath/baby_girl_img.png'; + static const String babyBoyImg = '$pngBasePath/baby_img.png'; + static const String apple_pay = '$pngBasePath/Apple_Pay.png'; + static const String mada = '$pngBasePath/Mada.png'; + static const String Mastercard = '$pngBasePath/Mastercard.png'; + static const String tamara_en = '$pngBasePath/tamara_en.png'; + static const String visa = '$pngBasePath/visa.png'; + static const String lockIcon = '$pngBasePath/lock-icon.png'; + static const String dummy_user = '$pngBasePath/dummy_user.png'; +} + +class AppAnimations { + static const String lottieBasePath = 'assets/animations/lottie'; + static const String login = '$lottieBasePath/login.json'; + static const String register = '$lottieBasePath/register.json'; + static const String checkmark = '$lottieBasePath/checkmark.json'; + static const String loadingAnimation = '$lottieBasePath/Loader.json'; + static const String onboarding_1 = '$lottieBasePath/onboarding_1.json'; + static const String onboarding_2 = '$lottieBasePath/onboarding_2.json'; + static const String errorAnimation = '$lottieBasePath/ErrorAnimation.json'; + static const String warningAnimation = '$lottieBasePath/warningAnimation.json'; + static const String splashLaunching = '$lottieBasePath/splash_launching.json'; + static const String noData = '$lottieBasePath/Nodata.json'; + static const String ripple = '$lottieBasePath/Ripple.json'; + static const String pending_loading_animation = '$lottieBasePath/pending_loading_animation.json'; + + static const String ambulance = '$lottieBasePath/ambulance.json'; + static const String ambulance_alert = '$lottieBasePath/ambulance_alert.json'; + static const String rrt_ambulance = '$lottieBasePath/rrt_ambulance.json'; +} diff --git a/lib/core/app_export.dart b/lib/core/app_export.dart index 0009b3a..532d570 100644 --- a/lib/core/app_export.dart +++ b/lib/core/app_export.dart @@ -1,2 +1,6 @@ export '../routes/app_routes.dart'; export 'utils/size_utils.dart'; + + + + diff --git a/lib/core/app_state.dart b/lib/core/app_state.dart index 8122bf4..c8659a7 100644 --- a/lib/core/app_state.dart +++ b/lib/core/app_state.dart @@ -1,35 +1,175 @@ +import 'dart:async'; +import 'dart:io'; + import 'package:easy_localization/easy_localization.dart'; -import 'package:hmg_patient_app_new/main.dart'; +import 'package:gms_check/gms_check.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/HMCProjectListModel.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/PrivilegeModel.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/ProjectDetailListModel.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/VidaPlusProjectListModel.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/request_models/send_activation_request_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/check_user_staus_nhic_response_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/select_device_by_imei.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; -import 'consts.dart'; +import '../features/authentication/models/request_models/registration_payload_model.dart'; class AppState { - static final AppState _instance = AppState._internal(); + NavigationService navigationService; + + AppState({required this.navigationService}){ + checkIfGMSAvailableOrNot(); + } + + double userLat = 0.0; + + set setUserLat(v) => userLat = v; + + double userLong = 0.0; + + set setUserLong(v) => userLong = v; + + bool isArabic() => EasyLocalization.of(navigationService.navigatorKey.currentContext!)?.locale.languageCode == "ar"; + + int getLanguageID() => EasyLocalization.of(navigationService.navigatorKey.currentContext!)?.locale.languageCode == "ar" ? 1 : 2; + + int getDeviceTypeID() => Platform.isIOS ? 1 : 2; + + String? getLanguageCode() => EasyLocalization.of(navigationService.navigatorKey.currentContext!)?.locale.languageCode; + + AuthenticatedUser? _authenticatedRootUser; + AuthenticatedUser? _authenticatedChildUser; + + int? _superUserID; + bool isChildLoggedIn = false; + bool isGMSAvailable = true; + bool isAndroid = true; + + void setAuthenticatedUser(AuthenticatedUser? authenticatedUser, {bool isFamily = false}) { + if (isFamily) { + _authenticatedChildUser = authenticatedUser; + } else { + setIsAuthenticated = true; + _authenticatedRootUser = authenticatedUser; + } + } + + FutureOr checkIfGMSAvailableOrNot() async { + isGMSAvailable = (await GmsCheck().checkGmsAvailability()) ?? true; + if(Platform.isIOS) { + isGMSAvailable = true; + isAndroid = false; + return; + } + } + + AuthenticatedUser? getAuthenticatedUser({bool isFamily = false}) { + if (isFamily) { + return _authenticatedChildUser; + } else { + return _authenticatedRootUser; + } + } + + int? get getSuperUserID => _superUserID; + + bool get getIsChildLoggedIn => isChildLoggedIn; + + set setSuperUserID(int? value) => _superUserID = value; + + set setIsChildLoggedIn(bool value) => isChildLoggedIn = value; + + String _userBloodGroup = ""; + + String get getUserBloodGroup => _userBloodGroup; + + set setUserBloodGroup(String value) => _userBloodGroup = value; - AppState._internal(); + SelectDeviceByImeiRespModelElement? _selectDeviceByImeiRespModelElement; - factory AppState() => _instance; + void setSelectDeviceByImeiRespModelElement(SelectDeviceByImeiRespModelElement? value) { + _selectDeviceByImeiRespModelElement = value; + } - //Tokens + SelectDeviceByImeiRespModelElement? get getSelectDeviceByImeiRespModelElement => _selectDeviceByImeiRespModelElement; + + // String appLoginTokenID = ""; + // + // set setAppLoginTokenID(v) => appLoginTokenID = v; + + String deviceToken = ""; + + set setDeviceToken(v) => deviceToken = v; + + String voipToken = ""; + + set setVoipToken(v) => voipToken = v; + + String appAuthToken = ""; + + set setAppAuthToken(v) => appAuthToken = v; + + String sessionId = ""; + + set setSessionId(v) => sessionId = v; bool isAuthenticated = false; set setIsAuthenticated(v) => isAuthenticated = v; - set setAppAuthToken(v) => appAuthToken = v; + String deviceTypeID = ""; - String appAuthToken = ""; + set setDeviceTypeID(v) => deviceTypeID = v; - set setUserLat(v) => userLat = v; + String _familyFileTokenID = ""; - set setUserLong(v) => userLong = v; + String get getFamilyFileTokenID => _familyFileTokenID; - double userLat = 0.0; - double userLong = 0.0; + set setFamilyFileTokenID(String value) { + _familyFileTokenID = value; + } + + List vidaPlusProjectList = []; + List privilegeModelList = []; + List hMCProjectListModel = []; + List projectDetailListModel = []; + + setVidaPlusProjectList(List vidaPlusProjectListModelInput) { + vidaPlusProjectList = vidaPlusProjectListModelInput; + } + + setPrivilegeModelList(List privilegeModelListInput) { + privilegeModelList = privilegeModelListInput; + } + + setHMCProjectList(List hMCProjectListModelInput) { + hMCProjectListModel = hMCProjectListModelInput; + } + + setProjectsDetailList(List projectDetailListModelInput) { + projectDetailListModel = projectDetailListModelInput; + } + + CheckUserStatusResponseNHIC? _nHICUserData; + + CheckUserStatusResponseNHIC get getNHICUserData => _nHICUserData!; + + set setNHICUserData(CheckUserStatusResponseNHIC value) { + _nHICUserData = value; + } + + RegistrationDataModelPayload? _userRegistrationPayload; - bool isArabic() => EasyLocalization.of(navigatorKey.currentContext!)?.locale.languageCode == "ar"; + RegistrationDataModelPayload get getUserRegistrationPayload => _userRegistrationPayload ?? RegistrationDataModelPayload(); - int getLanguageID(context) => EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2; + set setUserRegistrationPayload(RegistrationDataModelPayload value) { + _userRegistrationPayload = value; + } -// bool isUserLoggedIn() => + ///this will be called if there is any problem in getting the user location + void resetLocation() { + userLong = 0.0; + userLong = 0.0; + } } diff --git a/lib/core/cache_consts.dart b/lib/core/cache_consts.dart new file mode 100644 index 0000000..66b38d4 --- /dev/null +++ b/lib/core/cache_consts.dart @@ -0,0 +1,77 @@ +class CacheConst { + static const String isRememberMe = "remember_me"; + static const String username = "doctorId"; + static const String password = "password"; + static const String logInTokenId = "logInTokenID"; + static const String vidaAuthTokenId = "vidaAuthTokenID"; + static const String vidaRefreshTokenId = "vidaRefreshTokenID"; + static const String authenticationTokenId = "authenticationTokenID"; + static const String projectId = "projectID"; + static const String clinicId = "clinicId"; + static const String lastLoginDate = "lastLoginDate"; + static const String lastLoginTime = "lastLoginTime"; + static const String memberModel = "memberModel"; + static const String firstLaunch = "firstLaunch"; + + static const String isShowOnboarding = "is_show_onboarding"; + static const String appAuthToken = "app_auth_token"; + static const String appUserId = "app_user_id"; + static const String loggedInUserObj = "logged_in_user_obj"; + + static const String pushToken = "push_token"; + static const String apnsToken = "apns_token"; + static const String voipToken = "voip_token"; + static const String patientMrn = "patient_mrn"; + + static const String loggedInUserId = "logged_in_user_id"; + static const String loggedInUserPassword = "logged_in_user_password"; + + static const String userLat = 'user-lat'; + static const String userLong = 'user-long'; + + static const String token = 'token'; + static const String appLanguage = 'language'; + static const String userProfile = 'user-profile'; + static const String oneSignalApnsToken = 'onesignal-apns-token'; + static const String registerDataForRegister = 'register-data-for-register'; + static const String loginTokenIdDuplicate = 'register-data-for-register'; + static const String registerDataForLogin = 'register-data-for-login'; + static const String lastLogin = 'last-login'; + static const String erCheckinRiskScore = 'er-checkin-risk-score'; + static const String onlySms = 'only-sms'; + static const String authData = 'auth-data'; + static const String imeiUserData = 'imei-user-data'; + static const String nhicData = 'nhic-data'; + static const String familyFile = 'family-file'; + static const String isGoToParking = 'IS_GO_TO_PARKING'; + static const String isSearchAppo = 'is-search-appo'; + static const String isLivecareAppointment = 'is_livecare_appointment'; + static const String isVibration = 'is_vibration'; + static const String themeValue = 'is_vibration'; + static const String mainUser = 'main-user'; + static const String pharmacyLastVisitedProducts = 'last-visited'; + static const String pharmacyCustomerId = 'costumer-id'; + static const String pharmacyCustomerGuid = 'customer-guid'; + static const String pharmacyCustomerObject = 'pharmacy-customer-object'; + static const String isRobotVisible = 'robot-visible'; + static const String isRobotInit = 'robot-init'; + static const String hmgGeofences = 'hmg-geo-fences'; + static const String weather = 'weather'; + static const String bloodType = 'blood-type'; + static const String notificationCount = 'notification-count'; + static const String pharmacySelectedAddress = 'selected-address'; + static const String pharmacyAutorzieToken = 'PHARMACY_AUTORZIE_TOKEN'; + static const String h2oUnit = 'H2O_UNIT'; + static const String h2oReminder = 'H2O_REMINDER'; + static const String livecareClinicData = 'LIVECARE_CLINIC_DATA'; + static const String doctorScheduleDateSel = 'DOCTOR_SCHEDULE_DATE_SEL'; + static const String appointmentHistoryMedical = 'APPOINTMENT_HISTORY_MEDICAL'; + static const String clinicsList = 'CLINICS_LIST'; + static const String covidQaList = 'COVID_QA_LIST'; + static const String isCovidConsentShown = 'IS_COVID_CONSENT_SHOWN'; + static const String registerInfoDubai = 'register-info-dubai'; + static const String isLastAppointmentRateShown = 'is-last-appointment-rate-shown'; + static const String patientOccupationList = 'patient-occupation-list'; + static const String hasEnabledQuickLogin = 'has-enabled-quick-login'; + static const String quickLoginEnabled = 'quick-login-enabled'; +} diff --git a/lib/core/common_models/data_points.dart b/lib/core/common_models/data_points.dart new file mode 100644 index 0000000..3f5065c --- /dev/null +++ b/lib/core/common_models/data_points.dart @@ -0,0 +1,29 @@ + + +///class used to provide value for the [DynamicResultChart] to plot the values +class DataPoint { + ///values that is displayed on the graph and dot is plotted on this + final double value; + ///label shown on the bottom of the graph + String label; + String referenceValue; + String actualValue; + String? unitOfMeasurement ; + DateTime time; + String displayTime; + + DataPoint( + {required this.value, + required this.label, + required this.referenceValue, + required this.actualValue, + required this.time, + required this.displayTime, + this.unitOfMeasurement + }); + + @override + String toString() { + return "the time is $time"; + } +} diff --git a/lib/core/common_models/generic_api_model.dart b/lib/core/common_models/generic_api_model.dart new file mode 100644 index 0000000..1ab11db --- /dev/null +++ b/lib/core/common_models/generic_api_model.dart @@ -0,0 +1,34 @@ +class GenericApiModel { + final int? messageStatus; + final String? errorMessage; + final int? statusCode; + final T? data; + + GenericApiModel({ + this.messageStatus, + this.errorMessage, + this.statusCode, + this.data, + }); + + factory GenericApiModel.fromJson( + Map json, + T Function(Object? json)? fromJsonT, + ) { + return GenericApiModel( + messageStatus: json['messageStatus'] as int?, + errorMessage: json['errorMessage'] as String?, + statusCode: json['statusCode'] as int?, + data: fromJsonT != null ? fromJsonT(json['data']) : json['data'] as T?, + ); + } + + Map toJson(Object Function(T value)? toJsonT) { + return { + 'messageStatus': messageStatus, + 'errorMessage': errorMessage, + 'statusCode': statusCode, + 'data': toJsonT != null && data != null ? toJsonT(data as T) : data, + }; + } +} diff --git a/lib/core/common_models/nationality_country_model.dart b/lib/core/common_models/nationality_country_model.dart new file mode 100644 index 0000000..fb3961b --- /dev/null +++ b/lib/core/common_models/nationality_country_model.dart @@ -0,0 +1,29 @@ +import 'dart:convert'; + +class NationalityCountries { + String? id; + String? name; + String? nameN; + + NationalityCountries({ + this.id, + this.name, + this.nameN, + }); + + factory NationalityCountries.fromRawJson(String str) => NationalityCountries.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory NationalityCountries.fromJson(Map json) => NationalityCountries( + id: json["ID"], + name: json["Name"], + nameN: json["NameN"], + ); + + Map toJson() => { + "ID": id, + "Name": name, + "NameN": nameN, + }; +} diff --git a/lib/core/common_models/privilege/HMCProjectListModel.dart b/lib/core/common_models/privilege/HMCProjectListModel.dart new file mode 100644 index 0000000..6af7bfb --- /dev/null +++ b/lib/core/common_models/privilege/HMCProjectListModel.dart @@ -0,0 +1,15 @@ +class HMCProjectListModel { + int? projectID; + + HMCProjectListModel({this.projectID}); + + HMCProjectListModel.fromJson(Map json) { + projectID = json['ProjectID']; + } + + Map toJson() { + final Map data = new Map(); + data['ProjectID'] = this.projectID; + return data; + } +} diff --git a/lib/core/common_models/privilege/PrivilegeModel.dart b/lib/core/common_models/privilege/PrivilegeModel.dart new file mode 100644 index 0000000..587490b --- /dev/null +++ b/lib/core/common_models/privilege/PrivilegeModel.dart @@ -0,0 +1,24 @@ +class PrivilegeModel { + int? iD; + String? serviceName; + bool? privilege; + dynamic region; + + PrivilegeModel({this.iD, this.serviceName, this.privilege, this.region}); + + PrivilegeModel.fromJson(Map json) { + iD = json['ID']; + serviceName = json['ServiceName']; + privilege = json['Previlege']; + region = json['Region']; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['ServiceName'] = this.serviceName; + data['Previlege'] = this.privilege; + data['Region'] = this.region; + return data; + } +} diff --git a/lib/core/common_models/privilege/ProjectDetailListModel.dart b/lib/core/common_models/privilege/ProjectDetailListModel.dart new file mode 100644 index 0000000..782c376 --- /dev/null +++ b/lib/core/common_models/privilege/ProjectDetailListModel.dart @@ -0,0 +1,32 @@ +class ProjectDetailListModel { + int? projectID; + String? latitude; + String? longitude; + int? geofenceRadius; + String? checkInQrCode; + + ProjectDetailListModel( + {this.projectID, + this.latitude, + this.longitude, + this.geofenceRadius, + this.checkInQrCode}); + + ProjectDetailListModel.fromJson(Map json) { + projectID = json['ProjectID']; + latitude = json['Latitude']; + longitude = json['Longitude']; + geofenceRadius = json['GeofenceRadius']; + checkInQrCode = json['CheckInQrCode']; + } + + Map toJson() { + final Map data = new Map(); + data['ProjectID'] = this.projectID; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['GeofenceRadius'] = this.geofenceRadius; + data['CheckInQrCode'] = this.checkInQrCode; + return data; + } +} diff --git a/lib/core/common_models/privilege/VidaPlusProjectListModel.dart b/lib/core/common_models/privilege/VidaPlusProjectListModel.dart new file mode 100644 index 0000000..7597811 --- /dev/null +++ b/lib/core/common_models/privilege/VidaPlusProjectListModel.dart @@ -0,0 +1,15 @@ +class VidaPlusProjectListModel { + int? projectID; + + VidaPlusProjectListModel({this.projectID}); + + VidaPlusProjectListModel.fromJson(Map json) { + projectID = json['ProjectID']; + } + + Map toJson() { + final Map data = new Map(); + data['ProjectID'] = this.projectID; + return data; + } +} diff --git a/lib/core/common_models/tamara_request_model.dart b/lib/core/common_models/tamara_request_model.dart new file mode 100644 index 0000000..f515aae --- /dev/null +++ b/lib/core/common_models/tamara_request_model.dart @@ -0,0 +1,120 @@ +class TamaraRequestModel { + String? merchantReference; + String? merchantIdentifier; + String? clientRequestID; + num? amount; + String? currency; + String? language; + String? commandType; + String? signature; + String? customerEmail; + String? orderDescription; + bool? isInstallment; + num? projectID; + String? accessCode; + String? sHARequestPhase; + String? sHAResponsePhase; + String? customerName; + String? fileNumber; + bool? patientOutSA; + String? deviceToken; + String? longitude; + String? latitude; + String? appointmentNo; + var serviceID; + var liveServiceID; + String? doctorID; + var appointmentDate; + bool? isSchedule; + + TamaraRequestModel( + {this.merchantReference, + this.merchantIdentifier, + this.clientRequestID, + this.amount, + this.currency, + this.language, + this.commandType, + this.signature, + this.customerEmail, + this.orderDescription, + this.isInstallment, + this.projectID, + this.accessCode, + this.sHARequestPhase, + this.sHAResponsePhase, + this.customerName, + this.fileNumber, + this.patientOutSA, + this.deviceToken, + this.longitude, + this.latitude, + this.appointmentNo, + this.serviceID, + this.liveServiceID, + this.appointmentDate, + this.doctorID, + this.isSchedule}); + + TamaraRequestModel.fromJson(Map json) { + merchantReference = json['Merchant_Reference']; + merchantIdentifier = json['Merchant_Identifier']; + clientRequestID = json['ClientRequestID']; + amount = json['Amount']; + currency = json['Currency']; + language = json['Language']; + commandType = json['CommandType']; + signature = json['Signature']; + customerEmail = json['CustomerEmail']; + orderDescription = json['OrderDescription']; + isInstallment = json['IsInstallment']; + projectID = json['ProjectID']; + accessCode = json['Access_code']; + sHARequestPhase = json['SHA_RequestPhase']; + sHAResponsePhase = json['SHA_ResponsePhase']; + customerName = json['CustomerName']; + fileNumber = json['FileNumber']; + patientOutSA = json['PatientOutSA']; + deviceToken = json['DeviceToken']; + longitude = json['Longitude']; + latitude = json['Latitude']; + appointmentNo = json['AppointmentNo']; + serviceID = json['Service_ID']; + liveServiceID = json['Live_ServiceID']; + doctorID = json['DoctorID']; + appointmentDate = json['AppointmentDate']; + isSchedule = json['IsSchedule']; + } + + Map toJson() { + final Map data = new Map(); + data['Merchant_Reference'] = this.merchantReference; + data['Merchant_Identifier'] = this.merchantIdentifier; + data['ClientRequestID'] = this.clientRequestID; + data['Amount'] = this.amount; + data['Currency'] = this.currency; + data['Language'] = this.language; + data['CommandType'] = this.commandType; + data['Signature'] = this.signature; + data['CustomerEmail'] = this.customerEmail; + data['OrderDescription'] = this.orderDescription; + data['IsInstallment'] = this.isInstallment; + data['ProjectID'] = this.projectID; + data['Access_code'] = this.accessCode; + data['SHA_RequestPhase'] = this.sHARequestPhase; + data['SHA_ResponsePhase'] = this.sHAResponsePhase; + data['CustomerName'] = this.customerName; + data['FileNumber'] = this.fileNumber; + data['PatientOutSA'] = this.patientOutSA; + data['DeviceToken'] = this.deviceToken; + data['Longitude'] = this.longitude; + data['Latitude'] = this.latitude; + data['AppointmentNo'] = this.appointmentNo; + data['Service_ID'] = this.serviceID; + data['Live_ServiceID'] = this.liveServiceID; + data['DoctorID'] = this.doctorID; + data['AppointmentDate'] = this.appointmentDate; + data['IsSchedule'] = this.isSchedule; + return data; + } +} diff --git a/lib/core/common_models/threshold.dart b/lib/core/common_models/threshold.dart new file mode 100644 index 0000000..c8e897c --- /dev/null +++ b/lib/core/common_models/threshold.dart @@ -0,0 +1,21 @@ +import 'dart:ui' show Color; + +class ThresholdRange { + final String label; + final double value; + final Color color; + final Color lineColor; + final String? actualValue; + + ThresholdRange( + {required this.label, + required this.value, + required this.color, + required this.lineColor, + this.actualValue}); + + @override + String toString() { + return 'ThresholdRange(label: $label, value: $value, color: ${color.value.toRadixString(16)}, lineColor: ${lineColor.value.toRadixString(16)})'; + } +} \ No newline at end of file diff --git a/lib/core/consts.dart b/lib/core/consts.dart deleted file mode 100644 index 4f98f21..0000000 --- a/lib/core/consts.dart +++ /dev/null @@ -1,51 +0,0 @@ -class ApiConsts { - static const maxSmallScreen = 660; - - static bool isDevelopment = true; - - // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT - static String baseUrl = 'https://hmgwebservices.com/'; // HIS API URL PROD - - static String SELECT_DEVICE_IMEI = 'Services/Patients.svc/REST/Patient_SELECTDeviceIMEIbyIMEI'; - - static String VERSION_ID = "1.6"; - - static setBackendURLs() { - if (isDevelopment) { - baseUrl = "https://uat.hmgwebservices.com/"; - } else { - baseUrl = "https://hmgwebservices.com/"; - } - } -} - -class SharedPrefsConsts { - static String isRememberMe = "remember_me"; - static String username = "doctorId"; - static String password = "password"; - static String logInTokenID = "logInTokenID"; - static String vidaAuthTokenID = "vidaAuthTokenID"; - static String vidaRefreshTokenID = "vidaRefreshTokenID"; - static String authenticationTokenID = "authenticationTokenID"; - static String projectID = "projectID"; - static String clinicId = "clinicId"; - static String lastLoginDate = "lastLoginDate"; - static String lastLoginTime = "lastLoginTime"; - static String memberModel = "memberModel"; - - static String isShowOnboarding = "is_show_onboarding"; - static String appAuthToken = "app_auth_token"; - static String appUserID = "app_user_id"; - static String loggedInUserObj = "logged_in_user_obj"; - - static String PUSH_TOKEN = "push_token"; - static String APNS_TOKEN = "apns_token"; - static String VOIP_TOKEN = "voip_token"; - static String PATIENT_MRN = "patient_mrn"; - - static String loggedInUserID = "logged_in_user_id"; - static String loggedInUserPassword = "logged_in_user_password"; - - static String user_lat = 'user-lat'; - static String user_long = 'user-long'; -} diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index 4b3b0d6..cc9d88d 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -1,9 +1,238 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:get_it/get_it.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:injector/injector.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_repo.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_repo.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/common/common_repo.dart'; +import 'package:hmg_patient_app_new/features/contact_us/contact_us_repo.dart'; +import 'package:hmg_patient_app_new/features/contact_us/contact_us_view_model.dart'; +import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_repo.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_repo.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_repo.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_repo.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_repo.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; +import 'package:hmg_patient_app_new/features/location/location_repo.dart'; +import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_repo.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/payfort_repo.dart'; +import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_repo.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; +import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart'; +import 'package:hmg_patient_app_new/features/radiology/radiology_repo.dart'; +import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; +import 'package:hmg_patient_app_new/services/cache_service.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/services/firebase_service.dart'; +import 'package:hmg_patient_app_new/services/localauth_service.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; +import 'package:http/http.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:logger/web.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +GetIt getIt = GetIt.instance; class AppDependencies { - static void addDependencies() { - Injector injector = Injector.appInstance; - injector.registerSingleton(() => AppState()); + static Future addDependencies() async { + Logger logger = Logger( + printer: PrettyPrinter( + methodCount: 2, + errorMethodCount: 5, + lineLength: 1000, + colors: true, + printEmojis: true, + ), + ); + + // Core Services + getIt.registerLazySingleton(() => LoggerServiceImp(logger: logger)); + getIt.registerLazySingleton(() => FirebaseServiceImpl( + loggerService: getIt(), + appState: getIt(), + firebaseMessaging: FirebaseMessaging.instance, + )); + + getIt.registerLazySingleton(() => NavigationService()); + getIt.registerLazySingleton(() => LocalAuthentication()); + + getIt.registerLazySingleton(() => GAnalytics()); + getIt.registerLazySingleton(() => AppState(navigationService: getIt())); + getIt.registerLazySingleton(() => LocationUtils( + isShowConfirmDialog: false, + navigationService: getIt(), + appState: getIt(), + )); + getIt.registerLazySingleton(() => DialogServiceImp(navigationService: getIt())); + getIt.registerLazySingleton(() => ErrorHandlerServiceImp( + dialogService: getIt(), + loggerService: getIt(), + navigationService: getIt(), + )); + + final sharedPreferences = await SharedPreferences.getInstance(); + getIt.registerLazySingleton(() => CacheServiceImp(sharedPreferences: sharedPreferences, loggerService: getIt())); + getIt.registerLazySingleton(() => ApiClientImp(appState: getIt())); + + // Repositories + getIt.registerLazySingleton(() => CommonRepoImp(loggerService: getIt())); + getIt.registerLazySingleton(() => AuthenticationRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => BookAppointmentsRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => MyAppointmentsRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => LabRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => RadiologyRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => PrescriptionsRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => InsuranceRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => PayfortRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => LocalAuthService(loggerService: getIt(), localAuth: getIt())); + getIt.registerLazySingleton(() => HabibWalletRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => MedicalFileRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => ImmediateLiveCareRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => EmergencyServicesRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton( + () => LocationRepoImpl(apiClient: getIt())); + getIt.registerLazySingleton(() => ContactUsRepoImp(loggerService: getIt(), apiClient: getIt())); + + // ViewModels + // Global/shared VMs → LazySingleton + + getIt.registerLazySingleton( + () => LabViewModel(labRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt()), + ); + + getIt.registerLazySingleton( + () => RadiologyViewModel( + radiologyRepo: getIt(), + errorHandlerService: getIt(), + ), + ); + + getIt.registerLazySingleton( + () => PrescriptionsViewModel( + prescriptionsRepo: getIt(), + errorHandlerService: getIt(), + ), + ); + + getIt.registerLazySingleton( + () => InsuranceViewModel( + insuranceRepo: getIt(), + errorHandlerService: getIt(), + ), + ); + + getIt.registerLazySingleton( + () => MyAppointmentsViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt()), + ); + + getIt.registerLazySingleton( + () => PayfortViewModel( + payfortRepo: getIt(), + errorHandlerService: getIt(), + ), + ); + + getIt.registerLazySingleton( + () => HabibWalletViewModel( + habibWalletRepo: getIt(), + errorHandlerService: getIt(), + ), + ); + + getIt.registerLazySingleton( + () => MedicalFileViewModel( + medicalFileRepo: getIt(), + errorHandlerService: getIt(), + ), + ); + + getIt.registerLazySingleton( + () => BookAppointmentsViewModel(bookAppointmentsRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt(), myAppointmentsViewModel: getIt(), locationUtils: getIt(), dialogService: getIt()), + ); + + getIt.registerLazySingleton( + () => ImmediateLiveCareViewModel( + immediateLiveCareRepo: getIt(), + errorHandlerService: getIt(), + navigationService: getIt(), + myAppointmentsViewModel: getIt(), + ), + ); + + getIt.registerLazySingleton( + () => AuthenticationViewModel( + authenticationRepo: getIt(), cacheService: getIt(), navigationService: getIt(), dialogService: getIt(), appState: getIt(), errorHandlerService: getIt(), localAuthService: getIt()), + ); + getIt.registerLazySingleton(() => ProfileSettingsViewModel()); + + getIt.registerLazySingleton( + () => DateRangeSelectorRangeViewModel(), + ); + + getIt.registerLazySingleton( + () => DoctorFilterViewModel(), + ); + + getIt.registerLazySingleton( + () => + AppointmentViaRegionViewmodel( + navigationService: getIt(), + appState: getIt(), + ), + ); + + getIt.registerLazySingleton( + () => EmergencyServicesViewModel( + locationUtils: getIt(), + navServices: getIt(), + emergencyServicesRepo: getIt(), + appState: getIt(), + errorHandlerService: getIt(), + appointmentRepo: getIt(), + dialogService: getIt() + ), + ); + + getIt.registerLazySingleton( + () => LocationViewModel( + locationRepo: getIt(), + errorHandlerService: getIt(), + ), + ); + + getIt.registerLazySingleton( + () => ContactUsViewModel( + contactUsRepo: getIt(), + appState: getIt(), + errorHandlerService: getIt(), + ), + ); + + // Screen-specific VMs → Factory + // getIt.registerFactory( + // () => BookAppointmentsViewModel( + // bookAppointmentsRepo: getIt(), + // dialogService: getIt(), + // errorHandlerService: getIt(), + // ), + // ); } } diff --git a/lib/core/enums.dart b/lib/core/enums.dart index cf27602..4151bed 100644 --- a/lib/core/enums.dart +++ b/lib/core/enums.dart @@ -5,25 +5,237 @@ // unverified, // } -enum AuthMethodTypes { - sms, - whatsApp, - fingerPrint, - faceID, - moreOptions, +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; + +enum AuthMethodTypesEnum { sms, whatsApp, fingerPrint, faceID, moreOptions } + +enum ViewStateEnum { hide, idle, busy, error, busyLocal, errorLocal } + +enum CountryEnum { saudiArabia, unitedArabEmirates } + +enum CalenderEnum { gregorian, hijri } + +enum SelectionTypeEnum { dropdown, calendar, search } + +enum GenderTypeEnum { male, female } + +enum MaritalStatusTypeEnum { single, married, divorced, widowed } + +enum ChipTypeEnum { success, error, alert, info, warning, lightBg, primaryRed } + +enum OTPTypeEnum { sms, whatsapp, faceIDFingerprint } + +enum LoginTypeEnum { sms, whatsapp, face, fingerprint } + +enum AppEnvironmentTypeEnum { dev, uat, preProd, qa, staging, prod } + +enum FamilyFileEnum { active, inactive, blocked, deleted, pending, rejected } + +extension CalenderExtension on CalenderEnum { + int get toInt { + switch (this) { + case CalenderEnum.hijri: + return 1; + case CalenderEnum.gregorian: + return 0; + } + } + + String get displayName { + switch (this) { + case CalenderEnum.hijri: + return 'Hijri'; + case CalenderEnum.gregorian: + return 'Gregorian'; + } + } + + static LoginTypeEnum? fromValue(int value) { + switch (value) { + case 1: + return LoginTypeEnum.sms; + case 2: + return LoginTypeEnum.fingerprint; + case 3: + return LoginTypeEnum.face; + case 4: + return LoginTypeEnum.whatsapp; + default: + return null; + } + } } -enum ViewState { - hide, - idle, - busy, - error, - busyLocal, - errorLocal, +extension LoginTypeExtension on LoginTypeEnum { + int get toInt { + switch (this) { + case LoginTypeEnum.sms: + return 1; + case LoginTypeEnum.whatsapp: + return 4; + case LoginTypeEnum.face: + return 3; + case LoginTypeEnum.fingerprint: + return 2; + } + } + + String get displayName { + AppState appState = getIt.get(); + bool isArabic = appState.getLanguageID() == 1 ? true : false; + switch (this) { + case LoginTypeEnum.sms: + return isArabic ? 'رسالة نصية' : 'SMS'; + case LoginTypeEnum.whatsapp: + return isArabic ? 'واتساب' : 'WhatsApp'; + case LoginTypeEnum.face: + return isArabic ? 'القياسات الحيوية' : 'Biometric'; // Or 'بصمة الوجه' + case LoginTypeEnum.fingerprint: + return isArabic ? 'بصمة الإصبع' : 'Fingerprint'; + } + } + + static LoginTypeEnum? fromValue(int value) { + switch (value) { + case 0: + return LoginTypeEnum.sms; + case 1: + return LoginTypeEnum.sms; + case 2: + return LoginTypeEnum.fingerprint; + case 3: + return LoginTypeEnum.face; + case 4: + return LoginTypeEnum.whatsapp; + default: + return null; + } + } } -enum LoginType { - FROM_LOGIN, - SILENT_LOGIN, - SILENT_WITH_OTP, +extension OTPTypeEnumExtension on OTPTypeEnum { + /// Convert enum to int + int toInt() { + switch (this) { + case OTPTypeEnum.sms: + return 1; + case OTPTypeEnum.whatsapp: + return 2; + case OTPTypeEnum.faceIDFingerprint: + return 0; + } + } + + /// Convert int to enum + static OTPTypeEnum fromInt(int value) { + switch (value) { + case 1: + return OTPTypeEnum.sms; + case 2: + return OTPTypeEnum.whatsapp; + default: + throw Exception("Invalid OTPTypeEnum value: $value"); + } + } +} + +extension FamilyFileEnumExtenshion on FamilyFileEnum { + int get toInt { + switch (this) { + case FamilyFileEnum.active: + return 3; + case FamilyFileEnum.blocked: + return 1; + case FamilyFileEnum.deleted: + return 0; + case FamilyFileEnum.pending: + return 2; + case FamilyFileEnum.inactive: + return 6; + case FamilyFileEnum.rejected: + return 4; + } + } + + String get displayName { + AppState appState = getIt.get(); + bool isArabic = appState.getLanguageID() == 1 ? true : false; + switch (this) { + case FamilyFileEnum.active: + return isArabic ? 'نشط' : 'Active'; + case FamilyFileEnum.inactive: + return isArabic ? 'غير نشط' : 'Inactive'; + case FamilyFileEnum.blocked: + return isArabic ? 'محظور' : 'Blocked'; + case FamilyFileEnum.deleted: + return isArabic ? 'محذوف' : 'Deleted'; + case FamilyFileEnum.pending: + return isArabic ? 'قيد الانتظار' : 'Pending'; + case FamilyFileEnum.rejected: + return isArabic ? 'مرفوض' : 'Rejected'; + } + } + + static FamilyFileEnum? fromValue(int value) { + switch (value) { + case 0: + return FamilyFileEnum.pending; + case 2: + return FamilyFileEnum.blocked; + case 1: + return FamilyFileEnum.deleted; + case 3: + return FamilyFileEnum.active; + case 4: + return FamilyFileEnum.inactive; + default: + return null; + } + } +} + +enum ServiceTypeEnum { + advancePayment, //3 + ancillaryOrder, //3 + appointmentPayment, //2 + covidPayment, //2 + erOnlineCheckIn, //3 + liveCareAppointment //4 +} + +extension ServiceTypeEnumExt on ServiceTypeEnum { + String value() { + switch (this) { + case ServiceTypeEnum.advancePayment: + return "Advance Payment"; + case ServiceTypeEnum.ancillaryOrder: + return "Ancillary Order"; + case ServiceTypeEnum.appointmentPayment: + return "Appointment Payment"; + case ServiceTypeEnum.covidPayment: + return "Covid Payment"; + case ServiceTypeEnum.erOnlineCheckIn: + return "ER Online Check In"; + case ServiceTypeEnum.liveCareAppointment: + return "LiveCare Appointment"; + } + } + + int getIdFromServiceEnum() { + switch (this) { + case ServiceTypeEnum.advancePayment: + return 3; + case ServiceTypeEnum.ancillaryOrder: + return 3; + case ServiceTypeEnum.appointmentPayment: + return 2; + case ServiceTypeEnum.covidPayment: + return 2; + case ServiceTypeEnum.erOnlineCheckIn: + return 3; + case ServiceTypeEnum.liveCareAppointment: + return 4; + } + } } diff --git a/lib/core/exceptions/api_exception.dart b/lib/core/exceptions/api_exception.dart new file mode 100644 index 0000000..eb11b71 --- /dev/null +++ b/lib/core/exceptions/api_exception.dart @@ -0,0 +1,30 @@ +import 'dart:convert'; + +import 'package:equatable/equatable.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; + +class APIException implements Exception { + static const String BAD_REQUEST = 'api_common_bad_request'; + static const String UNAUTHORIZED = 'api_common_unauthorized'; + static const String FORBIDDEN = 'api_common_forbidden'; + static const String NOT_FOUND = 'api_common_not_found'; + static const String INTERNAL_SERVER_ERROR = 'api_common_internal_server_error'; + static const String UPGRADE_REQUIRED = 'api_common_upgrade_required'; + static const String BAD_RESPONSE_FORMAT = 'api_common_bad_response_format'; + static const String OTHER = 'api_common_http_error'; + static const String TIMEOUT = 'api_common_http_timeout'; + static const String UNKNOWN = 'unexpected_error'; + + final String message; + final arguments; + + const APIException(this.message, {this.arguments}); + + Map toJson() => {'message': message, 'arguments': '$arguments'}; + + @override + String toString() { + return jsonEncode(this); + } +} + diff --git a/lib/core/exceptions/api_failure.dart b/lib/core/exceptions/api_failure.dart new file mode 100644 index 0000000..0c5bc66 --- /dev/null +++ b/lib/core/exceptions/api_failure.dart @@ -0,0 +1,97 @@ +import 'package:equatable/equatable.dart'; + +abstract class Failure extends Equatable implements Exception { + final String message; + + const Failure(this.message); +} + +class ServerFailure extends Failure { + final String url; + + const ServerFailure(super.message, {this.url = ""}); + + @override + List get props => [message]; +} + +class UserIntimationFailure extends Failure { + const UserIntimationFailure(super.message); + + @override + List get props => [message]; +} + +class MessageStatusFailure extends Failure { + const MessageStatusFailure(super.message); + + @override + List get props => [message]; +} + +class AppUpdateFailure extends Failure { + const AppUpdateFailure(super.message); + + @override + List get props => [message]; +} + +class StatusCodeFailure extends Failure { + const StatusCodeFailure(super.message); + + @override + List get props => [message]; +} + +class UnAuthenticatedUserFailure extends Failure { + final String url; + + const UnAuthenticatedUserFailure(super.message, {this.url = ""}); + + @override + List get props => [message]; +} + +class ConnectivityFailure extends Failure { + const ConnectivityFailure(super.message); + + @override + List get props => [message]; +} + +class LocalStorageFailure extends Failure { + const LocalStorageFailure(super.message); + + @override + List get props => [message]; +} + +class DataParsingFailure extends Failure { + const DataParsingFailure(super.message); + + @override + List get props => [message]; +} + +class UnknownFailure extends Failure { + final String url; + + const UnknownFailure(super.message, {this.url = ""}); + + @override + List get props => [message]; +} + +class DuplicateUsername extends Failure { + const DuplicateUsername(String? message) : super(message ?? ''); + + @override + List get props => [message]; +} + +class InvalidCredentials extends Failure { + const InvalidCredentials(String? message) : super(message ?? ''); + + @override + List get props => [message]; +} diff --git a/lib/core/location_util.dart b/lib/core/location_util.dart index d9716a9..487b228 100644 --- a/lib/core/location_util.dart +++ b/lib/core/location_util.dart @@ -1,76 +1,152 @@ import 'dart:io'; +import 'dart:ui'; -import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:hmg_patient_app_new/core/consts.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.dart'; -import 'package:flutter/cupertino.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:gms_check/gms_check.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; - -// import 'package:huawei_location/huawei_location.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:huawei_location/huawei_location.dart' as HmsLocation show FusedLocationProviderClient, Location, LocationSettingsRequest, LocationRequest; +import 'package:location/location.dart' show Location, PermissionStatus, LocationData; +import 'package:permission_handler/permission_handler.dart' show Permission, PermissionListActions, PermissionStatusGetters, openAppSettings; class LocationUtils { + NavigationService navigationService; + AppState appState; + bool isShowConfirmDialog; bool isShowLocationTimeoutDialog; - BuildContext context; bool isHuawei; final GeolocatorPlatform _geolocatorPlatform = GeolocatorPlatform.instance; + Future? isGMSDevice; - LocationUtils({required this.isShowConfirmDialog, required this.context, this.isHuawei = false, this.isShowLocationTimeoutDialog = true}); - - void getCurrentLocation({Function(LatLng)? callBack}) async { - Geolocator.isLocationServiceEnabled().then((value) async { - if (value) { - await Geolocator.checkPermission().then((permission) async { - if (permission == LocationPermission.always || permission == LocationPermission.whileInUse) { - // Geolocator.getCurrentPosition(locationSettings: LocationSettings(accuracy: LocationAccuracy.medium, timeLimit: Duration(seconds: 5))).then((value) { - Geolocator.getLastKnownPosition().then((value) { - setLocation(value); - if (callBack != null) callBack(LatLng(value?.latitude ?? 24.7101433, value?.longitude ?? 46.6757709)); - }).catchError((err) { - print(err); - if (isShowConfirmDialog && isShowLocationTimeoutDialog) { - // showLocationTimeOutDialog(failureCallBack: () { - // Geolocator.openAppSettings(); - // }); - } - }); - } + LocationUtils({ + required this.isShowConfirmDialog, + required this.navigationService, + required this.appState, + this.isHuawei = false, + this.isShowLocationTimeoutDialog = true, + }) { + isGMSDevice = GmsCheck().checkGmsAvailability(); + } - if (permission == LocationPermission.denied || permission == LocationPermission.deniedForever) { - if (Platform.isAndroid) { - // Utils.showPermissionConsentDialog(context, TranslationBase.of(context).locationPermissionDialog, () async { - final hasPermission = await _handlePermission(); - if (hasPermission) { - // Geolocator.getCurrentPosition(locationSettings: LocationSettings(accuracy: LocationAccuracy.medium, timeLimit: Duration(seconds: 5))).then((value) { - Geolocator.getLastKnownPosition().then((value) { - setLocation(value); - if (callBack != null) callBack(LatLng(value?.latitude ?? 24.7101433, value?.longitude ?? 46.6757709)); - }); - } else { - // if (isShowConfirmDialog) showErrorLocationDialog(false, failureCallBack: () {}); - } - // }); - } else { - if (await Permission.location.request().isGranted) { - getCurrentLocation(callBack: callBack); - } else { - setZeroLocation(); - if (isShowConfirmDialog) showErrorLocationDialog(false, failureCallBack: () {}); - } - } - } - }).catchError((err) { - print(err); - }); - } else { - if (isShowConfirmDialog) showErrorLocationDialog(false, failureCallBack: () {}); + // final defaultCallbackForLocationDenied = (){ + // showCommonBottomSheetWithoutHeight( + // title: LocaleKeys.notice.tr(context: navigationService.navigatorKey.currentContext!), + // navigationService.navigatorKey.currentContext!, + // child: Utils.getWarningWidget( + // loadingText: + // "Please grant location permission from app settings to see better results" + // .needTranslation, + // isShowActionButtons: true, + // onCancelTap: () { + // navigationService.pop(); + // }, + // onConfirmTap: () async { + // navigationService.pop(); + // openAppSettings(); + // }), + // callBackFunc: () {}, + // isFullScreen: false, + // isCloseButtonVisible: true, + // ); + // } + + void getLocation( + {Function(LatLng)? onSuccess, + VoidCallback? onFailure, + bool isShowConfirmDialog = false, + VoidCallback? onLocationDeniedForever}) async { + this.isShowConfirmDialog = isShowConfirmDialog; + if (Platform.isIOS) { + getCurrentLocation( + onFailure: onFailure, + onSuccess: onSuccess, + onLocationDeniedForever: onLocationDeniedForever); + return; + } + + if (await isGMSDevice ?? true) { + getCurrentLocation( + onFailure: onFailure, + onSuccess: onSuccess, + onLocationDeniedForever: onLocationDeniedForever); + return; + } + + getHMSLocation( + onFailure: onFailure, + onSuccess: onSuccess, + onLocationDeniedForever: onLocationDeniedForever); + } + + void getCurrentLocation( + {Function(LatLng)? onSuccess, + VoidCallback? onFailure, + VoidCallback? onLocationDeniedForever}) async { + var location = Location(); + + bool isLocationEnabled = await location.serviceEnabled(); + //if the location service is not enabled, ask the user to enable it + if (!isLocationEnabled) { + isLocationEnabled = await location.requestService(); + if (!isLocationEnabled) { + appState.resetLocation(); + onFailure?.call(); + return; + } + } + + LocationPermission permissionGranted = await Geolocator.checkPermission(); + if (permissionGranted == LocationPermission.denied) { + permissionGranted = await Geolocator.requestPermission(); + if (permissionGranted != LocationPermission.whileInUse && permissionGranted != LocationPermission.always) { + appState.resetLocation(); + onFailure?.call(); + return; } - }).catchError((err) { - print(err); - }); + } else if (permissionGranted == LocationPermission.deniedForever) { + appState.resetLocation(); + if(onLocationDeniedForever == null && isShowConfirmDialog){ + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: navigationService.navigatorKey.currentContext!), + navigationService.navigatorKey.currentContext!, + child: Utils.getWarningWidget( + loadingText: + "Please grant location permission from app settings to see better results" + .needTranslation, + isShowActionButtons: true, + onCancelTap: () { + navigationService.pop(); + }, + onConfirmTap: () async { + navigationService.pop(); + openAppSettings(); + }), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + onLocationDeniedForever?.call(); + return; + } + + Position? currentLocation = await Geolocator.getLastKnownPosition(); + + if (currentLocation?.latitude == null || currentLocation?.longitude == null) { + currentLocation = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.low); + } + + LatLng locationData = LatLng(currentLocation?.latitude ?? 0.0, currentLocation?.longitude ?? 0.0); + saveLatLngToAppState(locationData); + onSuccess?.call(locationData); } Future checkIfGPSIsEnabled() async { @@ -148,21 +224,21 @@ class LocationUtils { } void setLocation(Position? position) { - Utils.saveNumFromPrefs(SharedPrefsConsts.user_lat, position?.latitude ?? 0.0); - Utils.saveNumFromPrefs(SharedPrefsConsts.user_lat, position?.longitude ?? 0.0); + Utils.saveNumFromPrefs(CacheConst.userLat, position?.latitude ?? 0.0); + Utils.saveNumFromPrefs(CacheConst.userLong, position?.longitude ?? 0.0); - AppState().setUserLat = position?.latitude ?? 0.0; - AppState().setUserLong = position?.longitude ?? 0.0; + appState.setUserLat = position?.latitude ?? 0.0; + appState.setUserLong = position?.longitude ?? 0.0; // projectViewModel.setLatitudeLongitude(position?.latitude ?? 0.0, position?.longitude ?? 0.0); } void setZeroLocation() { - Utils.saveNumFromPrefs(SharedPrefsConsts.user_lat, 0.0); - Utils.saveNumFromPrefs(SharedPrefsConsts.user_lat, 0.0); + Utils.saveNumFromPrefs(CacheConst.userLat, 0.0); + Utils.saveNumFromPrefs(CacheConst.userLong, 0.0); - AppState().setUserLat = 0.0; - AppState().setUserLong = 0.0; + appState.setUserLat = 0.0; + appState.setUserLong = 0.0; } Future requestPermissions() async { @@ -171,4 +247,96 @@ class LocationUtils { ].request(); return (result[Permission.location]!.isGranted || result[Permission.locationAlways]!.isGranted); } + + void saveLatLngToAppState(LatLng locationData) { + appState.userLat = locationData.latitude; + appState.userLong = locationData.longitude; + } + + void getHMSLocation( + {VoidCallback? onFailure, + Function(LatLng p1)? onSuccess, + VoidCallback? onLocationDeniedForever}) async { + try { + var location = Location(); + HmsLocation.FusedLocationProviderClient locationService = HmsLocation.FusedLocationProviderClient()..initFusedLocationService(); + + bool isLocationEnabled = await Geolocator.isLocationServiceEnabled(); + //if the location service is not enabled, ask the user to enable it + if (!isLocationEnabled) { + HmsLocation.LocationRequest locationRequest = HmsLocation.LocationRequest()..priority = HmsLocation.LocationRequest.PRIORITY_HIGH_ACCURACY; + + HmsLocation.LocationSettingsRequest request = HmsLocation.LocationSettingsRequest( + alwaysShow: true, + needBle: false, + requests: [locationRequest], + ); + + await locationService.checkLocationSettings(request); + } + LocationPermission permissionGranted = await Geolocator.checkPermission(); + if (permissionGranted == LocationPermission.denied) { + permissionGranted = await Geolocator.requestPermission(); + if (permissionGranted == LocationPermission.deniedForever) { + appState.resetLocation(); + if(onLocationDeniedForever == null && isShowConfirmDialog){ + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: navigationService.navigatorKey.currentContext!), + navigationService.navigatorKey.currentContext!, + child: Utils.getWarningWidget( + loadingText: + "Please grant location permission from app settings to see better results" + .needTranslation, + isShowActionButtons: true, + onCancelTap: () { + navigationService.pop(); + }, + onConfirmTap: () async { + navigationService.pop(); + openAppSettings(); + }), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + onLocationDeniedForever?.call(); + return; + } else if (permissionGranted != LocationPermission.whileInUse && permissionGranted != LocationPermission.always) { + appState.resetLocation(); + onFailure?.call(); + return; + } + } + + HmsLocation.Location data = await locationService.getLastLocation(); + if (data.latitude == null || data.longitude == null) { + appState.resetLocation(); + HmsLocation.LocationRequest request = HmsLocation.LocationRequest() + ..priority = HmsLocation.LocationRequest.PRIORITY_HIGH_ACCURACY + ..interval = 1000 // 1 second + ..numUpdates = 1; + locationService.requestLocationUpdates(request); + locationService.onLocationData?.listen((location) { + data = location; + if (data.latitude == null || data.longitude == null) { + appState.resetLocation(); + onFailure?.call(); + return; + } + var locationData = LatLng(data.latitude ?? 0.0, data.longitude ?? 0.0); + saveLatLngToAppState(locationData); + onSuccess?.call(locationData); + }); + } else { + var locationData = LatLng(data.latitude ?? 0.0, data.longitude ?? 0.0); + + saveLatLngToAppState(locationData); + onSuccess?.call(locationData); + } + } catch (e) { + appState.resetLocation(); + onFailure?.call(); + } + } } diff --git a/lib/core/post_params_model.dart b/lib/core/post_params_model.dart new file mode 100644 index 0000000..cf52306 --- /dev/null +++ b/lib/core/post_params_model.dart @@ -0,0 +1,72 @@ +class PostParamsModel { + num? versionID; + int? channel; + int? languageID; + String? logInTokenID; + String? tokenID; + String? language; + String? ipAddress; + String? generalId; + String? latitude; + String? longitude; + String? deviceTypeID; + String? patientOutSA; + String? sessionID; + String? setupID; + + PostParamsModel( + {this.versionID, + this.channel, + this.languageID, + this.logInTokenID, + this.tokenID, + this.language, + this.ipAddress, + this.generalId, + this.latitude, + this.longitude, + this.deviceTypeID, + this.sessionID}); + + PostParamsModel.fromJson(Map json) { + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + logInTokenID = json['LogInTokenID']; + tokenID = json['TokenID']; + sessionID = json['SessionID']; + } + + Map toJson() { + Map data = {}; + data['VersionID'] = versionID; + data['Channel'] = channel; + data['LanguageID'] = languageID; + data['LogInTokenID'] = logInTokenID ?? ""; + data['TokenID'] = tokenID ?? ""; + data['SessionID'] = sessionID ?? ""; + return data; + } + + Map toJsonAfterLogin() { + Map data = {}; + data['VersionID'] = versionID; + data['Channel'] = channel; + data['LanguageID'] = languageID; + data['LogInTokenID'] = logInTokenID; + data['TokenID'] = tokenID; + data['SessionID'] = sessionID; + return data; + } + + String? _logInTokenID; + + String? get getLogInTokenID => _logInTokenID ?? logInTokenID; + + set setLogInTokenID(String? value) { + logInTokenID = value; + _logInTokenID = value; + } + + set setTokenID(String? token) => tokenID = token; +} diff --git a/lib/core/utils/CalendarUtils.dart b/lib/core/utils/CalendarUtils.dart deleted file mode 100644 index 39c7a14..0000000 --- a/lib/core/utils/CalendarUtils.dart +++ /dev/null @@ -1,178 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; -import 'dart:ui'; - -import 'package:device_calendar/device_calendar.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.dart'; -import 'package:manage_calendar_events/manage_calendar_events.dart' as ios; -import 'package:timezone/data/latest.dart' as tzl; - -final DeviceCalendarPlugin deviceCalendarPlugin = DeviceCalendarPlugin(); -final ios.CalendarPlugin _myPlugin = ios.CalendarPlugin(); - -class CalendarUtils { - static Completer? _completer; - - dynamic get writableCalendars => calendars.firstWhere((c) => !c.isReadOnly!); - dynamic calendars; - - CalendarUtils._(this.calendars); - - // static Future getInstance() async { - // if (_completer == null) { - // _completer = Completer(); - // print(_completer!.isCompleted); - // try { - // final dynamic calendarsResult; - // if (Platform.isIOS) { - // calendarsResult = await _myPlugin.getCalendars(); - // if (!_completer!.isCompleted) { - // _completer?.complete(CalendarUtils._(await calendarsResult!)); - // } - // } else { - // calendarsResult = await deviceCalendarPlugin.retrieveCalendars(); - // if (!_completer!.isCompleted) { - // _completer?.complete(CalendarUtils._(await calendarsResult.data!)); - // } - // } - // } on Exception catch (e) { - // if (!_completer!.isCompleted) { - // _completer!.completeError(e); - // } - // } - // } - // return _completer!.future; - // } - - static Future getInstance() async { - tzl.initializeTimeZones(); - if (_completer != null) { - return _completer!.future; - } - _completer = Completer(); - try { - final dynamic calendarsResult; - if (Platform.isIOS) { - calendarsResult = await _myPlugin.getCalendars(); - _completer!.complete(CalendarUtils._(calendarsResult)); - } else { - calendarsResult = await deviceCalendarPlugin.retrieveCalendars(); - _completer!.complete(CalendarUtils._(calendarsResult.data)); - } - } catch (e) { - _completer!.completeError(e); - } - - return _completer!.future; - } - - Future createOrUpdateEvents({List? scheduleList, String? title, String? description, List? scheduleDateTime, List? daysOfWeek}) async { - tzl.initializeTimeZones(); - List events = []; - Location _currentLocation; - if (DateTime.now().timeZoneName == "+04") - _currentLocation = getLocation('Asia/Dubai'); - else - _currentLocation = getLocation('Asia/Riyadh'); - - scheduleDateTime!.forEach((element) { - RecurrenceRule recurrenceRule = RecurrenceRule( - // RecurrenceFrequency.Daily, - // daysOfWeek: daysOfWeek, - // endDate: element, - until: element, frequency: Frequency.daily, - ); - //added byAamir Tz Time - Event event = Event(writableCalendars!.id, - recurrenceRule: recurrenceRule, - start: TZDateTime.from(element, _currentLocation), - end: TZDateTime.from(element.add(Duration(minutes: 30)), _currentLocation), - title: title, - description: description); - events.add(event); - }); - - events.forEach((element) { - deviceCalendarPlugin.createOrUpdateEvent(element); - }); - } - - Future createOrUpdateEvent({required String title, required String description, required String location, DateTime? scheduleDateTime, String? eventId}) async { - RecurrenceRule recurrenceRule = RecurrenceRule( - // RecurrenceFrequency.Daily, - // daysOfWeek: daysOfWeek, - // endDate: scheduleDateTime, - until: scheduleDateTime, frequency: Frequency.daily, - ); - - Location _currentLocation; - // if (DateTime.now().timeZoneName == "+04") - // _currentLocation = getLocation('Asia/Dubai'); - // else - _currentLocation = getLocation('Asia/Riyadh'); - - TZDateTime scheduleDateTimeUTZ = TZDateTime.from(scheduleDateTime!, _currentLocation); - - print("writableCalendars-name: " + writableCalendars.name); - print("writableCalendars-Id: " + writableCalendars.id); - print("writableCalendarsToString: " + writableCalendars.toString()); - print("writableCalendarsToString: " + writableCalendars!.id!); - Event event = Event( - writableCalendars!.id, - start: scheduleDateTimeUTZ, - end: scheduleDateTimeUTZ.add(Duration(minutes: 30)), - title: title, - description: description, - ); - - ios.CalendarEvent iosCalEvent = - ios.CalendarEvent(location: location, startDate: scheduleDateTimeUTZ, endDate: scheduleDateTimeUTZ.add(Duration(minutes: 30)), title: title, description: description, isAllDay: false); - - if (Platform.isAndroid) { - Result result = await deviceCalendarPlugin.hasPermissions(); - print(result); - await deviceCalendarPlugin.createOrUpdateEvent(event).catchError((e) { - print("catchError " + e.toString()); - }).whenComplete(() { - print("whenComplete Calender ID " + eventId!); - // Utils.showToast(LocaleKeys.appoReminderSuccess.tr()); - }); - } else { - await _myPlugin.createEvent(calendarId: writableCalendars.id!, event: iosCalEvent).catchError((e) { - print("catchError " + e.toString()); - }).whenComplete(() { - print("whenComplete Calender ID iOS " + eventId!); - // Utils.showToast(LocaleKeys.appoReminderSuccess.tr()); - }); - } - } - - deleteEvent(String _calendarId, String _eventId) async { - if (Platform.isIOS) { - await _myPlugin.deleteEvent(calendarId: _calendarId, eventId: _eventId); - } else { - await deviceCalendarPlugin.deleteEvent(_calendarId, _eventId); - } - } - - Future retrieveEvents( - String calendarId, - RetrieveEventsParams retrieveEventsParams, - ) async { - if (Platform.isIOS) { - return await _myPlugin.getEvents(calendarId: calendarId); - } else { - return await deviceCalendarPlugin.retrieveEvents(calendarId, retrieveEventsParams); - } - } - - Future createCalendar( - String calendarName, { - Color? calendarColor, - String? localAccountName, - }) async { - return await deviceCalendarPlugin.createCalendar(calendarName, calendarColor: calendarColor, localAccountName: localAccountName); - } -} diff --git a/lib/core/utils/calendar_utils.dart b/lib/core/utils/calendar_utils.dart new file mode 100644 index 0000000..2068db9 --- /dev/null +++ b/lib/core/utils/calendar_utils.dart @@ -0,0 +1,316 @@ +import 'dart:async'; +import 'dart:collection'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:ui'; + +import 'package:device_calendar/device_calendar.dart'; +import 'package:flutter/widgets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_reminder_view.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/services/permission_service.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:jiffy/jiffy.dart'; +import 'package:manage_calendar_events/manage_calendar_events.dart' as ios; +import 'package:permission_handler/permission_handler.dart'; +import 'package:timezone/data/latest.dart' as tzl; + +final DeviceCalendarPlugin deviceCalendarPlugin = DeviceCalendarPlugin(); +final ios.CalendarPlugin _myPlugin = ios.CalendarPlugin(); + +class CalendarUtils { + static Completer? _completer; + + dynamic get writableCalendars => calendars.firstWhere((c) => !c.isReadOnly!); + dynamic calendars; + + CalendarUtils._(this.calendars); + + // static Future getInstance() async { + // if (_completer == null) { + // _completer = Completer(); + // print(_completer!.isCompleted); + // try { + // final dynamic calendarsResult; + // if (Platform.isIOS) { + // calendarsResult = await _myPlugin.getCalendars(); + // if (!_completer!.isCompleted) { + // _completer?.complete(CalendarUtils._(await calendarsResult!)); + // } + // } else { + // calendarsResult = await deviceCalendarPlugin.retrieveCalendars(); + // if (!_completer!.isCompleted) { + // _completer?.complete(CalendarUtils._(await calendarsResult.data!)); + // } + // } + // } on Exception catch (e) { + // if (!_completer!.isCompleted) { + // _completer!.completeError(e); + // } + // } + // } + // return _completer!.future; + // } + + static Future getInstance() async { + tzl.initializeTimeZones(); + if (_completer != null) { + return _completer!.future; + } + _completer = Completer(); + try { + final dynamic calendarsResult; + if (Platform.isIOS) { + calendarsResult = await _myPlugin.getCalendars(); + _completer!.complete(CalendarUtils._(calendarsResult)); + } else { + calendarsResult = await deviceCalendarPlugin.retrieveCalendars(); + _completer!.complete(CalendarUtils._(calendarsResult.data)); + } + } catch (e) { + _completer!.completeError(e); + } + + return _completer!.future; + } + + Future createOrUpdateEvents({List? scheduleList, String? title, String? description, List? scheduleDateTime, List? daysOfWeek}) async { + tzl.initializeTimeZones(); + List events = []; + Location _currentLocation; + if (DateTime.now().timeZoneName == "+04") + _currentLocation = getLocation('Asia/Dubai'); + else + _currentLocation = getLocation('Asia/Riyadh'); + + scheduleDateTime!.forEach((element) { + RecurrenceRule recurrenceRule = RecurrenceRule( + // RecurrenceFrequency.Daily, + // daysOfWeek: daysOfWeek, + // endDate: element, + until: element, frequency: Frequency.daily, + ); + //added byAamir Tz Time + Event event = Event(writableCalendars!.id, + recurrenceRule: recurrenceRule, + start: TZDateTime.from(element, _currentLocation), + end: TZDateTime.from(element.add(Duration(minutes: 30)), _currentLocation), + title: title, + description: description); + events.add(event); + }); + + events.forEach((element) { + deviceCalendarPlugin.createOrUpdateEvent(element); + }); + } + + Future createOrUpdateEvent({required String title, required String description, required String location, DateTime? scheduleDateTime, String? eventId}) async { + RecurrenceRule recurrenceRule = RecurrenceRule( + // RecurrenceFrequency.Daily, + // daysOfWeek: daysOfWeek, + // endDate: scheduleDateTime, + until: scheduleDateTime, frequency: Frequency.daily, + ); + + Location _currentLocation; + // if (DateTime.now().timeZoneName == "+04") + // _currentLocation = getLocation('Asia/Dubai'); + // else + _currentLocation = getLocation('Asia/Riyadh'); + + TZDateTime scheduleDateTimeUTZ = TZDateTime.from(scheduleDateTime!, _currentLocation); + + print("writableCalendars-name: " + writableCalendars.name); + print("writableCalendars-Id: " + writableCalendars.id); + print("writableCalendarsToString: " + writableCalendars.toString()); + print("writableCalendarsToString: " + writableCalendars!.id!); + Event event = Event( + writableCalendars!.id, + start: scheduleDateTimeUTZ, + end: scheduleDateTimeUTZ.add(Duration(minutes: 30)), + title: title, + description: description, + ); + + ios.CalendarEvent iosCalEvent = + ios.CalendarEvent(location: location, startDate: scheduleDateTimeUTZ, endDate: scheduleDateTimeUTZ.add(Duration(minutes: 30)), title: title, description: description, isAllDay: false); + + if (Platform.isAndroid) { + Result result = await deviceCalendarPlugin.hasPermissions(); + print(result); + await deviceCalendarPlugin.createOrUpdateEvent(event).catchError((e) { + print("catchError " + e.toString()); + }).whenComplete(() { + print("whenComplete Calender ID " + eventId!); + }); + } else { + await _myPlugin.createEvent(calendarId: writableCalendars.id!, event: iosCalEvent).catchError((e) { + print("catchError " + e.toString()); + }).whenComplete(() { + print("whenComplete Calender ID iOS " + eventId!); + }); + } + } + + deleteEvent(String _calendarId, String _eventId) async { + if (Platform.isIOS) { + await _myPlugin.deleteEvent(calendarId: _calendarId, eventId: _eventId); + } else { + await deviceCalendarPlugin.deleteEvent(_calendarId, _eventId); + } + } + + Future retrieveEvents( + String calendarId, + RetrieveEventsParams retrieveEventsParams, + ) async { + if (Platform.isIOS) { + return await _myPlugin.getEvents(calendarId: calendarId); + } else { + return await deviceCalendarPlugin.retrieveEvents(calendarId, retrieveEventsParams); + } + } + + Future createCalendar( + String calendarName, { + Color? calendarColor, + String? localAccountName, + }) async { + return await deviceCalendarPlugin.createCalendar(calendarName, calendarColor: calendarColor, localAccountName: localAccountName); + } +} + +Future> requestPermissions() async { + var permissionResults = [Permission.calendarFullAccess].request(); + return permissionResults; +} + +showReminderBottomSheet(BuildContext context, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted, + {required Function() onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool isMultiAllowed = false}) async { + if (Platform.isAndroid) { + if (await PermissionService.isCalendarPermissionEnabled()) { + _showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, + onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed); + } else { + // Utils.showPermissionConsentDialog(context, TranslationBase.of(context).calendarPermission, () async { + // if (await Permission.calendarFullAccess.request().isGranted) { + // _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, + // onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed); + // } + // }); + } + } else { + if (await Permission.calendarWriteOnly.request().isGranted) { + if (await Permission.calendarFullAccess.request().isGranted) { + _showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, + onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed); + } + } + } +} + +Future _showReminderBottomSheet(BuildContext providedContext, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted, + {required Function onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool? isMultiAllowed}) async { + showCommonBottomSheetWithoutHeight(providedContext, title: "Set the timer of reminder".needTranslation, child: PrescriptionReminderView( + setReminder: (int value) async { + if (!isMultiAllowed!) { + if (onMultiDateSuccess == null) { + CalendarUtils calendarUtils = await CalendarUtils.getInstance(); + await calendarUtils.createOrUpdateEvent( + title: title ?? "You have appointment with Dr. ".needTranslation + doctorName, + description: description ?? "At " + appoDateFormatted + " " + appoTimeFormatted, + scheduleDateTime: dateTime, + eventId: eventId, + location: ''); + onSuccess(); + } + } else { + onMultiDateSuccess!(value); + } + }, + ), callBackFunc: () {}, isFullScreen: false); +} + +setCalender(BuildContext context, + {required String eventId, required int selectedMinutes, int? frequencyNumber, required int days, required String orderDate, required String itemDescriptionN, required String route}) async { + DateTime actualDate = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day, 8, 0); + frequencyNumber ??= 2; //Some time frequency number is null so by default will be 2 + + int remainingDays = days - (Jiffy.parseFromDateTime(DateTime.now()).diff(Jiffy.parseFromDateTime(DateUtil.convertStringToDate(orderDate)), unit: Unit.day) as int); + if (remainingDays.isNegative) { + getIt.get().showErrorBottomSheet(message: "Prescription date has been already passed you can not add a reminder for this prescription."); + return; + } + CalendarUtils calendarUtils = await CalendarUtils.getInstance(); + + try { + for (int i = 0; i < remainingDays; i++) { + //event for number of days. + for (int j = 0; j < frequencyNumber; j++) { + // event for number of times per day. + if (j != 0) { + actualDate.add(new Duration(hours: 8)); // 8 hours addition for daily dose. + } + //Time subtraction from actual reminder time. like before 30, or 1 hour. + + actualDate = Jiffy.parseFromDateTime(actualDate).subtract(minutes: selectedMinutes).dateTime; + + calendarUtils.createOrUpdateEvent( + title: "$itemDescriptionN} Prescription Reminder", + description: "$itemDescriptionN $frequencyNumber $route ", + scheduleDateTime: actualDate, + eventId: eventId + (i.toString() + j.toString()), + location: '', //event id with varitions + ); + + actualDate = DateTime(actualDate.year, actualDate.month, actualDate.day, 8, 0); + } + actualDate = Jiffy.parseFromDateTime(actualDate).add(days: 1).dateTime; + } + } catch (ex) { + getIt.get().showErrorBottomSheet(message: "catch:$ex"); + } +} + +Future checkAndRemove(hasReminder, {bool delete = false, String itemDescriptionN = ""}) async { + final ios.CalendarPlugin _myPlugin = ios.CalendarPlugin(); + CalendarUtils calendarUtils = await CalendarUtils.getInstance(); + DateTime startEventsDate = Jiffy.parseFromDateTime(DateTime.now()).subtract(days: 30).dateTime; + DateTime endEventsDate = Jiffy.parseFromDateTime(DateTime.now()).add(days: 120).dateTime; + RetrieveEventsParams params = RetrieveEventsParams(startDate: startEventsDate, endDate: endEventsDate); + + if (calendarUtils.calendars != null) { + if (Platform.isAndroid) { + await processEvents(calendarUtils.calendars, calendarUtils, params, delete, itemDescriptionN, hasReminder); + } else { + List? iosCalendars = await _myPlugin.getCalendars(); + if (iosCalendars != null) { + await processEvents(iosCalendars.map((cal) => Calendar(id: cal.id, name: cal.name, accountName: cal.accountName)).toList(), calendarUtils, params, delete, itemDescriptionN, hasReminder); + } + } + } +} + +Future processEvents(List calendars, calendarUtils, params, delete, String itemDescriptionN, hasReminder) async { + for (var calendar in calendars) { + Result> events = await calendarUtils.retrieveEvents(calendar.id!, params); + for (var event in events.data!) { + if (event.title!.contains(itemDescriptionN)) { + if (delete) { + await calendarUtils.deleteEvent(calendar, event); + // AppToast.showSuccessToast(message: TranslationBase.of(context).reminderCancelSuccess); + hasReminder = false; + } else { + hasReminder = false; + // setState(() { + // hasReminder = true; + // }); + } + } + } + } +} diff --git a/lib/core/utils/date_util.dart b/lib/core/utils/date_util.dart new file mode 100644 index 0000000..d58aef6 --- /dev/null +++ b/lib/core/utils/date_util.dart @@ -0,0 +1,497 @@ +import 'package:device_calendar/device_calendar.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class DateUtil { + /// convert String To Date function + /// [date] String we want to convert + static DateTime convertStringToDate(String? date) { + print("the date is $date"); + + if (date == null) return DateTime.now(); + if (date.isEmpty) return DateTime.now(); + + const start = "/Date("; + const end = "+0300)"; + final startIndex = date.indexOf(start); + final endIndex = date.indexOf(end, startIndex + start.length); + return DateTime.fromMillisecondsSinceEpoch(int.parse( + date.substring(startIndex + start.length, endIndex), + )); + + } + + static DateTime convertStringToDateSaudiTimezone(String date, int projectId) { + if (date != null) { + const start = "/Date("; + const end = "+0300)"; + final startIndex = date.indexOf(start); + final endIndex = date.indexOf(end, startIndex + start.length); + // if (projectId == 2 || projectId == 3) { + // return DateTime.fromMillisecondsSinceEpoch( + // int.parse( + // date.substring(startIndex + start.length, endIndex), + // ), + // isUtc: true) + // .add(Duration(hours: 4)); + // } else { + return DateTime.fromMillisecondsSinceEpoch( + int.parse( + date.substring(startIndex + start.length, endIndex), + ), + isUtc: true) + .add(Duration(hours: 3)); + // } + } else { + return DateTime.now(); + } + } + + static DateTime convertStringToDateNoTimeZone(String date) { + // /Date(1585774800000+0300)/ + if (date != null) { + const start = "/Date("; + const end = ")"; + final startIndex = date.indexOf(start); + final endIndex = date.indexOf(end, startIndex + start.length); + return DateTime.fromMillisecondsSinceEpoch( + int.parse( + date.substring(startIndex + start.length, endIndex), + ), + ); + } else { + return DateTime.now(); + } + } + + static DateTime convertStringToDateTime(String? date) { + if (date != null) { + try { + var dateT = date.split('/'); + var year = dateT[2].substring(0, 4); + var dateP = DateTime(int.parse(year), int.parse(dateT[1]), int.parse(dateT[0])); + return dateP; + } catch (e) { + print(e); + } + + return DateTime.now(); + } else { + return DateTime.now(); + } + } + + static String convertDateToString(DateTime date) { + const start = "/Date("; + const end = "+0300)/"; + int milliseconds = date.millisecondsSinceEpoch; + + return start + "$milliseconds" + end; + } + + static String convertDateToStringLocation(DateTime date) { + const start = "/Date("; + const end = ")/"; + int milliseconds = date.millisecondsSinceEpoch; + + return start + "$milliseconds" + end; + } + + static String convertTime(String timeStr) { + TimeOfDay time = TimeOfDay(hour: int.parse(timeStr.split(":")[0]), minute: int.parse(timeStr.split(":")[1])); // 24-hour format time + + int hour = time.hourOfPeriod; // get hour in 12-hour format + String meridiem = time.period == DayPeriod.am ? "AM" : "PM"; // get AM/PM + + String convertedTime = '$hour:${time.minute == 0 ? "00" : time.minute} $meridiem'; // create the new time string + + return convertedTime; + } + + static String formatDateToDate(DateTime date, bool isArabic) { + return DateFormat('dd MMM yyy', isArabic ? "ar_SA" : "en_US").format(date); + } + + static String formatDateToTime(DateTime date) { + return DateFormat('hh:mm a').format(date); + } + + static String yearMonthDay(DateTime dateTime) { + String dateFormat = '${dateTime.year}-${dateTime.month}-${dateTime.day}'; + return dateFormat; + } + + static String time(DateTime dateTime) { + String dateFormat = '${dateTime.hour}:${dateTime.minute}:00'; + return dateFormat; + } + + static String convertDateMSToJsonDate(utc) { + var dt = new DateTime.fromMicrosecondsSinceEpoch(utc); + + return "/Date(" + (dt.millisecondsSinceEpoch * 1000).toString() + '+0300' + ")/"; + } + + /// check Date + /// [dateString] String we want to convert + static String checkDate(DateTime checkedTime) { + DateTime currentTime = DateTime.now(); + if ((currentTime.year == checkedTime.year) && (currentTime.month == checkedTime.month) && (currentTime.day == checkedTime.day)) { + return "Today"; + } else if ((currentTime.year == checkedTime.year) && (currentTime.month == checkedTime.month)) { + if ((currentTime.day - checkedTime.day) == 1) { + return "YESTERDAY"; + } else if ((currentTime.day - checkedTime.day) == -1) { + return "Tomorrow"; + } + + if ((currentTime.day - checkedTime.day) <= -2) { + return "Next Week"; + } else { + return "Old Date"; + } + } + return "Old Date"; + } + + static String getDateFormatted(String date) { + DateTime dateObj = DateUtil.convertStringToDate(date); + return DateUtil.getWeekDay(dateObj.weekday) + ", " + dateObj.day.toString() + " " + DateUtil.getMonth(dateObj.month) + " " + dateObj.year.toString(); + } + + static String getISODateFormat(DateTime dateTime) { + // 2020-04-30T00:00:00.000 + return dateTime.toIso8601String(); + } + + /// get month by + /// [month] convert month number in to month name + static getMonth(int month) { + switch (month) { + case 1: + return "January"; + case 2: + return "February"; + case 3: + return "March"; + case 4: + return "April"; + case 5: + return "May"; + case 6: + return "June"; + case 7: + return "July"; + case 8: + return "August"; + case 9: + return "September"; + case 10: + return "October"; + case 11: + return "November"; + case 12: + return "December"; + } + } + + /// get month by + /// [month] convert month number in to month name in Arabic + static getMonthArabic(int month) { + switch (month) { + case 1: + return "يناير"; + case 2: + return " فبراير"; + case 3: + return "مارس"; + case 4: + return "أبريل"; + case 5: + return "مايو"; + case 6: + return "يونيو"; + case 7: + return "يوليو"; + case 8: + return "أغسطس"; + case 9: + return "سبتمبر"; + case 10: + return " اكتوبر"; + case 11: + return " نوفمبر"; + case 12: + return "ديسمبر"; + } + } + + static getMonthByName(String month) { + switch (month.toLowerCase()) { + case 'january': + return 1; + case 'february': + return 2; + case 'march': + return 3; + case 'april': + return 4; + case 'may': + return 5; + case 'june': + return 6; + case 'july': + return 7; + case 'august': + return 8; + case 'september': + return 9; + case 'october': + return 10; + case 'november': + return 11; + case 'december': + return 12; + } + } + + static getMonthDateTime(String month, yearName) { + DateTime? date; + try { + date = DateTime(int.parse(yearName), getMonthByName(month)); + } catch (e) { + print(e); + } + return date ?? DateTime.now(); + } + + /// get month by + /// [weekDay] convert week day in int to week day name + static getWeekDay(int weekDay) { + switch (weekDay) { + case 1: + return "Monday"; + case 2: + return "Tuesday"; + case 3: + return "Wednesday"; + case 4: + return "Thursday"; + case 5: + return "Friday"; + case 6: + return "Saturday "; + case 7: + return "Sunday"; + } + } + + /// get month by + /// [weekDay] convert week day in int to week day name arabic + static getWeekDayArabic(int weekDay) { + switch (weekDay) { + case 1: + return "الاثنين"; + case 2: + return "الثلاثاء"; + case 3: + return "الاربعاء"; + case 4: + return "الخميس"; + case 5: + return "الجمعه"; + case 6: + return "السبت "; + case 7: + return "الاحد"; + } + } + + static getWeekDayEnglish(int weekDay) { + switch (weekDay) { + case 1: + return "Monday"; + case 2: + return "Tuesday"; + case 3: + return "Wednesday"; + case 4: + return "Thursday"; + case 5: + return "Friday"; + case 6: + return "Saturday "; + case 7: + return "Sunday"; + } + } + + /// get data formatted like Apr 26,2020 + /// [dateTime] convert DateTime to data formatted + static String getMonthDayYearDateFormatted(DateTime dateTime) { + if (dateTime != null) { + return getMonth(dateTime.month) + " " + dateTime.day.toString() + ", " + dateTime.year.toString(); + } else { + return ""; + } + } + + /// get data formatted like Apr 26,2020 + /// [dateTime] convert DateTime to data formatted Arabic + static String getMonthDayYearDateFormattedAr(DateTime dateTime) { + if (dateTime != null) { + return getMonthArabic(dateTime.month) + " " + dateTime.day.toString() + ", " + dateTime.year.toString(); + } else { + return ""; + } + } + + /// get data formatted like Thursday, Apr 26,2020 + /// [dateTime] convert DateTime to date formatted + static String getWeekDayMonthDayYearDateFormatted(DateTime dateTime, String lang) { + if (dateTime != null) { + return lang == 'en' + ? getWeekDayEnglish(dateTime.weekday) + ", " + getMonth(dateTime.month) + " " + dateTime.day.toString() + " " + dateTime.year.toString() + : getWeekDayArabic(dateTime.weekday) + ", " + dateTime.day.toString() + " " + getMonthArabic(dateTime.month) + " " + dateTime.year.toString(); + } else { + return ""; + } + } + + static String getMonthDayYearLangDateFormatted(DateTime dateTime, String lang) { + if (dateTime != null) { + return lang == 'en' + ? getMonth(dateTime.month) + " " + dateTime.day.toString() + " " + dateTime.year.toString() + : dateTime.day.toString() + " " + getMonthArabic(dateTime.month) + " " + dateTime.year.toString(); + } else { + return ""; + } + } + + /// get data formatted like 26/4/2020 + static String getDayMonthYearLangDateFormatted(DateTime dateTime, String lang) { + if (dateTime != null) { + return lang == 'en' + ? dateTime.day.toString() + " " + getMonth(dateTime.month) + " " + dateTime.year.toString() + : dateTime.day.toString() + " " + getMonthArabic(dateTime.month) + " " + dateTime.year.toString(); + } else { + return ""; + } + } + + static String getMonthYearLangDateFormatted(DateTime dateTime, String lang) { + if (dateTime != null) { + return lang == 'en' ? getMonth(dateTime.month) + " " + dateTime.year.toString() : getMonthArabic(dateTime.month) + " " + dateTime.year.toString(); + } else { + return ""; + } + } + + /// get data formatted like 26/4/2020 + /// [dateTime] convert DateTime to data formatted + static String getDayMonthYearDateFormatted(DateTime dateTime) { + if (dateTime != null) { + return dateTime.day.toString() + "/" + dateTime.month.toString() + "/" + dateTime.year.toString(); + } else { + return ""; + } + } + + /// get data formatted like 26/4/2020 + /// [dateTime] convert DateTime to data formatted + static String getDayMonthDateFormatted(DateTime dateTime) { + if (dateTime != null) { + return DateFormat('dd/MM').format(dateTime); + } else { + return ""; + } + } + + /// get data formatted like 26/4/2020 + /// [dateTime] convert DateTime to data formatted according to language + static String getDayMonthYearDateFormattedLang(DateTime dateTime, bool isArabic) { + if (dateTime != null) { + return DateFormat('dd/MM/yyyy', isArabic ? "ar_SA" : "en_US").format(dateTime); + } else { + return ""; + } + } + + /// get data formatted like 10:30 according to lang + static String formatDateToTimeLang(DateTime date, bool isArabic) { + return DateFormat('HH:mm', isArabic ? "ar_SA" : "en_US").format(date); + } + + /// get data formatted like 26/4/2020 10:30 + /// [dateTime] convert DateTime to data formatted + static String getDayMonthYearHourMinuteDateFormatted(DateTime dateTime) { + if (dateTime != null) { + return dateTime.day.toString() + "/" + dateTime.month.toString() + "/" + dateTime.year.toString() + " " + DateFormat('HH:mm').format(dateTime); + } else { + return ""; + } + } + + /// get data formatted like 2020-8-13 09:43:00 + /// [dateTime] convert DateTime to data formatted + static String getYearMonthDayHourMinSecDateFormatted(DateTime dateTime) { + if (dateTime != null) { + return dateTime.year.toString() + + "-" + + dateTime.month.toString() + + "-" + + dateTime.day.toString() + + " " + + dateTime.hour.toString() + + ":" + + dateTime.minute.toString() + + ":" + + dateTime.second.toString(); + } else { + return ""; + } + } + + static String getFormattedDate(DateTime dateTime, String formattedString) { + return DateFormat(formattedString).format(dateTime); + } + + static convertISODateToJsonDate(String isoDate) { + return "/Date(" + DateFormat('mm-dd-yyy').parse(isoDate).millisecondsSinceEpoch.toString() + ")/"; + } + + static String getDay(DayOfWeek dayOfWeek) { + switch (dayOfWeek) { + case DayOfWeek.Monday: + return "Monday"; + break; + case DayOfWeek.Tuesday: + return "Tuesday"; + break; + case DayOfWeek.Wednesday: + return "Wednesday"; + break; + case DayOfWeek.Thursday: + return "Thursday"; + break; + case DayOfWeek.Friday: + return "Friday"; + break; + case DayOfWeek.Saturday: + return "Saturday"; + break; + case DayOfWeek.Sunday: + return "Sunday"; + break; + } + return ""; + } +} + + +extension OnlyDate on DateTime{ + + DateTime provideDateOnly(){ + return DateTime(this.year, month, day); + } +} \ No newline at end of file diff --git a/lib/core/utils/debouncer.dart b/lib/core/utils/debouncer.dart new file mode 100644 index 0000000..529e0a3 --- /dev/null +++ b/lib/core/utils/debouncer.dart @@ -0,0 +1,19 @@ +import 'dart:async'; +import 'dart:ui'; + +class Debouncer { + final int milliseconds; + VoidCallback? action; + Timer? _timer; + + Debouncer({required this.milliseconds}); + + void run(VoidCallback action) { + _timer?.cancel(); + _timer = Timer(Duration(milliseconds: milliseconds), action); + } + + void dispose() { + _timer?.cancel(); + } +} \ No newline at end of file diff --git a/lib/core/utils/doctor_response_mapper.dart b/lib/core/utils/doctor_response_mapper.dart new file mode 100644 index 0000000..994e9a1 --- /dev/null +++ b/lib/core/utils/doctor_response_mapper.dart @@ -0,0 +1,205 @@ +import 'dart:math'; + +import 'package:hmg_patient_app_new/core/cache_consts.dart' show CacheConst; +import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart' show RegionList, PatientDoctorAppointmentList, DoctorList, PatientDoctorAppointmentListByRegion; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart' show HospitalsModel; + +class DoctorMapper{ + static Future getMappedDoctor(List doctorList, + {bool isArabic = false,double lat = 0.0,double long = 0.0}) async { + RegionList regionList = RegionList(); + + + for (var element in doctorList) { + String? region = element.getRegionName(isArabic); + if (region == null) continue; + + var regionDoctorList = regionList.registeredDoctorMap?.putIfAbsent(region, () => PatientDoctorAppointmentListByRegion()); + + List? targetList = element.isHMC == true + ? regionDoctorList?.hmcDoctorList + : regionDoctorList?.hmgDoctorList; + + var doctorByHospital = targetList + ?.where((clinic) => + clinic.filterName == + element.getProjectCompleteNameWithLocale(isArabic: isArabic)) + .toList() ?? + []; + + if (doctorByHospital.isNotEmpty) { + doctorByHospital.first.patientDoctorAppointmentList?.add(element); + } else { + var newAppointment = PatientDoctorAppointmentList( + filterName: + element.getProjectCompleteNameWithLocale(isArabic: isArabic), + distanceInKMs: element.projectDistanceInKiloMeters.toString(), + projectTopName: element.projectTopName, + projectBottomName: element.projectBottomName, + patientDoctorAppointment: element, + isHMC: element.isHMC + ); + if(element.projectDistanceInKiloMeters!= null ){ + if(regionDoctorList!.distance>element.projectDistanceInKiloMeters!){ + regionDoctorList.distance = element.projectDistanceInKiloMeters!; + } + if (element.isHMC == true && + element.projectDistanceInKiloMeters! < + regionDoctorList.hmcDistance) { + regionDoctorList.hmcDistance = element.projectDistanceInKiloMeters!; + } else if (element.projectDistanceInKiloMeters! < + regionDoctorList.hmgDistance) { + regionDoctorList.hmgDistance = element.projectDistanceInKiloMeters!; + } + }else + if (lat != 0&& + long != 0 && element.latitude != null && element.longitude != null) { + + + double distance = calculateDistance(lat.toDouble(), long.toDouble(), double.parse(element.latitude!), double.parse(element.longitude!)); + if(distance<0){ + distance *= -1; + } + if(regionDoctorList!.distance>distance){ + regionDoctorList.distance = distance; + } + if (element.isHMC == true && + (element.projectDistanceInKiloMeters??0) < + regionDoctorList.hmcDistance) { + regionDoctorList.hmcDistance = element.projectDistanceInKiloMeters??0; + } else if ((element.projectDistanceInKiloMeters??0) < + regionDoctorList.hmgDistance) { + regionDoctorList.hmgDistance = element.projectDistanceInKiloMeters??0; + } + } + targetList?.add(newAppointment); + } + + + + + regionDoctorList?.hmcSize = regionDoctorList.hmcDoctorList?.length ?? 0; + regionDoctorList?.hmgSize = regionDoctorList.hmgDoctorList?.length ?? 0; + + regionList.registeredDoctorMap?[region] = regionDoctorList; + } + + return regionList; + } + static double calculateDistance(double lat1, double lon1, double lat2, double lon2) { + var pi = 3.142; + const double R = 6371; + double dLat = (lat2 - lat1) * pi / 180; + double dLon = (lon2 - lon1) * pi / 180; + double a = sin(dLat / 2) * sin(dLat / 2) + + cos(lat1 * pi / 180) * cos(lat2 * pi / 180) * sin(dLon / 2) * sin(dLon / 2); + double c = 2 * atan2(sqrt(a), sqrt(1 - a)); + return R * c; + } + + static Future sortList(bool isGPSEnabled, RegionList unsorted, ) async { + if(isGPSEnabled){ + if(unsorted.registeredDoctorMap == null) return unsorted; + var sortedMap = Map.fromEntries( + unsorted.registeredDoctorMap!.entries.toList() + ..sort((a, b) => a.value!.distance.compareTo(b.value!.distance)), + ); + + unsorted.registeredDoctorMap = sortedMap; + return unsorted; + + } + + List? keys = unsorted.registeredDoctorMap?.keys.toList(); + keys?.sort(); + + if (keys == null) return unsorted; + Map sortedMap = {}; + for (var key in keys) { + sortedMap[key] = unsorted.registeredDoctorMap![key]!; + } + unsorted.registeredDoctorMap = sortedMap; + return unsorted; + } + + static Future getMappedHospitals( + List hospitalList, { + bool isArabic = false, double lat = 0.0,double lng = 0.0 + }) async { + final regionList = RegionList(); + for (final hospital in hospitalList) { + final region = hospital.getRegionName(isArabic); + if (region == null) continue; + + final regionData = regionList.registeredDoctorMap?.putIfAbsent( + region, + () => PatientDoctorAppointmentListByRegion(), + ); + + List? targetList = hospital.isHMC == true + ? regionData?.hmcDoctorList + : regionData?.hmgDoctorList; + + List existingEntry = targetList + ?.where( + (entry) => entry.filterName == hospital.getName(isArabic), + ) + .toList() ?? + []; + + if (existingEntry.isNotEmpty) { + existingEntry.first.hospitalList.add(hospital); + } else { + final newEntry = PatientDoctorAppointmentList( + filterName: hospital.name, + distanceInKMs: hospital.distanceInKilometers?.toString(), + projectTopName: hospital.name, + projectBottomName: hospital.name, + model: hospital, + isHMC: hospital.isHMC); + + final distance = hospital.distanceInKilometers; + + if (distance != null) { + if (regionData!.distance > distance) { + regionData.distance = distance; + } + if (hospital.isHMC == true && distance < regionData.hmcDistance) { + regionData.hmcDistance = distance; + } else if (distance < regionData.hmgDistance) { + regionData.hmgDistance = distance; + } + } else if ( lat != 0.0&& + lng != 0.0 && + hospital.latitude != null && + hospital.longitude != null) { + double calculatedDistance = calculateDistance( + lat, + lng, + double.parse(hospital.latitude!), + double.parse(hospital.longitude!), + ).abs(); + + if (regionData!.distance > calculatedDistance) { + regionData.distance = calculatedDistance; + } + if (hospital.isHMC == true && + calculatedDistance < regionData.hmcDistance) { + regionData.hmcDistance = calculatedDistance; + } else if (calculatedDistance < regionData.hmgDistance) { + regionData.hmgDistance = calculatedDistance; + } + } + targetList?.add(newEntry); + } + + regionData?.hmcSize = regionData.hmcDoctorList?.length ?? 0; + regionData?.hmgSize = regionData.hmgDoctorList?.length ?? 0; + regionList.registeredDoctorMap?[region] = regionData; + } + + return regionList; + } +} \ No newline at end of file diff --git a/lib/core/utils/loading_utils.dart b/lib/core/utils/loading_utils.dart new file mode 100644 index 0000000..1a99278 --- /dev/null +++ b/lib/core/utils/loading_utils.dart @@ -0,0 +1,61 @@ +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class LoadingUtils { + static final NavigationService _navigationService = getIt.get(); + + static bool _isLoadingVisible = false; + + static bool get isLoading => _isLoadingVisible; + + static showFullScreenLoader({bool barrierDismissible = true, isSuccessDialog = false, String loadingText = "Loading, Please wait..."}) { + if (!_isLoadingVisible) { + _isLoadingVisible = true; + final context = _navigationService.navigatorKey.currentContext; + log("got the context in showFullScreenLoading"); + if (context == null) return; + + showDialog( + barrierDismissible: barrierDismissible, + context: context, + barrierColor: AppColors.blackColor.withOpacity(0.5), + useRootNavigator: false, + useSafeArea: false, + builder: (BuildContext context) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Material( + child: Center( + child: isSuccessDialog ? Utils.getSuccessWidget(loadingText: loadingText) : Utils.getLoadingWidget(loadingText: loadingText), + ), + ), + ); + }).then((value) { + _isLoadingVisible = false; + }); + } + } + + static hideFullScreenLoader() { + if (!_isLoadingVisible) return; + + final context = _navigationService.navigatorKey.currentContext; + if (context != null) { + try { + Navigator.of(context).pop(); + } catch (_) {} + } + _isLoadingVisible = false; + } +} diff --git a/lib/core/utils/LocalNotification.dart b/lib/core/utils/local_notifications.dart similarity index 100% rename from lib/core/utils/LocalNotification.dart rename to lib/core/utils/local_notifications.dart diff --git a/lib/core/utils/push-notification-handler.dart b/lib/core/utils/push-notification-handler.dart deleted file mode 100644 index 0cd3be7..0000000 --- a/lib/core/utils/push-notification-handler.dart +++ /dev/null @@ -1,383 +0,0 @@ -import 'dart:async'; -import 'dart:developer'; -import 'dart:io'; - -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:firebase_messaging/firebase_messaging.dart' as fir; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; - -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:hmg_patient_app_new/core/utils/LocalNotification.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:uuid/uuid.dart'; - -import '../consts.dart'; - -// |--> Push Notification Background -@pragma('vm:entry-point') -Future backgroundMessageHandler(dynamic message) async { - print("Firebase backgroundMessageHandler!!!"); - await Firebase.initializeApp(); - fir.RemoteMessage message_; - - if (message.data != null && (message.data['is_call'] == 'true' || message.data['is_call'] == true)) { - // showCallkitIncoming(message); - _incomingCall(message.data); - return; - } else {} -} - -callPage(String sessionID, String token) async {} - -_incomingCall(Map data) async { - // LandingPage.incomingCallData = IncomingCallData.fromJson(data); - // var dataItem = await AppSharedPreferences().getObject('call_data'); - // if(dataItem != null ) return; // to stop repeated attempt to invoke the call - // if (LandingPage.isOpenCallPage == false) { - // LandingPage.isOpenCallPage = true; - WidgetsFlutterBinding.ensureInitialized(); - // var _currentUuid = Uuid().v4(); - // await FlutterCallkitIncoming.showCallkitIncoming(callKitParams); - // } - // LandingPage.isOpenCallPage = false; - await Future.delayed(Duration(milliseconds: 500)); -} - -Future openCallPage(BuildContext context) async { - try { - // if (incomingCallData!.background == "0") { - // Zoom Call Page - // Navigator.of(context).pop(); - Navigator.pushReplacementNamed( - context, - "zoom_call_page", - // arguments: CallArguments(incomingCallData!.sessionId!, "123", "Patient", "40", "0", false, int.parse(incomingCallData!.appointmentNo!)), - ); - // } else { - // // OpenTok Call Page - // await Navigator.of(context).pushReplacement( - // MaterialPageRoute( - // // fullscreenDialog: true, - // builder: (BuildContext context) { - // // final caller = widget.incomingCallData.callerID; - // // final receiver = widget.incomingCallData.receiverID; - // // final host = widget.incomingCallData.server; - // // if(widget.incomingCallData.isWebRTC == "true"){ - // // return StartVideoCall(caller: caller, receiver: receiver, iAmCaller: false, host: host); - // // }else{ - // return OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: incomingCallData!.sessionId!, token: incomingCallData!.token!); - // }, - // ), - // ); - // } - } catch (err) { - print(err); - // await PlatformExceptionAlertDialog( - // exception: Exception(err), - // ).show(context); - } -} - -// Future showCallkitIncoming(Map message) async { -// // if (message['type'] == 'ReservationCallStart') { -// var params = CallKitParams( -// id: DateTime.now().millisecondsSinceEpoch.toString(), -// nameCaller: 'Dr Sulaiman Al Habib', -// appName: 'Dr Sulaiman Al Habib', -// avatar: 'https://play-lh.googleusercontent.com/FBNNpxb7m6eM6wtW7MV1Ffp6OXOGLI38q47zcvP29OCYA1yhYH5mZzl5itZi0TgOyZpG', -// handle: 'LiveCare Call', -// type: 1, -// duration: 60000, -// textAccept: 'Accept', -// textDecline: 'Decline', -// textMissedCall: 'Missed call', -// textCallback: 'Call back', -// extra: { -// // 'reservationID': message['id'], -// 'userId': '1a2b3c4d' -// }, -// headers: {'apiKey': 'Abc@123!', 'platform': 'flutter'}, -// android: AndroidParams( -// isCustomNotification: true, -// isShowLogo: false, -// isShowCallback: false, -// ringtonePath: 'system_ringtone_default', -// backgroundColor: '#424242FF', -// // 'backgroundUrl': 'https://i.pravatar.cc/500', -// actionColor: '#4CAF50', -// incomingCallNotificationChannelName: "Incoming Call", -// missedCallNotificationChannelName: "Missed Call", -// ), -// ios: IOSParams( -// iconName: 'CallKitLogo', -// handleType: '', -// supportsVideo: true, -// maximumCallGroups: 2, -// maximumCallsPerCallGroup: 1, -// audioSessionMode: 'default', -// audioSessionActive: true, -// audioSessionPreferredSampleRate: 44100.0, -// audioSessionPreferredIOBufferDuration: 0.005, -// supportsDTMF: true, -// supportsHolding: true, -// supportsGrouping: false, -// supportsUngrouping: false, -// ringtonePath: 'system_ringtone_default')); -// await FlutterCallkitIncoming.showCallkitIncoming(params); -// // } else if (message['type'] == 'ReservationCallFinished') { -// // await FlutterCallkitIncoming.endAllCalls(); -// // } -// } - -class PushNotificationHandler { - late BuildContext context; - static final PushNotificationHandler _instance = PushNotificationHandler._internal(); - - // late HmsApiAvailability hmsApiAvailability; - - // final voIPKit = FlutterIOSVoIPKit.instance; - - late Timer timeOutTimer; - bool isTalking = false; - - var data = { - "AppointmentNo": "2016059247", - "ProjectID": "15", - "NotificationType": "10", - "background": "0", - "doctorname": "Call from postman", - "clinicname": "LIVECARE FAMILY MEDICINE AND GP", - "speciality": "General Practioner", - "appointmentdate": "2022-01-19", - "appointmenttime": "12:10", - "PatientName": "Testing", - "session_id": "1_MX40NjIwOTk2Mn5-MTY1NDE2NDQxMjc2Mn5xc3NCZkNIejJOdzgzTkg2TmlXblhQdnl-fg", - "token": - "T1==cGFydG5lcl9pZD00NjIwOTk2MiZzaWc9MTliNTA3NDAxYmU0MjI5OGY5NTcxZTdhNzQyMTcyZjRjMjBhNjljZTpzZXNzaW9uX2lkPTFfTVg0ME5qSXdPVGsyTW41LU1UWTFOREUyTkRReE1qYzJNbjV4YzNOQ1prTkllakpPZHpnelRrZzJUbWxYYmxoUWRubC1mZyZjcmVhdGVfdGltZT0xNjU0MTY0NDEzJm5vbmNlPTAuNjM3ODkzNDk4NDQ2NTIxOSZyb2xlPW1vZGVyYXRvciZleHBpcmVfdGltZT0xNjU0MjUwODEzJmluaXRpYWxfbGF5b3V0X2NsYXNzX2xpc3Q9", - "DoctorImageURL": "https://image.shutterstock.com/image-vector/sample-stamp-square-grunge-sign-260nw-1474408826.jpg", - "callerID": "9920", - "PatientID": "1231755", - "is_call": "true" - }; - - PushNotificationHandler._internal(); - - factory PushNotificationHandler() => _instance; - - static PushNotificationHandler getInstance() => _instance; - - // void _timeOut({ - // int seconds = 30, - // }) async { - // timeOutTimer = Timer(Duration(seconds: seconds), () async { - // print('🎈 example: timeOut'); - // final incomingCallerName = await voIPKit.getIncomingCallerName(); - // voIPKit.unansweredIncomingCall( - // skipLocalNotification: false, - // missedCallTitle: '📞 Missed call', - // missedCallBody: 'There was a call from $incomingCallerName', - // ); - // }); - // } - - init(BuildContext context) async { - this.context = context; - - if (Platform.isIOS) { - // voIPKit.getVoIPToken().then((value) { - // print("APNS VOIP KIT TOKEN: $value"); - // AppSharedPreferences().setString(APNS_TOKEN, value!); - // }); - // - // voIPKit.onDidUpdatePushToken = (String token) { - // print('🎈 example: onDidUpdatePushToken: $token'); - // }; - // - // voIPKit.onDidReceiveIncomingPush = ( - // Map payload, - // ) async { - // print('🎈 example: onDidReceiveIncomingPush $payload'); - // _timeOut(); - // }; - // - // voIPKit.onDidRejectIncomingCall = ( - // String uuid, - // String callerId, - // ) async { - // try { - // print('🎈 example: onDidRejectIncomingCall $uuid - $callerId'); - // timeOutTimer.cancel(); - // } catch (err) {} - // }; - // - // voIPKit.onDidAcceptIncomingCall = ( - // String uuid, - // String callerId, - // ) async { - // print('🎈 example: onDidAcceptIncomingCall $uuid - $callerId'); - // await voIPKit.acceptIncomingCall(callerState: CallStateType.calling); - // await voIPKit.callConnected(); - // await Future.delayed(Duration(seconds: 1)); - // - // Navigator.pushNamed( - // locator().navigatorKey.currentContext!, - // "zoom_call_page", - // arguments: CallArguments("hoover-dam", "123", "Patient", "40", "1", false), - // ); - // - // await voIPKit.endCall(); - // - // // Navigator.pushNamed(navigatorKey.currentContext!, VIDEO_CALL_SCREEN, - // // arguments: VideoArgus( - // // reservationId: int.parse(callerId), token: null, isVideo: true)); - // - // timeOutTimer.cancel(); - // }; - } - - if (Platform.isAndroid) { - try { - final fcmToken = await FirebaseMessaging.instance.getToken().catchError((err) { - print(err); - }); - if (fcmToken != null) onToken(fcmToken); - // } - } catch (ex) { - print("Notification Exception: " + ex.toString()); - } - FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); - } - - if (Platform.isIOS) { - final permission = await FirebaseMessaging.instance.requestPermission(); - await FirebaseMessaging.instance.getAPNSToken().then((value) async { - log("APNS token: " + value.toString()); - await Utils.saveStringFromPrefs(SharedPrefsConsts.APNS_TOKEN, value.toString()); - }); - await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions( - alert: true, // Required to display a heads up notification - badge: true, - sound: true, - ); - if (permission.authorizationStatus == AuthorizationStatus.denied) return; - } else {} - - try { - FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage? message) async { - if (message != null) { - if (Platform.isIOS) - await Future.delayed(Duration(milliseconds: 3000)).then((value) { - if (message != null) newMessage(message); - }); - else if (message != null) newMessage(message); - } - }); - } catch (ex) {} - - FirebaseMessaging.onMessage.listen((RemoteMessage message) async { - print("Firebase onMessage!!!"); - // showCallkitIncoming(); - if (Platform.isIOS) - await Future.delayed(Duration(milliseconds: 3000)).then((value) { - newMessage(message); - }); - else - newMessage(message); - }); - - FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async { - print("Firebase onMessageOpenedApp!!!"); - if (Platform.isIOS) - await Future.delayed(Duration(milliseconds: 3000)).then((value) { - newMessage(message); - }); - else - newMessage(message); - }); - - FirebaseMessaging.instance.getToken().then((String? token) { - print("Push Notification getToken: " + token!); - onToken(token!); - }).catchError((err) { - print(err); - }); - - FirebaseMessaging.instance.onTokenRefresh.listen((fcm_token) { - print("Push Notification onTokenRefresh: " + fcm_token); - onToken(fcm_token); - }); - - if (Platform.isAndroid) { - final deviceInfo = DeviceInfoPlugin(); - final androidInfo = await deviceInfo.androidInfo; - - int sdkInt = androidInfo.version.sdkInt ?? 0; - if (sdkInt >= 33) { - await FlutterCallkitIncoming.requestFullIntentPermission(); - } - } - } - - newMessage(RemoteMessage remoteMessage) async { - print("Remote Message: " + remoteMessage.data.toString()); - if (remoteMessage.data.isEmpty) { - return; - } - debugPrint('the value of the remote message is ${remoteMessage.data}'); - if (remoteMessage.data['is_call'] == 'true' || remoteMessage.data['is_call'] == true) { - _incomingCall(remoteMessage.data); - // showCallkitIncoming(); - } else { - // GetNotificationsResponseModel notification = new GetNotificationsResponseModel(); - // - // notification.createdOn = DateUtil.convertDateToString(DateTime.now()); - // notification.messageTypeData = remoteMessage.data['picture']; - // notification.message = remoteMessage.data['message']; - // notification.notificationType = remoteMessage.data["NotificationType"].toString(); - // if (remoteMessage.data["NotificationType"] == "2") { - // notification.videoURL = remoteMessage.data["VideoUrl"]; - // } - // - // await NavigationService.navigateToPage(NotificationsDetailsPage( - // notification: notification, - // )); - } - } - - onToken(String token) async { - print("Push Notification Token: " + token); - await Utils.saveStringFromPrefs(SharedPrefsConsts.PUSH_TOKEN, token); - } - - onResume() async { - // var call_data = await AppSharedPreferences().getObject('call_data'); - // if (call_data != null) { - // _incomingCall(call_data); - // } - } - - Future requestPermissions() async { - try { - if (Platform.isIOS) { - await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation()?.requestPermissions(alert: true, badge: true, sound: true); - } else if (Platform.isAndroid) { - Map statuses = await [ - Permission.notification, - // Permission.camera, - // Permission.audio, - // Permission.microphone, - ].request(); - print("=-=-=-=-=-=-=-=-=-=-"); - print(statuses[Permission.notification]); - } - } catch (_) { - debugPrint(_.toString()); - } - } -} diff --git a/lib/core/utils/push_notification_handler.dart b/lib/core/utils/push_notification_handler.dart new file mode 100644 index 0000000..2e0d7c3 --- /dev/null +++ b/lib/core/utils/push_notification_handler.dart @@ -0,0 +1,388 @@ +import 'dart:async'; +import 'dart:developer'; +import 'dart:io'; + +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart' as fir; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_ios_voip_kit_karmm/call_state_type.dart'; +import 'package:flutter_ios_voip_kit_karmm/flutter_ios_voip_kit.dart'; +// import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; + +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:hmg_patient_app_new/core/utils/local_notifications.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:permission_handler/permission_handler.dart'; + +import '../cache_consts.dart'; + +// |--> Push Notification Background +@pragma('vm:entry-point') +Future backgroundMessageHandler(dynamic message) async { + print("Firebase backgroundMessageHandler!!!"); + await Firebase.initializeApp(); + fir.RemoteMessage message_; + + if (message.data != null && (message.data['is_call'] == 'true' || message.data['is_call'] == true)) { + // showCallkitIncoming(message); + _incomingCall(message.data); + return; + } else {} +} + +callPage(String sessionID, String token) async {} + +_incomingCall(Map data) async { + // LandingPage.incomingCallData = IncomingCallData.fromJson(data); + // var dataItem = await AppSharedPreferences().getObject('call_data'); + // if(dataItem != null ) return; // to stop repeated attempt to invoke the call + // if (LandingPage.isOpenCallPage == false) { + // LandingPage.isOpenCallPage = true; + WidgetsFlutterBinding.ensureInitialized(); + // var _currentUuid = Uuid().v4(); + // await FlutterCallkitIncoming.showCallkitIncoming(callKitParams); + // } + // LandingPage.isOpenCallPage = false; + await Future.delayed(Duration(milliseconds: 500)); +} + +Future openCallPage(BuildContext context) async { + try { + // if (incomingCallData!.background == "0") { + // Zoom Call Page + // Navigator.of(context).pop(); + Navigator.pushReplacementNamed( + context, + "zoom_call_page", + // arguments: CallArguments(incomingCallData!.sessionId!, "123", "Patient", "40", "0", false, int.parse(incomingCallData!.appointmentNo!)), + ); + // } else { + // // OpenTok Call Page + // await Navigator.of(context).pushReplacement( + // MaterialPageRoute( + // // fullscreenDialog: true, + // builder: (BuildContext context) { + // // final caller = widget.incomingCallData.callerID; + // // final receiver = widget.incomingCallData.receiverID; + // // final host = widget.incomingCallData.server; + // // if(widget.incomingCallData.isWebRTC == "true"){ + // // return StartVideoCall(caller: caller, receiver: receiver, iAmCaller: false, host: host); + // // }else{ + // return OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: incomingCallData!.sessionId!, token: incomingCallData!.token!); + // }, + // ), + // ); + // } + } catch (err) { + print(err); + // await PlatformExceptionAlertDialog( + // exception: Exception(err), + // ).show(context); + } +} + +// Future showCallkitIncoming(Map message) async { +// // if (message['type'] == 'ReservationCallStart') { +// var params = CallKitParams( +// id: DateTime.now().millisecondsSinceEpoch.toString(), +// nameCaller: 'Dr Sulaiman Al Habib', +// appName: 'Dr Sulaiman Al Habib', +// avatar: 'https://play-lh.googleusercontent.com/FBNNpxb7m6eM6wtW7MV1Ffp6OXOGLI38q47zcvP29OCYA1yhYH5mZzl5itZi0TgOyZpG', +// handle: 'LiveCare Call', +// type: 1, +// duration: 60000, +// textAccept: 'Accept', +// textDecline: 'Decline', +// textMissedCall: 'Missed call', +// textCallback: 'Call back', +// extra: { +// // 'reservationID': message['id'], +// 'userId': '1a2b3c4d' +// }, +// headers: {'apiKey': 'Abc@123!', 'platform': 'flutter'}, +// android: AndroidParams( +// isCustomNotification: true, +// isShowLogo: false, +// isShowCallback: false, +// ringtonePath: 'system_ringtone_default', +// backgroundColor: '#424242FF', +// // 'backgroundUrl': 'https://i.pravatar.cc/500', +// actionColor: '#4CAF50', +// incomingCallNotificationChannelName: "Incoming Call", +// missedCallNotificationChannelName: "Missed Call", +// ), +// ios: IOSParams( +// iconName: 'CallKitLogo', +// handleType: '', +// supportsVideo: true, +// maximumCallGroups: 2, +// maximumCallsPerCallGroup: 1, +// audioSessionMode: 'default', +// audioSessionActive: true, +// audioSessionPreferredSampleRate: 44100.0, +// audioSessionPreferredIOBufferDuration: 0.005, +// supportsDTMF: true, +// supportsHolding: true, +// supportsGrouping: false, +// supportsUngrouping: false, +// ringtonePath: 'system_ringtone_default')); +// await FlutterCallkitIncoming.showCallkitIncoming(params); +// // } else if (message['type'] == 'ReservationCallFinished') { +// // await FlutterCallkitIncoming.endAllCalls(); +// // } +// } + +class PushNotificationHandler { + late BuildContext context; + static final PushNotificationHandler _instance = PushNotificationHandler._internal(); + + // late HmsApiAvailability hmsApiAvailability; + + final voIPKit = FlutterIOSVoIPKit.instance; + + late Timer timeOutTimer; + bool isTalking = false; + + var data = { + "AppointmentNo": "2016059247", + "ProjectID": "15", + "NotificationType": "10", + "background": "0", + "doctorname": "Call from postman", + "clinicname": "LIVECARE FAMILY MEDICINE AND GP", + "speciality": "General Practioner", + "appointmentdate": "2022-01-19", + "appointmenttime": "12:10", + "PatientName": "Testing", + "session_id": "1_MX40NjIwOTk2Mn5-MTY1NDE2NDQxMjc2Mn5xc3NCZkNIejJOdzgzTkg2TmlXblhQdnl-fg", + "token": + "T1==cGFydG5lcl9pZD00NjIwOTk2MiZzaWc9MTliNTA3NDAxYmU0MjI5OGY5NTcxZTdhNzQyMTcyZjRjMjBhNjljZTpzZXNzaW9uX2lkPTFfTVg0ME5qSXdPVGsyTW41LU1UWTFOREUyTkRReE1qYzJNbjV4YzNOQ1prTkllakpPZHpnelRrZzJUbWxYYmxoUWRubC1mZyZjcmVhdGVfdGltZT0xNjU0MTY0NDEzJm5vbmNlPTAuNjM3ODkzNDk4NDQ2NTIxOSZyb2xlPW1vZGVyYXRvciZleHBpcmVfdGltZT0xNjU0MjUwODEzJmluaXRpYWxfbGF5b3V0X2NsYXNzX2xpc3Q9", + "DoctorImageURL": "https://image.shutterstock.com/image-vector/sample-stamp-square-grunge-sign-260nw-1474408826.jpg", + "callerID": "9920", + "PatientID": "1231755", + "is_call": "true" + }; + + PushNotificationHandler._internal(); + + factory PushNotificationHandler() => _instance; + + static PushNotificationHandler getInstance() => _instance; + + // void _timeOut({ + // int seconds = 30, + // }) async { + // timeOutTimer = Timer(Duration(seconds: seconds), () async { + // print('🎈 example: timeOut'); + // final incomingCallerName = await voIPKit.getIncomingCallerName(); + // voIPKit.unansweredIncomingCall( + // skipLocalNotification: false, + // missedCallTitle: '📞 Missed call', + // missedCallBody: 'There was a call from $incomingCallerName', + // ); + // }); + // } + + init(BuildContext context) async { + this.context = context; + + if (Platform.isIOS) { + voIPKit.getVoIPToken().then((value) { + print("🎈 APNS VOIP KIT TOKEN: $value"); + Utils.saveStringFromPrefs(CacheConst.voipToken, value ?? ""); + // AppSharedPreferences().setString(APNS_TOKEN, value!); + }); + + voIPKit.onDidUpdatePushToken = (String token) { + print('🎈 example: onDidUpdatePushToken: $token'); + }; + + voIPKit.onDidReceiveIncomingPush = ( + Map payload, + ) async { + print('🎈 example: onDidReceiveIncomingPush $payload'); + // _timeOut(); + }; + + voIPKit.onDidRejectIncomingCall = ( + String uuid, + String callerId, + ) async { + try { + print('🎈 example: onDidRejectIncomingCall $uuid - $callerId'); + timeOutTimer.cancel(); + } catch (err) {} + }; + + voIPKit.onDidAcceptIncomingCall = ( + String uuid, + String callerId, + ) async { + print('🎈 example: onDidAcceptIncomingCall $uuid - $callerId'); + await voIPKit.acceptIncomingCall(callerState: CallStateType.calling); + await voIPKit.callConnected(); + await Future.delayed(Duration(seconds: 1)); + + // Navigator.pushNamed( + // locator().navigatorKey.currentContext!, + // "zoom_call_page", + // arguments: CallArguments("hoover-dam", "123", "Patient", "40", "1", false), + // ); + + await voIPKit.endCall(); + + // Navigator.pushNamed(navigatorKey.currentContext!, VIDEO_CALL_SCREEN, + // arguments: VideoArgus( + // reservationId: int.parse(callerId), token: null, isVideo: true)); + + // timeOutTimer.cancel(); + }; + } + + if (Platform.isAndroid) { + try { + final fcmToken = await FirebaseMessaging.instance.getToken().catchError((err) { + print(err); + }); + if (fcmToken != null) onToken(fcmToken); + // } + } catch (ex) { + print("Notification Exception: " + ex.toString()); + } + FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); + } + + if (Platform.isIOS) { + final permission = await FirebaseMessaging.instance.requestPermission(); + await FirebaseMessaging.instance.getAPNSToken().then((value) async { + log("APNS token: " + value.toString()); + await Utils.saveStringFromPrefs(CacheConst.apnsToken, value.toString()); + }); + await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions( + alert: true, // Required to display a heads up notification + badge: true, + sound: true, + ); + if (permission.authorizationStatus == AuthorizationStatus.denied) return; + } else {} + + try { + FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage? message) async { + if (message != null) { + if (Platform.isIOS) { + await Future.delayed(Duration(milliseconds: 3000)).then((value) { + if (message != null) newMessage(message); + }); + } else if (message != null) newMessage(message); + } + }); + } catch (ex) {} + + FirebaseMessaging.onMessage.listen((RemoteMessage message) async { + print("Firebase onMessage!!!"); + // showCallkitIncoming(); + if (Platform.isIOS) { + await Future.delayed(Duration(milliseconds: 3000)).then((value) { + newMessage(message); + }); + } else { + newMessage(message); + } + }); + + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async { + print("Firebase onMessageOpenedApp!!!"); + if (Platform.isIOS) { + await Future.delayed(Duration(milliseconds: 3000)).then((value) { + newMessage(message); + }); + } else { + newMessage(message); + } + }); + + FirebaseMessaging.instance.getToken().then((String? token) { + print("Push Notification getToken: " + token!); + onToken(token!); + }).catchError((err) { + print(err); + }); + + FirebaseMessaging.instance.onTokenRefresh.listen((fcm_token) { + print("Push Notification onTokenRefresh: " + fcm_token); + onToken(fcm_token); + }); + + if (Platform.isAndroid) { + final deviceInfo = DeviceInfoPlugin(); + final androidInfo = await deviceInfo.androidInfo; + + int sdkInt = androidInfo.version.sdkInt ?? 0; + if (sdkInt >= 33) { + // await FlutterCallkitIncoming.requestFullIntentPermission(); + } + } + } + + newMessage(RemoteMessage remoteMessage) async { + print("Remote Message: " + remoteMessage.data.toString()); + if (remoteMessage.data.isEmpty) { + return; + } + debugPrint('the value of the remote message is ${remoteMessage.data}'); + if (remoteMessage.data['is_call'] == 'true' || remoteMessage.data['is_call'] == true) { + _incomingCall(remoteMessage.data); + // showCallkitIncoming(); + } else { + // GetNotificationsResponseModel notification = new GetNotificationsResponseModel(); + // + // notification.createdOn = DateUtil.convertDateToString(DateTime.now()); + // notification.messageTypeData = remoteMessage.data['picture']; + // notification.message = remoteMessage.data['message']; + // notification.notificationType = remoteMessage.data["NotificationType"].toString(); + // if (remoteMessage.data["NotificationType"] == "2") { + // notification.videoURL = remoteMessage.data["VideoUrl"]; + // } + // + // await NavigationService.navigateToPage(NotificationsDetailsPage( + // notification: notification, + // )); + } + } + + onToken(String token) async { + print("Push Notification Token: " + token); + await Utils.saveStringFromPrefs(CacheConst.pushToken, token); + } + + onResume() async { + // var call_data = await AppSharedPreferences().getObject('call_data'); + // if (call_data != null) { + // _incomingCall(call_data); + // } + } + + Future requestPermissions() async { + try { + if (Platform.isIOS) { + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation() + ?.requestPermissions(alert: true, badge: true, sound: true); + } else if (Platform.isAndroid) { + Map statuses = await [ + Permission.notification, + // Permission.camera, + // Permission.audio, + // Permission.microphone, + ].request(); + print("=-=-=-=-=-=-=-=-=-=-"); + print(statuses[Permission.notification]); + } + } catch (_) { + debugPrint(_.toString()); + } + } +} diff --git a/lib/core/utils/request_utils.dart b/lib/core/utils/request_utils.dart new file mode 100644 index 0000000..a4ea936 --- /dev/null +++ b/lib/core/utils/request_utils.dart @@ -0,0 +1,288 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:hijri_gregorian_calendar/hijri_gregorian_calendar.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/request_models/registration_payload_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/request_models/send_activation_request_model.dart'; +import 'package:hmg_patient_app_new/features/common/models/commong_authanticated_req_model.dart'; +import 'package:hmg_patient_app_new/features/common/models/family_file_request.dart'; + +class RequestUtils { + static dynamic getPatientAuthenticationRequest({ + required String phoneNumber, + required String nationId, + required OTPTypeEnum otpTypeEnum, + required bool patientOutSA, + required bool isForRegister, + required int? patientId, + required String zipCode, + required CalenderEnum calenderType, + String? dob, + }) { + bool fileNo = false; + if (nationId.isNotEmpty) { + fileNo = nationId.length < 10; + if (fileNo) { + patientId = int.tryParse(nationId); + } + } + var request = SendActivationRequest(); + if (phoneNumber.isNotEmpty) { + request.patientMobileNumber = int.parse(phoneNumber); + } + request.oTPSendType = otpTypeEnum.toInt(); // could map OTPTypeEnum if needed + request.zipCode = zipCode; // or countryCode if defined elsewhere + + if (isForRegister) { + request.patientIdentificationID = int.parse(nationId); + request.searchType = 1; + request.isHijri = calenderType.toInt; + request.patientID = patientId; + request.dob = dob; + request.patientOutSA = patientOutSA ? 1 : 0; + request.isDentalAllowedBackend = false; + } else { + if (fileNo) { + request.patientID = patientId ?? int.parse(nationId); + request.patientIdentificationID = request.nationalID; + request.searchType = 2; + } else { + request.patientID = 0; + request.searchType = 1; + request.patientIdentificationID = request.nationalID = nationId.isNotEmpty ? int.parse(nationId) : 0; + } + request.isRegister = false; + } + return request; + } + + static dynamic getCommonRequestWelcome( + {required String phoneNumber, + required OTPTypeEnum otpTypeEnum, + required String? deviceToken, + required bool patientOutSA, + required String? loginTokenID, + RegistrationDataModelPayload? registeredData, + int? patientId, + required String nationIdText, + required String countryCode, + required int loginType}) { + bool fileNo = false; + if (nationIdText.isNotEmpty) { + fileNo = nationIdText.length < 10; + } + var request = SendActivationRequest(); + request.patientMobileNumber = int.parse(phoneNumber); + request.mobileNo = '0$phoneNumber'; + request.deviceToken = deviceToken; + request.projectOutSA = patientOutSA; + request.loginType = loginType; + request.oTPSendType = otpTypeEnum.toInt(); // could map OTPTypeEnum if needed + request.zipCode = countryCode; // or countryCode if defined elsewhere + request.logInTokenID = loginTokenID ?? ""; + + if (registeredData != null) { + //TODO: Issue Here if Not Signup + request.searchType = registeredData.searchType != null + ? registeredData.searchType + : fileNo + ? 1 + : 2; + request.patientID = registeredData.patientId ?? 0; + request.patientIdentificationID = request.nationalID = (registeredData.patientIdentificationId ?? 0); + request.dob = registeredData.dob; + request.isRegister = registeredData.isRegister; + } else { + if (fileNo) { + request.patientID = patientId ?? int.parse(nationIdText); + request.patientIdentificationID = request.nationalID = 0; + request.searchType = 2; + //TODO: Issue HEre is Not Login + } else { + request.patientID = 0; + request.searchType = 1; + //TODO: Issue HEre is Not Login + request.patientIdentificationID = request.nationalID = (nationIdText.isNotEmpty ? int.parse(nationIdText) : 0); + } + request.isRegister = false; + } + + request.deviceTypeID = request.searchType; + return request; + } + + static getCommonRequestSendActivationCode({ + required OTPTypeEnum otpTypeEnum, + required String mobileNumber, + required String zipCode, + required int? patientId, + required int? nationalId, + required bool patientOutSA, + required int selectedLoginType, + required bool isForRegister, + required bool isFileNo, + dynamic payload, + required bool isExcludedUser, + required bool isFormFamilyFile, + int? responseID, + }) { + AppState _appState = getIt.get(); + var request = SendActivationRequest(); + if (mobileNumber.isNotEmpty) { + request.patientMobileNumber = int.parse(mobileNumber); + } + request.mobileNo = '0$mobileNumber'; + request.projectOutSA = patientOutSA; + request.loginType = selectedLoginType; + request.oTPSendType = otpTypeEnum.toInt(); //this.selectedOption == 1 ? 1 : 2; + request.zipCode = zipCode; + + if (isForRegister && payload != null) { + request.searchType = isFileNo ? 2 : 1; + // request.searchType = payload["SearchType"]; + request.patientID = payload["PatientID"]; + request.patientIdentificationID = request.nationalID = payload["PatientIdentificationID"] ?? '0'; + request.dob = payload["DOB"]; + request.isRegister = payload["isRegister"]; + request.healthId = patientOutSA ? null : _appState.getNHICUserData.healthId; + request.isHijri = payload["IsHijri"]; + request.deviceToken = _appState.deviceToken; + request.projectOutSA = patientOutSA; + } else { + request.searchType = isFileNo ? 2 : 1; + request.patientID = patientId ?? 0; + request.nationalID = nationalId ?? 0; + request.patientIdentificationID = (nationalId ?? '0') as int?; + request.isRegister = false; + } + request.deviceTypeID = request.searchType; + + if (isFormFamilyFile) { + //INFO: Only for Excluded User Family Member Addition + request.isPatientExcluded = isExcludedUser; + request.responseID = responseID; + request.status = 2; + request.familyRegionID = zipCode == CountryEnum.saudiArabia.countryCode ? 1 : 2; + } + + return request; + } + + //DeviceToken":"" + // + + //{"PatientMobileNumber":530896018,"MobileNo":"0530896018","DeviceToken":"","ProjectOutSA":false,"LoginType":1,"ZipCode":"966","isRegister":true,"LogInTokenID":"","SearchType":2,"PatientID":0,"NationalID":"2599865082","PatientIdentificationID":"2599865082","OTP_SendType":1,"LanguageID":2,"VersionID":18.7,"Channel":3,"IPAdress":"10.20.10.20","generalid":"Cs2020@2016$2958","PatientOutSA":0,"isDentalAllowedBackend":false,"DeviceTypeID":1,"DOB":"19/07/1997","IsHijri":0,"HealthId":"30000541803510","Latitude":0.0,"Longitude":0.0,"PatientType":1} + + //{"PatientMobileNumber":530896018,"MobileNo":"0530896018","DeviceToken":"","ProjectOutSA":false,"LoginType":1,"ZipCode":"966","isRegister":true,"LogInTokenID":"","SearchType":1,"PatientID":0,"NationalID":"2599865082","PatientIdentificationID":"2599865082","OTP_SendType":1,"LanguageID":"2","VersionID":"18.7","Channel":"3","IPAdress":"10.20.10.20","generalid":"Cs2020@2016$2958","PatientOutSA":0,"SessionID":"TMRhVmkGhOsvamErw","isDentalAllowedBackend":false,"DeviceTypeID":"1","SMSSignature":"enKTDcqbOVd","DOB":"19/07/1997","PatientType":"1","Latitude":"0.0","Longitude":"0.0"} + + static getAuthanticatedCommonRequest() { + AppState _appState = getIt.get(); + var request = CommonAuthanticatedRequest(); + request.sessionId = ApiConsts.sessionID; + request.latitude = _appState.userLat; + request.longitude = _appState.userLong; + request.languageId = _appState.getLanguageID(); + request.versionId = ApiConsts.appVersionID; + request.ipAdress = ApiConsts.appIpAddress; + request.deviceTypeId = _appState.getDeviceTypeID(); + request.patientTypeId = _appState.getAuthenticatedUser()?.patientType; + request.patientType = _appState.getAuthenticatedUser()?.patientType; + request.generalid = ApiConsts.appGeneralId; + request.channel = ApiConsts.appChannelId; + request.patientId = _appState.getAuthenticatedUser()!.patientId; + request.patientOutSa = _appState.getAuthenticatedUser()!.outSa; + request.tokenId = null; + return request; + } + + static dynamic getUserSignupCompletionRequest({String? fullName, String? emailAddress, GenderTypeEnum? gender, MaritalStatusTypeEnum? maritalStatus}) { + AppState appState = getIt.get(); + + bool isDubai = appState.getUserRegistrationPayload.patientOutSa == 1 ? true : false; + List names = fullName != null ? fullName.split(" ") : []; + + var dob = appState.getUserRegistrationPayload.dob; + final DateFormat dateFormat1 = DateFormat('MM/dd/yyyy'); + final DateFormat dateFormat2 = DateFormat('dd/MM/yyyy'); + DateTime gregorianDate = dateFormat2.parse(dob!); + HijriGregDate hijriDate = HijriGregConverter.gregorianToHijri(gregorianDate); + String? date = "${hijriDate.day}/${hijriDate.month}/${hijriDate.year}"; + + return { + "Patientobject": { + "TempValue": true, + "PatientIdentificationType": + (isDubai ? appState.getUserRegistrationPayload.patientIdentificationId?.toString().substring(0, 1) : appState.getNHICUserData.idNumber!.substring(0, 1)) == "1" ? 1 : 2, + "PatientIdentificationNo": isDubai ? appState.getUserRegistrationPayload.patientIdentificationId.toString() : appState.getNHICUserData.idNumber.toString(), + "MobileNumber": appState.getUserRegistrationPayload.patientMobileNumber ?? 0, + "PatientOutSA": (appState.getUserRegistrationPayload.zipCode == CountryEnum.saudiArabia.countryCode || appState.getUserRegistrationPayload.zipCode == '+966') ? 0 : 1, + "FirstNameN": isDubai ? "..." : appState.getNHICUserData.firstNameAr, + "FirstName": isDubai ? (names.isNotEmpty ? names[0] : "...") : appState.getNHICUserData.firstNameEn, + "MiddleNameN": isDubai ? "..." : appState.getNHICUserData.secondNameAr, + "MiddleName": isDubai ? "..." : appState.getNHICUserData.secondNameEn, + "LastNameN": isDubai ? "..." : appState.getNHICUserData.lastNameAr, + "LastName": isDubai ? (names.length > 1 ? names[1] : "...") : appState.getNHICUserData.lastNameEn, + "StrDateofBirth": dateFormat1.format(dateFormat2.parse(dob)), + "DateofBirth": DateUtil.convertISODateToJsonDate((dob ?? "").replaceAll('/', '-')), + "Gender": isDubai ? (gender == GenderTypeEnum.male ? 1 : 2) : (appState.getNHICUserData.gender == 'M' ? 1 : 2), + "NationalityID": isDubai ? "UAE" : appState.getNHICUserData.nationalityCode, + "eHealthIDField": isDubai ? null : appState.getNHICUserData.healthId, + "DateofBirthN": date, + "EmailAddress": emailAddress, + "SourceType": (appState.getUserRegistrationPayload.zipCode == CountryEnum.saudiArabia.countryCode || appState.getUserRegistrationPayload.zipCode == '+966') ? "1" : "2", + "PreferredLanguage": appState.getLanguageCode() == "ar" ? (isDubai ? "1" : 1) : (isDubai ? "2" : 2), + "Marital": isDubai + ? (maritalStatus == MaritalStatusTypeEnum.single + ? '0' + : maritalStatus == MaritalStatusTypeEnum.married + ? '1' + : '2') + : (appState.getNHICUserData.maritalStatusCode == 'U' + ? '0' + : appState.getNHICUserData.maritalStatusCode == 'M' + ? '1' + : '2'), + }, + "PatientIdentificationID": isDubai ? appState.getUserRegistrationPayload.patientIdentificationId.toString() : appState.getNHICUserData.idNumber.toString(), + "PatientMobileNumber": appState.getUserRegistrationPayload.patientMobileNumber.toString()[0] == '0' + ? appState.getUserRegistrationPayload.patientMobileNumber + : '0${appState.getUserRegistrationPayload.patientMobileNumber}', + "DOB": dob, + "IsHijri": appState.getUserRegistrationPayload.isHijri, + "PatientOutSA": (appState.getUserRegistrationPayload.zipCode == CountryEnum.saudiArabia.countryCode || appState.getUserRegistrationPayload.zipCode == '+966') ? 0 : 1, + "isDentalAllowedBackend": appState.getUserRegistrationPayload.isDentalAllowedBackend, + "ZipCode": appState.getUserRegistrationPayload.zipCode, + if (!isDubai) "HealthId": appState.getNHICUserData.healthId, + }; + } + + static Future getAddFamilyRequest({required String nationalIDorFile, required String mobileNo, required String countryCode}) async { + FamilyFileRequest request = FamilyFileRequest(); + int? loginType = 0; + + if (countryCode == CountryEnum.saudiArabia.countryCode || countryCode == '+966') { + loginType = (nationalIDorFile.length == 10) ? 1 : 2; + } else if (countryCode == CountryEnum.unitedArabEmirates.countryCode || countryCode == '+971') { + loginType = (nationalIDorFile.length == 15) ? 1 : 2; + } + + if (loginType == 1) { + request.sharedPatientId = 0; + request.sharedPatientIdentificationId = nationalIDorFile; + } else if (loginType == 2) { + request.sharedPatientId = int.parse(nationalIDorFile); + request.sharedPatientIdentificationId = ''; + } + request.searchType = loginType; + request.sharedPatientMobileNumber = mobileNo; + request.zipCode = countryCode; + request.isRegister = false; + request.patientStatus = 2; + request.isDentalAllowedBackend = false; + return request; + } +} diff --git a/lib/core/utils/size_config.dart b/lib/core/utils/size_config.dart index 65ff374..9f9d835 100644 --- a/lib/core/utils/size_config.dart +++ b/lib/core/utils/size_config.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; -import 'package:hmg_patient_app_new/core/consts.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; class SizeConfig { static double _blockWidth = 0; diff --git a/lib/core/utils/size_utils.dart b/lib/core/utils/size_utils.dart index 0b37082..fdd0d30 100644 --- a/lib/core/utils/size_utils.dart +++ b/lib/core/utils/size_utils.dart @@ -1,21 +1,128 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; // These are the Viewport values of your Figma Design. // These are used in the code as a reference to create your UI Responsively. -const num FIGMA_DESIGN_WIDTH = 375; -const num FIGMA_DESIGN_HEIGHT = 667; -const num FIGMA_DESIGN_STATUS_BAR = 0; +const num figmaDesignWidth = 375; // iPhone X / 12 base width +const num figmaDesignHeight = 812; // iPhone X / 12 base height extension ResponsiveExtension on num { - double get _width => SizeUtils.width; + double get _screenWidth => SizeUtils.width; + + double get _screenHeight => SizeUtils.height; + + /// Check if device is likely a foldable + bool get _isFoldable { + double aspectRatio = _screenWidth / _screenHeight; + // Foldable devices typically have aspect ratios close to 1:1 when unfolded + return (aspectRatio > 0.9 && aspectRatio < 1.1) && (_screenWidth > 700 || _screenHeight > 700); + } + + /// Scale text size - enhanced for foldable devices + double get f { + double aspectRatio = _screenWidth / _screenHeight; + double scale = (_screenWidth < _screenHeight ? _screenWidth : _screenHeight) / figmaDesignWidth; + + // Enhanced clamping for different device types + double clamp; + if (SizeUtils.deviceType == DeviceType.tablet || _isFoldable) { + // More conservative scaling for tablets and foldables + clamp = (aspectRatio > 1.5 || aspectRatio < 0.67) ? 1.4 : 1.1; + } else { + // Original logic for phones + clamp = (aspectRatio > 1.3 || aspectRatio < 0.77) ? 1.6 : 1.2; + } + + if (scale > clamp) scale = clamp; + return this * scale; + } + + /// Scale horizontally (width-based) - enhanced for foldable devices + double get w { + double baseScale = (this * _screenWidth) / figmaDesignWidth; + + if (_isFoldable) { + // For foldables, use more conservative width scaling + double scale = _screenWidth / figmaDesignWidth; + scale = scale.clamp(0.8, 1.4); + return this * scale; + } + + return baseScale; + } + + /// Scale vertically (height-based) - enhanced for foldable devices + double get h { + double baseScale = (this * _screenHeight) / figmaDesignHeight; + + if (_isFoldable) { + // For foldables, use height-based scaling but with constraints + double scale = (_screenHeight / figmaDesignHeight).clamp(0.8, 1.4); + return this * scale; + } + + return baseScale; + } + + /// Radius - enhanced for foldable devices + double get r { + double baseScale = (this * _screenWidth) / figmaDesignWidth; + + if (_isFoldable) { + // Use the same logic as enhanced width for foldables + double scale = _screenWidth / figmaDesignWidth; + scale = scale.clamp(0.8, 1.4); + return this * scale; + } + + return baseScale; + } - double get h => ((this * _width) / FIGMA_DESIGN_WIDTH); + // New enhanced getters (additional options) - double get fSize => ((this * _width) / FIGMA_DESIGN_WIDTH); + /// Enhanced font scaling with device-specific adjustments + double get fh { + double baseScale = _screenHeight / figmaDesignHeight; + + if (_isFoldable) { + // Special handling for foldable devices - use more conservative scaling + baseScale = baseScale.clamp(0.8, 1.3); + } else if (SizeUtils.deviceType == DeviceType.tablet) { + // Tablet-specific scaling + baseScale = baseScale.clamp(0.9, 1.5); + } else { + // Phone scaling + baseScale = baseScale.clamp(0.8, 1.8); + } + + return this * baseScale; + } + + /// Adaptive scaling - automatically chooses best scaling method + double get adaptive { + if (_isFoldable) { + return fh; + } else if (SizeUtils.deviceType == DeviceType.tablet) { + return f * 0.9; // Slightly smaller for tablets + } + return f; + } + + /// Minimum size constraint (useful for touch targets) + double get minSize { + double scaled = adaptive; + return scaled < 44 ? 44 : scaled; // Minimum 44pt for accessibility + } + + /// Optional: direct accessors for full width/height + static double get screenWidth => SizeUtils.width; + + static double get screenHeight => SizeUtils.height; } extension FormatExtension on double { double toDoubleValue({int fractionDigits = 2}) { - return double.parse(this.toStringAsFixed(fractionDigits)); + return double.parse(toStringAsFixed(fractionDigits)); } double isNonZero({num defaultValue = 0.0}) { @@ -32,7 +139,7 @@ typedef ResponsiveBuild = Widget Function( ); class Sizer extends StatelessWidget { - const Sizer({Key? key, required this.builder}) : super(key: key); + const Sizer({super.key, required this.builder}); /// Builds the widget whenever the orientation changes. final ResponsiveBuild builder; @@ -66,28 +173,62 @@ class SizeUtils { static late DeviceType deviceType; /// Device's Height - static late double height; + static double height = 667; /// Device's Width - static late double width; + static double width = 375; - static void setScreenSize( - BoxConstraints constraints, - Orientation currentOrientation, - ) { + static void setScreenSize(BoxConstraints constraints, Orientation currentOrientation) { boxConstraints = constraints; orientation = currentOrientation; + + double screenWidth; + double screenHeight; + if (orientation == Orientation.portrait) { - width = boxConstraints.maxWidth.isNonZero( - defaultValue: FIGMA_DESIGN_WIDTH, + screenWidth = boxConstraints.maxWidth.isNonZero( + defaultValue: figmaDesignWidth, ); - height = boxConstraints.maxHeight.isNonZero(); + screenHeight = boxConstraints.maxHeight.isNonZero(); } else { - width = boxConstraints.maxHeight.isNonZero( - defaultValue: FIGMA_DESIGN_WIDTH, + screenWidth = boxConstraints.maxHeight.isNonZero( + defaultValue: figmaDesignWidth, ); - height = boxConstraints.maxWidth.isNonZero(); + screenHeight = boxConstraints.maxWidth.isNonZero(); + } + + width = screenWidth; + height = screenHeight; + + // Fix device type detection + double longerSide = screenWidth > screenHeight ? screenWidth : screenHeight; + double shorterSide = screenWidth < screenHeight ? screenWidth : screenHeight; + + if (longerSide >= 1200) { + deviceType = DeviceType.tablet; + } else if (shorterSide >= 700) { + // Use shorter side to distinguish tablets (iPads typically have 768+ width) + deviceType = DeviceType.tablet; + } else { + deviceType = DeviceType.mobile; } - deviceType = DeviceType.mobile; + + log("longerSide: $longerSide"); + log("shorterSide: $shorterSide"); + log("isTablet: $isTablet"); + log("isFoldable: $isFoldable"); } } + +// Or create a helper method +bool get isTablet => SizeUtils.deviceType == DeviceType.tablet; + +bool get isMobile => SizeUtils.deviceType == DeviceType.mobile; + +bool get isDesktop => SizeUtils.deviceType == DeviceType.desktop; + +bool get isFoldable { + double aspectRatio = SizeUtils.width / SizeUtils.height; + // Foldable devices typically have aspect ratios close to 1:1 when unfolded + return (aspectRatio > 0.9 && aspectRatio < 1.1) && (SizeUtils.width > 700 || SizeUtils.height > 700); +} diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart index 003bc1c..c05fe8b 100644 --- a/lib/core/utils/utils.dart +++ b/lib/core/utils/utils.dart @@ -1,18 +1,39 @@ +import 'dart:convert'; +import 'dart:developer'; +import 'dart:io'; +import 'dart:math' as dartMath; +import 'dart:typed_data'; + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:crypto/crypto.dart' as crypto; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:google_api_availability/google_api_availability.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/ProjectDetailListModel.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/main.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/dialogs/confirm_dialog.dart'; import 'package:hmg_patient_app_new/widgets/loading_dialog.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:fluttertoast/fluttertoast.dart'; +import 'package:lottie/lottie.dart'; +import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; class Utils { + static AppState appState = getIt.get(); + static NavigationService navigationService = getIt.get(); + static bool _isLoadingVisible = false; static bool get isLoading => _isLoadingVisible; @@ -23,8 +44,8 @@ class Utils { toastLength: longDuration ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 1, - backgroundColor: blackColor, - textColor: whiteColor, + backgroundColor: AppColors.blackColor, + textColor: AppColors.whiteColor, fontSize: 16.0); } @@ -41,19 +62,20 @@ class Utils { } static String getFreeSlotsTimeText(String startTime, {bool isAddHours = false}) { - // return DateFormat('hh:mm a', AppState().isArabic() ? "ar_SA" : "en_US").format(DateTime.tryParse(startTime)!.add( + // return DateFormat('hh:mm a', appState.isArabic() ? "ar_SA" : "en_US").format(DateTime.tryParse(startTime)!.add( // Duration( // hours: isAddHours ? 3 : 0, // ), // )); return !isAddHours - ? DateFormat('hh:mm a', AppState().isArabic() ? "ar_SA" : "en_US").format(DateTime.tryParse(startTime.contains("T") ? startTime : convertStringToDateTime(startTime))!.toLocal()) - : DateFormat('hh:mm a', AppState().isArabic() ? "ar_SA" : "en_US").format(DateTime.tryParse(startTime.contains("T") ? startTime : convertStringToDateTime(startTime))!.add( + ? DateFormat('hh:mm a', appState.isArabic() ? "ar_SA" : "en_US") + .format(DateTime.tryParse(startTime.contains("T") ? startTime : convertStringToDateTime(startTime))!.toLocal()) + : DateFormat('hh:mm a', appState.isArabic() ? "ar_SA" : "en_US") + .format(DateTime.tryParse(startTime.contains("T") ? startTime : convertStringToDateTime(startTime))!.add( Duration( hours: isAddHours ? 3 : 0, ), )); - ; } static String convertStringToDateTime(String dateTimeString) { @@ -76,12 +98,15 @@ class Utils { } static String getMonthDayYearDateFormatted(DateTime dateTime) { - if (dateTime != null) - return AppState().isArabic() - ? getMonthArabic(dateTime.month) + " " + dateTime.day.toString() + ", " + dateTime.year.toString() - : getMonth(dateTime.month) + " " + dateTime.day.toString() + ", " + dateTime.year.toString(); - else - return ""; + return appState.isArabic() + ? getMonthArabic(dateTime.month) + " " + dateTime.day.toString() + ", " + dateTime.year.toString() + : getMonth(dateTime.month) + " " + dateTime.day.toString() + ", " + dateTime.year.toString(); + } + static String getDayMonthYearDateFormatted(DateTime? dateTime) { + if(dateTime == null ) return ""; + return appState.isArabic() + ? "${dateTime.day.toString()} ${getMonthArabic(dateTime.month)}, ${dateTime.year.toString()}" + : "${dateTime.day.toString()} ${getMonth(dateTime.month)}, ${dateTime.year.toString()}"; } /// get month by @@ -146,6 +171,16 @@ class Utils { } } + static Future getBoolFromPrefs(String key) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + return prefs.getBool(key) ?? true; + } + + static Future saveBoolFromPrefs(String key, bool value) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + return await prefs.setBool(key, value); + } + static Future getStringFromPrefs(String key) async { SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.getString(key) ?? ""; @@ -194,8 +229,8 @@ class Utils { static void showLoadingDialog() { _isLoadingVisible = true; showDialog( - context: navigatorKey.currentContext!, - barrierColor: Colors.black.withOpacity(0.5), + context: navigationService.navigatorKey.currentContext!, + barrierColor: AppColors.blackColor, builder: (BuildContext context) => LoadingDialog(), ) .then((value) { @@ -211,10 +246,12 @@ class Utils { try { if (_isLoadingVisible) { _isLoadingVisible = false; - Navigator.of(navigatorKey.currentContext!).pop(); + Navigator.of(navigationService.navigatorKey.currentContext!).pop(); } _isLoadingVisible = false; - } catch (e) {} + } catch (e) { + log("errr: ${e.toString()}"); + } } static List uniqueBy(List list, K Function(T) keySelector) { @@ -234,59 +271,198 @@ class Utils { ); } - static bool isSAUDIIDValid(String id, type) { - if (type == 1) { - if (id == null) { - return false; - } - try { - id = id.toString(); - id = id.trim(); - var returnValue = int.parse(id); - var sum = 0; - if (returnValue > 0) { - var type = int.parse(id[0]); - - if (id.length != 10) { - return false; - } - if (type != 2 && type != 1) { - return false; - } + static bool isSAUDIIDValid( + String id, + ) { + try { + id = id.toString(); + id = id.trim(); + var returnValue = int.parse(id); + var sum = 0; + if (returnValue > 0) { + var type = int.parse(id[0]); + + if (id.length != 10) { + return false; + } + if (type != 2 && type != 1) { + return false; + } - for (var i = 0; i < 10; i++) { - if (i % 2 == 0) { - var a = id[i]; - var x = int.parse(a) * 2; - var b = x.toString(); - if (b.length == 1) { - b = "0" + b; - } - sum += int.parse(b[0]) + int.parse(b[1]); - } else { - sum += int.parse(id[i]); + for (var i = 0; i < 10; i++) { + if (i % 2 == 0) { + var a = id[i]; + var x = int.parse(a) * 2; + var b = x.toString(); + if (b.length == 1) { + b = "0$b"; } + sum += int.parse(b[0]) + int.parse(b[1]); + } else { + sum += int.parse(id[i]); } - return sum % 10 == 0; } - } catch (err) {} - return false; - } else { - return true; + return sum % 10 == 0; + } + } catch (err) { + log("errr: ${err.toString()}"); } + return false; + } + + static Widget getNoDataWidget( + BuildContext context, { + double width = 124, + double height = 124, + String? noDataText, + Widget callToActionButton = const SizedBox.shrink(), + bool isSmallWidget = false, + }) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: isSmallWidget ? 0.h : 48.h), + Lottie.asset(AppAnimations.noData, repeat: false, reverse: false, frameRate: FrameRate(60), width: width.h, height: height.h, fit: BoxFit.fill), + SizedBox(height: 16.h), + (noDataText ?? LocaleKeys.noDataAvailable.tr()) + .toText16(weight: FontWeight.w500, color: AppColors.greyTextColor, isCenter: true) + .paddingSymmetrical(64.w, 0.h), + SizedBox(height: 16.h), + callToActionButton + ], + ).center; + } + + static Widget getLoadingWidget({String? loadingText}) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Lottie.asset(AppAnimations.loadingAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), + SizedBox(height: 8.h), + (loadingText ?? LocaleKeys.loadingText.tr()).toText16(color: AppColors.blackColor, isCenter: true), + SizedBox(height: 8.h), + ], + ).center; + } + + static Widget getSuccessWidget({String? loadingText}) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Lottie.asset(AppAnimations.checkmark, repeat: true, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), + SizedBox(height: 8.h), + (loadingText ?? LocaleKeys.loadingText.tr()).toText16(color: AppColors.blackColor), + SizedBox(height: 8.h), + ], + ).center; + } + + static Widget getErrorWidget({String? loadingText}) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Lottie.asset(AppAnimations.errorAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), + SizedBox(height: 8.h), + (loadingText ?? LocaleKeys.loadingText.tr()).toText16(color: AppColors.blackColor), + SizedBox(height: 8.h), + ], + ).center; } - static Widget getNoDataWidget(BuildContext context, {String? errorText}) { + static Widget getWarningWidget({String? loadingText, bool isShowActionButtons = false, Widget? bodyWidget, Function? onConfirmTap, Function? onCancelTap}) { return Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - SvgPicture.asset('assets/images/NoDataAvailableIcon.svg', width: 150.0, height: 150.0), - (errorText ?? LocaleKeys.noDataAvailable.tr()).toText16(isCenter: true).paddingOnly(top: 15), + Lottie.asset(AppAnimations.warningAnimation, repeat: false, reverse: false, frameRate: FrameRate(60), width: 128.h, height: 128.h, fit: BoxFit.fill), + SizedBox(height: 8.h), + (loadingText ?? LocaleKeys.loadingText.tr()).toText14(color: AppColors.blackColor, letterSpacing: 0), + SizedBox(height: 16.h), + bodyWidget ?? SizedBox.shrink(), + SizedBox(height: 16.h), + isShowActionButtons + ? Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: () { + if (onCancelTap != null) { + onCancelTap(); + } + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + icon: AppAssets.cancel, + iconColor: AppColors.whiteColor, + ), + ), + SizedBox(width: 8.h), + Expanded( + child: CustomButton( + text: LocaleKeys.confirm.tr(), + onPressed: () async { + if (onConfirmTap != null) { + onConfirmTap(); + } + }, + backgroundColor: AppColors.bgGreenColor, + borderColor: AppColors.bgGreenColor, + textColor: Colors.white, + icon: AppAssets.confirm, + ), + ), + ], + ) + : SizedBox.shrink(), ], ).center; } + static bool isVidaPlusProject(int projectID) { + AppState appState = getIt.get(); + bool isVidaPlus = false; + for (var element in appState.vidaPlusProjectList) { + if (element.projectID == projectID) { + isVidaPlus = true; + } + } + return isVidaPlus; + } + + static ProjectDetailListModel getProjectDetailObj(AppState appState, int projectID) { + ProjectDetailListModel projectDetailListModel = ProjectDetailListModel(); + for (var element in appState.projectDetailListModel) { + if (element.projectID == projectID) { + projectDetailListModel = element; + } + } + return projectDetailListModel; + } + + static double distance(double lat1, double lon1, double lat2, double lon2) { + const r = 6372.8; // Earth radius in kilometers + + final dLat = _toRadians(lat2 - lat1); + final dLon = _toRadians(lon2 - lon1); + final lat1Radians = _toRadians(lat1); + final lat2Radians = _toRadians(lat2); + + final a = _haversin(dLat) + dartMath.cos(lat1Radians) * dartMath.cos(lat2Radians) * _haversin(dLon); + final c = 2 * dartMath.asin(dartMath.sqrt(a)); + + return r * c; + } + + static double _toRadians(double degrees) => degrees * dartMath.pi / 180; + + static num _haversin(double radians) => dartMath.pow(dartMath.sin(radians / 2), 2); + static getPhoneNumberWithoutZero(String number) { String newNumber = ""; if (number.startsWith('0')) { @@ -298,18 +474,20 @@ class Utils { } static String removeHtmlTags(String htmlString) { - if (htmlString == null || htmlString.isEmpty) { + if (htmlString.isEmpty) { return ''; } - // Replace HTML line breaks with newlines - var withLineBreaks = - htmlString.replaceAll(RegExp(r'', multiLine: true), '\n').replaceAll(RegExp(r'<\/p>', multiLine: true), '\n').replaceAll(RegExp(r'', multiLine: true), '\n'); +// Replace HTML line breaks with newlines + var withLineBreaks = htmlString + .replaceAll(RegExp(r'', multiLine: true), '\n') + .replaceAll(RegExp(r'<\/p>', multiLine: true), '\n') + .replaceAll(RegExp(r'', multiLine: true), '\n'); - // Remove all other HTML tags +// Remove all other HTML tags var withoutTags = withLineBreaks.replaceAll(RegExp(r'<[^>]*>'), ''); - // Decode HTML entities +// Decode HTML entities var decodedString = withoutTags .replaceAll(' ', ' ') .replaceAll('&', '&') @@ -322,7 +500,7 @@ class Utils { .replaceAll('”', '"') .replaceAll('“', '"'); - // Remove extra whitespace and normalize line breaks +// Remove extra whitespace and normalize line breaks var normalizedString = decodedString .replaceAll(RegExp(r'\n\s*\n'), '\n\n') // Replace multiple blank lines with double line break .replaceAll(RegExp(r' +'), ' ') // Replace multiple spaces with single space @@ -333,9 +511,344 @@ class Utils { Widget mDivider(Color color) { return Divider( - // width: double.infinity, +// width: double.infinity, height: 1, color: color, ); } + +// New Ui Items + + static String formatDateToDisplay(String isoDateString) { + try { + final dateTime = DateTime.parse(isoDateString); + final day = dateTime.day.toString().padLeft(2, '0'); + final year = dateTime.year.toString(); + +// Map month number to short month name + const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + final month = monthNames[dateTime.month - 1]; + + return '$day $month, $year'; + } catch (e) { + log("Error formatting date: $e"); + return ""; + } + } + + static String formatDateForApi(String isoDateString) { + try { + final dateTime = DateTime.parse(isoDateString); + final year = dateTime.year.toString(); + final month = dateTime.month.toString().padLeft(2, '0'); + final day = dateTime.day.toString().padLeft(2, '0'); + return '$day/$month/$year'; + } catch (e) { + log("Error formatting date for API: $e"); + return ""; + } + } + + static String formatHijriDateToDisplay(String hijriDateString) { + try { +// Assuming hijriDateString is in the format yyyy-MM-dd + final datePart = hijriDateString.split("T").first; + final parts = datePart.split('-'); + if (parts.length != 3) return ""; + + final day = parts[2].padLeft(2, '0'); + final year = parts[0]; + +// Map month number to short month name (Hijri months) + const hijriMonthNames = [ + 'Muharram', + 'Safar', + 'Rabi I', + 'Rabi II', + 'Jumada I', + 'Jumada II', + 'Rajab', + 'Sha\'ban', + 'Ramadan', + 'Shawwal', + 'Dhu al-Qi\'dah', + 'Dhu al-Hijjah' + ]; + final monthIndex = int.tryParse(parts[1]) ?? 1; + final month = hijriMonthNames[monthIndex - 1]; + + return '$day $month, $year'; + } catch (e) { + log("Error formatting hijri date: $e"); + return ""; + } + } + + static String formatDateToUsage(String isoDateString) { + try { + final dateTime = DateTime.parse(isoDateString); + final day = dateTime.day.toString().padLeft(2, '0'); + final month = dateTime.month.toString().padLeft(2, '0'); + final year = dateTime.year.toString(); + + return '$day-$month-$year'; + } catch (e) { + log("Error formatting date: $e"); + return ""; + } + } + + static Widget showLottie({ + required BuildContext context, + String assetPath = 'assets/icons/no_property.json', + double? height, + double? width, + BoxFit fit = BoxFit.cover, + Alignment alignment = Alignment.center, + bool repeat = false, + bool animate = true, + void Function(LottieComposition)? onLoaded, + }) { + return Lottie.asset(assetPath, + height: height ?? MediaQuery.of(context).size.height * 0.26, + width: width ?? MediaQuery.of(context).size.width, + fit: fit, + alignment: alignment, + repeat: repeat, + animate: animate, + onLoaded: onLoaded); + } + + static Widget buildSvgWithAssets({ + required String icon, + Color? iconColor, + bool isDisabled = false, + double width = 24, + double height = 24, + BoxFit fit = BoxFit.cover, + }) { + return SvgPicture.asset( + icon, + colorFilter: iconColor != null ? ColorFilter.mode(isDisabled ? iconColor.withOpacity(0.5) : iconColor, BlendMode.srcIn) : null, + width: width, + height: height, + fit: fit, + ); + } + + /// Widget to build an SVG from network + static Widget buildSvgWithNetwork({ + required String url, + required Color iconColor, + bool isDisabled = false, + double? width, + double? height, + }) { + final iconH = height ?? 24.h; + final iconW = width ?? 24.w; + return SvgPicture.network( + url, + colorFilter: ColorFilter.mode( + isDisabled ? iconColor.withOpacity(0.5) : iconColor, + BlendMode.srcIn, + ), + width: iconW, + height: iconH, + ); + } + + static Widget buildImgWithAssets({ + required String icon, + Color? iconColor, + bool isDisabled = false, + double? width, + double? height, + BoxFit fit = BoxFit.cover, + double? border, + double? borderRadius, + }) { + final iconH = height ?? 24.h; + final iconW = width ?? 24.w; + return Container( + decoration: BoxDecoration( + border: border != null ? Border.all(color: AppColors.whiteColor, width: border) : null, + borderRadius: border != null ? BorderRadius.circular(borderRadius ?? 12.r) : null, + ), + child: Image.asset(icon, width: iconW, height: iconH, fit: fit), + ); + // return Image.asset(icon, width: width, height: height, fit: fit, ); + } + + /// Widget to build an SVG from network + static Widget buildImgWithNetwork({ + required String url, + required Color iconColor, + bool isDisabled = false, + double? width, + double? height, + BoxFit fit = BoxFit.cover, + ImageErrorWidgetBuilder? errorBuilder, + }) { + final iconH = height ?? 24.h; + final iconW = width ?? 24.w; + return Image.network( + url, + width: iconW, + height: iconH, + fit: fit, + errorBuilder: errorBuilder ?? + (_, __, ___) { + //todo change the error builder icon that it is returning + return Utils.buildSvgWithAssets(width: iconW, height: iconH, icon: AppAssets.no_visit_icon); + }, + ); + } + + static Widget getPaymentMethods() { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Image.asset(AppAssets.mada, width: 25.h, height: 25.h), + Image.asset(AppAssets.tamara_en, width: 25.h, height: 25.h), + Image.asset(AppAssets.visa, width: 25.h, height: 25.h), + Image.asset(AppAssets.Mastercard, width: 25.h, height: 25.h), + Image.asset(AppAssets.apple_pay, width: 25.h, height: 25.h), + ], + ); + } + + static Widget getPaymentAmountWithSymbol(Widget paymentAmountWidget, Color iconColor, double iconSize, + {bool isSaudiCurrency = true, bool isExpanded = true}) { + return Row( + mainAxisAlignment: isExpanded ? MainAxisAlignment.spaceBetween : MainAxisAlignment.start, + children: [ + appState.isArabic() + ? Container() + : Utils.buildSvgWithAssets( + icon: isSaudiCurrency ? AppAssets.saudi_riyal_icon : AppAssets.uae_dirham_symbol, + iconColor: iconColor, + width: iconSize.h, + height: iconSize.h, + fit: BoxFit.contain, + ), + SizedBox(width: 5.h), + paymentAmountWidget, + SizedBox(width: 5.h), + !appState.isArabic() + ? Container() + : Utils.buildSvgWithAssets( + icon: isSaudiCurrency ? AppAssets.saudi_riyal_icon : AppAssets.uae_dirham_symbol, + iconColor: iconColor, + width: iconSize.h, + height: iconSize.h, + fit: BoxFit.contain, + ), + ], + ); + } + + static Widget getPaymentAmountWithSymbol2(num habibWalletAmount, + {double iconSize = 14, + double? fontSize, + double? letterSpacing, + FontWeight? fontWeight, + Color iconColor = AppColors.textColor, + Color textColor = AppColors.blackColor, + bool isSaudiCurrency = true, + bool isExpanded = true, + }) { + return RichText( + maxLines: 1, + text: TextSpan( + children: [ + WidgetSpan( + alignment: PlaceholderAlignment.baseline, + baseline: TextBaseline.alphabetic, + child: Utils.buildSvgWithAssets(icon: AppAssets.saudi_riyal_icon, width: iconSize.h, height: iconSize.h, iconColor: iconColor), + ), + TextSpan( + text: NumberFormat.currency(locale: 'en_US', symbol: " ", decimalDigits: 0).format(habibWalletAmount), + style: TextStyle( + color: textColor, + fontSize: fontSize ?? 32.f, + letterSpacing: letterSpacing??-4, + fontWeight: fontWeight ?? FontWeight.w600, + height: 1), + ), + ], + ), + ); + } + + static Future isGoogleServicesAvailable() async { + GooglePlayServicesAvailability availability = await GoogleApiAvailability.instance.checkGooglePlayServicesAvailability(); + String status = availability.toString().split('.').last; + if (status == "success") { + return true; + } + return false; + } + + static Future checkConnection({bool bypassConnectionCheck = false}) async { + if (bypassConnectionCheck) return true; + List connectivityResult = await (Connectivity().checkConnectivity()); + if (connectivityResult.contains(ConnectivityResult.mobile) || connectivityResult.contains(ConnectivityResult.wifi)) { + return true; + } else { + return false; + } + } + + static String generateMd5Hash(String input) { + return crypto.md5.convert(utf8.encode(input)).toString(); + } + + static String getAppointmentTransID(int projectID, int clinicID, int appoNo, {bool isAddMilliseconds = true}) { + String currentMillis = DateTime.now().millisecondsSinceEpoch.toString(); + return '$projectID-$clinicID-$appoNo${isAddMilliseconds ? '-${currentMillis.substring(currentMillis.length - 5, currentMillis.length)}' : ""}'; + } + + static String getAdvancePaymentTransID(int projectID, int fileNumber) { + return '$projectID-$fileNumber-${DateTime.now().millisecondsSinceEpoch}'; + } + + static Future createFileFromString(String encodedStr, String ext) async { + Uint8List bytes = base64.decode(encodedStr); + String dir = (await getApplicationDocumentsDirectory()).path; + File file = File("$dir/" + DateTime.now().millisecondsSinceEpoch.toString() + "." + ext); + await file.writeAsBytes(bytes); + return file.path; + } + + ///method to be used to get the text as per the langauge of the application + static String getTextWRTCurrentLanguage(String? englishText, String? arabicText) { + String? text = appState.isArabic() ? arabicText : englishText; + return text ?? ''; + } + + static String formatNumberToInternationalFormat(num number, {String? currencySymbol, int decimalDigit = 0}) { + return NumberFormat.currency(locale: 'en_US', symbol: currencySymbol ?? "", decimalDigits: decimalDigit).format(number); + } + + static PatientDoctorAppointmentList? convertToPatientDoctorAppointmentList(HospitalsModel? hospital) { + if (hospital == null) return null; + return PatientDoctorAppointmentList( + filterName: hospital.name, distanceInKMs: hospital.distanceInKilometers?.toString(), projectTopName: hospital.name, projectBottomName: hospital.name, model: hospital, isHMC: hospital.isHMC); + } + + static bool havePrivilege(int id) { + bool isHavePrivilege = false; + try { + for (var element in appState.privilegeModelList) { + if (element.id == id) isHavePrivilege = element.previlege!; + } + } catch (e) { + print(e); + } + return isHavePrivilege; + } + + + } diff --git a/lib/core/utils/validation_utils.dart b/lib/core/utils/validation_utils.dart new file mode 100644 index 0000000..7e38300 --- /dev/null +++ b/lib/core/utils/validation_utils.dart @@ -0,0 +1,174 @@ +import 'dart:developer'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:hmg_patient_app_new/core/common_models/nationality_country_model.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; + +class ValidationUtils { + static final DialogService _dialogService = getIt.get(); + + static bool isValidatePhoneAndId({String? nationalId, String? phoneNumber}) { + log("phoneNumber: $phoneNumber"); + log("nationalId: $nationalId"); + if (nationalId == null || nationalId.isEmpty) { + _dialogService.showErrorBottomSheet(message: LocaleKeys.enterValidNationalId.tr(), onOkPressed: () {}); + return false; + } + + if (phoneNumber == null || phoneNumber.isEmpty) { + _dialogService.showErrorBottomSheet(message: LocaleKeys.enterValidPhoneNumber.tr(), onOkPressed: () {}); + return false; + } + return true; + } + + static bool isValidatedId({String? nationalId, required Function() onOkPress, CountryEnum? selectedCountry, bool? isTermsAccepted, String? dob}) { + bool isCorrectID = true; + if (nationalId == null || nationalId.isEmpty) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAnationalID.tr(), onOkPressed: onOkPress); + isCorrectID = false; + } + + if (nationalId != null && nationalId.isNotEmpty && selectedCountry != null) { + if (selectedCountry == CountryEnum.saudiArabia) { + if (!validateIqama(nationalId)) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAValidIqamaID.tr(), onOkPressed: onOkPress); + return false; + } + } + + if (selectedCountry == CountryEnum.unitedArabEmirates) { + if (!validateUaeNationalId(nationalId)) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAValidNationalID.tr(), onOkPressed: onOkPress); + return false; + } + } + + if (dob == null || dob.isEmpty) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAValidDateOfBirth.tr(), onOkPressed: onOkPress); + return false; + } + + if (isTermsAccepted != null && !isTermsAccepted) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseAcceptTermsConditions.tr(), onOkPressed: onOkPress); + return false; + } + } + return isCorrectID; + } + + static bool isValidatePhone({String? phoneNumber, required Function() onOkPress}) { + if (phoneNumber == null || phoneNumber.isEmpty) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.enterValidPhoneNumber.tr(), onOkPressed: onOkPress); + return false; + } + return true; + } + + static bool isValidate({String? phoneNumber, required Function() onOkPress}) { + if (phoneNumber == null || phoneNumber.isEmpty) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.enterValidPhoneNumber.tr(), onOkPressed: onOkPress); + return false; + } + return true; + } + + static bool validateIqama(String iqamaNumber) { + String cleanedIqama = iqamaNumber.replaceAll(RegExp(r'[^0-9]'), ''); + if (cleanedIqama.length != 10) { + return false; + } + int firstDigit = int.parse(cleanedIqama[0]); + if (firstDigit != 2 && firstDigit != 1) { + return false; + } + int sum = 0; + for (int i = 0; i < 10; i++) { + int digit = int.parse(cleanedIqama[i]); + int weight = (i % 2 == 0) ? 2 : 1; // Alternate weights: 2, 1, 2, 1... + int product = digit * weight; + sum += (product > 9) ? product - 9 : product; // Sum digits if product > 9 + } + return sum % 10 == 0; + } + + static bool validateUaeNationalId(String id) { + // Must be exactly 15 digits + final regex = RegExp(r'^784\d{4}\d{7}\d{1}$'); + return regex.hasMatch(id); + } + + static bool validateUaeRegistration( + {String? name, GenderTypeEnum? gender, NationalityCountries? country, MaritalStatusTypeEnum? maritalStatus, required Function() onOkPress}) { + if (name == null || name.isEmpty) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAValidName.tr(), onOkPressed: onOkPress); + return false; + } + + if (gender == null) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseSelectAGender.tr(), onOkPressed: onOkPress); + return false; + } + + if (maritalStatus == null) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseSelectAMaritalStatus.tr(), onOkPressed: onOkPress); + return false; + } + + if (country == null) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseSelectACountry.tr(), onOkPressed: onOkPress); + return false; + } + + return true; + } + + static bool isValidateEmail({String? email, required Function() onOkPress}) { + if (email == null || email.isEmpty) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterEmail.tr(), onOkPressed: onOkPress); + return false; + } + final bool emailIsValid = RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}$").hasMatch(email); + + if (!emailIsValid) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAValidEmailFormat.tr(), onOkPressed: onOkPress); + return false; + } + + return true; + } + + static bool isValidatedIdAndPhoneWithCountryValidation( + {String? nationalId, String? phoneNumber, required Function() onOkPress, CountryEnum? selectedCountry}) { + bool isCorrectID = true; + if (nationalId == null || nationalId.isEmpty) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAnationalID.tr(), onOkPressed: onOkPress); + isCorrectID = false; + } + + if (nationalId != null && nationalId.isNotEmpty && selectedCountry != null) { + if (selectedCountry == CountryEnum.saudiArabia) { + if (!validateIqama(nationalId)) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAValidIqamaID.tr(), onOkPressed: onOkPress); + return false; + } + } + + if (selectedCountry == CountryEnum.unitedArabEmirates) { + if (!validateUaeNationalId(nationalId)) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAValidNationalID.tr(), onOkPressed: onOkPress); + return false; + } + } + + if (phoneNumber == null || phoneNumber.isEmpty) { + _dialogService.showExceptionBottomSheet(message: LocaleKeys.enterValidPhoneNumber.tr(), onOkPressed: onOkPress); + return false; + } + } + return isCorrectID; + } +} diff --git a/lib/extensions/context_extensions.dart b/lib/extensions/context_extensions.dart index 5783ce3..27ff428 100644 --- a/lib/extensions/context_extensions.dart +++ b/lib/extensions/context_extensions.dart @@ -2,15 +2,45 @@ import 'package:flutter/material.dart'; extension ContextUtils on BuildContext { double get screenHeight => MediaQuery.of(this).size.height; + double get screenWidth => MediaQuery.of(this).size.width; + + EdgeInsets get padding => MediaQuery.of(this).padding; + + bool get safeInsets => padding.top > 0 || padding.bottom > 0 || padding.left > 0 || padding.right > 0; + ThemeData get theme => Theme.of(this); + TextTheme get textTheme => theme.textTheme; - // TextStyle get headline1 => textTheme.headline1!; - // TextStyle get headline2 => textTheme.headline2!; - // TextStyle get headline3 => textTheme.headline3!; - // TextStyle get headline4 => textTheme.headline4!; - // TextStyle get headline5 => textTheme.headline5!; - // TextStyle get headline6 => textTheme.headline6!; - // TextStyle get bodyText1 => textTheme.bodyText1!; - // TextStyle get bodyText2 => textTheme.bodyText2!; +// TextStyle get headline1 => textTheme.headline1!; +// TextStyle get headline2 => textTheme.headline2!; +// TextStyle get headline3 => textTheme.headline3!; +// TextStyle get headline4 => textTheme.headline4!; +// TextStyle get headline5 => textTheme.headline5!; +// TextStyle get headline6 => textTheme.headline6!; +// TextStyle get bodyText1 => textTheme.bodyText1!; +// TextStyle get bodyText2 => textTheme.bodyText2!; +} + +extension ShowBottomSheet on BuildContext { + Future showBottomSheet({ + isScrollControlled = true, + isDismissible = false, + required Widget child, + Color? backgroundColor, + enableDra = false, + useSafeArea = false, + BoxConstraints? constraints, + }) { + return showModalBottomSheet( + context: this, + constraints: constraints, + isScrollControlled: isScrollControlled, + isDismissible: isDismissible, + enableDrag: enableDra, + useSafeArea: useSafeArea, + backgroundColor: backgroundColor ?? Colors.transparent, + builder: (_) => child, + ); + } } diff --git a/lib/extensions/int_extensions.dart b/lib/extensions/int_extensions.dart index 1cd461a..80b3171 100644 --- a/lib/extensions/int_extensions.dart +++ b/lib/extensions/int_extensions.dart @@ -6,9 +6,7 @@ extension IntExtensions on int { Widget get width => SizedBox(width: toDouble()); - Widget get divider => Divider(height: toDouble(), thickness: toDouble(), color: buttonColor); + Widget get divider => Divider(height: toDouble(), thickness: toDouble(), color: Color(0x30D2D2D2)); Widget get makeItSquare => SizedBox(width: toDouble(), height: toDouble()); - - } diff --git a/lib/extensions/route_extensions.dart b/lib/extensions/route_extensions.dart new file mode 100644 index 0000000..0dcc54b --- /dev/null +++ b/lib/extensions/route_extensions.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +extension NavigationExtensions on BuildContext { + void navigateWithName(String routeName, {Object? arguments}) { + Navigator.pushNamed(this, routeName, arguments: arguments); + } + + Future navigateReplaceWithName(String routeName, {Object? arguments}) async { + await Navigator.pushReplacementNamed(this, routeName, arguments: arguments); + } + + void navigateReplaceWithNameUntilRoute(String routeName, {Object? arguments}) { + Navigator.pushNamedAndRemoveUntil(this, routeName, (route) => false); + } + + void pop() { + Navigator.of(this).pop(); + } + + void navigateTo(Widget page) { + Navigator.push(this, MaterialPageRoute(builder: (context) => page)); + } + + void popUntilNamed(String routeName) { + Navigator.popUntil(this, ModalRoute.withName(routeName)); + } +} diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 14e14c8..1a6d1cc 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -1,17 +1,23 @@ -import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/cupertino.dart'; -import 'package:intl/intl.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:intl/intl.dart'; extension CapExtension on String { - String get toCamelCase => "${this[0].toUpperCase()}${this.substring(1)}"; + String get toCamelCase => "${this[0].toUpperCase()}${substring(1)}"; - String get inCaps => '${this[0].toUpperCase()}${this.substring(1)}'; + String get inCaps => '${this[0].toUpperCase()}${substring(1)}'; - String get allInCaps => this.toUpperCase(); + String get allInCaps => toUpperCase(); - String get capitalizeFirstofEach => this.trim().length > 0 ? this.trim().toLowerCase().split(" ").map((str) => str.inCaps).join(" ") : ""; + String get needTranslation => this; + + String get capitalizeFirstofEach => trim().isNotEmpty ? trim().toLowerCase().split(" ").map((str) => str.inCaps).join(" ") : ""; } extension EmailValidator on String { @@ -22,52 +28,79 @@ extension EmailValidator on String { maxLines: maxlines, overflow: textOverflow, style: TextStyle( - fontSize: 8.fSize, + fontSize: 8.f, fontStyle: fontStyle ?? FontStyle.normal, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, - color: color ?? blackColor, - letterSpacing: 0.64, + color: color ?? AppColors.blackColor, + letterSpacing: 0, ), ); - Widget toText10({Color? color, bool isBold = false, bool isUnderLine = false, int? maxlines, FontStyle? fontStyle, TextOverflow? textOverflow}) => Text( + Widget toText10( + {Color? color, + FontWeight? weight, + bool isBold = false, + bool isUnderLine = false, + int? maxlines, + FontStyle? fontStyle, + TextOverflow? textOverflow, + double letterSpacing = 0}) => + Text( this, maxLines: maxlines, overflow: textOverflow, style: TextStyle( - fontSize: 10.fSize, + fontSize: 10.f, fontStyle: fontStyle ?? FontStyle.normal, - fontWeight: isBold ? FontWeight.bold : FontWeight.normal, - color: color ?? blackColor, - letterSpacing: 0.64, + fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), + color: color ?? AppColors.blackColor, + letterSpacing: letterSpacing, decoration: isUnderLine ? TextDecoration.underline : null, - decorationColor: color ?? blackColor), + decorationColor: color ?? AppColors.blackColor), ); - Widget toText11({Color? color, FontWeight? weight, bool isUnderLine = false, bool isCenter = false, bool isBold = false, int maxLine = 0, double letterSpacing = 0.64}) => Text( + Widget toText11( + {Color? color, + FontWeight? weight, + bool isUnderLine = false, + bool isCenter = false, + bool isBold = false, + int maxLine = 0, + double letterSpacing = 0}) => + Text( this, textAlign: isCenter ? TextAlign.center : null, maxLines: (maxLine > 0) ? maxLine : null, softWrap: true, style: TextStyle( - fontSize: 11.fSize, + fontSize: 11.f, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), - color: color ?? blackColor, + color: color ?? AppColors.blackColor, letterSpacing: letterSpacing, decoration: isUnderLine ? TextDecoration.underline : null, ), ); - Widget toText12({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => Text( + Widget toText12( + {Color? color, + bool isUnderLine = false, + TextAlign textAlignment = TextAlign.start, + bool isBold = false, + FontWeight? fontWeight, + bool isCenter = false, + double? height, + int maxLine = 0}) => + Text( this, - textAlign: isCenter ? TextAlign.center : null, + textAlign: isCenter ? TextAlign.center : textAlignment, maxLines: (maxLine > 0) ? maxLine : null, style: TextStyle( - fontSize: 12.fSize, - fontWeight: isBold ? FontWeight.bold : FontWeight.normal, - color: color ?? blackColor, - letterSpacing: 0.64, - decorationColor: isUnderLine ? blackColor : null, + fontSize: 12.f, + fontWeight: fontWeight ?? (isBold ? FontWeight.bold : FontWeight.normal), + color: color ?? AppColors.blackColor, + letterSpacing: 0, + height: height, + decorationColor: isUnderLine ? AppColors.blackColor : null, decoration: isUnderLine ? TextDecoration.underline : null, ), ); @@ -78,10 +111,10 @@ extension EmailValidator on String { maxLines: (maxLine > 0) ? maxLine : null, minFontSize: 8, style: TextStyle( - fontSize: 12.fSize, + fontSize: 12.f, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, - color: color ?? blackColor, - letterSpacing: 0.64, + color: color ?? AppColors.blackColor, + letterSpacing: 0, decoration: isUnderLine ? TextDecoration.underline : null, ), ); @@ -108,47 +141,73 @@ extension EmailValidator on String { style: TextStyle( fontSize: fontSize, fontWeight: fontWeight ?? (isBold ? FontWeight.bold : FontWeight.normal), - color: color ?? blackColor, + color: color ?? AppColors.blackColor, letterSpacing: letterSpacing, decoration: isUnderLine ? TextDecoration.underline : null, ), ); - Widget toText13({ - Color? color, - bool isUnderLine = false, - bool isBold = false, - bool isCenter = false, - int maxLine = 0, - }) => + Widget toText13( + {Color? color, + bool isUnderLine = false, + bool isBold = false, + bool isCenter = false, + int maxLine = 0, + FontWeight? weight, + double? letterSpacing = 0}) => Text( this, textAlign: isCenter ? TextAlign.center : null, maxLines: (maxLine > 0) ? maxLine : null, style: TextStyle( - fontSize: 13.fSize, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? blackColor, letterSpacing: 0.64, decoration: isUnderLine ? TextDecoration.underline : null), + fontSize: 13.f, + fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), + color: color ?? AppColors.blackColor, + letterSpacing: letterSpacing, + decoration: isUnderLine ? TextDecoration.underline : null), ); - Widget toText14({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, FontWeight? weight, int? maxlines}) => Text( + Widget toText14({ + Color? color, + bool isUnderLine = false, + bool isBold = false, + bool isCenter = false, + FontWeight? weight, + int? maxlines, + double? letterSpacing = 0, + double? height, + TextOverflow? textOverflow, + }) => + Text( this, textAlign: isCenter ? TextAlign.center : null, maxLines: maxlines, + overflow: textOverflow, style: TextStyle( - color: color ?? blackColor, - fontSize: 14.fSize, - letterSpacing: 0.64, + color: color ?? AppColors.blackColor, + fontSize: 14.f, + letterSpacing: letterSpacing, + height: height, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), decoration: isUnderLine ? TextDecoration.underline : null), ); - Widget toText15({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, FontWeight? weight, int? maxlines}) => Text( + Widget toText15( + {Color? color, + bool isUnderLine = false, + bool isBold = false, + bool isCenter = false, + FontWeight? weight, + int? maxlines, + double? letterSpacing = -1}) => + Text( this, textAlign: isCenter ? TextAlign.center : null, maxLines: maxlines, style: TextStyle( - color: color ?? blackColor, - fontSize: 15.fSize, - letterSpacing: 0.64, + color: color ?? AppColors.blackColor, + fontSize: 15.f, + letterSpacing: letterSpacing, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), decoration: isUnderLine ? TextDecoration.underline : null), ); @@ -159,17 +218,23 @@ extension EmailValidator on String { bool isBold = false, bool isCenter = false, int? maxlines, + double? height, TextAlign? textAlign, + FontWeight? weight, + TextOverflow? textOverflow, + double? letterSpacing = -0.4, }) => Text( this, maxLines: maxlines, textAlign: isCenter ? TextAlign.center : null, style: TextStyle( - color: color ?? blackColor, - fontSize: 16.fSize, - letterSpacing: 0.64, - fontWeight: isBold ? FontWeight.bold : FontWeight.normal, + color: color ?? AppColors.blackColor, + fontSize: 16.f, + letterSpacing: letterSpacing, + height: height, + overflow: textOverflow, + fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), decoration: isUnderLine ? TextDecoration.underline : null, ), ); @@ -177,53 +242,83 @@ extension EmailValidator on String { Widget toText17({Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, - style: TextStyle(color: color ?? blackColor, fontSize: 17.fSize, letterSpacing: 0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle(color: color ?? AppColors.blackColor, fontSize: 17.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); - Widget toText18({Color? color, bool isBold = false, bool isCenter = false, int? maxlines}) => Text( + Widget toText18({Color? color, FontWeight? weight, bool isBold = false, bool isCenter = false, int? maxlines, TextOverflow? textOverflow}) => Text( maxLines: maxlines, textAlign: isCenter ? TextAlign.center : null, this, - style: TextStyle(fontSize: 18.fSize, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? blackColor, letterSpacing: 0.64), + overflow: textOverflow, + style: TextStyle( + fontSize: 18.f, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: -0.4), ); Widget toText19({Color? color, bool isBold = false}) => Text( this, - style: TextStyle(fontSize: 19.fSize, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? blackColor, letterSpacing: 0.64), + style: TextStyle(fontSize: 19.f, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? AppColors.blackColor, letterSpacing: -0.4), ); - Widget toText20({Color? color, bool isBold = false}) => Text( + Widget toText20({Color? color, FontWeight? weight, bool isBold = false}) => Text( this, - style: TextStyle(fontSize: 20.fSize, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? blackColor, letterSpacing: 0.64), + style: TextStyle( + fontSize: 20.f, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: -0.4), ); Widget toText21({Color? color, bool isBold = false, FontWeight? weight, int? maxlines}) => Text( this, maxLines: maxlines, - style: TextStyle(color: color ?? blackColor, fontSize: 21.fSize, letterSpacing: 0.64, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal)), + style: TextStyle( + color: color ?? AppColors.blackColor, fontSize: 21.f, letterSpacing: -1, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal)), ); Widget toText22({Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, - style: TextStyle(height: 1, color: color ?? blackColor, fontSize: 22.fSize, letterSpacing: 0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle( + height: 1, color: color ?? AppColors.blackColor, fontSize: 22.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); - Widget toText24({Color? color, bool isBold = false, bool isCenter = false}) => Text( + Widget toText24({Color? color, bool isBold = false, bool isCenter = false, FontWeight? fontWeight, double? letterSpacing}) => Text( this, textAlign: isCenter ? TextAlign.center : null, - style: TextStyle(height: 23 / 24, color: color ?? blackColor, fontSize: 24.fSize, letterSpacing: 0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle( + height: 23 / 24, color: color ?? AppColors.blackColor, fontSize: 24.f, letterSpacing: letterSpacing??-1, fontWeight: isBold ? FontWeight.bold : fontWeight??FontWeight.normal), + ); + + Widget toText26({Color? color, bool isBold = false, double? height, bool isCenter = false, FontWeight? weight, double? letterSpacing}) => Text( + this, + textAlign: isCenter ? TextAlign.center : null, + style: TextStyle( + height: height ?? 23 / 26, + color: color ?? AppColors.blackColor, + fontSize: 26.f, + letterSpacing: letterSpacing ?? -1, + fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal)), + ); + + Widget toText28({Color? color, bool isBold = false, double? height, bool isCenter = false}) => Text( + this, + textAlign: isCenter ? TextAlign.center : null, + style: TextStyle( + height: height ?? 23 / 28, + color: color ?? AppColors.blackColor, + fontSize: 28.f, + letterSpacing: -1, + fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toText32({Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, - style: TextStyle(height: 32 / 32, color: color ?? blackColor, fontSize: 32.fSize, letterSpacing: 0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle( + height: 32 / 32, color: color ?? AppColors.blackColor, fontSize: 32.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toText44({Color? color, bool isBold = false}) => Text( this, - style: TextStyle(height: 32 / 32, color: color ?? blackColor, fontSize: 44.fSize, letterSpacing: 0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle( + height: 32 / 32, color: color ?? AppColors.blackColor, fontSize: 44.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toSectionHeading({String upperHeading = "", String lowerHeading = ""}) { @@ -259,12 +354,14 @@ extension EmailValidator on String { } bool isValidEmail() { - return RegExp(r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$').hasMatch(this); + return RegExp( + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$') + .hasMatch(this); } String toFormattedDate() { - String date = this.split("T")[0]; - String time = this.split("T")[1]; + String date = split("T")[0]; + String time = split("T")[1]; var dates = date.split("-"); return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}"; } @@ -308,3 +405,209 @@ extension EmailValidator on String { } } } + +extension DynamicTextStyleExtension on BuildContext { + TextStyle dynamicTextStyle( + {double? fontSize, + FontWeight? fontWeight, + Color? color, + double? letterSpacing, + double? wordSpacing, + double? height, + List? shadows, + Color? backgroundColor, + TextDecoration? decoration, + Color? decorationColor, + TextDecorationStyle? decorationStyle, + double? decorationThickness, + Locale? locale, + TextBaseline? textBaseline, + FontStyle? fontStyle, + bool isLanguageSwitcher = false}) { + AppState appState = getIt.get(); + final family = appState.getLanguageCode() == "ar" ? 'GESSTwo' : 'Poppins'; + return TextStyle( + fontFamily: family, + fontSize: fontSize, + fontWeight: fontWeight, + color: color, + letterSpacing: letterSpacing, + wordSpacing: wordSpacing, + height: height, + shadows: shadows, + backgroundColor: backgroundColor, + decoration: decoration, + decorationColor: decorationColor, + decorationStyle: decorationStyle, + decorationThickness: decorationThickness, + locale: locale ?? Localizations.localeOf(this), + textBaseline: textBaseline, + fontStyle: fontStyle, + ); + } +} + +class FontUtils { + /// Get the appropriate font family based on the current language + static bool getFontFamily(BuildContext context) { + // final projectViewModel = Provider.of(context, listen: false); + return true; + } + + /// Get the appropriate font family for a specific language + static String getFontFamilyForLanguage(bool isArabic) { + return isArabic ? 'GESSTwo' : 'Poppins'; + } +} + +extension CountryExtension on CountryEnum { + String get displayName { + switch (this) { + case CountryEnum.saudiArabia: + return "Kingdom Of Saudi Arabia"; + case CountryEnum.unitedArabEmirates: + return "United Arab Emirates"; + } + } + + String get nameArabic { + switch (this) { + case CountryEnum.saudiArabia: + return "المملكة العربية السعودية"; + case CountryEnum.unitedArabEmirates: + return "الإمارات العربية المتحدة"; + } + } + + String get iconPath { + switch (this) { + case CountryEnum.saudiArabia: + return AppAssets.ksa; + case CountryEnum.unitedArabEmirates: + return AppAssets.uae; + } + } + + String get countryCode { + switch (this) { + case CountryEnum.saudiArabia: + return "966"; + case CountryEnum.unitedArabEmirates: + return "971"; + } + } + + static CountryEnum fromDisplayName(String name) { + switch (name) { + case "Kingdom Of Saudi Arabia": + case "المملكة العربية السعودية": + return CountryEnum.saudiArabia; + case "United Arab Emirates": + case "الإمارات العربية المتحدة": + return CountryEnum.unitedArabEmirates; + default: + throw Exception("Invalid country name"); + } + } +} + +extension GenderTypeExtension on GenderTypeEnum { + String get value => this == GenderTypeEnum.male ? "M" : "F"; + + String get type => this == GenderTypeEnum.male ? "Male" : "Female"; + + String get typeAr => this == GenderTypeEnum.male ? "ذكر" : "أنثى"; + + static GenderTypeEnum? fromValue(String? value) { + switch (value) { + case "M": + return GenderTypeEnum.male; + case "F": + return GenderTypeEnum.female; + default: + return null; + } + } + + static GenderTypeEnum? fromType(String? type) { + switch (type) { + case "Male": + return GenderTypeEnum.male; + case "Female": + return GenderTypeEnum.female; + default: + return null; + } + } +} + +extension MaritalStatusTypeExtension on MaritalStatusTypeEnum { + String get value { + switch (this) { + case MaritalStatusTypeEnum.single: + return "U"; + case MaritalStatusTypeEnum.married: + return "M"; + case MaritalStatusTypeEnum.divorced: + return "D"; + case MaritalStatusTypeEnum.widowed: + return "W"; + } + } + + String get type { + switch (this) { + case MaritalStatusTypeEnum.single: + return "Single"; + case MaritalStatusTypeEnum.married: + return "Married"; + case MaritalStatusTypeEnum.divorced: + return "Divorced"; + case MaritalStatusTypeEnum.widowed: + return "Widowed"; + } + } + + String get typeAr { + switch (this) { + case MaritalStatusTypeEnum.single: + return "أعزب"; + case MaritalStatusTypeEnum.married: + return "متزوج"; + case MaritalStatusTypeEnum.divorced: + return "مطلق"; + case MaritalStatusTypeEnum.widowed: + return "أرمل"; + } + } + + static MaritalStatusTypeEnum? fromValue(String? value) { + switch (value) { + case "U": + return MaritalStatusTypeEnum.single; + case "M": + return MaritalStatusTypeEnum.married; + case "D": + return MaritalStatusTypeEnum.divorced; + case "W": + return MaritalStatusTypeEnum.widowed; + default: + return null; + } + } + + static MaritalStatusTypeEnum? fromType(String? type) { + switch (type) { + case "Single": + return MaritalStatusTypeEnum.single; + case "Married": + return MaritalStatusTypeEnum.married; + case "Divorced": + return MaritalStatusTypeEnum.divorced; + case "Widowed": + return MaritalStatusTypeEnum.widowed; + default: + return null; + } + } +} diff --git a/lib/extensions/util_extensions.dart b/lib/extensions/util_extensions.dart index 49efca5..4ca5060 100644 --- a/lib/extensions/util_extensions.dart +++ b/lib/extensions/util_extensions.dart @@ -31,3 +31,5 @@ // } // } // } + + diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 3899671..424aa88 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -1,3 +1,4 @@ +import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -5,6 +6,7 @@ import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:shimmer/shimmer.dart'; import 'package:sizer/sizer.dart'; +import 'package:smooth_corner/smooth_corner.dart'; extension WidgetExtensions on Widget { Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this); @@ -20,7 +22,7 @@ extension WidgetExtensions on Widget { Widget paddingSymmetrical(double horizontal, double vertical) => Padding(padding: EdgeInsets.symmetric(horizontal: horizontal, vertical: vertical), child: this); Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) => - Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this); + Padding(padding: EdgeInsetsDirectional.only(start: left, end: right, top: top, bottom: bottom), child: this); Widget toExpanded({int flex = 1}) => Expanded(flex: flex, child: this); @@ -37,6 +39,22 @@ extension WidgetExtensions on Widget { child: this, ); + Widget toShimmer2({bool isShow = true, double radius = 20, double? width, double? height}) => isShow + ? Shimmer.fromColors( + baseColor: const Color(0xffe8eff0), + highlightColor: Colors.white, + child: ClipRRect( + borderRadius: BorderRadius.circular(radius), + child: Container( + width: width, + height: height, + color: Colors.white, + child: this, + ), + ), + ) + : this; + Widget animatedSwither() => AnimatedSwitcher( duration: const Duration(milliseconds: 500), // transitionBuilder: (Widget child, Animation animation) { @@ -76,7 +94,14 @@ extension WidgetExtensions on Widget { } Widget objectContainerBorderView( - {String title = "", String note = "", bool disablePadding = false, double radius = 20, Color? color, Color borderColor = buttonColor, bool disableWidth = false, bool isAlignment = false}) { + {String title = "", + String note = "", + bool disablePadding = false, + double radius = 20, + Color? color, + Color borderColor = AppColors.buttonColor, + bool disableWidth = false, + bool isAlignment = false}) { return Container( padding: disablePadding ? EdgeInsets.zero : const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14), decoration: BoxDecoration( @@ -102,6 +127,51 @@ extension WidgetExtensions on Widget { ), ); } + + Widget withHorizontalPadding([double padding = 16.0]) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: padding), + child: this, + ); + } + + Widget withVerticalPadding([double padding = 16.0]) { + return Padding( + padding: EdgeInsets.symmetric(vertical: padding), + child: this, + ); + } +} + +extension SmoothContainerExtension on ShapeBorder { + ShapeDecoration toSmoothCornerDecoration({ + Color color = Colors.transparent, + double? borderRadius, + bool isDisabled = false, + Color? backgroundColor, + BorderSide? side, + BorderRadius? customBorder, + bool hasShadow = false, + }) { + final bgColor = backgroundColor ?? color; + return ShapeDecoration( + color: isDisabled ? bgColor.withOpacity(0.5) : bgColor, + shape: SmoothRectangleBorder( + borderRadius: customBorder ?? BorderRadius.circular(borderRadius ?? 0), + smoothness: 1, + side: side ?? BorderSide.none, + ), + shadows: hasShadow + ? [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 32, + offset: const Offset(0, 0), + ) + ] + : [], + ); + } } //Height Spacers in percentages @@ -149,3 +219,43 @@ Widget widthSpacer3per() => SizedBox(height: 3.w); Widget widthSpacer4per() => SizedBox(height: 4.w); Widget widthSpacer5per() => SizedBox(height: 5.w); + +extension ChipTypeEnumExtension on ChipTypeEnum { + Color get color { + switch (this) { + case ChipTypeEnum.success: + return AppColors.successColor; // Replace with your actual color + case ChipTypeEnum.error: + return AppColors.errorColor; // Replace with your actual color + case ChipTypeEnum.alert: + return AppColors.alertColor; // Replace with your actual color + case ChipTypeEnum.info: + return AppColors.infoColor; // Replace with your actual color + case ChipTypeEnum.warning: + return AppColors.warningColor; // Replace with your actual color + case ChipTypeEnum.lightBg: + return AppColors.chipPrimaryRedBorderColor; // Replace with your actual color + case ChipTypeEnum.primaryRed: + return AppColors.chipSecondaryLightRedColor; // Replace with your actual color + } + } + + Color get backgroundColor { + switch (this) { + case ChipTypeEnum.success: + return AppColors.successLightColor; // Replace with your actual color + case ChipTypeEnum.error: + return AppColors.errorLightColor; // Replace with your actual color + case ChipTypeEnum.alert: + return AppColors.alertLightColor; // Replace with your actual color + case ChipTypeEnum.info: + return AppColors.infoLightColor; // Replace with your actual color + case ChipTypeEnum.warning: + return AppColors.warningLightColor; // Replace with your actual color + case ChipTypeEnum.lightBg: + return AppColors.chipSecondaryLightRedColor; // Replace with your actual color + case ChipTypeEnum.primaryRed: + return AppColors.chipPrimaryRedBorderColor; + } + } +} diff --git a/lib/features/authentication/authentication_repo.dart b/lib/features/authentication/authentication_repo.dart new file mode 100644 index 0000000..d566996 --- /dev/null +++ b/lib/features/authentication/authentication_repo.dart @@ -0,0 +1,651 @@ +import 'dart:async'; + +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/PrivilegeModel.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/request_models/check_activation_code_register_request_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/select_device_by_imei.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class AuthenticationRepo { + Future>> getServicePrivilege(); + + Future>> selectDeviceByImei({required String firebaseToken}); + + Future>> checkPatientAuthentication({required dynamic checkPatientAuthenticationReq}); + + Future>> sendActivationCodeRepo({required dynamic sendActivationCodeReq, String? languageID, bool isRegister = false, bool isFormFamilyFile = false}); + + Future>> checkActivationCodeRepo( + {required dynamic newRequest, + required String? activationCode, + required bool isRegister, + bool isFormFamilyFile = false, + int? patientShareRequestID, + int? responseID, + bool isSwitchUser = false, + int? patientID, + int? loginType}); + + Future>> checkIfUserAgreed({required dynamic commonAuthanticatedRequest}); + + Future>> getUserAgreementContent({required dynamic commonAuthanticatedRequest}); + + Future>> checkPatientForRegistration({required dynamic commonAuthanticatedRequest}); + + Future>> checkUserStatus({required dynamic commonAuthanticatedRequest}); + + Future>> registerUser({required dynamic registrationPayloadDataModelRequest}); + + Future>> insertPatientIMEIData({required dynamic patientIMEIDataRequest}); + + Future>> insertPatientDeviceData({required dynamic patientDeviceDataRequest}); + + Future>> getPatientDeviceData({required dynamic patientDeviceDataRequest}); +} + +class AuthenticationRepoImp implements AuthenticationRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + AuthenticationRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>> selectDeviceByImei({required String firebaseToken}) async { + Map mapDevice = {"IMEI": firebaseToken}; + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.selectDeviceImei, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['Patient_SELECTDeviceIMEIbyIMEIList']; + if (list == null || list.isEmpty) { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: null, + ); + return; + } + + final model = SelectDeviceByImeiRespModelElement.fromJson(list[0] as Map); + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: model, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> checkPatientAuthentication({ + required dynamic checkPatientAuthenticationReq, + String? languageID, + }) async { + int isOutKsa = (checkPatientAuthenticationReq.zipCode == '966' || checkPatientAuthenticationReq.zipCode == '+966') ? 0 : 1; + checkPatientAuthenticationReq.patientOutSA = isOutKsa; + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.checkPatientAuth, + body: checkPatientAuthenticationReq.toJson(), + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> sendActivationCodeRepo({ + required dynamic sendActivationCodeReq, + String? languageID, + bool isRegister = false, + bool isFormFamilyFile = false, + }) async { + int isOutKsa = (sendActivationCodeReq.zipCode == '966' || sendActivationCodeReq.zipCode == '+966') ? 0 : 1; + sendActivationCodeReq.patientOutSA = isOutKsa; + sendActivationCodeReq.isDentalAllowedBackend = false; + final payload = sendActivationCodeReq.toJson(); + if (isFormFamilyFile) { + + payload.remove("MobileNo"); + payload.remove("NationalID"); + payload.remove("SMSSignature"); + // payload.remove("ResponseID"); + } + + try { + GenericApiModel? apiResponse; + Failure? failure; + + await apiClient.post( + isFormFamilyFile + ? ApiConsts.sendFamilyFileActivation + : isRegister + ? ApiConsts.sendActivationCodeRegister + : ApiConsts.sendActivationCode, + body: isFormFamilyFile ? payload : sendActivationCodeReq.toJson(), + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> checkActivationCodeRepo( + {required dynamic newRequest, // could be CheckActivationCodeReq or CheckActivationCodeRegisterReq + required String? activationCode, + required bool isRegister, + bool isFormFamilyFile = false, + int? patientShareRequestID, + int? responseID, + bool isSwitchUser = false, + int? patientID, + int? loginType}) async { + AppState appState = getIt.get(); + // if (isRegister) { + // newRequest["activationCode"] = activationCode ?? "0000"; + // newRequest["isSilentLogin"] = activationCode != null ? false : true; + // } else { + // newRequest.activationCode = activationCode ?? "0000"; + // newRequest.isSilentLogin = activationCode != null ? false : true; + // newRequest.projectOutSA = newRequest.zipCode == '966' ? false : true; + // newRequest.isDentalAllowedBackend = false; + // newRequest.forRegisteration = newRequest.isRegister ?? false; + // newRequest.isRegister = false; + // } + // Map familyRequest = {}; + // if (isFormFamilyFile) { + // AppState appState = getIt.get(); + // familyRequest = {}; + // familyRequest['PatientShareRequestID'] = patientShareRequestID; + // familyRequest['ResponseID'] = responseID; + // familyRequest['Status'] = 3; + // familyRequest["PatientID"] = appState.getAuthenticatedUser()!.patientId ?? 0; + // familyRequest["LogInTokenID"] = appState.getFamilyFileTokenID; + // familyRequest["activationCode"] = activationCode ?? "0000"; + // familyRequest["PatientMobileNumber"] = newRequest.patientMobileNumber; + // familyRequest["PatientIdentificationID"] = newRequest.patientIdentificationID; + // } + // Map switchRequest = {}; + // if (isSwitchUser) { + // switchRequest = newRequest.toJson(); + // + // switchRequest['PatientID'] = responseID; + // switchRequest['IsSilentLogin'] = true; + // switchRequest['LogInTokenID'] = null; + // switchRequest['SearchType'] = 2; + // if (loginType != 0) { + // switchRequest['SuperUser'] = patientID; + // switchRequest['DeviceToken'] = null; + // } else { + // switchRequest["LoginType"] = 2; + // } + // + // if (appState.getSuperUserID == responseID) { + // // switchRequest['LoginType'] = 3; + // switchRequest['PatientIdentificationID'] = ""; + // // switchRequest['ProjectOutSA'] = newRequest.zipCode == '966' ? false : true; + // switchRequest.remove('NationalID'); + // switchRequest.remove('isDentalAllowedBackend'); + // switchRequest.remove('ProjectOutSA'); + // switchRequest.remove('ForRegisteration'); + // appState.setSuperUserID = null; + // } + // } + + if (isRegister) { + newRequest["activationCode"] = activationCode ?? "0000"; + newRequest["isSilentLogin"] = activationCode == null; + } else { + newRequest.activationCode = activationCode ?? "0000"; + newRequest.isSilentLogin = activationCode == null; + newRequest.projectOutSA = newRequest.zipCode != '966'; + newRequest.isDentalAllowedBackend = false; + newRequest.forRegisteration = newRequest.isRegister ?? false; + newRequest.isRegister = false; + } + + Map familyRequest = {}; + if (isFormFamilyFile) { + familyRequest = { + 'PatientShareRequestID': patientShareRequestID, + 'ResponseID': responseID, + 'Status': 3, + // 'PatientID': appState.getAuthenticatedUser()?.patientId ?? 0, + 'LogInTokenID': appState.getFamilyFileTokenID, + 'activationCode': activationCode ?? "0000", + 'PatientMobileNumber': newRequest.patientMobileNumber, + 'PatientIdentificationID': newRequest.patientIdentificationID, + }; + } + + Map switchRequest = {}; + if (isSwitchUser) { + switchRequest = newRequest.toJson(); + switchRequest.addAll({ + 'PatientID': responseID, + 'IsSilentLogin': true, + 'LogInTokenID': null, + 'SearchType': 2, + }); + + if (loginType != 0) { + switchRequest['SuperUser'] = patientID; + switchRequest['DeviceToken'] = null; + } else { + switchRequest['LoginType'] = 2; + } + + if (appState.getSuperUserID == responseID) { + switchRequest['PatientIdentificationID'] = ""; + switchRequest.removeWhere((key, value) => ['NationalID', 'isDentalAllowedBackend', 'ProjectOutSA', 'ForRegisteration'].contains(key)); + } + } + + final endpoint = isFormFamilyFile + ? ApiConsts.checkActivationCodeForFamily + : isRegister + ? ApiConsts.checkActivationCodeRegister + : ApiConsts.checkActivationCode; + + try { + GenericApiModel? apiResponse; + Failure? failure; + + await apiClient.post( + endpoint, + body: isFormFamilyFile + ? familyRequest + : isRegister + ? newRequest + : isSwitchUser + ? switchRequest + : newRequest.toJson(), + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> checkIfUserAgreed({required dynamic commonAuthanticatedRequest}) async { + commonAuthanticatedRequest['Region'] = 1; + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.checkUsageAgreement, + body: commonAuthanticatedRequest, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getUserAgreementContent({required dynamic commonAuthanticatedRequest}) async { + commonAuthanticatedRequest['Region'] = 1; + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.getUserAgreementContent, + body: commonAuthanticatedRequest, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> checkPatientForRegistration({required dynamic commonAuthanticatedRequest}) async { + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.checkPatientForRegistration, + body: commonAuthanticatedRequest, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> checkUserStatus({required dynamic commonAuthanticatedRequest}) async { + commonAuthanticatedRequest['Region'] = 1; + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.checkUserStatus, + body: commonAuthanticatedRequest, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> registerUser({required dynamic registrationPayloadDataModelRequest}) async { + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.registerUser, + body: registrationPayloadDataModelRequest, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> insertPatientIMEIData({required patientIMEIDataRequest}) { + try { + GenericApiModel? apiResponse; + Failure? failure; + return apiClient.post( + ApiConsts.insertPatientDeviceIMEIData, + body: patientIMEIDataRequest, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ).then((_) { + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + }); + } catch (e) { + return Future.value(Left(UnknownFailure(e.toString()))); + } + } + + @override + Future> insertPatientDeviceData({required patientDeviceDataRequest}) { + try { + GenericApiModel? apiResponse; + Failure? failure; + return apiClient.post( + ApiConsts.insertPatientMobileData, + body: patientDeviceDataRequest, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ).then((_) { + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + }); + } catch (e) { + return Future.value(Left(UnknownFailure(e.toString()))); + } + } + + @override + Future>> getServicePrivilege() { + Map mapDevice = {}; + try { + GenericApiModel? apiResponse; + Failure? failure; + return apiClient.post( + ApiConsts.getPrivileges, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ).then((_) { + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + }); + } catch (e) { + return Future.value(Left(UnknownFailure(e.toString()))); + } + } + + @override + Future> getPatientDeviceData({required patientDeviceDataRequest}) { + try { + GenericApiModel? apiResponse; + Failure? failure; + return apiClient.post( + ApiConsts.getPatientMobileData, + body: patientDeviceDataRequest, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ).then((_) { + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + }); + } catch (e) { + return Future.value(Left(UnknownFailure(e.toString()))); + } + } +} diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart new file mode 100644 index 0000000..bcdacac --- /dev/null +++ b/lib/features/authentication/authentication_view_model.dart @@ -0,0 +1,1072 @@ +import 'dart:convert'; +import 'dart:developer'; +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart' show rootBundle; +import 'package:get_it/get_it.dart'; +import 'package:hijri_gregorian_calendar/hijri_gregorian_calendar.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/nationality_country_model.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/HMCProjectListModel.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/ProjectDetailListModel.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/VidaPlusProjectListModel.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/loading_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/request_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_repo.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/request_models/check_activation_code_register_request_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/request_models/registration_payload_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/check_activation_code_resp_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/check_user_staus_nhic_response_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/select_device_by_imei.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_repo.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/login.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/saved_login_screen.dart'; +import 'package:hmg_patient_app_new/routes/app_routes.dart'; +import 'package:hmg_patient_app_new/services/cache_service.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/services/localauth_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:sms_otp_auto_verify/sms_otp_auto_verify.dart'; + +import 'models/request_models/get_user_mobile_device_data.dart'; +import 'models/request_models/insert_patient_mobile_deviceinfo.dart'; +import 'models/request_models/patient_insert_device_imei_request.dart'; + +class AuthenticationViewModel extends ChangeNotifier { + final AuthenticationRepo _authenticationRepo; + final AppState _appState; + final ErrorHandlerService _errorHandlerService; + final DialogService _dialogService; + final NavigationService _navigationService; + final LocalAuthService _localAuthService; + + AuthenticationViewModel({ + required AppState appState, + required AuthenticationRepo authenticationRepo, + required ErrorHandlerService errorHandlerService, + required DialogService dialogService, + required NavigationService navigationService, + required CacheService cacheService, + required LocalAuthService localAuthService, + }) : _navigationService = navigationService, + _dialogService = dialogService, + _errorHandlerService = errorHandlerService, + _appState = appState, + _authenticationRepo = authenticationRepo, + _localAuthService = localAuthService; + final TextEditingController nationalIdController = TextEditingController(), + phoneNumberController = TextEditingController(), + dobController = TextEditingController(), + nameController = TextEditingController(), + emailController = TextEditingController(); + CountryEnum selectedCountrySignup = CountryEnum.saudiArabia; + MaritalStatusTypeEnum? maritalStatus; + GenderTypeEnum? genderType; + bool isTermsAccepted = false; + List? countriesList; + String? dob = ""; + final CacheService cacheService = GetIt.instance(); + + NationalityCountries? pickedCountryByUAEUser; + CalenderEnum calenderType = CalenderEnum.gregorian; + LoginTypeEnum loginTypeEnum = LoginTypeEnum.sms; + + final ValueNotifier otpScreenNotifier = ValueNotifier(false); + int patientShareRequestID = 0; + + //================== + + String errorMsg = ''; + final FocusNode myFocusNode = FocusNode(); + var healthId; + int getDeviceLastLogin = 1; + + Future onLoginPressed() async { + try { + LoaderBottomSheet.showLoader(); + //TODO: We will remove this delay + // await Future.delayed(Duration(seconds: 3)); + var data = _appState.getSelectDeviceByImeiRespModelElement; + log("Cached IMEI data: ${data?.toJson()}"); + if (data != null) { + await _handleExistingImeiData(data); + } else { + await _handleNewImeiRegistration(); + } + } catch (e) { + log("Error in onLoginPressed: $e"); + LoaderBottomSheet.hideLoader(); + _dialogService.showErrorBottomSheet(message: "An unexpected error occurred. Please try again.", onOkPressed: () {}); + } + } + + Future clearDefaultInputValues() async { + nationalIdController.clear(); + phoneNumberController.clear(); + emailController.clear(); + dobController.clear(); + maritalStatus = null; + genderType = null; + isTermsAccepted = false; + selectedCountrySignup = CountryEnum.saudiArabia; + pickedCountryByUAEUser = null; + _appState.setUserRegistrationPayload = RegistrationDataModelPayload(); + _appState.setNHICUserData = CheckUserStatusResponseNHIC(); + } + + void onCountryChange(CountryEnum country) { + selectedCountrySignup = country; + notifyListeners(); + } + + void onCalenderTypeChange(bool isGregorian) { + calenderType = isGregorian ? CalenderEnum.gregorian : CalenderEnum.hijri; + notifyListeners(); + } + + void onDobChange(String? date) { + if (calenderType == CalenderEnum.hijri) { + var hijriDate = HijriGregConverter.gregorianToHijri(DateTime.parse(date!)); + DateTime hijriDateTimeForController = DateTime(hijriDate.year, hijriDate.month, hijriDate.day); + dob = Utils.formatDateForApi(date); + dobController.text = Utils.formatHijriDateToDisplay(hijriDateTimeForController.toIso8601String()); // Or directly hijriDate.toString() if that's what your formatter expects + } else { + dobController.text = Utils.formatDateToDisplay(date!); + dob = Utils.formatDateForApi(date); + } + notifyListeners(); + } + + Future loadCountriesData() async { + final String response = await rootBundle.loadString('assets/json/countriesList.json'); + final List data = json.decode(response); + countriesList = data.map((e) => NationalityCountries.fromJson(e)).toList(); + } + + void onMaritalStatusChange(String? status) { + maritalStatus = MaritalStatusTypeExtension.fromType(status)!; + notifyListeners(); + } + + void onGenderChange(String? status) { + genderType = GenderTypeExtension.fromType(status)!; + notifyListeners(); + } + + void clearEmailInput() { + emailController.text = ""; + } + + void onUAEUserCountrySelection(String? value) { + pickedCountryByUAEUser = countriesList!.firstWhere((element) => element.name == value); + notifyListeners(); + } + + void onPhoneNumberChange(String? phoneNumber) { + phoneNumberController.text = phoneNumber!; + } + + void onTermAccepted() { + isTermsAccepted = !isTermsAccepted; + notifyListeners(); + } + + bool isUserFromUAE() { + bool isFromUAE = false; + if (_appState.getUserRegistrationPayload.patientOutSa != 0) { + isFromUAE = true; + } + return isFromUAE; + } + + void savePushTokenToAppState() async { + _appState.deviceToken = await Utils.getStringFromPrefs(CacheConst.pushToken); + } + + Future selectDeviceImei({required Function(dynamic data) onSuccess, Function(String)? onError}) async { + // LoadingUtils.showFullScreenLoading(); + // String firebaseToken = _appState.deviceToken; + String firebaseToken = await Utils.getStringFromPrefs(CacheConst.pushToken); + // String firebaseToken = "fY1fq_cITMmUCztA3UKKL9:APA91bEb2ZcdCPQPq3QsA0NW6a6btFvN-JjB1Pn3ZCoCzBMmVUhhh1ZQMtRn9tYPQ5G-jHDLiEpVAlBuRCVMkLDxa-zijsqbIui-4A-ynwclDWGFT4bUHTc"; + // == "" + // ? "dOGRRszQQMGe_9wA5Hx3kO:APA91bFV5IcIJXvcCXXk0tc2ddtZgWwCPq7sGSuPr-YW7iiJpQZKgFGN9GAzCVOWL8MfheaP1slE8MdxB7lczdPBGdONQ7WbMmhgHcsUCUktq-hsapGXXqc" + // : _appState.deviceToken; + final result = await _authenticationRepo.selectDeviceByImei(firebaseToken: firebaseToken); + + result.fold( + (failure) async { + // LoadingUtils.hideFullScreenLoader(); + // await _errorHandlerService.handleError(failure: failure); + LoaderBottomSheet.hideLoader(); + _navigationService.pushPage(page: LoginScreen()); + }, + (apiResponse) { + // LoadingUtils.hideFullScreenLoader(); + log("apiResponse: ${apiResponse.data.toString()}"); + log("messageStatus: ${apiResponse.messageStatus.toString()}"); + if (apiResponse.messageStatus == 1) { + onSuccess(apiResponse.data); + } else if (apiResponse.messageStatus == 2) { + _dialogService.showErrorBottomSheet(message: "Message Status = 2", onOkPressed: () {}); + } + }, + ); + } + + Future _handleExistingImeiData(dynamic data) async { + try { + SelectDeviceByImeiRespModelElement? savedData = _appState.getSelectDeviceByImeiRespModelElement; + LoaderBottomSheet.hideLoader(); + + if (savedData != null) { + // TODO: Navigate to SavedLogin when available + //_navigationService.pushPage(page: LoginScreen()); + _navigationService.pushPage(page: SavedLogin()); + } + } catch (e) { + log("Error handling existing IMEI data: $e"); + LoaderBottomSheet.hideLoader(); + _navigationService.pushPage(page: LoginScreen()); + } + } + + Future _handleNewImeiRegistration() async { + + await selectDeviceImei(onSuccess: (dynamic respData) async { + try { + if (respData != null) { + dynamic data = await SelectDeviceByImeiRespModelElement.fromJson(respData.toJson()); + _appState.setSelectDeviceByImeiRespModelElement(data); + LoaderBottomSheet.hideLoader(); + + // TODO: Navigate to SavedLogin when available + // SelectDeviceByImeiRespModelElement savedData = + // SelectDeviceByImeiRespModelElement.fromJson(respData); + _navigationService.pushPage(page: SavedLogin()); + // _navigationService.pushPage(page: LoginScreen()); + } else { + print("print login........"); + LoaderBottomSheet.hideLoader(); + _navigationService.pushPage(page: LoginScreen()); + } + } catch (e) { + log("Error processing IMEI registration response: $e"); + LoaderBottomSheet.hideLoader(); + _navigationService.pushPage(page: LoginScreen()); + } + }, onError: (String error) { + LoaderBottomSheet.hideLoader(); + _dialogService.showErrorBottomSheet(message: error, onOkPressed: () {}); + }); + } + + Future checkUserAuthentication({required OTPTypeEnum otpTypeEnum, Function(dynamic)? onSuccess, Function(String)? onError}) async { + // TODO: THIS SHOULD BE REMOVED LATER ON AND PASSED FROM APP STATE DIRECTLY INTO API CLIENT. BECAUSE THIS API ONLY NEEDS FEW PARAMS FROM USER + + loginTypeEnum = otpTypeEnum == OTPTypeEnum.sms ? LoginTypeEnum.sms : LoginTypeEnum.whatsapp; + + if (phoneNumberController.text.isEmpty) { + phoneNumberController.text = "504278212"; + } + bool isValidated = ValidationUtils.isValidatePhoneAndId(phoneNumber: phoneNumberController.text, nationalId: nationalIdController.text); + + if (!isValidated) { + return; + } + LoaderBottomSheet.showLoader(); + // LoadingUtils.showFullScreenLoader(); + + dynamic checkPatientAuthenticationReq = RequestUtils.getPatientAuthenticationRequest( + phoneNumber: phoneNumberController.text, + nationId: nationalIdController.text, + isForRegister: false, + patientOutSA: false, + otpTypeEnum: otpTypeEnum, + patientId: 0, + zipCode: _appState.getSelectDeviceByImeiRespModelElement != null && _appState.getSelectDeviceByImeiRespModelElement!.outSa == true + ? CountryEnum.unitedArabEmirates.countryCode + : selectedCountrySignup.countryCode, + calenderType: calenderType); + + final result = await _authenticationRepo.checkPatientAuthentication(checkPatientAuthenticationReq: checkPatientAuthenticationReq); + + result.fold( + (failure) async => await _errorHandlerService.handleError( + failure: failure, + onUnHandledFailure: (failure) async { + LoaderBottomSheet.hideLoader(); + await _dialogService.showCommonBottomSheetWithoutH( + message: failure.message, + label: LocaleKeys.notice.tr(), + onOkPressed: () { + _navigationService.pushAndReplace(AppRoutes.register); + }, + onCancelPressed: () { + _navigationService.pop(); + }); + }), + (apiResponse) async { + if (apiResponse.messageStatus == 2) { + LoaderBottomSheet.hideLoader(); + await _dialogService.showErrorBottomSheet(message: apiResponse.errorMessage ?? "ErrorEmpty", onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + if (apiResponse.data['isSMSSent']) { + _appState.setAppAuthToken = apiResponse.data['LogInTokenID']; + await sendActivationCode(otpTypeEnum: otpTypeEnum, phoneNumber: phoneNumberController.text, nationalIdOrFileNumber: nationalIdController.text, isForRegister: false); + } else { + if (apiResponse.data['IsAuthenticated']) { + await checkActivationCode( + otpTypeEnum: otpTypeEnum, + onWrongActivationCode: (String? message) async { + await _dialogService.showCommonBottomSheetWithoutH( + message: message ?? "", + label: LocaleKeys.notice.tr(), + onOkPressed: () { + _navigationService.pop(); + }); + }, + activationCode: null, //todo silent login case halded on the repo itself.. + ); + } + } + } + }, + ); + } + + Future sendActivationCode( + {required OTPTypeEnum otpTypeEnum, + required String nationalIdOrFileNumber, + required String phoneNumber, + required bool isForRegister, + dynamic payload, + bool isComingFromResendOTP = false, + bool isExcludedUser = false, + bool isFormFamilyFile = false, + bool isNeedLoading = false, + int? responseID}) async { + var request = RequestUtils.getCommonRequestSendActivationCode( + otpTypeEnum: otpTypeEnum, + mobileNumber: phoneNumber, + selectedLoginType: otpTypeEnum.toInt(), + zipCode: selectedCountrySignup.countryCode, + nationalId: int.parse(nationalIdOrFileNumber), + isFileNo: isForRegister ? isPatientHasFile(request: payload) : false, + patientId: isFormFamilyFile ? _appState.getAuthenticatedUser()!.patientId : 0, + isForRegister: isForRegister, + patientOutSA: isForRegister + ? isPatientOutsideSA(request: payload) + : selectedCountrySignup.countryCode == CountryEnum.saudiArabia.countryCode + ? false + : true, + payload: payload, + isExcludedUser: isExcludedUser, + isFormFamilyFile: isFormFamilyFile, + responseID: responseID); + + // TODO: GET APP SMS SIGNATURE HERE + request.sMSSignature = await getSignature(); + if (isNeedLoading) { + LoaderBottomSheet.showLoader(); + } + if (checkIsUserComingForRegister(request: payload)) { + _appState.setUserRegistrationPayload = RegistrationDataModelPayload.fromJson(payload); + } + + final resultEither = await _authenticationRepo.sendActivationCodeRepo( + sendActivationCodeReq: request, isRegister: checkIsUserComingForRegister(request: payload), languageID: 'er', isFormFamilyFile: isFormFamilyFile); + + resultEither.fold( + (failure) async => await _errorHandlerService.handleError(failure: failure), + (apiResponse) async { + if (isFormFamilyFile) { + if (apiResponse.data['PatientShareRequestID'] != null && apiResponse.data['PatientShareRequestID'] == 0 && apiResponse.messageStatus == 1) { + LoaderBottomSheet.hideLoader(); + _dialogService.showErrorBottomSheet( + message: apiResponse.data["ErrorMessage"], + onOkPressed: () { + _navigationService.pop(); + }); + return; + } + patientShareRequestID = apiResponse.data['PatientShareRequestID']; + print("PatientShareRequestID ==============: $patientShareRequestID"); + _appState.setFamilyFileTokenID = apiResponse.data['LogInTokenID']; + } + if (apiResponse.messageStatus == 2) { + LoaderBottomSheet.hideLoader(); + await _dialogService.showCommonBottomSheetWithoutH( + message: apiResponse.errorMessage ?? "Something Went Wrong", + onOkPressed: () { + _navigationService.pop(); + }); + } else { + if (apiResponse.data != null && apiResponse.data['isSMSSent'] == true) { + LoaderBottomSheet.hideLoader(); + if (!isComingFromResendOTP) { + navigateToOTPScreen( + otpTypeEnum: otpTypeEnum, + phoneNumber: phoneNumber, + isComingFromRegister: checkIsUserComingForRegister(request: payload), + payload: payload, + isFormFamilyFile: isFormFamilyFile, + isExcludedUser: isExcludedUser, + responseID: responseID, + patientShareRequestID: patientShareRequestID, + ); + } + } else { + // TODO: Handle isSMSSent false + // navigateToOTPScreen(otpTypeEnum: otpTypeEnum, phoneNumber: phoneNumber); + } + } + }, + ); + } + + bool checkIsUserComingForRegister({required dynamic request}) { + bool isUserComingForRegister = false; + if (request != null && request['isRegister'] == true) { + isUserComingForRegister = true; + } + return isUserComingForRegister; + } + + Future checkActivationCode({ + required String? activationCode, + required OTPTypeEnum otpTypeEnum, + required Function(String? message) onWrongActivationCode, + Function()? onResendActivation, + bool isFormFamilyFile = false, + dynamic patientShareRequestID, + dynamic responseID, + bool isSwitchUser = false, + int? patientID, + }) async { + bool isForRegister = (_appState.getUserRegistrationPayload.healthId != null || _appState.getUserRegistrationPayload.patientOutSa == true || _appState.getUserRegistrationPayload.patientOutSa == 1); + MyAppointmentsViewModel myAppointmentsVM = getIt(); + + final request = RequestUtils.getCommonRequestWelcome( + phoneNumber: phoneNumberController.text, + otpTypeEnum: otpTypeEnum, + deviceToken: _appState.deviceToken, + // patientOutSA: _appState.getUserRegistrationPayload.projectOutSa == 1 ? true : false, + patientOutSA: isForRegister + ? _appState.getUserRegistrationPayload.projectOutSa == true + ? true + : false + : _appState.getSelectDeviceByImeiRespModelElement != null + ? _appState.getSelectDeviceByImeiRespModelElement!.outSa! + : selectedCountrySignup == CountryEnum.saudiArabia + ? false + : true, + loginTokenID: _appState.appAuthToken, + registeredData: isForRegister ? _appState.getUserRegistrationPayload : null, + nationIdText: nationalIdController.text, + countryCode: _appState.getSelectDeviceByImeiRespModelElement != null && _appState.getSelectDeviceByImeiRespModelElement!.outSa == true + ? CountryEnum.unitedArabEmirates.countryCode + : selectedCountrySignup.countryCode, + //TODO: Error Here IN Zip Code. + loginType: loginTypeEnum.toInt) + .toJson(); + + LoaderBottomSheet.showLoader(); + if (isForRegister) { + if (_appState.getUserRegistrationPayload.patientOutSa == 0) request['DOB'] = _appState.getUserRegistrationPayload.dob; + request['HealthId'] = _appState.getUserRegistrationPayload.healthId; + request['IsHijri'] = _appState.getUserRegistrationPayload.isHijri; + request["PatientOutSA"] = _appState.getUserRegistrationPayload.projectOutSa == true ? 1 : 0; + request["ForRegisteration"] = _appState.getUserRegistrationPayload.isRegister; + request["isRegister"] = false; + + final resultEither = await _authenticationRepo.checkActivationCodeRepo(newRequest: request, activationCode: activationCode.toString(), isRegister: true); + + LoaderBottomSheet.hideLoader(); + + resultEither.fold( + (failure) async => await _errorHandlerService.handleError( + failure: failure, + onUnHandledFailure: (failure) async { + LoaderBottomSheet.hideLoader(); + await _dialogService.showCommonBottomSheetWithoutH( + message: failure.message, + label: LocaleKeys.notice.tr(), + onOkPressed: () { + _navigationService.pop(); + }); + }), (apiResponse) { + final activation = CheckActivationCode.fromJson(apiResponse.data as Map); + if (_appState.getUserRegistrationPayload.isRegister == true) { + //TODO: KSA Version Came Hre + loadCountriesData(); + _navigationService.pushAndReplace(AppRoutes.registerStepTwo); + // Navigator.popUntil(context, (route) => Utils.route(route, equalsTo: RegisterNew)); + return; + } + }); + } else { + final resultEither = await _authenticationRepo.checkActivationCodeRepo( + newRequest: CheckActivationCodeRegisterReq.fromJson(request), + activationCode: activationCode, + isRegister: false, + isFormFamilyFile: isFormFamilyFile, + patientShareRequestID: patientShareRequestID, + responseID: responseID, + isSwitchUser: isSwitchUser, + patientID: patientID, + loginType: _appState.getSuperUserID != null ? 0 : 2, + ); + + resultEither.fold( + (failure) async => await _errorHandlerService.handleError( + failure: failure, + onUnHandledFailure: (failure) async { + LoaderBottomSheet.hideLoader(); + otpScreenNotifier.value = true; + await _dialogService.showCommonBottomSheetWithoutH(message: failure.message, label: LocaleKeys.notice.tr(), onOkPressed: () {}); + }, + onMessageStatusFailure: (failure) async { + LoaderBottomSheet.hideLoader(); + await _dialogService.showCommonBottomSheetWithoutH(message: failure.message, label: LocaleKeys.notice.tr(), onOkPressed: () {}); + }), (apiResponse) async { + final activation = CheckActivationCode.fromJson(apiResponse.data as Map); + + if (activation.errorCode == '699') { + // Todo: Hide Loader + LoaderBottomSheet.hideLoader(); + onWrongActivationCode(activation.errorEndUserMessage); + return; + } else if (activation.messageStatus == 2) { + LoaderBottomSheet.hideLoader(); + onWrongActivationCode(activation.errorEndUserMessage); + return; + } else if (_appState.getUserRegistrationPayload.isRegister == true) { + LoaderBottomSheet.hideLoader(); + _navigationService.pushAndReplace(AppRoutes.registerStepTwo); + // Navigator.popUntil(context, (route) => Utils.route(route, equalsTo: RegisterNew)); + return; + } else { + if (isFormFamilyFile) { + // await navigateToFamilyFilePage(); + MedicalFileViewModel medicalVm = getIt(); + if (!_appState.getIsChildLoggedIn) { + await medicalVm.getFamilyFiles(status: 0); + await medicalVm.getAllPendingRecordsByResponseId(); + _navigationService.popUntilNamed(AppRoutes.landingScreen); + } + } else { + if (activation.list != null && activation.list!.isNotEmpty) { + if (isSwitchUser) { + if (_appState.getIsChildLoggedIn) { + _appState.setSuperUserID = null; + _appState.setIsChildLoggedIn = false; + activation.list!.first.isParentUser = true; + } else { + _appState.setSuperUserID = _appState.getAuthenticatedUser()?.patientId; + _appState.setIsChildLoggedIn = true; + activation.list!.first.isParentUser = false; + } + } else { + activation.list!.first.isParentUser = true; + } + activation.list!.first.bloodGroup = activation.patientBlodType; + _appState.setAuthenticatedUser(activation.list!.first); + _appState.setPrivilegeModelList(activation.list!.first.listPrivilege!); + } + // _appState.setUserBloodGroup = (activation.patientBlodType ?? ""); + _appState.setAppAuthToken = activation.authenticationTokenId; + myAppointmentsVM.getActiveAppointmentsCount(); + final request = RequestUtils.getAuthanticatedCommonRequest().toJson(); + bool isUserAgreedBefore = await checkIfUserAgreedBefore(request: request); + + //updating the last login type in app state to show the fingerprint/face id option on home screen + if (_appState.getSelectDeviceByImeiRespModelElement != null) { + _appState.getSelectDeviceByImeiRespModelElement!.logInType = loginTypeEnum.toInt; + } + +// + if (!isSwitchUser && !_appState.getIsChildLoggedIn) { + MedicalFileViewModel medicalVm = getIt(); + insertPatientIMEIData(loginTypeEnum.toInt); + medicalVm.getFamilyFiles(status: 0); //TODO: Remove status: 1 by Aamir Need to Discuss With Sultan + medicalVm.getAllPendingRecordsByResponseId(); + } + await clearDefaultInputValues(); + if (isUserAgreedBefore) { + LoaderBottomSheet.hideLoader(); + navigateToHomeScreen(); + } else { + myAppointmentsVM.setIsAppointmentDataToBeLoaded(true); + LoaderBottomSheet.hideLoader(); + navigateToHomeScreen(); + //Agreement page not designed yet so we are navigating to home screen directly + // getUserAgreementContent(request: request); + } + // TODO: setPreferences and stuff + // sharedPref.remove(FAMILY_FILE); + // activation.list!.isFamily = false; + // userData = activation.list; + // sharedPref.setString(BLOOD_TYPE, activation.patientBloodType ?? ""); + // authenticatedUserObject.user = activation.list!; + // projectViewModel.setPrivilege(privilegeList: res); + // await sharedPref.setObject(MAIN_USER, activation.list); + // await sharedPref.setObject(USER_PROFILE, activation.list); + // loginTokenID = activation.logInTokenID; + // await sharedPref.setObject(LOGIN_TOKEN_ID, activation.logInTokenID); + // await sharedPref.setString(TOKEN, activation.authenticationTokenID!); + + // projectViewModel.analytics.loginRegistration.login_successful(); + } + } + }); + } + } + + Future navigateToFamilyFilePage() async { + MedicalFileViewModel medicalFileVM = GetIt.instance(); + medicalFileVM.handleFamilyFileRequestOTPVerification(); + } + + Future checkIfUserAgreedBefore({required dynamic request}) async { + bool isAgreed = false; + if (havePrivilege(109)) { + final resultEither = await _authenticationRepo.checkIfUserAgreed(commonAuthanticatedRequest: request); + resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) { + if (apiResponse.data['IsPatientAlreadyAgreed']) { + return true; + } + }); + } + return isAgreed; + } + + Future getUserAgreementContent({required dynamic request}) async { + final resultEither = await _authenticationRepo.getUserAgreementContent(commonAuthanticatedRequest: request); + resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { + // _navigationService.pushAndReplace(routeName) + //TODO: Add User Agreement Page Here + }); + } + + bool havePrivilege(int id) { + bool isHavePrivilege = false; + try { + for (var element in _appState.getAuthenticatedUser()!.listPrivilege!) { + if (element.id == id) isHavePrivilege = element.previlege!; + } + } catch (e) { + print(e); + } + return isHavePrivilege; + } + + Future navigateToHomeScreen() async { + _navigationService.pushAndReplace(AppRoutes.landingScreen); + } + + Future navigateToOTPScreen( + {required OTPTypeEnum otpTypeEnum, + required String phoneNumber, + required bool isComingFromRegister, + dynamic payload, + bool isFormFamilyFile = false, + bool isExcludedUser = false, + int? responseID, + int? patientShareRequestID}) async { + _navigationService.pushToOtpScreen( + phoneNumber: phoneNumber, + isFormFamilyFile: isFormFamilyFile, + checkActivationCode: (int activationCode) async { + await checkActivationCode( + activationCode: activationCode.toString(), + isFormFamilyFile: isFormFamilyFile, + otpTypeEnum: otpTypeEnum, + responseID: responseID, + patientShareRequestID: patientShareRequestID, + onWrongActivationCode: (String? value) { + onWrongActivationCode(message: value); + }, + ); + }, + onResendOTPPressed: (String phoneNumber) async { + await sendActivationCode( + otpTypeEnum: otpTypeEnum, + phoneNumber: phoneNumberController.text, + nationalIdOrFileNumber: nationalIdController.text, + isForRegister: isComingFromRegister, + isComingFromResendOTP: true, + payload: payload, + isFormFamilyFile: isFormFamilyFile, + isExcludedUser: isExcludedUser, + responseID: responseID, + ); + }, + ); + } + + Future onWrongActivationCode({String? message}) async { + otpScreenNotifier.value = true; + await _dialogService.showErrorBottomSheet(message: message ?? "Something went wrong. ", onOkPressed: () {}); + } + + loginWithFingerPrintFace(Function success) async { + _localAuthService.authenticate().then((value) async { + if (value) { + LoaderBottomSheet.showLoader(); + success(); + loginTypeEnum = (_appState.deviceTypeID == 1 ? LoginTypeEnum.face : LoginTypeEnum.fingerprint); + if (!_appState.isAuthenticated) { + //commenting this api to check either the same flow working or not because this api does not needed further if work fine we will remove this + await getPatientDeviceData(loginTypeEnum.toInt); + } else { + // authenticated = true; + await insertPatientIMEIData(loginTypeEnum.toInt); + LoaderBottomSheet.hideLoader(); + } + notifyListeners(); + // navigateToHomeScreen(); + } else { + //authenticated = false; + notifyListeners(); + } + }); + } + + checkLastLoginStatus(Function() onSuccess) async { + Future.delayed(Duration(seconds: 1), () async { + if (cacheService.getBool(key: CacheConst.quickLoginEnabled) == null) { + if (_appState.getSelectDeviceByImeiRespModelElement != null && + (_appState.getSelectDeviceByImeiRespModelElement!.logInType == 1 || _appState.getSelectDeviceByImeiRespModelElement!.logInType == 4)) { + phoneNumberController.text = (_appState.getAuthenticatedUser()!.mobileNumber!.startsWith("0") + ? _appState.getAuthenticatedUser()!.mobileNumber!.replaceFirst("0", "") + : _appState.getAuthenticatedUser()!.mobileNumber)!; + nationalIdController.text = _appState.getAuthenticatedUser()!.nationalityId!; + onSuccess(); + } else if ((loginTypeEnum == LoginTypeEnum.sms || loginTypeEnum == LoginTypeEnum.whatsapp && _appState.getSelectDeviceByImeiRespModelElement == null) && + _appState.getAuthenticatedUser() != null) { + phoneNumberController.text = (_appState.getAuthenticatedUser()!.mobileNumber!.startsWith("0") + ? _appState.getAuthenticatedUser()!.mobileNumber!.replaceFirst("0", "") + : _appState.getAuthenticatedUser()!.mobileNumber)!; + nationalIdController.text = _appState.getAuthenticatedUser()!.nationalityId!; + onSuccess(); + } + } + }); + } + + Future onRegistrationStart({required OTPTypeEnum otpTypeEnum}) async { + bool isOutSidePatient = selectedCountrySignup.countryCode == CountryEnum.unitedArabEmirates.countryCode ? true : false; + LoaderBottomSheet.showLoader(); + final request = await RequestUtils.getPatientAuthenticationRequest( + phoneNumber: phoneNumberController.text, + nationId: nationalIdController.text, + patientOutSA: isOutSidePatient, + otpTypeEnum: otpTypeEnum, + isForRegister: true, + patientId: 0, + zipCode: selectedCountrySignup.countryCode, + calenderType: calenderType, + dob: dob) + .toJson(); + var nRequest = Map.from(request); + + if (true) { + request.removeWhere((key, value) => value == null); + nRequest.removeWhere((key, value) => value == null); + nRequest.removeWhere((key, value) => key == "SearchType"); + nRequest.removeWhere((key, value) => key == "PatientID"); + nRequest.removeWhere((key, value) => key == "OTP_SendType"); + nRequest.removeWhere((key, value) => key == "LanguageID"); + } + + final resultEither = await _authenticationRepo.checkPatientForRegistration(commonAuthanticatedRequest: nRequest); + resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { + checkUserStatusForRegistration(response: apiResponse.data, request: request); + }); + } + + Future onRegistrationComplete() async { + // LoaderBottomSheet.showLoader(); + LoadingUtils.showFullScreenLoader(loadingText: "Setting up your medical file.\nMay take a moment."); + + var request = RequestUtils.getUserSignupCompletionRequest(fullName: nameController.text, emailAddress: emailController.text, gender: genderType, maritalStatus: maritalStatus); + final resultEither = await _authenticationRepo.registerUser(registrationPayloadDataModelRequest: request); + resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { + if (apiResponse.data is String) { + //TODO: This Section Need to Be Testing. + LoadingUtils.hideFullScreenLoader(); + _dialogService.showExceptionBottomSheet(message: apiResponse.data, onOkPressed: () {}, onCancelPressed: () {}); + //TODO: Here We Need to Show a Dialog Of Something in the case of Fail With OK and Cancel and the Display Variable WIll be result. + } else { + LoadingUtils.hideFullScreenLoader(); + if (apiResponse.data["MessageStatus"] == 1) { + LoadingUtils.showFullScreenLoader(isSuccessDialog: true); + //TODO: Here We Need to Show a Dialog Of Something in the case of Success. + await clearDefaultInputValues(); // This will Clear All Default Values Of User. + Future.delayed(Duration(seconds: 1), () { + LoadingUtils.hideFullScreenLoader(); + _navigationService.pushAndReplace(AppRoutes.loginScreen); + }); + } + } + }); + + return; + } + + Future checkUserStatusForRegistration({required dynamic response, required dynamic request}) async { + if (response is Map) { + if (response["MessageStatus"] == 2) { + LoaderBottomSheet.hideLoader(); + print(response["ErrorEndUserMessage"]); + return; + } + if (response['hasFile'] == true) { + //TODO: Show Here Ok And Cancel Dialog and On OKPress it will go for sendActivationCode + LoaderBottomSheet.hideLoader(); + _dialogService.showCommonBottomSheetWithoutH( + message: response["ErrorMessage"], + onOkPressed: () async { + await clearDefaultInputValues(); + _navigationService.pushAndReplace(AppRoutes.loginScreen); + }, + onCancelPressed: () { + _navigationService.pop(); + }); + } else { + request['forRegister'] = true; + request['isRegister'] = true; + _appState.setAppAuthToken = response['LogInTokenID']; + if (isPatientOutsideSA(request: response)) { + print("=======OUT SA======="); + sendActivationCode( + otpTypeEnum: OTPTypeEnumExtension.fromInt(request["OTP_SendType"]), + nationalIdOrFileNumber: request["PatientIdentificationID"].toString(), + phoneNumber: request["PatientMobileNumber"].toString(), + payload: request, + isForRegister: true, + ); + } else { + print("=======IN SA======="); + chekUserNHICData(request: request); + } + } + } else { + //TODO: Here Hide Loader And Show TOAST + //TODO: if (response['ErrorCode'] == '-986') Toast With OK, And Show response as Output. + LoaderBottomSheet.hideLoader(); + _dialogService.showErrorBottomSheet(message: response['ErrorMessage']); + } + } + + bool isPatientOutsideSA({required dynamic request}) { + bool isOutSideSa = false; + if (request["PatientOutSA"] == true || request["PatientOutSA"] == 1) { + isOutSideSa = true; + } else { + isOutSideSa = false; + } + return isOutSideSa; + } + + bool isPatientHasFile({required dynamic request}) { + bool isFile = false; + if (request != null && request["NationalID"] != null) { + isFile = request["NationalID"].length < 10; + } + return isFile; + } + + Future chekUserNHICData({required dynamic request}) async { + final resultEither = await _authenticationRepo.checkUserStatus(commonAuthanticatedRequest: request); + resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { + if (apiResponse.data is Map) { + setNHICData(apiResponse.data, request); + sendActivationCode( + otpTypeEnum: OTPTypeEnumExtension.fromInt(request["OTP_SendType"]), + nationalIdOrFileNumber: request["PatientIdentificationID"].toString(), + phoneNumber: request["PatientMobileNumber"].toString(), + payload: request, + isForRegister: true, + ); + } + }); + } + + void setNHICData(dynamic data, dynamic request) { + _appState.setNHICUserData = CheckUserStatusResponseNHIC.fromJson(data as Map); + request["healthId"] = _appState.getNHICUserData.healthId; + _appState.setUserRegistrationPayload = RegistrationDataModelPayload.fromJson(request); + } + + Future insertPatientIMEIData(int loginType) async { + final resultEither = await _authenticationRepo.insertPatientIMEIData( + patientIMEIDataRequest: PatientInsertDeviceImei( + imei: _appState.deviceToken, + deviceTypeId: _appState.getDeviceTypeID(), + patientId: _appState.getAuthenticatedUser()!.patientId!, + patientIdentificationNo: _appState.getAuthenticatedUser()!.patientIdentificationNo!, + identificationNo: _appState.getAuthenticatedUser()!.patientIdentificationNo!, + firstName: _appState.getAuthenticatedUser()!.firstName!, + lastName: _appState.getAuthenticatedUser()!.lastName!, + patientTypeId: _appState.getAuthenticatedUser()!.patientType, + mobileNo: _appState.getAuthenticatedUser()!.mobileNumber!, + logInTypeId: loginType, + patientOutSa: _appState.getAuthenticatedUser()!.outSa!, + outSa: _appState.getAuthenticatedUser()!.outSa == 1 ? true : false, + biometricEnabled: loginType == 1 || loginType == 2 ? false : true, + firstNameN: _appState.getAuthenticatedUser()!.firstNameN, + lastNameN: _appState.getAuthenticatedUser()!.lastNameN, + ).toJson()); + resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { + if (apiResponse.messageStatus == 1) { + log("Insert IMEI Success"); + insertPatientDeviceData(loginType); + } else { + log("Insert IMEI Failed"); + } + }); + } + + Future insertPatientDeviceData(int loginType) async { + final resultEither = await _authenticationRepo.insertPatientDeviceData( + patientDeviceDataRequest: InsertPatientMobileDeviceInfo( + deviceToken: _appState.deviceToken, + deviceTypeId: _appState.getDeviceTypeID(), + patientId: _appState.getAuthenticatedUser()!.patientId!, + patientTypeId: _appState.getAuthenticatedUser()!.patientType, + patientOutSa: _appState.getAuthenticatedUser()!.outSa!, + loginType: loginType, + languageId: _appState.getLanguageID(), + latitude: _appState.userLat, + longitude: _appState.userLong, + voipToken: "", + deviceType: _appState.deviceTypeID, + patientMobileNumber: _appState.getAuthenticatedUser()!.mobileNumber, + nationalId: _appState.getAuthenticatedUser()!.patientIdentificationNo, + gender: _appState.getAuthenticatedUser()!.gender) + .toJson()); + resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { + if (apiResponse.messageStatus == 2) {} + if (apiResponse.messageStatus == 1) { + log("Insert Device Data Success"); + } else { + log("Insert IMEI Failed"); + } + }); + } + + Future getPatientDeviceData(int loginType) async { + final resultEither = await _authenticationRepo.getPatientDeviceData( + patientDeviceDataRequest: GetUserMobileDeviceData( + deviceToken: _appState.deviceToken, + deviceTypeId: _appState.getDeviceTypeID(), + patientId: _appState.getSelectDeviceByImeiRespModelElement!.patientId!, + patientType: _appState.getSelectDeviceByImeiRespModelElement!.patientType, + patientOutSa: _appState.getSelectDeviceByImeiRespModelElement!.outSa == true ? 1 : 0, + loginType: loginType, + languageId: _appState.getLanguageID(), + latitude: _appState.userLat, + longitude: _appState.userLong, + mobileNo: _appState.getSelectDeviceByImeiRespModelElement!.mobile!, + patientMobileNumber: int.parse(_appState.getSelectDeviceByImeiRespModelElement!.mobile!), + nationalId: _appState.getSelectDeviceByImeiRespModelElement!.identificationNo) + .toJson()); + resultEither.fold((failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { + if (apiResponse.messageStatus == 1) { + dynamic deviceInfo = apiResponse.data['List_MobileLoginInfo']; + getDeviceLastLogin = deviceInfo.first['LoginType']; + await checkActivationCode(otpTypeEnum: OTPTypeEnum.faceIDFingerprint, activationCode: null, onWrongActivationCode: (String? message) {}); + await insertPatientIMEIData(loginTypeEnum.toInt); + LoaderBottomSheet.hideLoader(); + } + if (apiResponse.messageStatus == 2) { + LoaderBottomSheet.hideLoader(); + await _dialogService.showCommonBottomSheetWithoutH( + message: apiResponse.errorMessage ?? "", + label: LocaleKeys.notice.tr(), + onOkPressed: () { + _dialogService.showPhoneNumberPickerSheet( + label: "Where would you like to receive OTP?", + message: "Please select from the below options to receive OTP.", + onSMSPress: () { + checkUserAuthentication(otpTypeEnum: OTPTypeEnum.sms); + }, + onWhatsappPress: () { + checkUserAuthentication(otpTypeEnum: OTPTypeEnum.whatsapp); + }); + }, + onCancelPressed: () { + _navigationService.pop(); + }); + } + }); + } + + @override + void dispose() { + nationalIdController.dispose(); + phoneNumberController.dispose(); + myFocusNode.dispose(); + super.dispose(); + } + + Future getServicePrivilege() async { + final resultEither = await _authenticationRepo.getServicePrivilege(); + List privilegeModelList = []; + List vidaPlusProjectListModel = []; + List hMCProjectListModel = []; + List projectDetailListModel = []; + + resultEither.fold( + (failure) async => await _errorHandlerService.handleError(failure: failure), + (apiResponse) async { + if (apiResponse.messageStatus == 2) { + await _dialogService.showErrorBottomSheet(message: apiResponse.errorMessage ?? "ErrorEmpty"); + } else { + apiResponse.data["ServicePrivilegeList"].forEach((v) { + privilegeModelList.add(ListPrivilege.fromJson(v)); + }); + _appState.setPrivilegeModelList(privilegeModelList.cast()); + + apiResponse.data["ProjectListVidaPlus"].forEach((v) { + vidaPlusProjectListModel.add(VidaPlusProjectListModel.fromJson(v)); + }); + _appState.setVidaPlusProjectList(vidaPlusProjectListModel); + + apiResponse.data["HMCProjectList"].forEach((v) { + hMCProjectListModel.add(HMCProjectListModel.fromJson(v)); + }); + _appState.setHMCProjectList(hMCProjectListModel); + + apiResponse.data["ProjectDetailList"].forEach((v) { + projectDetailListModel.add(ProjectDetailListModel.fromJson(v)); + }); + _appState.setProjectsDetailList(projectDetailListModel); + } + }, + ); + } + + Future getSignature() async { + if (Platform.isAndroid) { + return await SmsVerification.getAppSignature(); + } else { + return null; + } + } +} diff --git a/lib/features/authentication/models/request_models/check_activation_code_register_request_model.dart b/lib/features/authentication/models/request_models/check_activation_code_register_request_model.dart new file mode 100644 index 0000000..ebae7bc --- /dev/null +++ b/lib/features/authentication/models/request_models/check_activation_code_register_request_model.dart @@ -0,0 +1,121 @@ +class CheckActivationCodeRegisterReq { + int? patientMobileNumber; + String? mobileNo; + String? deviceToken; + bool? projectOutSA; + int? loginType; + String? zipCode; + bool? isRegister; + String? logInTokenID; + int? searchType; + int? patientID; + int? nationalID; + int? patientIdentificationID; + String? activationCode; + bool? isSilentLogin; + double? versionID; + int? channel; + int? languageID; + String? iPAdress; + String? generalid; + int? patientOutSA; + dynamic sessionID; + bool? isDentalAllowedBackend; + int? deviceTypeID; + bool? forRegisteration; + String? dob; + int? isHijri; + String? healthId; + + CheckActivationCodeRegisterReq({ + this.patientMobileNumber, + this.mobileNo, + this.deviceToken, + this.projectOutSA, + this.loginType, + this.zipCode, + this.isRegister, + this.logInTokenID, + this.searchType, + this.patientID, + this.nationalID, + this.patientIdentificationID, + this.activationCode, + this.isSilentLogin, + this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.forRegisteration, + this.dob, + this.isHijri, + this.healthId, + }); + + CheckActivationCodeRegisterReq.fromJson(Map json) { + patientMobileNumber = json['PatientMobileNumber']; + mobileNo = json['MobileNo']; + deviceToken = json['DeviceToken']; + projectOutSA = json['ProjectOutSA']; + loginType = json['LoginType']; + zipCode = json['ZipCode']; + isRegister = json['isRegister']; + logInTokenID = json['LogInTokenID']; + searchType = json['SearchType']; + patientID = json['PatientID']; + nationalID = json['NationalID']; + patientIdentificationID = json['PatientIdentificationID']; + activationCode = json['activationCode']; + isSilentLogin = json['IsSilentLogin']; + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + forRegisteration = json['ForRegisteration']; + dob = json['DOB']; + isHijri = json['IsHijri']; + healthId = json['HealthId']; + } + + Map toJson() { + final Map data = {}; + data['PatientMobileNumber'] = patientMobileNumber; + data['MobileNo'] = mobileNo; + data['DeviceToken'] = deviceToken; + data['ProjectOutSA'] = projectOutSA; + data['LoginType'] = loginType; + data['ZipCode'] = zipCode; + data['isRegister'] = isRegister; + data['LogInTokenID'] = logInTokenID; + data['SearchType'] = searchType; + data['PatientID'] = patientID; + data['NationalID'] = nationalID; + data['PatientIdentificationID'] = patientIdentificationID; + data['activationCode'] = activationCode; + data['IsSilentLogin'] = isSilentLogin; + data['VersionID'] = versionID; + data['Channel'] = channel; + data['LanguageID'] = languageID; + data['IPAdress'] = iPAdress; + data['generalid'] = generalid; + data['PatientOutSA'] = patientOutSA; + data['SessionID'] = sessionID; + data['isDentalAllowedBackend'] = isDentalAllowedBackend; + data['DeviceTypeID'] = deviceTypeID; + data['ForRegisteration'] = forRegisteration; + data['DOB'] = dob; + data['IsHijri'] = isHijri; + data['HealthId'] = healthId; + return data; + } +} diff --git a/lib/features/authentication/models/request_models/check_activation_code_request_register.dart b/lib/features/authentication/models/request_models/check_activation_code_request_register.dart new file mode 100644 index 0000000..167c8ec --- /dev/null +++ b/lib/features/authentication/models/request_models/check_activation_code_request_register.dart @@ -0,0 +1,121 @@ +// class CheckActivationCodeRegisterReq { +// int? patientMobileNumber; +// String? mobileNo; +// String? deviceToken; +// bool? projectOutSA; +// int? loginType; +// String? zipCode; +// bool? isRegister; +// String? logInTokenID; +// int? searchType; +// int? patientID; +// String? nationalID; +// String? patientIdentificationID; +// String? activationCode; +// bool? isSilentLogin; +// double? versionID; +// int? channel; +// int? languageID; +// String? iPAdress; +// String? generalid; +// int? patientOutSA; +// dynamic sessionID; +// bool? isDentalAllowedBackend; +// int? deviceTypeID; +// bool? forRegisteration; +// String? dob; +// int? isHijri; +// String? healthId; +// +// CheckActivationCodeRegisterReq({ +// this.patientMobileNumber, +// this.mobileNo, +// this.deviceToken, +// this.projectOutSA, +// this.loginType, +// this.zipCode, +// this.isRegister, +// this.logInTokenID, +// this.searchType, +// this.patientID, +// this.nationalID, +// this.patientIdentificationID, +// this.activationCode, +// this.isSilentLogin, +// this.versionID, +// this.channel, +// this.languageID, +// this.iPAdress, +// this.generalid, +// this.patientOutSA, +// this.sessionID, +// this.isDentalAllowedBackend, +// this.deviceTypeID, +// this.forRegisteration, +// this.dob, +// this.isHijri, +// this.healthId, +// }); +// +// CheckActivationCodeRegisterReq.fromJson(Map json) { +// patientMobileNumber = json['PatientMobileNumber']; +// mobileNo = json['MobileNo']; +// deviceToken = json['DeviceToken']; +// projectOutSA = json['ProjectOutSA']; +// loginType = json['LoginType']; +// zipCode = json['ZipCode']; +// isRegister = json['isRegister']; +// logInTokenID = json['LogInTokenID']; +// searchType = json['SearchType']; +// patientID = json['PatientID']; +// nationalID = json['NationalID']; +// patientIdentificationID = json['PatientIdentificationID']; +// activationCode = json['activationCode']; +// isSilentLogin = json['IsSilentLogin']; +// versionID = json['VersionID']; +// channel = json['Channel']; +// languageID = json['LanguageID']; +// iPAdress = json['IPAdress']; +// generalid = json['generalid']; +// patientOutSA = json['PatientOutSA']; +// sessionID = json['SessionID']; +// isDentalAllowedBackend = json['isDentalAllowedBackend']; +// deviceTypeID = json['DeviceTypeID']; +// forRegisteration = json['ForRegisteration']; +// dob = json['DOB']; +// isHijri = json['IsHijri']; +// healthId = json['HealthId']; +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['PatientMobileNumber'] = this.patientMobileNumber; +// data['MobileNo'] = this.mobileNo; +// data['DeviceToken'] = this.deviceToken; +// data['ProjectOutSA'] = this.projectOutSA; +// data['LoginType'] = this.loginType; +// data['ZipCode'] = this.zipCode; +// data['isRegister'] = this.isRegister; +// data['LogInTokenID'] = this.logInTokenID; +// data['SearchType'] = this.searchType; +// data['PatientID'] = this.patientID; +// data['NationalID'] = this.nationalID; +// data['PatientIdentificationID'] = this.patientIdentificationID; +// data['activationCode'] = this.activationCode; +// data['IsSilentLogin'] = this.isSilentLogin; +// data['VersionID'] = this.versionID; +// data['Channel'] = this.channel; +// data['LanguageID'] = this.languageID; +// data['IPAdress'] = this.iPAdress; +// data['generalid'] = this.generalid; +// data['PatientOutSA'] = this.patientOutSA; +// data['SessionID'] = this.sessionID; +// data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; +// data['DeviceTypeID'] = this.deviceTypeID; +// data['ForRegisteration'] = this.forRegisteration; +// data['DOB'] = dob; +// data['IsHijri'] = isHijri; +// data['HealthId'] = healthId; +// return data; +// } +// } diff --git a/lib/features/authentication/models/request_models/check_patient_authentication_request_model.dart b/lib/features/authentication/models/request_models/check_patient_authentication_request_model.dart new file mode 100644 index 0000000..483e416 --- /dev/null +++ b/lib/features/authentication/models/request_models/check_patient_authentication_request_model.dart @@ -0,0 +1,88 @@ +class CheckPatientAuthenticationReq { + int? patientMobileNumber; + String? zipCode; + bool? isRegister; + String? tokenID; + int? searchType; + String? patientIdentificationID; + int? patientID; + double? versionID; + int? channel; + int? languageID; + String? iPAdress; + String? generalid; + int? patientOutSA; + dynamic sessionID; + bool? isDentalAllowedBackend; + int? deviceTypeID; + String? dob; + int? isHijri; + String? healthId; + + CheckPatientAuthenticationReq( + {this.patientMobileNumber, + this.zipCode, + this.isRegister, + this.tokenID, + this.searchType, + this.patientIdentificationID, + this.patientID, + this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.dob, + this.isHijri, + this.healthId}); + + CheckPatientAuthenticationReq.fromJson(Map json) { + patientMobileNumber = json['PatientMobileNumber']; + zipCode = json['ZipCode']; + isRegister = json['isRegister']; + tokenID = json['TokenID']; + searchType = json['SearchType']; + patientIdentificationID = json['PatientIdentificationID']; + patientID = json['PatientID']; + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + dob = json['dob']; + isHijri = json['isHijri']; + healthId = json['HealthId']; + } + + Map toJson() { + final Map data = {}; + data['PatientMobileNumber'] = patientMobileNumber; + data['ZipCode'] = zipCode; + data['isRegister'] = isRegister; + data['TokenID'] = tokenID; + data['SearchType'] = searchType; + data['PatientIdentificationID'] = patientIdentificationID; + data['PatientID'] = patientID; + data['VersionID'] = versionID; + data['Channel'] = channel; + data['LanguageID'] = languageID; + data['IPAdress'] = iPAdress; + data['generalid'] = generalid; + data['PatientOutSA'] = patientOutSA; + data['SessionID'] = sessionID; + data['isDentalAllowedBackend'] = isDentalAllowedBackend; + data['DeviceTypeID'] = deviceTypeID; + data['dob'] = dob; + data['isHijri'] = isHijri; + data['HealthId'] = healthId; + return data; + } +} diff --git a/lib/features/authentication/models/request_models/get_user_mobile_device_data.dart b/lib/features/authentication/models/request_models/get_user_mobile_device_data.dart new file mode 100644 index 0000000..270f3ac --- /dev/null +++ b/lib/features/authentication/models/request_models/get_user_mobile_device_data.dart @@ -0,0 +1,113 @@ +import 'dart:convert'; + +class GetUserMobileDeviceData { + int? patientMobileNumber; + String? mobileNo; + String? deviceToken; + bool? projectOutSa; + int? loginType; + String? zipCode; + bool? isRegister; + String? logInTokenId; + int? searchType; + int? patientId; + String? nationalId; + String? patientIdentificationId; + int? otpSendType; + int? languageId; + double? versionId; + int? channel; + String? ipAdress; + String? generalid; + int? patientOutSa; + bool? isDentalAllowedBackend; + int? deviceTypeId; + double? latitude; + double? longitude; + int? patientType; + + GetUserMobileDeviceData({ + this.patientMobileNumber, + this.mobileNo, + this.deviceToken, + this.projectOutSa, + this.loginType, + this.zipCode, + this.isRegister, + this.logInTokenId, + this.searchType, + this.patientId, + this.nationalId, + this.patientIdentificationId, + this.otpSendType, + this.languageId, + this.versionId, + this.channel, + this.ipAdress, + this.generalid, + this.patientOutSa, + this.isDentalAllowedBackend, + this.deviceTypeId, + this.latitude, + this.longitude, + this.patientType, + }); + + factory GetUserMobileDeviceData.fromRawJson(String str) => GetUserMobileDeviceData.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory GetUserMobileDeviceData.fromJson(Map json) => GetUserMobileDeviceData( + patientMobileNumber: json["PatientMobileNumber"], + mobileNo: json["MobileNo"], + deviceToken: json["DeviceToken"], + projectOutSa: json["ProjectOutSA"], + loginType: json["LoginType"], + zipCode: json["ZipCode"], + isRegister: json["isRegister"], + logInTokenId: json["LogInTokenID"], + searchType: json["SearchType"], + patientId: json["PatientID"], + nationalId: json["NationalID"], + patientIdentificationId: json["PatientIdentificationID"], + otpSendType: json["OTP_SendType"], + languageId: json["LanguageID"], + versionId: json["VersionID"]?.toDouble(), + channel: json["Channel"], + ipAdress: json["IPAdress"], + generalid: json["generalid"], + patientOutSa: json["PatientOutSA"], + isDentalAllowedBackend: json["isDentalAllowedBackend"], + deviceTypeId: json["DeviceTypeID"], + latitude: json["Latitude"], + longitude: json["Longitude"], + patientType: json["PatientType"], + ); + + Map toJson() => { + "PatientMobileNumber": patientMobileNumber, + "MobileNo": mobileNo, + "DeviceToken": deviceToken, + "ProjectOutSA": projectOutSa, + "LoginType": loginType, + "ZipCode": zipCode, + "isRegister": isRegister, + "LogInTokenID": logInTokenId, + "SearchType": searchType, + "PatientID": patientId, + "NationalID": nationalId, + "PatientIdentificationID": patientIdentificationId, + "OTP_SendType": otpSendType, + "LanguageID": languageId, + "VersionID": versionId, + "Channel": channel, + "IPAdress": ipAdress, + "generalid": generalid, + "PatientOutSA": patientOutSa, + "isDentalAllowedBackend": isDentalAllowedBackend, + "DeviceTypeID": deviceTypeId, + "Latitude": latitude, + "Longitude": longitude, + "PatientType": patientType, + }; +} diff --git a/lib/features/authentication/models/request_models/insert_patient_mobile_deviceinfo.dart b/lib/features/authentication/models/request_models/insert_patient_mobile_deviceinfo.dart new file mode 100644 index 0000000..dbfb0e1 --- /dev/null +++ b/lib/features/authentication/models/request_models/insert_patient_mobile_deviceinfo.dart @@ -0,0 +1,109 @@ +import 'dart:convert'; + +class InsertPatientMobileDeviceInfo { + double? versionId; + int? channel; + int? languageId; + String? ipAdress; + String? generalid; + int? patientOutSa; + bool? isDentalAllowedBackend; + int? deviceTypeId; + int? patientId; + String? tokenId; + String? voipToken; + int? patientTypeId; + int? patientType; + String? deviceToken; + String? deviceType; + String? patientMobileNumber; + String? nationalId; + int? gender; + int? loginType; + String? macAddress; + double? latitude; + double? longitude; + String? sessionId; + + InsertPatientMobileDeviceInfo({ + this.versionId, + this.channel, + this.languageId, + this.ipAdress, + this.generalid, + this.patientOutSa, + this.isDentalAllowedBackend, + this.deviceTypeId, + this.patientId, + this.tokenId, + this.voipToken, + this.patientTypeId, + this.patientType, + this.deviceToken, + this.deviceType, + this.patientMobileNumber, + this.nationalId, + this.gender, + this.loginType, + this.macAddress, + this.latitude, + this.longitude, + this.sessionId, + }); + + factory InsertPatientMobileDeviceInfo.fromRawJson(String str) => InsertPatientMobileDeviceInfo.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory InsertPatientMobileDeviceInfo.fromJson(Map json) => InsertPatientMobileDeviceInfo( + versionId: json["VersionID"]?.toDouble(), + channel: json["Channel"], + languageId: json["LanguageID"], + ipAdress: json["IPAdress"], + generalid: json["generalid"], + patientOutSa: json["PatientOutSA"], + isDentalAllowedBackend: json["isDentalAllowedBackend"], + deviceTypeId: json["DeviceTypeID"], + patientId: json["PatientID"], + tokenId: json["TokenID"], + voipToken: json["VoipToken"], + patientTypeId: json["PatientTypeID"], + patientType: json["PatientType"], + deviceToken: json["DeviceToken"], + deviceType: json["DeviceType"], + patientMobileNumber: json["PatientMobileNumber"], + nationalId: json["NationalID"], + gender: json["Gender"], + loginType: json["LoginType"], + macAddress: json["MACAddress"], + latitude: json["Latitude"], + longitude: json["Longitude"], + sessionId: json[" SessionID"], + ); + + Map toJson() => { + "VersionID": versionId, + "Channel": channel, + "LanguageID": languageId, + "IPAdress": ipAdress, + "generalid": generalid, + "PatientOutSA": patientOutSa, + "isDentalAllowedBackend": isDentalAllowedBackend, + "DeviceTypeID": deviceTypeId, + "PatientID": patientId, + "TokenID": tokenId, + "VoipToken": voipToken, + "PatientTypeID": patientTypeId, + "PatientType": patientType, + "DeviceToken": deviceToken, + "DeviceType": deviceType, + "PatientMobileNumber": patientMobileNumber, + "NationalID": nationalId, + "Gender": gender, + "LoginType": loginType, + "MACAddress": macAddress, + "Latitude": latitude, + "Longitude": longitude, + " SessionID": sessionId, + }; +} diff --git a/lib/features/authentication/models/request_models/patient_insert_device_imei_request.dart b/lib/features/authentication/models/request_models/patient_insert_device_imei_request.dart new file mode 100644 index 0000000..0b2a99f --- /dev/null +++ b/lib/features/authentication/models/request_models/patient_insert_device_imei_request.dart @@ -0,0 +1,126 @@ +import 'dart:convert'; + +class PatientInsertDeviceImei { + String? setupId; + int? patientType; + int? patientId; + String? firstName; + String? firstNameN; + String? lastNameN; + int? preferredLanguage; + String? patientIdentificationNo; + bool? outSa; + String? identificationNo; + String? mobileNo; + String? tokenId; + String? imei; + bool? biometricEnabled; + int? logInTypeId; + double? versionId; + int? channel; + int? languageId; + String? ipAdress; + String? generalid; + int? latitude; + int? longitude; + int? deviceTypeId; + int? patientTypeId; + int? patientOutSa; + String? sessionId; + String? lastName; + + PatientInsertDeviceImei({ + this.setupId, + this.patientType, + this.patientId, + this.firstName, + this.firstNameN, + this.lastNameN, + this.preferredLanguage, + this.patientIdentificationNo, + this.outSa, + this.identificationNo, + this.mobileNo, + this.tokenId, + this.imei, + this.biometricEnabled, + this.logInTypeId, + this.versionId, + this.channel, + this.languageId, + this.ipAdress, + this.generalid, + this.latitude, + this.longitude, + this.deviceTypeId, + this.patientTypeId, + this.patientOutSa, + this.sessionId, + this.lastName + }); + + factory PatientInsertDeviceImei.fromRawJson(String str) => PatientInsertDeviceImei.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory PatientInsertDeviceImei.fromJson(Map json) => PatientInsertDeviceImei( + setupId: json["SetupID"], + patientType: json["PatientType"], + patientId: json["PatientID"], + firstName: json["FirstName"], + firstNameN: json["FirstNameN"], + lastNameN: json["LastNameN"], + preferredLanguage: json["PreferredLanguage"], + patientIdentificationNo: json["PatientIdentificationNo"], + outSa: json["OutSA"], + identificationNo: json["IdentificationNo"], + mobileNo: json["MobileNo"], + tokenId: json["TokenID"], + imei: json["IMEI"], + biometricEnabled: json["BiometricEnabled"], + logInTypeId: json["LogInTypeID"], + versionId: json["VersionID"]?.toDouble(), + channel: json["Channel"], + languageId: json["LanguageID"], + ipAdress: json["IPAdress"], + generalid: json["generalid"], + latitude: json["Latitude"], + longitude: json["Longitude"], + deviceTypeId: json["DeviceTypeID"], + patientTypeId: json["PatientTypeID"], + patientOutSa: json["PatientOutSA"], + sessionId: json["SessionID"], + lastName: json["LastName"], + + ); + + Map toJson() => { + "SetupID": setupId, + "PatientType": patientType, + "PatientID": patientId, + "FirstName": firstName, + "FirstNameN": firstNameN, + "LastNameN": lastNameN, + "PreferredLanguage": preferredLanguage, + "PatientIdentificationNo": patientIdentificationNo, + "OutSA": outSa, + "IdentificationNo": identificationNo, + "MobileNo": mobileNo, + "TokenID": tokenId, + "IMEI": imei, + "BiometricEnabled": biometricEnabled, + "LogInTypeID": logInTypeId, + "VersionID": versionId, + "Channel": channel, + "LanguageID": languageId, + "IPAdress": ipAdress, + "generalid": generalid, + "Latitude": latitude, + "Longitude": longitude, + "DeviceTypeID": deviceTypeId, + "PatientTypeID": patientTypeId, + "PatientOutSA": patientOutSa, + "SessionID": sessionId, + "LastName": lastName, + }; +} diff --git a/lib/features/authentication/models/request_models/registration_payload_model.dart b/lib/features/authentication/models/request_models/registration_payload_model.dart new file mode 100644 index 0000000..bbb31f9 --- /dev/null +++ b/lib/features/authentication/models/request_models/registration_payload_model.dart @@ -0,0 +1,245 @@ +// import 'dart:convert'; +// +// import 'package:hmg_patient_app_new/core/enums.dart'; +// +// class RegistrationDataModelPayload { +// int? patientMobileNumber; +// String? zipCode; +// int? searchType; +// int? patientId; +// int? patientIdentificationId; +// int? otpSendType; +// int? patientOutSa; +// bool? isDentalAllowedBackend; +// String? dob; +// int? isHijri; +// bool? forRegister; +// bool? isRegister; +// String? healthId; +// String? emailAddress; +// String? nationalityCode; +// GenderTypeEnum? gender; +// MaritalStatusTypeEnum? maritalStatus; +// String? fullName; +// +// RegistrationDataModelPayload({ +// this.patientMobileNumber, +// this.zipCode, +// this.searchType, +// this.patientId, +// this.patientIdentificationId, +// this.otpSendType, +// this.patientOutSa, +// this.isDentalAllowedBackend, +// this.dob, +// this.isHijri, +// this.forRegister, +// this.isRegister, +// this.healthId, +// this.emailAddress, +// this.nationalityCode, +// this.gender, +// this.maritalStatus, +// this.fullName, +// }); +// +// factory RegistrationDataModelPayload.fromRawJson(String str) => RegistrationDataModelPayload.fromJson(json.decode(str)); +// +// String toRawJson() => json.encode(toJson()); +// +// factory RegistrationDataModelPayload.fromJson(Map json) => RegistrationDataModelPayload( +// patientMobileNumber: json["PatientMobileNumber"], +// zipCode: json["ZipCode"], +// searchType: json["SearchType"], +// patientId: json["PatientID"], +// patientIdentificationId: json["PatientIdentificationID"], +// otpSendType: json["OTP_SendType"], +// patientOutSa: json["PatientOutSA"], +// isDentalAllowedBackend: json["isDentalAllowedBackend"], +// dob: json["DOB"], +// isHijri: json["IsHijri"], +// forRegister: json["forRegister"], +// isRegister: json["isRegister"], +// healthId: json["healthId"], +// emailAddress: json["emailAddress"], +// nationalityCode: json["nationalityCode"], +// gender: json["gender"], +// maritalStatus: json["maritalStatus"], +// fullName: json["fullName"], +// ); +// +// Map toJson() => { +// "PatientMobileNumber": patientMobileNumber, +// "ZipCode": zipCode, +// "SearchType": searchType, +// "PatientID": patientId, +// "PatientIdentificationID": patientIdentificationId, +// "OTP_SendType": otpSendType, +// "PatientOutSA": patientOutSa, +// "isDentalAllowedBackend": isDentalAllowedBackend, +// "DOB": dob, +// "IsHijri": isHijri, +// "forRegister": forRegister, +// "isRegister": isRegister, +// "healthId": healthId, +// "emailAddress": emailAddress, +// "nationalityCode": nationalityCode, +// "gender": gender, +// "maritalStatus": maritalStatus, +// "fullName": fullName, +// }; +// } + + +import 'dart:convert'; + +import 'package:hmg_patient_app_new/core/enums.dart'; + +class RegistrationDataModelPayload { + int? patientMobileNumber; + String? mobileNo; + String? deviceToken; + bool? projectOutSa; + int? loginType; + String? zipCode; + bool? isRegister; + String? logInTokenId; + int? searchType; + int? patientId; + int? nationalId; + int? patientIdentificationId; + int? otpSendType; + String? languageId; + String? versionId; + String? channel; + String? ipAdress; + String? generalid; + int? patientOutSa; + bool? isDentalAllowedBackend; + String? deviceTypeId; + String? smsSignature; + String? dob; + int? isHijri; + String? patientType; + String? latitude; + String? longitude; + String? healthId; + String? emailAddress; + String? nationalityCode; + GenderTypeEnum? gender; + MaritalStatusTypeEnum? maritalStatus; + String? fullName; + + + RegistrationDataModelPayload({ + this.patientMobileNumber, + this.mobileNo, + this.deviceToken, + this.projectOutSa, + this.loginType, + this.zipCode, + this.isRegister, + this.logInTokenId, + this.searchType, + this.patientId, + this.nationalId, + this.patientIdentificationId, + this.otpSendType, + this.languageId, + this.versionId, + this.channel, + this.ipAdress, + this.generalid, + this.patientOutSa, + this.isDentalAllowedBackend, + this.deviceTypeId, + this.smsSignature, + this.dob, + this.isHijri, + this.patientType, + this.latitude, + this.longitude, + this.healthId, + this.emailAddress, + this.nationalityCode, + this.gender, + this.maritalStatus, + this.fullName, + }); + + factory RegistrationDataModelPayload.fromRawJson(String str) => RegistrationDataModelPayload.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory RegistrationDataModelPayload.fromJson(Map json) => RegistrationDataModelPayload( + patientMobileNumber: json["PatientMobileNumber"], + mobileNo: json["MobileNo"], + deviceToken: json["DeviceToken"], + projectOutSa: json["ProjectOutSA"], + loginType: json["LoginType"], + zipCode: json["ZipCode"], + isRegister: json["isRegister"], + logInTokenId: json["LogInTokenID"], + searchType: json["SearchType"], + patientId: json["PatientID"], + nationalId: json["NationalID"], + patientIdentificationId: json["PatientIdentificationID"], + otpSendType: json["OTP_SendType"], + languageId: json["LanguageID"], + versionId: json["VersionID"], + channel: json["Channel"], + ipAdress: json["IPAdress"], + generalid: json["generalid"], + patientOutSa: json["PatientOutSA"], + isDentalAllowedBackend: json["isDentalAllowedBackend"], + deviceTypeId: json["DeviceTypeID"], + smsSignature: json["SMSSignature"], + dob: json["DOB"], + isHijri: json["IsHijri"], + patientType: json["PatientType"], + latitude: json["Latitude"], + longitude: json["Longitude"], + healthId: json["healthId"], + emailAddress: json["emailAddress"], + nationalityCode: json["nationalityCode"], + gender: json["gender"], + maritalStatus: json["maritalStatus"], + fullName: json["fullName"], + ); + + Map toJson() => { + "PatientMobileNumber": patientMobileNumber, + "MobileNo": mobileNo, + "DeviceToken": deviceToken, + "ProjectOutSA": projectOutSa, + "LoginType": loginType, + "ZipCode": zipCode, + "isRegister": isRegister, + "LogInTokenID": logInTokenId, + "SearchType": searchType, + "PatientID": patientId, + "NationalID": nationalId, + "PatientIdentificationID": patientIdentificationId, + "OTP_SendType": otpSendType, + "LanguageID": languageId, + "VersionID": versionId, + "Channel": channel, + "IPAdress": ipAdress, + "generalid": generalid, + "PatientOutSA": patientOutSa, + "isDentalAllowedBackend": isDentalAllowedBackend, + "DeviceTypeID": deviceTypeId, + "SMSSignature": smsSignature, + "DOB": dob, + "IsHijri": isHijri, + "PatientType": patientType, + "Latitude": latitude, + "Longitude": longitude, + "healthId": healthId, + "emailAddress": emailAddress, + "nationalityCode": nationalityCode, + "gender": gender, + "maritalStatus": maritalStatus, + "fullName": fullName, + }; +} diff --git a/lib/features/authentication/models/request_models/send_activation_request_model.dart b/lib/features/authentication/models/request_models/send_activation_request_model.dart new file mode 100644 index 0000000..6bd48b4 --- /dev/null +++ b/lib/features/authentication/models/request_models/send_activation_request_model.dart @@ -0,0 +1,132 @@ +class SendActivationRequest { + int? patientMobileNumber; + String? mobileNo; + String? deviceToken; + bool? projectOutSA; + int? loginType; + String? zipCode; + bool? isRegister; + String? logInTokenID; + int? searchType; + int? patientID; + int? nationalID; + int? patientIdentificationID; + int? oTPSendType; + int? languageID; + double? versionID; + int? channel; + String? iPAdress; + String? generalid; + int? patientOutSA; + dynamic sessionID; + bool? isDentalAllowedBackend; + int? deviceTypeID; + String? sMSSignature; + String? dob; + int? isHijri; + String? healthId; + int? responseID; + int? status; + int? familyRegionID; + bool? isPatientExcluded; + + SendActivationRequest( + {this.patientMobileNumber, + this.mobileNo, + this.deviceToken, + this.projectOutSA, + this.loginType, + this.zipCode, + this.isRegister, + this.logInTokenID, + this.searchType, + this.patientID, + this.nationalID, + this.patientIdentificationID, + this.oTPSendType, + this.languageID, + this.versionID, + this.channel, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.sMSSignature, + this.dob, + this.isHijri, + this.healthId, + this.responseID, + this.status, + this.familyRegionID, + this.isPatientExcluded}); + + SendActivationRequest.fromJson(Map json) { + patientMobileNumber = json['PatientMobileNumber']; + mobileNo = json['MobileNo']; + deviceToken = json['DeviceToken']; + projectOutSA = json['ProjectOutSA']; + loginType = json['LoginType']; + zipCode = json['ZipCode']; + isRegister = json['isRegister']; + logInTokenID = json['LogInTokenID']; + searchType = json['SearchType']; + patientID = json['PatientID']; + nationalID = json['NationalID']; + patientIdentificationID = json['PatientIdentificationID']; + oTPSendType = json['OTP_SendType']; + languageID = json['LanguageID']; + versionID = json['VersionID']; + channel = json['Channel']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + sMSSignature = json['SMSSignature']; + dob = json['DOB']; + isHijri = json['IsHijri']; + healthId = json['HealthId']; + responseID = json['ReponseID']; + status = json['Status']; + familyRegionID = json['FamilyRegionID']; + isPatientExcluded = json['IsPatientExcluded']; + } + + Map toJson() { + final Map data = new Map(); + data['PatientMobileNumber'] = patientMobileNumber; + data['MobileNo'] = mobileNo; + data['DeviceToken'] = deviceToken; + data['ProjectOutSA'] = projectOutSA; + data['LoginType'] = loginType; + data['ZipCode'] = zipCode; + data['isRegister'] = isRegister; + data['LogInTokenID'] = logInTokenID; + data['SearchType'] = searchType; + data['PatientID'] = patientID; + data['NationalID'] = nationalID; + data['PatientIdentificationID'] = patientIdentificationID; + data['OTP_SendType'] = oTPSendType; + data['LanguageID'] = languageID; + data['VersionID'] = versionID; + data['Channel'] = channel; + data['IPAdress'] = iPAdress; + data['generalid'] = generalid; + data['PatientOutSA'] = patientOutSA; + data['SessionID'] = sessionID; + data['isDentalAllowedBackend'] = isDentalAllowedBackend; + data['DeviceTypeID'] = deviceTypeID; + data['SMSSignature'] = sMSSignature; + data['DOB'] = dob; + data['IsHijri'] = isHijri; + data['HealthId'] = healthId; + data['ResponseID'] = responseID; + data['Status'] = status; + data['FamilyRegionID'] = familyRegionID; + data['IsPatientExcluded'] = isPatientExcluded; + return data; + } +} diff --git a/lib/features/authentication/models/resp_models/authenticated_user_resp_model.dart b/lib/features/authentication/models/resp_models/authenticated_user_resp_model.dart new file mode 100644 index 0000000..8209a0f --- /dev/null +++ b/lib/features/authentication/models/resp_models/authenticated_user_resp_model.dart @@ -0,0 +1,329 @@ +import 'dart:convert'; + +class AuthenticatedUser { + String? setupId; + int? patientType; + int? patientId; + String? firstName; + String? middleName; + String? lastName; + String? firstNameN; + String? middleNameN; + String? lastNameN; + int? relationshipId; + int? gender; + String? dateofBirth; + dynamic dateofBirthN; + String? nationalityId; + String? phoneResi; + String? phoneOffice; + String? mobileNumber; + String? faxNumber; + String? emailAddress; + dynamic bloodGroup; + dynamic rhFactor; + bool? isEmailAlertRequired; + bool? isSmsAlertRequired; + String? preferredLanguage; + bool? isPrivilegedMember; + dynamic memberId; + dynamic expiryDate; + dynamic isHmgEmployee; + dynamic employeeId; + String? emergencyContactName; + String? emergencyContactNo; + int? patientPayType; + dynamic dhccPatientRefId; + bool? isPatientDummy; + int? status; + dynamic isStatusCleared; + int? patientIdentificationType; + String? patientIdentificationNo; + int? projectId; + int? infoSourceId; + dynamic address; + int? age; + String? ageDesc; + int? areaId; + int? crsVerificationStatus; + String? crsVerificationStatusDesc; + String? crsVerificationStatusDescN; + int? createdBy; + String? genderDescription; + String? healthIdFromNhicViaVida; + dynamic ir; + dynamic isoCityId; + dynamic isoCountryId; + bool? isVerfiedFromNhic; + List? listPrivilege; + dynamic marital; + dynamic occupationId; + int? outSa; + dynamic poBox; + bool? receiveHealthSummaryReport; + int? sourceType; + dynamic strDateofBirth; + dynamic tempAddress; + dynamic zipCode; + dynamic eHealthIdField; + dynamic authenticatedUserPatientPayType; + dynamic authenticatedUserPatientType; + dynamic authenticatedUserStatus; + int? superUser; + bool? isParentUser; + + AuthenticatedUser({ + this.setupId, + this.patientType, + this.patientId, + this.firstName, + this.middleName, + this.lastName, + this.firstNameN, + this.middleNameN, + this.lastNameN, + this.relationshipId, + this.gender, + this.dateofBirth, + this.dateofBirthN, + this.nationalityId, + this.phoneResi, + this.phoneOffice, + this.mobileNumber, + this.faxNumber, + this.emailAddress, + this.bloodGroup, + this.rhFactor, + this.isEmailAlertRequired, + this.isSmsAlertRequired, + this.preferredLanguage, + this.isPrivilegedMember, + this.memberId, + this.expiryDate, + this.isHmgEmployee, + this.employeeId, + this.emergencyContactName, + this.emergencyContactNo, + this.patientPayType, + this.dhccPatientRefId, + this.isPatientDummy, + this.status, + this.isStatusCleared, + this.patientIdentificationType, + this.patientIdentificationNo, + this.projectId, + this.infoSourceId, + this.address, + this.age, + this.ageDesc, + this.areaId, + this.crsVerificationStatus, + this.crsVerificationStatusDesc, + this.crsVerificationStatusDescN, + this.createdBy, + this.genderDescription, + this.healthIdFromNhicViaVida, + this.ir, + this.isoCityId, + this.isoCountryId, + this.isVerfiedFromNhic, + this.listPrivilege, + this.marital, + this.occupationId, + this.outSa, + this.poBox, + this.receiveHealthSummaryReport, + this.sourceType, + this.strDateofBirth, + this.tempAddress, + this.zipCode, + this.eHealthIdField, + this.authenticatedUserPatientPayType, + this.authenticatedUserPatientType, + this.authenticatedUserStatus, + this.superUser, + this.isParentUser, + }); + + factory AuthenticatedUser.fromRawJson(String str) => AuthenticatedUser.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory AuthenticatedUser.fromJson(Map json) => AuthenticatedUser( + setupId: json["SetupID"], + patientType: json["PatientType"], + patientId: json["PatientID"], + firstName: json["FirstName"], + middleName: json["MiddleName"], + lastName: json["LastName"], + firstNameN: json["FirstNameN"], + middleNameN: json["MiddleNameN"], + lastNameN: json["LastNameN"], + relationshipId: json["RelationshipID"], + gender: json["Gender"], + dateofBirth: json["DateofBirth"], + dateofBirthN: json["DateofBirthN"], + nationalityId: json["NationalityID"], + phoneResi: json["PhoneResi"], + phoneOffice: json["PhoneOffice"], + mobileNumber: json["MobileNumber"], + faxNumber: json["FaxNumber"], + emailAddress: json["EmailAddress"], + bloodGroup: json["BloodGroup"], + rhFactor: json["RHFactor"], + isEmailAlertRequired: json["IsEmailAlertRequired"], + isSmsAlertRequired: json["IsSMSAlertRequired"], + preferredLanguage: json["PreferredLanguage"], + isPrivilegedMember: json["IsPrivilegedMember"], + memberId: json["MemberID"], + expiryDate: json["ExpiryDate"], + isHmgEmployee: json["IsHmgEmployee"], + employeeId: json["EmployeeID"], + emergencyContactName: json["EmergencyContactName"], + emergencyContactNo: json["EmergencyContactNo"], + patientPayType: json["PatientPayType"], + dhccPatientRefId: json["DHCCPatientRefID"], + isPatientDummy: json["IsPatientDummy"], + status: json["Status"], + isStatusCleared: json["IsStatusCleared"], + patientIdentificationType: json["PatientIdentificationType"], + patientIdentificationNo: json["PatientIdentificationNo"], + projectId: json["ProjectID"], + infoSourceId: json["InfoSourceID"], + address: json["Address"], + age: json["Age"], + ageDesc: json["AgeDesc"], + areaId: json["AreaID"], + crsVerificationStatus: json["CRSVerificationStatus"], + crsVerificationStatusDesc: json["CRSVerificationStatusDesc"], + crsVerificationStatusDescN: json["CRSVerificationStatusDescN"], + createdBy: json["CreatedBy"], + genderDescription: json["GenderDescription"], + healthIdFromNhicViaVida: json["HealthIDFromNHICViaVida"], + ir: json["IR"], + isoCityId: json["ISOCityID"], + isoCountryId: json["ISOCountryID"], + isVerfiedFromNhic: json["IsVerfiedFromNHIC"], + listPrivilege: json["ListPrivilege"] == null ? [] : List.from(json["ListPrivilege"]!.map((x) => ListPrivilege.fromJson(x))), + marital: json["Marital"], + occupationId: json["OccupationID"], + outSa: json["OutSA"], + poBox: json["POBox"], + receiveHealthSummaryReport: json["ReceiveHealthSummaryReport"], + sourceType: json["SourceType"], + strDateofBirth: json["StrDateofBirth"], + tempAddress: json["TempAddress"], + zipCode: json["ZipCode"], + eHealthIdField: json["eHealthIDField"], + authenticatedUserPatientPayType: json["patientPayType"], + authenticatedUserPatientType: json["patientType"], + authenticatedUserStatus: json["status"], + superUser: json["superUser"], + isParentUser: json["isParentUser"] ?? false, + ); + + Map toJson() => { + "SetupID": setupId, + "PatientType": patientType, + "PatientID": patientId, + "FirstName": firstName, + "MiddleName": middleName, + "LastName": lastName, + "FirstNameN": firstNameN, + "MiddleNameN": middleNameN, + "LastNameN": lastNameN, + "RelationshipID": relationshipId, + "Gender": gender, + "DateofBirth": dateofBirth, + "DateofBirthN": dateofBirthN, + "NationalityID": nationalityId, + "PhoneResi": phoneResi, + "PhoneOffice": phoneOffice, + "MobileNumber": mobileNumber, + "FaxNumber": faxNumber, + "EmailAddress": emailAddress, + "BloodGroup": bloodGroup, + "RHFactor": rhFactor, + "IsEmailAlertRequired": isEmailAlertRequired, + "IsSMSAlertRequired": isSmsAlertRequired, + "PreferredLanguage": preferredLanguage, + "IsPrivilegedMember": isPrivilegedMember, + "MemberID": memberId, + "ExpiryDate": expiryDate, + "IsHmgEmployee": isHmgEmployee, + "EmployeeID": employeeId, + "EmergencyContactName": emergencyContactName, + "EmergencyContactNo": emergencyContactNo, + "PatientPayType": patientPayType, + "DHCCPatientRefID": dhccPatientRefId, + "IsPatientDummy": isPatientDummy, + "Status": status, + "IsStatusCleared": isStatusCleared, + "PatientIdentificationType": patientIdentificationType, + "PatientIdentificationNo": patientIdentificationNo, + "ProjectID": projectId, + "InfoSourceID": infoSourceId, + "Address": address, + "Age": age, + "AgeDesc": ageDesc, + "AreaID": areaId, + "CRSVerificationStatus": crsVerificationStatus, + "CRSVerificationStatusDesc": crsVerificationStatusDesc, + "CRSVerificationStatusDescN": crsVerificationStatusDescN, + "CreatedBy": createdBy, + "GenderDescription": genderDescription, + "HealthIDFromNHICViaVida": healthIdFromNhicViaVida, + "IR": ir, + "ISOCityID": isoCityId, + "ISOCountryID": isoCountryId, + "IsVerfiedFromNHIC": isVerfiedFromNhic, + "ListPrivilege": listPrivilege == null ? [] : List.from(listPrivilege!.map((x) => x.toJson())), + "Marital": marital, + "OccupationID": occupationId, + "OutSA": outSa, + "POBox": poBox, + "ReceiveHealthSummaryReport": receiveHealthSummaryReport, + "SourceType": sourceType, + "StrDateofBirth": strDateofBirth, + "TempAddress": tempAddress, + "ZipCode": zipCode, + "eHealthIDField": eHealthIdField, + "patientPayType": authenticatedUserPatientPayType, + "patientType": authenticatedUserPatientType, + "status": authenticatedUserStatus, + "superUser": superUser, + "isParentUser": isParentUser, + }; +} + +class ListPrivilege { + int? id; + String? serviceName; + bool? previlege; + dynamic region; + + ListPrivilege({ + this.id, + this.serviceName, + this.previlege, + this.region, + }); + + factory ListPrivilege.fromRawJson(String str) => ListPrivilege.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory ListPrivilege.fromJson(Map json) => ListPrivilege( + id: json["ID"], + serviceName: json["ServiceName"], + previlege: json["Previlege"], + region: json["Region"], + ); + + Map toJson() => { + "ID": id, + "ServiceName": serviceName, + "Previlege": previlege, + "Region": region, + }; +} diff --git a/lib/features/authentication/models/resp_models/check_activation_code_resp_model.dart b/lib/features/authentication/models/resp_models/check_activation_code_resp_model.dart new file mode 100644 index 0000000..67848c6 --- /dev/null +++ b/lib/features/authentication/models/resp_models/check_activation_code_resp_model.dart @@ -0,0 +1,615 @@ +import 'dart:convert'; + +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; + +class CheckActivationCode { + dynamic date; + int? languageId; + int? serviceName; + dynamic time; + dynamic androidLink; + String? authenticationTokenId; + dynamic data; + bool? dataw; + int? dietType; + int? dietTypeId; + dynamic errorCode; + dynamic errorEndUserMessage; + dynamic errorEndUserMessageN; + dynamic errorMessage; + int? errorStatusCode; + int? errorType; + int? foodCategory; + dynamic iosLink; + bool? isAuthenticated; + int? mealOrderStatus; + int? mealType; + int? messageStatus; + int? numberOfResultRecords; + dynamic patientBlodType; + dynamic successMsg; + dynamic successMsgN; + dynamic vidaUpdatedResponse; + dynamic doctorInformationList; + dynamic getAllPendingRecordsList; + dynamic getAllSharedRecordsByStatusList; + dynamic getMaritalstatusLst; + dynamic getOccupationLst; + dynamic getResponseFileList; + dynamic hisPatientModelVpPortal; + bool? isHmgPatient; + bool? isLoginSuccessfully; + bool? isNeedUpdateIdintificationNo; + bool? isPatientAuthorized; + bool? isVidaPlus; + bool? kioskSendSms; + List? list; + dynamic listAskHabibMobileLoginInfo; + dynamic listAskHabibPatientFile; + dynamic listFamilyRelationships; + dynamic listMergeFiles; + dynamic listMobileLoginInfo; + dynamic listPatientCount; + dynamic logInTokenId; + dynamic mohemmPrivilegeList; + int? pateintId; + dynamic patientBloodType; + dynamic patientErAdminDriverFileList; + dynamic patientErAdminFile; + dynamic patientErDriverFile; + dynamic patientErDriverFileList; + bool? patientHasFile; + dynamic patientMergedIDs; + bool? patientOutSa; + int? patientShareRequestId; + int? patientType; + int? projectIdOut; + dynamic returnMessage; + bool? smsLoginRequired; + dynamic servicePrivilegeList; + dynamic sharePatientName; + bool? userAccountIsActivated; + dynamic verificationCode; + dynamic email; + dynamic errorList; + bool? hasFile; + bool? isActiveCode; + bool? isMerged; + bool? isNeedUserAgreement; + bool? isSmsSent; + dynamic memberList; + dynamic message; + int? statusCode; + + CheckActivationCode({ + this.date, + this.languageId, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenId, + this.data, + this.dataw, + this.dietType, + this.dietTypeId, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorStatusCode, + this.errorType, + this.foodCategory, + this.iosLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.vidaUpdatedResponse, + this.doctorInformationList, + this.getAllPendingRecordsList, + this.getAllSharedRecordsByStatusList, + this.getMaritalstatusLst, + this.getOccupationLst, + this.getResponseFileList, + this.hisPatientModelVpPortal, + this.isHmgPatient, + this.isLoginSuccessfully, + this.isNeedUpdateIdintificationNo, + this.isPatientAuthorized, + this.isVidaPlus, + this.kioskSendSms, + this.list, + this.listAskHabibMobileLoginInfo, + this.listAskHabibPatientFile, + this.listFamilyRelationships, + this.listMergeFiles, + this.listMobileLoginInfo, + this.listPatientCount, + this.logInTokenId, + this.mohemmPrivilegeList, + this.pateintId, + this.patientBloodType, + this.patientErAdminDriverFileList, + this.patientErAdminFile, + this.patientErDriverFile, + this.patientErDriverFileList, + this.patientHasFile, + this.patientMergedIDs, + this.patientOutSa, + this.patientShareRequestId, + this.patientType, + this.projectIdOut, + this.returnMessage, + this.smsLoginRequired, + this.servicePrivilegeList, + this.sharePatientName, + this.userAccountIsActivated, + this.verificationCode, + this.email, + this.errorList, + this.hasFile, + this.isActiveCode, + this.isMerged, + this.isNeedUserAgreement, + this.isSmsSent, + this.memberList, + this.message, + this.statusCode, + }); + + factory CheckActivationCode.fromRawJson(String str) => CheckActivationCode.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory CheckActivationCode.fromJson(Map json) => CheckActivationCode( + date: json["Date"], + languageId: json["LanguageID"], + serviceName: json["ServiceName"], + time: json["Time"], + androidLink: json["AndroidLink"], + authenticationTokenId: json["AuthenticationTokenID"], + data: json["Data"], + dataw: json["Dataw"], + dietType: json["DietType"], + dietTypeId: json["DietTypeID"], + errorCode: json["ErrorCode"], + errorEndUserMessage: json["ErrorEndUserMessage"], + errorEndUserMessageN: json["ErrorEndUserMessageN"], + errorMessage: json["ErrorMessage"], + errorStatusCode: json["ErrorStatusCode"], + errorType: json["ErrorType"], + foodCategory: json["FoodCategory"], + iosLink: json["IOSLink"], + isAuthenticated: json["IsAuthenticated"], + mealOrderStatus: json["MealOrderStatus"], + mealType: json["MealType"], + messageStatus: json["MessageStatus"], + numberOfResultRecords: json["NumberOfResultRecords"], + patientBlodType: json["PatientBlodType"], + successMsg: json["SuccessMsg"], + successMsgN: json["SuccessMsgN"], + vidaUpdatedResponse: json["VidaUpdatedResponse"], + doctorInformationList: json["DoctorInformation_List"], + getAllPendingRecordsList: json["GetAllPendingRecordsList"], + getAllSharedRecordsByStatusList: json["GetAllSharedRecordsByStatusList"], + getMaritalstatusLst: json["GetMaritalstatusLst"], + getOccupationLst: json["GetOccupationLst"], + getResponseFileList: json["GetResponseFileList"], + hisPatientModelVpPortal: json["HIS_PatientModel_VPPortal"], + isHmgPatient: json["IsHMGPatient"], + isLoginSuccessfully: json["IsLoginSuccessfully"], + isNeedUpdateIdintificationNo: json["IsNeedUpdateIdintificationNo"], + isPatientAuthorized: json["IsPatientAuthorized"], + isVidaPlus: json["IsVidaPlus"], + kioskSendSms: json["KioskSendSMS"], + list: json["List"] == null ? [] : List.from(json["List"]!.map((x) => AuthenticatedUser.fromJson(x))), + listAskHabibMobileLoginInfo: json["List_AskHabibMobileLoginInfo"], + listAskHabibPatientFile: json["List_AskHabibPatientFile"], + listFamilyRelationships: json["List_FamilyRelationships"], + listMergeFiles: json["List_MergeFiles"], + listMobileLoginInfo: json["List_MobileLoginInfo"], + listPatientCount: json["List_PatientCount"], + logInTokenId: json["LogInTokenID"], + mohemmPrivilegeList: json["MohemmPrivilege_List"], + pateintId: json["PateintID"], + patientBloodType: json["PatientBloodType"], + patientErAdminDriverFileList: json["PatientER_AdminDriverFileList"], + patientErAdminFile: json["PatientER_AdminFile"], + patientErDriverFile: json["PatientER_DriverFile"], + patientErDriverFileList: json["PatientER_DriverFileList"], + patientHasFile: json["PatientHasFile"], + patientMergedIDs: json["PatientMergedIDs"], + patientOutSa: json["PatientOutSA"], + patientShareRequestId: json["PatientShareRequestID"], + patientType: json["PatientType"], + projectIdOut: json["ProjectIDOut"], + returnMessage: json["ReturnMessage"], + smsLoginRequired: json["SMSLoginRequired"], + servicePrivilegeList: json["ServicePrivilege_List"], + sharePatientName: json["SharePatientName"], + userAccountIsActivated: json["UserAccountIsActivated"], + verificationCode: json["VerificationCode"], + email: json["email"], + errorList: json["errorList"], + hasFile: json["hasFile"], + isActiveCode: json["isActiveCode"], + isMerged: json["isMerged"], + isNeedUserAgreement: json["isNeedUserAgreement"], + isSmsSent: json["isSMSSent"], + memberList: json["memberList"], + message: json["message"], + statusCode: json["statusCode"], + ); + + Map toJson() => { + "Date": date, + "LanguageID": languageId, + "ServiceName": serviceName, + "Time": time, + "AndroidLink": androidLink, + "AuthenticationTokenID": authenticationTokenId, + "Data": data, + "Dataw": dataw, + "DietType": dietType, + "DietTypeID": dietTypeId, + "ErrorCode": errorCode, + "ErrorEndUserMessage": errorEndUserMessage, + "ErrorEndUserMessageN": errorEndUserMessageN, + "ErrorMessage": errorMessage, + "ErrorStatusCode": errorStatusCode, + "ErrorType": errorType, + "FoodCategory": foodCategory, + "IOSLink": iosLink, + "IsAuthenticated": isAuthenticated, + "MealOrderStatus": mealOrderStatus, + "MealType": mealType, + "MessageStatus": messageStatus, + "NumberOfResultRecords": numberOfResultRecords, + "PatientBlodType": patientBlodType, + "SuccessMsg": successMsg, + "SuccessMsgN": successMsgN, + "VidaUpdatedResponse": vidaUpdatedResponse, + "DoctorInformation_List": doctorInformationList, + "GetAllPendingRecordsList": getAllPendingRecordsList, + "GetAllSharedRecordsByStatusList": getAllSharedRecordsByStatusList, + "GetMaritalstatusLst": getMaritalstatusLst, + "GetOccupationLst": getOccupationLst, + "GetResponseFileList": getResponseFileList, + "HIS_PatientModel_VPPortal": hisPatientModelVpPortal, + "IsHMGPatient": isHmgPatient, + "IsLoginSuccessfully": isLoginSuccessfully, + "IsNeedUpdateIdintificationNo": isNeedUpdateIdintificationNo, + "IsPatientAuthorized": isPatientAuthorized, + "IsVidaPlus": isVidaPlus, + "KioskSendSMS": kioskSendSms, + "List": list == null ? [] : List.from(list!.map((x) => x.toJson())), + "List_AskHabibMobileLoginInfo": listAskHabibMobileLoginInfo, + "List_AskHabibPatientFile": listAskHabibPatientFile, + "List_FamilyRelationships": listFamilyRelationships, + "List_MergeFiles": listMergeFiles, + "List_MobileLoginInfo": listMobileLoginInfo, + "List_PatientCount": listPatientCount, + "LogInTokenID": logInTokenId, + "MohemmPrivilege_List": mohemmPrivilegeList, + "PateintID": pateintId, + "PatientBloodType": patientBloodType, + "PatientER_AdminDriverFileList": patientErAdminDriverFileList, + "PatientER_AdminFile": patientErAdminFile, + "PatientER_DriverFile": patientErDriverFile, + "PatientER_DriverFileList": patientErDriverFileList, + "PatientHasFile": patientHasFile, + "PatientMergedIDs": patientMergedIDs, + "PatientOutSA": patientOutSa, + "PatientShareRequestID": patientShareRequestId, + "PatientType": patientType, + "ProjectIDOut": projectIdOut, + "ReturnMessage": returnMessage, + "SMSLoginRequired": smsLoginRequired, + "ServicePrivilege_List": servicePrivilegeList, + "SharePatientName": sharePatientName, + "UserAccountIsActivated": userAccountIsActivated, + "VerificationCode": verificationCode, + "email": email, + "errorList": errorList, + "hasFile": hasFile, + "isActiveCode": isActiveCode, + "isMerged": isMerged, + "isNeedUserAgreement": isNeedUserAgreement, + "isSMSSent": isSmsSent, + "memberList": memberList, + "message": message, + "statusCode": statusCode, + }; +} + +class ListElement { + String? setupId; + int? patientType; + int? patientId; + String? firstName; + String? middleName; + String? lastName; + String? firstNameN; + String? middleNameN; + String? lastNameN; + int? relationshipId; + int? gender; + String? dateofBirth; + dynamic dateofBirthN; + String? nationalityId; + String? phoneResi; + String? phoneOffice; + String? mobileNumber; + String? faxNumber; + String? emailAddress; + dynamic bloodGroup; + dynamic rhFactor; + bool? isEmailAlertRequired; + bool? isSmsAlertRequired; + String? preferredLanguage; + bool? isPrivilegedMember; + dynamic memberId; + dynamic expiryDate; + dynamic isHmgEmployee; + dynamic employeeId; + String? emergencyContactName; + String? emergencyContactNo; + int? patientPayType; + dynamic dhccPatientRefId; + bool? isPatientDummy; + int? status; + dynamic isStatusCleared; + int? patientIdentificationType; + String? patientIdentificationNo; + int? projectId; + int? infoSourceId; + dynamic address; + int? age; + String? ageDesc; + int? areaId; + int? crsVerificationStatus; + String? crsVerificationStatusDesc; + String? crsVerificationStatusDescN; + int? createdBy; + String? genderDescription; + String? healthIdFromNhicViaVida; + dynamic ir; + dynamic isoCityId; + dynamic isoCountryId; + bool? isVerfiedFromNhic; + List? listPrivilege; + dynamic marital; + dynamic occupationId; + int? outSa; + dynamic poBox; + bool? receiveHealthSummaryReport; + int? sourceType; + dynamic strDateofBirth; + dynamic tempAddress; + dynamic zipCode; + dynamic eHealthIdField; + dynamic listPatientPayType; + dynamic listPatientType; + dynamic listStatus; + + ListElement({ + this.setupId, + this.patientType, + this.patientId, + this.firstName, + this.middleName, + this.lastName, + this.firstNameN, + this.middleNameN, + this.lastNameN, + this.relationshipId, + this.gender, + this.dateofBirth, + this.dateofBirthN, + this.nationalityId, + this.phoneResi, + this.phoneOffice, + this.mobileNumber, + this.faxNumber, + this.emailAddress, + this.bloodGroup, + this.rhFactor, + this.isEmailAlertRequired, + this.isSmsAlertRequired, + this.preferredLanguage, + this.isPrivilegedMember, + this.memberId, + this.expiryDate, + this.isHmgEmployee, + this.employeeId, + this.emergencyContactName, + this.emergencyContactNo, + this.patientPayType, + this.dhccPatientRefId, + this.isPatientDummy, + this.status, + this.isStatusCleared, + this.patientIdentificationType, + this.patientIdentificationNo, + this.projectId, + this.infoSourceId, + this.address, + this.age, + this.ageDesc, + this.areaId, + this.crsVerificationStatus, + this.crsVerificationStatusDesc, + this.crsVerificationStatusDescN, + this.createdBy, + this.genderDescription, + this.healthIdFromNhicViaVida, + this.ir, + this.isoCityId, + this.isoCountryId, + this.isVerfiedFromNhic, + this.listPrivilege, + this.marital, + this.occupationId, + this.outSa, + this.poBox, + this.receiveHealthSummaryReport, + this.sourceType, + this.strDateofBirth, + this.tempAddress, + this.zipCode, + this.eHealthIdField, + this.listPatientPayType, + this.listPatientType, + this.listStatus, + }); + + factory ListElement.fromRawJson(String str) => ListElement.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory ListElement.fromJson(Map json) => ListElement( + setupId: json["SetupID"], + patientType: json["PatientType"], + patientId: json["PatientID"], + firstName: json["FirstName"], + middleName: json["MiddleName"], + lastName: json["LastName"], + firstNameN: json["FirstNameN"], + middleNameN: json["MiddleNameN"], + lastNameN: json["LastNameN"], + relationshipId: json["RelationshipID"], + gender: json["Gender"], + dateofBirth: json["DateofBirth"], + dateofBirthN: json["DateofBirthN"], + nationalityId: json["NationalityID"], + phoneResi: json["PhoneResi"], + phoneOffice: json["PhoneOffice"], + mobileNumber: json["MobileNumber"], + faxNumber: json["FaxNumber"], + emailAddress: json["EmailAddress"], + bloodGroup: json["BloodGroup"], + rhFactor: json["RHFactor"], + isEmailAlertRequired: json["IsEmailAlertRequired"], + isSmsAlertRequired: json["IsSMSAlertRequired"], + preferredLanguage: json["PreferredLanguage"], + isPrivilegedMember: json["IsPrivilegedMember"], + memberId: json["MemberID"], + expiryDate: json["ExpiryDate"], + isHmgEmployee: json["IsHmgEmployee"], + employeeId: json["EmployeeID"], + emergencyContactName: json["EmergencyContactName"], + emergencyContactNo: json["EmergencyContactNo"], + patientPayType: json["PatientPayType"], + dhccPatientRefId: json["DHCCPatientRefID"], + isPatientDummy: json["IsPatientDummy"], + status: json["Status"], + isStatusCleared: json["IsStatusCleared"], + patientIdentificationType: json["PatientIdentificationType"], + patientIdentificationNo: json["PatientIdentificationNo"], + projectId: json["ProjectID"], + infoSourceId: json["InfoSourceID"], + address: json["Address"], + age: json["Age"], + ageDesc: json["AgeDesc"], + areaId: json["AreaID"], + crsVerificationStatus: json["CRSVerificationStatus"], + crsVerificationStatusDesc: json["CRSVerificationStatusDesc"], + crsVerificationStatusDescN: json["CRSVerificationStatusDescN"], + createdBy: json["CreatedBy"], + genderDescription: json["GenderDescription"], + healthIdFromNhicViaVida: json["HealthIDFromNHICViaVida"], + ir: json["IR"], + isoCityId: json["ISOCityID"], + isoCountryId: json["ISOCountryID"], + isVerfiedFromNhic: json["IsVerfiedFromNHIC"], + listPrivilege: json["ListPrivilege"] == null ? [] : List.from(json["ListPrivilege"]!.map((x) => ListPrivilege.fromJson(x))), + marital: json["Marital"], + occupationId: json["OccupationID"], + outSa: json["OutSA"], + poBox: json["POBox"], + receiveHealthSummaryReport: json["ReceiveHealthSummaryReport"], + sourceType: json["SourceType"], + strDateofBirth: json["StrDateofBirth"], + tempAddress: json["TempAddress"], + zipCode: json["ZipCode"], + eHealthIdField: json["eHealthIDField"], + listPatientPayType: json["patientPayType"], + listPatientType: json["patientType"], + listStatus: json["status"], + ); + + Map toJson() => { + "SetupID": setupId, + "PatientType": patientType, + "PatientID": patientId, + "FirstName": firstName, + "MiddleName": middleName, + "LastName": lastName, + "FirstNameN": firstNameN, + "MiddleNameN": middleNameN, + "LastNameN": lastNameN, + "RelationshipID": relationshipId, + "Gender": gender, + "DateofBirth": dateofBirth, + "DateofBirthN": dateofBirthN, + "NationalityID": nationalityId, + "PhoneResi": phoneResi, + "PhoneOffice": phoneOffice, + "MobileNumber": mobileNumber, + "FaxNumber": faxNumber, + "EmailAddress": emailAddress, + "BloodGroup": bloodGroup, + "RHFactor": rhFactor, + "IsEmailAlertRequired": isEmailAlertRequired, + "IsSMSAlertRequired": isSmsAlertRequired, + "PreferredLanguage": preferredLanguage, + "IsPrivilegedMember": isPrivilegedMember, + "MemberID": memberId, + "ExpiryDate": expiryDate, + "IsHmgEmployee": isHmgEmployee, + "EmployeeID": employeeId, + "EmergencyContactName": emergencyContactName, + "EmergencyContactNo": emergencyContactNo, + "PatientPayType": patientPayType, + "DHCCPatientRefID": dhccPatientRefId, + "IsPatientDummy": isPatientDummy, + "Status": status, + "IsStatusCleared": isStatusCleared, + "PatientIdentificationType": patientIdentificationType, + "PatientIdentificationNo": patientIdentificationNo, + "ProjectID": projectId, + "InfoSourceID": infoSourceId, + "Address": address, + "Age": age, + "AgeDesc": ageDesc, + "AreaID": areaId, + "CRSVerificationStatus": crsVerificationStatus, + "CRSVerificationStatusDesc": crsVerificationStatusDesc, + "CRSVerificationStatusDescN": crsVerificationStatusDescN, + "CreatedBy": createdBy, + "GenderDescription": genderDescription, + "HealthIDFromNHICViaVida": healthIdFromNhicViaVida, + "IR": ir, + "ISOCityID": isoCityId, + "ISOCountryID": isoCountryId, + "IsVerfiedFromNHIC": isVerfiedFromNhic, + "ListPrivilege": listPrivilege == null ? [] : List.from(listPrivilege!.map((x) => x.toJson())), + "Marital": marital, + "OccupationID": occupationId, + "OutSA": outSa, + "POBox": poBox, + "ReceiveHealthSummaryReport": receiveHealthSummaryReport, + "SourceType": sourceType, + "StrDateofBirth": strDateofBirth, + "TempAddress": tempAddress, + "ZipCode": zipCode, + "eHealthIDField": eHealthIdField, + "patientPayType": listPatientPayType, + "patientType": listPatientType, + "status": listStatus, + }; +} diff --git a/lib/features/authentication/models/resp_models/check_user_staus_nhic_response_model.dart b/lib/features/authentication/models/resp_models/check_user_staus_nhic_response_model.dart new file mode 100644 index 0000000..bd5323d --- /dev/null +++ b/lib/features/authentication/models/resp_models/check_user_staus_nhic_response_model.dart @@ -0,0 +1,381 @@ +import 'dart:convert'; + +class CheckUserStatusResponseNHIC { + dynamic date; + int? languageId; + int? serviceName; + dynamic time; + dynamic androidLink; + dynamic authenticationTokenId; + dynamic data; + bool? dataw; + int? dietType; + int? dietTypeId; + dynamic errorCode; + dynamic errorEndUserMessage; + dynamic errorEndUserMessageN; + dynamic errorMessage; + int? errorStatusCode; + int? errorType; + int? foodCategory; + dynamic iosLink; + bool? isAuthenticated; + int? mealOrderStatus; + int? mealType; + int? messageStatus; + int? numberOfResultRecords; + dynamic patientBlodType; + dynamic successMsg; + dynamic successMsgN; + dynamic vidaUpdatedResponse; + dynamic accessTokenObject; + int? age; + dynamic clientIdentifierId; + int? createdBy; + String? dateOfBirth; + String? firstNameAr; + String? firstNameEn; + String? gender; + dynamic genderAr; + dynamic genderEn; + String? healthId; + String? idNumber; + String? idType; + bool? isHijri; + int? isInstertedOrUpdated; + int? isNull; + int? isPatientExistNhic; + bool? isRecordLockedByCurrentUser; + String? lastNameAr; + String? lastNameEn; + dynamic listActiveAccessToken; + String? maritalStatus; + String? maritalStatusCode; + String? nationalDateOfBirth; + String? nationality; + String? nationalityCode; + String? occupation; + dynamic pcdTransactionDataResultList; + dynamic pcdGetVidaPatientForManualVerificationList; + dynamic pcdNhicHmgPatientDetailsMatchCalulationList; + int? pcdReturnValue; + dynamic patientStatus; + String? placeofBirth; + dynamic practitionerStatusCode; + dynamic practitionerStatusDescAr; + dynamic practitionerStatusDescEn; + int? rowCount; + String? secondNameAr; + String? secondNameEn; + String? thirdNameAr; + String? thirdNameEn; + dynamic yakeenDoctorDataGetSourceList; + dynamic yakeenVidaPatientDataStatisticsByPatientIdList; + dynamic yakeenVidaPatientDataStatisticsList; + dynamic yakeenVidaPatientDataStatisticsPrefferedList; + dynamic accessToken; + int? categoryCode; + dynamic categoryNameAr; + dynamic categoryNameEn; + int? constraintCode; + dynamic constraintNameAr; + dynamic constraintNameEn; + dynamic content; + dynamic errorList; + dynamic licenseExpiryDate; + dynamic licenseIssuedDate; + dynamic licenseStatusCode; + dynamic licenseStatusDescAr; + dynamic licenseStatusDescEn; + dynamic organizations; + dynamic registrationNumber; + int? specialtyCode; + dynamic specialtyNameAr; + dynamic specialtyNameEn; + + CheckUserStatusResponseNHIC({ + this.date, + this.languageId, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenId, + this.data, + this.dataw, + this.dietType, + this.dietTypeId, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorStatusCode, + this.errorType, + this.foodCategory, + this.iosLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.vidaUpdatedResponse, + this.accessTokenObject, + this.age, + this.clientIdentifierId, + this.createdBy, + this.dateOfBirth, + this.firstNameAr, + this.firstNameEn, + this.gender, + this.genderAr, + this.genderEn, + this.healthId, + this.idNumber, + this.idType, + this.isHijri, + this.isInstertedOrUpdated, + this.isNull, + this.isPatientExistNhic, + this.isRecordLockedByCurrentUser, + this.lastNameAr, + this.lastNameEn, + this.listActiveAccessToken, + this.maritalStatus, + this.maritalStatusCode, + this.nationalDateOfBirth, + this.nationality, + this.nationalityCode, + this.occupation, + this.pcdTransactionDataResultList, + this.pcdGetVidaPatientForManualVerificationList, + this.pcdNhicHmgPatientDetailsMatchCalulationList, + this.pcdReturnValue, + this.patientStatus, + this.placeofBirth, + this.practitionerStatusCode, + this.practitionerStatusDescAr, + this.practitionerStatusDescEn, + this.rowCount, + this.secondNameAr, + this.secondNameEn, + this.thirdNameAr, + this.thirdNameEn, + this.yakeenDoctorDataGetSourceList, + this.yakeenVidaPatientDataStatisticsByPatientIdList, + this.yakeenVidaPatientDataStatisticsList, + this.yakeenVidaPatientDataStatisticsPrefferedList, + this.accessToken, + this.categoryCode, + this.categoryNameAr, + this.categoryNameEn, + this.constraintCode, + this.constraintNameAr, + this.constraintNameEn, + this.content, + this.errorList, + this.licenseExpiryDate, + this.licenseIssuedDate, + this.licenseStatusCode, + this.licenseStatusDescAr, + this.licenseStatusDescEn, + this.organizations, + this.registrationNumber, + this.specialtyCode, + this.specialtyNameAr, + this.specialtyNameEn, + }); + + factory CheckUserStatusResponseNHIC.fromRawJson(String str) => CheckUserStatusResponseNHIC.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory CheckUserStatusResponseNHIC.fromJson(Map json) => CheckUserStatusResponseNHIC( + date: json["Date"], + languageId: json["LanguageID"], + serviceName: json["ServiceName"], + time: json["Time"], + androidLink: json["AndroidLink"], + authenticationTokenId: json["AuthenticationTokenID"], + data: json["Data"], + dataw: json["Dataw"], + dietType: json["DietType"], + dietTypeId: json["DietTypeID"], + errorCode: json["ErrorCode"], + errorEndUserMessage: json["ErrorEndUserMessage"], + errorEndUserMessageN: json["ErrorEndUserMessageN"], + errorMessage: json["ErrorMessage"], + errorStatusCode: json["ErrorStatusCode"], + errorType: json["ErrorType"], + foodCategory: json["FoodCategory"], + iosLink: json["IOSLink"], + isAuthenticated: json["IsAuthenticated"], + mealOrderStatus: json["MealOrderStatus"], + mealType: json["MealType"], + messageStatus: json["MessageStatus"], + numberOfResultRecords: json["NumberOfResultRecords"], + patientBlodType: json["PatientBlodType"], + successMsg: json["SuccessMsg"], + successMsgN: json["SuccessMsgN"], + vidaUpdatedResponse: json["VidaUpdatedResponse"], + accessTokenObject: json["AccessTokenObject"], + age: json["Age"], + clientIdentifierId: json["ClientIdentifierId"], + createdBy: json["CreatedBy"], + dateOfBirth: json["DateOfBirth"], + firstNameAr: json["FirstNameAr"], + firstNameEn: json["FirstNameEn"], + gender: json["Gender"], + genderAr: json["GenderAr"], + genderEn: json["GenderEn"], + healthId: json["HealthId"], + idNumber: json["IdNumber"], + idType: json["IdType"], + isHijri: json["IsHijri"], + isInstertedOrUpdated: json["IsInstertedOrUpdated"], + isNull: json["IsNull"], + isPatientExistNhic: json["IsPatientExistNHIC"], + isRecordLockedByCurrentUser: json["IsRecordLockedByCurrentUser"], + lastNameAr: json["LastNameAr"], + lastNameEn: json["LastNameEn"], + listActiveAccessToken: json["List_ActiveAccessToken"], + maritalStatus: json["MaritalStatus"], + maritalStatusCode: json["MaritalStatusCode"], + nationalDateOfBirth: json["NationalDateOfBirth"], + nationality: json["Nationality"], + nationalityCode: json["NationalityCode"], + occupation: json["Occupation"], + pcdTransactionDataResultList: json["PCDTransactionDataResultList"], + pcdGetVidaPatientForManualVerificationList: json["PCD_GetVidaPatientForManualVerificationList"], + pcdNhicHmgPatientDetailsMatchCalulationList: json["PCD_NHIC_HMG_PatientDetailsMatchCalulationList"], + pcdReturnValue: json["PCD_ReturnValue"], + patientStatus: json["PatientStatus"], + placeofBirth: json["PlaceofBirth"], + practitionerStatusCode: json["PractitionerStatusCode"], + practitionerStatusDescAr: json["PractitionerStatusDescAr"], + practitionerStatusDescEn: json["PractitionerStatusDescEn"], + rowCount: json["RowCount"], + secondNameAr: json["SecondNameAr"], + secondNameEn: json["SecondNameEn"], + thirdNameAr: json["ThirdNameAr"], + thirdNameEn: json["ThirdNameEn"], + yakeenDoctorDataGetSourceList: json["YakeenDoctorData_GetSourceList"], + yakeenVidaPatientDataStatisticsByPatientIdList: json["YakeenVidaPatientDataStatisticsByPatientIdList"], + yakeenVidaPatientDataStatisticsList: json["YakeenVidaPatientDataStatisticsList"], + yakeenVidaPatientDataStatisticsPrefferedList: json["YakeenVidaPatientDataStatisticsPrefferedList"], + accessToken: json["accessToken"], + categoryCode: json["categoryCode"], + categoryNameAr: json["categoryNameAr"], + categoryNameEn: json["categoryNameEn"], + constraintCode: json["constraintCode"], + constraintNameAr: json["constraintNameAr"], + constraintNameEn: json["constraintNameEn"], + content: json["content"], + errorList: json["errorList"], + licenseExpiryDate: json["licenseExpiryDate"], + licenseIssuedDate: json["licenseIssuedDate"], + licenseStatusCode: json["licenseStatusCode"], + licenseStatusDescAr: json["licenseStatusDescAr"], + licenseStatusDescEn: json["licenseStatusDescEn"], + organizations: json["organizations"], + registrationNumber: json["registrationNumber"], + specialtyCode: json["specialtyCode"], + specialtyNameAr: json["specialtyNameAr"], + specialtyNameEn: json["specialtyNameEn"], + ); + + Map toJson() => { + "Date": date, + "LanguageID": languageId, + "ServiceName": serviceName, + "Time": time, + "AndroidLink": androidLink, + "AuthenticationTokenID": authenticationTokenId, + "Data": data, + "Dataw": dataw, + "DietType": dietType, + "DietTypeID": dietTypeId, + "ErrorCode": errorCode, + "ErrorEndUserMessage": errorEndUserMessage, + "ErrorEndUserMessageN": errorEndUserMessageN, + "ErrorMessage": errorMessage, + "ErrorStatusCode": errorStatusCode, + "ErrorType": errorType, + "FoodCategory": foodCategory, + "IOSLink": iosLink, + "IsAuthenticated": isAuthenticated, + "MealOrderStatus": mealOrderStatus, + "MealType": mealType, + "MessageStatus": messageStatus, + "NumberOfResultRecords": numberOfResultRecords, + "PatientBlodType": patientBlodType, + "SuccessMsg": successMsg, + "SuccessMsgN": successMsgN, + "VidaUpdatedResponse": vidaUpdatedResponse, + "AccessTokenObject": accessTokenObject, + "Age": age, + "ClientIdentifierId": clientIdentifierId, + "CreatedBy": createdBy, + "DateOfBirth": dateOfBirth, + "FirstNameAr": firstNameAr, + "FirstNameEn": firstNameEn, + "Gender": gender, + "GenderAr": genderAr, + "GenderEn": genderEn, + "HealthId": healthId, + "IdNumber": idNumber, + "IdType": idType, + "IsHijri": isHijri, + "IsInstertedOrUpdated": isInstertedOrUpdated, + "IsNull": isNull, + "IsPatientExistNHIC": isPatientExistNhic, + "IsRecordLockedByCurrentUser": isRecordLockedByCurrentUser, + "LastNameAr": lastNameAr, + "LastNameEn": lastNameEn, + "List_ActiveAccessToken": listActiveAccessToken, + "MaritalStatus": maritalStatus, + "MaritalStatusCode": maritalStatusCode, + "NationalDateOfBirth": nationalDateOfBirth, + "Nationality": nationality, + "NationalityCode": nationalityCode, + "Occupation": occupation, + "PCDTransactionDataResultList": pcdTransactionDataResultList, + "PCD_GetVidaPatientForManualVerificationList": pcdGetVidaPatientForManualVerificationList, + "PCD_NHIC_HMG_PatientDetailsMatchCalulationList": pcdNhicHmgPatientDetailsMatchCalulationList, + "PCD_ReturnValue": pcdReturnValue, + "PatientStatus": patientStatus, + "PlaceofBirth": placeofBirth, + "PractitionerStatusCode": practitionerStatusCode, + "PractitionerStatusDescAr": practitionerStatusDescAr, + "PractitionerStatusDescEn": practitionerStatusDescEn, + "RowCount": rowCount, + "SecondNameAr": secondNameAr, + "SecondNameEn": secondNameEn, + "ThirdNameAr": thirdNameAr, + "ThirdNameEn": thirdNameEn, + "YakeenDoctorData_GetSourceList": yakeenDoctorDataGetSourceList, + "YakeenVidaPatientDataStatisticsByPatientIdList": yakeenVidaPatientDataStatisticsByPatientIdList, + "YakeenVidaPatientDataStatisticsList": yakeenVidaPatientDataStatisticsList, + "YakeenVidaPatientDataStatisticsPrefferedList": yakeenVidaPatientDataStatisticsPrefferedList, + "accessToken": accessToken, + "categoryCode": categoryCode, + "categoryNameAr": categoryNameAr, + "categoryNameEn": categoryNameEn, + "constraintCode": constraintCode, + "constraintNameAr": constraintNameAr, + "constraintNameEn": constraintNameEn, + "content": content, + "errorList": errorList, + "licenseExpiryDate": licenseExpiryDate, + "licenseIssuedDate": licenseIssuedDate, + "licenseStatusCode": licenseStatusCode, + "licenseStatusDescAr": licenseStatusDescAr, + "licenseStatusDescEn": licenseStatusDescEn, + "organizations": organizations, + "registrationNumber": registrationNumber, + "specialtyCode": specialtyCode, + "specialtyNameAr": specialtyNameAr, + "specialtyNameEn": specialtyNameEn, + }; +} diff --git a/lib/features/authentication/models/resp_models/get_patient_last_login_details_response_model.dart b/lib/features/authentication/models/resp_models/get_patient_last_login_details_response_model.dart new file mode 100644 index 0000000..ce48dd4 --- /dev/null +++ b/lib/features/authentication/models/resp_models/get_patient_last_login_details_response_model.dart @@ -0,0 +1,68 @@ +class GetPatientLastLoginDetailsResponseModel { + int? iD; + String? iMEI; + int? logInType; + int? patientID; + bool? outSA; + String? mobile; + String? identificationNo; + String? name; + String? nameN; + String? createdOn; + String? editedOn; + bool? biometricEnabled; + int? patientType; + int? preferredLanguage; + + GetPatientLastLoginDetailsResponseModel( + {this.iD, + this.iMEI, + this.logInType, + this.patientID, + this.outSA, + this.mobile, + this.identificationNo, + this.name, + this.nameN, + this.createdOn, + this.editedOn, + this.biometricEnabled, + this.patientType, + this.preferredLanguage}); + + GetPatientLastLoginDetailsResponseModel.fromJson(Map json) { + iD = json['ID']; + iMEI = json['IMEI']; + logInType = json['LogInType']; + patientID = json['PatientID']; + outSA = json['OutSA']; + mobile = json['Mobile']; + identificationNo = json['IdentificationNo']; + name = json['Name']; + nameN = json['NameN']; + createdOn = json['CreatedOn']; + editedOn = json['EditedOn']; + biometricEnabled = json['BiometricEnabled']; + patientType = json['PatientType']; + preferredLanguage = json['PreferredLanguage']; + } + + Map toJson() { + final Map data = {}; + data['ID'] = iD; + data['IMEI'] = iMEI; + data['LogInType'] = logInType; + data['PatientID'] = patientID; + data['OutSA'] = outSA; + data['Mobile'] = mobile; + data['IdentificationNo'] = identificationNo; + data['Name'] = name; + data['NameN'] = nameN; + data['CreatedOn'] = createdOn; + data['EditedOn'] = editedOn; + data['BiometricEnabled'] = biometricEnabled; + data['PatientType'] = patientType; + data['PreferredLanguage'] = preferredLanguage; + return data; + } +} diff --git a/lib/features/authentication/models/resp_models/select_device_by_imei.dart b/lib/features/authentication/models/resp_models/select_device_by_imei.dart new file mode 100644 index 0000000..398f791 --- /dev/null +++ b/lib/features/authentication/models/resp_models/select_device_by_imei.dart @@ -0,0 +1,73 @@ +import 'dart:convert'; + +Map selectDeviceByImeiRespModelFromJson(String str) => Map.from(json.decode(str)); + +String selectDeviceByImeiRespModelToJson(Map data) => json.encode(Map.from(data)); + +class SelectDeviceByImeiRespModelElement { + int? id; + String? imei; + int? logInType; + int? patientId; + bool? outSa; + String? mobile; + String? identificationNo; + String? name; + String? nameN; + String? createdOn; + String? editedOn; + bool? biometricEnabled; + int? patientType; + int? preferredLanguage; + + SelectDeviceByImeiRespModelElement({ + this.id, + this.imei, + this.logInType, + this.patientId, + this.outSa, + this.mobile, + this.identificationNo, + this.name, + this.nameN, + this.createdOn, + this.editedOn, + this.biometricEnabled, + this.patientType, + this.preferredLanguage, + }); + + factory SelectDeviceByImeiRespModelElement.fromJson(Map json) => SelectDeviceByImeiRespModelElement( + id: json["ID"] as int?, + imei: json["IMEI"] as String?, + logInType: json["LogInType"] as int?, + patientId: json["PatientID"] as int?, + outSa: json["OutSA"] as bool?, + mobile: json["Mobile"] as String?, + identificationNo: json["IdentificationNo"] as String?, + name: json["Name"] as String?, + nameN: json["NameN"] as String?, + createdOn: json["CreatedOn"] as String?, + editedOn: json["EditedOn"] as String?, + biometricEnabled: json["BiometricEnabled"] as bool?, + patientType: json["PatientType"] as int?, + preferredLanguage: json["PreferredLanguage"] as int?, + ); + + Map toJson() => { + "ID": id, + "IMEI": imei, + "LogInType": logInType, + "PatientID": patientId, + "OutSA": outSa, + "Mobile": mobile, + "IdentificationNo": identificationNo, + "Name": name, + "NameN": nameN, + "CreatedOn": createdOn, + "EditedOn": editedOn, + "BiometricEnabled": biometricEnabled, + "PatientType": patientType, + "PreferredLanguage": preferredLanguage, + }; +} diff --git a/lib/features/authentication/widgets/otp_verification_screen.dart b/lib/features/authentication/widgets/otp_verification_screen.dart new file mode 100644 index 0000000..e33222c --- /dev/null +++ b/lib/features/authentication/widgets/otp_verification_screen.dart @@ -0,0 +1,636 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get_it/get_it.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/services/cache_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/app_bar_widget.dart'; +import 'package:provider/provider.dart'; +import 'package:sms_otp_auto_verify/sms_otp_auto_verify.dart'; + +typedef OnDone = void Function(String text); + +class ProvidedPinBoxTextAnimation { + static AnimatedSwitcherTransitionBuilder scalingTransition = (child, animation) { + return ScaleTransition( + scale: animation, + child: child, + ); + }; + + static AnimatedSwitcherTransitionBuilder defaultNoTransition = (Widget child, Animation animation) { + return child; + }; +} + +class OTPWidget extends StatefulWidget { + final int maxLength; + final TextEditingController? controller; + + final Color defaultBorderColor; + final Color pinBoxColor; + final double pinBoxBorderWidth; + final double pinBoxRadius; + final bool hideDefaultKeyboard; + + final TextStyle? pinTextStyle; + final double pinBoxHeight; + final double pinBoxWidth; + final OnDone? onDone; + final bool hasError; + final Color errorBorderColor; + final Color textBorderColor; + final Function(String)? onTextChanged; + final bool autoFocus; + final FocusNode? focusNode; + final AnimatedSwitcherTransitionBuilder? pinTextAnimatedSwitcherTransition; + final Duration pinTextAnimatedSwitcherDuration; + + // final TextDirection textDirection; + final TextInputType keyboardType; + final EdgeInsets pinBoxOuterPadding; + + const OTPWidget({ + super.key, + this.maxLength = 4, + this.controller, + this.pinBoxWidth = 70.0, + this.pinBoxHeight = 100.0, + this.pinTextStyle, + this.onDone, + this.defaultBorderColor = Colors.black, + this.textBorderColor = Colors.black, + this.pinTextAnimatedSwitcherTransition, + this.pinTextAnimatedSwitcherDuration = const Duration(), + this.hasError = false, + this.errorBorderColor = Colors.red, + this.onTextChanged, + this.autoFocus = false, + this.focusNode, + this.keyboardType = TextInputType.number, + this.pinBoxOuterPadding = const EdgeInsets.symmetric(horizontal: 4.0), + this.pinBoxColor = Colors.white, + this.pinBoxBorderWidth = 2.0, + this.pinBoxRadius = 0, + this.hideDefaultKeyboard = false, + }); + + @override + State createState() { + return OTPWidgetState(); + } +} + +class OTPWidgetState extends State with SingleTickerProviderStateMixin { + late AnimationController _highlightAnimationController; + late FocusNode focusNode; + String text = ""; + int currentIndex = 0; + List strList = []; + bool hasFocus = false; + AuthenticationViewModel? authVm; + + final CacheService cacheService = GetIt.instance(); + + @override + void didUpdateWidget(OTPWidget oldWidget) { + super.didUpdateWidget(oldWidget); + focusNode = widget.focusNode ?? focusNode; + + if (oldWidget.maxLength < widget.maxLength) { + setState(() { + currentIndex = text.length; + }); + widget.controller?.text = text; + widget.controller?.selection = TextSelection.collapsed(offset: text.length); + } else if (oldWidget.maxLength > widget.maxLength && widget.maxLength > 0 && text.isNotEmpty && text.length > widget.maxLength) { + setState(() { + text = text.substring(0, widget.maxLength); + currentIndex = text.length; + }); + widget.controller?.text = text; + widget.controller?.selection = TextSelection.collapsed(offset: text.length); + } + } + + _calculateStrList() { + if (strList.length > widget.maxLength) { + strList.length = widget.maxLength; + } + while (strList.length < widget.maxLength) { + strList.add(""); + } + } + + @override + void initState() { + super.initState(); + authVm = context.read(); + focusNode = widget.focusNode ?? FocusNode(); + _highlightAnimationController = AnimationController(vsync: this); + _initTextController(); + _calculateStrList(); + if (widget.controller != null) { + widget.controller!.addListener(_controllerListener); + } + focusNode.addListener(_focusListener); + authVm?.otpScreenNotifier.addListener(_onOtpScreenNotifierChanged); + cacheService.remove(key: CacheConst.quickLoginEnabled); + } + + void _controllerListener() { + if (mounted == true) { + setState(() { + _initTextController(); + text = widget.controller?.text ?? ""; + currentIndex = text.length; + }); + var onTextChanged = widget.onTextChanged; + if (onTextChanged != null) { + onTextChanged(widget.controller?.text ?? ""); + } + } + } + + void _focusListener() { + if (mounted == true) { + setState(() { + hasFocus = focusNode.hasFocus; + }); + } + } + + void onWrongOtpClear() { + if (mounted) { + setState(() { + text = ""; + currentIndex = 0; + strList.clear(); + _calculateStrList(); + }); + + // Clear the controller if it exists + if (widget.controller != null) { + widget.controller!.clear(); + } + + if (focusNode.hasFocus) { + focusNode.unfocus(); + } + } + } + + void _onOtpScreenNotifierChanged() { + if (authVm?.otpScreenNotifier.value == true) { + onWrongOtpClear(); + authVm?.otpScreenNotifier.value = false; + } + } + + void _initTextController() { + if (widget.controller == null) { + return; + } + strList.clear(); + var text = widget.controller?.text ?? ""; + if (text.isNotEmpty) { + if (text.length > widget.maxLength) { + throw Exception("TextEditingController length exceeded maxLength!"); + } + } + for (var i = 0; i < text.length; i++) { + strList.add(text[i]); + } + } + + double get _width { + var width = 0.0; + for (var i = 0; i < widget.maxLength; i++) { + width += widget.pinBoxWidth; + if (i == 0) { + width += widget.pinBoxOuterPadding.left; + } else if (i + 1 == widget.maxLength) { + width += widget.pinBoxOuterPadding.right; + } else { + width += widget.pinBoxOuterPadding.left; + } + } + return width; + } + + @override + void dispose() { + if (widget.focusNode == null) { + focusNode.dispose(); + } else { + focusNode.removeListener(_focusListener); + } + _highlightAnimationController.dispose(); + if (widget.controller != null) { + widget.controller!.removeListener(_controllerListener); + } + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + _otpTextInput(), + _touchPinBoxRow(), + ], + ); + } + + Widget _touchPinBoxRow() { + return widget.hideDefaultKeyboard + ? _pinBoxRow(context) + : GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + if (hasFocus) { + FocusScope.of(context).requestFocus(FocusNode()); + Future.delayed(Duration(milliseconds: 100), () { + FocusScope.of(context).requestFocus(focusNode); + }); + } else { + FocusScope.of(context).requestFocus(focusNode); + } + }, + child: _pinBoxRow(context), + ); + } + + Widget _otpTextInput() { + var transparentBorder = OutlineInputBorder( + borderSide: BorderSide( + color: Colors.transparent, + width: 0.0, + ), + ); + return SizedBox( + width: _width, + height: widget.pinBoxHeight, + child: TextField( + autofocus: !kIsWeb ? widget.autoFocus : false, + enableInteractiveSelection: false, + focusNode: focusNode, + controller: widget.controller, + keyboardType: widget.keyboardType, + inputFormatters: widget.keyboardType == TextInputType.number ? [FilteringTextInputFormatter.digitsOnly] : null, + style: TextStyle(height: 0.1, color: Colors.transparent), + decoration: InputDecoration( + contentPadding: EdgeInsets.all(0), + focusedErrorBorder: transparentBorder, + errorBorder: transparentBorder, + disabledBorder: transparentBorder, + enabledBorder: transparentBorder, + focusedBorder: transparentBorder, + counterText: null, + counterStyle: null, + helperStyle: TextStyle(height: 0.0, color: Colors.transparent), + labelStyle: TextStyle(height: 0.1), + fillColor: Colors.transparent, + border: InputBorder.none, + ), + cursorColor: Colors.transparent, + showCursor: false, + maxLength: widget.maxLength, + onChanged: _onTextChanged, + ), + ); + } + + void _onTextChanged(text) { + var onTextChanged = widget.onTextChanged; + if (onTextChanged != null) { + onTextChanged(text); + } + setState(() { + this.text = text; + if (text.length >= currentIndex) { + for (int i = currentIndex; i < text.length; i++) { + strList[i] = text[i]; + } + } + currentIndex = text.length; + }); + if (text.length == widget.maxLength) { + FocusScope.of(context).requestFocus(FocusNode()); + var onDone = widget.onDone; + if (onDone != null) { + onDone(text); + } + } + } + + Widget _pinBoxRow(BuildContext context) { + _calculateStrList(); + List pinCodes = List.generate(widget.maxLength, (int i) { + return _buildPinCode(i, context); + }); + return Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: pinCodes, + ); + } + + Widget _buildPinCode(int i, BuildContext context) { + Color pinBoxColor; + + if (widget.hasError) { + pinBoxColor = widget.errorBorderColor; + } else if (text.length == widget.maxLength) { + pinBoxColor = AppColors.successColor; + } else if (i < text.length) { + pinBoxColor = AppColors.blackBgColor; + } else { + pinBoxColor = widget.pinBoxColor; + } + + EdgeInsets insets; + if (i == 0) { + insets = EdgeInsets.only( + left: 0, + top: widget.pinBoxOuterPadding.top, + right: widget.pinBoxOuterPadding.right, + bottom: widget.pinBoxOuterPadding.bottom, + ); + } else if (i == strList.length - 1) { + insets = EdgeInsets.only( + left: widget.pinBoxOuterPadding.left, + top: widget.pinBoxOuterPadding.top, + right: 0, + bottom: widget.pinBoxOuterPadding.bottom, + ); + } else { + insets = widget.pinBoxOuterPadding; + } + + return AnimatedContainer( + duration: const Duration(milliseconds: 200), + curve: Curves.easeInOut, + key: ValueKey("container$i"), + alignment: Alignment.center, + padding: EdgeInsets.symmetric(vertical: 4.0, horizontal: 1.0), + margin: insets, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: pinBoxColor, + borderRadius: widget.pinBoxRadius, + ), + width: widget.pinBoxWidth, + height: widget.pinBoxHeight, + child: _animatedTextBox(strList[i], i), + ); + } + + Widget _animatedTextBox(String text, int i) { + if (widget.pinTextAnimatedSwitcherTransition != null) { + return AnimatedSwitcher( + duration: widget.pinTextAnimatedSwitcherDuration, + transitionBuilder: widget.pinTextAnimatedSwitcherTransition ?? + (Widget child, Animation animation) { + return child; + }, + child: Text( + text, + key: ValueKey("$text$i"), + style: widget.pinTextStyle, + ), + ); + } else { + return Text( + text, + key: ValueKey("${strList[i]}$i"), + style: widget.pinTextStyle, + ); + } + } +} + +class OTPVerificationScreen extends StatefulWidget { + final String phoneNumber; + final Function(int code) checkActivationCode; + final Function(String phoneNumber) onResendOTPPressed; + final bool isFormFamilyFile; + + const OTPVerificationScreen( + {super.key, required this.phoneNumber, required this.checkActivationCode, required this.onResendOTPPressed, required this.isFormFamilyFile}); + + @override + State createState() => _OTPVerificationScreenState(); +} + +class _OTPVerificationScreenState extends State { + final int _otpLength = 4; + late final TextEditingController _otpController; + + Timer? _resendTimer; + int _resendTime = 120; + bool _isOtpComplete = false; + bool _isVerifying = false; + + @override + void initState() { + super.initState(); + _otpController = TextEditingController(); + _startResendTimer(); + checkSignature(); + } + + @override + void dispose() { + _otpController.dispose(); + _resendTimer?.cancel(); + super.dispose(); + } + + void _startResendTimer() { + _resendTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (_resendTime > 0) { + setState(() => _resendTime--); + } else { + timer.cancel(); + } + }); + } + + void _onOtpChanged(String value) { + setState(() { + _isOtpComplete = value.length == _otpLength; + }); + + if (_isOtpComplete && !_isVerifying) { + _isVerifying = true; + _verifyOtp(value); + } else if (!_isOtpComplete) { + // Reset the flag when OTP is incomplete (user is editing) + _isVerifying = false; + } + } + + void checkSignature() async { + SmsVerification.startListeningSms().then((message) { + final intRegex = RegExp(r'\d+', multiLine: true); + var otp = SmsVerification.getCode(message, intRegex); + if (otp != null && otp.length == _otpLength) { + autoFillOtp(otp); // Use autoFillOtp to update controller and UI + } + SmsVerification.stopListening(); + }); + } + + void _onAutoOtpChanged(String value) { + setState(() { + _isOtpComplete = value.length == _otpLength; + }); + + if (_isOtpComplete && !_isVerifying) { + _isVerifying = true; + _verifyOtp(value); + } else if (!_isOtpComplete) { + _isVerifying = false; + } + } + + void _resendOtp() { + if (_resendTime == 0) { + setState(() { + _resendTime = 120; + _isVerifying = false; + _isOtpComplete = false; + }); + _otpController.clear(); + _startResendTimer(); + widget.onResendOTPPressed(widget.phoneNumber); + } + } + + String _getMaskedPhoneNumber() { + final phone = widget.phoneNumber; + return phone.length > 4 ? '05xxxxxx${phone.substring(phone.length - 2)}' : phone; + } + + @override + Widget build(BuildContext context) { + AuthenticationViewModel authVM = context.read(); + AppState appState = getIt(); + return Scaffold( + backgroundColor: AppColors.scaffoldBgColor, + appBar: CustomAppBar( + hideLogoAndLang: true, + onBackPressed: () { + Navigator.of(context).pop(); + }, + onLanguageChanged: (lang) {}, + ), + body: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 10.h), + LocaleKeys.otpVerification.tr().toText24(isBold: true), + SizedBox(height: 20.h), + Wrap( + spacing: 2.h, + runSpacing: 2.h, + children: [ + LocaleKeys.weHaveSendOTP.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), + _getMaskedPhoneNumber().toText15(color: AppColors.inputLabelTextColor, isBold: true), + LocaleKeys.via.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), + (widget.isFormFamilyFile ? LoginTypeEnum.sms.displayName : authVM.loginTypeEnum.displayName) + .toText15(color: AppColors.inputLabelTextColor, isBold: true, letterSpacing: -0.4), + appState.getUserRegistrationPayload.isRegister != null && appState.getUserRegistrationPayload.isRegister == true + ? LocaleKeys.forRegistrationVerification.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4) + : LocaleKeys.forLoginVerification.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), + ], + ), + + SizedBox(height: 16.h), + Center( + child: OTPWidget( + maxLength: _otpLength, + controller: _otpController, + pinBoxWidth: 70.h, + pinBoxHeight: 100.h, + pinBoxRadius: 16, + pinBoxBorderWidth: 0, + pinBoxOuterPadding: EdgeInsets.symmetric(horizontal: 4.h), + defaultBorderColor: Colors.transparent, + textBorderColor: Colors.transparent, + pinBoxColor: AppColors.whiteColor, + autoFocus: true, + onTextChanged: _onOtpChanged, + pinTextStyle: TextStyle( + fontSize: 40.f, + fontWeight: FontWeight.bold, + color: AppColors.whiteColor, + ), + ), + ), + SizedBox(height: 32.h), + + // Resend OTP + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + LocaleKeys.didntReceiveIt.tr().toText16(color: AppColors.inputLabelTextColor), + SizedBox(width: 5.h), + if (_resendTime > 0) + Builder( + builder: (context) { + final minutes = (_resendTime ~/ 60).toString().padLeft(2, '0'); + final seconds = (_resendTime % 60).toString().padLeft(2, '0'); + return Row( + children: [ + LocaleKeys.resendIn.tr().toText16(color: AppColors.inputLabelTextColor), + SizedBox(width: 2.h), + ' ($minutes:$seconds). '.toText16(color: AppColors.inputLabelTextColor) + ], + ); + }, + ) + else + GestureDetector( + onTap: _resendOtp, + child: LocaleKeys.resendOTP.tr().toText16(color: AppColors.primaryRedColor), + ), + ], + ), + ], + ), + ), + ), + ); + } + + void _verifyOtp(String otp) { + widget.checkActivationCode(int.parse(otp)); + } + + /// Auto fill OTP into text fields + void autoFillOtp(String otp) { + if (!mounted) return; + if (otp.length != _otpLength) return; + _isVerifying = false; + _otpController.text = otp; + setState(() {}); + _onOtpChanged(otp); + } +} diff --git a/lib/features/book_appointments/book_appointments_repo.dart b/lib/features/book_appointments/book_appointments_repo.dart new file mode 100644 index 0000000..8aafc9b --- /dev/null +++ b/lib/features/book_appointments/book_appointments_repo.dart @@ -0,0 +1,851 @@ +import 'dart:io'; + +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/dental_chief_complaints_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctor_profile_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_livecare_clinics_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_patient_dental_plan_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +import 'models/resp_models/laser_body_parts.dart'; + +abstract class BookAppointmentsRepo { + Future>>> getClinics(); + + Future> getProjects(); + + Future>>> getDoctorsList(int clinicID, int projectID, bool isNearest, int doctorId, String doctorName, {isContinueDentalPlan = false}); + + Future>> getDoctorProfile(int clinicID, int projectID, int doctorId, {Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>> getDoctorFreeSlots(int clinicID, int projectID, int doctorId, bool isBookingForLiveCare, {bool continueDentalPlan = false, Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>> cancelAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel}); + + Future>> insertSpecificAppointment( + {required int docID, + required int clinicID, + required int projectID, + required String selectedTime, + required String selectedDate, + required int initialSlotDuration, + required int genderID, + required int userAge, + String? procedureID, + num? testTypeEnum, + num? testProcedureEnum, + int? invoiceNumber, + int? lineItemNo, + String? invoiceNoVP, + Function(dynamic)? onSuccess, + Function(String)? onError}); + + Future>>> getProjectList(); + + Future>>> getClinicsWithRespectToClinicId(String projectID); + + Future>>> getLiveCareScheduleClinics(int age, int genderID); + + Future>>> getLiveCareDoctorsList(int serviceID, int age, int genderID, {Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>> getLiveCareDoctorFreeSlots(int clinicID, int serviceID, int projectID, int doctorId, bool isBookingForLiveCare, + {Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>> insertSpecificAppointmentForLiveCare( + {required int docID, + required int clinicID, + required int projectID, + required String selectedTime, + required String selectedDate, + required int initialSlotDuration, + required int genderID, + required int userAge, + required int serviceID, + Function(dynamic)? onSuccess, + Function(String)? onError}); + + Future>>> getPatientDentalEstimation( + {required int projectID, Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>>> getDentalChiefComplaintsList( + {required int projectID, required int clinicID, required int patientID, Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>>> getDentalChiefComplaintDoctorsList(int projectID, int chiefComplaintID, + {Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>>> getLaserClinics(int laserCategoryID, int projectID, int languageID, + {Function(dynamic)? onSuccess, Function(String)? onError}); +} + +class BookAppointmentsRepoImp implements BookAppointmentsRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + BookAppointmentsRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>>> getClinics() async { + Map mapDevice = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_CLINICS_LIST_URL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListClinicCentralized']; + // if (list == null || list.isEmpty) { + // throw Exception("lab list is empty"); + // } + + final clinicsList = list.map((item) => GetClinicsListResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: clinicsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> getProjects() { + // TODO: implement getProjects + throw UnimplementedError(); + } + + @override + Future>>> getDoctorsList(int clinicID, int projectID, bool isNearest, int doctorId, String doctorName, + {isContinueDentalPlan = false, Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = { + "ClinicID": (doctorName == "") ? clinicID : 0, + "ProjectID": projectID, + "DoctorName": doctorName, //!= null ? doctorId : 0, + "ContinueDentalPlan": isContinueDentalPlan, + "IsSearchAppointmnetByClinicID": isContinueDentalPlan ? false : true, + "isDentalAllowedBackend": clinicID == 17 ? true : isContinueDentalPlan, + "IsGetNearAppointment": isNearest, + if (isNearest) "SelectedDate": DateUtil.convertDateToString(DateTime.now()), + "License": true + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_DOCTORS_LIST_URL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['DoctorList']; + + final doctorsList = list.map((item) => DoctorsListResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: doctorsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getDoctorProfile(int clinicID, int projectID, int doctorId, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = { + "ClinicID": clinicID, + "ProjectID": projectID, + "doctorID": doctorId, + "License": true, + "IsRegistered": true, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_DOCTOR_PROFILE, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final doctorProfileList = response['DoctorProfileList']; + if (doctorProfileList == null || doctorProfileList.isEmpty) { + // throw Exception("lab list is empty"); + onError!("Doctor profile not found"); + } + + final doctorsList = DoctorsProfileResponseModel.fromJson(doctorProfileList[0]); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: doctorsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + //TODO: Implement the logic for Dental & laser clinics + @override + Future>> getDoctorFreeSlots(int clinicID, int projectID, int doctorId, bool isBookingForLiveCare, + {bool continueDentalPlan = false, Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = { + "DoctorID": doctorId, + "IsBookingForLiveCare": isBookingForLiveCare, + "ClinicID": clinicID, + "ProjectID": projectID, + "OriginalClinicID": clinicID, + "days": 0, + "isReschadual": false, + "ContinueDentalPlan": continueDentalPlan + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_DOCTOR_FREE_SLOTS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + //TODO: Handle the cases for LiveCare Schedule, Dental & Laser Clinics + @override + Future> insertSpecificAppointment( + {required int docID, + required int clinicID, + required int projectID, + required String selectedTime, + required String selectedDate, + required int initialSlotDuration, + required int genderID, + required int userAge, + String? procedureID, + num? testTypeEnum, + num? testProcedureEnum, + int? invoiceNumber, + int? lineItemNo, + String? invoiceNoVP, + Function(dynamic p1)? onSuccess, + Function(String p1)? onError}) async { + // {"AppointmentID":2016072771,"ClinicID":1485,"ProjectID":15,"CancelToReschadual":true,"EndTime":"21:15:00","StartTime":"21:00:00","DoctorID":1485,"IsForLiveCare":false,"OriginalClinicID":0,"OriginalProjectID":0,"StrAppointmentDate":"Tuesday, 16 September 2025","VersionID":19.0,"Channel":3,"IPAdress":"10.20.10.20","generalid":"Cs2020@2016$2958","PatientOutSA":0,"SessionID":"jTarYomiIEKOruN8Z4YINA==","isDentalAllowedBackend":false,"DeviceTypeID":1,"PatientID":4770714,"PatientTypeID":1,"PatientType":1,"LanguageID":2,"Latitude":24.698381,"Longitude":46.6804279,"TokenID":"jTarYomiIEKOruN8Z4YINA=="} + + Map mapDevice = { + "IsForLiveCare": false, + "ProjectID": projectID, + "ClinicID": clinicID, + "DoctorID": docID, + "StartTime": selectedTime, + "SelectedTime": selectedTime, + "EndTime": selectedTime, + "ProcedureID": procedureID, + "TestTypeEnum": testTypeEnum, + "TestProcedureEnum": testProcedureEnum, + "InitialSlotDuration": initialSlotDuration, + "StrAppointmentDate": selectedDate, + "IsVirtual": false, + "BookedBy": 102, + "VisitType": 1, + "VisitFor": 1, + "GenderID": genderID, + "Age": userAge, + "InvoiceNo": invoiceNumber, + "InvoiceNo_VP": invoiceNoVP, + "LineItemNo": lineItemNo, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + INSERT_SPECIFIC_APPOINTMENT, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final appointmentNo = response['AppointmentNo']; + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: response["ErrorEndUserMessage"], + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> cancelAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel}) async { + Map requestBody = { + "AppointmentID": patientAppointmentHistoryResponseModel.appointmentNo, + "ClinicID": patientAppointmentHistoryResponseModel.clinicID, + "ProjectID": patientAppointmentHistoryResponseModel.projectID, + "CancelToReschadual": false, + "EndTime": patientAppointmentHistoryResponseModel.endTime, + "StartTime": patientAppointmentHistoryResponseModel.startTime, + "DoctorID": patientAppointmentHistoryResponseModel.doctorID, + "IsForLiveCare": patientAppointmentHistoryResponseModel.isLiveCareAppointment, + "OriginalClinicID": patientAppointmentHistoryResponseModel.originalClinicID, + "OriginalProjectID": patientAppointmentHistoryResponseModel.originalProjectID + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + CANCEL_APPOINTMENT, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getProjectList() async { + Map request = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PROJECT_LIST, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListProject']; + + final appointmentsList = list.map((item) => HospitalsModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: appointmentsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getClinicsWithRespectToClinicId(String projectID) async { + Map mapDevice = {"ProjectID": projectID}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_CLINICS_LIST_WRT_HOSPITAL_ID_URL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListClinic']; + + final clinicsList = list.map((item) => GetClinicsListResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: clinicsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getLiveCareScheduleClinics(int age, int genderID) async { + Map mapDevice = {"Age": age, "Gender": genderID}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_LIVECARE_SCHEDULE_CLINICS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ClinicsHaveScheduleList']; + // if (list == null || list.isEmpty) { + // throw Exception("lab list is empty"); + // } + + final clinicsList = list.map((item) => GetLiveCareClinicsResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: clinicsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getLiveCareDoctorsList(int serviceID, int age, int genderID, + {Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = { + "ServiceID": serviceID, + "Age": age, + "Gender": genderID, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_LIVECARE_SCHEDULE_CLINIC_DOCTOR_LIST, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['DoctorByClinicIDList']; + + final doctorsList = list.map((item) => DoctorsListResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: doctorsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> getLiveCareDoctorFreeSlots(int clinicID, int serviceID, int projectID, int doctorId, bool isBookingForLiveCare, + {Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = { + "DoctorID": doctorId, + "IsBookingForLiveCare": true, + "ClinicID": clinicID, + "ServiceID": serviceID, + "ProjectID": projectID, + "OriginalClinicID": clinicID, + "days": 50, + "isReschadual": false, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_LIVECARE_SCHEDULE_DOCTOR_TIME_SLOTS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> insertSpecificAppointmentForLiveCare( + {required int docID, + required int clinicID, + required int projectID, + required String selectedTime, + required String selectedDate, + required int initialSlotDuration, + required int genderID, + required int userAge, + required int serviceID, + Function(dynamic)? onSuccess, + Function(String)? onError}) async { + Map mapDevice = { + "IsForLiveCare": true, + "ProjectID": projectID, + "ClinicID": clinicID, + "DoctorID": docID, + "ServiceID": serviceID, + "StartTime": selectedTime, + "SelectedTime": selectedTime, + "EndTime": selectedTime, + "InitialSlotDuration": initialSlotDuration, + "StrAppointmentDate": selectedDate, + "IsVirtual": false, + "BookedBy": 102, + "VisitType": 1, + "VisitFor": 1, + "GenderID": genderID, + "Age": userAge + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + INSERT_LIVECARE_SCHEDULE_APPOINTMENT, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final appointmentNo = response['AppointmentNo']; + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: response["ErrorEndUserMessage"], + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientDentalEstimation( + {required int projectID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = { + "ProjectID": projectID, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + HAS_DENTAL_PLAN, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_IsPatientHasOnGoingEstimation']; + final estimationList = list.map((item) => PatientDentalPlanEstimationResponseModel.fromJson(item as Map)).toList().cast(); + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: estimationList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getDentalChiefComplaintsList( + {required int projectID, required int clinicID, required int patientID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = { + "PatientID": patientID, + "ClinicID": clinicID, + "ProjectID": projectID, + "isDentalAllowedBackend": true, + "ContinueDentalPlan": false, + "IsSearchAppointmnetByClinicID": false, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_DOCTORS_LIST_URL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError?.call(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_DentalChiefComplain']; + + final chiefComplaintsList = list.map((item) => DentalChiefComplaintsListResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: chiefComplaintsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getDentalChiefComplaintDoctorsList(int projectID, int chiefComplaintID, + {Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = { + "ProjectID": projectID, + "ChiefComplaintID": chiefComplaintID, + "isDentalAllowedBackend": true, + "IsPublicRequest": true, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_DENTAL_DOCTORS_LIST_URL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_DentalDoctorChiefComplaintMapping']; + + final doctorsList = list.map((item) => DoctorsListResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: doctorsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getLaserClinics(int laserCategoryID, int projectID, int languageID, {Function(dynamic p1)? onSuccess, Function(String p1)? onError}) async { + Map mapDevice = { + "LaserCategoryID": laserCategoryID, + "ProjectID": projectID, + "LanguageID": languageID, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + LASER_BODY_PARTS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['Laser_GetBodyPartsByCategoryList']; + + final doctorsList = list.map((item) => LaserBodyPart.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: doctorsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart new file mode 100644 index 0000000..f24766b --- /dev/null +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -0,0 +1,1154 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/doctor_response_mapper.dart'; +import 'package:hmg_patient_app_new/core/utils/loading_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_repo.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/LaserCategoryType.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/free_slot.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/dental_chief_complaints_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctor_profile_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_patient_dental_plan_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/laser_body_parts.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/timeslots.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; + +import 'models/resp_models/get_livecare_clinics_response_model.dart'; + +class BookAppointmentsViewModel extends ChangeNotifier { + final DialogService dialogService; + int selectedTabIndex = 0; + + bool isClinicsListLoading = false; + bool isDoctorsListLoading = false; + bool isDoctorProfileLoading = false; + bool isDoctorSearchByNameStarted = false; + + bool isLiveCareSchedule = false; + + int initialSlotDuration = 0; + + LocationUtils locationUtils; + + List clinicsList = []; + List _filteredClinicsList = []; + + List liveCareClinicsList = []; + + List get filteredClinicsList => _filteredClinicsList; + + List doctorsList = []; + List filteredDoctorList = []; + + List liveCareDoctorsList = []; + + List patientDentalPlanEstimationList = []; + List dentalChiefComplaintsList = []; + int totalTimeNeededForDentalProcedure = 0; + bool isContinueDentalPlan = false; + bool isChiefComplaintsListLoading = false; + int selectedChiefComplaintID = 0; + + GetClinicsListResponseModel selectedClinic = GetClinicsListResponseModel(); + DoctorsListResponseModel selectedDoctor = DoctorsListResponseModel(); + GetLiveCareClinicsResponseModel selectedLiveCareClinic = GetLiveCareClinicsResponseModel(); + + late DoctorsProfileResponseModel doctorsProfileResponseModel; + + List slotsList = []; + List docFreeSlots = []; + List dayEvents = []; + List nextDayEvents = []; + + String selectedAppointmentDate = ""; + String selectedAppointmentTime = ""; + + dynamic freeSlotsResponse; + + BookAppointmentsRepo bookAppointmentsRepo; + ErrorHandlerService errorHandlerService; + final NavigationService navigationService; + MyAppointmentsViewModel myAppointmentsViewModel; + + late AppState _appState; + RegionList? hospitalList; + RegionList? filteredHospitalList; + FacilitySelection currentlySelectedFacility = FacilitySelection.ALL; + bool isRegionListLoading = false; + + ///this will be used to call the clinic call when navigating from my REGION SELECTION to book appointment screen + bool shouldLoadSpecificClinic = false; + String? currentlySelectedHospitalFromRegionFlow; + + ///variables for doctor filter + List searchedRegionList = []; + List facilityList = ["hmgHospitals", "hmcMedicalClinic"]; + List searchedHospitalList = []; + List + searchedPatientDoctorAppointmentHospitalsList = []; + List searchedClinicList = []; + + PatientDoctorAppointmentList? selectedHospitalForFilters; + List? selectedFacilityForFilters = [], selectedRegionForFilters = []; + String? selectedClinicForFilters; + bool applyFilters = false; + + + ///variables for laser clinic + List femaleLaserCategory = [ + LaserCategoryType(1, 'bodyString'), + LaserCategoryType(2, 'face'), + LaserCategoryType(10,'bikini'), + LaserCategoryType(11, 'retouch'), + ]; + List maleLaserCategory =[ + LaserCategoryType(1, 'body'), + LaserCategoryType(2, 'face'), + LaserCategoryType(11, 'retouch'), + ]; + List> bodyTypes = []; + + List laserBodyPartsList = []; + List selectedBodyPartList = []; + int selectedBodyTypeIndex = 0; + int selectedCategory = 0; + bool isBodyPartsLoading = false; + int duration = 0; + + + BookAppointmentsViewModel( + {required this.bookAppointmentsRepo, required this.errorHandlerService, required this.navigationService, required this.myAppointmentsViewModel, required this.locationUtils, required this.dialogService }) { + initBookAppointmentViewModel(); + } + + void initializeFilteredList() { + _filteredClinicsList = List.from(clinicsList); + notifyListeners(); + } + + void filterClinics(String? query) { + if (query!.isEmpty) { + _filteredClinicsList = List.from(clinicsList); + } else { + _filteredClinicsList = clinicsList.where((clinic) => clinic.clinicDescription?.toLowerCase().contains(query!.toLowerCase()) ?? false).toList(); + } + notifyListeners(); + } + + initBookAppointmentViewModel() { + _appState = getIt(); + isClinicsListLoading = true; + isDoctorsListLoading = true; + isDoctorProfileLoading = true; + isLiveCareSchedule = false; + currentlySelectedHospitalFromRegionFlow = null; + clinicsList.clear(); + doctorsList.clear(); + liveCareClinicsList.clear(); + patientDentalPlanEstimationList.clear(); + dentalChiefComplaintsList.clear(); + isContinueDentalPlan = false; + isChiefComplaintsListLoading = true; + bodyTypes = [maleLaserCategory, femaleLaserCategory]; + // getLocation(); + notifyListeners(); + } + + setIsDoctorsListLoading(bool value) { + if (value) { + doctorsList.clear(); + } + isDoctorsListLoading = value; + notifyListeners(); + } + + setIsClinicsListLoading(bool value) { + if (value) { + clinicsList.clear(); + } + isClinicsListLoading = value; + // notifyListeners(); + } + + setSelectedClinic(GetClinicsListResponseModel clinic) { + selectedClinic = clinic; + notifyListeners(); + } + + setSelectedDoctor(DoctorsListResponseModel doctor) { + selectedDoctor = doctor; + notifyListeners(); + } + + setIsDoctorProfileLoading(bool value) { + isDoctorProfileLoading = value; + notifyListeners(); + } + + setIsDoctorSearchByNameStarted(bool value) { + isDoctorSearchByNameStarted = value; + notifyListeners(); + } + + setDoctorsProfile(DoctorsProfileResponseModel profile) { + doctorsProfileResponseModel = profile; + notifyListeners(); + } + + setSelectedAppointmentDateTime(String date, String time) { + selectedAppointmentDate = date; + selectedAppointmentTime = time; + notifyListeners(); + } + + setIsLiveCareSchedule(bool value) { + isLiveCareSchedule = value; + notifyListeners(); + } + + setLiveCareSelectedClinic(GetLiveCareClinicsResponseModel clinic) { + selectedLiveCareClinic = clinic; + notifyListeners(); + } + + setIsContinueDentalPlan(bool value) { + isContinueDentalPlan = value; + notifyListeners(); + } + + setIsChiefComplaintsListLoading(bool value) { + isChiefComplaintsListLoading = value; + notifyListeners(); + } + + setSelectedChiefComplaintID(int id) { + selectedChiefComplaintID = id; + notifyListeners(); + } + + void onTabChanged(int index) { + selectedTabIndex = index; + notifyListeners(); + } + + /// this function will decide which clinic api to be called + /// either api for region flow or the select clinic api + Future getClinics() async { + if (shouldLoadSpecificClinic) { + getRegionSelectedClinics(); + } else if (isLiveCareSchedule) { + getLiveCareScheduleClinics(); + } else { + getAllClinics(); + } + } + + Future getAllClinics({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await bookAppointmentsRepo.getClinics(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + clinicsList = apiResponse.data!; + isClinicsListLoading = false; + initializeFilteredList(); + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getLiveCareScheduleClinics({Function(dynamic)? onSuccess, Function(String)? onError}) async { + liveCareClinicsList.clear(); + final result = await bookAppointmentsRepo.getLiveCareScheduleClinics(_appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + liveCareClinicsList = apiResponse.data!; + isClinicsListLoading = false; + initializeFilteredList(); + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getLiveCareDoctorsList({Function(dynamic)? onSuccess, Function(String)? onError}) async { + doctorsList.clear(); + final result = + await bookAppointmentsRepo.getLiveCareDoctorsList(selectedLiveCareClinic.serviceID!, _appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!, onError: onError); + + result.fold( + (failure) async { + onError!("No doctors found for the search criteria".needTranslation); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + liveCareDoctorsList = apiResponse.data!; + isDoctorsListLoading = false; + // initializeFilteredList(); + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + //TODO: Make the API dynamic with parameters for ProjectID, isNearest, languageID, doctorId, doctorName + Future getDoctorsList({int projectID = 0, bool isNearest = false, int doctorId = 0, String doctorName = "", Function(dynamic)? onSuccess, Function(String)? onError}) async { + doctorsList.clear(); + projectID = currentlySelectedHospitalFromRegionFlow != null ? int.parse(currentlySelectedHospitalFromRegionFlow!) : projectID; + final result = await bookAppointmentsRepo.getDoctorsList(selectedClinic.clinicID ?? 0, projectID, isNearest, doctorId, doctorName, isContinueDentalPlan: isContinueDentalPlan); + + result.fold( + (failure) async { + isDoctorsListLoading = false; + + onError!("No doctors found for the search criteria".needTranslation); + notifyListeners(); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + doctorsList = apiResponse.data!; + filteredDoctorList = doctorsList; + isDoctorsListLoading = false; + initializeFilteredList(); + clearSearchFilters(); + getFiltersFromDoctorList(); + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getMappedDoctors( + {int projectID = 0, bool isNearest = false, int doctorId = 0, String doctorName = "", isContinueDentalPlan = false, Function(dynamic)? onSuccess, Function(String)? onError}) async { + filteredHospitalList = null; + hospitalList = null; + isRegionListLoading = true; + notifyListeners(); + projectID = currentlySelectedHospitalFromRegionFlow != null ? int.parse(currentlySelectedHospitalFromRegionFlow!) : projectID; + final result = await bookAppointmentsRepo.getDoctorsList(selectedClinic.clinicID ?? 0, projectID, isNearest, doctorId, doctorName); + + result.fold( + (failure) async { + onError?.call("No doctors found for the search criteria".needTranslation); + }, + (apiResponse) async { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + var doctorList = apiResponse.data!; + hospitalList = await DoctorMapper.getMappedDoctor( + doctorList, + isArabic: _appState.isArabic(), + lat: _appState.userLat, + long: _appState.userLong, + ); + + var isLocationEnabled = (_appState.userLat != 0) && (_appState.userLong != 0); + hospitalList = await DoctorMapper.sortList(isLocationEnabled, hospitalList!); + + isRegionListLoading = false; + filteredHospitalList = hospitalList; + notifyListeners(); + } + }, + ); + } + + Future getDoctorProfile({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await bookAppointmentsRepo.getDoctorProfile(selectedDoctor.clinicID ?? 0, selectedDoctor.projectID ?? 0, selectedDoctor.doctorID ?? 0, onError: onError); + + result.fold( + (failure) async {}, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage ?? "Unknown error occurred"); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + doctorsProfileResponseModel = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getDoctorFreeSlots({bool isBookingForLiveCare = false, Function(dynamic)? onSuccess, Function(String)? onError}) async { + docFreeSlots.clear(); + DateTime date; + final DateFormat formatter = DateFormat('HH:mm'); + final DateFormat dateFormatter = DateFormat('yyyy-MM-dd'); + Map _eventsParsed; + + final result = await bookAppointmentsRepo.getDoctorFreeSlots( + selectedDoctor.clinicID ?? 0, + selectedDoctor.projectID ?? 0, + selectedDoctor.doctorID ?? 0, + isBookingForLiveCare, + continueDentalPlan: isContinueDentalPlan, + onError: onError, + ); + + result.fold( + (failure) async { + print(failure); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage ?? "Unknown error occurred"); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + if (apiResponse.data['FreeTimeSlots'] == null || apiResponse.data['FreeTimeSlots'].isEmpty) { + onError!("No free slots available".tr()); + return; + } + initialSlotDuration = apiResponse.data["InitialSlotDuration"]; + freeSlotsResponse = apiResponse.data['FreeTimeSlots']; + freeSlotsResponse.forEach((element) { + // date = (isLiveCareSchedule != null && isLiveCareSchedule) + // ? DateUtil.convertStringToDate(element) + // : + date = DateUtil.convertStringToDateSaudiTimezone(element, int.parse(selectedDoctor.projectID.toString())); + slotsList.add(FreeSlot(date, ['slot'])); + docFreeSlots.add(TimeSlot(isoTime: formatter.format(date), start: new DateTime(date.year, date.month, date.day, 0, 0, 0, 0), end: date, vidaDate: element)); + }); + + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getLiveCareDoctorFreeSlots({bool isBookingForLiveCare = false, Function(dynamic)? onSuccess, Function(String)? onError}) async { + docFreeSlots.clear(); + DateTime date; + final DateFormat formatter = DateFormat('HH:mm'); + final DateFormat dateFormatter = DateFormat('yyyy-MM-dd'); + Map _eventsParsed; + + final result = await bookAppointmentsRepo.getLiveCareDoctorFreeSlots( + selectedDoctor.clinicID ?? 0, selectedLiveCareClinic.serviceID ?? 0, selectedDoctor.projectID ?? 0, selectedDoctor.doctorID ?? 0, isBookingForLiveCare, + onError: onError); + + result.fold( + (failure) async { + print(failure); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage ?? "Unknown error occurred"); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + if (apiResponse.data['PatientER_DoctorFreeSlots'] == null || apiResponse.data['PatientER_DoctorFreeSlots'].isEmpty) { + onError!("No free slots available".tr()); + return; + } + initialSlotDuration = apiResponse.data["InitialSlotDuration"]; + freeSlotsResponse = apiResponse.data['PatientER_DoctorFreeSlots']; + freeSlotsResponse.forEach((element) { + // date = (isLiveCareSchedule != null && isLiveCareSchedule) + // ? DateUtil.convertStringToDate(element) + // : + date = DateUtil.convertStringToDateSaudiTimezone(element, int.parse(selectedDoctor.projectID.toString())); + slotsList.add(FreeSlot(date, ['slot'])); + docFreeSlots.add(TimeSlot(isoTime: formatter.format(date), start: new DateTime(date.year, date.month, date.day, 0, 0, 0, 0), end: date, vidaDate: element)); + }); + + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future cancelAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await bookAppointmentsRepo.cancelAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + //TODO: Handle the cases for Dental & Laser Clinics + Future insertSpecificAppointment( + {String? procedureID, + num? testTypeEnum, + num? testProcedureEnum, + int? invoiceNumber, + int? lineItemNo, + String? invoiceNoVP, + Function(dynamic p1)? onSuccess, + Function(dynamic p1)? onError}) async { + _appState = getIt(); + final result = await bookAppointmentsRepo.insertSpecificAppointment( + docID: selectedDoctor.doctorID!, + clinicID: selectedDoctor.clinicID!, + projectID: selectedDoctor.projectID!, + selectedDate: selectedAppointmentDate, + selectedTime: selectedAppointmentTime, + initialSlotDuration: initialSlotDuration, + genderID: _appState.getAuthenticatedUser()!.gender!, + userAge: _appState.getAuthenticatedUser()!.age!, + onError: onError); + + result.fold( + (failure) async { + print(failure); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // onError!(apiResponse); + LoadingUtils.hideFullScreenLoader(); + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: navigationService.navigatorKey.currentContext!), + navigationService.navigatorKey.currentContext!, + child: Utils.getWarningWidget( + loadingText: apiResponse.data["ErrorEndUserMessage"], + isShowActionButtons: true, + onCancelTap: () { + navigationService.pop(); + }, + onConfirmTap: () async { + navigationService.pop(); + PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel = PatientAppointmentHistoryResponseModel( + appointmentNo: apiResponse.data["SameClinicApptList"][0]['AppointmentNo'], + clinicID: apiResponse.data["SameClinicApptList"][0]['ClinicID'], + projectID: apiResponse.data["SameClinicApptList"][0]['ProjectID'], + endDate: apiResponse.data["SameClinicApptList"][0]['EndTime'], + startTime: apiResponse.data["SameClinicApptList"][0]['StartTime'], + doctorID: apiResponse.data["SameClinicApptList"][0]['DoctorID'], + isLiveCareAppointment: apiResponse.data["SameClinicApptList"][0]['IsLiveCareAppointment'], + originalClinicID: 0, + originalProjectID: 0, + appointmentDate: apiResponse.data["SameClinicApptList"][0]['AppointmentDate'], + ); + + showCommonBottomSheet(navigationService.navigatorKey.currentContext!, + child: Utils.getLoadingWidget(loadingText: "Cancelling your previous appointment....".needTranslation), + callBackFunc: (str) {}, + title: "", + height: ResponsiveExtension.screenHeight * 0.3, + isCloseButtonVisible: false, + isDismissible: false, + isFullScreen: false); + await cancelAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel).then((val) async { + navigationService.pop(); + Future.delayed(Duration(milliseconds: 50)).then((value) async {}); + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: false, loadingText: "Booking your appointment...".needTranslation); + await insertSpecificAppointment( + onError: (err) {}, + onSuccess: (apiResp) async { + LoadingUtils.hideFullScreenLoader(); + await Future.delayed(Duration(milliseconds: 50)).then((value) async { + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: true, loadingText: LocaleKeys.appointmentSuccess.tr()); + await Future.delayed(Duration(milliseconds: 4000)).then((value) { + LoadingUtils.hideFullScreenLoader(); + Navigator.pushAndRemoveUntil( + navigationService.navigatorKey.currentContext!, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + }); + }); + }); + }); + }), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } else if (apiResponse.messageStatus == 1) { + if (apiResponse.data == null || apiResponse.data!.isEmpty) { + onError!("No free slots available".tr()); + return; + } + + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future insertSpecificAppointmentForLiveCare({Function(dynamic p1)? onSuccess, Function(dynamic p1)? onError}) async { + _appState = getIt(); + final result = await bookAppointmentsRepo.insertSpecificAppointmentForLiveCare( + docID: selectedDoctor.doctorID!, + clinicID: selectedDoctor.clinicID!, + projectID: selectedDoctor.projectID!, + serviceID: selectedLiveCareClinic.serviceID!, + selectedDate: selectedAppointmentDate, + selectedTime: selectedAppointmentTime, + initialSlotDuration: initialSlotDuration, + genderID: _appState.getAuthenticatedUser()!.gender!, + userAge: _appState.getAuthenticatedUser()!.age!, + onError: onError); + + result.fold( + (failure) async { + print(failure); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // onError!(apiResponse); + LoadingUtils.hideFullScreenLoader(); + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: navigationService.navigatorKey.currentContext!), + navigationService.navigatorKey.currentContext!, + child: Utils.getWarningWidget( + loadingText: apiResponse.data["ErrorEndUserMessage"], + isShowActionButtons: true, + onCancelTap: () { + navigationService.pop(); + }, + onConfirmTap: () async { + navigationService.pop(); + PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel = PatientAppointmentHistoryResponseModel( + appointmentNo: apiResponse.data["SameClinicApptList"][0]['AppointmentNo'], + clinicID: apiResponse.data["SameClinicApptList"][0]['ClinicID'], + projectID: apiResponse.data["SameClinicApptList"][0]['ProjectID'], + endDate: apiResponse.data["SameClinicApptList"][0]['EndTime'], + startTime: apiResponse.data["SameClinicApptList"][0]['StartTime'], + doctorID: apiResponse.data["SameClinicApptList"][0]['DoctorID'], + isLiveCareAppointment: apiResponse.data["SameClinicApptList"][0]['IsLiveCareAppointment'], + originalClinicID: 0, + originalProjectID: 0, + appointmentDate: apiResponse.data["SameClinicApptList"][0]['AppointmentDate'], + ); + + showCommonBottomSheet(navigationService.navigatorKey.currentContext!, + child: Utils.getLoadingWidget(loadingText: "Cancelling your previous appointment....".needTranslation), + callBackFunc: (str) {}, + title: "", + height: ResponsiveExtension.screenHeight * 0.3, + isCloseButtonVisible: false, + isDismissible: false, + isFullScreen: false); + await cancelAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel).then((val) async { + navigationService.pop(); + Future.delayed(Duration(milliseconds: 50)).then((value) async {}); + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: false, loadingText: "Booking your appointment...".needTranslation); + await insertSpecificAppointment( + onError: (err) {}, + onSuccess: (apiResp) async { + LoadingUtils.hideFullScreenLoader(); + await Future.delayed(Duration(milliseconds: 50)).then((value) async { + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: true, loadingText: LocaleKeys.appointmentSuccess.tr()); + await Future.delayed(Duration(milliseconds: 4000)).then((value) { + LoadingUtils.hideFullScreenLoader(); + Navigator.pushAndRemoveUntil( + navigationService.navigatorKey.currentContext!, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + }); + }); + }); + }); + }), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } else if (apiResponse.messageStatus == 1) { + if (apiResponse.data == null || apiResponse.data!.isEmpty) { + onError!("No free slots available".tr()); + return; + } + + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getRegionMappedProjectList() async { + isRegionListLoading = true; + notifyListeners(); + final result = await bookAppointmentsRepo.getProjectList(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) async { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + var projectList = apiResponse.data!; + hospitalList = await DoctorMapper.getMappedHospitals( + projectList, + isArabic: _appState.isArabic(), + lat: _appState.userLat, + lng: _appState.userLong, + ); + + var isLocationEnabled = (_appState.userLat != 0) && (_appState.userLong != 0); + hospitalList = await DoctorMapper.sortList(isLocationEnabled, hospitalList!); + + isRegionListLoading = false; + filteredHospitalList = hospitalList; + notifyListeners(); + } + }, + ); + } + + void setSelectedFacility(FacilitySelection selection) { + currentlySelectedFacility = selection; + notifyListeners(); + } + + void filterHospitalListByString(String? value, String? selectedRegionId, bool isHMG) { + if (value == null || value.isEmpty) { + filteredHospitalList = hospitalList; + } else { + filteredHospitalList = RegionList(); + + var list = isHMG ? hospitalList?.registeredDoctorMap![selectedRegionId]!.hmgDoctorList : hospitalList?.registeredDoctorMap![selectedRegionId]!.hmcDoctorList; + + if (list != null && list.isEmpty) { + notifyListeners(); + return; + } + + var filteredList = list!.where((element) => element.filterName!.toLowerCase().contains(value.toLowerCase())).toList(); + var regionData = PatientDoctorAppointmentListByRegion(); + if (isHMG) { + regionData.hmgDoctorList = filteredList; + regionData.hmgSize = filteredList.length; + } else { + regionData.hmcDoctorList = filteredList; + regionData.hmcSize = filteredList.length; + } + + filteredHospitalList?.registeredDoctorMap = {selectedRegionId!: regionData}; + } + notifyListeners(); + } + + bool isLocationEnabled() { + return _appState.userLong != 0.0 && _appState.userLong != 0.0; + } + + // bool getLocationStatus() { + // bool isLocationAvaiable = false; + // isLocationEnabled().then((value) => isLocationAvaiable = value); + // return isLocationAvaiable; + // } + + void setLoadSpecificClinic(bool status) { + shouldLoadSpecificClinic = status; + } + + void setProjectID(String? mainProjectID) { + currentlySelectedHospitalFromRegionFlow = mainProjectID; + } + + Future getRegionSelectedClinics() async { + final result = await bookAppointmentsRepo.getClinicsWithRespectToClinicId(currentlySelectedHospitalFromRegionFlow ?? ""); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + clinicsList = apiResponse.data!; + isClinicsListLoading = false; + initializeFilteredList(); + notifyListeners(); + } + }, + ); + } + + void resetFilterList() { + filteredHospitalList = hospitalList; + } + + void getLocation() { + locationUtils.getLocation(); + } + + void clearSearchFilters() { + searchedRegionList.clear(); + searchedHospitalList.clear(); + searchedPatientDoctorAppointmentHospitalsList.clear(); + searchedClinicList.clear(); + notifyListeners(); + } + + void clearSelection() { + selectedFacilityForFilters = []; + selectedClinicForFilters = null; + selectedHospitalForFilters = null; + selectedRegionForFilters = []; + applyFilters = false; + notifyListeners(); + } + + void setSelections( + List? selectedFacilityForFilters, + List? selectedRegionForFilters, + String? selectedClinicForFilters, + PatientDoctorAppointmentList? selectedHospitalForFilters, + bool applyFilters) { + this.selectedFacilityForFilters = selectedFacilityForFilters; + this.selectedClinicForFilters = selectedClinicForFilters; + this.selectedHospitalForFilters = selectedHospitalForFilters; + this.selectedRegionForFilters = selectedRegionForFilters; + this.applyFilters = applyFilters; + notifyListeners(); + } + + void getFiltersFromDoctorList() { + doctorsList.forEach((element) { + if (!searchedRegionList + .contains(element.getRegionName(_appState.isArabic()))) { + searchedRegionList + .add(element.getRegionName(_appState.isArabic()) ?? ""); + } + if (!searchedHospitalList.contains(element.projectName)) { + searchedPatientDoctorAppointmentHospitalsList + .add(PatientDoctorAppointmentList() + ..filterName = element.projectName + ..isHMC = element.isHMC + ..distanceInKMs = "0"); + searchedHospitalList.add(element.projectName ?? ""); + } + if (!searchedClinicList.contains(element.clinicName)) { + searchedClinicList.add(element.clinicName ?? ""); + } + }); + } + + void updateApplyFilters(bool applyFilters) { + this.applyFilters = applyFilters; + notifyListeners(); + } + + void setSelectedRegion(String region) { + if (selectedRegionForFilters?.contains(region) == true) { + selectedRegionForFilters?.remove(region); + } else { + selectedRegionForFilters?.add(region); + } + notifyListeners(); + } + + void setSelectedHospital(PatientDoctorAppointmentList? hospital) { + selectedHospitalForFilters = hospital; + notifyListeners(); + } + + void setSelectedFacilityForFilter(String facility) { + if (selectedFacilityForFilters?.contains(facility) == true) { + selectedFacilityForFilters?.remove(facility); + } else { + selectedFacilityForFilters?.add(facility); + } + + notifyListeners(); + } + + void setSelectedClinicForFilter(String? clinic) { + selectedClinicForFilters = clinic; + notifyListeners(); + } + + bool isArabic() { + return _appState.isArabic(); + } + + List getDoctorListAsPerSelection() { + if (!applyFilters) return doctorsList; + + if ((selectedRegionForFilters?.isEmpty == true) && + (selectedFacilityForFilters?.isEmpty == true) && + selectedClinicForFilters == null && + selectedHospitalForFilters == null) { + return doctorsList; + } + var list = doctorsList.where((element) { + var isInSelectedRegion = (selectedRegionForFilters?.isEmpty == true) + ? true + : selectedRegionForFilters + ?.any((region) => region == element.getRegionName(isArabic())); + var shouldApplyFacilityFilter = + (selectedFacilityForFilters?.isEmpty == true) ? false : true; + var isHMC = (selectedFacilityForFilters?.isEmpty == true) + ? true + : selectedFacilityForFilters?.any((item) => item.contains("hmc")); + var isInSelectedClinic = (selectedClinicForFilters == null) + ? true + : selectedClinicForFilters == element.clinicName; + var isInSelectedHospital = (selectedHospitalForFilters == null) + ? true + : element.projectName == selectedHospitalForFilters?.filterName; + var facilityFilter = ((shouldApplyFacilityFilter == true) ? isHMC : true); + + return (isInSelectedRegion ?? true) && + (facilityFilter ?? true) && + isInSelectedClinic && + isInSelectedHospital; + }).toList(); + return list; + } + + void updateList() { + filteredDoctorList = getDoctorListAsPerSelection(); + notifyListeners(); + } + + Future getPatientDentalEstimation({required int projectID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + patientDentalPlanEstimationList.clear(); + totalTimeNeededForDentalProcedure = 0; + isContinueDentalPlan = false; + notifyListeners(); + + final result = await bookAppointmentsRepo.getPatientDentalEstimation(projectID: projectID); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientDentalPlanEstimationList = apiResponse.data!; + + patientDentalPlanEstimationList.forEach((v) { + totalTimeNeededForDentalProcedure += (v.neededTime ?? 0); + }); + + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getDentalChiefComplaintsList({Function(dynamic)? onSuccess, Function(String)? onError}) async { + dentalChiefComplaintsList.clear(); + notifyListeners(); + int patientID = _appState.isAuthenticated ? _appState.getAuthenticatedUser()!.patientId ?? -1 : -1; + final result = await bookAppointmentsRepo.getDentalChiefComplaintsList(patientID: patientID, projectID: int.parse(currentlySelectedHospitalFromRegionFlow ?? "0"), clinicID: 17); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError?.call(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + dentalChiefComplaintsList = apiResponse.data!; + isChiefComplaintsListLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getDentalChiefComplaintDoctorsList({int projectID = 0, Function(dynamic)? onSuccess, Function(String)? onError}) async { + doctorsList.clear(); + projectID = currentlySelectedHospitalFromRegionFlow != null ? int.parse(currentlySelectedHospitalFromRegionFlow!) : projectID; + final result = await bookAppointmentsRepo.getDentalChiefComplaintDoctorsList(projectID, selectedChiefComplaintID); + + result.fold( + (failure) async { + onError!("No doctors found for the search criteria...".needTranslation); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + doctorsList = apiResponse.data!; + filteredDoctorList = doctorsList; + isDoctorsListLoading = false; + // initializeFilteredList(); + // clearSearchFilters(); + // getFiltersFromDoctorList(); + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + setBodyType(int bodyType){ + selectedBodyTypeIndex = bodyType; + selectedCategory = 0; + selectedBodyPartList = []; + duration = 0; + notifyListeners(); + } + + FutureOr getLaserClinic() async{ + isBodyPartsLoading = true; + int id = bodyTypes[selectedBodyTypeIndex][selectedCategory].laserCategoryID; + int projectID = currentlySelectedHospitalFromRegionFlow != null ? int.parse(currentlySelectedHospitalFromRegionFlow!) : 0; + int languageID = _appState.isArabic() ? 1 : 0; + final result = await bookAppointmentsRepo.getLaserClinics(id, projectID, languageID); + result.fold( + (failure) { + isBodyPartsLoading = false; + notifyListeners(); + }, + (apiResponse) {isBodyPartsLoading = false; + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + List response =apiResponse.data!; + if(response.first.category == 2 || response.first.category == 10 ) response.remove(response.first); + laserBodyPartsList = response; + } + notifyListeners(); + + }, + ); + } + + int getDuration() { + var duration = 0; + + var lowerUpperLegsList = selectedBodyPartList.where((element) => element.mappingCode == "47" || element.mappingCode == "48")?.toList() ?? []; + var upperLowerArmsList = selectedBodyPartList.where((element) => element.mappingCode == "40" || element.mappingCode == "41")?.toList() ?? []; + + if (selectedBodyPartList.isNotEmpty) { + duration = selectedBodyPartList.fold(0, (previousValue, element) => previousValue + int.parse(element.timeDuration!)); + } + if (lowerUpperLegsList.length == 2) { + duration -= 30; + } + if (upperLowerArmsList.length == 2) { + duration -= 15; + } + + return duration; + } + + void setSelectedCategory(category) { + selectedCategory = category; + notifyListeners(); + getLaserClinic(); + } + + void setSelectedBodyPart(LaserBodyPart part) { + if(selectedBodyPartList.contains(part)){ + selectedBodyPartList.remove(part); + this.duration = getDuration(); + + notifyListeners(); + } else { + if(this.duration == 90){ + dialogService.showErrorBottomSheet(message: "Duration can not exceed 90 min".needTranslation,); + return; + } + selectedBodyPartList.add(part); + var duration = getDuration(); + if(duration > 90){ + selectedBodyPartList.remove(part); + dialogService.showErrorBottomSheet(message: "Duration Exceeds 90 min".needTranslation,); + return; + } + this.duration = duration; + notifyListeners(); + } + } + + readCurrentLaserCategoryID() { + return bodyTypes[selectedBodyTypeIndex][selectedCategory].laserCategoryID; + } + + String getLaserProcedureNameWRTLanguage(LaserBodyPart part) { + if(_appState.isArabic()){ + return part.bodyPartN??""; + }else { + return part.bodyPart??""; + } + } + + void resetLaserData() { + selectedCategory = 0; + selectedBodyTypeIndex = 0; + selectedBodyPartList = []; + laserBodyPartsList = []; + duration = 0; + } +} diff --git a/lib/features/book_appointments/models/LaserCategoryType.dart b/lib/features/book_appointments/models/LaserCategoryType.dart new file mode 100644 index 0000000..df85620 --- /dev/null +++ b/lib/features/book_appointments/models/LaserCategoryType.dart @@ -0,0 +1,6 @@ +class LaserCategoryType { + int laserCategoryID; + String title; + + LaserCategoryType(this.laserCategoryID, this.title); +} diff --git a/lib/features/book_appointments/models/free_slot.dart b/lib/features/book_appointments/models/free_slot.dart new file mode 100644 index 0000000..4669298 --- /dev/null +++ b/lib/features/book_appointments/models/free_slot.dart @@ -0,0 +1,12 @@ +class FreeSlot { + List event; + DateTime slot; + + + FreeSlot(this.slot, this.event); + + @override + String toString() { + return '{ ${this.slot}, ${this.event} }'; + } +} \ No newline at end of file diff --git a/lib/features/book_appointments/models/laser_body_parts_data.dart b/lib/features/book_appointments/models/laser_body_parts_data.dart new file mode 100644 index 0000000..2f8b32d --- /dev/null +++ b/lib/features/book_appointments/models/laser_body_parts_data.dart @@ -0,0 +1,135 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class LaserBodyParts { + static final LaserBodyParts _instance = LaserBodyParts._internal(); + + LaserBodyParts._internal(); + + factory LaserBodyParts() => _instance; + + static Widget image(String assetUri) { + return new SvgPicture.asset(assetUri, fit: BoxFit.cover, width: 88, height: 88); + } + + static Widget imagePng(String assetUri) { + return Image.asset(assetUri, fit: BoxFit.cover, width: 88, height: 88); + } + + Map maleBodyMap = { + "1": imagePng("assets/images/png/body_parts/male/full_body_male.png"), + "40": imagePng("assets/images/png/body_parts/male/upper_arm.png"), + "41": imagePng("assets/images/png/body_parts/male/lower_arm.png"), + "42": imagePng("assets/images/png/body_parts/male/chest.png"), + "43": imagePng("assets/images/png/body_parts/male/chest_line.png"), + "44": imagePng("assets/images/png/body_parts/male/shoulders.png"), + "45": imagePng("assets/images/png/body_parts/male/back.png"), + "46": imagePng("assets/images/png/body_parts/male/abdomin.png"), + "47": imagePng("assets/images/png/body_parts/male/upper_legs.png"), + "48": imagePng("assets/images/png/body_parts/male/lower_legs.png"), + "49": imagePng("assets/images/png/body_parts/male/axilla.png") + }; + + Map maleFaceMap = { + "62": image("assets/images/png/body_parts/male/hydra_facial.svg"), + "5": image("assets/images/png/body_parts/male/upper_lips.svg"), + "6": image("assets/images/png/body_parts/male/chin.svg"), + "7": image("assets/images/png/body_parts/male/cheek.svg"), + "8": image("assets/images/png/body_parts/male/side_burn.svg"), + "9": image("assets/images/png/body_parts/male/ears.svg"), + "10": image("assets/images/png/body_parts/male/full_neck.svg"), + "11": image("assets/images/png/body_parts/male/half_neck.svg"), + "12": image("assets/images/png/body_parts/male/eyebrows.svg") + }; + + Map maleBodyRetouchMap = { + "50": imagePng("assets/images/png/body_parts/male/full_body_male.png"), + "51": imagePng("assets/images/png/body_parts/male/upper_arm.png"), + "52": imagePng("assets/images/png/body_parts/male/lower_arm.png"), + "53": imagePng("assets/images/png/body_parts/male/chest.png"), + "54": imagePng("assets/images/png/body_parts/male/shoulders.png"), + "55": imagePng("assets/images/png/body_parts/male/back.png"), + "56": imagePng("assets/images/png/body_parts/male/abdomin.png"), + "57": imagePng("assets/images/png/body_parts/male/full_legs.png"), + "58": imagePng("assets/images/png/body_parts/male/upper_legs.png"), + "59": imagePng("assets/images/png/body_parts/male/lower_legs.png"), + "60": imagePng("assets/images/png/body_parts/male/bikini.png"), + "61": imagePng("assets/images/png/body_parts/male/bikini_line.png") + }; + + Map femaleBodyMap = { + "1": imagePng("assets/images/png/body_parts/female/full_body_female.png"), + "40": imagePng("assets/images/png/body_parts/female/upper_arm.png"), + "41": imagePng("assets/images/png/body_parts/female/lower_arm.png"), + "42": imagePng("assets/images/png/body_parts/female/chest.png"), + "43": imagePng("assets/images/png/body_parts/female/chest_line.png"), + "44": imagePng("assets/images/png/body_parts/female/shoulders.png"), + "45": imagePng("assets/images/png/body_parts/female/back.png"), + "46": imagePng("assets/images/png/body_parts/female/abdomin.png"), + "47": imagePng("assets/images/png/body_parts/female/upper_legs.png"), + "48": imagePng("assets/images/png/body_parts/female/lower_leg.png"), + "49": imagePng("assets/images/png/body_parts/female/axilla.png") + }; + + Map femaleFaceMap = { + "62": image("assets/images/png/body_parts/female/hydra_facial.svg"), + "5": image("assets/images/png/body_parts/female/upper_lips.svg"), + "6": image("assets/images/png/body_parts/female/chin.svg"), + "7": image("assets/images/png/body_parts/female/cheeks.svg"), + "8": image("assets/images/png/body_parts/female/side_burn.svg"), + "9": image("assets/images/png/body_parts/female/ears.svg"), + "10": image("assets/images/png/body_parts/female/full_neck.svg"), + "11": image("assets/images/png/body_parts/female/half_neck.svg"), + "12": image("assets/images/png/body_parts/female/eyebrows.svg") + }; + + Map femaleBodyBikiniMap = { + "34": imagePng("assets/images/png/body_parts/female/bikini.png"), + "36": imagePng("assets/images/png/body_parts/female/bikini_line.png"), + "38": imagePng("assets/images/png/body_parts/female/buttocks.png"), + "39": imagePng("assets/images/png/body_parts/female/anal.png") + }; + + Map femaleBodyRetouchMap = { + "50": imagePng("assets/images/png/body_parts/female/full_body_female.png"), + "51": imagePng("assets/images/png/body_parts/female/upper_arm.png"), + "52": imagePng("assets/images/png/body_parts/female/lower_arm.png"), + "53": imagePng("assets/images/png/body_parts/female/chest.png"), + "54": imagePng("assets/images/png/body_parts/female/shoulders.png"), + "55": imagePng("assets/images/png/body_parts/female/back.png"), + "56": imagePng("assets/images/png/body_parts/female/abdomin.png"), + "57": imagePng("assets/images/png/body_parts/female/full_legs.png"), + "58": imagePng("assets/images/png/body_parts/female/upper_legs.png"), + "59": imagePng("assets/images/png/body_parts/female/lower_leg.png"), + "60": imagePng("assets/images/png/body_parts/female/bikini.png"), + "61": imagePng("assets/images/png/body_parts/female/bikini_line.png") + }; + + Widget? getCategoryImage(bool isMale, int category, String mappingCode) { + if (isMale) { + if (category == 1) { + return maleBodyMap![mappingCode]!; + } + if (category == 2) { + return maleFaceMap![mappingCode]!; + } + if (category == 11) { + return maleBodyRetouchMap![mappingCode]!; + } + } else { + if (category == 1) { + return femaleBodyMap![mappingCode]!; + } + if (category == 2) { + return femaleFaceMap![mappingCode]!; + } + if (category == 10) { + return femaleBodyBikiniMap![mappingCode]!; + } + if (category == 11) { + return femaleBodyRetouchMap![mappingCode]!; + } + } + return null; + } +} \ No newline at end of file diff --git a/lib/features/book_appointments/models/resp_models/dental_chief_complaints_response_model.dart b/lib/features/book_appointments/models/resp_models/dental_chief_complaints_response_model.dart new file mode 100644 index 0000000..99d5cd7 --- /dev/null +++ b/lib/features/book_appointments/models/resp_models/dental_chief_complaints_response_model.dart @@ -0,0 +1,24 @@ +class DentalChiefComplaintsListResponseModel { + int? projectID; + int? iD; + String? name; + dynamic nameN; + + DentalChiefComplaintsListResponseModel({this.projectID, this.iD, this.name, this.nameN}); + + DentalChiefComplaintsListResponseModel.fromJson(Map json) { + projectID = json['ProjectID']; + iD = json['ID']; + name = json['Name']; + nameN = json['NameN']; + } + + Map toJson() { + final Map data = new Map(); + data['ProjectID'] = this.projectID; + data['ID'] = this.iD; + data['Name'] = this.name; + data['NameN'] = this.nameN; + return data; + } +} diff --git a/lib/features/book_appointments/models/resp_models/doctor_profile_response_model.dart b/lib/features/book_appointments/models/resp_models/doctor_profile_response_model.dart new file mode 100644 index 0000000..944e659 --- /dev/null +++ b/lib/features/book_appointments/models/resp_models/doctor_profile_response_model.dart @@ -0,0 +1,196 @@ +class DoctorsProfileResponseModel { + int? doctorID; + String? doctorName; + dynamic doctorNameN; + int? clinicID; + String? clinicDescription; + dynamic clinicDescriptionN; + dynamic licenseExpiry; + int? employmentType; + dynamic setupID; + int? projectID; + String? projectName; + String? nationalityID; + String? nationalityName; + dynamic nationalityNameN; + int? gender; + String? genderDescription; + dynamic genderDescriptionN; + dynamic doctorTitle; + dynamic projectNameN; + bool? isAllowWaitList; + String? titleDescription; + dynamic titleDescriptionN; + dynamic isRegistered; + dynamic isDoctorDummy; + bool? isActive; + dynamic isDoctorAppointmentDisplayed; + bool? doctorClinicActive; + dynamic isbookingAllowed; + String? doctorCases; + dynamic doctorPicture; + String? doctorProfileInfo; + List? specialty; + num? actualDoctorRate; + String? consultationFee; + num? decimalDoctorRate; + String? doctorImageURL; + String? doctorMobileNumber; + num? doctorRate; + num? doctorStarsRate; + String? doctorTitleForProfile; + bool? isAppointmentAllowed; + bool? isDoctorHasPrePostImages; + String? nationalityFlagURL; + num? noOfPatientsRate; + String? qR; + int? serviceID; + + DoctorsProfileResponseModel( + {this.doctorID, + this.doctorName, + this.doctorNameN, + this.clinicID, + this.clinicDescription, + this.clinicDescriptionN, + this.licenseExpiry, + this.employmentType, + this.setupID, + this.projectID, + this.projectName, + this.nationalityID, + this.nationalityName, + this.nationalityNameN, + this.gender, + this.genderDescription, + this.genderDescriptionN, + this.doctorTitle, + this.projectNameN, + this.isAllowWaitList, + this.titleDescription, + this.titleDescriptionN, + this.isRegistered, + this.isDoctorDummy, + this.isActive, + this.isDoctorAppointmentDisplayed, + this.doctorClinicActive, + this.isbookingAllowed, + this.doctorCases, + this.doctorPicture, + this.doctorProfileInfo, + this.specialty, + this.actualDoctorRate, + this.consultationFee, + this.decimalDoctorRate, + this.doctorImageURL, + this.doctorMobileNumber, + this.doctorRate, + this.doctorStarsRate, + this.doctorTitleForProfile, + this.isAppointmentAllowed, + this.isDoctorHasPrePostImages, + this.nationalityFlagURL, + this.noOfPatientsRate, + this.qR, + this.serviceID}); + + DoctorsProfileResponseModel.fromJson(Map json) { + doctorID = json['DoctorID']; + doctorName = json['DoctorName']; + doctorNameN = json['DoctorNameN']; + clinicID = json['ClinicID']; + clinicDescription = json['ClinicDescription']; + clinicDescriptionN = json['ClinicDescriptionN']; + licenseExpiry = json['LicenseExpiry']; + employmentType = json['EmploymentType']; + setupID = json['SetupID']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + nationalityID = json['NationalityID']; + nationalityName = json['NationalityName']; + nationalityNameN = json['NationalityNameN']; + gender = json['Gender']; + genderDescription = json['Gender_Description']; + genderDescriptionN = json['Gender_DescriptionN']; + doctorTitle = json['DoctorTitle']; + projectNameN = json['ProjectNameN']; + isAllowWaitList = json['IsAllowWaitList']; + titleDescription = json['Title_Description']; + titleDescriptionN = json['Title_DescriptionN']; + isRegistered = json['IsRegistered']; + isDoctorDummy = json['IsDoctorDummy']; + isActive = json['IsActive']; + isDoctorAppointmentDisplayed = json['IsDoctorAppointmentDisplayed']; + doctorClinicActive = json['DoctorClinicActive']; + isbookingAllowed = json['IsbookingAllowed']; + doctorCases = json['DoctorCases']; + doctorPicture = json['DoctorPicture']; + doctorProfileInfo = json['DoctorProfileInfo']; + specialty = json['Specialty'].cast(); + actualDoctorRate = json['ActualDoctorRate']; + consultationFee = json['ConsultationFee']; + decimalDoctorRate = json['DecimalDoctorRate']; + doctorImageURL = json['DoctorImageURL']; + doctorMobileNumber = json['DoctorMobileNumber']; + doctorRate = json['DoctorRate']; + doctorStarsRate = json['DoctorStarsRate']; + doctorTitleForProfile = json['DoctorTitleForProfile']; + isAppointmentAllowed = json['IsAppointmentAllowed']; + isDoctorHasPrePostImages = json['IsDoctorHasPrePostImages']; + nationalityFlagURL = json['NationalityFlagURL']; + noOfPatientsRate = json['NoOfPatientsRate']; + qR = json['QR']; + serviceID = json['ServiceID']; + } + + Map toJson() { + final Map data = new Map(); + data['DoctorID'] = this.doctorID; + data['DoctorName'] = this.doctorName; + data['DoctorNameN'] = this.doctorNameN; + data['ClinicID'] = this.clinicID; + data['ClinicDescription'] = this.clinicDescription; + data['ClinicDescriptionN'] = this.clinicDescriptionN; + data['LicenseExpiry'] = this.licenseExpiry; + data['EmploymentType'] = this.employmentType; + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['ProjectName'] = this.projectName; + data['NationalityID'] = this.nationalityID; + data['NationalityName'] = this.nationalityName; + data['NationalityNameN'] = this.nationalityNameN; + data['Gender'] = this.gender; + data['Gender_Description'] = this.genderDescription; + data['Gender_DescriptionN'] = this.genderDescriptionN; + data['DoctorTitle'] = this.doctorTitle; + data['ProjectNameN'] = this.projectNameN; + data['IsAllowWaitList'] = this.isAllowWaitList; + data['Title_Description'] = this.titleDescription; + data['Title_DescriptionN'] = this.titleDescriptionN; + data['IsRegistered'] = this.isRegistered; + data['IsDoctorDummy'] = this.isDoctorDummy; + data['IsActive'] = this.isActive; + data['IsDoctorAppointmentDisplayed'] = this.isDoctorAppointmentDisplayed; + data['DoctorClinicActive'] = this.doctorClinicActive; + data['IsbookingAllowed'] = this.isbookingAllowed; + data['DoctorCases'] = this.doctorCases; + data['DoctorPicture'] = this.doctorPicture; + data['DoctorProfileInfo'] = this.doctorProfileInfo; + data['Specialty'] = this.specialty; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['ConsultationFee'] = this.consultationFee; + data['DecimalDoctorRate'] = this.decimalDoctorRate; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorMobileNumber'] = this.doctorMobileNumber; + data['DoctorRate'] = this.doctorRate; + data['DoctorStarsRate'] = this.doctorStarsRate; + data['DoctorTitleForProfile'] = this.doctorTitleForProfile; + data['IsAppointmentAllowed'] = this.isAppointmentAllowed; + data['IsDoctorHasPrePostImages'] = this.isDoctorHasPrePostImages; + data['NationalityFlagURL'] = this.nationalityFlagURL; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['QR'] = this.qR; + data['ServiceID'] = this.serviceID; + return data; + } +} diff --git a/lib/features/book_appointments/models/resp_models/doctors_list_response_model.dart b/lib/features/book_appointments/models/resp_models/doctors_list_response_model.dart new file mode 100644 index 0000000..5df6ed8 --- /dev/null +++ b/lib/features/book_appointments/models/resp_models/doctors_list_response_model.dart @@ -0,0 +1,286 @@ +class DoctorsListResponseModel { + int? clinicID; + String? clinicName; + String? clinicNameN; + String? doctorTitle; + int? iD; + String? name; + int? projectID; + String? projectName; + num? actualDoctorRate; + int? clinicRoomNo; + dynamic date; + dynamic dayName; + num? decimalDoctorRate; + dynamic doctorAvailability; + int? doctorID; + String? doctorImageURL; + String? doctorMobileNumber; + dynamic doctorProfile; + dynamic doctorProfileInfo; + num? doctorRate; + num? doctorStarsRate; + int? employmentType; + int? gender; + String? genderDescription; + int? hISRegionId; + bool? isActive; + bool? isAllowWaitList; + bool? isAppointmentAllowed; + bool? isDoctorAllowVedioCall; + bool? isDoctorDummy; + bool? isDoctorHasPrePostImages; + bool? isHMC; + bool? isHmg; + bool? isLiveCare; + String? latitude; + String? longitude; + String? nationalityFlagURL; + String? nationalityID; + String? nationalityName; + dynamic nearestFreeSlot; + int? noOfFreeSlotsAvailable; + num? noOfPatientsRate; + dynamic originalClinicID; + int? personRate; + num? projectDistanceInKiloMeters; + String? projectNameBottom; + String? projectNameTop; + String? qR; + dynamic qRString; + num? rateNumber; + String? regionName; + dynamic regionNameN; + dynamic serviceID; + String? setupID; + List? speciality; + List? specialityN; + int? transactionType; + int? virtualEmploymentType; + dynamic workingHours; + dynamic vida3Id; + String? region; + String? regionArabic; + String? regionEnglish; + String? regionID; + String? projectBottomName; + String? projectTopName; + + + DoctorsListResponseModel( + {this.clinicID, + this.clinicName, + this.clinicNameN, + this.doctorTitle, + this.iD, + this.name, + this.projectID, + this.projectName, + this.actualDoctorRate, + this.clinicRoomNo, + this.date, + this.dayName, + this.decimalDoctorRate, + this.doctorAvailability, + this.doctorID, + this.doctorImageURL, + this.doctorMobileNumber, + this.doctorProfile, + this.doctorProfileInfo, + this.doctorRate, + this.doctorStarsRate, + this.employmentType, + this.gender, + this.genderDescription, + this.hISRegionId, + this.isActive, + this.isAllowWaitList, + this.isAppointmentAllowed, + this.isDoctorAllowVedioCall, + this.isDoctorDummy, + this.isDoctorHasPrePostImages, + this.isHMC, + this.isHmg, + this.isLiveCare, + this.latitude, + this.longitude, + this.nationalityFlagURL, + this.nationalityID, + this.nationalityName, + this.nearestFreeSlot, + this.noOfFreeSlotsAvailable, + this.noOfPatientsRate, + this.originalClinicID, + this.personRate, + this.projectDistanceInKiloMeters, + this.projectNameBottom, + this.projectNameTop, + this.qR, + this.qRString, + this.rateNumber, + this.regionName, + this.regionNameN, + this.serviceID, + this.setupID, + this.speciality, + this.specialityN, + this.transactionType, + this.virtualEmploymentType, + this.workingHours, + this.vida3Id, + this.region, + this.regionArabic, + this.regionEnglish, + this.regionID, + this.projectBottomName, + this.projectTopName,}); + + DoctorsListResponseModel.fromJson(Map json) { + clinicID = json['ClinicID']; + clinicName = json['ClinicName']; + clinicNameN = json['ClinicNameN']; + doctorTitle = json['DoctorTitle']; + iD = json['ID']; + name = json['Name']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + actualDoctorRate = json['ActualDoctorRate']; + clinicRoomNo = json['ClinicRoomNo']; + date = json['Date']; + dayName = json['DayName']; + decimalDoctorRate = json['DecimalDoctorRate']; + doctorAvailability = json['DoctorAvailability']; + doctorID = json['DoctorID']; + doctorImageURL = json['DoctorImageURL']; + doctorMobileNumber = json['DoctorMobileNumber']; + doctorProfile = json['DoctorProfile']; + doctorProfileInfo = json['DoctorProfileInfo']; + doctorRate = json['DoctorRate']; + doctorStarsRate = json['DoctorStarsRate']; + employmentType = json['EmploymentType']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + hISRegionId = json['HISRegionId']; + isActive = json['IsActive']; + isAllowWaitList = json['IsAllowWaitList']; + isAppointmentAllowed = json['IsAppointmentAllowed']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isDoctorDummy = json['IsDoctorDummy']; + isDoctorHasPrePostImages = json['IsDoctorHasPrePostImages']; + isHMC = json['IsHMC']; + isHmg = json['IsHmg']; + isLiveCare = json['IsLiveCare']; + latitude = json['Latitude']; + longitude = json['Longitude']; + nationalityFlagURL = json['NationalityFlagURL']; + nationalityID = json['NationalityID']; + nationalityName = json['NationalityName']; + nearestFreeSlot = json['NearestFreeSlot']; + noOfFreeSlotsAvailable = json['NoOfFreeSlotsAvailable']; + noOfPatientsRate = json['NoOfPatientsRate']; + originalClinicID = json['OriginalClinicID']; + personRate = json['PersonRate']; + projectDistanceInKiloMeters = json['ProjectDistanceInKiloMeters']; + projectNameBottom = json['ProjectNameBottom']; + projectNameTop = json['ProjectNameTop']; + qR = json['QR']; + qRString = json['QRString']; + rateNumber = json['RateNumber']; + regionName = json['RegionName']; + regionNameN = json['RegionNameN']; + serviceID = json['ServiceID']; + setupID = json['SetupID']; + speciality = json['Speciality'] != null ? json['Speciality'].cast() : []; + // specialityN = json['SpecialityN'].cast(); + transactionType = json['TransactionType']; + virtualEmploymentType = json['VirtualEmploymentType']; + workingHours = json['WorkingHours']; + vida3Id = json['vida3Id']; + regionArabic = json['RegionNameN']; + regionEnglish = json['RegionName']; + projectBottomName = json['ProjectNameBottom']; + projectTopName = json['ProjectNameTop']; + } + + Map toJson() { + final Map data = new Map(); + data['ClinicID'] = this.clinicID; + data['ClinicName'] = this.clinicName; + data['ClinicNameN'] = this.clinicNameN; + data['DoctorTitle'] = this.doctorTitle; + data['ID'] = this.iD; + data['Name'] = this.name; + data['ProjectID'] = this.projectID; + data['ProjectName'] = this.projectName; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['ClinicRoomNo'] = this.clinicRoomNo; + data['Date'] = this.date; + data['DayName'] = this.dayName; + data['DecimalDoctorRate'] = this.decimalDoctorRate; + data['DoctorAvailability'] = this.doctorAvailability; + data['DoctorID'] = this.doctorID; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorMobileNumber'] = this.doctorMobileNumber; + data['DoctorProfile'] = this.doctorProfile; + data['DoctorProfileInfo'] = this.doctorProfileInfo; + data['DoctorRate'] = this.doctorRate; + data['DoctorStarsRate'] = this.doctorStarsRate; + data['EmploymentType'] = this.employmentType; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['HISRegionId'] = this.hISRegionId; + data['IsActive'] = this.isActive; + data['IsAllowWaitList'] = this.isAllowWaitList; + data['IsAppointmentAllowed'] = this.isAppointmentAllowed; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsDoctorDummy'] = this.isDoctorDummy; + data['IsDoctorHasPrePostImages'] = this.isDoctorHasPrePostImages; + data['IsHMC'] = this.isHMC; + data['IsHmg'] = this.isHmg; + data['IsLiveCare'] = this.isLiveCare; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['NationalityFlagURL'] = this.nationalityFlagURL; + data['NationalityID'] = this.nationalityID; + data['NationalityName'] = this.nationalityName; + data['NearestFreeSlot'] = this.nearestFreeSlot; + data['NoOfFreeSlotsAvailable'] = this.noOfFreeSlotsAvailable; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['OriginalClinicID'] = this.originalClinicID; + data['PersonRate'] = this.personRate; + data['ProjectDistanceInKiloMeters'] = this.projectDistanceInKiloMeters; + data['ProjectNameBottom'] = this.projectNameBottom; + data['ProjectNameTop'] = this.projectNameTop; + data['QR'] = this.qR; + data['QRString'] = this.qRString; + data['RateNumber'] = this.rateNumber; + data['RegionName'] = this.regionName; + data['RegionNameN'] = this.regionNameN; + data['ServiceID'] = this.serviceID; + data['SetupID'] = this.setupID; + data['Speciality'] = this.speciality; + data['SpecialityN'] = this.specialityN; + data['TransactionType'] = this.transactionType; + data['VirtualEmploymentType'] = this.virtualEmploymentType; + data['WorkingHours'] = this.workingHours; + data['vida3Id'] = this.vida3Id; + return data; + } + + String? getRegionName(bool isArabic) { + if (isArabic) { + return regionArabic; + } + return regionEnglish; + } + String getProjectCompleteName(){ + return "${this.projectTopName} ${this.projectBottomName}"; + } + + String getProjectCompleteNameWithLocale({bool isArabic = false}) { + if (isArabic) { + return "${this.projectBottomName} ${this.projectTopName}"; + } + return "${this.projectTopName} ${this.projectBottomName}"; + } +} diff --git a/lib/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart b/lib/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart new file mode 100644 index 0000000..24d1c70 --- /dev/null +++ b/lib/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart @@ -0,0 +1,36 @@ +class GetClinicsListResponseModel { + int? clinicID; + String? clinicDescription; + String? clinicDescriptionN; + int? age; + int? gender; + bool? isLiveCareClinicAndOnline; + int? liveCareClinicID; + int? liveCareServiceID; + + GetClinicsListResponseModel({this.clinicID, this.clinicDescription, this.clinicDescriptionN, this.age, this.gender, this.isLiveCareClinicAndOnline, this.liveCareClinicID, this.liveCareServiceID}); + + GetClinicsListResponseModel.fromJson(Map json) { + clinicID = json['ClinicID']; + clinicDescription = json['ClinicDescription'] ?? "LiveCare Clinic"; + clinicDescriptionN = json['ClinicDescriptionN'] ?? "LiveCare Clinic"; + age = json['Age']; + gender = json['Gender']; + isLiveCareClinicAndOnline = json['IsLiveCareClinicAndOnline']; + liveCareClinicID = json['LiveCareClinicID']; + liveCareServiceID = json['LiveCareServiceID']; + } + + Map toJson() { + final Map data = new Map(); + data['ClinicID'] = this.clinicID; + data['ClinicDescription'] = this.clinicDescription; + data['ClinicDescriptionN'] = this.clinicDescriptionN; + data['Age'] = this.age; + data['Gender'] = this.gender; + data['IsLiveCareClinicAndOnline'] = this.isLiveCareClinicAndOnline; + data['LiveCareClinicID'] = this.liveCareClinicID; + data['LiveCareServiceID'] = this.liveCareServiceID; + return data; + } +} diff --git a/lib/features/book_appointments/models/resp_models/get_livecare_clinics_response_model.dart b/lib/features/book_appointments/models/resp_models/get_livecare_clinics_response_model.dart new file mode 100644 index 0000000..2b66cfc --- /dev/null +++ b/lib/features/book_appointments/models/resp_models/get_livecare_clinics_response_model.dart @@ -0,0 +1,33 @@ +class GetLiveCareClinicsResponseModel { + int? clinicID; + int? serviceID; + int? projectID; + String? clinicDesc; + String? clinicDescN; + String? projectDesc; + String? projectDescN; + + GetLiveCareClinicsResponseModel({this.clinicID, this.serviceID, this.projectID, this.clinicDesc, this.clinicDescN, this.projectDesc, this.projectDescN}); + + GetLiveCareClinicsResponseModel.fromJson(Map json) { + clinicID = json['ClinicID']; + serviceID = json['ServiceID']; + projectID = json['ProjectID']; + clinicDesc = json['ClinicDesc'] ?? "LiveCare Clinic"; + clinicDescN = json['ClinicDescN']; + projectDesc = json['ProjectDesc']; + projectDescN = json['ProjectDescN']; + } + + Map toJson() { + final Map data = new Map(); + data['ClinicID'] = this.clinicID; + data['ServiceID'] = this.serviceID; + data['ProjectID'] = this.projectID; + data['ClinicDesc'] = this.clinicDesc; + data['ClinicDescN'] = this.clinicDescN; + data['ProjectDesc'] = this.projectDesc; + data['ProjectDescN'] = this.projectDescN; + return data; + } +} diff --git a/lib/features/book_appointments/models/resp_models/get_patient_dental_plan_response_model.dart b/lib/features/book_appointments/models/resp_models/get_patient_dental_plan_response_model.dart new file mode 100644 index 0000000..6b90199 --- /dev/null +++ b/lib/features/book_appointments/models/resp_models/get_patient_dental_plan_response_model.dart @@ -0,0 +1,40 @@ +class PatientDentalPlanEstimationResponseModel { + dynamic setupID; + dynamic estimationNo; + int? projectID; + String? procedureId; + int? patientID; + int? sequenceNo; + int? neededTime; + String? procedureName; + String? procedureNameN; + + PatientDentalPlanEstimationResponseModel( + {this.setupID, this.estimationNo, this.projectID, this.procedureId, this.patientID, this.sequenceNo, this.neededTime, this.procedureName, this.procedureNameN}); + + PatientDentalPlanEstimationResponseModel.fromJson(Map json) { + setupID = json['SetupID']; + estimationNo = json['EstimationNo']; + projectID = json['ProjectID']; + procedureId = json['ProcedureId']; + patientID = json['PatientID']; + sequenceNo = json['sequenceNo']; + neededTime = json['NeededTime']; + procedureName = json['ProcedureName']; + procedureNameN = json['ProcedureNameN']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['EstimationNo'] = this.estimationNo; + data['ProjectID'] = this.projectID; + data['ProcedureId'] = this.procedureId; + data['PatientID'] = this.patientID; + data['sequenceNo'] = this.sequenceNo; + data['NeededTime'] = this.neededTime; + data['ProcedureName'] = this.procedureName; + data['ProcedureNameN'] = this.procedureNameN; + return data; + } +} diff --git a/lib/features/book_appointments/models/resp_models/laser_body_parts.dart b/lib/features/book_appointments/models/resp_models/laser_body_parts.dart new file mode 100644 index 0000000..d7d3fbd --- /dev/null +++ b/lib/features/book_appointments/models/resp_models/laser_body_parts.dart @@ -0,0 +1,64 @@ +class LaserBodyPart { + int? id; + int? category; + String? bodyPart; + bool? fullBoadyPart; + bool? isRetouch; + String? timeDuration; + String? bodyPartN; + bool? isActive; + String? mappingCode; + int? procedureID; + int? orderNum; + String? categoryName; + String? categoryNameN; + + LaserBodyPart( + {this.id, + this.category, + this.bodyPart, + this.fullBoadyPart, + this.isRetouch, + this.timeDuration, + this.bodyPartN, + this.isActive, + this.mappingCode, + this.procedureID, + this.orderNum, + this.categoryName, + this.categoryNameN}); + + LaserBodyPart.fromJson(Map json) { + id = json['Id']; + category = json['Category']; + bodyPart = json['BodyPart']; + fullBoadyPart = json['FullBoadyPart']; + isRetouch = json['IsRetouch']; + timeDuration = json['TimeDuration']; + bodyPartN = json['BodyPartN']; + isActive = json['IsActive']; + mappingCode = json['MappingCode']; + procedureID = json['ProcedureID']; + orderNum = json['OrderNum']; + categoryName = json['CategoryName']; + categoryNameN = json['CategoryNameN']; + } + + Map toJson() { + final Map data = new Map(); + data['Id'] = this.id; + data['Category'] = this.category; + data['BodyPart'] = this.bodyPart; + data['FullBoadyPart'] = this.fullBoadyPart; + data['IsRetouch'] = this.isRetouch; + data['TimeDuration'] = this.timeDuration; + data['BodyPartN'] = this.bodyPartN; + data['IsActive'] = this.isActive; + data['MappingCode'] = this.mappingCode; + data['ProcedureID'] = this.procedureID; + data['OrderNum'] = this.orderNum; + data['CategoryName'] = this.categoryName; + data['CategoryNameN'] = this.categoryNameN; + return data; + } +} diff --git a/lib/features/book_appointments/models/timeslots.dart b/lib/features/book_appointments/models/timeslots.dart new file mode 100644 index 0000000..8fc7b15 --- /dev/null +++ b/lib/features/book_appointments/models/timeslots.dart @@ -0,0 +1,9 @@ +class TimeSlot { + String? isoTime; + DateTime? start; + DateTime? end; + String? vidaDate; + bool isSelected = false; + + TimeSlot({required this.isoTime, required this.start, required this.end, this.vidaDate}); +} diff --git a/lib/features/common/common_repo.dart b/lib/features/common/common_repo.dart new file mode 100644 index 0000000..1d7301c --- /dev/null +++ b/lib/features/common/common_repo.dart @@ -0,0 +1,13 @@ +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class CommonRepo { + +} + + +class CommonRepoImp implements CommonRepo { + LoggerService loggerService; + + CommonRepoImp({required this.loggerService}); + +} \ No newline at end of file diff --git a/lib/features/common/common_view_model.dart b/lib/features/common/common_view_model.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/features/common/models/commong_authanticated_req_model.dart b/lib/features/common/models/commong_authanticated_req_model.dart new file mode 100644 index 0000000..19d9f30 --- /dev/null +++ b/lib/features/common/models/commong_authanticated_req_model.dart @@ -0,0 +1,73 @@ +import 'dart:convert'; + +class CommonAuthanticatedRequest { + String? sessionId; + double? versionId; + int? channel; + int? languageId; + String? ipAdress; + String? generalid; + double? latitude; + double? longitude; + int? deviceTypeId; + int? patientType; + int? patientTypeId; + String? tokenId; + int? patientId; + int? patientOutSa; + + CommonAuthanticatedRequest({ + this.sessionId, + this.versionId, + this.channel, + this.languageId, + this.ipAdress, + this.generalid, + this.latitude, + this.longitude, + this.deviceTypeId, + this.patientType, + this.patientTypeId, + this.tokenId, + this.patientId, + this.patientOutSa, + }); + + factory CommonAuthanticatedRequest.fromRawJson(String str) => CommonAuthanticatedRequest.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory CommonAuthanticatedRequest.fromJson(Map json) => CommonAuthanticatedRequest( + sessionId: json["SessionID"], + versionId: json["VersionID"]?.toDouble(), + channel: json["Channel"], + languageId: json["LanguageID"], + ipAdress: json["IPAdress"], + generalid: json["generalid"], + latitude: json["Latitude"], + longitude: json["Longitude"], + deviceTypeId: json["DeviceTypeID"], + patientType: json["PatientType"], + patientTypeId: json["PatientTypeID"], + tokenId: json["TokenID"], + patientId: json["PatientID"], + patientOutSa: json["PatientOutSA"], + ); + + Map toJson() => { + "SessionID": sessionId, + "VersionID": versionId, + "Channel": channel, + "LanguageID": languageId, + "IPAdress": ipAdress, + "generalid": generalid, + "Latitude": latitude, + "Longitude": longitude, + "DeviceTypeID": deviceTypeId, + "PatientType": patientType, + "PatientTypeID": patientTypeId, + "TokenID": tokenId, + "PatientID": patientId, + "PatientOutSA": patientOutSa, + }; +} diff --git a/lib/features/common/models/family_file_request.dart b/lib/features/common/models/family_file_request.dart new file mode 100644 index 0000000..047b9af --- /dev/null +++ b/lib/features/common/models/family_file_request.dart @@ -0,0 +1,57 @@ +import 'dart:convert'; + +class FamilyFileRequest { + int? sharedPatientId; + String? sharedPatientIdentificationId; + int? searchType; + String? sharedPatientMobileNumber; + String? zipCode; + bool? isRegister; + int? patientStatus; + bool? isDentalAllowedBackend; + bool? isPatientExcluded; + int? responseID; + + FamilyFileRequest({ + this.sharedPatientId, + this.sharedPatientIdentificationId, + this.searchType, + this.sharedPatientMobileNumber, + this.zipCode, + this.isRegister, + this.patientStatus, + this.isDentalAllowedBackend, + this.isPatientExcluded, + this.responseID, + }); + + factory FamilyFileRequest.fromRawJson(String str) => FamilyFileRequest.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory FamilyFileRequest.fromJson(Map json) => FamilyFileRequest( + sharedPatientId: json["sharedPatientID"], + sharedPatientIdentificationId: json["sharedPatientIdentificationID"], + searchType: json["searchType"], + sharedPatientMobileNumber: json["sharedPatientMobileNumber"], + zipCode: json["zipCode"], + isRegister: json["isRegister"], + patientStatus: json["patientStatus"], + isDentalAllowedBackend: json["isDentalAllowedBackend"], + isPatientExcluded: json["IsPatientExcluded"], + responseID: json["ReponseID"], + ); + + Map toJson() => { + "SharedPatientID": sharedPatientId, + "SharedPatientIdentificationID": sharedPatientIdentificationId, + "SearchType": searchType, + "SharedPatientMobileNumber": sharedPatientMobileNumber, + "zipCode": zipCode, + "isRegister": isRegister, + "PatientStatus": patientStatus, + "isDentalAllowedBackend": isDentalAllowedBackend, + "IsPatientExcluded": isPatientExcluded, + "ReponseID": responseID, + }; +} diff --git a/lib/features/contact_us/contact_us_repo.dart b/lib/features/contact_us/contact_us_repo.dart new file mode 100644 index 0000000..f2b1169 --- /dev/null +++ b/lib/features/contact_us/contact_us_repo.dart @@ -0,0 +1,95 @@ +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/features/contact_us/models/resp_models/get_hmg_locations.dart'; +import 'package:hmg_patient_app_new/features/contact_us/models/resp_models/get_patient_ic_projects.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class ContactUsRepo { + Future>>> getHMGLocations(); + + Future>>> getLiveChatProjectsList(); +} + +class ContactUsRepoImp implements ContactUsRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + ContactUsRepoImp({required this.apiClient, required this.loggerService}); + + @override + Future>>> getHMGLocations() async { + Map mapDevice = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_FINDUS_REQUEST, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListHMGLocation']; + final hmgLocations = list.map((item) => GetHMGLocationsModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: hmgLocations, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getLiveChatProjectsList() async { + Map mapDevice = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_LIVECHAT_REQUEST, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_PatientICProjects']; + final hmgLocations = list.map((item) => GetPatientICProjectsModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: hmgLocations, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/contact_us/contact_us_view_model.dart b/lib/features/contact_us/contact_us_view_model.dart new file mode 100644 index 0000000..7826bd1 --- /dev/null +++ b/lib/features/contact_us/contact_us_view_model.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/features/contact_us/contact_us_repo.dart'; +import 'package:hmg_patient_app_new/features/contact_us/models/resp_models/get_hmg_locations.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; + +class ContactUsViewModel extends ChangeNotifier { + ContactUsRepo contactUsRepo; + ErrorHandlerService errorHandlerService; + AppState appState; + + bool isHMGLocationsListLoading = false; + bool isHMGHospitalsListSelected = true; + + List hmgHospitalsLocationsList = []; + List hmgPharmacyLocationsList = []; + + ContactUsViewModel({required this.contactUsRepo, required this.errorHandlerService, required this.appState}); + + initContactUsViewModel() { + isHMGLocationsListLoading = true; + isHMGHospitalsListSelected = true; + hmgHospitalsLocationsList.clear(); + hmgPharmacyLocationsList.clear(); + getHMGLocations(); + notifyListeners(); + } + + setHMGHospitalsListSelected(bool isSelected) { + isHMGHospitalsListSelected = isSelected; + notifyListeners(); + } + + Future getHMGLocations({Function(dynamic)? onSuccess, Function(String)? onError}) async { + isHMGLocationsListLoading = true; + hmgHospitalsLocationsList.clear(); + hmgPharmacyLocationsList.clear(); + notifyListeners(); + + final result = await contactUsRepo.getHMGLocations(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + // hmgLocationsList = apiResponse.data!; + for (var location in apiResponse.data!) { + if (location.locationType == 1) { + hmgHospitalsLocationsList.add(location); + } else if (location.locationType == 2) { + hmgPharmacyLocationsList.add(location); + } + } + isHMGLocationsListLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } +} diff --git a/lib/features/contact_us/models/resp_models/get_hmg_locations.dart b/lib/features/contact_us/models/resp_models/get_hmg_locations.dart new file mode 100644 index 0000000..d15b853 --- /dev/null +++ b/lib/features/contact_us/models/resp_models/get_hmg_locations.dart @@ -0,0 +1,80 @@ +class GetHMGLocationsModel { + dynamic cityID; + String? cityName; + dynamic cityNameN; + dynamic distanceInKilometers; + bool? isActive; + String? latitude; + int? locationID; + String? locationName; + dynamic locationNameN; + dynamic locationType; + String? longitude; + int? pharmacyLocationID; + String? phoneNumber; + int? projectID; + String? projectImageURL; + int? setupID; + dynamic sortOrder; + + GetHMGLocationsModel( + {this.cityID, + this.cityName, + this.cityNameN, + this.distanceInKilometers, + this.isActive, + this.latitude, + this.locationID, + this.locationName, + this.locationNameN, + this.locationType, + this.longitude, + this.pharmacyLocationID, + this.phoneNumber, + this.projectID, + this.projectImageURL, + this.setupID, + this.sortOrder}); + + GetHMGLocationsModel.fromJson(Map json) { + cityID = json['CityID']; + cityName = json['CityName']; + cityNameN = json['CityNameN']; + distanceInKilometers = json['DistanceInKilometers']; + isActive = json['IsActive']; + latitude = json['Latitude']; + locationID = json['LocationID']; + locationName = json['LocationName']; + locationNameN = json['LocationNameN']; + locationType = json['LocationType']; + longitude = json['Longitude']; + pharmacyLocationID = json['PharmacyLocationID']; + phoneNumber = json['PhoneNumber']; + projectID = json['ProjectID']; + projectImageURL = json['ProjectImageURL']; + setupID = json['SetupID']; + sortOrder = json['SortOrder']; + } + + Map toJson() { + final Map data = new Map(); + data['CityID'] = this.cityID; + data['CityName'] = this.cityName; + data['CityNameN'] = this.cityNameN; + data['DistanceInKilometers'] = this.distanceInKilometers; + data['IsActive'] = this.isActive; + data['Latitude'] = this.latitude; + data['LocationID'] = this.locationID; + data['LocationName'] = this.locationName; + data['LocationNameN'] = this.locationNameN; + data['LocationType'] = this.locationType; + data['Longitude'] = this.longitude; + data['PharmacyLocationID'] = this.pharmacyLocationID; + data['PhoneNumber'] = this.phoneNumber; + data['ProjectID'] = this.projectID; + data['ProjectImageURL'] = this.projectImageURL; + data['SetupID'] = this.setupID; + data['SortOrder'] = this.sortOrder; + return data; + } +} \ No newline at end of file diff --git a/lib/features/contact_us/models/resp_models/get_patient_ic_projects.dart b/lib/features/contact_us/models/resp_models/get_patient_ic_projects.dart new file mode 100644 index 0000000..ba7463f --- /dev/null +++ b/lib/features/contact_us/models/resp_models/get_patient_ic_projects.dart @@ -0,0 +1,48 @@ +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; + +class GetPatientICProjectsModel { + int? id; + String? projectName; + String? projectNameN; + String? value; + dynamic languageId; + DateTime? createdOn; + String? createdBy; + dynamic editedOn; + dynamic editedBy; + bool? isActive; + dynamic distanceInKilometers; + + GetPatientICProjectsModel( + {this.id, this.projectName, this.projectNameN, this.value, this.languageId, this.createdOn, this.createdBy, this.editedOn, this.editedBy, this.distanceInKilometers, this.isActive}); + + GetPatientICProjectsModel.fromJson(Map json) { + id = json['id']; + projectName = json['ProjectName']; + projectNameN = json['ProjectNameN']; + value = json['Value']; + languageId = json['LanguageId']; + createdOn = DateUtil.convertStringToDate(json['CreatedOn']); + createdBy = json['CreatedBy']; + editedOn = json['EditedOn']; + editedBy = json['EditedBy']; + isActive = json['IsActive']; + distanceInKilometers = json['DistanceInKilometers']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['ProjectName'] = this.projectName; + data['ProjectNameN'] = this.projectNameN; + data['Value'] = this.value; + data['LanguageId'] = this.languageId; + data['CreatedOn'] = this.createdOn; + data['CreatedBy'] = this.createdBy; + data['EditedOn'] = this.editedOn; + data['EditedBy'] = this.editedBy; + data['IsActive'] = this.isActive; + data['DistanceInKilometers'] = this.distanceInKilometers; + return data; + } +} diff --git a/lib/features/doctor_filter/doctor_filter_view_model.dart b/lib/features/doctor_filter/doctor_filter_view_model.dart new file mode 100644 index 0000000..889ab5a --- /dev/null +++ b/lib/features/doctor_filter/doctor_filter_view_model.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart' show PatientDoctorAppointmentList; + +class DoctorFilterViewModel extends ChangeNotifier{ + + late AppState appState; + DoctorFilterViewModel(){ + appState = getIt(); + } + List searchedRegionList = []; + List facilityList = ["hmgHospitals", "hmcMedicalClinic"]; + List searchedHospitalList = []; + List + searchedPatientDoctorAppointmentHospitalsList = []; + List searchedClinicList = []; + + PatientDoctorAppointmentList? selectedHospitalForFilters; + List? selectedFacilityForFilters = [] , selectedRegionForFilters = []; + String? selectedClinicForFilters; + bool applyFilters = false; + + void clearSearchFilters() { + searchedRegionList.clear(); + searchedHospitalList.clear(); + searchedPatientDoctorAppointmentHospitalsList.clear(); + searchedClinicList.clear(); + notifyListeners(); + } + + void clearSelection() { + selectedFacilityForFilters = []; + selectedClinicForFilters = null; + selectedHospitalForFilters = null; + selectedRegionForFilters = []; + applyFilters = false; + notifyListeners(); + } + + void getFiltersFromDoctorList(List doctorsList) { + doctorsList.forEach((element) { + if (!searchedRegionList + .contains(element.getRegionName(appState.isArabic()))) { + searchedRegionList + .add(element.getRegionName(appState.isArabic()) ?? ""); + } + if (!searchedHospitalList.contains(element.projectName)) { + searchedPatientDoctorAppointmentHospitalsList + .add(PatientDoctorAppointmentList() + ..filterName = element.projectName + ..isHMC = element.isHMC + ..distanceInKMs = "0"); + searchedHospitalList.add(element.projectName ?? ""); + } + if (!searchedClinicList.contains(element.clinicName)) { + searchedClinicList.add(element.clinicName ?? ""); + } + }); + } + + void updateApplyFilters(bool applyFilters) { + this.applyFilters = applyFilters; + notifyListeners(); + } + + void setSelectedRegion(String region) { + if (selectedRegionForFilters?.contains(region) == true) { + selectedRegionForFilters?.remove(region); + } else { + selectedRegionForFilters?.add(region); + } + notifyListeners(); + } + + void setSelectedHospital(PatientDoctorAppointmentList? hospital) { + selectedHospitalForFilters = hospital; + notifyListeners(); + } + + void setSelectedFacilityForFilter(String facility) { + if (selectedFacilityForFilters?.contains(facility) == true) { + selectedFacilityForFilters?.remove(facility); + } else { + selectedFacilityForFilters?.add(facility); + } + + notifyListeners(); + } + + void setSelectedClinicForFilter(String? clinic) { + selectedClinicForFilters = clinic; + notifyListeners(); + } + + void setSelections( + List? selectedFacilityForFilters, + List? selectedRegionForFilters, + String? selectedClinicForFilters, + PatientDoctorAppointmentList? selectedHospitalForFilters, + bool applyFilters) { + this.selectedFacilityForFilters = selectedFacilityForFilters; + this.selectedClinicForFilters = selectedClinicForFilters; + this.selectedHospitalForFilters = selectedHospitalForFilters; + this.selectedRegionForFilters = selectedRegionForFilters; + this.applyFilters = applyFilters; + notifyListeners(); + } +} \ No newline at end of file diff --git a/lib/features/emergency_services/emergency_services_repo.dart b/lib/features/emergency_services/emergency_services_repo.dart new file mode 100644 index 0000000..b81356e --- /dev/null +++ b/lib/features/emergency_services/emergency_services_repo.dart @@ -0,0 +1,548 @@ +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/request_model/PatientER_RC.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/AmbulanceRequestOrdersModel.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/EROnlineCheckInPaymentDetailsResponse.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/ProjectAvgERWaitingTime.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/rrt_procedures_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +import 'models/resp_model/PatientERTransportationMethod.dart'; + +abstract class EmergencyServicesRepo { + Future>>> getRRTProcedures(); + + Future>>> getNearestEr({int? id, int? projectID}); + + Future>> checkPatientERAdvanceBalance(); + + Future>>> getProjectList(); + + Future>> checkPatientERPaymentInformation({int projectID}); + + Future>> ER_CreateAdvancePayment( + {required int projectID, required AuthenticatedUser authUser, required num paymentAmount, required String paymentMethodName, required String paymentReference}); + + Future>> addAdvanceNumberRequest({required String advanceNumber, required String paymentReference, required String appointmentNo}); + + Future>> getProjectIDFromNFC({required String nfcCode}); + + Future>> autoGenerateInvoiceERClinic({required int projectID}); + + Future>>> getTransportationMethods({int? id}); + + + Future>> submitAmbulanceRequest(PatientER_RC request); + + Future>>> getTransportationOrders({int? id}); + + Future>> cancelOrder(int? iD, int patientId); + +} + +class EmergencyServicesRepoImp implements EmergencyServicesRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + EmergencyServicesRepoImp({required this.loggerService, required this.apiClient}); + + Future>>> getNearestEr({int? id, int? projectID}) async { + Map mapDevice = {'IsForER': true}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_NEAREST_HOSPITAL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_ProjectAvgERWaitingTime']; + + final clinicsList = list.map((item) => ProjectAvgERWaitingTime.fromJson(item as Map)).toList().cast(); + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: clinicsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getRRTProcedures() async { + Map mapDevice = {"ProjectID": 15}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_RRT_PROCEDURE_LIST, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['Vida_ProcedureList']; + final proceduresList = list.map((item) => RRTProceduresResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: proceduresList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getTransportationMethods({int? id}) async { + Map mapDevice = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.get( + "$GET_ALL_TRANSPORTATIONS_RC?patientID=$id", + isRCService: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['response']['transportationservices']; + final proceduresList = list.map((item) => PatientERTransportationMethod.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: proceduresList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getProjectList() async { + Map request = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PROJECT_LIST, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListProject']; + + final appointmentsList = list.map((item) => HospitalsModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: appointmentsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> submitAmbulanceRequest(PatientER_RC request) async { + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + body: request.toJson(), + INSERT_TRANSPORTATION_ORDER_RC, + isRCService: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: true, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getTransportationOrders({int? id}) async { + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + body: {}, + "$GET_ALL_TRANSPORTATIONS_ORDERS?patientID=$id", + isRCService: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['response']; + final proceduresList = list.map((item) => AmbulanceRequestOrdersModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: proceduresList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> cancelOrder(int? iD, int patientID) async { + try { + GenericApiModel? apiResponse; + + Map request = {}; + request['Id'] = iD; + request['StatusId'] = 6; + request['ClickButton'] = 14; + request['PatientID'] = patientID; + Failure? failure; + await apiClient.post( + body: request, + CANCEL_AMBULANCE_REQUEST, + isRCService: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: true, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> checkPatientERAdvanceBalance() async { + Map mapDevice = {"ClinicID": 10}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + CHECK_PATIENT_ER_ADVANCE_BALANCE, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final bool patientHasERBalance = response['BalanceAmount'] > 0; + print(patientHasERBalance); + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: patientHasERBalance, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + + @override + Future>> checkPatientERPaymentInformation({int? projectID}) async { + Map mapDevice = {"ClinicID": 10, "ProjectID": projectID ?? 0}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_ER_ONLINE_PAYMENT_DETAILS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final erOnlineCheckInPaymentDetailsResponse = EROnlineCheckInPaymentDetailsResponse.fromJson(response["ResponsePatientShare"]); + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: erOnlineCheckInPaymentDetailsResponse, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> ER_CreateAdvancePayment( + {required int projectID, required AuthenticatedUser authUser, required num paymentAmount, required String paymentMethodName, required String paymentReference}) async { + Map mapDevice = { + "LanguageID": 1, + "ERAdvanceAmount": { + "ProjectId": projectID, + "PatientId": authUser.patientId, + "ClinicId": 10, + "DepositorName": "${authUser.firstName!} ${authUser.lastName!}", + "MemberId": authUser.patientId, + "NationalityID": authUser.nationalityId, + "PaymentAmount": paymentAmount, + "PaymentDate": DateUtil.convertDateToString(DateTime.now()), + "PaymentMethodName": paymentMethodName, + "PaymentReferenceNumber": paymentReference, + "SourceType": 2 + } + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ER_CREATE_ADVANCE_PAYMENT, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final vidaAdvanceNumber = response['ER_AdvancePaymentResponse']['AdvanceNumber'].toString(); + print(vidaAdvanceNumber); + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: vidaAdvanceNumber, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> addAdvanceNumberRequest({required String advanceNumber, required String paymentReference, required String appointmentNo}) async { + Map requestBody = { + "AdvanceNumber": advanceNumber, + "AdvanceNumber_VP": advanceNumber, + "PaymentReferenceNumber": paymentReference, + "AppointmentID": appointmentNo, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ADD_ADVANCE_NUMBER_REQUEST, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getProjectIDFromNFC({required String nfcCode}) async { + Map mapDevice = {"nFC_Code": nfcCode}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_PROJECT_FROM_NFC, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final projectID = response['GetProjectByNFC'][0]["ProjectID"]; + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: projectID, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> autoGenerateInvoiceERClinic({required int projectID}) async { + Map mapDevice = { + "ProjectID": projectID, + "ClinicID": "10", + "IsAdvanceAvailable": true, + "MemberID": 102, + "PaymentMethod": "VISA", + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + AUTO_GENERATE_INVOICE_ER, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: true, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/emergency_services/emergency_services_view_model.dart b/lib/features/emergency_services/emergency_services_view_model.dart new file mode 100644 index 0000000..ec65193 --- /dev/null +++ b/lib/features/emergency_services/emergency_services_view_model.dart @@ -0,0 +1,846 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart' as GMSMapServices; + +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/doctor_response_mapper.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_repo.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/EROnlineCheckInPaymentDetailsResponse.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/AmbulanceCallingPlace.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/request_model/PatientER_RC.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/AmbulanceRequestOrdersModel.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/PatientERTransportationMethod.dart' + show PatientERTransportationMethod; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/ProjectAvgERWaitingTime.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/rrt_procedures_response_model.dart'; +import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart' show PlaceDetails; +import 'package:hmg_patient_app_new/features/location/PlacePrediction.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/login.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/call_ambulance_page.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_details_page.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/requesting_services_page.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/tracking_screen.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/nearest_er_page.dart'; +import 'package:hmg_patient_app_new/routes/app_routes.dart' show AppRoutes; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/expandable_bottom_sheet/model/BottomSheetType.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/order_tracking/order_tracking_state.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:huawei_map/huawei_map.dart' as HMSCameraServices; +import 'package:url_launcher/url_launcher.dart'; + +import '../location/GeocodeResponse.dart'; +import 'models/ambulance_direction.dart'; + +class EmergencyServicesViewModel extends ChangeNotifier { + EmergencyServicesRepo emergencyServicesRepo; + MyAppointmentsRepo appointmentRepo; + ErrorHandlerService errorHandlerService; + DialogService dialogService; + + Completer? gmsController; + Completer? hmsController; + + final NavigationService navServices; + final LocationUtils? locationUtils; + final AppState appState; + TextEditingController searchController = TextEditingController(); + + //loading variables + bool isERListLoading = false; + bool isTransportationOptionsLoading = false; + + List nearestERList = []; + List nearestERFilteredList = []; + + List RRTProceduresList = []; + + List? hospitalList; + List? hmgHospitalList; + List? hmcHospitalList; + List? displayList; + HospitalsModel? selectedHospital; + FacilitySelection selectedFacility = FacilitySelection.ALL; + int hmgCount = 0; + int hmcCount = 0; + bool pickupFromInsideTheLocation = true; + List? appointments; + List? orders = []; + + //ambulance selection data section + List transportationOptions = []; + PatientERTransportationMethod? selectedTransportOption; + AmbulanceCallingPlace callingPlace = AmbulanceCallingPlace.FROM_HOSPITAL; + AmbulanceDirection ambulanceDirection = AmbulanceDirection.ONE_WAY; + + late RRTProceduresResponseModel selectedRRTProcedure; + + bool patientHasAdvanceERBalance = false; + bool isERBookAppointment = false; + late EROnlineCheckInPaymentDetailsResponse erOnlineCheckInPaymentDetailsResponse; + + BottomSheetType bottomSheetType = BottomSheetType.FIXED; + + setSelectedRRTProcedure(RRTProceduresResponseModel procedure) { + selectedRRTProcedure = procedure; + notifyListeners(); + } + + get isGMSAvailable + { + return appState.isGMSAvailable; + } + + EmergencyServicesViewModel({ + required this.emergencyServicesRepo, + required this.errorHandlerService, + required this.navServices, + required this.locationUtils, + required this.appState, + required this.appointmentRepo, + required this.dialogService, + }); + + void setIsERBookAppointment(bool value) { + isERBookAppointment = value; + notifyListeners(); + } + + bool get isArabic => appState.isArabic(); + + bool haveAnAppointment = false; + + PatientAppointmentHistoryResponseModel? appointment; + + bool isMyAppointmentsLoading = false; + + Future getRRTProcedures({Function(dynamic)? onSuccess, Function(String)? onError}) async { + RRTProceduresList.clear(); + notifyListeners(); + + final result = await emergencyServicesRepo.getRRTProcedures(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + RRTProceduresList = apiResponse.data!; + selectedRRTProcedure = RRTProceduresList.first; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + void navigateToNearestERPage() { + locationUtils!.getLocation( + isShowConfirmDialog: true, + onSuccess: (position) { + navServices.push( + CustomPageRoute( + page: NearestErPage(), + ), + ); + getNearestER(); + }); + } + + void filterErList(String query) { + print("the query is $query"); + if (query.isEmpty) { + nearestERFilteredList = nearestERList; + } else { + nearestERFilteredList = nearestERList.where((er) => er.projectName != null && er.projectName!.toLowerCase().contains(query.toLowerCase())).toList(); + } + notifyListeners(); + } + + // Open directions (navigation) from current location to destination. + Future openDirections({ + required double destLat, + required double destLng, + String? travelMode, // driving, walking, bicycling, transit + }) async { + // Try Google Maps app navigation intent (android/iOS) + final modeParam = travelMode == null ? 'driving' : travelMode; + final googleNavUri = Uri.parse('google.navigation:q=$destLat,$destLng&mode=${modeParam.substring(0, 1)}'); // mode: d/w/b/t by scheme + final universalUrl = Uri.parse('https://www.google.com/maps/dir/?api=1&destination=$destLat,$destLng&travelmode=$modeParam'); + + if (await canLaunchUrl(googleNavUri)) { + await launchUrl(googleNavUri, mode: LaunchMode.externalApplication); + } else { + await launchUrl(universalUrl, mode: LaunchMode.externalApplication); + } + } + + Future openDialer(String phoneNumber) async { + final Uri telUri = Uri(scheme: 'tel', path: phoneNumber); + + if (await canLaunchUrl(telUri)) { + await launchUrl(telUri, mode: LaunchMode.externalApplication); + } else { + throw 'Could not open dialer for $phoneNumber'; + } + } + + FutureOr getNearestER() async { + isERListLoading = true; + nearestERList = []; + nearestERFilteredList = []; + notifyListeners(); + var response = await emergencyServicesRepo.getNearestEr(); + isERListLoading = false; + notifyListeners(); + + response.fold( + (failure) async {}, + (apiResponse) { + isERListLoading = false; + if (apiResponse.messageStatus == 1) { + nearestERList = apiResponse.data!; + nearestERFilteredList = nearestERList; + } + }, + ); + } + + GMSMapServices.CameraPosition getGMSLocation() { + return GMSMapServices.CameraPosition(target: GMSMapServices.LatLng(appState.userLat, appState.userLong), zoom: 18); + } + + handleGMSMapCameraMoved(GMSMapServices.CameraPosition value) { + //todo handle the camera moved position for GMS devices + } + + HMSCameraServices.CameraPosition getHMSLocation() { + return HMSCameraServices.CameraPosition(target: HMSCameraServices.LatLng(appState.userLat, appState.userLong), zoom: 18); + } + + handleHMSMapCameraMoved(HMSCameraServices.CameraPosition value) { + //todo handle the camera moved position for HMS devices + } + + void navigateTOAmbulancePage() { + placeValueInController(); + getProjects(); + flushData(); + selectedFacility = FacilitySelection.ALL; + + print("the app state is ${appState.isAuthenticated}"); + if (appState.isAuthenticated) { + locationUtils!.getLocation( + isShowConfirmDialog: true, + onSuccess: (position) { + updateBottomSheetState(BottomSheetType.FIXED); + navServices.push( + CustomPageRoute( + page: CallAmbulancePage(), direction: AxisDirection.down), + ); + }); + } else { + dialogService.showErrorBottomSheet( + message: "You Need To Login First To Continue".needTranslation, + onOkPressed: () { + navServices.pop(); + navServices.pushAndReplace( + AppRoutes.loginScreen + ); + }); + } + } + + void navigateToEROnlineCheckIn() { + navServices.push( + CustomPageRoute(page: ErOnlineCheckinHome()), + ); + } + + void navigateToEROnlineCheckInPaymentPage() { + navServices.push( + CustomPageRoute(page: ErOnlineCheckinPaymentDetailsPage()), + ); + } + + void updateBottomSheetState(BottomSheetType sheetType) { + if (sheetType == BottomSheetType.EXPANDED && selectedHospital == null) { + dialogService.showErrorBottomSheet(message: "Kindly Select Hospital".needTranslation); + return; + } + bottomSheetType = sheetType; + if (sheetType == BottomSheetType.EXPANDED) { + clearAppointmentData(); + } + notifyListeners(); + } + + void setIsGMSAvailable(bool value) { + notifyListeners(); + } + Future checkPatientERAdvanceBalance({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await emergencyServicesRepo.checkPatientERAdvanceBalance(); + + result.fold( + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) { + patientHasAdvanceERBalance = false; + isERBookAppointment = true; + if (onSuccess != null) { + onSuccess(failure.message); + } + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + patientHasAdvanceERBalance = false; + isERBookAppointment = true; + } else if (apiResponse.messageStatus == 1) { + patientHasAdvanceERBalance = apiResponse.data; + isERBookAppointment = !patientHasAdvanceERBalance; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientERPaymentInformation({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await emergencyServicesRepo.checkPatientERPaymentInformation(projectID: selectedHospital!.iD); + + result.fold( + (failure) { + if (onError != null) { + onError(failure.message); + } + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + } else if (apiResponse.messageStatus == 1) { + erOnlineCheckInPaymentDetailsResponse = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future ER_CreateAdvancePayment({required String paymentMethodName, required String paymentReference, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await emergencyServicesRepo.ER_CreateAdvancePayment( + projectID: selectedHospital!.iD, + authUser: appState.getAuthenticatedUser()!, + paymentAmount: erOnlineCheckInPaymentDetailsResponse.patientShareWithTax!, + paymentMethodName: paymentMethodName, + paymentReference: paymentReference); + + result.fold( + (failure) { + if (onError != null) { + onError(failure.message); + } + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + } else if (apiResponse.messageStatus == 1) { + // erOnlineCheckInPaymentDetailsResponse = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse.data); + } + } + }, + ); + } + + Future addAdvanceNumberRequest( + {required String advanceNumber, required String paymentReference, required String appointmentNo, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await emergencyServicesRepo.addAdvanceNumberRequest(advanceNumber: advanceNumber, paymentReference: paymentReference, appointmentNo: appointmentNo); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getProjectIDFromNFC({required String nfcCode, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await emergencyServicesRepo.getProjectIDFromNFC(nfcCode: nfcCode); + + result.fold( + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) { + if (onError != null) { + onError(failure.message); + } + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + if (onError != null) { + onError(apiResponse.errorMessage!); + } + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse.data); + } + } + }, + ); + } + + Future autoGenerateInvoiceERClinic({required int projectID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await emergencyServicesRepo.autoGenerateInvoiceERClinic(projectID: projectID); + + result.fold( + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) { + if (onError != null) { + onError(failure.message); + } + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + if (onError != null) { + onError(apiResponse.data["InvoiceResponse"]["Message"]); + } + } else if (apiResponse.messageStatus == 1) { + patientHasAdvanceERBalance = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse.data); + } + } + }, + ); + } + + Future getTransportationOption() async { + //handle the cache if the data is present then dont fetch it in the authenticated lifecycle + + print("the app state is ${appState.isAuthenticated}"); + if (appState.isAuthenticated == false) { + dialogService.showErrorBottomSheet( + message: "You Need To Login First To Continue".needTranslation, + onOkPressed: () { + navServices.pop(); + print("inside the ok button"); + getIt().onLoginPressed(); + }); + return; + } + + if (transportationOptions.isNotEmpty) return; + + int? id = appState.getAuthenticatedUser()?.patientId; + LoaderBottomSheet.showLoader( + loadingText: "Getting Ambulance Transport Option".needTranslation); + + notifyListeners(); + var response = await emergencyServicesRepo.getTransportationMethods(id: id); + + response.fold( + (failure) async { + LoaderBottomSheet.hideLoader(); + }, + (apiResponse) { + transportationOptions = apiResponse.data!; + LoaderBottomSheet.hideLoader(); + notifyListeners(); + }, + ); + } + + Future getTransportationMethods() async { + int? id = appState.getAuthenticatedUser()?.patientId; + LoaderBottomSheet.showLoader( + loadingText: "Getting Ambulance Transport Option".needTranslation); + + notifyListeners(); + var response = await emergencyServicesRepo.getTransportationMethods(id: id); + + response.fold( + (failure) async { + LoaderBottomSheet.hideLoader(); + }, + (apiResponse) { + transportationOptions = apiResponse.data!; + LoaderBottomSheet.hideLoader(); + notifyListeners(); + }, + ); + } + + void setTransportationOption(PatientERTransportationMethod item) { + selectedTransportOption = item; + } + + void updateCallingPlace(AmbulanceCallingPlace? value) { + callingPlace = value!; + notifyListeners(); + } + + void updateDirection(AmbulanceDirection? value) { + ambulanceDirection = value!; + notifyListeners(); + } + + void placeValueInController() { + if (isGMSAvailable) { + gmsController = Completer(); + } else { + hmsController = Completer(); + } + } + + void moveController(Location location) { + if (isGMSAvailable) { + gmsController?.future.then((controller) { + controller.animateCamera( + GMSMapServices.CameraUpdate.newCameraPosition( + GMSMapServices.CameraPosition( + target: GMSMapServices.LatLng(location.lat, location.lng), + zoom: 18, + ), + ), + ); + }); + } else { + hmsController?.future.then((controller) { + controller.animateCamera( + HMSCameraServices.CameraUpdate.newCameraPosition( + HMSCameraServices.CameraPosition( + target: HMSCameraServices.LatLng(location.lat, location.lng), + zoom: 18, + ), + ), + ); + }); + } + } + + void moveToCurrentLocation() { + moveController(Location(lat: appState.userLat, lng: appState.userLong)); + } + + FutureOr getProjects() async { + // if (hospitalList.isNotEmpty) return; + var response = await emergencyServicesRepo.getProjectList(); + + response.fold( + (failure) async {}, + (apiResponse) async { + List? data = apiResponse.data; + if (data == null) return; + hospitalList = data; + hmgHospitalList = data.where((e) => e.isHMC == false).toList(); + hmcHospitalList = data.where((e) => e.isHMC == true).toList(); + hmgCount = hmgHospitalList?.length ?? 0; + hmcCount = hmcHospitalList?.length ?? 0; + getDisplayList(); + notifyListeners(); + }, + ); + } + + setSelectedFacility(FacilitySelection selection) { + selectedFacility = selection; + notifyListeners(); + } + + searchHospitals(String query) { + if (query.isEmpty) { + getDisplayList(); + return; + } + List? sourceList; + switch (selectedFacility) { + case FacilitySelection.ALL: + sourceList = hospitalList; + break; + case FacilitySelection.HMG: + sourceList = hmgHospitalList; + break; + case FacilitySelection.HMC: + sourceList = hmcHospitalList; + break; + } + displayList = sourceList + ?.where((hospital) => + hospital.name != null && + hospital.name!.toLowerCase().contains(query.toLowerCase())) + .toList(); + notifyListeners(); + } + + getDisplayList() { + switch (selectedFacility) { + case FacilitySelection.ALL: + displayList = hospitalList; + break; + case FacilitySelection.HMG: + displayList = hmgHospitalList; + break; + case FacilitySelection.HMC: + displayList = hmcHospitalList; + break; + } + notifyListeners(); + } + + + void setSelectedHospital(HospitalsModel? hospital) { + selectedHospital = hospital; + notifyListeners(); + } + + String? getSelectedHospitalName() { + return selectedHospital?.getName(isArabic); + } + + void updateThePickupPlaceFromLocation(bool value) { + pickupFromInsideTheLocation = value; + notifyListeners(); + } + + void flushData() { + selectedHospital = null; + displayList = hospitalList; + selectedFacility = FacilitySelection.ALL; + pickupFromInsideTheLocation = false; + haveAnAppointment = false; + appointment = null; + notifyListeners(); + } + + void clearAppointmentData() { + haveAnAppointment = false; + appointment = null; + notifyListeners(); + } + + void flushPickupInformation() { + ambulanceDirection = AmbulanceDirection.ONE_WAY; + callingPlace = AmbulanceCallingPlace.FROM_HOSPITAL; + notifyListeners(); + } + + num getTotalPrice() { + print("the ambulance direction is $ambulanceDirection"); + switch (ambulanceDirection) { + case AmbulanceDirection.ONE_WAY: + return selectedTransportOption?.priceTotal ?? 0; + case AmbulanceDirection.TWO_WAY: + return (selectedTransportOption?.priceTotal ?? 0) * 2; + } + } + + Future updateAppointment(bool value) async { + + if (value) { + await getAppointments(); + } else { + clearAppointmentData(); + } + if(appointments?.isNotEmpty == true) { + haveAnAppointment = value; + } + notifyListeners(); + } + + Future getAppointments() async { + LoaderBottomSheet.showLoader(loadingText: "Fetching Appointment".needTranslation); + var result = await appointmentRepo.getPatientAppointments(isActiveAppointment: true, isArrivedAppointments: false); + LoaderBottomSheet.hideLoader(); + + result.fold((failure) { + haveAnAppointment = false; + notifyListeners(); + errorHandlerService.handleError(failure: failure); + }, (response) { + appointments = response.data; + if (appointments?.isEmpty == true) { + haveAnAppointment = false; + dialogService.showErrorBottomSheet(message: "Unable to Fetch Appointment"); + } + notifyListeners(); + }); + } + + void setSelectedAppointment(PatientAppointmentHistoryResponseModel selectedAppointment) { + appointment = selectedAppointment; + notifyListeners(); + } + + void checkHasAppointment() { + if (appointment == null) { + haveAnAppointment = false; + } + notifyListeners(); + } + + FutureOr submitAmbulanceRequest(GeocodeResult? result, PlaceDetails? place, PlacePrediction? placePrediction) async { + PatientER_RC request = createRequest(result, place, placePrediction); + navServices.push(CustomPageRoute(page: RequestingServicesPage())); + + var response = await emergencyServicesRepo.submitAmbulanceRequest(request); + response.fold((failure) { + navServices.pushAndRemoveUntil( + CustomPageRoute( + page: TrackingScreen( + state: OrderTrackingState.failed, + )), + ModalRoute.withName("/EmergencyServicesPage")); + }, (success) { + getTransportationOrders(shouldNavigateToTrackingScreen: true); + }); + } + + Future getTransportationOrders({bool shouldNavigateToTrackingScreen = false, bool showLoader = false}) async { + if(shouldNavigateToTrackingScreen == false && showLoader ) { + LoaderBottomSheet.showLoader(loadingText: "Fetching Orders"); + } + int? id = appState.getAuthenticatedUser()?.patientId; + + var response = await emergencyServicesRepo.getTransportationOrders(id: id); + if(shouldNavigateToTrackingScreen == false && showLoader ) { + LoaderBottomSheet.hideLoader();} + response.fold( + (failure) async { + if (shouldNavigateToTrackingScreen) { + navServices.pushAndRemoveUntil(CustomPageRoute(page: TrackingScreen(state: OrderTrackingState.waitingForCall)), ModalRoute.withName("/EmergencyServicesPage")); + } + }, + (apiResponse) { + if (shouldNavigateToTrackingScreen) { + navServices.pushAndRemoveUntil( + CustomPageRoute( + page: TrackingScreen( + state: OrderTrackingState.waitingForCall, + order: apiResponse.data?.firstWhere((element) => element.statusId == 1), + )), + ModalRoute.withName("/EmergencyServicesPage")); + } + + orders = apiResponse.data; + notifyListeners(); + }, + ); + } + + PatientER_RC createRequest(GeocodeResult? result, PlaceDetails? place, PlacePrediction? placePrediction) { + PatientER_RC request = PatientER_RC(); + TransportationDetails transportationDetails = TransportationDetails(); + transportationDetails.requesterIsOutSA = false; + transportationDetails.pickupSpot = pickupFromInsideTheLocation ? 1 : 0; + + transportationDetails.tripType = ambulanceDirection == AmbulanceDirection.ONE_WAY ? 0 : 1; + transportationDetails.ambulate = (transportationOptions.indexOf(selectedTransportOption!) + 1); + transportationDetails.transportationType = selectedTransportOption?.iD.toString() ?? ""; + request.patientERTransportationMethod = selectedTransportOption; + transportationDetails.pickupUrgency = 1; + switch (callingPlace) { + case AmbulanceCallingPlace.FROM_HOSPITAL: + transportationDetails.dropoffLatitude = selectedHospital!.latitude; + transportationDetails.dropoffLongitude = selectedHospital!.longitude; + transportationDetails.dropoffLocationName = selectedHospital!.name; + transportationDetails.pickupLatitude = ((result?.geometry.location.lat) ?? place?.lat)?.toStringAsFixed(6); + transportationDetails.pickupLongitude = ((result?.geometry.location.lng) ?? place?.lng)?.toStringAsFixed(6); + transportationDetails.pickupLocationName = result?.formattedAddress ?? placePrediction?.description; + transportationDetails.direction = 1; + break; + case AmbulanceCallingPlace.TO_HOSPITAL: + transportationDetails.pickupLatitude = selectedHospital!.latitude; + transportationDetails.pickupLongitude = selectedHospital!.longitude; + transportationDetails.pickupLocationName = selectedHospital!.name; + transportationDetails.dropoffLatitude = ((result?.geometry.location.lat) ?? place?.lat)?.toStringAsFixed(6); + transportationDetails.dropoffLongitude = ((result?.geometry.location.lng) ?? place?.lng)?.toStringAsFixed(6); + transportationDetails.dropoffLocationName = result?.formattedAddress ?? placePrediction?.description; + transportationDetails.direction = 0; + break; + } + AuthenticatedUser? user = appState.getAuthenticatedUser(); + if (user == null) throw Exception("Authentication Required to Continue"); + + request.patientIdentificationID = user.patientIdentificationNo; + request.projectID = user.projectId; + request.patientID = user.patientId; + transportationDetails.requesterIsOutSA = false; + transportationDetails.requesterMobileNo = user.mobileNumber; + transportationDetails.requesterFileNo = user.patientId; + transportationDetails.pickupDateTime = DateUtil.convertDateToStringLocation(DateTime.now()); + if (haveAnAppointment) { + transportationDetails.appointmentNo = appointment!.appointmentNo.toString(); + transportationDetails.appointmentClinicName = appointment!.clinicName; + transportationDetails.appointmentDoctorName = appointment!.doctorNameObj; + transportationDetails.appointmentBranch = appointment!.projectName; + transportationDetails.appointmentTime = appointment!.appointmentDate; + transportationDetails.haveAppointment = 1; + transportationDetails.dropoffLatitude = appointment!.latitude; + transportationDetails.dropoffLongitude = appointment!.longitude; + transportationDetails.dropoffLocationName = appointment!.projectName; + } + + transportationDetails.pickupSpot = pickupFromInsideTheLocation ? 1 : 0; + transportationDetails.ambulate = 3; + transportationDetails.ambulateTitle = "none"; + transportationDetails.notes = ""; + request.transportationDetails = transportationDetails; + + return request; + } + + void clearSearchText() { + searchController.clear(); + } + + Future cancelOrder(AmbulanceRequestOrdersModel? order, {bool shouldPop = false}) async { + dialogService.showCommonBottomSheetWithoutH( + message: "Do you want to cancel the order".needTranslation, + onOkPressed: () async { + navServices.pop(); + LoaderBottomSheet.showLoader(loadingText: "Cancelling Order".needTranslation); + var response = await emergencyServicesRepo.cancelOrder(order?.iD, appState.getAuthenticatedUser()?.patientId ?? 0); + LoaderBottomSheet.hideLoader(); + response.fold((failure) => errorHandlerService.handleError(failure: failure), (success) { + getTransportationOrders(); + if (shouldPop) navServices.pop(); + }); + }, + onCancelPressed: () { + navServices.pop(); + }); + } +} diff --git a/lib/features/emergency_services/models/AmbulanceCallingPlace.dart b/lib/features/emergency_services/models/AmbulanceCallingPlace.dart new file mode 100644 index 0000000..cf648f7 --- /dev/null +++ b/lib/features/emergency_services/models/AmbulanceCallingPlace.dart @@ -0,0 +1,4 @@ +enum AmbulanceCallingPlace{ + FROM_HOSPITAL, + TO_HOSPITAL +} \ No newline at end of file diff --git a/lib/features/emergency_services/models/ambulance_direction.dart b/lib/features/emergency_services/models/ambulance_direction.dart new file mode 100644 index 0000000..d301921 --- /dev/null +++ b/lib/features/emergency_services/models/ambulance_direction.dart @@ -0,0 +1,3 @@ +enum AmbulanceDirection{ + ONE_WAY, TWO_WAY +} \ No newline at end of file diff --git a/lib/features/emergency_services/models/request_model/PatientER_RC.dart b/lib/features/emergency_services/models/request_model/PatientER_RC.dart new file mode 100644 index 0000000..9c3bbdc --- /dev/null +++ b/lib/features/emergency_services/models/request_model/PatientER_RC.dart @@ -0,0 +1,205 @@ + +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/PatientERTransportationMethod.dart' show PatientERTransportationMethod; + +class PatientER_RC { + double? versionID; + int? channel; + int? languageID; + String? iPAdress; + String? generalid; + bool? patientOutSA; + String? sessionID; + bool? isDentalAllowedBackend; + int? deviceTypeID; + int? patientID; + String? tokenID; + int? patientTypeID; + int? patientType; + int? orderServiceID; + String? patientIdentificationID; + dynamic patientOutSa; + int? projectID; + int? lineItemNo; + TransportationDetails? transportationDetails; + PatientERTransportationMethod? patientERTransportationMethod; + + PatientER_RC( + {this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.patientID, + this.tokenID, + this.patientTypeID, + this.patientType, + this.orderServiceID, + this.patientIdentificationID, + this.patientOutSa, + this.projectID, + this.lineItemNo, + this.transportationDetails }); + + PatientER_RC.fromJson(Map json) { + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + patientID = json['PatientID']; + tokenID = json['TokenID']; + patientTypeID = json['PatientTypeID']; + patientType = json['PatientType']; + orderServiceID = json['OrderServiceID']; + patientIdentificationID = json['PatientIdentificationID']; + patientOutSa = json['patientOutSa']; + projectID = json['projectID']; + lineItemNo = json['lineItemNo']; + transportationDetails = json['transportationDetails'] != null + ? new TransportationDetails.fromJson(json['transportationDetails']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['PatientOutSA'] = this.patientOutSA; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + data['PatientID'] = this.patientID; + data['TokenID'] = this.tokenID; + data['PatientTypeID'] = this.patientTypeID; + data['PatientType'] = this.patientType; + data['OrderServiceID'] = this.orderServiceID; + data['PatientIdentificationID'] = this.patientIdentificationID; + data['patientOutSa'] = this.patientOutSa; + data['projectID'] = this.projectID; + data['lineItemNo'] = this.lineItemNo; + if (this.transportationDetails != null) { + data['transportationDetails'] = this.transportationDetails!.toJson(); + } + return data; + } +} + +class TransportationDetails { + int? direction; + int? haveAppointment; + int? tripType; + int? pickupUrgency; + int? pickupSpot; + String? pickupDateTime; + String? transportationType; + int? ambulate; + String? ambulateTitle; + String? notes; + int? requesterFileNo; + String? requesterMobileNo; + bool? requesterIsOutSA; + String? pickupLocationName; + String? dropoffLocationName; + String? pickupLatitude; + String? pickupLongitude; + String? dropoffLatitude; + String? dropoffLongitude; + String? appointmentNo; + String? appointmentClinicName; + String? appointmentDoctorName; + String? appointmentBranch; + String? appointmentTime; + + TransportationDetails( + {this.direction, + this.haveAppointment = 0, + this.tripType, + this.pickupUrgency, + this.pickupSpot, + this.pickupDateTime, + this.transportationType, + this.ambulate, + this.ambulateTitle, + this.notes, + this.requesterFileNo, + this.requesterMobileNo, + this.requesterIsOutSA, + this.pickupLocationName, + this.dropoffLocationName, + this.pickupLatitude, + this.pickupLongitude, + this.dropoffLatitude, + this.dropoffLongitude, + this.appointmentNo = "0", + this.appointmentClinicName = "", + this.appointmentDoctorName = "", + this.appointmentBranch = "", + this.appointmentTime = ""}); + + TransportationDetails.fromJson(Map json) { + direction = json['direction']; + haveAppointment = json['haveAppointment']; + tripType = json['tripType']; + pickupUrgency = json['pickupUrgency']; + pickupSpot = json['pickupSpot']; + pickupDateTime = json['pickupDateTime']; + transportationType = json['transportationType']; + ambulate = json['ambulate']; + ambulateTitle = ""; + notes = json['notes']; + requesterFileNo = json['requesterFileNo']; + requesterMobileNo = json['requesterMobileNo']; + requesterIsOutSA = json['requesterIsOutSA']; + pickupLocationName = json['pickupLocationName']; + dropoffLocationName = json['dropoffLocationName']; + pickupLatitude = json['pickup_Latitude']; + pickupLongitude = json['pickup_Longitude']; + dropoffLatitude = json['dropoff_Latitude']; + dropoffLongitude = json['dropoff_Longitude']; + appointmentNo = json['appointmentNo']; + appointmentClinicName = json['appointmentClinicName']; + appointmentDoctorName = json['appointmentDoctorName']; + appointmentBranch = json['appointmentBranch']; + appointmentTime = json['appointmentTime']; + } + + Map toJson() { + final Map data = new Map(); + data['direction'] = this.direction; + data['haveAppointment'] = this.haveAppointment; + data['tripType'] = this.tripType; + data['pickupUrgency'] = this.pickupUrgency; + data['pickupSpot'] = this.pickupSpot; + data['pickupDateTime'] = this.pickupDateTime; + data['transportationType'] = this.transportationType; + data['ambulate'] = this.ambulate; + data['ambulateTitle'] = this.ambulateTitle; + data['notes'] = this.notes; + data['requesterFileNo'] = this.requesterFileNo; + data['requesterMobileNo'] = this.requesterMobileNo; + data['requesterIsOutSA'] = this.requesterIsOutSA; + data['pickupLocationName'] = this.pickupLocationName; + data['dropoffLocationName'] = this.dropoffLocationName; + data['pickup_Latitude'] = this.pickupLatitude; + data['pickup_Longitude'] = this.pickupLongitude; + data['dropoff_Latitude'] = this.dropoffLatitude; + data['dropoff_Longitude'] = this.dropoffLongitude; + data['appointmentNo'] = this.appointmentNo; + data['appointmentClinicName'] = this.appointmentClinicName; + data['appointmentDoctorName'] = this.appointmentDoctorName; + data['appointmentBranch'] = this.appointmentBranch; + data['appointmentTime'] = this.appointmentTime; + return data; + } +} diff --git a/lib/features/emergency_services/models/resp_model/AmbulanceRequestOrdersModel.dart b/lib/features/emergency_services/models/resp_model/AmbulanceRequestOrdersModel.dart new file mode 100644 index 0000000..6993183 --- /dev/null +++ b/lib/features/emergency_services/models/resp_model/AmbulanceRequestOrdersModel.dart @@ -0,0 +1,346 @@ +class AmbulanceRequestOrdersModel { + String? statusText; + num? paymentStatus; + dynamic clientRequestid; + dynamic paymentStatusText; + dynamic projectName; + String? nearestProjectName; + num? paymentAmount; + WFOrder? wFOrder; + String? serviceText; + bool? isSentForApproval; + num? exaCartOrderId; + String? exaCartGUID; + bool? isTimer; + num? timeSeconds; + num? totalPendingSeconds; + num? timeMinute; + num? timeHour; + num? timeTotalSeconds; + num? timeTotalMinute; + num? timeTotalHour; + dynamic approvalStatus; + bool? isActive; + num? clickButton; + dynamic orderHistory; + String? pickupLocation; + String? dropOffLocation; + String? clinicName; + String? doctorName; + String? branch; + String? time; + String? notes; + int? iD; + num? patientId; + num? patientOutSa; + bool? isOutPatient; + num? projectId; + num? nearestProjectId; + dynamic longitude; + dynamic latitude; + dynamic appointmentNo; + dynamic dischargeId; + int? statusId; + num? serviceId; + num? channel; + Orderpayment? orderpayment; + dynamic wforder; + dynamic orderapprovalobj; + String? created; + dynamic createdBy; + dynamic modified; + dynamic modifiedBy; + bool? isDeleted; + + AmbulanceRequestOrdersModel( + {this.statusText, + this.paymentStatus, + this.clientRequestid, + this.paymentStatusText, + this.projectName, + this.nearestProjectName, + this.paymentAmount, + this.wFOrder, + this.serviceText, + this.isSentForApproval, + this.exaCartOrderId, + this.exaCartGUID, + this.isTimer, + this.timeSeconds, + this.totalPendingSeconds, + this.timeMinute, + this.timeHour, + this.timeTotalSeconds, + this.timeTotalMinute, + this.timeTotalHour, + this.approvalStatus, + this.isActive, + this.clickButton, + this.orderHistory, + this.pickupLocation, + this.dropOffLocation, + this.clinicName, + this.doctorName, + this.branch, + this.time, + this.notes, + this.iD, + this.patientId, + this.patientOutSa, + this.isOutPatient, + this.projectId, + this.nearestProjectId, + this.longitude, + this.latitude, + this.appointmentNo, + this.dischargeId, + this.statusId, + this.serviceId, + this.channel, + this.orderpayment, + this.wforder, + this.orderapprovalobj, + this.created, + this.createdBy, + this.modified, + this.modifiedBy, + this.isDeleted}); + + AmbulanceRequestOrdersModel.fromJson(Map json) { + statusText = json['StatusText']; + paymentStatus = json['PaymentStatus']; + clientRequestid = json['ClientRequestid']; + paymentStatusText = json['PaymentStatusText']; + projectName = json['ProjectName']; + nearestProjectName = json['NearestProjectName']; + paymentAmount = json['PaymentAmount']; + wFOrder = json['WF_order'] != null + ? new WFOrder.fromJson(json['WF_order']) + : null; + serviceText = json['ServiceText']; + isSentForApproval = json['isSentForApproval']; + exaCartOrderId = json['ExaCart_OrderId']; + exaCartGUID = json['ExaCart_GUID']; + isTimer = json['isTimer']; + timeSeconds = json['TimeSeconds']; + totalPendingSeconds = json['TotalPendingSeconds']; + timeMinute = json['TimeMinute']; + timeHour = json['TimeHour']; + timeTotalSeconds = json['TimeTotalSeconds']; + timeTotalMinute = json['TimeTotalMinute']; + timeTotalHour = json['TimeTotalHour']; + approvalStatus = json['ApprovalStatus']; + isActive = json['isActive']; + clickButton = json['ClickButton']; + orderHistory = json['OrderHistory']; + pickupLocation = json['PickupLocation']; + dropOffLocation = json['DropOffLocation']; + clinicName = json['clinicName']; + doctorName = json['DoctorName']; + branch = json['Branch']; + time = json['Time']; + notes = json['Notes']; + iD = json['ID']; + patientId = json['PatientId']; + patientOutSa = json['PatientOutSa']; + isOutPatient = json['IsOutPatient']; + projectId = json['ProjectId']; + nearestProjectId = json['NearestProjectId']; + longitude = json['Longitude']; + latitude = json['Latitude']; + appointmentNo = json['AppointmentNo']; + dischargeId = json['DischargeId']; + statusId = json['StatusId']; + serviceId = json['ServiceId']; + channel = json['Channel']; + orderpayment = json['orderpayment'] != null + ? new Orderpayment.fromJson(json['orderpayment']) + : null; + wforder = json['wforder']; + orderapprovalobj = json['orderapprovalobj']; + created = json['Created']; + createdBy = json['CreatedBy']; + modified = json['Modified']; + modifiedBy = json['ModifiedBy']; + isDeleted = json['IsDeleted']; + } + + Map toJson() { + final Map data = new Map(); + data['StatusText'] = this.statusText; + data['PaymentStatus'] = this.paymentStatus; + data['ClientRequestid'] = this.clientRequestid; + data['PaymentStatusText'] = this.paymentStatusText; + data['ProjectName'] = this.projectName; + data['NearestProjectName'] = this.nearestProjectName; + data['PaymentAmount'] = this.paymentAmount; + if (this.wFOrder != null) { + data['WF_order'] = this.wFOrder!.toJson(); + } + data['ServiceText'] = this.serviceText; + data['isSentForApproval'] = this.isSentForApproval; + data['ExaCart_OrderId'] = this.exaCartOrderId; + data['ExaCart_GUID'] = this.exaCartGUID; + data['isTimer'] = this.isTimer; + data['TimeSeconds'] = this.timeSeconds; + data['TotalPendingSeconds'] = this.totalPendingSeconds; + data['TimeMinute'] = this.timeMinute; + data['TimeHour'] = this.timeHour; + data['TimeTotalSeconds'] = this.timeTotalSeconds; + data['TimeTotalMinute'] = this.timeTotalMinute; + data['TimeTotalHour'] = this.timeTotalHour; + data['ApprovalStatus'] = this.approvalStatus; + data['isActive'] = this.isActive; + data['ClickButton'] = this.clickButton; + data['OrderHistory'] = this.orderHistory; + data['PickupLocation'] = this.pickupLocation; + data['DropOffLocation'] = this.dropOffLocation; + data['clinicName'] = this.clinicName; + data['DoctorName'] = this.doctorName; + data['Branch'] = this.branch; + data['Time'] = this.time; + data['Notes'] = this.notes; + data['ID'] = this.iD; + data['PatientId'] = this.patientId; + data['PatientOutSa'] = this.patientOutSa; + data['IsOutPatient'] = this.isOutPatient; + data['ProjectId'] = this.projectId; + data['NearestProjectId'] = this.nearestProjectId; + data['Longitude'] = this.longitude; + data['Latitude'] = this.latitude; + data['AppointmentNo'] = this.appointmentNo; + data['DischargeId'] = this.dischargeId; + data['StatusId'] = this.statusId; + data['ServiceId'] = this.serviceId; + data['Channel'] = this.channel; + if (this.orderpayment != null) { + data['orderpayment'] = this.orderpayment!.toJson(); + } + data['wforder'] = this.wforder; + data['orderapprovalobj'] = this.orderapprovalobj; + data['Created'] = this.created; + data['CreatedBy'] = this.createdBy; + data['Modified'] = this.modified; + data['ModifiedBy'] = this.modifiedBy; + data['IsDeleted'] = this.isDeleted; + return data; + } +} + +class WFOrder { + dynamic wfButtonsDTO; + num? iD; + num? orderId; + num? previousStep; + num? nextStep; + num? serviceId; + dynamic order; + String? created; + dynamic createdBy; + dynamic modified; + dynamic modifiedBy; + bool? isDeleted; + + WFOrder( + {this.wfButtonsDTO, + this.iD, + this.orderId, + this.previousStep, + this.nextStep, + this.serviceId, + this.order, + this.created, + this.createdBy, + this.modified, + this.modifiedBy, + this.isDeleted}); + + WFOrder.fromJson(Map json) { + wfButtonsDTO = json['wf_ButtonsDTO']; + iD = json['ID']; + orderId = json['OrderId']; + previousStep = json['PreviousStep']; + nextStep = json['NextStep']; + serviceId = json['ServiceId']; + order = json['Order']; + created = json['Created']; + createdBy = json['CreatedBy']; + modified = json['Modified']; + modifiedBy = json['ModifiedBy']; + isDeleted = json['IsDeleted']; + } + + Map toJson() { + final Map data = new Map(); + data['wf_ButtonsDTO'] = this.wfButtonsDTO; + data['ID'] = this.iD; + data['OrderId'] = this.orderId; + data['PreviousStep'] = this.previousStep; + data['NextStep'] = this.nextStep; + data['ServiceId'] = this.serviceId; + data['Order'] = this.order; + data['Created'] = this.created; + data['CreatedBy'] = this.createdBy; + data['Modified'] = this.modified; + data['ModifiedBy'] = this.modifiedBy; + data['IsDeleted'] = this.isDeleted; + return data; + } +} + +class Orderpayment { + num? iD; + num? orderId; + dynamic clientRequestId; + num? totalAmount; + num? paymentStatus; + dynamic order; + String? created; + dynamic createdBy; + dynamic modified; + dynamic modifiedBy; + bool? isDeleted; + + Orderpayment( + {this.iD, + this.orderId, + this.clientRequestId, + this.totalAmount, + this.paymentStatus, + this.order, + this.created, + this.createdBy, + this.modified, + this.modifiedBy, + this.isDeleted}); + + Orderpayment.fromJson(Map json) { + iD = json['ID']; + orderId = json['OrderId']; + clientRequestId = json['ClientRequestId']; + totalAmount = json['TotalAmount']; + paymentStatus = json['PaymentStatus']; + order = json['Order']; + created = json['Created']; + createdBy = json['CreatedBy']; + modified = json['Modified']; + modifiedBy = json['ModifiedBy']; + isDeleted = json['IsDeleted']; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['OrderId'] = this.orderId; + data['ClientRequestId'] = this.clientRequestId; + data['TotalAmount'] = this.totalAmount; + data['PaymentStatus'] = this.paymentStatus; + data['Order'] = this.order; + data['Created'] = this.created; + data['CreatedBy'] = this.createdBy; + data['Modified'] = this.modified; + data['ModifiedBy'] = this.modifiedBy; + data['IsDeleted'] = this.isDeleted; + return data; + } +} diff --git a/lib/features/emergency_services/models/resp_model/EROnlineCheckInPaymentDetailsResponse.dart b/lib/features/emergency_services/models/resp_model/EROnlineCheckInPaymentDetailsResponse.dart new file mode 100644 index 0000000..5cac2cc --- /dev/null +++ b/lib/features/emergency_services/models/resp_model/EROnlineCheckInPaymentDetailsResponse.dart @@ -0,0 +1,108 @@ +class EROnlineCheckInPaymentDetailsResponse { + num? cashPrice; + num? cashPriceTax; + num? cashPriceWithTax; + int? companyId; + String? companyName; + num? companyShareWithTax; + dynamic errCode; + int? groupID; + String? insurancePolicyNo; + String? message; + String? patientCardID; + num? patientShare; + num? patientShareWithTax; + num? patientTaxAmount; + int? policyId; + String? policyName; + String? procedureId; + String? procedureName; + dynamic setupID; + int? statusCode; + String? subPolicyNo; + bool? isCash; + bool? isEligible; + bool? isInsured; + + EROnlineCheckInPaymentDetailsResponse( + {this.cashPrice, + this.cashPriceTax, + this.cashPriceWithTax, + this.companyId, + this.companyName, + this.companyShareWithTax, + this.errCode, + this.groupID, + this.insurancePolicyNo, + this.message, + this.patientCardID, + this.patientShare, + this.patientShareWithTax, + this.patientTaxAmount, + this.policyId, + this.policyName, + this.procedureId, + this.procedureName, + this.setupID, + this.statusCode, + this.subPolicyNo, + this.isCash, + this.isEligible, + this.isInsured}); + + EROnlineCheckInPaymentDetailsResponse.fromJson(Map json) { + cashPrice = json['CashPrice']; + cashPriceTax = json['CashPriceTax']; + cashPriceWithTax = json['CashPriceWithTax']; + companyId = json['CompanyId']; + companyName = json['CompanyName']; + companyShareWithTax = json['CompanyShareWithTax']; + errCode = json['ErrCode']; + groupID = json['GroupID']; + insurancePolicyNo = json['InsurancePolicyNo']; + message = json['Message']; + patientCardID = json['PatientCardID']; + patientShare = json['PatientShare']; + patientShareWithTax = json['PatientShareWithTax']; + patientTaxAmount = json['PatientTaxAmount']; + policyId = json['PolicyId']; + policyName = json['PolicyName']; + procedureId = json['ProcedureId']; + procedureName = json['ProcedureName']; + setupID = json['SetupID']; + statusCode = json['StatusCode']; + subPolicyNo = json['SubPolicyNo']; + isCash = json['IsCash']; + isEligible = json['IsEligible']; + isInsured = json['IsInsured']; + } + + Map toJson() { + final Map data = new Map(); + data['CashPrice'] = this.cashPrice; + data['CashPriceTax'] = this.cashPriceTax; + data['CashPriceWithTax'] = this.cashPriceWithTax; + data['CompanyId'] = this.companyId; + data['CompanyName'] = this.companyName; + data['CompanyShareWithTax'] = this.companyShareWithTax; + data['ErrCode'] = this.errCode; + data['GroupID'] = this.groupID; + data['InsurancePolicyNo'] = this.insurancePolicyNo; + data['Message'] = this.message; + data['PatientCardID'] = this.patientCardID; + data['PatientShare'] = this.patientShare; + data['PatientShareWithTax'] = this.patientShareWithTax; + data['PatientTaxAmount'] = this.patientTaxAmount; + data['PolicyId'] = this.policyId; + data['PolicyName'] = this.policyName; + data['ProcedureId'] = this.procedureId; + data['ProcedureName'] = this.procedureName; + data['SetupID'] = this.setupID; + data['StatusCode'] = this.statusCode; + data['SubPolicyNo'] = this.subPolicyNo; + data['IsCash'] = this.isCash; + data['IsEligible'] = this.isEligible; + data['IsInsured'] = this.isInsured; + return data; + } +} diff --git a/lib/features/emergency_services/models/resp_model/PatientERTransportationMethod.dart b/lib/features/emergency_services/models/resp_model/PatientERTransportationMethod.dart new file mode 100644 index 0000000..e4e6c7d --- /dev/null +++ b/lib/features/emergency_services/models/resp_model/PatientERTransportationMethod.dart @@ -0,0 +1,56 @@ +class PatientERTransportationMethod { + int? iD; + String? serviceID; + int? orderServiceID; + String? text; + String? textN; + dynamic price; + dynamic priceVAT; + dynamic priceTotal; + bool? isEnabled; + int? orderId; + int? quantity; + + PatientERTransportationMethod( + {this.iD, + this.serviceID, + this.orderServiceID, + this.text, + this.textN, + this.price, + this.priceVAT, + this.priceTotal, + this.isEnabled, + this.orderId, + this.quantity}); + + PatientERTransportationMethod.fromJson(Map json) { + iD = json['ID']; + serviceID = json['ServiceID']; + orderServiceID = json['OrderServiceID']; + text = json['Text']; + textN = json['TextN']; + price = json['Price']; + priceVAT = json['PriceVAT']; + priceTotal = json['PriceTotal']; + isEnabled = json['IsEnabled']; + orderId = json['OrderId']; + quantity = json['Quantity']; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['ServiceID'] = this.serviceID; + data['OrderServiceID'] = this.orderServiceID; + data['Text'] = this.text; + data['TextN'] = this.textN; + data['Price'] = this.price; + data['PriceVAT'] = this.priceVAT; + data['PriceTotal'] = this.priceTotal; + data['IsEnabled'] = this.isEnabled; + data['OrderId'] = this.orderId; + data['Quantity'] = this.quantity; + return data; + } +} \ No newline at end of file diff --git a/lib/features/emergency_services/models/resp_model/ProjectAvgERWaitingTime.dart b/lib/features/emergency_services/models/resp_model/ProjectAvgERWaitingTime.dart new file mode 100644 index 0000000..57d73ae --- /dev/null +++ b/lib/features/emergency_services/models/resp_model/ProjectAvgERWaitingTime.dart @@ -0,0 +1,114 @@ +class ProjectAvgERWaitingTime { + int? iD; + int? projectID; + int? avgTimeInMinutes; + String? avgTimeInHHMM; + dynamic distanceInKilometers; + String? latitude; + String? longitude; + String? phonenumber; + String? projectImageURL; + String? projectName; + + ProjectAvgERWaitingTime( + {this.iD, + this.projectID, + this.avgTimeInMinutes, + this.avgTimeInHHMM, + this.distanceInKilometers, + this.latitude, + this.longitude, + this.phonenumber, + this.projectImageURL, + this.projectName}); + + ProjectAvgERWaitingTime.fromJson(Map json) { + iD = json['ID']; + projectID = json['ProjectID']; + avgTimeInMinutes = json['AvgTimeInMinutes']; + avgTimeInHHMM = json['AvgTimeInHHMM']; + distanceInKilometers = json['DistanceInKilometers']; + latitude = json['Latitude']; + longitude = json['Longitude']; + phonenumber = json['PhoneNumber']; + projectImageURL = json['ProjectImageURL']; + projectName = json['ProjectName']; + } + + String getTime(){ + print("the name is $projectName"); + print("the avgTimeInMinutes is $avgTimeInMinutes"); + if(avgTimeInMinutes == null) return ""; + int hours = avgTimeInMinutes! ~/ 60; + int minutes = avgTimeInMinutes! % 60; + print("the time is ${"${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}"}"); + return "${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}"; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['ProjectID'] = this.projectID; + data['AvgTimeInMinutes'] = this.avgTimeInMinutes; + data['AvgTimeInHHMM'] = this.avgTimeInHHMM; + data['DistanceInKilometers'] = this.distanceInKilometers; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['PhoneNumber'] = this.phonenumber; + data['ProjectImageURL'] = this.projectImageURL; + data['ProjectName'] = this.projectName; + return data; + } +} +//class ProjectAvgERWaitingTime { +// int? iD; +// int? projectID; +// int? avgTimeInMinutes; +// String? avgTimeInHHMM; +// String? distanceInKilometers; +// String? latitude; +// String? longitude; +// String? phonenum?ber; +// String? projectImageURL; +// String? projectName; +// +// ProjectAvgERWaitingTime( +// {this.iD, +// this.projectID, +// this.avgTimeInMinutes, +// this.avgTimeInHHMM, +// this.distanceInKilometers, +// this.latitude, +// this.longitude, +// this.phonenum?ber, +// this.projectImageURL, +// this.projectName}); +// +// ProjectAvgERWaitingTime.fromJson(Map json) { +// iD = json['ID']; +// projectID = json['ProjectID']; +// avgTimeInMinutes = json['AvgTimeInMinutes']; +// avgTimeInHHMM = json['AvgTimeInHHMM']; +// distanceInKilometers = json['DistanceInKilometers']; +// latitude = json['Latitude']; +// longitude = json['Longitude']; +// phonenum?ber = json['Phonenum?ber']; +// projectImageURL = json['ProjectImageURL']; +// projectName = json['ProjectName']; +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['ID'] = this.iD; +// data['ProjectID'] = this.projectID; +// data['AvgTimeInMinutes'] = this.avgTimeInMinutes; +// data['AvgTimeInHHMM'] = this.avgTimeInHHMM; +// data['DistanceInKilometers'] = this.distanceInKilometers; +// data['Latitude'] = this.latitude; +// data['Longitude'] = this.longitude; +// data['Phonenum?ber'] = this.phonenum?ber; +// data['ProjectImageURL'] = this.projectImageURL; +// data['ProjectName'] = this.projectName; +// return data; +// } +//} \ No newline at end of file diff --git a/lib/features/emergency_services/models/resp_model/rrt_procedures_response_model.dart b/lib/features/emergency_services/models/resp_model/rrt_procedures_response_model.dart new file mode 100644 index 0000000..ea0559e --- /dev/null +++ b/lib/features/emergency_services/models/resp_model/rrt_procedures_response_model.dart @@ -0,0 +1,27 @@ +class RRTProceduresResponseModel { + num? patientShare; + num? patientShareWithTax; + num? patientTaxAmount; + String? procedureID; + String? procedureName; + + RRTProceduresResponseModel({this.patientShare, this.patientShareWithTax, this.patientTaxAmount, this.procedureID, this.procedureName}); + + RRTProceduresResponseModel.fromJson(Map json) { + patientShare = json['PatientShare']; + patientShareWithTax = json['PatientShareWithTax']; + patientTaxAmount = json['PatientTaxAmount']; + procedureID = json['ProcedureID']; + procedureName = json['ProcedureName']; + } + + Map toJson() { + final Map data = new Map(); + data['PatientShare'] = this.patientShare; + data['PatientShareWithTax'] = this.patientShareWithTax; + data['PatientTaxAmount'] = this.patientTaxAmount; + data['ProcedureID'] = this.procedureID; + data['ProcedureName'] = this.procedureName; + return data; + } +} diff --git a/lib/features/habib_wallet/habib_wallet_repo.dart b/lib/features/habib_wallet/habib_wallet_repo.dart new file mode 100644 index 0000000..659510d --- /dev/null +++ b/lib/features/habib_wallet/habib_wallet_repo.dart @@ -0,0 +1,229 @@ +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class HabibWalletRepo { + Future>> getPatientBalanceAmount(); + + Future>>> getProjectList(); + + Future>> HISCreateAdvancePayment( + {required String paymentMethodName, required num paidAmount, required String paymentReference, required String patientID, required int projectID, required String depositorName}); + + Future>> addAdvanceNumberRequest({required String advanceNumber, required String paymentReference}); + + Future>> getPatientInfoByPatientID({required String patientID}); +} + +class HabibWalletRepoImp implements HabibWalletRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + HabibWalletRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>> getPatientBalanceAmount() async { + Map mapDevice = {}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_PATIENT_AdVANCE_BALANCE_AMOUNT, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + // final list = response['ListPLO']; + // if (list == null || list.isEmpty) { + // throw Exception("lab list is empty"); + // } + + // final labOrders = list.map((item) => PatientLabOrdersResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response["TotalAdvanceBalanceAmount"], + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getProjectList() async { + Map request = {"IsOnlineCheckIn": true, "IsAdvancePayment": true}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PROJECT_LIST, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListProject']; + + final appointmentsList = list.map((item) => HospitalsModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: appointmentsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> HISCreateAdvancePayment( + {required String paymentMethodName, required num paidAmount, required String paymentReference, required String patientID, required int projectID, required String depositorName}) async { + Map request = { + "CustName": depositorName, + "CustID": patientID, + "SetupID": "010266", + "ProjectID": projectID, + "PatientID": patientID, + "AccountID": patientID, + "PaymentAmount": paidAmount, + "NationalityID": null, + "DepositorName": depositorName, + "CreatedBy": 3, + "PaymentMethodName": paymentMethodName, + "PaymentReference": paymentReference, + "PaymentMethod": paymentMethodName, + "IsAncillaryOrder": false + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + HIS_CREATE_ADVANCE_PAYMENT, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> addAdvanceNumberRequest({required String advanceNumber, required String paymentReference}) async { + Map requestBody = { + "AdvanceNumber": advanceNumber, + "AdvanceNumber_VP": advanceNumber, + "PaymentReferenceNumber": paymentReference, + "AppointmentID": 0, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ADD_ADVANCE_NUMBER_REQUEST, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> getPatientInfoByPatientID({required String patientID}) async { + Map requestBody = {"SearchPatientID": patientID}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_PATIENT_INFO_BY_ID, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/habib_wallet/habib_wallet_view_model.dart b/lib/features/habib_wallet/habib_wallet_view_model.dart new file mode 100644 index 0000000..5291646 --- /dev/null +++ b/lib/features/habib_wallet/habib_wallet_view_model.dart @@ -0,0 +1,198 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_repo.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; + +class HabibWalletViewModel extends ChangeNotifier { + bool isWalletAmountLoading = false; + num habibWalletAmount = 0; + num walletRechargeAmount = 0; + + bool isBottomSheetContentLoading = false; + + bool isSearchedFileNumberDataShown = false; + + int currentIndex = 0; + + List advancePaymentHospitals = []; + + HospitalsModel? selectedHospital; + + HabibWalletRepo habibWalletRepo; + ErrorHandlerService errorHandlerService; + + String fileNumber = ''; + String depositorName = ''; + String mobileNumber = ''; + + num selectedRechargeType = 1; + + HabibWalletViewModel({required this.habibWalletRepo, required this.errorHandlerService}); + + initHabibWalletProvider() { + isWalletAmountLoading = true; + isBottomSheetContentLoading = false; + habibWalletAmount = 0; + walletRechargeAmount = 0; + selectedRechargeType = 1; + advancePaymentHospitals.clear(); + selectedHospital = null; + fileNumber = ''; + depositorName = ''; + mobileNumber = ''; + notifyListeners(); + } + + setSelectedRechargeType(num type) { + selectedRechargeType = type; + notifyListeners(); + } + + setSelectedHospital(HospitalsModel hospital) { + selectedHospital = hospital; + notifyListeners(); + } + + setWalletRechargeAmount(num amount) { + walletRechargeAmount = amount; + notifyListeners(); + } + + setDepositorDetails(String fileNum, String depositor, String mobile) { + fileNumber = fileNum; + depositorName = depositor; + mobileNumber = mobile; + notifyListeners(); + } + + setCurrentIndex(int index) { + currentIndex = index; + notifyListeners(); + } + + String getSelectedRechargeTypeValue() { + switch (selectedRechargeType) { + case 1: + return LocaleKeys.myAccount.tr(); + case 2: + return LocaleKeys.family.tr(); + case 3: + return LocaleKeys.otherAccount.tr(); + default: + return LocaleKeys.myAccount.tr(); + } + } + + Future getPatientBalanceAmount({Function(dynamic)? onSuccess, Function(String)? onError}) async { + isWalletAmountLoading = true; + notifyListeners(); + + final result = await habibWalletRepo.getPatientBalanceAmount(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + habibWalletAmount = apiResponse.data!; + isWalletAmountLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getProjectsList() async { + advancePaymentHospitals.clear(); + notifyListeners(); + final result = await habibWalletRepo.getProjectList(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) async { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + advancePaymentHospitals = apiResponse.data!; + notifyListeners(); + } + }, + ); + } + + Future HISCreateAdvancePayment( + {required String paymentMethodName, + required num paidAmount, + required String paymentReference, + required String patientID, + required int projectID, + required String depositorName, + Function(dynamic)? onSuccess, + Function(String)? onError}) async { + final result = await habibWalletRepo.HISCreateAdvancePayment( + paymentMethodName: paymentMethodName, paidAmount: paidAmount, paymentReference: paymentReference, patientID: patientID, projectID: projectID, depositorName: depositorName); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future addAdvanceNumberRequest({required String advanceNumber, required String paymentReference, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await habibWalletRepo.addAdvanceNumberRequest(advanceNumber: advanceNumber, paymentReference: paymentReference); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientInfoByPatientID({required String patientID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + isBottomSheetContentLoading = true; + notifyListeners(); + final result = await habibWalletRepo.getPatientInfoByPatientID(patientID: patientID); + + result.fold( + (failure) async { + isBottomSheetContentLoading = false; + notifyListeners(); + await errorHandlerService.handleError(failure: failure); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + isBottomSheetContentLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } +} diff --git a/lib/features/immediate_livecare/immediate_livecare_repo.dart b/lib/features/immediate_livecare/immediate_livecare_repo.dart new file mode 100644 index 0000000..eee4adb --- /dev/null +++ b/lib/features/immediate_livecare/immediate_livecare_repo.dart @@ -0,0 +1,206 @@ +import 'dart:io'; + +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_fees_response_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_patient_livecare_history_response_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class ImmediateLiveCareRepo { + Future>>> getLiveCareImmediateClinicsList(int age, int genderID, {Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>> getLiveCareImmediateAppointmentFees(int age, int genderID, int serviceID, + {Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>> addNewCallRequestForImmediateLiveCare( + int age, int gender, int serviceID, String clientRequestID, int callTypeID, bool isPharma, String deviceToken, String voipToken, + {Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>>> getPatientLiveCareHistory({Function(dynamic)? onSuccess, Function(String)? onError}); +} + +class ImmediateLiveCareRepoImp implements ImmediateLiveCareRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + ImmediateLiveCareRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>>> getLiveCareImmediateClinicsList(int age, int genderID, + {Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = { + "Age": age, + "Gender": genderID, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_LIVECARE_CLINICS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['PatientER_GetClinicsList']; + + final clinicsList = list.map((item) => GetLiveCareClinicListResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: clinicsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getLiveCareImmediateAppointmentFees(int age, int genderID, int serviceID, + {Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = { + "Age": age, + "Gender": genderID, + "ServiceID": serviceID, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_ER_APPOINTMENT_FEES, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final respObject = response['GetERAppointmentFeesList']; + + final liveCareFeesObj = LiveCareImmediateAppointmentFeesList.fromJson(respObject); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: liveCareFeesObj, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> addNewCallRequestForImmediateLiveCare( + int age, int gender, int serviceID, String clientRequestID, int callTypeID, bool isPharma, String deviceToken, String voipToken, + {Function(dynamic p1)? onSuccess, Function(String p1)? onError}) async { + Map mapDevice = { + "IsPharmacy": isPharma, + "ErServiceID": serviceID, + "ClientRequestID": clientRequestID, + "DeviceToken": deviceToken, + "VoipToken": voipToken, + "IsFlutter": true, + "DeviceType": Platform.isIOS ? 'iOS' : 'Android', + "Age": age, + "Gender": gender, + "IsVoip": Platform.isIOS ? true : false, + "CallTypeID": callTypeID + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ADD_NEW_CALL_FOR_PATIENT_ER, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: true, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientLiveCareHistory({Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_LIVECARE_HISTORY, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ErRequestHistoryList']; + + final liveCareHistoryList = list.map((item) => PatientLiveCareHistory.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: liveCareHistoryList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/immediate_livecare/immediate_livecare_view_model.dart b/lib/features/immediate_livecare/immediate_livecare_view_model.dart new file mode 100644 index 0000000..599bc39 --- /dev/null +++ b/lib/features/immediate_livecare/immediate_livecare_view_model.dart @@ -0,0 +1,162 @@ +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_repo.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_fees_response_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_patient_livecare_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; + +import '../../services/navigation_service.dart'; + +class ImmediateLiveCareViewModel extends ChangeNotifier { + ImmediateLiveCareViewModel({ + required this.immediateLiveCareRepo, + required this.errorHandlerService, + required this.navigationService, + required this.myAppointmentsViewModel, + }); + + ImmediateLiveCareRepo immediateLiveCareRepo; + ErrorHandlerService errorHandlerService; + final NavigationService navigationService; + MyAppointmentsViewModel myAppointmentsViewModel; + + List immediateLiveCareClinicsList = []; + bool isImmediateLiveCareClinicsLoading = false; + int liveCareSelectedCallType = 0; // 1- Video, 2- Audio, 3- Phone + late GetLiveCareClinicListResponseModel immediateLiveCareSelectedClinic; + late LiveCareImmediateAppointmentFeesList liveCareImmediateAppointmentFeesList; + + List patientLiveCareHistoryList = []; + bool patientHasPendingLiveCareRequest = false; + + late AppState _appState; + + initImmediateLiveCare() { + _appState = getIt(); + immediateLiveCareClinicsList = []; + patientLiveCareHistoryList = []; + isImmediateLiveCareClinicsLoading = true; + patientHasPendingLiveCareRequest = false; + liveCareSelectedCallType = 0; // 1- Video, 2- Audio, 3- Phone + immediateLiveCareSelectedClinic = GetLiveCareClinicListResponseModel(); + liveCareImmediateAppointmentFeesList = LiveCareImmediateAppointmentFeesList(); + } + + setLiveCareSelectedCallType(int value) { + liveCareSelectedCallType = value; + notifyListeners(); + } + + setImmediateLiveCareSelectedClinic(GetLiveCareClinicListResponseModel clinic) { + immediateLiveCareSelectedClinic = clinic; + notifyListeners(); + } + + Future getLiveCareImmediateClinicsList({Function(dynamic)? onSuccess, Function(String)? onError}) async { + immediateLiveCareClinicsList.clear(); + isImmediateLiveCareClinicsLoading = true; + notifyListeners(); + + final result = await immediateLiveCareRepo.getLiveCareImmediateClinicsList(_appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + immediateLiveCareClinicsList = apiResponse.data!; + + immediateLiveCareClinicsList.sort((a, b) => b.isOnline!.compareTo(a.isOnline!)); + + isImmediateLiveCareClinicsLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getLiveCareImmediateAppointmentFees({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = + await immediateLiveCareRepo.getLiveCareImmediateAppointmentFees(_appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!, immediateLiveCareSelectedClinic.serviceID!); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage ?? "Unknown error occurred"); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + liveCareImmediateAppointmentFeesList = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future addNewCallRequestForImmediateLiveCare(String transID, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await immediateLiveCareRepo.addNewCallRequestForImmediateLiveCare(_appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!, + immediateLiveCareSelectedClinic.serviceID!, transID, liveCareSelectedCallType, false, _appState.deviceToken, await Utils.getStringFromPrefs(CacheConst.voipToken)); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage ?? "Unknown error occurred"); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientLiveCareHistory({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await immediateLiveCareRepo.getPatientLiveCareHistory(); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage ?? "Unknown error occurred"); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientLiveCareHistoryList = apiResponse.data!; + if (patientLiveCareHistoryList.isNotEmpty) { + if (patientLiveCareHistoryList[0].callStatus! < 4) { + patientHasPendingLiveCareRequest = true; + } else { + patientHasPendingLiveCareRequest = false; + } + } else { + patientHasPendingLiveCareRequest = false; + } + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } +} diff --git a/lib/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart b/lib/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart new file mode 100644 index 0000000..5c5b900 --- /dev/null +++ b/lib/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart @@ -0,0 +1,97 @@ +class GetLiveCareClinicListResponseModel { + int? iD; + int? serviceID; + String? serviceName; + String? serviceNameN; + int? clinicID; + int? age; + bool? isCheckAgeBelow; + int? gender; + bool? isActive; + String? createdOn; + String? createdBy; + int? isOnline; + bool? projectOutSA; + List? shiftTimings; + + GetLiveCareClinicListResponseModel( + {this.iD, + this.serviceID, + this.serviceName, + this.serviceNameN, + this.clinicID, + this.age, + this.isCheckAgeBelow, + this.gender, + this.isActive, + this.createdOn, + this.createdBy, + this.isOnline, + this.projectOutSA, + this.shiftTimings}); + + GetLiveCareClinicListResponseModel.fromJson(Map json) { + iD = json['ID']; + serviceID = json['ServiceID']; + serviceName = json['ServiceName']; + serviceNameN = json['ServiceNameN']; + clinicID = json['ClinicID']; + age = json['Age']; + isCheckAgeBelow = json['IsCheckAgeBelow']; + gender = json['Gender']; + isActive = json['IsActive']; + createdOn = json['CreatedOn']; + createdBy = json['CreatedBy']; + isOnline = json['IsOnline']; + projectOutSA = json['ProjectOutSA']; + if (json['ShiftTimings'] != null) { + shiftTimings = []; + json['ShiftTimings'].forEach((v) { + shiftTimings!.add(new ShiftTimings.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = Map(); + data['ID'] = this.iD; + data['ServiceID'] = this.serviceID; + data['ServiceName'] = this.serviceName; + data['ServiceNameN'] = this.serviceNameN; + data['ClinicID'] = this.clinicID; + data['Age'] = this.age; + data['IsCheckAgeBelow'] = this.isCheckAgeBelow; + data['Gender'] = this.gender; + data['IsActive'] = this.isActive; + data['CreatedOn'] = this.createdOn; + data['CreatedBy'] = this.createdBy; + data['IsOnline'] = this.isOnline; + data['ProjectOutSA'] = this.projectOutSA; + if (this.shiftTimings != null) { + data['ShiftTimings'] = this.shiftTimings!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class ShiftTimings { + String? endTime; + int? shiftID; + String? startTime; + + ShiftTimings({this.endTime, this.shiftID, this.startTime}); + + ShiftTimings.fromJson(Map json) { + endTime = json['EndTime']; + shiftID = json['ShiftID']; + startTime = json['StartTime']; + } + + Map toJson() { + final Map data = Map(); + data['EndTime'] = this.endTime; + data['ShiftID'] = this.shiftID; + data['StartTime'] = this.startTime; + return data; + } +} diff --git a/lib/features/immediate_livecare/models/resp_models/get_livecare_immediate_fees_response_model.dart b/lib/features/immediate_livecare/models/resp_models/get_livecare_immediate_fees_response_model.dart new file mode 100644 index 0000000..9a5861e --- /dev/null +++ b/lib/features/immediate_livecare/models/resp_models/get_livecare_immediate_fees_response_model.dart @@ -0,0 +1,37 @@ +class LiveCareImmediateAppointmentFeesList { + String? amount; + String? companyName; + bool? isInsured; + bool? isShowInsuranceUpdateModule; + bool? isCash; + bool? isEligible; + String? tax; + String? total; + String? currency; + + LiveCareImmediateAppointmentFeesList({this.amount, this.companyName, this.isInsured, this.isShowInsuranceUpdateModule, this.tax, this.total, this.currency}); + + LiveCareImmediateAppointmentFeesList.fromJson(Map json) { + amount = json['Amount']; + companyName = json['CompanyName']; + isInsured = json['IsInsured']; + isCash = json['IsCash']; + isEligible = json['IsEligible']; + isShowInsuranceUpdateModule = json['IsShowInsuranceUpdateModule']; + tax = json['Tax']; + total = json['Total']; + currency = json['currency']; + } + + Map toJson() { + final Map data = new Map(); + data['Amount'] = this.amount; + data['CompanyName'] = this.companyName; + data['IsInsured'] = this.isInsured; + data['IsShowInsuranceUpdateModule'] = this.isShowInsuranceUpdateModule; + data['Tax'] = this.tax; + data['Total'] = this.total; + data['currency'] = this.currency; + return data; + } +} diff --git a/lib/features/immediate_livecare/models/resp_models/get_patient_livecare_history_response_model.dart b/lib/features/immediate_livecare/models/resp_models/get_patient_livecare_history_response_model.dart new file mode 100644 index 0000000..0077d83 --- /dev/null +++ b/lib/features/immediate_livecare/models/resp_models/get_patient_livecare_history_response_model.dart @@ -0,0 +1,84 @@ +class PatientLiveCareHistory { + String? appointmentNo; + String? arrivalTime; + num? callDuration; + int? callStatus; + String? clientRequestID; + String? doctorID; + String? doctorName; + String? doctorNameN; + String? doctorTitle; + String? exWaitingTime; + bool? isAppointmentHaveRating; + int? patCount; + int? projectID; + String? sArrivalTime; + int? serviceID; + String? stringCallStatus; + int? vCID; + int? watingtimeInteger; + + PatientLiveCareHistory( + {this.appointmentNo, + this.arrivalTime, + this.callDuration, + this.callStatus, + this.clientRequestID, + this.doctorID, + this.doctorName, + this.doctorNameN, + this.doctorTitle, + this.exWaitingTime, + this.isAppointmentHaveRating, + this.patCount, + this.projectID, + this.sArrivalTime, + this.serviceID, + this.stringCallStatus, + this.vCID, + this.watingtimeInteger}); + + PatientLiveCareHistory.fromJson(Map json) { + appointmentNo = json['AppointmentNo']; + arrivalTime = json['ArrivalTime']; + callDuration = json['CallDuration']; + callStatus = json['CallStatus']; + clientRequestID = json['ClientRequestID']; + doctorID = json['DoctorID']; + doctorName = json['DoctorName']; + doctorNameN = json['DoctorNameN']; + doctorTitle = json['DoctorTitle']; + exWaitingTime = json['Ex_WaitingTime']; + isAppointmentHaveRating = json['IsAppointmentHaveRating']; + patCount = json['Pat_Count']; + projectID = json['ProjectID']; + sArrivalTime = json['SArrivalTime']; + serviceID = json['ServiceID']; + stringCallStatus = json['StringCallStatus']; + vCID = json['VC_ID']; + watingtimeInteger = json['WatingtimeInteger']; + } + + Map toJson() { + final Map data = new Map(); + data['AppointmentNo'] = this.appointmentNo; + data['ArrivalTime'] = this.arrivalTime; + data['CallDuration'] = this.callDuration; + data['CallStatus'] = this.callStatus; + data['ClientRequestID'] = this.clientRequestID; + data['DoctorID'] = this.doctorID; + data['DoctorName'] = this.doctorName; + data['DoctorNameN'] = this.doctorNameN; + data['DoctorTitle'] = this.doctorTitle; + data['Ex_WaitingTime'] = this.exWaitingTime; + data['IsAppointmentHaveRating'] = this.isAppointmentHaveRating; + data['Pat_Count'] = this.patCount; + data['ProjectID'] = this.projectID; + data['SArrivalTime'] = this.sArrivalTime; + data['ServiceID'] = this.serviceID; + data['StringCallStatus'] = this.stringCallStatus; + data['VC_ID'] = this.vCID; + data['WatingtimeInteger'] = this.watingtimeInteger; + return data; + } +} diff --git a/lib/features/insurance/insurance_repo.dart b/lib/features/insurance/insurance_repo.dart new file mode 100644 index 0000000..1aeb769 --- /dev/null +++ b/lib/features/insurance/insurance_repo.dart @@ -0,0 +1,186 @@ +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_card_history.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_details_response_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_update_response_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class InsuranceRepo { + Future>>> getPatientInsuranceDetails(); + + Future>>> getPatientInsuranceCardHistory(); + + Future>> getPatientInsuranceDetailsForUpdate({required String patientId, required String identificationNo}); + + Future>>> getPatientInsuranceApprovalsList(); +} + +class InsuranceRepoImp implements InsuranceRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + InsuranceRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>>> getPatientInsuranceDetails() async { + Map mapDevice = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PAtIENTS_INSURANCE, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_PatientInsuranceCard']; + if (list == null || list.isEmpty) { + throw Exception("insurance list is empty"); + } + + final labOrders = list.map((item) => PatientInsuranceDetailsResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: labOrders, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientInsuranceCardHistory() async { + Map mapDevice = {}; + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PAtIENTS_INSURANCE_UPDATED, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_PatientInsuranceCardHistory']; + if (list == null || list.isEmpty) { + throw Exception("insurance list is empty"); + } + + final insuranceCardsList = list.map((item) => PatientInsuranceCardHistoryResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: insuranceCardsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getPatientInsuranceDetailsForUpdate({required String patientId, required String identificationNo}) async { + Map mapDevice = {"SetupID": "010266", "ProjectID": 15, "PatientIdentificationID": identificationNo, "IsFamily": false, "ParentID": 0}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_PATIENT_INSURANCE_DETAILS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_PatientInsuranceDetails']; + if (list == null || list.isEmpty) { + throw Exception("insurance list is empty"); + } + + final insuranceCardsList = PatientInsuranceUpdateResponseModel.fromJson(list[0]); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: insuranceCardsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientInsuranceApprovalsList() async { + Map mapDevice = {}; + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PAtIENTS_INSURANCE_APPROVALS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['HIS_Approval_List']; + + final insuranceCardsList = list.map((item) => InsuranceApprovalResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: insuranceCardsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/insurance/insurance_view_model.dart b/lib/features/insurance/insurance_view_model.dart new file mode 100644 index 0000000..8460bd4 --- /dev/null +++ b/lib/features/insurance/insurance_view_model.dart @@ -0,0 +1,173 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_repo.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_card_history.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_details_response_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_update_response_model.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_repo.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; + +class InsuranceViewModel extends ChangeNotifier { + bool isInsuranceLoading = false; + bool isInsuranceHistoryLoading = false; + bool isInsuranceDetailsLoading = false; + bool isInsuranceUpdateDetailsLoading = false; + + bool isInsuranceDataToBeLoaded = true; + bool isInsuranceApprovalsLoading = false; + + bool isInsuranceExpired = false; + + InsuranceRepo insuranceRepo; + ErrorHandlerService errorHandlerService; + + List patientInsuranceList = []; + List patientInsuranceCardHistoryList = []; + List patientInsuranceApprovalsList = []; + + PatientInsuranceUpdateResponseModel? patientInsuranceUpdateResponseModel; + + InsuranceViewModel({required this.insuranceRepo, required this.errorHandlerService}); + + initInsuranceProvider() { + if (isInsuranceDataToBeLoaded) { + patientInsuranceList.clear(); + isInsuranceLoading = true; + getPatientInsuranceDetails(); + } + patientInsuranceCardHistoryList.clear(); + isInsuranceHistoryLoading = true; + isInsuranceDetailsLoading = true; + isInsuranceUpdateDetailsLoading = true; + isInsuranceApprovalsLoading = true; + notifyListeners(); + } + + setIsInsuranceHistoryLoading(bool val) { + isInsuranceHistoryLoading = val; + notifyListeners(); + } + + setIsInsuranceDetailsLoading(bool val) { + isInsuranceDetailsLoading = val; + notifyListeners(); + } + + setIsInsuranceUpdateDetailsLoading(bool val) { + isInsuranceUpdateDetailsLoading = val; + notifyListeners(); + } + + setIsInsuranceDataToBeLoaded(bool val) { + isInsuranceDataToBeLoaded = val; + notifyListeners(); + } + + setIsInsuranceApprovalsLoading(bool val) { + isInsuranceApprovalsLoading = val; + notifyListeners(); + } + + Future getPatientInsuranceDetails({Function(dynamic)? onSuccess, Function(String)? onError}) async { + if (!isInsuranceDataToBeLoaded) return; + + final result = await insuranceRepo.getPatientInsuranceDetails(); + + result.fold( + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + isInsuranceLoading = false; + notifyListeners(); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientInsuranceList = apiResponse.data!; + isInsuranceLoading = false; + isInsuranceDataToBeLoaded = false; + + isInsuranceExpired = DateTime.now().isAfter( + DateUtil.convertStringToDate(patientInsuranceList.first.cardValidTo), + ); + + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientInsuranceCardHistory({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await insuranceRepo.getPatientInsuranceCardHistory(); + + result.fold( + (failure) async { + isInsuranceHistoryLoading = false; + notifyListeners(); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientInsuranceCardHistoryList = apiResponse.data!; + patientInsuranceCardHistoryList = patientInsuranceCardHistoryList.take(3).toList(); + isInsuranceHistoryLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientInsuranceDetailsForUpdate(String patientID, String identificationNo, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await insuranceRepo.getPatientInsuranceDetailsForUpdate(patientId: patientID, identificationNo: identificationNo); + + result.fold( + (failure) async { + isInsuranceUpdateDetailsLoading = false; + notifyListeners(); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientInsuranceUpdateResponseModel = apiResponse.data!; + isInsuranceUpdateDetailsLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientInsuranceApprovalsList({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await insuranceRepo.getPatientInsuranceApprovalsList(); + + result.fold( + (failure) async { + isInsuranceApprovalsLoading = false; + notifyListeners(); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientInsuranceApprovalsList = apiResponse.data!; + isInsuranceApprovalsLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } +} diff --git a/lib/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart b/lib/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart new file mode 100644 index 0000000..f272f2d --- /dev/null +++ b/lib/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart @@ -0,0 +1,465 @@ +class InsuranceApprovalResponseModel { + String? setupID; + int? projectID; + int? approvalNo; + String? approvalDate; + int? patientType; + int? patientID; + int? companyID; + int? subCategoryID; + int? doctorID; + int? clinicID; + int? approvalType; + String? inpatientApprovalSubType; + String? validFrom; + String? vaildDays; + String? validTo; + bool? isApprovalOnGross; + bool? isPackage; + int? requestedAmount; + int? actualApprovedAmount; + int? aviliableAmount; + String? companyApprovalNo; + int? progNoteOrderNo; + String? submitOn; + String? receiptOn; + String? remarks1; + String? remarks2; + int? status; + String? feedbackStatusBy; + String? feedbackStatus; + String? feedbackStatusOn; + int? authorizerID; + String? expiryDate; + int? appointmentNo; + int? admissionNo; + int? admissionRequestNo; + int? createdBy; + String? createdOn; + int? editedBy; + String? editedOn; + String? rowVer; + bool? isAddlDiscApplied; + int? inProgressReasonID; + String? extendedBy; + String? extendedOn; + int? subPolicyNo; + int? noOrderAuthorizerID; + bool? isVerbalApproval; + String? subStatus; + bool? isNotificationSend; + String? eApprovalStatus; + String? eApprovalRemarks; + bool? isEmailSentOnDelayApproval; + int? eAuthorizationID; + InsuranceApprovalDetails? apporvalDetails; + String? approvalStatusDescption; + String? clinicName; + String? clinicNameN; + String? companyName; + String? doctorImageURL; + String? doctorName; + String? doctorNameN; + int? doctorRate; + String? doctorTitle; + int? gender; + String? genderDescription; + bool? isActiveDoctorProfile; + bool? isExecludeDoctor; + bool? isInOutPatient; + String? isInOutPatientDescription; + String? isInOutPatientDescriptionN; + bool? isLiveCareAppointment; + String? projectName; + String? projectNameN; + String? qR; + List? speciality; + String? strApprovalDate; + String? strExpiryDate; + String? strSubmitDate; + int? totaUnUsedCount; + int? unUsedCount; + + InsuranceApprovalResponseModel( + {this.setupID, + this.projectID, + this.approvalNo, + this.approvalDate, + this.patientType, + this.patientID, + this.companyID, + this.subCategoryID, + this.doctorID, + this.clinicID, + this.approvalType, + this.inpatientApprovalSubType, + this.validFrom, + this.vaildDays, + this.validTo, + this.isApprovalOnGross, + this.isPackage, + this.requestedAmount, + this.actualApprovedAmount, + this.aviliableAmount, + this.companyApprovalNo, + this.progNoteOrderNo, + this.submitOn, + this.receiptOn, + this.remarks1, + this.remarks2, + this.status, + this.feedbackStatusBy, + this.feedbackStatus, + this.feedbackStatusOn, + this.authorizerID, + this.expiryDate, + this.appointmentNo, + this.admissionNo, + this.admissionRequestNo, + this.createdBy, + this.createdOn, + this.editedBy, + this.editedOn, + this.rowVer, + this.isAddlDiscApplied, + this.inProgressReasonID, + this.extendedBy, + this.extendedOn, + this.subPolicyNo, + this.noOrderAuthorizerID, + this.isVerbalApproval, + this.subStatus, + this.isNotificationSend, + this.eApprovalStatus, + this.eApprovalRemarks, + this.isEmailSentOnDelayApproval, + this.eAuthorizationID, + this.apporvalDetails, + this.approvalStatusDescption, + this.clinicName, + this.clinicNameN, + this.companyName, + this.doctorImageURL, + this.doctorName, + this.doctorNameN, + this.doctorRate, + this.doctorTitle, + this.gender, + this.genderDescription, + this.isActiveDoctorProfile, + this.isExecludeDoctor, + this.isInOutPatient, + this.isInOutPatientDescription, + this.isInOutPatientDescriptionN, + this.isLiveCareAppointment, + this.projectName, + this.projectNameN, + this.qR, + this.speciality, + this.strApprovalDate, + this.strExpiryDate, + this.strSubmitDate, + this.totaUnUsedCount, + this.unUsedCount}); + + InsuranceApprovalResponseModel.fromJson(Map json) { + setupID = json['SetupID']; + projectID = json['ProjectID']; + approvalNo = json['ApprovalNo']; + approvalDate = json['ApprovalDate']; + patientType = json['PatientType']; + patientID = json['PatientID']; + companyID = json['CompanyID']; + subCategoryID = json['SubCategoryID']; + doctorID = json['DoctorID']; + clinicID = json['ClinicID']; + approvalType = json['ApprovalType']; + inpatientApprovalSubType = json['InpatientApprovalSubType']; + validFrom = json['ValidFrom']; + vaildDays = json['VaildDays']; + validTo = json['ValidTo']; + isApprovalOnGross = json['IsApprovalOnGross']; + isPackage = json['IsPackage']; + requestedAmount = json['RequestedAmount']; + actualApprovedAmount = json['ActualApprovedAmount']; + aviliableAmount = json['AviliableAmount']; + companyApprovalNo = json['CompanyApprovalNo']; + progNoteOrderNo = json['ProgNoteOrderNo']; + submitOn = json['SubmitOn']; + receiptOn = json['ReceiptOn']; + remarks1 = json['Remarks1']; + remarks2 = json['Remarks2']; + status = json['Status']; + feedbackStatusBy = json['FeedbackStatusBy']; + feedbackStatus = json['FeedbackStatus']; + feedbackStatusOn = json['FeedbackStatusOn']; + authorizerID = json['AuthorizerID']; + expiryDate = json['ExpiryDate']; + appointmentNo = json['AppointmentNo']; + admissionNo = json['AdmissionNo']; + admissionRequestNo = json['AdmissionRequestNo']; + createdBy = json['CreatedBy']; + createdOn = json['CreatedOn']; + editedBy = json['EditedBy']; + editedOn = json['EditedOn']; + rowVer = json['RowVer']; + isAddlDiscApplied = json['IsAddlDiscApplied']; + inProgressReasonID = json['InProgressReasonID']; + extendedBy = json['ExtendedBy']; + extendedOn = json['ExtendedOn']; + subPolicyNo = json['SubPolicyNo']; + noOrderAuthorizerID = json['NoOrderAuthorizerID']; + isVerbalApproval = json['isVerbalApproval']; + subStatus = json['SubStatus']; + isNotificationSend = json['IsNotificationSend']; + eApprovalStatus = json['EApprovalStatus']; + eApprovalRemarks = json['EApprovalRemarks']; + isEmailSentOnDelayApproval = json['IsEmailSentOnDelayApproval']; + eAuthorizationID = json['EAuthorizationID']; + if (json['ApporvalDetails'] != null && json['ApporvalDetails'].length != 0) { + apporvalDetails = InsuranceApprovalDetails.fromJson(json['ApporvalDetails'][0]); + } + approvalStatusDescption = json['ApprovalStatusDescption']; + clinicName = json['ClinicName']; + clinicNameN = json['ClinicNameN']; + companyName = json['CompanyName']; + doctorImageURL = json['DoctorImageURL']; + doctorName = json['DoctorName']; + doctorNameN = json['DoctorNameN']; + doctorRate = json['DoctorRate']; + doctorTitle = json['DoctorTitle']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + isActiveDoctorProfile = json['IsActiveDoctorProfile']; + isExecludeDoctor = json['IsExecludeDoctor']; + isInOutPatient = json['IsInOutPatient']; + isInOutPatientDescription = json['IsInOutPatientDescription']; + isInOutPatientDescriptionN = json['IsInOutPatientDescriptionN']; + isLiveCareAppointment = json['IsLiveCareAppointment']; + projectName = json['ProjectName']; + projectNameN = json['ProjectNameN']; + qR = json['QR']; + if (json['Speciality'] != null) speciality = json['Speciality'].cast(); + strApprovalDate = json['StrApprovalDate']; + strExpiryDate = json['StrExpiryDate']; + strSubmitDate = json['StrSubmitDate']; + totaUnUsedCount = json['TotaUnUsedCount']; + unUsedCount = json['UnUsedCount']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['ApprovalNo'] = this.approvalNo; + data['ApprovalDate'] = this.approvalDate; + data['PatientType'] = this.patientType; + data['PatientID'] = this.patientID; + data['CompanyID'] = this.companyID; + data['SubCategoryID'] = this.subCategoryID; + data['DoctorID'] = this.doctorID; + data['ClinicID'] = this.clinicID; + data['ApprovalType'] = this.approvalType; + data['InpatientApprovalSubType'] = this.inpatientApprovalSubType; + data['ValidFrom'] = this.validFrom; + data['VaildDays'] = this.vaildDays; + data['ValidTo'] = this.validTo; + data['IsApprovalOnGross'] = this.isApprovalOnGross; + data['IsPackage'] = this.isPackage; + data['RequestedAmount'] = this.requestedAmount; + data['ActualApprovedAmount'] = this.actualApprovedAmount; + data['AviliableAmount'] = this.aviliableAmount; + data['CompanyApprovalNo'] = this.companyApprovalNo; + data['ProgNoteOrderNo'] = this.progNoteOrderNo; + data['SubmitOn'] = this.submitOn; + data['ReceiptOn'] = this.receiptOn; + data['Remarks1'] = this.remarks1; + data['Remarks2'] = this.remarks2; + data['Status'] = this.status; + data['FeedbackStatusBy'] = this.feedbackStatusBy; + data['FeedbackStatus'] = this.feedbackStatus; + data['FeedbackStatusOn'] = this.feedbackStatusOn; + data['AuthorizerID'] = this.authorizerID; + data['ExpiryDate'] = this.expiryDate; + data['AppointmentNo'] = this.appointmentNo; + data['AdmissionNo'] = this.admissionNo; + data['AdmissionRequestNo'] = this.admissionRequestNo; + data['CreatedBy'] = this.createdBy; + data['CreatedOn'] = this.createdOn; + data['EditedBy'] = this.editedBy; + data['EditedOn'] = this.editedOn; + data['RowVer'] = this.rowVer; + data['IsAddlDiscApplied'] = this.isAddlDiscApplied; + data['InProgressReasonID'] = this.inProgressReasonID; + data['ExtendedBy'] = this.extendedBy; + data['ExtendedOn'] = this.extendedOn; + data['SubPolicyNo'] = this.subPolicyNo; + data['NoOrderAuthorizerID'] = this.noOrderAuthorizerID; + data['isVerbalApproval'] = this.isVerbalApproval; + data['SubStatus'] = this.subStatus; + data['IsNotificationSend'] = this.isNotificationSend; + data['EApprovalStatus'] = this.eApprovalStatus; + data['EApprovalRemarks'] = this.eApprovalRemarks; + data['IsEmailSentOnDelayApproval'] = this.isEmailSentOnDelayApproval; + data['EAuthorizationID'] = this.eAuthorizationID; + if (this.apporvalDetails != null) { + data['ApporvalDetails'] = this.apporvalDetails!.toJson; + } + data['ApprovalStatusDescption'] = this.approvalStatusDescption; + data['ClinicName'] = this.clinicName; + data['ClinicNameN'] = this.clinicNameN; + data['CompanyName'] = this.companyName; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorName'] = this.doctorName; + data['DoctorNameN'] = this.doctorNameN; + data['DoctorRate'] = this.doctorRate; + data['DoctorTitle'] = this.doctorTitle; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['IsInOutPatient'] = this.isInOutPatient; + data['IsInOutPatientDescription'] = this.isInOutPatientDescription; + data['IsInOutPatientDescriptionN'] = this.isInOutPatientDescriptionN; + data['IsLiveCareAppointment'] = this.isLiveCareAppointment; + data['ProjectName'] = this.projectName; + data['ProjectNameN'] = this.projectNameN; + data['QR'] = this.qR; + data['Speciality'] = this.speciality; + data['StrApprovalDate'] = this.strApprovalDate; + data['StrExpiryDate'] = this.strExpiryDate; + data['StrSubmitDate'] = this.strSubmitDate; + data['TotaUnUsedCount'] = this.totaUnUsedCount; + data['UnUsedCount'] = this.unUsedCount; + return data; + } +} + +class InsuranceApprovalDetails { + int? setupID; + int? projectID; + int? approvalNo; + int? lineItemNo; + int? orderType; + int? procedureID; + int? toothNo; + int? price; + int? approvedAmount; + String? unapprovedPatientShare; + int? waivedAmount; + String? discountType; + int? discountValue; + String? shareType; + String? patientShareTypeValue; + String? companyShareTypeValue; + String? patientShare; + String? companyShare; + int? deductableAmount; + String? disapprovedRemarks; + int? progNoteOrderNo; + int? progNoteLineItemNo; + String? invoiceTransactionType; + int? invoiceNo; + String? procedureName; + String? procedureNameN; + String? status; + bool? isInvoiced; + String? isInvoicedDesc; + + InsuranceApprovalDetails( + {this.setupID, + this.projectID, + this.approvalNo, + this.lineItemNo, + this.orderType, + this.procedureID, + this.toothNo, + this.price, + this.approvedAmount, + this.unapprovedPatientShare, + this.waivedAmount, + this.discountType, + this.discountValue, + this.shareType, + this.patientShareTypeValue, + this.companyShareTypeValue, + this.patientShare, + this.companyShare, + this.deductableAmount, + this.disapprovedRemarks, + this.progNoteOrderNo, + this.progNoteLineItemNo, + this.invoiceTransactionType, + this.invoiceNo, + this.procedureName, + this.procedureNameN, + this.status, + this.isInvoiced, + this.isInvoicedDesc}); + + InsuranceApprovalDetails.fromJson(Map json) { + setupID = json['SetupID']; + projectID = json['ProjectID']; + approvalNo = json['ApprovalNo']; + lineItemNo = json['LineItemNo']; + orderType = json['OrderType']; + procedureID = json['ProcedureID']; + toothNo = json['ToothNo']; + price = json['Price']; + approvedAmount = json['ApprovedAmount']; + unapprovedPatientShare = json['UnapprovedPatientShare']; + waivedAmount = json['WaivedAmount']; + discountType = json['DiscountType']; + discountValue = json['DiscountValue']; + shareType = json['ShareType']; + patientShareTypeValue = json['PatientShareTypeValue']; + companyShareTypeValue = json['CompanyShareTypeValue']; + patientShare = json['PatientShare']; + companyShare = json['CompanyShare']; + deductableAmount = json['DeductableAmount']; + disapprovedRemarks = json['DisapprovedRemarks']; + progNoteOrderNo = json['ProgNoteOrderNo']; + progNoteLineItemNo = json['ProgNoteLineItemNo']; + invoiceTransactionType = json['InvoiceTransactionType']; + invoiceNo = json['InvoiceNo']; + procedureName = json['ProcedureName']; + procedureNameN = json['ProcedureNameN']; + status = json['Status']; + isInvoiced = json['IsInvoiced']; + isInvoicedDesc = json['IsInvoicedDesc']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['ApprovalNo'] = this.approvalNo; + data['LineItemNo'] = this.lineItemNo; + data['OrderType'] = this.orderType; + data['ProcedureID'] = this.procedureID; + data['ToothNo'] = this.toothNo; + data['Price'] = this.price; + data['ApprovedAmount'] = this.approvedAmount; + data['UnapprovedPatientShare'] = this.unapprovedPatientShare; + data['WaivedAmount'] = this.waivedAmount; + data['DiscountType'] = this.discountType; + data['DiscountValue'] = this.discountValue; + data['ShareType'] = this.shareType; + data['PatientShareTypeValue'] = this.patientShareTypeValue; + data['CompanyShareTypeValue'] = this.companyShareTypeValue; + data['PatientShare'] = this.patientShare; + data['CompanyShare'] = this.companyShare; + data['DeductableAmount'] = this.deductableAmount; + data['DisapprovedRemarks'] = this.disapprovedRemarks; + data['ProgNoteOrderNo'] = this.progNoteOrderNo; + data['ProgNoteLineItemNo'] = this.progNoteLineItemNo; + data['InvoiceTransactionType'] = this.invoiceTransactionType; + data['InvoiceNo'] = this.invoiceNo; + data['ProcedureName'] = this.procedureName; + data['ProcedureNameN'] = this.procedureNameN; + data['Status'] = this.status; + data['IsInvoiced'] = this.isInvoiced; + data['IsInvoicedDesc'] = this.isInvoicedDesc; + return data; + } +} diff --git a/lib/features/insurance/models/resp_models/patient_insurance_card_history.dart b/lib/features/insurance/models/resp_models/patient_insurance_card_history.dart new file mode 100644 index 0000000..17436f0 --- /dev/null +++ b/lib/features/insurance/models/resp_models/patient_insurance_card_history.dart @@ -0,0 +1,73 @@ +class PatientInsuranceCardHistoryResponseModel { + int? createdBy; + String? createdOn; + int? editedBy; + String? editedOn; + String? insuranceCardImage; + String? mobileNumber; + int? patientID; + String? patientIdentificationNo; + String? patientInsuranceCardUpdateInfoID; + int? patientType; + int? projectID; + String? rejectionRemarks; + int? setupID; + int? status; + String? statusDescription; + + PatientInsuranceCardHistoryResponseModel( + {this.createdBy, + this.createdOn, + this.editedBy, + this.editedOn, + this.insuranceCardImage, + this.mobileNumber, + this.patientID, + this.patientIdentificationNo, + this.patientInsuranceCardUpdateInfoID, + this.patientType, + this.projectID, + this.rejectionRemarks, + this.setupID, + this.status, + this.statusDescription}); + + PatientInsuranceCardHistoryResponseModel.fromJson(Map json) { + createdBy = json['CreatedBy']; + createdOn = json['CreatedOn']; + editedBy = json['EditedBy']; + editedOn = json['EditedOn']; + insuranceCardImage = json['InsuranceCardImage']; + mobileNumber = json['MobileNumber']; + patientID = json['PatientID']; + patientIdentificationNo = json['PatientIdentificationNo']; + patientInsuranceCardUpdateInfoID = json['PatientInsuranceCardUpdateInfoID']; + patientType = json['PatientType']; + projectID = json['ProjectID']; + rejectionRemarks = json['RejectionRemarks']; + setupID = json['SetupID']; + status = json['Status']; + statusDescription = json['StatusDescription']; + } + + Map toJson() { + final Map data = new Map(); + data['CreatedBy'] = this.createdBy; + data['CreatedOn'] = this.createdOn; + data['EditedBy'] = this.editedBy; + data['EditedOn'] = this.editedOn; + data['InsuranceCardImage'] = this.insuranceCardImage; + data['MobileNumber'] = this.mobileNumber; + data['PatientID'] = this.patientID; + data['PatientIdentificationNo'] = this.patientIdentificationNo; + data['PatientInsuranceCardUpdateInfoID'] = + this.patientInsuranceCardUpdateInfoID; + data['PatientType'] = this.patientType; + data['ProjectID'] = this.projectID; + data['RejectionRemarks'] = this.rejectionRemarks; + data['SetupID'] = this.setupID; + data['Status'] = this.status; + data['StatusDescription'] = this.statusDescription; + return data; + } +} diff --git a/lib/features/insurance/models/resp_models/patient_insurance_details_response_model.dart b/lib/features/insurance/models/resp_models/patient_insurance_details_response_model.dart new file mode 100644 index 0000000..b734abc --- /dev/null +++ b/lib/features/insurance/models/resp_models/patient_insurance_details_response_model.dart @@ -0,0 +1,96 @@ +class PatientInsuranceDetailsResponseModel { + String? setupID; + int? projectID; + bool? isActive; + int? patientID; + int? companyID; + int? subCategoryID; + dynamic companyType; + String? patientCardID; + String? cardValidTo; + int? patientCreditLimit; + String? subPolicyNo; + String? companyName; + String? companyNameN; + String? subCategoryDesc; + dynamic subCategoryDescN; + bool? isElectronicClaim; + String? subCategoryValidTo; + dynamic groupID; + String? groupName; + dynamic groupNameN; + String? insurancePolicyNo; + + PatientInsuranceDetailsResponseModel( + {this.setupID, + this.projectID, + this.isActive, + this.patientID, + this.companyID, + this.subCategoryID, + this.companyType, + this.patientCardID, + this.cardValidTo, + this.patientCreditLimit, + this.subPolicyNo, + this.companyName, + this.companyNameN, + this.subCategoryDesc, + this.subCategoryDescN, + this.isElectronicClaim, + this.subCategoryValidTo, + this.groupID, + this.groupName, + this.groupNameN, + this.insurancePolicyNo}); + + PatientInsuranceDetailsResponseModel.fromJson(Map json) { + setupID = json['SetupID']; + projectID = json['ProjectID']; + isActive = json['IsActive']; + patientID = json['PatientID']; + companyID = json['CompanyID']; + subCategoryID = json['SubCategoryID']; + companyType = json['CompanyType']; + patientCardID = json['PatientCardID']; + cardValidTo = json['CardValidTo']; + patientCreditLimit = json['PatientCreditLimit']; + subPolicyNo = json['SubPolicyNo']; + companyName = json['CompanyName']; + companyNameN = json['CompanyNameN']; + subCategoryDesc = json['SubCategoryDesc']; + subCategoryDescN = json['SubCategoryDescN']; + isElectronicClaim = json['IsElectronicClaim']; + subCategoryValidTo = json['SubCategoryValidTo']; + groupID = json['GroupID']; + groupName = json['GroupName']; + groupNameN = json['GroupNameN']; + insurancePolicyNo = json['InsurancePolicyNo']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['IsActive'] = this.isActive; + data['PatientID'] = this.patientID; + data['CompanyID'] = this.companyID; + data['SubCategoryID'] = this.subCategoryID; + data['CompanyType'] = this.companyType; + data['PatientCardID'] = this.patientCardID; + data['CardValidTo'] = this.cardValidTo; + data['PatientCreditLimit'] = this.patientCreditLimit; + data['SubPolicyNo'] = this.subPolicyNo; + data['CompanyName'] = this.companyName; + data['CompanyNameN'] = this.companyNameN; + data['SubCategoryDesc'] = this.subCategoryDesc; + data['SubCategoryDescN'] = this.subCategoryDescN; + data['IsElectronicClaim'] = this.isElectronicClaim; + data['SubCategoryValidTo'] = this.subCategoryValidTo; + data['GroupID'] = this.groupID; + data['GroupName'] = this.groupName; + data['GroupNameN'] = this.groupNameN; + data['InsurancePolicyNo'] = this.insurancePolicyNo; + return data; + } +} diff --git a/lib/features/insurance/models/resp_models/patient_insurance_update_response_model.dart b/lib/features/insurance/models/resp_models/patient_insurance_update_response_model.dart new file mode 100644 index 0000000..3903a99 --- /dev/null +++ b/lib/features/insurance/models/resp_models/patient_insurance_update_response_model.dart @@ -0,0 +1,88 @@ +class PatientInsuranceUpdateResponseModel { + dynamic approvalLimit; + int? companyGroupID; + String? companyName; + String? companyRemarks; + String? dOB; + dynamic deductible; + String? effectiveFrom; + String? effectiveTo; + String? eligabilityFailureReason; + bool? isMemberEligible; + String? memberID; + String? memberName; + String? memberStatus; + dynamic message; + String? nationalId; + String? policyNumber; + String? responseMessage; + dynamic room; + String? subCategory; + + PatientInsuranceUpdateResponseModel( + {this.approvalLimit, + this.companyGroupID, + this.companyName, + this.companyRemarks, + this.dOB, + this.deductible, + this.effectiveFrom, + this.effectiveTo, + this.eligabilityFailureReason, + this.isMemberEligible, + this.memberID, + this.memberName, + this.memberStatus, + this.message, + this.nationalId, + this.policyNumber, + this.responseMessage, + this.room, + this.subCategory}); + + PatientInsuranceUpdateResponseModel.fromJson(Map json) { + approvalLimit = json['ApprovalLimit']; + companyGroupID = json['CompanyGroupID']; + companyName = json['CompanyName']; + companyRemarks = json['CompanyRemarks']; + dOB = json['DOB']; + deductible = json['Deductible']; + effectiveFrom = json['EffectiveFrom']; + effectiveTo = json['EffectiveTo']; + eligabilityFailureReason = json['EligabilityFailureReason']; + isMemberEligible = json['IsMemberEligible']; + memberID = json['MemberID']; + memberName = json['MemberName']; + memberStatus = json['MemberStatus']; + message = json['Message']; + nationalId = json['NationalId']; + policyNumber = json['PolicyNumber']; + responseMessage = json['ResponseMessage']; + room = json['Room']; + subCategory = json['SubCategory']; + } + + Map toJson() { + final Map data = new Map(); + data['ApprovalLimit'] = this.approvalLimit; + data['CompanyGroupID'] = this.companyGroupID; + data['CompanyName'] = this.companyName; + data['CompanyRemarks'] = this.companyRemarks; + data['DOB'] = this.dOB; + data['Deductible'] = this.deductible; + data['EffectiveFrom'] = this.effectiveFrom; + data['EffectiveTo'] = this.effectiveTo; + data['EligabilityFailureReason'] = this.eligabilityFailureReason; + data['IsMemberEligible'] = this.isMemberEligible; + data['MemberID'] = this.memberID; + data['MemberName'] = this.memberName; + data['MemberStatus'] = this.memberStatus; + data['Message'] = this.message; + data['NationalId'] = this.nationalId; + data['PolicyNumber'] = this.policyNumber; + data['ResponseMessage'] = this.responseMessage; + data['Room'] = this.room; + data['SubCategory'] = this.subCategory; + return data; + } +} diff --git a/lib/features/lab/history/lab_history_viewmodel.dart b/lib/features/lab/history/lab_history_viewmodel.dart new file mode 100644 index 0000000..a377b52 --- /dev/null +++ b/lib/features/lab/history/lab_history_viewmodel.dart @@ -0,0 +1,7 @@ + + +import 'package:flutter/material.dart'; + +class LabHistoryViewModel extends ChangeNotifier{ + bool isGraphShowing = false; +} \ No newline at end of file diff --git a/lib/features/lab/lab_repo.dart b/lib/features/lab/lab_repo.dart new file mode 100644 index 0000000..3bb793b --- /dev/null +++ b/lib/features/lab/lab_repo.dart @@ -0,0 +1,281 @@ +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_special_result.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +import 'models/resp_models/lab_result.dart' show LabResult; + +abstract class LabRepo { + Future>>> getPatientLabOrders(); + Future>>> getPatientLabResults(PatientLabOrdersResponseModel laborder, bool isVidaPlus, String procedureName); + + Future>>> getPatientLabResultsByHospitals(PatientLabOrdersResponseModel laborder, bool isVidaPlus); + + Future>>> getSpecialLabResult(PatientLabOrdersResponseModel laborder, bool isVidaPlus); + + Future>> getLabResultReportPDF({required PatientLabOrdersResponseModel labOrder}); + +} + +class LabRepoImp implements LabRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + LabRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>>> getPatientLabOrders() async { + Map mapDevice = {}; + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_Patient_LAB_ORDERS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListPLO']; + if (list == null || list.isEmpty) { + throw Exception("lab list is empty"); + } + + final labOrders = list.map((item) => PatientLabOrdersResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: labOrders, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientLabResults( + PatientLabOrdersResponseModel laborder, bool isVidaPlus, String procedureName + ) async { + + Map request = Map(); + request['InvoiceNo_VP'] = isVidaPlus ? laborder!.invoiceNo : "0"; + request['InvoiceNo'] = isVidaPlus ? "0" : laborder!.invoiceNo; + request['OrderNo'] = laborder!.orderNo; + request['isDentalAllowedBackend'] = false; + request['SetupID'] = laborder!.setupID; + request['ProjectID'] = laborder.projectID; + request['ClinicID'] = laborder.clinicID; + request['Procedure'] = procedureName; + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_Patient_LAB_ORDERS_RESULT, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListPLR']; + if (list == null || list.isEmpty) { + throw Exception("lab list is empty"); + } + + final labOrders = list + .map((item) => LabResult.fromJson(item as Map)) + .toList() + .cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: labOrders, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> + getPatientLabResultsByHospitals( + PatientLabOrdersResponseModel laborder, bool isVidaPlus) async { + Map request = Map(); + request['InvoiceNo_VP'] = isVidaPlus ? laborder!.invoiceNo : "0"; + request['InvoiceNo'] = isVidaPlus ? "0" : laborder!.invoiceNo; + request['OrderNo'] = laborder!.orderNo; + request['isDentalAllowedBackend'] = false; + request['SetupID'] = laborder!.setupID; + request['ProjectID'] = laborder.projectID; + request['ClinicID'] = laborder.clinicID; + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_Patient_LAB_RESULT, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListPLR']; + if (list == null || list.isEmpty) { + throw Exception("lab list is empty"); + } + + final labOrders = list.map((item) => LabResult.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: labOrders, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> + getSpecialLabResult( + PatientLabOrdersResponseModel laborder, bool isVidaPlus) async { + Map request = Map(); + request['InvoiceNo_VP'] = isVidaPlus ? laborder!.invoiceNo : "0"; + request['InvoiceNo'] = isVidaPlus ? "0" : laborder!.invoiceNo; + request['OrderNo'] = laborder!.orderNo; + request['isDentalAllowedBackend'] = false; + request['SetupID'] = laborder!.setupID; + request['ProjectID'] = laborder.projectID; + request['ClinicID'] = laborder.clinicID; + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_Patient_LAB_SPECIAL_RESULT, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListPLSR']; + if (list == null || list.isEmpty) { + throw Exception("lab list is empty"); + } + + final labOrders = list + .map((item) => PatientLabSpecialResult.fromJson( + item as Map)) + .toList() + .cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: labOrders, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getLabResultReportPDF({required PatientLabOrdersResponseModel labOrder}) async { + Map mapDevice = { + "InvoiceNo": Utils.isVidaPlusProject(int.parse(labOrder.projectID!)) ? "0" : labOrder.invoiceNo, + "InvoiceNo_VP": Utils.isVidaPlusProject(int.parse(labOrder.projectID!)) ? labOrder.invoiceNo : "0", + // "LineItemNo": labOrder.invoiceLineItemNo, + // "InvoiceLineItemNo": labOrder.invoiceLineItemNo, + "ProjectID": labOrder.projectID!, + "DoctorID": labOrder.doctorID!, + "OrderNo": labOrder.orderNo!, + "InvoiceType": labOrder.invoiceType!, + "SetupID": labOrder.setupID!, + "IsDownload": true, + 'ClinicName': labOrder.clinicDescription, + 'DateofBirth': Utils.appState.getAuthenticatedUser()!.dateofBirth, + 'DoctorName': labOrder.doctorName, + 'OrderDate': '${DateUtil.convertStringToDate(labOrder.orderDate!).year}-${DateUtil.convertStringToDate(labOrder.orderDate!).month}-${DateUtil.convertStringToDate(labOrder.orderDate!).day}', + 'PatientIditificationNum': Utils.appState.getAuthenticatedUser()!.patientIdentificationNo, + 'PatientMobileNumber': Utils.appState.getAuthenticatedUser()!.mobileNumber, + 'PatientName': "${Utils.appState.getAuthenticatedUser()!.firstName!} ${Utils.appState.getAuthenticatedUser()!.lastName!}", + 'ProjectName': labOrder.projectName, + "To": Utils.appState.getAuthenticatedUser()!.emailAddress + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + Utils.isVidaPlusProject(int.parse(labOrder.projectID!)) ? SEND_LAB_RESULT_EMAIL : SEND_LAB_RESULT_EMAIL_NEW, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response["PdfContent"], + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/lab/lab_view_model.dart b/lib/features/lab/lab_view_model.dart new file mode 100644 index 0000000..12f0f27 --- /dev/null +++ b/lib/features/lab/lab_view_model.dart @@ -0,0 +1,621 @@ +import 'dart:core'; +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/common_models/data_points.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; +import 'package:hmg_patient_app_new/features/lab/lab_repo.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/lab_result.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_results/lab_result_details.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:intl/intl.dart' show DateFormat; +import 'package:logger/logger.dart'; + +class LabViewModel extends ChangeNotifier { + bool isLabOrdersLoading = false; + bool isLabResultsLoading = false; + bool isLabResultByHospitalLoading = false; + bool isSpecialResultsLoading = false; + bool isGraphVisible = true; + bool shouldShowGraph = true; + + bool isLabNeedToLoad = true; + + LabRepo labRepo; + ErrorHandlerService errorHandlerService; + NavigationService navigationService; + + List patientLabOrders = []; + List filteredLabOrders = []; + List tempLabOrdersList = []; + String labSpecialResult = ""; + List labOrderTests = []; + String patientLabResultReportPDFBase64 = ""; + + PatientLabOrdersResponseModel? currentlySelectedPatientOrder; + + List mainLabResultsByHospitals = []; + + List mainLabResults = []; + List mainGraphPoints = []; + List filteredGraphValues = []; + List months = [ + 'Jan', + 'Feb', + 'Mar', + 'April', + 'May', + 'Jun', + 'July', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec' + ]; + + late List _labSuggestionsList = []; + + List get labSuggestions => _labSuggestionsList; + + Set uniqueTests = {}; + + double maxY = 0.0; + double maxX = double.infinity; + + LabViewModel( + {required this.labRepo, + required this.errorHandlerService, + required this.navigationService}); + + initLabProvider() { + if (isLabNeedToLoad) { + patientLabOrders.clear(); + filteredLabOrders.clear(); + labOrderTests.clear(); + isLabOrdersLoading = true; + isLabResultsLoading = true; + getPatientLabOrders(); + } + notifyListeners(); + } + + setIsLabNeedToLoad(bool value) { + isLabNeedToLoad = value; + notifyListeners(); + } + + Future getPatientLabOrders({Function(dynamic)? onSuccess, Function(String)? onError}) async { + if (!isLabNeedToLoad) return; + + isLabOrdersLoading = true; + patientLabOrders.clear(); + uniqueTests.clear(); + labOrderTests.clear(); + uniqueTests = {}; + notifyListeners(); + + final result = await labRepo.getPatientLabOrders(); + + result.fold( + (failure) async { + isLabOrdersLoading = false; + isLabResultsLoading = false; + notifyListeners(); + }, + // => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientLabOrders = apiResponse.data!; + filteredLabOrders = List.from(patientLabOrders); + tempLabOrdersList = apiResponse.data!; + isLabOrdersLoading = false; + isLabResultsLoading = false; + filterSuggestions(); + getUniqueTestDescription(); + isLabNeedToLoad = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getLabResultReportPDF({required PatientLabOrdersResponseModel labOrder, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await labRepo.getLabResultReportPDF(labOrder: labOrder); + + result.fold( + (failure) async => await errorHandlerService.handleError( + failure: failure, + onOkPressed: () { + onError!(failure.message); + }, + ), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientLabResultReportPDFBase64 = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + filterSuggestions() { + final List labels = patientLabOrders + .expand((order) => order.testDetails!) + .map((detail) => detail.description) + .whereType() + .toList(); + _labSuggestionsList = labels.toSet().toList(); + + notifyListeners(); + } + + filterLabReports(String query) { + if (query.isEmpty) { + filteredLabOrders = List.from(patientLabOrders); // reset + } else { + filteredLabOrders = patientLabOrders.where((order) { + final descriptions = order.testDetails?.map((d) => d.description?.toLowerCase()).toList() ?? []; + return descriptions.any((desc) => desc != null && desc.contains(query.toLowerCase())); + }).toList(); + patientLabOrders = filteredLabOrders; + } + notifyListeners(); + } + + getUniqueTestDescription() { + uniqueTests = { + for (var item in patientLabOrders) + if (item.testDetails != null) + ...?item.testDetails?.map((test) => TestDetails( + testDescriptionEn: test.testDescriptionEn.toString(), + testDescriptionAr: test.testDescriptionAr.toString(), + description: test.description.toString(), + testCode: test.testCode.toString(), + testID: test.testID, + createdOn: item.createdOn, + model: item)) + }; + for (var element in uniqueTests) { + labOrderTests.add(element.description ?? ""); + } + } + + Future getPatientLabResultByHospital( + PatientLabOrdersResponseModel laborder) async { + isLabResultByHospitalLoading = true; + notifyListeners(); + mainLabResultsByHospitals.clear; + + final result = await labRepo.getPatientLabResultsByHospitals(laborder, + Utils.isVidaPlusProject(int.parse(laborder.projectID ?? "0"))); + + result.fold( + (failure) async { + isLabResultByHospitalLoading = false; + notifyListeners(); + // await errorHandlerService.handleError(failure: failure); + }, + (apiResponse) { + isLabResultByHospitalLoading = false; + if (apiResponse.messageStatus == 2) { + } else if (apiResponse.messageStatus == 1) { + mainLabResultsByHospitals = apiResponse.data ?? []; + notifyListeners(); + } + }, + ); + } + + Future getPatientLabResult(PatientLabOrdersResponseModel laborder, String procedureName, String testDescription) async { + LoaderBottomSheet.showLoader(); + mainLabResults.clear(); + filteredGraphValues.clear(); + maxY = double.negativeInfinity; + + final result = await labRepo.getPatientLabResults( + laborder, + Utils.isVidaPlusProject(int.parse(laborder.projectID ?? "0")), + procedureName); + + result.fold( + (failure) async { + LoaderBottomSheet.hideLoader(); + await errorHandlerService.handleError(failure: failure); + }, + (apiResponse) { + LoaderBottomSheet.hideLoader(); + if (apiResponse.messageStatus == 2) { + } else if (apiResponse.messageStatus == 1) { + var sortedResponse = sortByFlagAndValue(apiResponse.data!); + var recentThree = sort(sortedResponse); + mainLabResults = recentThree; + + double counter = 1; + recentThree.reversed.forEach((element) { + try { + var dateTime = + DateUtil.convertStringToDate(element.verifiedOnDateTime!); + var resultValue = double.parse(element.resultValue!); + var transformedValue = transformValueInRange(double.parse(element.resultValue!), element.calculatedResultFlag??""); + if (resultValue>maxY) { + maxY = resultValue; + maxX = maxY; + } + + filteredGraphValues.add(DataPoint( + value: transformedValue, + actualValue:element.resultValue!, + label: formatDateAsMMYY(dateTime), + unitOfMeasurement: element.uOM, + displayTime: resultDate(dateTime), + time: DateUtil.convertStringToDate(element.verifiedOnDateTime), + referenceValue: element.calculatedResultFlag ?? "", + + )); + counter++; + } catch (e) {} + }); + LabResult recentResult = recentThree.first; + checkIfGraphShouldBeDisplayed(recentResult); + recentResult.verifiedOn = resultDate(DateUtil.convertStringToDate(recentResult.verifiedOnDateTime!)); + // filteredGraphValues = [filteredGraphValues.first]; + navigationService.push(MaterialPageRoute( + builder: (_) => LabResultDetails(recentLabResult: recentResult, testDescription: testDescription), + ), + ); + notifyListeners(); + } + }, + ); + } + + void checkIfGraphShouldBeDisplayed(LabResult recentResult){ + shouldShowGraph = recentResult.checkIfGraphShouldBeDisplayed(); + isGraphVisible = shouldShowGraph; + notifyListeners(); + } + + Future getPatientSpecialResult( + PatientLabOrdersResponseModel laborder) async { + isSpecialResultsLoading = true; + labSpecialResult = ""; + notifyListeners(); + final result = await labRepo.getSpecialLabResult( + laborder, + Utils.isVidaPlusProject(int.parse(laborder.projectID ?? "0")), + ); + + result.fold( + (failure) async { + isSpecialResultsLoading = false; + notifyListeners(); + // await errorHandlerService.handleError(failure: failure); + }, + (apiResponse) { + isSpecialResultsLoading = false; + if (apiResponse.messageStatus == 2) { + } else if (apiResponse.messageStatus == 1) { + StringBuffer htmlbuffer = StringBuffer(""); + + apiResponse.data?.forEach((element) { + if(element.resultDataHTML != null && element.resultDataHTML?.isNotEmpty == true) + htmlbuffer.write("${element.resultDataHTML}

"); + }); + + labSpecialResult = htmlbuffer.toString(); + + notifyListeners(); + } + notifyListeners(); + }, + ); + } + + String resultDate(DateTime date){ + + + return '${date.day} ${months[date.month-1]},${date.year}'; + } + + double transformValueInRange(double inputValue, String flag) { + // Define range boundaries + double rangeStart, rangeEnd; + + switch (flag) { + case'LCL': + case 'CL': + rangeStart = 0.0; + rangeEnd = 19.0; + break; + case 'L': + rangeStart = 20.0; + rangeEnd = 39.0; + break; + case 'N': + rangeStart = 40.0; + rangeEnd = 59.0; + break; + case 'H': + rangeStart = 60.0; + rangeEnd = 79.0; + break; + case 'HCH': + case 'CH': + rangeStart = 80.0; + rangeEnd = 100.0; + break; + default: + throw ArgumentError('Invalid flag: $flag'); + } + + // Clamp input value to 0-100 and map it to the range bounds + final clampedValue = inputValue.clamp(0.0, 100.0); + final normalizedValue = clampedValue / 100.0; // Normalize input to 0-1 + + // Map the normalized value to the target range bounds + final transformedValue = rangeStart + ((normalizedValue * (rangeEnd - rangeStart))); + debugPrint("the actual value is $inputValue"); + debugPrint("the flag is $flag"); + debugPrint("the transformed value is $transformedValue"); + return transformedValue; + } + void getSelectedDateRange(DateTime? start, DateTime? end) { + maxY = double.negativeInfinity; + + if(start == null && end == null) { + mainLabResults.forEach((element) { + final time = DateUtil.convertStringToDate(element.verifiedOnDateTime!); + try{ + var resultValue = double.parse(element.resultValue!); + + var transformedValue = transformValueInRange(double.parse(element.resultValue!), element.calculatedResultFlag??""); + if (resultValue > maxY) { + maxY = resultValue; + } + filteredGraphValues.add(DataPoint( + value: transformedValue, + actualValue: element.resultValue!, + label: formatDateAsMMYY(time), + unitOfMeasurement: element.uOM, + + displayTime: resultDate(time), + time: DateUtil.convertStringToDate(element.verifiedOnDateTime), + referenceValue: element.calculatedResultFlag ?? "", + )); + }catch(e){ + + } + }); + + }else { + filteredGraphValues.clear(); + + mainLabResults.forEach((element) { + try { + var dateTime = + DateUtil.convertStringToDate(element.verifiedOnDateTime!); + var resultValue = double.parse(element.resultValue!); + var transformedValue = transformValueInRange(double.parse(element.resultValue!), element.calculatedResultFlag??""); + if (resultValue > maxY) { + maxY = resultValue; + } + if (start != null && end == null) { + if (dateTime.isAtSameMomentAs(start)) { + + filteredGraphValues.add(DataPoint( + value: transformedValue, + actualValue: element.resultValue!, + unitOfMeasurement: element.uOM, + + label: formatDateAsMMYY(dateTime), + displayTime: resultDate(dateTime), + time: + DateUtil.convertStringToDate(element.verifiedOnDateTime), + referenceValue: element.calculatedResultFlag ?? "")); + } + } else if (start != null && end != null) { + if ((dateTime.isAfter(start)) && (dateTime.isBefore(end))) { + + filteredGraphValues.add(DataPoint( + value: transformedValue, + actualValue: element.resultValue!, + label: formatDateAsMMYY(dateTime), + unitOfMeasurement: element.uOM, + + displayTime: resultDate(dateTime), + time: + DateUtil.convertStringToDate(element.verifiedOnDateTime), + referenceValue: element.calculatedResultFlag ?? "")); + } + } + } catch (e) {} + }); + } + filteredGraphValues = sortFilteredList(filteredGraphValues).reversed.toList(); + + + notifyListeners(); + } + + String formatDateAsMMYY(DateTime date) { + + return '${months[date.month-1]}, ${date.year}'; + } + + + List sortByFlagAndValue(List original) { + const priorityOrder = ['LCL', 'CL', 'L', 'N', 'H', 'CH', 'HCH']; + + int getFlagPriority(String? flag) { + if (flag == null) return priorityOrder.length; + final index = priorityOrder.indexOf(flag); + return index == -1 ? priorityOrder.length : index; + } + + double parseResultValue(String? value) { + if (value == null) return double.nan; + return double.tryParse(value) ?? double.nan; + } + + final copy = List.from(original); + copy.sort((a, b) { + final aFlagPriority = getFlagPriority(a.calculatedResultFlag); + final bFlagPriority = getFlagPriority(b.calculatedResultFlag); + + if (aFlagPriority != bFlagPriority) { + return aFlagPriority.compareTo(bFlagPriority); + } + + final aValue = parseResultValue(a.resultValue); + final bValue = parseResultValue(b.resultValue); + + return aValue.compareTo(bValue); + }); + + return copy; + } + + List sort(List original) { + DateTime? parseVerifiedDate(String? raw) { + if (raw == null) return null; + final regex = RegExp(r'\/Date\((\d+)\)\/'); + final match = regex.firstMatch(raw); + if (match != null) { + final millis = int.tryParse(match.group(1)!); + if (millis != null) { + + return DateTime.fromMillisecondsSinceEpoch(millis); + } + } + return null; + } + + final copy = List.from(original); + copy.sort((a, b) { + final aDate = DateUtil.convertStringToDate(a.verifiedOnDateTime); + final bDate = DateUtil.convertStringToDate(b.verifiedOnDateTime); + final now = DateTime.now(); + if (aDate == now && bDate == now) return 0; + if (aDate == now) return 1; + if (bDate == now) return -1; + return bDate.compareTo(aDate); // descending + }); + return copy.toList(); + } + + List sortFilteredList(List original) { + + + final copy = List.from(original); + copy.sort((a, b) { + final aDate =a.time; + final bDate = a.time; + final now = DateTime.now(); + if (aDate == now && bDate == now) return 0; + if (aDate == now) return 1; + if (bDate == now) return -1; + return bDate.compareTo(aDate); // descending + }); + return copy.toList(); + } + + Color getColor(String flag) { + switch (flag) { + case 'LCL': + return AppColors.criticalLowAndHigh; + case 'CL': + return AppColors.criticalLowAndHigh; + case 'L': + return AppColors.highAndLow; + case 'N': + return AppColors.bgGreenColor; + case 'H': + return AppColors.highAndLow; + case 'CH': + return AppColors.criticalLowAndHigh; + case 'HCH': + return AppColors.criticalLowAndHigh; + default: + return Colors.grey; + } + } + + String getFormattedDate(DateTime date){ + return DateFormat('EEEE, dd MMMM. yyyy').format(date); + } + + String getAssetUrlWRTResult(String refernceValue) { + switch (refernceValue) { + case 'CL': + case 'LCL': + return AppAssets.ic_critical_low_result; + case 'L': + return AppAssets.ic_low_result; + case 'N': + return AppAssets.ic_normal_result; + case 'H': + return AppAssets.ic_low_result; + case 'CH': + case 'HCH': + return AppAssets.ic_critical_low_result; + default: + return AppAssets.ic_normal_result; + } + } + + bool getRotationWRTResult(String refernceValue) { + switch (refernceValue) { + case 'CL': + case 'LCL': + case 'L': + case 'N': + return false; + case 'H': + case 'CH': + case 'HCH': + return true; + default: + return true; + } + } + + String getSeverityText(String refernceValue) { + switch (refernceValue) { + case 'N': + return "normal"; + case 'L': + case 'H': + return "monitor"; + case 'CL': + case 'LCL': + case 'CH': + case 'HCH': + return "attention"; + default: + return "normal"; + } + } + + alterGraphVisibility(){ + isGraphVisible = !isGraphVisible; + notifyListeners(); + } +} diff --git a/lib/features/lab/models/Range.dart b/lib/features/lab/models/Range.dart new file mode 100644 index 0000000..5dd39dc --- /dev/null +++ b/lib/features/lab/models/Range.dart @@ -0,0 +1,6 @@ +enum Range{ + WEEKLY, + LAST_MONTH, + LAST_6MONTH, + THIS_YEAR, +} \ No newline at end of file diff --git a/lib/features/lab/models/resp_models/lab_result.dart b/lib/features/lab/models/resp_models/lab_result.dart new file mode 100644 index 0000000..a075be3 --- /dev/null +++ b/lib/features/lab/models/resp_models/lab_result.dart @@ -0,0 +1,135 @@ +class LabResult { + String? description; + dynamic femaleInterpretativeData; + int? gender; + int? lineItemNo; + dynamic maleInterpretativeData; + dynamic notes; + String? packageID; + int? patientID; + String? projectID; + String? referanceRange; + String? resultValue; + String? sampleCollectedOn; + String? sampleReceivedOn; + String? setupID; + dynamic superVerifiedOn; + String? testCode; + String? uOM; + String? verifiedOn; + String? verifiedOnDateTime; + String? changeResult; + String? calculatedResultFlag; + String? criticalHigh; + String? referenceHigh; + String? criticalLow; + String? referenceLow; + num? resultTypeID; + String? packageShortDescription; + + LabResult( + {this.description, + this.femaleInterpretativeData, + this.gender, + this.lineItemNo, + this.maleInterpretativeData, + this.notes, + this.packageID, + this.patientID, + this.projectID, + this.referanceRange, + this.resultValue, + this.sampleCollectedOn, + this.sampleReceivedOn, + this.setupID, + this.superVerifiedOn, + this.testCode, + this.uOM, + this.verifiedOn, + this.calculatedResultFlag, + this.verifiedOnDateTime, + this.criticalHigh, + this.referenceHigh, + this.criticalLow, + this.referenceLow, + }); + + LabResult.fromJson(Map json) { + description = json['Description']; + femaleInterpretativeData = json['FemaleInterpretativeData']; + gender = json['Gender']; + lineItemNo = json['LineItemNo']; + maleInterpretativeData = json['MaleInterpretativeData']; + notes = json['Notes']; + packageID = json['PackageID']; + patientID = json['PatientID']; + projectID = json['ProjectID']; + referanceRange = json['ReferanceRange']; + resultValue = json['ResultValue']; + sampleCollectedOn = json['SampleCollectedOn']; + sampleReceivedOn = json['SampleReceivedOn']; + setupID = json['SetupID']; + superVerifiedOn = json['SuperVerifiedOn']; + testCode = json['TestCode']; + uOM = json['UOM']; + verifiedOn = json['VerifiedOn']; + verifiedOnDateTime = json['VerifiedOnDateTime']; + changeResult = json['ChangeResult']; + calculatedResultFlag = json['CalculatedResultFlag']; + criticalHigh = json['CriticalHigh']; + referenceHigh = json['ReferenceHigh']; + criticalLow = json['CriticalLow']; + referenceLow = json['ReferenceLow']; + packageShortDescription = json['PackageShortDescription']; + resultTypeID = json['ResultTypeID']; + } + + Map toJson() { + final Map data = new Map(); + data['Description'] = this.description; + data['FemaleInterpretativeData'] = this.femaleInterpretativeData; + data['Gender'] = this.gender; + data['LineItemNo'] = this.lineItemNo; + data['MaleInterpretativeData'] = this.maleInterpretativeData; + data['Notes'] = this.notes; + data['PackageID'] = this.packageID; + data['PatientID'] = this.patientID; + data['ProjectID'] = this.projectID; + data['ReferanceRange'] = this.referanceRange; + data['ResultValue'] = this.resultValue; + data['SampleCollectedOn'] = this.sampleCollectedOn; + data['SampleReceivedOn'] = this.sampleReceivedOn; + data['SetupID'] = this.setupID; + data['SuperVerifiedOn'] = this.superVerifiedOn; + data['TestCode'] = this.testCode; + data['UOM'] = this.uOM; + data['VerifiedOn'] = this.verifiedOn; + data['VerifiedOnDateTime'] = this.verifiedOnDateTime; + data['ChangeResult'] = this.changeResult; + data['CriticalHigh'] = this.criticalHigh; + data['ReferenceHigh'] = this.referenceHigh; + data['CriticalLow'] = this.criticalLow; + data['ReferenceLow'] = this.referenceLow; + return data; + } + + bool checkIfGraphShouldBeDisplayed(){ + if (resultTypeID == null) return false; + if (resultTypeID == 6) return false; + if (referanceRange == null || referanceRange == "" || referanceRange == "\n") return false; + bool isDigit = RegExp(r"\\d+").hasMatch("$resultValue"); + if(isDigit) return true; + try { + num.parse(resultValue ?? ""); + } catch (e) { + return false; + } + + return true; + } + + @override + String toString() { + return 'LabOrderResult(flag: $calculatedResultFlag, value: $resultValue, verifiedOn: $verifiedOnDateTime)'; + } +} diff --git a/lib/features/lab/models/resp_models/patient_lab_orders_response_model.dart b/lib/features/lab/models/resp_models/patient_lab_orders_response_model.dart new file mode 100644 index 0000000..8bef76a --- /dev/null +++ b/lib/features/lab/models/resp_models/patient_lab_orders_response_model.dart @@ -0,0 +1,253 @@ +class PatientLabOrdersResponseModel { + int? actualDoctorRate; + dynamic? admissionDate; + dynamic? admissionNumber; + dynamic? appointmentDate; + dynamic? appointmentNo; + dynamic? appointmentTime; + String? clinicDescription; + String? clinicDescriptionEnglish; + dynamic? clinicDescriptionN; + int? clinicID; + String? createdOn; + num? decimalDoctorRate; + int? doctorID; + String? doctorImageURL; + String? doctorName; + String? doctorNameEnglish; + dynamic? doctorNameN; + int? doctorRate; + num? doctorStarsRate; + String? doctorTitle; + int? gender; + String? genderDescription; + String? invoiceNo; + dynamic? invoiceNoVP; + String? invoiceType; + bool? isActiveDoctorProfile; + bool? isDoctorAllowVedioCall; + bool? isDrReviewReq; + bool? isExecludeDoctor; + bool? isInOutPatient; + String? isInOutPatientDescription; + String? isInOutPatientDescriptionN; + bool? isLiveCareAppointment; + bool? isRead; + bool? isSendEmail; + String? nationalityFlagURL; + int? noOfPatientsRate; + String? orderDate; + String? orderNo; + dynamic? orderProjectID; + String? patientID; + String? projectID; + String? projectName; + dynamic? projectNameN; + String? qR; + String? setupID; + // List? speciality; + int? status; + String? statusDesc; + String? strOrderDate; + List? testDetails; + + PatientLabOrdersResponseModel( + {this.actualDoctorRate, + this.admissionDate, + this.admissionNumber, + this.appointmentDate, + this.appointmentNo, + this.appointmentTime, + this.clinicDescription, + this.clinicDescriptionEnglish, + this.clinicDescriptionN, + this.clinicID, + this.createdOn, + this.decimalDoctorRate, + this.doctorID, + this.doctorImageURL, + this.doctorName, + this.doctorNameEnglish, + this.doctorNameN, + this.doctorRate, + this.doctorStarsRate, + this.doctorTitle, + this.gender, + this.genderDescription, + this.invoiceNo, + this.invoiceNoVP, + this.invoiceType, + this.isActiveDoctorProfile, + this.isDoctorAllowVedioCall, + this.isDrReviewReq, + this.isExecludeDoctor, + this.isInOutPatient, + this.isInOutPatientDescription, + this.isInOutPatientDescriptionN, + this.isLiveCareAppointment, + this.isRead, + this.isSendEmail, + this.nationalityFlagURL, + this.noOfPatientsRate, + this.orderDate, + this.orderNo, + this.orderProjectID, + this.patientID, + this.projectID, + this.projectName, + this.projectNameN, + this.qR, + this.setupID, + // this.speciality, + this.status, + this.statusDesc, + this.strOrderDate, + this.testDetails}); + + PatientLabOrdersResponseModel.fromJson(Map json) { + actualDoctorRate = json['ActualDoctorRate']; + admissionDate = json['AdmissionDate']; + admissionNumber = json['AdmissionNumber']; + appointmentDate = json['AppointmentDate']; + appointmentNo = json['AppointmentNo']; + appointmentTime = json['AppointmentTime']; + clinicDescription = json['ClinicDescription']; + clinicDescriptionEnglish = json['ClinicDescriptionEnglish']; + clinicDescriptionN = json['ClinicDescriptionN']; + clinicID = json['ClinicID']; + createdOn = json['CreatedOn']; + decimalDoctorRate = json['DecimalDoctorRate']; + doctorID = json['DoctorID']; + doctorImageURL = json['DoctorImageURL']; + doctorName = json['DoctorName']; + doctorNameEnglish = json['DoctorNameEnglish']; + doctorNameN = json['DoctorNameN']; + doctorRate = json['DoctorRate']; + doctorStarsRate = json['DoctorStarsRate']; + doctorTitle = json['DoctorTitle']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + invoiceNo = json['InvoiceNo']; + invoiceNoVP = json['InvoiceNo_VP']; + invoiceType = json['InvoiceType']; + isActiveDoctorProfile = json['IsActiveDoctorProfile']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isDrReviewReq = json['IsDrReviewReq']; + isExecludeDoctor = json['IsExecludeDoctor']; + isInOutPatient = json['IsInOutPatient']; + isInOutPatientDescription = json['IsInOutPatientDescription']; + isInOutPatientDescriptionN = json['IsInOutPatientDescriptionN']; + isLiveCareAppointment = json['IsLiveCareAppointment']; + isRead = json['IsRead']; + isSendEmail = json['IsSendEmail']; + nationalityFlagURL = json['NationalityFlagURL']; + noOfPatientsRate = json['NoOfPatientsRate']; + orderDate = json['OrderDate']; + orderNo = json['OrderNo']; + orderProjectID = json['OrderProjectID']; + patientID = json['PatientID']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + projectNameN = json['ProjectNameN']; + qR = json['QR']; + setupID = json['SetupID']; + // speciality = json['Speciality'].cast(); + status = json['Status']; + statusDesc = json['StatusDesc']; + strOrderDate = json['StrOrderDate']; + if (json['TestDetails'] != null) { + testDetails = []; + json['TestDetails'].forEach((v) { + testDetails!.add(TestDetails.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['ActualDoctorRate'] = this.actualDoctorRate; + data['AdmissionDate'] = this.admissionDate; + data['AdmissionNumber'] = this.admissionNumber; + data['AppointmentDate'] = this.appointmentDate; + data['AppointmentNo'] = this.appointmentNo; + data['AppointmentTime'] = this.appointmentTime; + data['ClinicDescription'] = this.clinicDescription; + data['ClinicDescriptionEnglish'] = this.clinicDescriptionEnglish; + data['ClinicDescriptionN'] = this.clinicDescriptionN; + data['ClinicID'] = this.clinicID; + data['CreatedOn'] = this.createdOn; + data['DecimalDoctorRate'] = this.decimalDoctorRate; + data['DoctorID'] = this.doctorID; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorName'] = this.doctorName; + data['DoctorNameEnglish'] = this.doctorNameEnglish; + data['DoctorNameN'] = this.doctorNameN; + data['DoctorRate'] = this.doctorRate; + data['DoctorStarsRate'] = this.doctorStarsRate; + data['DoctorTitle'] = this.doctorTitle; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['InvoiceNo'] = this.invoiceNo; + data['InvoiceNo_VP'] = this.invoiceNoVP; + data['InvoiceType'] = this.invoiceType; + data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsDrReviewReq'] = this.isDrReviewReq; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['IsInOutPatient'] = this.isInOutPatient; + data['IsInOutPatientDescription'] = this.isInOutPatientDescription; + data['IsInOutPatientDescriptionN'] = this.isInOutPatientDescriptionN; + data['IsLiveCareAppointment'] = this.isLiveCareAppointment; + data['IsRead'] = this.isRead; + data['IsSendEmail'] = this.isSendEmail; + data['NationalityFlagURL'] = this.nationalityFlagURL; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['OrderDate'] = this.orderDate; + data['OrderNo'] = this.orderNo; + data['OrderProjectID'] = this.orderProjectID; + data['PatientID'] = this.patientID; + data['ProjectID'] = this.projectID; + data['ProjectName'] = this.projectName; + data['ProjectNameN'] = this.projectNameN; + data['QR'] = this.qR; + data['SetupID'] = this.setupID; + // data['Speciality'] = this.speciality; + data['Status'] = this.status; + data['StatusDesc'] = this.statusDesc; + data['StrOrderDate'] = this.strOrderDate; + if (this.testDetails != dynamic) { + data['TestDetails'] = this.testDetails!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class TestDetails { + String? description; + String? testDescriptionEn; + String? testDescriptionAr; + String? testCode; + String? testID; + String? createdOn; + PatientLabOrdersResponseModel? model; + + TestDetails({this.description, this.testDescriptionEn, this.testDescriptionAr, this.testCode, this.testID, this.createdOn, this.model}); + + TestDetails.fromJson(Map json) { + description = json['Description']; + testDescriptionEn = json['TestDescriptionEn'] ?? ""; + testDescriptionAr = json['TestDescriptionAr'] ?? ""; + testCode = json['TestCode']; + testID = json['TestID']; + createdOn = json['CreatedOn']; + } + + Map toJson() { + final Map data = {}; + data['Description'] = this.description; + data['TestCode'] = this.testCode; + data['TestID'] = this.testID; + data['CreatedOn'] = this.createdOn; + return data; + } +} diff --git a/lib/features/lab/models/resp_models/patient_lab_special_result.dart b/lib/features/lab/models/resp_models/patient_lab_special_result.dart new file mode 100644 index 0000000..87301f9 --- /dev/null +++ b/lib/features/lab/models/resp_models/patient_lab_special_result.dart @@ -0,0 +1,32 @@ +class PatientLabSpecialResult { + String? invoiceNo; + String? moduleID; + String? resultData; + String? resultDataHTML; + dynamic resultDataTxt; + + PatientLabSpecialResult( + {this.invoiceNo, + this.moduleID, + this.resultData, + this.resultDataHTML, + this.resultDataTxt}); + + PatientLabSpecialResult.fromJson(Map json) { + invoiceNo = json['InvoiceNo']; + moduleID = json['ModuleID']; + resultData = json['ResultData']; + resultDataHTML = json['ResultDataHTML']; + resultDataTxt = json['ResultDataTxt']; + } + + Map toJson() { + final Map data = new Map(); + data['InvoiceNo'] = this.invoiceNo; + data['ModuleID'] = this.moduleID; + data['ResultData'] = this.resultData; + data['ResultDataHTML'] = this.resultDataHTML; + data['ResultDataTxt'] = this.resultDataTxt; + return data; + } +} diff --git a/lib/features/location/GeocodeResponse.dart b/lib/features/location/GeocodeResponse.dart new file mode 100644 index 0000000..3e911aa --- /dev/null +++ b/lib/features/location/GeocodeResponse.dart @@ -0,0 +1,80 @@ +class GeocodeResponse { + final List results; + final String status; + + GeocodeResponse({ + required this.results, + required this.status, + }); + + factory GeocodeResponse.fromJson(Map json) { + final resultsList = (json['results'] as List? ?? []) + .map((e) => GeocodeResult.fromJson(e as Map)) + .toList(); + + return GeocodeResponse( + results: resultsList, + status: json['status'] ?? '', + ); + } + @override + String toString() { + return 'GeocodeResponse(status: $status, results: [${results.map((r) => r.toString()).join(', ')}])'; + } +} + +class GeocodeResult { + final String formattedAddress; + final Geometry geometry; + final String placeId; + + GeocodeResult({ + required this.formattedAddress, + required this.geometry, + required this.placeId, + }); + + factory GeocodeResult.fromJson(Map json) { + return GeocodeResult( + formattedAddress: json['formatted_address'] ?? '', + geometry: Geometry.fromJson(json['geometry']), + placeId: json['place_id'] ?? '', + ); + } + @override + String toString() { + return 'GeocodeResult(formattedAddress: $formattedAddress, placeId: $placeId, geometry: ${geometry.toString()})'; + } +} + +class Geometry { + final Location location; + + Geometry({required this.location}); + + factory Geometry.fromJson(Map json) { + return Geometry( + location: Location.fromJson(json['location']), + ); + } + + @override + String toString() => 'Geometry(location: ${location.toString()})'; +} + +class Location { + final double lat; + final double lng; + + Location({required this.lat, required this.lng}); + + factory Location.fromJson(Map json) { + return Location( + lat: (json['lat'] as num).toDouble(), + lng: (json['lng'] as num).toDouble(), + ); + } + + @override + String toString() => 'Location(lat: $lat, lng: $lng)'; +} \ No newline at end of file diff --git a/lib/features/location/PlaceDetails.dart b/lib/features/location/PlaceDetails.dart new file mode 100644 index 0000000..82846ea --- /dev/null +++ b/lib/features/location/PlaceDetails.dart @@ -0,0 +1,14 @@ +class PlaceDetails { + final double lat; + final double lng; + + PlaceDetails({required this.lat, required this.lng}); + + factory PlaceDetails.fromJson(Map json) { + final loc = json['result']['geometry']['location']; + return PlaceDetails( + lat: (loc['lat'] as num).toDouble(), + lng: (loc['lng'] as num).toDouble(), + ); + } +} \ No newline at end of file diff --git a/lib/features/location/PlacePrediction.dart b/lib/features/location/PlacePrediction.dart new file mode 100644 index 0000000..ea68153 --- /dev/null +++ b/lib/features/location/PlacePrediction.dart @@ -0,0 +1,11 @@ +class PlacePrediction { + final String description; + final String placeID; + PlacePrediction({required this.description, required this.placeID}); + factory PlacePrediction.fromJson(Map json) { + return PlacePrediction( + description: json['description'] ?? '', + placeID: json['place_id'] ?? '', + ); + } +} \ No newline at end of file diff --git a/lib/features/location/location_repo.dart b/lib/features/location/location_repo.dart new file mode 100644 index 0000000..46c97ac --- /dev/null +++ b/lib/features/location/location_repo.dart @@ -0,0 +1,153 @@ +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart'; +import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart'; + +import '../../core/api_consts.dart'; +import 'PlacePrediction.dart'; + +abstract class LocationRepo { + Future>>> + getPlacePredictionsAsInput(String input); + + Future>> + getPlaceDetailsOfSelectedPrediction(String placeId); + + Future>> + getGeoCodeFromLatLng(double lat, double lng); +} + +class LocationRepoImpl implements LocationRepo { + final ApiClient apiClient; + + LocationRepoImpl({required this.apiClient}); + + @override + Future>>> getPlacePredictionsAsInput( + String input) async { + final url = Uri.parse( + 'https://maps.googleapis.com/maps/api/place/autocomplete/json?input=$input®ion=SA&key=$GOOGLE_API_KEY', + ); + + GenericApiModel>? apiResponse; + Failure? failure; + + try { + await apiClient.get( + url.toString(), + isExternal: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['predictions']; + final predictionsList = list + .map((item) => + PlacePrediction.fromJson(item as Map)) + .toList() + .cast(); + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: predictionsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getGeoCodeFromLatLng(double lat, double lng) async { + final url = Uri.parse( + 'https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=$GOOGLE_API_KEY', + ); + + + GenericApiModel? apiResponse; + Failure? failure; + + try { + await apiClient.get( + url.toString(), + isExternal: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final predictionsList = GeocodeResponse.fromJson(response); + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: predictionsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getPlaceDetailsOfSelectedPrediction(String placeId) async { + + + final url = Uri.parse( + 'https://maps.googleapis.com/maps/api/place/details/json' + '?place_id=$placeId&fields=geometry&key=$GOOGLE_API_KEY', + ); + + GenericApiModel? apiResponse; + Failure? failure; + + try { + await apiClient.get( + url.toString(), + isExternal: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final predictionsList = PlaceDetails.fromJson(response); + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: predictionsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/location/location_view_model.dart b/lib/features/location/location_view_model.dart new file mode 100644 index 0000000..e2e0cc5 --- /dev/null +++ b/lib/features/location/location_view_model.dart @@ -0,0 +1,116 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart' show ChangeNotifier; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter_platform_interface/src/types/camera.dart'; +import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart'; +import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart'; +import 'package:hmg_patient_app_new/features/location/location_repo.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:huawei_map/huawei_map.dart' as HMSCameraServices; +import 'package:google_maps_flutter/google_maps_flutter.dart' as GMSMapServices; + + + +import 'PlacePrediction.dart'; + +class LocationViewModel extends ChangeNotifier { + final LocationRepo locationRepo; + final ErrorHandlerService errorHandlerService; + + LocationViewModel({required this.locationRepo, required this.errorHandlerService}); + + List predictions = []; + PlacePrediction? selectedPrediction; + bool isPredictionLoading = false; + GeocodeResponse? geocodeResponse; + PlaceDetails? placeDetails; + + Location? mapCapturedLocation; + + FutureOr getPlacesPrediction(String input) async { + predictions = []; + isPredictionLoading= true; + final result = await locationRepo.getPlacePredictionsAsInput(input); + result.fold( + (failure) { + errorHandlerService.handleError(failure: failure); + }, + (apiModel) { + predictions = apiModel.data??[]; + }, + ); + isPredictionLoading = false; + notifyListeners(); + } + + FutureOr getPlaceEncodedData(double? lat, double? lng) async { + geocodeResponse = null; + final result = await locationRepo.getGeoCodeFromLatLng(lat!, lng!); + result.fold( + (failure) { + errorHandlerService.handleError(failure: failure); + }, + (apiModel) { + print("Geocode Response: ${apiModel.data}"); + geocodeResponse = apiModel.data; + }, + ); + notifyListeners(); + } + + FutureOr getPlaceDetails(String placeID) async { + placeDetails = null; + final result = await locationRepo.getPlaceDetailsOfSelectedPrediction(placeID); + result.fold( + (failure) { + errorHandlerService.handleError(failure: failure); + }, + (apiModel) { + placeDetails = apiModel.data; + }, + ); + notifyListeners(); + } + + handleGMSMapCameraMoved(GMSMapServices.CameraPosition value) { + mapCapturedLocation = Location(lat: value.target.latitude, lng: value.target.longitude); + + } + + handleHMSMapCameraMoved(HMSCameraServices.CameraPosition value) { + mapCapturedLocation = Location(lat: value.target.lat, lng: value.target.lng); + } + + handleOnCameraIdle(){ + if(mapCapturedLocation != null) { + getPlaceEncodedData(mapCapturedLocation!.lat, mapCapturedLocation!.lng); + } + } + + void updateSearchQuery(String? value) { + if(value == null || value.isEmpty){ + predictions = []; + return; + } + + getPlacesPrediction(value); + } + + void flushSearchPredictions() { + predictions = []; + mapCapturedLocation= null; + placeDetails= null; + geocodeResponse= null; + selectedPrediction= null; + + notifyListeners(); + } + + FutureOr selectPlacePrediction(PlacePrediction placePrediction) async{ + selectedPrediction= placePrediction; + await getPlaceDetails(placePrediction.placeID); + } + + +} \ No newline at end of file diff --git a/lib/features/medical_file/medical_file_repo.dart b/lib/features/medical_file/medical_file_repo.dart new file mode 100644 index 0000000..ab09ca6 --- /dev/null +++ b/lib/features/medical_file/medical_file_repo.dart @@ -0,0 +1,552 @@ +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_vaccine_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +import '../authentication/models/resp_models/authenticated_user_resp_model.dart'; +import 'models/family_file_response_model.dart'; + +abstract class MedicalFileRepo { + Future>>> getPatientVaccinesList(); + + Future>>> getPatientSickLeavesList(); + + Future>> getPatientSickLeavePDF(PatientSickLeavesResponseModel patientSickLeavesResponseModel, AuthenticatedUser authenticatedUser); + + Future>>> getPatientMedicalReportsList(); + + Future>> getPatientMedicalReportPDF(PatientMedicalReportResponseModel patientMedicalReportResponseModel, AuthenticatedUser authenticatedUser); + + Future>>> getPatientFamilyFiles(int? status, int patientId); + + Future>>> getAllPendingRecordsByResponseId({required Map request}); + + Future>> addFamilyFile({required dynamic request}); + + Future>>> getPatientAppointmentsForMedicalReport(); + + Future>> insertRequestForMedicalReport({required PatientAppointmentHistoryResponseModel appointmentHistoryResponseModel}); + + Future>> removeFamilyFile({required int? id}); + + Future>> acceptRejectFamilyFile({required int? id, required int? status}); +} + +class MedicalFileRepoImp implements MedicalFileRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + MedicalFileRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>>> getPatientVaccinesList() async { + Map mapDevice = {"To": "0", "From": "0"}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_VACCINES, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_DoneVaccines']; + // if (list == null || list.isEmpty) { + // throw Exception("lab list is empty"); + // } + + final vaccinesList = list.map((item) => PatientVaccineResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: vaccinesList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientSickLeavesList() async { + Map mapDevice = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PATIENT_SICK_LEAVE_STATUS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_SickLeave']; + // if (list == null || list.isEmpty) { + // throw Exception("lab list is empty"); + // } + + final sickLeavesList = list.map((item) => PatientSickLeavesResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: sickLeavesList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> getPatientSickLeavePDF(PatientSickLeavesResponseModel patientSickLeavesResponseModel, AuthenticatedUser authenticatedUser) async { + Map mapDevice = { + "RequestNo": patientSickLeavesResponseModel.requestNo, + "To": authenticatedUser.emailAddress, + "DateofBirth": authenticatedUser.dateofBirth, + "PatientIditificationNum": authenticatedUser.patientIdentificationNo, + "PatientMobileNumber": authenticatedUser.mobileNumber, + "PatientName": "${authenticatedUser.firstName!} ${authenticatedUser.lastName!}", + "ProjectName": patientSickLeavesResponseModel.projectName, + "DoctorName": patientSickLeavesResponseModel.doctorName, + "ProjectID": patientSickLeavesResponseModel.projectID, + "SetupID": patientSickLeavesResponseModel.setupID, + "IsDownload": true, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + SendSickLeaveEmail, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + // final list = response['List_SickLeave']; + // if (list == null || list.isEmpty) { + // throw Exception("lab list is empty"); + // } + + // final vaccinesList = list.map((item) => PatientSickLeavesResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response["Base64Data"], + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientMedicalReportsList() async { + Map mapDevice = { + "IsReport": true, + "EncounterType": 1, + "RequestType": 1, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + REPORTS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['GetPatientMedicalStatus']; + // if (list == null || list.isEmpty) { + // throw Exception("lab list is empty"); + // } + + final vaccinesList = list.map((item) => PatientMedicalReportResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: vaccinesList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> getPatientMedicalReportPDF(PatientMedicalReportResponseModel patientMedicalReportResponseModel, AuthenticatedUser authenticatedUser) async { + Map mapDevice = { + "SetupID": patientMedicalReportResponseModel.setupId, + "PrintDate": patientMedicalReportResponseModel.requestDate!, + "ProcedureID": "05005009", + "Reporttype": "MEDICAL REPORT", + "stamp": patientMedicalReportResponseModel.requestDate!, + "To": authenticatedUser.emailAddress, + "DateofBirth": authenticatedUser.dateofBirth, + "PatientIditificationNum": authenticatedUser.patientIdentificationNo, + "PatientMobileNumber": authenticatedUser.mobileNumber, + "PatientName": "${authenticatedUser.firstName!} ${authenticatedUser.lastName!}", + "ProjectName": patientMedicalReportResponseModel.projectName, + "ClinicName": patientMedicalReportResponseModel.clinicDescription, + "ProjectID": patientMedicalReportResponseModel.projectID, + "InvoiceNo": Utils.isVidaPlusProject(patientMedicalReportResponseModel.projectID!) ? patientMedicalReportResponseModel.invoiceNoVP : patientMedicalReportResponseModel.invoiceNo, + "InvoiceNo_VP": Utils.isVidaPlusProject(patientMedicalReportResponseModel.projectID!) ? patientMedicalReportResponseModel.invoiceNoVP : patientMedicalReportResponseModel.invoiceNo, + "PrintedByName": "${authenticatedUser.firstName!} ${authenticatedUser.lastName!}", + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_MEDICAL_REPORT_PDF, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + // final list = response['List_SickLeave']; + // if (list == null || list.isEmpty) { + // throw Exception("lab list is empty"); + // } + + // final vaccinesList = list.map((item) => PatientSickLeavesResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response["MedicalReportBase64"], + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientFamilyFiles(int? status, int patientID) async { + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.getAllSharedRecordsByStatus, + body: {if (status != null) "Status": status, "PatientID": patientID}, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['GetAllSharedRecordsByStatusList']; + + + final familyLists = list.map((item) => FamilyFileResponseModelLists.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: familyLists, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getAllPendingRecordsByResponseId({required Map request}) async { + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.getAllPendingRecordsByResponseId, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['GetAllPendingRecordsList']; + final familyLists = list.map((item) => FamilyFileResponseModelLists.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: familyLists, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> addFamilyFile({dynamic request}) async { + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.addFamilyFile, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response["ShareFamilyFileObj"] ?? null, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> removeFamilyFile({required int? id}) async { + Map request = {}; + request["ID"] = id; + request['IsActive'] = false; + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.removeFileFromFamilyMembers, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> acceptRejectFamilyFile({required int? id, required int? status}) async { + Map request = {}; + request["ID"] = id; + request['Status'] = status; + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.acceptAndRejectFamilyFile, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientAppointmentsForMedicalReport() async { + Map mapDevice = { + "IsActiveAppointment": false, + "IsComingFromCOC": false, + "isForUpcomming": false, + "IsForMedicalReport": true, + "IsForArrived": false, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PATIENT_APPOINTMENT_HISTORY_ASYNC, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['AppoimentAllHistoryResultList']; + + final appointmentsList = list.map((item) => PatientAppointmentHistoryResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: appointmentsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> insertRequestForMedicalReport({required PatientAppointmentHistoryResponseModel appointmentHistoryResponseModel}) async { + Map mapDevice = { + "ClinicID": appointmentHistoryResponseModel.clinicID, + "DoctorID": appointmentHistoryResponseModel.doctorID, + "SetupID": appointmentHistoryResponseModel.setupID, + "EncounterNo": appointmentHistoryResponseModel.appointmentNo, + "EncounterType": 1, + "IsActive": appointmentHistoryResponseModel.isActiveDoctor, + "ProjectID": appointmentHistoryResponseModel.projectID, + "Remarks": "", + "ProcedureId": "", + "RequestType": 1, + "Source": 2, + "Status": 1, + "CreatedBy": 102 + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + INSERT_REQUEST_FOR_MEDICAL_REPORT, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/medical_file/medical_file_view_model.dart b/lib/features/medical_file/medical_file_view_model.dart new file mode 100644 index 0000000..4b5a14c --- /dev/null +++ b/lib/features/medical_file/medical_file_view_model.dart @@ -0,0 +1,608 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/request_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; +import 'package:hmg_patient_app_new/features/common/models/family_file_request.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_repo.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_vaccine_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; + +class MedicalFileViewModel extends ChangeNotifier { + int selectedTabIndex = 0; + bool isPatientVaccineListLoading = false; + bool isPatientSickLeaveListLoading = false; + bool isPatientSickLeavePDFLoading = false; + bool isPatientMedicalReportsListLoading = false; + + MedicalFileRepo medicalFileRepo; + ErrorHandlerService errorHandlerService; + + List patientVaccineList = []; + List patientSickLeaveList = []; + + List patientMedicalReportList = []; + + List patientMedicalReportRequestedList = []; + List patientMedicalReportReadyList = []; + List patientMedicalReportCancelledList = []; + + List patientMedicalReportAppointmentHistoryList = []; + PatientAppointmentHistoryResponseModel? patientMedicalReportSelectedAppointment; + + List patientFamilyFiles = []; + List pendingFamilyFiles = []; + + String patientSickLeavePDFBase64 = ""; + String patientMedicalReportPDFBase64 = ""; + + int selectedMedicalReportsTabIndex = 0; + int _selectedFamilyFileTabIndex = 0; + + int get getSelectedFamilyFileTabIndex => _selectedFamilyFileTabIndex; + + set setSelectedFamilyFileTabIndex(int value) { + if (_selectedFamilyFileTabIndex != value) { + _selectedFamilyFileTabIndex = value; + notifyListeners(); + } + } + + static final DialogService _dialogService = getIt.get(); + final AppState _appState = getIt(); + AuthenticationViewModel authVM = getIt.get(); + + MedicalFileViewModel({required this.medicalFileRepo, required this.errorHandlerService}); + + initMedicalFileProvider() { + patientMedicalReportAppointmentHistoryList.clear(); + isPatientVaccineListLoading = true; + isPatientMedicalReportsListLoading = true; + notifyListeners(); + } + + void onMedicalReportTabChange(int index) { + selectedMedicalReportsTabIndex = index; + print("Selected Medical Report Tab Index: $selectedMedicalReportsTabIndex"); + if (index == 0) { + patientMedicalReportList = patientMedicalReportRequestedList; + } else if (index == 1) { + patientMedicalReportList = patientMedicalReportReadyList; + } else if (index == 2) { + patientMedicalReportList = patientMedicalReportCancelledList; + } + notifyListeners(); + } + + void onFamilyFileTabChange(int index) { + setSelectedFamilyFileTabIndex = index; + notifyListeners(); + } + + setIsPatientVaccineListLoading(bool isLoading) { + isPatientVaccineListLoading = isLoading; + notifyListeners(); + } + + setIsPatientSickLeavePDFLoading(bool isLoading) { + isPatientSickLeavePDFLoading = isLoading; + notifyListeners(); + } + + setIsPatientSickLeaveListLoading(bool val) { + if (val) { + patientSickLeaveList.clear(); + patientSickLeavePDFBase64 = ""; + } + isPatientSickLeaveListLoading = val; + notifyListeners(); + } + + setIsPatientMedicalReportsLoading(bool val) { + if (val) { + onMedicalReportTabChange(0); + patientMedicalReportList.clear(); + patientMedicalReportPDFBase64 = ""; + } + isPatientMedicalReportsListLoading = val; + notifyListeners(); + } + + setSelectedMedicalReportAppointment(PatientAppointmentHistoryResponseModel? val) { + patientMedicalReportSelectedAppointment = val; + notifyListeners(); + } + + void onTabChanged(int index) { + selectedTabIndex = index; + notifyListeners(); + } + + Future getPatientVaccinesList({Function(dynamic)? onSuccess, Function(String)? onError}) async { + patientVaccineList.clear(); + final result = await medicalFileRepo.getPatientVaccinesList(); + + result.fold( + // (failure) async => await errorHandlerService.handleError( + // failure: failure, + // onOkPressed: () { + // onError!(failure.message); + // }, + // ), + (failure) async { + // onError!(failure.message); + isPatientVaccineListLoading = false; + notifyListeners(); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientVaccineList = apiResponse.data!; + isPatientVaccineListLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientSickLeaveList({Function(dynamic)? onSuccess, Function(String)? onError}) async { + patientSickLeaveList.clear(); + final result = await medicalFileRepo.getPatientSickLeavesList(); + + result.fold( + // (failure) async => await errorHandlerService.handleError( + // failure: failure, + // onOkPressed: () { + // onError!(failure.message); + // }, + // ), + (failure) async { + isPatientSickLeaveListLoading = false; + notifyListeners(); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientSickLeaveList = apiResponse.data!; + isPatientSickLeaveListLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientSickLeavePDF(PatientSickLeavesResponseModel patientSickLeavesResponseModel, AuthenticatedUser authenticatedUser, + {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await medicalFileRepo.getPatientSickLeavePDF(patientSickLeavesResponseModel, authenticatedUser); + + result.fold( + (failure) async => await errorHandlerService.handleError( + failure: failure, + onOkPressed: () { + onError!(failure.message); + }, + ), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientSickLeavePDFBase64 = apiResponse.data!; + isPatientSickLeaveListLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientMedicalReportList({Function(dynamic)? onSuccess, Function(String)? onError}) async { + patientMedicalReportList.clear(); + final result = await medicalFileRepo.getPatientMedicalReportsList(); + + result.fold( + (failure) async => await errorHandlerService.handleError( + failure: failure, + onOkPressed: () { + onError!(failure.message); + }, + ), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientMedicalReportList = apiResponse.data!; + if (patientMedicalReportList.isNotEmpty) { + patientMedicalReportRequestedList = patientMedicalReportList.where((element) => element.status == 1).toList(); + patientMedicalReportReadyList = patientMedicalReportList.where((element) => element.status == 2).toList(); + patientMedicalReportCancelledList = patientMedicalReportList.where((element) => element.status == 4).toList(); + } + onMedicalReportTabChange(0); + isPatientMedicalReportsListLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientMedicalReportPDF(PatientMedicalReportResponseModel patientMedicalReportResponseModel, AuthenticatedUser authenticatedUser, + {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await medicalFileRepo.getPatientMedicalReportPDF(patientMedicalReportResponseModel, authenticatedUser); + + result.fold( + (failure) async => await errorHandlerService.handleError( + failure: failure, + onOkPressed: () { + onError!(failure.message); + }, + ), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientMedicalReportPDFBase64 = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getFamilyFiles({int? status, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await medicalFileRepo.getPatientFamilyFiles(status, _appState.getSuperUserID != null ? _appState.getSuperUserID! : _appState.getAuthenticatedUser()!.patientId!); + + result.fold( + (failure) async => await errorHandlerService.handleError( + failure: failure, + onOkPressed: () { + onError!(failure.message); + }, + ), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // _dialogService.showErrorBottomSheet(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + if (apiResponse.data != null) { + // Add current user as the first active family file + final currentUser = _appState.getAuthenticatedUser()!; + final currentUserFamilyFile = FamilyFileResponseModelLists( + patientId: currentUser.patientId, + patientName: '${currentUser.firstName!} ${currentUser.lastName!}', + isActive: true, + gender: currentUser.gender!, + responseId: currentUser.patientId, + age: currentUser.age, + mobileNumber: currentUser.mobileNumber, + patientIdenficationNumber: currentUser.patientIdentificationNo, + emaiLAddress: currentUser.emailAddress, + genderDescription: currentUser.genderDescription, + ); + + // Clear and start fresh with current user + patientFamilyFiles.clear(); + patientFamilyFiles.add(currentUserFamilyFile); + + final List activeFamilyFiles = []; + final List pendingFamilyFiles = []; + + for (var element in apiResponse.data!) { + if (element.status == null) { + continue; + } + + final isPending = element.status == FamilyFileEnum.pending.toInt || element.status == FamilyFileEnum.rejected.toInt; + final isActive = element.status == FamilyFileEnum.active.toInt; + + if (!isPending && !isActive) { + continue; + } + + final familyFile = FamilyFileResponseModelLists( + id: element.id, + patientId: element.patientId, + patientName: element.patientName!, + isActive: element.isActive, + gender: element.gender!, + responseId: element.responseId, + mobileNumber: element.mobileNumber, + age: element.age, + patientIdenficationNumber: element.patientIdenficationNumber, + relationship: element.relationship, + relationshipId: element.relationshipId, + relationshipN: element.relationshipN, + status: element.status, + statusDescription: element.statusDescription, + createdOn: element.createdOn, + editedOn: element.editedOn, + patientDataVerified: element.patientDataVerified, + regionId: element.regionId, + familyRegionId: element.familyRegionId, + genderDescription: element.genderDescription, + genderImage: element.genderImage, + emaiLAddress: element.emaiLAddress, + ); + + if (isPending) { + familyFile.isRequestFromMySide = true; + pendingFamilyFiles.add(familyFile); + } + if (isActive) { + activeFamilyFiles.add(familyFile); + } + } + + for (var activeFile in activeFamilyFiles) { + if (!patientFamilyFiles.any((e) => e.responseId == activeFile.responseId)) { + patientFamilyFiles.add(activeFile); + } + } + + this.pendingFamilyFiles.clear(); + this.pendingFamilyFiles.addAll(pendingFamilyFiles); + } + + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getAllPendingRecordsByResponseId() async { + AppState appState = getIt(); + final result = await medicalFileRepo.getAllPendingRecordsByResponseId(request: {'ResponseID': appState.getAuthenticatedUser()!.patientId ?? "0", "Status": 2}); + + result.fold( + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + log("Error in fetching pending family files: ${failure.message}"); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // _dialogService.showErrorBottomSheet(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + if (apiResponse.data != null) { + final List tempPendingFamilyFiles = []; + for (var element in apiResponse.data!) { + if (element.status != null && element.status == FamilyFileEnum.pending.toInt || element.status == FamilyFileEnum.active.toInt) { + tempPendingFamilyFiles.add(FamilyFileResponseModelLists( + id: element.id, + patientId: element.patientId, + patientName: element.patientName!, + isActive: element.status, + gender: element.gender, + responseId: element.patientId, + mobileNumber: element.mobileNumber, + age: element.age, + patientIdenficationNumber: element.patientIdenficationNumber, + relationship: element.relationship, + relationshipId: element.relationshipId, + relationshipN: element.relationshipN, + status: element.status, + statusDescription: element.statusDescription, + createdOn: element.createdOn, + editedOn: element.editedOn, + patientDataVerified: element.patientDataVerified, + regionId: element.regionId, + familyRegionId: element.familyRegionId, + genderDescription: element.genderDescription, + genderImage: element.genderImage, + emaiLAddress: element.emaiLAddress)); + } + } + // pendingFamilyFiles.addAll(tempPendingFamilyFiles.where((element) => !pendingFamilyFiles.any((e) => e.responseId == element.responseId))); + pendingFamilyFiles.addAll(tempPendingFamilyFiles.where((element) => !pendingFamilyFiles.any((e) => e.patientId == element.patientId))); + } + notifyListeners(); + } + }, + ); + } + + Future switchFamilyFiles({Function(dynamic)? onSuccess, int? responseID, int? patientID, String? phoneNumber, Function(String)? onError}) async { + authVM.phoneNumberController.text = phoneNumber!.startsWith("0") ? phoneNumber.replaceFirst("0", "") : phoneNumber; + + await authVM.checkActivationCode( + activationCode: '0000', + otpTypeEnum: OTPTypeEnum.sms, + onWrongActivationCode: (String? str) {}, + responseID: responseID, + isFormFamilyFile: false, + isSwitchUser: true, + patientID: patientID, + ); + } + + + + + Future addFamilyFile({required OTPTypeEnum otpTypeEnum}) async { + LoaderBottomSheet.showLoader(); + AuthenticationViewModel authVM = getIt.get(); + NavigationService navigationService = getIt.get(); + FamilyFileRequest request = + await RequestUtils.getAddFamilyRequest(nationalIDorFile: authVM.nationalIdController.text, mobileNo: authVM.phoneNumberController.text, countryCode: authVM.selectedCountrySignup.countryCode); + + final resultEither = await medicalFileRepo.addFamilyFile(request: request.toJson()); + resultEither.fold((failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) async { + if (apiResponse.messageStatus == 2) { + print("======="); + LoaderBottomSheet.hideLoader(); + _dialogService.showErrorBottomSheet( + message: apiResponse.errorMessage!, + onOkPressed: () { + navigationService.pop(); + }); + } else if (apiResponse.messageStatus == 1) { + if (apiResponse.data != null) { + request.isPatientExcluded = apiResponse.data["IsPatientExcluded"]; + request.responseID = apiResponse.data["ReponseID"]; + LoaderBottomSheet.hideLoader(); + _dialogService.showExceptionBottomSheet( + message: apiResponse.data["Message"], + onOkPressed: () { + navigationService.pop(); + authVM.sendActivationCode( + otpTypeEnum: otpTypeEnum, + nationalIdOrFileNumber: request.sharedPatientIdentificationId!, + phoneNumber: request.sharedPatientMobileNumber!, + isForRegister: false, + isExcludedUser: apiResponse.data['IsPatientExcluded'], + responseID: apiResponse.data["ReponseID"], + isNeedLoading: true, + isFormFamilyFile: true); + }, + onCancelPressed: () { + navigationService.pop(); + }); + } + } + }); + } + + Future handleFamilyFileRequestOTPVerification() async { + LoaderBottomSheet.showLoader(); + if (!_appState.getIsChildLoggedIn) { + await getFamilyFiles(status: 0); + await getAllPendingRecordsByResponseId(); + } + + LoaderBottomSheet.hideLoader(); + } + + Future removeFileFromFamilyMembers({int? id}) async { + NavigationService navigationService = getIt.get(); + _dialogService.showExceptionBottomSheet( + message: "Remove this member?", + onOkPressed: () async { + LoaderBottomSheet.showLoader(); + final result = await medicalFileRepo.removeFamilyFile(id: id); + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + LoaderBottomSheet.hideLoader(); + _dialogService.showErrorBottomSheet( + message: apiResponse.errorMessage!, + onOkPressed: () { + navigationService.pop(); + }); + } else if (apiResponse.messageStatus == 1) { + patientFamilyFiles.removeWhere((element) => element.id == id); + getFamilyFiles(); + getAllPendingRecordsByResponseId(); + LoaderBottomSheet.hideLoader(); + notifyListeners(); + navigationService.pop(); + } + }, + ); + }, + onCancelPressed: () { + navigationService.pop(); + }); + } + + Future getPatientMedicalReportAppointmentsList({Function(dynamic)? onSuccess, Function(String)? onError}) async { + patientMedicalReportAppointmentHistoryList.clear(); + notifyListeners(); + + final result = await medicalFileRepo.getPatientAppointmentsForMedicalReport(); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientMedicalReportAppointmentHistoryList = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future insertRequestForMedicalReport({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await medicalFileRepo.insertRequestForMedicalReport(appointmentHistoryResponseModel: patientMedicalReportSelectedAppointment!); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future acceptRejectFileFromFamilyMembers({int? id, int? status}) async { + NavigationService navigationService = getIt.get(); + LoaderBottomSheet.showLoader(); + final result = await medicalFileRepo.acceptRejectFamilyFile(id: id, status: status); + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + LoaderBottomSheet.hideLoader(); + // _dialogService.showErrorBottomSheet( + // message: apiResponse.errorMessage!, + // onOkPressed: () { + // navigationService.pop(); + // }); + } else if (apiResponse.messageStatus == 1) { + // FamilyFileResponseModelLists moveProfile = pendingFamilyFiles.firstWhere((element) => element.id == patientID); + // moveProfile.status = 3; + // moveProfile.statusDescription = "Approved"; + // patientFamilyFiles.add(moveProfile); + pendingFamilyFiles.removeWhere((element) => element.id == id); + //TODO: Call Api Here To Load Family Members + getFamilyFiles(status: 0); + getAllPendingRecordsByResponseId(); + LoaderBottomSheet.hideLoader(); + onFamilyFileTabChange(0); + } + }, + ); + } +} diff --git a/lib/features/medical_file/models/family_file_response_model.dart b/lib/features/medical_file/models/family_file_response_model.dart new file mode 100644 index 0000000..f4aa557 --- /dev/null +++ b/lib/features/medical_file/models/family_file_response_model.dart @@ -0,0 +1,112 @@ +import 'dart:convert'; + +class FamilyFileResponseModelLists { + int? id; + int? patientId; + int? responseId; + dynamic relationshipId; + dynamic relationship; + dynamic relationshipN; + int? regionId; + int? familyRegionId; + int? status; + dynamic isActive; + String? editedOn; + String? createdOn; + int? age; + String? emaiLAddress; + int? gender; + String? genderDescription; + String? genderImage; + String? mobileNumber; + int? patientDataVerified; + String? patientIdenficationNumber; + String? patientName; + String? statusDescription; + bool? isSuperUser = false; + bool? isRequestFromMySide; + + FamilyFileResponseModelLists( + {this.id, + this.patientId, + this.responseId, + this.relationshipId, + this.relationship, + this.relationshipN, + this.regionId, + this.familyRegionId, + this.status, + this.isActive, + this.editedOn, + this.createdOn, + this.age, + this.emaiLAddress, + this.gender, + this.genderDescription, + this.genderImage, + this.mobileNumber, + this.patientDataVerified, + this.patientIdenficationNumber, + this.patientName, + this.statusDescription, + this.isSuperUser, + this.isRequestFromMySide}); + + factory FamilyFileResponseModelLists.fromRawJson(String str) => FamilyFileResponseModelLists.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory FamilyFileResponseModelLists.fromJson(Map json) => FamilyFileResponseModelLists( + id: json["ID"], + patientId: json["PatientID"], + responseId: json["ResponseID"], + relationshipId: json["RelationshipID"], + relationship: json["Relationship"], + relationshipN: json["RelationshipN"], + regionId: json["RegionID"], + familyRegionId: json["FamilyRegionID"], + status: json["Status"], + isActive: json["IsActive"], + editedOn: json["EditedOn"], + createdOn: json["CreatedOn"], + age: json["Age"], + emaiLAddress: json["EmaiLAddress"], + gender: json["Gender"], + genderDescription: json["GenderDescription"], + genderImage: json["GenderImage"], + mobileNumber: json["MobileNumber"], + patientDataVerified: json["PatientDataVerified"], + patientIdenficationNumber: json["PatientIdenficationNumber"], + patientName: json["PatientName"], + statusDescription: json["StatusDescription"], + isSuperUser: json["isSuperUser"] ?? false, + isRequestFromMySide: json["isRequestFromMySide"] ?? false, + ); + + Map toJson() => { + "ID": id, + "PatientID": patientId, + "ResponseID": responseId, + "RelationshipID": relationshipId, + "Relationship": relationship, + "RelationshipN": relationshipN, + "RegionID": regionId, + "FamilyRegionID": familyRegionId, + "Status": status, + "IsActive": isActive, + "EditedOn": editedOn, + "CreatedOn": createdOn, + "Age": age, + "EmaiLAddress": emaiLAddress, + "Gender": gender, + "GenderDescription": genderDescription, + "GenderImage": genderImage, + "MobileNumber": mobileNumber, + "PatientDataVerified": patientDataVerified, + "PatientIdenficationNumber": patientIdenficationNumber, + "PatientName": patientName, + "StatusDescription": statusDescription, + "isSuperUser": isSuperUser, + "isRequestFromMySide": isRequestFromMySide, + }; +} diff --git a/lib/features/medical_file/models/patient_medical_response_model.dart b/lib/features/medical_file/models/patient_medical_response_model.dart new file mode 100644 index 0000000..52785af --- /dev/null +++ b/lib/features/medical_file/models/patient_medical_response_model.dart @@ -0,0 +1,192 @@ +class PatientMedicalReportResponseModel { + int? status; + String? encounterDate; + int? projectID; + int? invoiceNo; + int? encounterNo; + String? procedureId; + int? requestType; + String? setupId; + int? patientID; + int? doctorID; + int? clinicID; + String? requestDate; + bool? isRead; + dynamic isReadOn; + num? actualDoctorRate; + String? admissionDate; + int? admissionNumber; + String? appointmentDate; + int? appointmentNO; + String? appointmentTime; + String? clinicDescription; + dynamic clinicDescriptionN; + num? decimalDoctorRate; + String? docName; + dynamic docNameN; + String? doctorImageURL; + String? doctorName; + dynamic doctorNameN; + num? doctorRate; + num? doctorStarsRate; + int? invoiceNoVP; + dynamic invoiceType; + bool? isDoctorAllowVedioCall; + bool? isExecludeDoctor; + bool? isInOutPatient; + String? isInOutPatientDescription; + String? isInOutPatientDescriptionN; + int? noOfPatientsRate; + String? projectName; + dynamic projectNameN; + int? sourceID; + dynamic sourceName; + dynamic sourceNameN; + String? statusDesc; + dynamic strAppointmentDate; + + PatientMedicalReportResponseModel( + {this.status, + this.encounterDate, + this.projectID, + this.invoiceNo, + this.encounterNo, + this.procedureId, + this.requestType, + this.setupId, + this.patientID, + this.doctorID, + this.clinicID, + this.requestDate, + this.isRead, + this.isReadOn, + this.actualDoctorRate, + this.admissionDate, + this.admissionNumber, + this.appointmentDate, + this.appointmentNO, + this.appointmentTime, + this.clinicDescription, + this.clinicDescriptionN, + this.decimalDoctorRate, + this.docName, + this.docNameN, + this.doctorImageURL, + this.doctorName, + this.doctorNameN, + this.doctorRate, + this.doctorStarsRate, + this.invoiceNoVP, + this.invoiceType, + this.isDoctorAllowVedioCall, + this.isExecludeDoctor, + this.isInOutPatient, + this.isInOutPatientDescription, + this.isInOutPatientDescriptionN, + this.noOfPatientsRate, + this.projectName, + this.projectNameN, + this.sourceID, + this.sourceName, + this.sourceNameN, + this.statusDesc, + this.strAppointmentDate}); + + PatientMedicalReportResponseModel.fromJson(Map json) { + status = json['Status']; + encounterDate = json['EncounterDate']; + projectID = json['ProjectID']; + invoiceNo = json['InvoiceNo']; + encounterNo = json['EncounterNo']; + procedureId = json['ProcedureId']; + requestType = json['RequestType']; + setupId = json['SetupId']; + patientID = json['PatientID']; + doctorID = json['DoctorID']; + clinicID = json['ClinicID']; + requestDate = json['RequestDate']; + isRead = json['IsRead']; + isReadOn = json['IsReadOn']; + actualDoctorRate = json['ActualDoctorRate']; + admissionDate = json['AdmissionDate']; + admissionNumber = json['AdmissionNumber']; + appointmentDate = json['AppointmentDate']; + appointmentNO = json['AppointmentNO']; + appointmentTime = json['AppointmentTime']; + clinicDescription = json['ClinicDescription']; + clinicDescriptionN = json['ClinicDescriptionN']; + decimalDoctorRate = json['DecimalDoctorRate']; + docName = json['DocName']; + docNameN = json['DocNameN']; + doctorImageURL = json['DoctorImageURL']; + doctorName = json['DoctorName']; + doctorNameN = json['DoctorNameN']; + doctorRate = json['DoctorRate']; + doctorStarsRate = json['DoctorStarsRate']; + invoiceNoVP = json['InvoiceNo_VP']; + invoiceType = json['InvoiceType']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isExecludeDoctor = json['IsExecludeDoctor']; + isInOutPatient = json['IsInOutPatient']; + isInOutPatientDescription = json['IsInOutPatientDescription']; + isInOutPatientDescriptionN = json['IsInOutPatientDescriptionN']; + noOfPatientsRate = json['NoOfPatientsRate']; + projectName = json['ProjectName']; + projectNameN = json['ProjectNameN']; + sourceID = json['SourceID']; + sourceName = json['SourceName']; + sourceNameN = json['SourceNameN']; + statusDesc = json['StatusDesc']; + strAppointmentDate = json['StrAppointmentDate']; + } + + Map toJson() { + final Map data = new Map(); + data['Status'] = this.status; + data['EncounterDate'] = this.encounterDate; + data['ProjectID'] = this.projectID; + data['InvoiceNo'] = this.invoiceNo; + data['EncounterNo'] = this.encounterNo; + data['ProcedureId'] = this.procedureId; + data['RequestType'] = this.requestType; + data['SetupId'] = this.setupId; + data['PatientID'] = this.patientID; + data['DoctorID'] = this.doctorID; + data['ClinicID'] = this.clinicID; + data['RequestDate'] = this.requestDate; + data['IsRead'] = this.isRead; + data['IsReadOn'] = this.isReadOn; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['AdmissionDate'] = this.admissionDate; + data['AdmissionNumber'] = this.admissionNumber; + data['AppointmentDate'] = this.appointmentDate; + data['AppointmentNO'] = this.appointmentNO; + data['AppointmentTime'] = this.appointmentTime; + data['ClinicDescription'] = this.clinicDescription; + data['ClinicDescriptionN'] = this.clinicDescriptionN; + data['DecimalDoctorRate'] = this.decimalDoctorRate; + data['DocName'] = this.docName; + data['DocNameN'] = this.docNameN; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorName'] = this.doctorName; + data['DoctorNameN'] = this.doctorNameN; + data['DoctorRate'] = this.doctorRate; + data['DoctorStarsRate'] = this.doctorStarsRate; + data['InvoiceNo_VP'] = this.invoiceNoVP; + data['InvoiceType'] = this.invoiceType; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['IsInOutPatient'] = this.isInOutPatient; + data['IsInOutPatientDescription'] = this.isInOutPatientDescription; + data['IsInOutPatientDescriptionN'] = this.isInOutPatientDescriptionN; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['ProjectName'] = this.projectName; + data['ProjectNameN'] = this.projectNameN; + data['SourceID'] = this.sourceID; + data['SourceName'] = this.sourceName; + data['SourceNameN'] = this.sourceNameN; + data['StatusDesc'] = this.statusDesc; + data['StrAppointmentDate'] = this.strAppointmentDate; + return data; + } +} diff --git a/lib/features/medical_file/models/patient_sickleave_response_model.dart b/lib/features/medical_file/models/patient_sickleave_response_model.dart new file mode 100644 index 0000000..3bf732c --- /dev/null +++ b/lib/features/medical_file/models/patient_sickleave_response_model.dart @@ -0,0 +1,176 @@ +class PatientSickLeavesResponseModel { + String? setupID; + int? projectID; + int? patientID; + int? patientType; + int? clinicID; + int? doctorID; + int? requestNo; + String? requestDate; + int? sickLeaveDays; + int? appointmentNo; + int? admissionNo; + dynamic reportDate; + num? actualDoctorRate; + String? appointmentDate; + String? clinicName; + num? decimalDoctorRate; + String? doctorImageURL; + String? doctorName; + num? doctorRate; + num? doctorStarsRate; + String? doctorTitle; + int? employeeID; + String? endDate; + int? gender; + String? genderDescription; + bool? isActiveDoctorProfile; + bool? isDoctorAllowVedioCall; + bool? isExecludeDoctor; + bool? isInOutPatient; + String? isInOutPatientDescription; + String? isInOutPatientDescriptionN; + bool? isLiveCareAppointment; + dynamic medicalDirectorApprovedStatus; + num? noOfPatientsRate; + dynamic patientName; + String? projectName; + String? qR; + List? speciality; + String? startDate; + int? status; + String? strRequestDate; + + PatientSickLeavesResponseModel( + {this.setupID, + this.projectID, + this.patientID, + this.patientType, + this.clinicID, + this.doctorID, + this.requestNo, + this.requestDate, + this.sickLeaveDays, + this.appointmentNo, + this.admissionNo, + this.reportDate, + this.actualDoctorRate, + this.appointmentDate, + this.clinicName, + this.decimalDoctorRate, + this.doctorImageURL, + this.doctorName, + this.doctorRate, + this.doctorStarsRate, + this.doctorTitle, + this.employeeID, + this.endDate, + this.gender, + this.genderDescription, + this.isActiveDoctorProfile, + this.isDoctorAllowVedioCall, + this.isExecludeDoctor, + this.isInOutPatient, + this.isInOutPatientDescription, + this.isInOutPatientDescriptionN, + this.isLiveCareAppointment, + this.medicalDirectorApprovedStatus, + this.noOfPatientsRate, + this.patientName, + this.projectName, + this.qR, + this.speciality, + this.startDate, + this.status, + this.strRequestDate}); + + PatientSickLeavesResponseModel.fromJson(Map json) { + setupID = json['SetupID']; + projectID = json['ProjectID']; + patientID = json['PatientID']; + patientType = json['PatientType']; + clinicID = json['ClinicID']; + doctorID = json['DoctorID']; + requestNo = json['RequestNo']; + requestDate = json['RequestDate']; + sickLeaveDays = json['SickLeaveDays']; + appointmentNo = json['AppointmentNo']; + admissionNo = json['AdmissionNo']; + reportDate = json['ReportDate']; + actualDoctorRate = json['ActualDoctorRate']; + appointmentDate = json['AppointmentDate']; + clinicName = json['ClinicName']; + decimalDoctorRate = json['DecimalDoctorRate']; + doctorImageURL = json['DoctorImageURL']; + doctorName = json['DoctorName']; + doctorRate = json['DoctorRate']; + doctorStarsRate = json['DoctorStarsRate']; + doctorTitle = json['DoctorTitle']; + employeeID = json['EmployeeID']; + endDate = json['EndDate']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + isActiveDoctorProfile = json['IsActiveDoctorProfile']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isExecludeDoctor = json['IsExecludeDoctor']; + isInOutPatient = json['IsInOutPatient']; + isInOutPatientDescription = json['IsInOutPatientDescription']; + isInOutPatientDescriptionN = json['IsInOutPatientDescriptionN']; + isLiveCareAppointment = json['IsLiveCareAppointment']; + medicalDirectorApprovedStatus = json['MedicalDirectorApprovedStatus']; + noOfPatientsRate = json['NoOfPatientsRate']; + patientName = json['PatientName']; + projectName = json['ProjectName']; + qR = json['QR']; + speciality = json['Speciality'].cast(); + startDate = json['StartDate']; + status = json['Status']; + strRequestDate = json['StrRequestDate']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['PatientID'] = this.patientID; + data['PatientType'] = this.patientType; + data['ClinicID'] = this.clinicID; + data['DoctorID'] = this.doctorID; + data['RequestNo'] = this.requestNo; + data['RequestDate'] = this.requestDate; + data['SickLeaveDays'] = this.sickLeaveDays; + data['AppointmentNo'] = this.appointmentNo; + data['AdmissionNo'] = this.admissionNo; + data['ReportDate'] = this.reportDate; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['AppointmentDate'] = this.appointmentDate; + data['ClinicName'] = this.clinicName; + data['DecimalDoctorRate'] = this.decimalDoctorRate; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorName'] = this.doctorName; + data['DoctorRate'] = this.doctorRate; + data['DoctorStarsRate'] = this.doctorStarsRate; + data['DoctorTitle'] = this.doctorTitle; + data['EmployeeID'] = this.employeeID; + data['EndDate'] = this.endDate; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['IsInOutPatient'] = this.isInOutPatient; + data['IsInOutPatientDescription'] = this.isInOutPatientDescription; + data['IsInOutPatientDescriptionN'] = this.isInOutPatientDescriptionN; + data['IsLiveCareAppointment'] = this.isLiveCareAppointment; + data['MedicalDirectorApprovedStatus'] = this.medicalDirectorApprovedStatus; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['PatientName'] = this.patientName; + data['ProjectName'] = this.projectName; + data['QR'] = this.qR; + data['Speciality'] = this.speciality; + data['StartDate'] = this.startDate; + data['Status'] = this.status; + data['StrRequestDate'] = this.strRequestDate; + return data; + } +} diff --git a/lib/features/medical_file/models/patient_vaccine_response_model.dart b/lib/features/medical_file/models/patient_vaccine_response_model.dart new file mode 100644 index 0000000..ff27b06 --- /dev/null +++ b/lib/features/medical_file/models/patient_vaccine_response_model.dart @@ -0,0 +1,160 @@ +class PatientVaccineResponseModel { + String? setupID; + int? projectID; + int? patientID; + int? invoiceNo; + String? procedureID; + String? vaccineName; + Null? vaccineNameN; + String? invoiceDate; + int? doctorID; + int? clinicID; + String? firstName; + String? middleName; + String? lastName; + Null? firstNameN; + Null? middleNameN; + Null? lastNameN; + String? dateofBirth; + int? actualDoctorRate; + String? age; + String? clinicName; + Null? decimalDoctorRate; + Null? doctorImageURL; + String? doctorName; + int? doctorRate; + int? doctorStarsRate; + String? doctorTitle; + int? gender; + Null? genderDescription; + Null? invoiceNoVP; + bool? isActiveDoctorProfile; + bool? isDoctorAllowVedioCall; + bool? isExecludeDoctor; + int? noOfPatientsRate; + String? patientName; + String? projectName; + String? qR; + String? vaccinationDate; + + PatientVaccineResponseModel( + {this.setupID, + this.projectID, + this.patientID, + this.invoiceNo, + this.procedureID, + this.vaccineName, + this.vaccineNameN, + this.invoiceDate, + this.doctorID, + this.clinicID, + this.firstName, + this.middleName, + this.lastName, + this.firstNameN, + this.middleNameN, + this.lastNameN, + this.dateofBirth, + this.actualDoctorRate, + this.age, + this.clinicName, + this.decimalDoctorRate, + this.doctorImageURL, + this.doctorName, + this.doctorRate, + this.doctorStarsRate, + this.doctorTitle, + this.gender, + this.genderDescription, + this.invoiceNoVP, + this.isActiveDoctorProfile, + this.isDoctorAllowVedioCall, + this.isExecludeDoctor, + this.noOfPatientsRate, + this.patientName, + this.projectName, + this.qR, + this.vaccinationDate}); + + PatientVaccineResponseModel.fromJson(Map json) { + setupID = json['SetupID']; + projectID = json['ProjectID']; + patientID = json['PatientID']; + invoiceNo = json['InvoiceNo']; + procedureID = json['ProcedureID']; + vaccineName = json['VaccineName']; + vaccineNameN = json['VaccineNameN']; + invoiceDate = json['InvoiceDate']; + doctorID = json['DoctorID']; + clinicID = json['ClinicID']; + firstName = json['FirstName']; + middleName = json['MiddleName']; + lastName = json['LastName']; + firstNameN = json['FirstNameN']; + middleNameN = json['MiddleNameN']; + lastNameN = json['LastNameN']; + dateofBirth = json['DateofBirth']; + actualDoctorRate = json['ActualDoctorRate']; + age = json['Age']; + clinicName = json['ClinicName']; + decimalDoctorRate = json['DecimalDoctorRate']; + doctorImageURL = json['DoctorImageURL']; + doctorName = json['DoctorName']; + doctorRate = json['DoctorRate']; + doctorStarsRate = json['DoctorStarsRate']; + doctorTitle = json['DoctorTitle']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + invoiceNoVP = json['InvoiceNo_VP']; + isActiveDoctorProfile = json['IsActiveDoctorProfile']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isExecludeDoctor = json['IsExecludeDoctor']; + noOfPatientsRate = json['NoOfPatientsRate']; + patientName = json['PatientName']; + projectName = json['ProjectName']; + qR = json['QR']; + vaccinationDate = json['VaccinationDate']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['PatientID'] = this.patientID; + data['InvoiceNo'] = this.invoiceNo; + data['ProcedureID'] = this.procedureID; + data['VaccineName'] = this.vaccineName; + data['VaccineNameN'] = this.vaccineNameN; + data['InvoiceDate'] = this.invoiceDate; + data['DoctorID'] = this.doctorID; + data['ClinicID'] = this.clinicID; + data['FirstName'] = this.firstName; + data['MiddleName'] = this.middleName; + data['LastName'] = this.lastName; + data['FirstNameN'] = this.firstNameN; + data['MiddleNameN'] = this.middleNameN; + data['LastNameN'] = this.lastNameN; + data['DateofBirth'] = this.dateofBirth; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['Age'] = this.age; + data['ClinicName'] = this.clinicName; + data['DecimalDoctorRate'] = this.decimalDoctorRate; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorName'] = this.doctorName; + data['DoctorRate'] = this.doctorRate; + data['DoctorStarsRate'] = this.doctorStarsRate; + data['DoctorTitle'] = this.doctorTitle; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['InvoiceNo_VP'] = this.invoiceNoVP; + data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['PatientName'] = this.patientName; + data['ProjectName'] = this.projectName; + data['QR'] = this.qR; + data['VaccinationDate'] = this.vaccinationDate; + return data; + } +} diff --git a/lib/features/my_appointments/appointment_via_region_viewmodel.dart b/lib/features/my_appointments/appointment_via_region_viewmodel.dart new file mode 100644 index 0000000..6c6354a --- /dev/null +++ b/lib/features/my_appointments/appointment_via_region_viewmodel.dart @@ -0,0 +1,133 @@ +import 'package:flutter/foundation.dart' show ChangeNotifier; +import 'package:hmg_patient_app_new/core/app_state.dart' show AppState; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/dental_chief_complaints_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/laser/laser_appointment.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/select_clinic_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/select_doctor_page.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; + +enum AppointmentViaRegionState { + REGION_SELECTION, + TYPE_SELECTION, + HOSPITAL_SELECTION, + CLINIC_SELECTION, + DOCTOR_SELECTION +} + +enum RegionBottomSheetType{ + FOR_REGION, + REGION_FOR_DENTAL_AND_LASER, + FOR_CLINIIC, +} + +class AppointmentViaRegionViewmodel extends ChangeNotifier { + String? selectedRegionId; + String? selectedFacilityType; + PatientDoctorAppointmentList? selectedHospital; + final NavigationService navigationService; + AppointmentViaRegionState bottomSheetState = + AppointmentViaRegionState.REGION_SELECTION; + final AppState appState; + + RegionBottomSheetType regionBottomSheetType = RegionBottomSheetType.FOR_REGION; + + AppointmentViaRegionViewmodel({required this.navigationService,required this.appState}); + + void setSelectedRegionId(String? regionId) { + selectedRegionId = regionId; + notifyListeners(); + } + + void setFacility(String? facility) { + selectedFacilityType = facility; + notifyListeners(); + } + + void setBottomSheetType(RegionBottomSheetType type) { + regionBottomSheetType = type; + notifyListeners(); + } + + void setBottomSheetState(AppointmentViaRegionState state) { + bottomSheetState = state; + notifyListeners(); + } + + void handleLastStepForRegion(){ + navigationService.pop(); + navigationService.push(CustomPageRoute( + page: SelectClinicPage(isFromRegionFlow: true,), + ),); + } + + void handleBackPress() { + switch (bottomSheetState) { + case AppointmentViaRegionState.REGION_SELECTION: + break; + case AppointmentViaRegionState.TYPE_SELECTION: + setBottomSheetState(AppointmentViaRegionState.REGION_SELECTION); + setSelectedRegionId(null); + break; + case AppointmentViaRegionState.HOSPITAL_SELECTION: + setBottomSheetState(AppointmentViaRegionState.TYPE_SELECTION); + break; + default: + } + } + + void flush() { + setSelectedRegionId(null); + setFacility(null); + setBottomSheetType(RegionBottomSheetType.FOR_REGION); + setBottomSheetState(AppointmentViaRegionState.REGION_SELECTION); + } + + void setHospitalModel(PatientDoctorAppointmentList? hospital) { + selectedHospital = hospital; + } + + bool get isArabic => appState.isArabic(); + + void handleLastStepForClinic() { + navigationService.pop(); + navigationService.push(CustomPageRoute( + page: SelectDoctorPage(), + ),); + } + + void handleLastStepForClinicForDentalAndLaser(int clinicId) { + navigationService.pop(); + + if (clinicId == 17) { + if (!appState.isAuthenticated) { + navigationService.push( + CustomPageRoute( + page: DentalChiefComplaintsPage(), + ), + ); + } + } + if (clinicId == 253) { + { + navigationService.push( + CustomPageRoute( + page: LaserAppointment(), + ), + ); + } + } + } + + void handleLastStepForDentalAndLaser() { + //todo handle the routing here + navigationService.pop(); + navigationService.push( + CustomPageRoute( + page: SelectDoctorPage(), + ), + ); + } +} diff --git a/lib/features/my_appointments/models/appointemnet_filters.dart b/lib/features/my_appointments/models/appointemnet_filters.dart new file mode 100644 index 0000000..e157af4 --- /dev/null +++ b/lib/features/my_appointments/models/appointemnet_filters.dart @@ -0,0 +1,17 @@ +import 'package:hmg_patient_app_new/core/app_assets.dart'; + +enum AppointmentListingFilters{ + WALKIN("walkin", AppAssets.walkin_appointment_icon), + BOOKED("booked", AppAssets.calendar), + CONFIRMED("confirmed", AppAssets.calendar), + ARRIVED("arrived", AppAssets.calendar), + LIVECARE("livecare", AppAssets.small_livecare_icon), + DATESELECTION("",AppAssets.calendar, trailingIcon: AppAssets.arrow_down); + + final String labelText; + final String leadingIcon; + final String trailingIcon; + + const AppointmentListingFilters(this.labelText, this.leadingIcon, + {this.trailingIcon = ""}); +} \ No newline at end of file diff --git a/lib/features/my_appointments/models/facility_selection.dart b/lib/features/my_appointments/models/facility_selection.dart new file mode 100644 index 0000000..b1f12de --- /dev/null +++ b/lib/features/my_appointments/models/facility_selection.dart @@ -0,0 +1,8 @@ +enum FacilitySelection{ +ALL('ALL'), +HMG('hmg'), +HMC('hmc'); + +final String value; +const FacilitySelection(this.value); +} \ No newline at end of file diff --git a/lib/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart b/lib/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart new file mode 100644 index 0000000..3b53214 --- /dev/null +++ b/lib/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart @@ -0,0 +1,92 @@ +class AskDocRequestType { + String? setupID; + int? parameterGroup; + int? parameterType; + int? parameterCode; + String? description; + String? descriptionN; + String? alias; + String? aliasN; + String? prefix; + String? suffix; + String? isColorCodingRequired; + String? backColor; + String? foreColor; + bool? isBuiltIn; + bool? isActive; + int? createdBy; + String? createdOn; + String? editedBy; + String? editedOn; + String? rowVer; + + AskDocRequestType( + {this.setupID, + this.parameterGroup, + this.parameterType, + this.parameterCode, + this.description, + this.descriptionN, + this.alias, + this.aliasN, + this.prefix, + this.suffix, + this.isColorCodingRequired, + this.backColor, + this.foreColor, + this.isBuiltIn, + this.isActive, + this.createdBy, + this.createdOn, + this.editedBy, + this.editedOn, + this.rowVer}); + + AskDocRequestType.fromJson(Map json) { + setupID = json['SetupID']; + parameterGroup = json['ParameterGroup']; + parameterType = json['ParameterType']; + parameterCode = json['ParameterCode']; + description = json['Description']; + descriptionN = json['DescriptionN']; + alias = json['Alias']; + aliasN = json['AliasN']; + prefix = json['Prefix']; + suffix = json['Suffix']; + isColorCodingRequired = json['IsColorCodingRequired']; + backColor = json['BackColor']; + foreColor = json['ForeColor']; + isBuiltIn = json['IsBuiltIn']; + isActive = json['IsActive']; + createdBy = json['CreatedBy']; + createdOn = json['CreatedOn']; + editedBy = json['EditedBy']; + editedOn = json['EditedOn']; + rowVer = json['RowVer']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ParameterGroup'] = this.parameterGroup; + data['ParameterType'] = this.parameterType; + data['ParameterCode'] = this.parameterCode; + data['Description'] = this.description; + data['DescriptionN'] = this.descriptionN; + data['Alias'] = this.alias; + data['AliasN'] = this.aliasN; + data['Prefix'] = this.prefix; + data['Suffix'] = this.suffix; + data['IsColorCodingRequired'] = this.isColorCodingRequired; + data['BackColor'] = this.backColor; + data['ForeColor'] = this.foreColor; + data['IsBuiltIn'] = this.isBuiltIn; + data['IsActive'] = this.isActive; + data['CreatedBy'] = this.createdBy; + data['CreatedOn'] = this.createdOn; + data['EditedBy'] = this.editedBy; + data['EditedOn'] = this.editedOn; + data['RowVer'] = this.rowVer; + return data; + } +} diff --git a/lib/features/my_appointments/models/resp_models/doctor_list_api_response.dart b/lib/features/my_appointments/models/resp_models/doctor_list_api_response.dart new file mode 100644 index 0000000..c2b9add --- /dev/null +++ b/lib/features/my_appointments/models/resp_models/doctor_list_api_response.dart @@ -0,0 +1,275 @@ + +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart' show HospitalsModel; + +class DoctorList { + int? clinicID; + dynamic appointmentNo; + String? clinicName; + String? doctorTitle; + num? iD; + String? name; + int? projectID; + String? projectName; + int? actualDoctorRate; + num? clinicRoomNo; + dynamic date; + dynamic appointmentDate; + dynamic dayName; + int? doctorID; + String? doctorImageURL; + dynamic doctorProfile; + dynamic doctorProfileInfo; + int? doctorRate; + num? gender; + String? genderDescription; + bool? isAppointmentAllowed; + bool? isDoctorAllowVedioCall; + bool? isDoctorDummy; + bool? isLiveCare; + bool? isLiveCareClinic; + bool? isDoctorHasPrePostImages; + String? latitude; + String? longitude; + String? nationalityFlagURL; + String? nationalityID; + String? nationalityName; + dynamic nearestFreeSlot; + int? noOfPatientsRate; + num? originalClinicID; + num? personRate; + dynamic projectDistanceInKiloMeters; + String? qR; + dynamic qRString; + num? rateNumber; + dynamic serviceID; + String? setupID; + List? speciality; + List? specialityN; + dynamic workingHours; + dynamic decimalDoctorRate; + String? projectBottomName; + String? projectTopName; + bool? isHMC; + String? region; + String? regionArabic; + String? regionEnglish; + String? regionID; + + DoctorList( + {this.clinicID, + this.appointmentNo, + this.clinicName, + this.doctorTitle, + this.iD, + this.name, + this.projectID, + this.projectName, + this.actualDoctorRate, + this.clinicRoomNo, + this.date, + this.appointmentDate, + this.dayName, + this.doctorID, + this.doctorImageURL, + this.doctorProfile, + this.doctorProfileInfo, + this.doctorRate, + this.gender, + this.genderDescription, + this.isAppointmentAllowed, + this.isDoctorAllowVedioCall, + this.isDoctorDummy, + this.isLiveCare, + this.isLiveCareClinic, + this.isDoctorHasPrePostImages, + this.latitude, + this.longitude, + this.nationalityFlagURL, + this.nationalityID, + this.nationalityName, + this.nearestFreeSlot, + this.noOfPatientsRate, + this.originalClinicID, + this.personRate, + this.projectDistanceInKiloMeters, + this.qR, + this.qRString, + this.rateNumber, + this.serviceID, + this.setupID, + this.speciality, + this.specialityN, + this.workingHours, + this.decimalDoctorRate, + this.projectBottomName, + this.projectTopName, + this.isHMC, + this.region, + this.regionArabic, + this.regionEnglish, + this.regionID, + }); + + DoctorList.fromJson( + Map json, + ) { + clinicID = json['ClinicID']; + appointmentNo = json['AppointmentNo']; + clinicName = json['ClinicName']; + doctorTitle = json['DoctorTitle']; + iD = json['ID']; + name = json['DoctorName'] ?? json['Name']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + actualDoctorRate = json['ActualDoctorRate']; + clinicRoomNo = json['ClinicRoomNo']; + date = json['Date']; + appointmentDate = json['AppointmentDate']; + dayName = json['DayName']; + doctorID = json['DoctorID']; + doctorImageURL = json['DoctorImageURL']; + doctorProfile = json['DoctorProfile']; + doctorProfileInfo = json['DoctorProfileInfo']; + doctorRate = json['DoctorRate']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + isAppointmentAllowed = json['IsAppointmentAllowed']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isDoctorDummy = json['IsDoctorDummy']; + isLiveCare = json['IsLiveCare']; + isLiveCareClinic = json['IsLiveCareClinic']; + isDoctorHasPrePostImages = json['IsDoctorHasPrePostImages']; + latitude = json['Latitude']; + longitude = json['Longitude']; + nationalityFlagURL = json['NationalityFlagURL']; + nationalityID = json['NationalityID']; + nationalityName = json['NationalityName']; + nearestFreeSlot = json['NearestFreeSlot']; + noOfPatientsRate = json['NoOfPatientsRate']; + originalClinicID = json['OriginalClinicID']; + personRate = json['PersonRate']; + projectDistanceInKiloMeters = json['ProjectDistanceInKiloMeters']; + qR = json['QR']; + qRString = json['QRString']; + rateNumber = json['RateNumber']; + serviceID = json['ServiceID']; + setupID = json['SetupID']; + if (json.containsKey('Speciality') && json['Speciality'] != null) speciality = json['Speciality'].cast(); + if (json.containsKey('SpecialityN') && json['SpecialityN'] != null) specialityN = json['SpecialityN'].cast(); + workingHours = json['WorkingHours']; + decimalDoctorRate = json['DecimalDoctorRate']; + projectBottomName = json['ProjectNameBottom']; + projectTopName = json['ProjectNameTop']; + this.isHMC = json["IsHMC"]; + this.regionArabic = json['RegionNameN']; + this.regionEnglish = json['RegionName']; + } + + String? getRegionName(bool isArabic) { + if (isArabic) { + return regionArabic; + } + return regionEnglish; + } + + Map toJson() { + final Map data = new Map(); + data['ClinicID'] = this.clinicID; + data['AppointmentNo'] = this.appointmentNo; + data['ClinicName'] = this.clinicName; + data['DoctorTitle'] = this.doctorTitle; + data['ID'] = this.iD; + data['Name'] = this.name; + data['ProjectID'] = this.projectID; + data['ProjectName'] = this.projectName; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['ClinicRoomNo'] = this.clinicRoomNo; + data['Date'] = this.date; + data['DayName'] = this.dayName; + data['DoctorID'] = this.doctorID; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorProfile'] = this.doctorProfile; + data['DoctorProfileInfo'] = this.doctorProfileInfo; + data['DoctorRate'] = this.doctorRate; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['IsAppointmentAllowed'] = this.isAppointmentAllowed; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsDoctorDummy'] = this.isDoctorDummy; + data['IsLiveCare'] = this.isLiveCare; + data['IsLiveCareClinic'] = this.isLiveCareClinic; + data['IsDoctorHasPrePostImages'] = this.isDoctorHasPrePostImages; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['NationalityFlagURL'] = this.nationalityFlagURL; + data['NationalityID'] = this.nationalityID; + data['NationalityName'] = this.nationalityName; + data['NearestFreeSlot'] = this.nearestFreeSlot; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['OriginalClinicID'] = this.originalClinicID; + data['PersonRate'] = this.personRate; + data['ProjectDistanceInKiloMeters'] = this.projectDistanceInKiloMeters; + data['QR'] = this.qR; + data['QRString'] = this.qRString; + data['RateNumber'] = this.rateNumber; + data['ServiceID'] = this.serviceID; + data['SetupID'] = this.setupID; + data['Speciality'] = this.speciality; + data['SpecialityN'] = this.specialityN; + data['WorkingHours'] = this.workingHours; + data['DecimalDoctorRate'] = this.decimalDoctorRate; + return data; + } + + String getProjectCompleteName(){ + return "${this.projectTopName} ${this.projectBottomName}"; + } + + String getProjectCompleteNameWithLocale({bool isArabic = false}) { + if (isArabic) { + return "${this.projectBottomName} ${this.projectTopName}"; + } + return "${this.projectTopName} ${this.projectBottomName}"; + } +} + +class PatientDoctorAppointmentList { + String? filterName = ""; + String? distanceInKMs = ""; + List? patientDoctorAppointmentList = []; + String? projectTopName = ""; + String? projectBottomName = ""; + bool? isHMC; + List hospitalList = []; + + PatientDoctorAppointmentList( + {this.filterName, + this.distanceInKMs, + this.projectTopName, + this.projectBottomName, + DoctorsListResponseModel? patientDoctorAppointment, + HospitalsModel? model, + this.isHMC = false}) { + if (model != null) { + hospitalList.add(model); + } + if (patientDoctorAppointment != null) { + patientDoctorAppointmentList!.add(patientDoctorAppointment!); + } + } +} + +class PatientDoctorAppointmentListByRegion { + List? hmgDoctorList = []; + List? hmcDoctorList = []; + int hmcSize = 0; + int hmgSize = 0; + num distance = double.infinity; + num hmgDistance = double.infinity; + num hmcDistance = double.infinity; +} + +class RegionList { + Map? registeredDoctorMap = {}; +} \ No newline at end of file diff --git a/lib/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart b/lib/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart new file mode 100644 index 0000000..59ad707 --- /dev/null +++ b/lib/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart @@ -0,0 +1,83 @@ +class GetTamaraInstallmentsDetailsResponseModel { + String? name; + String? description; + MinLimit? minLimit; + MinLimit? maxLimit; + List? supportedInstalments; + + GetTamaraInstallmentsDetailsResponseModel({this.name, this.description, this.minLimit, this.maxLimit, this.supportedInstalments}); + + GetTamaraInstallmentsDetailsResponseModel.fromJson(Map json) { + name = json['name']; + description = json['description']; + minLimit = json['minLimit'] != null ? new MinLimit.fromJson(json['minLimit']) : null; + maxLimit = json['maxLimit'] != null ? new MinLimit.fromJson(json['maxLimit']) : null; + if (json['supportedInstalments'] != null) { + supportedInstalments = []; + json['supportedInstalments'].forEach((v) { + supportedInstalments!.add(new SupportedInstalments.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['name'] = this.name; + data['description'] = this.description; + if (this.minLimit != null) { + data['minLimit'] = this.minLimit!.toJson(); + } + if (this.maxLimit != null) { + data['maxLimit'] = this.maxLimit!.toJson(); + } + if (this.supportedInstalments != null) { + data['supportedInstalments'] = this.supportedInstalments!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class MinLimit { + String? currency; + num? amount; + + MinLimit({this.currency, this.amount}); + + MinLimit.fromJson(Map json) { + currency = json['currency']; + amount = json['amount']; + } + + Map toJson() { + final Map data = new Map(); + data['currency'] = this.currency; + data['amount'] = this.amount; + return data; + } +} + +class SupportedInstalments { + int? instalments; + MinLimit? minLimit; + MinLimit? maxLimit; + + SupportedInstalments({this.instalments, this.minLimit, this.maxLimit}); + + SupportedInstalments.fromJson(Map json) { + instalments = json['instalments']; + minLimit = json['minLimit'] != null ? new MinLimit.fromJson(json['minLimit']) : null; + maxLimit = json['maxLimit'] != null ? new MinLimit.fromJson(json['maxLimit']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['instalments'] = this.instalments; + if (this.minLimit != null) { + data['minLimit'] = this.minLimit!.toJson(); + } + if (this.maxLimit != null) { + data['maxLimit'] = this.maxLimit!.toJson(); + } + return data; + } +} diff --git a/lib/features/my_appointments/models/resp_models/hospital_model.dart b/lib/features/my_appointments/models/resp_models/hospital_model.dart new file mode 100644 index 0000000..9a211d0 --- /dev/null +++ b/lib/features/my_appointments/models/resp_models/hospital_model.dart @@ -0,0 +1,106 @@ +class HospitalsModel { + String? desciption; + dynamic desciptionN; + dynamic iD; + String? legalName; + String? legalNameN; + String? name; + dynamic nameN; + String? phoneNumber; + String? setupID; + dynamic distanceInKilometers; + bool? isActive; + String? latitude; + String? longitude; + dynamic mainProjectID; + bool? projectOutSA; + bool? usingInDoctorApp; + bool? isHMC; + String? region; + String? regionArabic; + String? regionEnglish; + String? regionID; + + HospitalsModel({ + this.desciption, + this.desciptionN, + this.iD, + this.legalName, + this.legalNameN, + this.name, + this.nameN, + this.phoneNumber, + this.setupID, + this.distanceInKilometers, + this.isActive, + this.latitude, + this.longitude, + this.mainProjectID, + this.projectOutSA, + this.usingInDoctorApp, + this.isHMC, + this.region, + this.regionArabic, + this.regionEnglish, + this.regionID, + }); + + HospitalsModel.fromJson(Map json) { + desciption = json['Desciption']; + desciptionN = json['DesciptionN']; + iD = json['ID']; + legalName = json['LegalName']; + legalNameN = json['LegalNameN']; + name = json['Name']; + nameN = json['NameN']; + phoneNumber = json['PhoneNumber']; + setupID = json['SetupID']; + distanceInKilometers = json['DistanceInKilometers']; + isActive = json['IsActive']; + latitude = json['Latitude']; + longitude = json['Longitude']; + mainProjectID = json['MainProjectID']; + projectOutSA = json['ProjectOutSA']; + usingInDoctorApp = json['UsingInDoctorApp']; + this.isHMC = json["IsHMC"]; + this.regionArabic = json['RegionNameN']; + this.regionEnglish = json['RegionName']; + } + + String? getRegionName(bool isArabic) { + if (isArabic) { + return regionArabic; + } + return regionEnglish; + } + + String? getName(bool isArabic) { + if (isArabic) { + return "$nameN"; + } + return name; + } + + Map toJson() { + final Map data = new Map(); + data['Desciption'] = this.desciption; + data['DesciptionN'] = this.desciptionN; + data['ID'] = this.iD; + data['LegalName'] = this.legalName; + data['LegalNameN'] = this.legalNameN; + data['Name'] = this.name; + data['NameN'] = this.nameN; + data['PhoneNumber'] = this.phoneNumber; + data['SetupID'] = this.setupID; + data['DistanceInKilometers'] = this.distanceInKilometers; + data['IsActive'] = this.isActive; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['MainProjectID'] = this.mainProjectID; + data['ProjectOutSA'] = this.projectOutSA; + data['UsingInDoctorApp'] = this.usingInDoctorApp; + return data; + } + + +} diff --git a/lib/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart b/lib/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart new file mode 100644 index 0000000..e1ae67d --- /dev/null +++ b/lib/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart @@ -0,0 +1,511 @@ +class PatientAppointmentHistoryResponseModel { + String? setupID; + dynamic projectID; + dynamic appointmentNo; + String? appointmentDate; + dynamic appointmentDateN; + dynamic appointmentType; + String? bookDate; + dynamic patientType; + dynamic patientID; + dynamic clinicID; + dynamic doctorID; + String? endDate; + String? startTime; + String? endTime; + dynamic status; + dynamic visitType; + dynamic visitFor; + dynamic patientStatusType; + dynamic companyID; + dynamic bookedBy; + String? bookedOn; + dynamic confirmedBy; + dynamic confirmedOn; + dynamic arrivalChangedBy; + dynamic arrivedOn; + dynamic editedBy; + dynamic editedOn; + dynamic doctorName; + dynamic doctorNameN; + String? statusDesc; + dynamic statusDescN; + bool? vitalStatus; + dynamic vitalSignAppointmentNo; + dynamic episodeID; + dynamic actualDoctorRate; + String? clinicName; + bool? complainExists; + String? doctorImageURL; + String? doctorNameObj; + dynamic doctorRate; + dynamic decimalDoctorRate; + List? doctorSpeciality; + String? doctorTitle; + dynamic gender; + String? genderDescription; + bool? iSAllowOnlineCheckedIN; + bool? isActiveDoctor; + bool? isActiveDoctorProfile; + bool? isDoctorAllowVedioCall; + bool? isExecludeDoctor; + dynamic isFollowup; + bool? isLiveCareAppointment; + bool? isInOutPatient; + bool? isMedicalReportRequested; + bool? isOnlineCheckedIN; + String? latitude; + List? listHISGetContactLensPrescription; + List? listHISGetGlassPrescription; + String? longitude; + dynamic nextAction; + dynamic noOfPatientsRate; + dynamic originalClinicID; + dynamic originalProjectID; + String? projectName; + String? qR; + int? remaniningHoursTocanPay; + bool? sMSButtonVisable; + dynamic serviceID; + String? isInOutPatientDescription; + String? isInOutPatientDescriptionN; + bool? hasReminder; + num? patientShare; + num? patientShareWithTax; + num? patientTaxAmount; + + PatientAppointmentHistoryResponseModel({ + this.setupID, + this.projectID, + this.appointmentNo, + this.appointmentDate, + this.appointmentDateN, + this.appointmentType, + this.bookDate, + this.patientType, + this.patientID, + this.clinicID, + this.doctorID, + this.endDate, + this.startTime, + this.endTime, + this.status, + this.visitType, + this.visitFor, + this.patientStatusType, + this.companyID, + this.bookedBy, + this.bookedOn, + this.confirmedBy, + this.confirmedOn, + this.arrivalChangedBy, + this.arrivedOn, + this.editedBy, + this.editedOn, + this.doctorName, + this.doctorNameN, + this.statusDesc, + this.statusDescN, + this.vitalStatus, + this.vitalSignAppointmentNo, + this.episodeID, + this.actualDoctorRate, + this.clinicName, + this.complainExists, + this.doctorImageURL, + this.doctorNameObj, + this.doctorRate, + this.decimalDoctorRate, + this.doctorSpeciality, + this.doctorTitle, + this.gender, + this.genderDescription, + this.iSAllowOnlineCheckedIN, + this.isActiveDoctor, + this.isActiveDoctorProfile, + this.isDoctorAllowVedioCall, + this.isExecludeDoctor, + this.isFollowup, + this.isLiveCareAppointment, + this.isMedicalReportRequested, + this.isOnlineCheckedIN, + this.latitude, + this.listHISGetContactLensPrescription, + this.listHISGetGlassPrescription, + this.longitude, + this.nextAction, + this.noOfPatientsRate, + this.originalClinicID, + this.originalProjectID, + this.projectName, + this.qR, + this.remaniningHoursTocanPay, + this.sMSButtonVisable, + this.serviceID, + this.isInOutPatientDescription, + this.isInOutPatientDescriptionN, + this.hasReminder = false, + this.patientShare, + this.patientShareWithTax, + this.patientTaxAmount, + }); + + PatientAppointmentHistoryResponseModel.fromJson(Map json) { + setupID = json['SetupID']; + projectID = json['ProjectID']; + appointmentNo = json['AppointmentNo']; + appointmentDate = json['AppointmentDate']; + appointmentDateN = json['AppointmentDateN']; + appointmentType = json['AppointmentType']; + bookDate = json['BookDate']; + patientType = json['PatientType']; + patientID = json['PatientID']; + clinicID = json['ClinicID']; + doctorID = json['DoctorID']; + endDate = json['EndDate']; + startTime = json['StartTime']; + endTime = json['EndTime']; + status = json['Status']; + visitType = json['VisitType']; + visitFor = json['VisitFor']; + patientStatusType = json['PatientStatusType']; + companyID = json['CompanyID']; + bookedBy = json['BookedBy']; + bookedOn = json['BookedOn']; + confirmedBy = json['ConfirmedBy']; + confirmedOn = json['ConfirmedOn']; + arrivalChangedBy = json['ArrivalChangedBy']; + arrivedOn = json['ArrivedOn']; + editedBy = json['EditedBy']; + editedOn = json['EditedOn']; + doctorName = json['DoctorName']; + doctorNameN = json['DoctorNameN']; + statusDesc = json['StatusDesc']; + statusDescN = json['StatusDescN']; + vitalStatus = json['VitalStatus']; + vitalSignAppointmentNo = json['VitalSignAppointmentNo']; + episodeID = json['EpisodeID']; + actualDoctorRate = json['ActualDoctorRate']; + clinicName = json['ClinicName']; + complainExists = json['ComplainExists']; + doctorImageURL = json['DoctorImageURL']; + doctorNameObj = json['DoctorNameObj']; + doctorRate = json['DoctorRate']; + decimalDoctorRate = json['DecimalDoctorRate']; + doctorSpeciality = json['DoctorSpeciality'] != null ? json['DoctorSpeciality'].cast() : ["null"]; + doctorTitle = json['DoctorTitle']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + iSAllowOnlineCheckedIN = json['ISAllowOnlineCheckedIN']; + isActiveDoctor = json['IsActiveDoctor']; + isActiveDoctorProfile = json['IsActiveDoctorProfile']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isExecludeDoctor = json['IsExecludeDoctor']; + isFollowup = json['IsFollowup']; + isLiveCareAppointment = json['IsLiveCareAppointment']; + isInOutPatient = json['IsInOutPatient']; + isMedicalReportRequested = json['IsMedicalReportRequested']; + isOnlineCheckedIN = json['IsOnlineCheckedIN']; + latitude = json['Latitude']; + if (json['List_HIS_GetContactLensPerscription'] != null) { + listHISGetContactLensPrescription = []; + json['List_HIS_GetContactLensPerscription'].forEach((v) { + listHISGetContactLensPrescription!.add(ListHISGetContactLensPrescription.fromJson(v)); + }); + } + if (json['List_HIS_GetGlassPerscription'] != null) { + listHISGetGlassPrescription = []; + json['List_HIS_GetGlassPerscription'].forEach((v) { + listHISGetGlassPrescription!.add(ListHISGetGlassPrescription.fromJson(v)); + }); + } + longitude = json['Longitude']; + nextAction = json['NextAction']; + noOfPatientsRate = json['NoOfPatientsRate']; + originalClinicID = json['OriginalClinicID']; + originalProjectID = json['OriginalProjectID']; + projectName = json['ProjectName']; + qR = json['QR']; + remaniningHoursTocanPay = json['RemaniningHoursTocanPay']; + sMSButtonVisable = json['SMSButtonVisable']; + serviceID = json['ServiceID']; + isInOutPatientDescription = json['IsInOutPatientDescription']; + isInOutPatientDescriptionN = json['IsInOutPatientDescriptionN']; + hasReminder = false; + patientShare = json['PatientShare']; + patientShareWithTax = json['PatientShareWithTax']; + patientTaxAmount = json['PatientTaxAmount']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['AppointmentNo'] = this.appointmentNo; + data['AppointmentDate'] = this.appointmentDate; + data['AppointmentDateN'] = this.appointmentDateN; + data['AppointmentType'] = this.appointmentType; + data['BookDate'] = this.bookDate; + data['PatientType'] = this.patientType; + data['PatientID'] = this.patientID; + data['ClinicID'] = this.clinicID; + data['DoctorID'] = this.doctorID; + data['EndDate'] = this.endDate; + data['StartTime'] = this.startTime; + data['EndTime'] = this.endTime; + data['Status'] = this.status; + data['VisitType'] = this.visitType; + data['VisitFor'] = this.visitFor; + data['PatientStatusType'] = this.patientStatusType; + data['CompanyID'] = this.companyID; + data['BookedBy'] = this.bookedBy; + data['BookedOn'] = this.bookedOn; + data['ConfirmedBy'] = this.confirmedBy; + data['ConfirmedOn'] = this.confirmedOn; + data['ArrivalChangedBy'] = this.arrivalChangedBy; + data['ArrivedOn'] = this.arrivedOn; + data['EditedBy'] = this.editedBy; + data['EditedOn'] = this.editedOn; + data['DoctorName'] = this.doctorName; + data['DoctorNameN'] = this.doctorNameN; + data['StatusDesc'] = this.statusDesc; + data['StatusDescN'] = this.statusDescN; + data['VitalStatus'] = this.vitalStatus; + data['VitalSignAppointmentNo'] = this.vitalSignAppointmentNo; + data['EpisodeID'] = this.episodeID; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['ClinicName'] = this.clinicName; + data['ComplainExists'] = this.complainExists; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorNameObj'] = this.doctorNameObj; + data['DoctorRate'] = this.doctorRate; + data['DecimalDoctorRate'] = this.decimalDoctorRate; + data['DoctorSpeciality'] = this.doctorSpeciality; + data['DoctorTitle'] = this.doctorTitle; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['ISAllowOnlineCheckedIN'] = this.iSAllowOnlineCheckedIN; + data['IsActiveDoctor'] = this.isActiveDoctor; + data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['IsFollowup'] = this.isFollowup; + data['IsLiveCareAppointment'] = this.isLiveCareAppointment; + data['IsInOutPatient'] = this.isInOutPatient; + data['IsMedicalReportRequested'] = this.isMedicalReportRequested; + data['IsOnlineCheckedIN'] = this.isOnlineCheckedIN; + data['Latitude'] = this.latitude; + // data['List_HIS_GetContactLensPerscription'] = this.listHISGetContactLensPerscription; + // data['List_HIS_GetGlassPerscription'] = this.listHISGetGlassPerscription; + data['Longitude'] = this.longitude; + data['NextAction'] = this.nextAction; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['OriginalClinicID'] = this.originalClinicID; + data['OriginalProjectID'] = this.originalProjectID; + data['ProjectName'] = this.projectName; + data['QR'] = this.qR; + data['RemaniningHoursTocanPay'] = this.remaniningHoursTocanPay; + data['SMSButtonVisable'] = this.sMSButtonVisable; + data['ServiceID'] = this.serviceID; + return data; + } +} + +class ListHISGetContactLensPrescription { + String? setupId; + int? projectId; + int? patientType; + int? patientId; + int? encounterType; + int? encounterNo; + int? oDOS; + dynamic brand; + dynamic baseCurve; + dynamic power; + dynamic diameter; + dynamic oZ; + dynamic cT; + dynamic blend; + String? remarks; + int? status; + bool? isActive; + String? createdOn; + + ListHISGetContactLensPrescription( + {this.setupId, + this.projectId, + this.patientType, + this.patientId, + this.encounterType, + this.encounterNo, + this.oDOS, + this.brand, + this.baseCurve, + this.power, + this.diameter, + this.oZ, + this.cT, + this.blend, + this.remarks, + this.status, + this.isActive, + this.createdOn}); + + ListHISGetContactLensPrescription.fromJson(Map json) { + setupId = json['SetupId']; + projectId = json['ProjectId']; + patientType = json['PatientType']; + patientId = json['PatientId']; + encounterType = json['EncounterType']; + encounterNo = json['EncounterNo']; + oDOS = json['OD_OS']; + brand = json['Brand']; + baseCurve = json['BaseCurve']; + power = json['Power']; + diameter = json['Diameter']; + oZ = json['OZ']; + cT = json['CT']; + blend = json['Blend']; + remarks = json['Remarks']; + status = json['Status']; + isActive = json['IsActive']; + createdOn = json['CreatedOn']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupId'] = this.setupId; + data['ProjectId'] = this.projectId; + data['PatientType'] = this.patientType; + data['PatientId'] = this.patientId; + data['EncounterType'] = this.encounterType; + data['EncounterNo'] = this.encounterNo; + data['OD_OS'] = this.oDOS; + data['Brand'] = this.brand; + data['BaseCurve'] = this.baseCurve; + data['Power'] = this.power; + data['Diameter'] = this.diameter; + data['OZ'] = this.oZ; + data['CT'] = this.cT; + data['Blend'] = this.blend; + data['Remarks'] = this.remarks; + data['Status'] = this.status; + data['IsActive'] = this.isActive; + data['CreatedOn'] = this.createdOn; + return data; + } +} + +class ListHISGetGlassPrescription { + dynamic projectID; + String? setupID; + dynamic patientId; + dynamic encounterType; + dynamic encounterNo; + String? visionType; + double? rightEyeSpherical; + dynamic rightEyeCylinder; + dynamic rightEyeAxis; + dynamic rightEyePrism; + dynamic rightEyeVA; + String? rightEyeRemarks; + dynamic leftEyeSpherical; + dynamic leftEyeCylinder; + dynamic leftEyeAxis; + dynamic leftEyePrism; + dynamic leftEyeVA; + String? leftEyeRemarks; + dynamic pD; + dynamic bVD; + dynamic status; + bool? isActive; + String? createdOn; + + ListHISGetGlassPrescription( + {this.projectID, + this.setupID, + this.patientId, + this.encounterType, + this.encounterNo, + this.visionType, + this.rightEyeSpherical, + this.rightEyeCylinder, + this.rightEyeAxis, + this.rightEyePrism, + this.rightEyeVA, + this.rightEyeRemarks, + this.leftEyeSpherical, + this.leftEyeCylinder, + this.leftEyeAxis, + this.leftEyePrism, + this.leftEyeVA, + this.leftEyeRemarks, + this.pD, + this.bVD, + this.status, + this.isActive, + this.createdOn}); + + ListHISGetGlassPrescription.fromJson(Map json) { + projectID = json['ProjectID']; + setupID = json['SetupID']; + patientId = json['PatientId']; + encounterType = json['EncounterType']; + encounterNo = json['EncounterNo']; + visionType = json['VisionType']; + rightEyeSpherical = json['RightEyeSpherical']; + rightEyeCylinder = json['RightEyeCylinder']; + rightEyeAxis = json['RightEyeAxis']; + rightEyePrism = json['RightEyePrism']; + rightEyeVA = json['RightEyeVA']; + rightEyeRemarks = json['RightEyeRemarks']; + leftEyeSpherical = json['LeftEyeSpherical']; + leftEyeCylinder = json['LeftEyeCylinder']; + leftEyeAxis = json['LeftEyeAxis']; + leftEyePrism = json['LeftEyePrism']; + leftEyeVA = json['LeftEyeVA']; + leftEyeRemarks = json['LeftEyeRemarks']; + pD = json['PD']; + bVD = json['BVD']; + status = json['Status']; + isActive = json['IsActive']; + createdOn = json['CreatedOn']; + } + + Map toJson() { + final Map data = new Map(); + data['ProjectID'] = this.projectID; + data['SetupID'] = this.setupID; + data['PatientId'] = this.patientId; + data['EncounterType'] = this.encounterType; + data['EncounterNo'] = this.encounterNo; + data['VisionType'] = this.visionType; + data['RightEyeSpherical'] = this.rightEyeSpherical; + data['RightEyeCylinder'] = this.rightEyeCylinder; + data['RightEyeAxis'] = this.rightEyeAxis; + data['RightEyePrism'] = this.rightEyePrism; + data['RightEyeVA'] = this.rightEyeVA; + data['RightEyeRemarks'] = this.rightEyeRemarks; + data['LeftEyeSpherical'] = this.leftEyeSpherical; + data['LeftEyeCylinder'] = this.leftEyeCylinder; + data['LeftEyeAxis'] = this.leftEyeAxis; + data['LeftEyePrism'] = this.leftEyePrism; + data['LeftEyeVA'] = this.leftEyeVA; + data['LeftEyeRemarks'] = this.leftEyeRemarks; + data['PD'] = this.pD; + data['BVD'] = this.bVD; + data['Status'] = this.status; + data['IsActive'] = this.isActive; + data['CreatedOn'] = this.createdOn; + return data; + } +} + +class PatientAppointmentList { + String? filterName = ""; + List? patientDoctorAppointmentList = []; + + PatientAppointmentList({this.filterName, PatientAppointmentHistoryResponseModel? patientDoctorAppointment}) { + patientDoctorAppointmentList!.add(patientDoctorAppointment!); + } +} diff --git a/lib/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart b/lib/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart new file mode 100644 index 0000000..2021fff --- /dev/null +++ b/lib/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart @@ -0,0 +1,253 @@ +class PatientAppointmentShareResponseModel { + dynamic advanceNumber; + dynamic advanceNumberVP; + String? appointmentDate; + int? appointmentNo; + dynamic cardNumber; + dynamic cardType; + int? cashPrice; + int? cashPriceTax; + int? cashPriceWithTax; + int? clinicID; + String? clinicName; + int? companyId; + String? companyName; + int? companyShareWithTax; + int? doctorID; + String? doctorImageURL; + String? doctorNameObj; + List? doctorSpeciality; + dynamic errCode; + int? groupID; + bool? iSAllowOnlineCheckedIN; + String? insurancePolicyNo; + bool? isAppointmentPackaged; + bool? isCash; + bool? isEligible; + bool? isExcludedForOnlineCheckin; + int? isFollowup; + bool? isInsured; + bool? isLiveCareAppointment; + bool? isOnlineCheckedIN; + String? message; + int? nextAction; + dynamic orderId; + String? patientCardID; + int? patientID; + num? patientShare; + num? patientShareWithTax; + int? patientStatusType; + num? patientTaxAmount; + String? patientType; + int? paymentAmount; + String? paymentDate; + dynamic paymentMethodName; + dynamic paymentReferenceNumber; + int? policyId; + String? policyName; + String? procedureName; + int? projectID; + String? projectName; + dynamic rRN; + int? serviceID; + dynamic setupID; + int? sourceType; + String? startTime; + int? status; + int? statusCode; + dynamic statusDesc; + String? subPolicyNo; + int? tax; + int? userID; + + PatientAppointmentShareResponseModel({ + this.advanceNumber, + this.advanceNumberVP, + this.appointmentDate, + this.appointmentNo, + this.cardNumber, + this.cardType, + this.cashPrice, + this.cashPriceTax, + this.cashPriceWithTax, + this.clinicID, + this.clinicName, + this.companyId, + this.companyName, + this.companyShareWithTax, + this.doctorID, + this.doctorImageURL, + this.doctorNameObj, + this.doctorSpeciality, + this.errCode, + this.groupID, + this.iSAllowOnlineCheckedIN, + this.insurancePolicyNo, + this.isAppointmentPackaged, + this.isCash, + this.isEligible, + this.isExcludedForOnlineCheckin, + this.isFollowup, + this.isInsured, + this.isLiveCareAppointment, + this.isOnlineCheckedIN, + this.message, + this.nextAction, + this.orderId, + this.patientCardID, + this.patientID, + this.patientShare, + this.patientShareWithTax, + this.patientStatusType, + this.patientTaxAmount, + this.patientType, + this.paymentAmount, + this.paymentDate, + this.paymentMethodName, + this.paymentReferenceNumber, + this.policyId, + this.policyName, + this.procedureName, + this.projectID, + this.projectName, + this.rRN, + this.serviceID, + this.setupID, + this.sourceType, + this.startTime, + this.status, + this.statusCode, + this.statusDesc, + this.subPolicyNo, + this.tax, + this.userID, + }); + + PatientAppointmentShareResponseModel.fromJson(Map json) { + advanceNumber = json['AdvanceNumber']; + advanceNumberVP = json['AdvanceNumber_VP']; + appointmentDate = json['AppointmentDate']; + appointmentNo = json['AppointmentNo']; + cardNumber = json['CardNumber']; + cardType = json['CardType']; + cashPrice = json['CashPrice']; + cashPriceTax = json['CashPriceTax']; + cashPriceWithTax = json['CashPriceWithTax']; + clinicID = json['ClinicID']; + clinicName = json['ClinicName']; + companyId = json['CompanyId']; + companyName = json['CompanyName']; + companyShareWithTax = json['CompanyShareWithTax']; + doctorID = json['DoctorID']; + doctorImageURL = json['DoctorImageURL']; + doctorNameObj = json['DoctorNameObj']; + doctorSpeciality = json['DoctorSpeciality'].cast(); + errCode = json['ErrCode']; + groupID = json['GroupID']; + iSAllowOnlineCheckedIN = json['ISAllowOnlineCheckedIN']; + insurancePolicyNo = json['InsurancePolicyNo']; + isAppointmentPackaged = json['IsAppointmentPackaged']; + isCash = json['IsCash']; + isEligible = json['IsEligible']; + isExcludedForOnlineCheckin = json['IsExcludedForOnlineCheckin']; + isFollowup = json['IsFollowup']; + isInsured = json['IsInsured']; + isLiveCareAppointment = json['IsLiveCareAppointment']; + isOnlineCheckedIN = json['IsOnlineCheckedIN']; + message = json['Message']; + nextAction = json['NextAction']; + orderId = json['OrderId']; + patientCardID = json['PatientCardID']; + patientID = json['PatientID']; + patientShare = json['PatientShare']; + patientShareWithTax = json['PatientShareWithTax']; + patientStatusType = json['PatientStatusType']; + patientTaxAmount = json['PatientTaxAmount']; + patientType = json['PatientType']; + paymentAmount = json['PaymentAmount']; + paymentDate = json['PaymentDate']; + paymentMethodName = json['PaymentMethodName']; + paymentReferenceNumber = json['PaymentReferenceNumber']; + policyId = json['PolicyId']; + policyName = json['PolicyName']; + procedureName = json['ProcedureName']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + rRN = json['RRN']; + serviceID = json['ServiceID']; + setupID = json['SetupID']; + sourceType = json['SourceType']; + startTime = json['StartTime']; + status = json['Status']; + statusCode = json['StatusCode']; + statusDesc = json['StatusDesc']; + subPolicyNo = json['SubPolicyNo']; + tax = json['Tax']; + userID = json['UserID']; + } + + Map toJson() { + final Map data = new Map(); + data['AdvanceNumber'] = this.advanceNumber; + data['AdvanceNumber_VP'] = this.advanceNumberVP; + data['AppointmentDate'] = this.appointmentDate; + data['AppointmentNo'] = this.appointmentNo; + data['CardNumber'] = this.cardNumber; + data['CardType'] = this.cardType; + data['CashPrice'] = this.cashPrice; + data['CashPriceTax'] = this.cashPriceTax; + data['CashPriceWithTax'] = this.cashPriceWithTax; + data['ClinicID'] = this.clinicID; + data['ClinicName'] = this.clinicName; + data['CompanyId'] = this.companyId; + data['CompanyName'] = this.companyName; + data['CompanyShareWithTax'] = this.companyShareWithTax; + data['DoctorID'] = this.doctorID; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorNameObj'] = this.doctorNameObj; + data['DoctorSpeciality'] = this.doctorSpeciality; + data['ErrCode'] = this.errCode; + data['GroupID'] = this.groupID; + data['ISAllowOnlineCheckedIN'] = this.iSAllowOnlineCheckedIN; + data['InsurancePolicyNo'] = this.insurancePolicyNo; + data['IsAppointmentPackaged'] = this.isAppointmentPackaged; + data['IsCash'] = this.isCash; + data['IsEligible'] = this.isEligible; + data['IsExcludedForOnlineCheckin'] = this.isExcludedForOnlineCheckin; + data['IsFollowup'] = this.isFollowup; + data['IsInsured'] = this.isInsured; + data['IsLiveCareAppointment'] = this.isLiveCareAppointment; + data['IsOnlineCheckedIN'] = this.isOnlineCheckedIN; + data['Message'] = this.message; + data['NextAction'] = this.nextAction; + data['OrderId'] = this.orderId; + data['PatientCardID'] = this.patientCardID; + data['PatientID'] = this.patientID; + data['PatientShare'] = this.patientShare; + data['PatientShareWithTax'] = this.patientShareWithTax; + data['PatientStatusType'] = this.patientStatusType; + data['PatientTaxAmount'] = this.patientTaxAmount; + data['PatientType'] = this.patientType; + data['PaymentAmount'] = this.paymentAmount; + data['PaymentDate'] = this.paymentDate; + data['PaymentMethodName'] = this.paymentMethodName; + data['PaymentReferenceNumber'] = this.paymentReferenceNumber; + data['PolicyId'] = this.policyId; + data['PolicyName'] = this.policyName; + data['ProcedureName'] = this.procedureName; + data['ProjectID'] = this.projectID; + data['ProjectName'] = this.projectName; + data['RRN'] = this.rRN; + data['ServiceID'] = this.serviceID; + data['SetupID'] = this.setupID; + data['SourceType'] = this.sourceType; + data['StartTime'] = this.startTime; + data['Status'] = this.status; + data['StatusCode'] = this.statusCode; + data['StatusDesc'] = this.statusDesc; + data['SubPolicyNo'] = this.subPolicyNo; + data['Tax'] = this.tax; + data['UserID'] = this.userID; + return data; + } +} diff --git a/lib/features/my_appointments/my_appointments_repo.dart b/lib/features/my_appointments/my_appointments_repo.dart new file mode 100644 index 0000000..87ec10d --- /dev/null +++ b/lib/features/my_appointments/my_appointments_repo.dart @@ -0,0 +1,749 @@ +import 'dart:io'; + +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart' show HospitalsModel; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class MyAppointmentsRepo { + Future>>> getPatientAppointments({required bool isActiveAppointment, required bool isArrivedAppointments, bool isForEyeMeasurement = false}); + + Future>> getPatientShareAppointment( + {required int projectID, required int clinicID, required String appointmentNo, required bool isLiveCareAppointment}); + + Future>> createAdvancePayment( + {required String paymentMethodName, + required int projectID, + required int clinicID, + required String appointmentNo, + required num payedAmount, + required String paymentReference, + required String patientID, + required int patientType}); + + Future>> addAdvanceNumberRequest({required String advanceNumber, required String paymentReference, required String appointmentNo}); + + Future>> generateAppointmentQR({required int clinicID, required int projectID, required String appointmentNo, required int isFollowUp}); + + Future>> cancelAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel}); + + Future>> confirmAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel}); + + Future>> sendCheckInNfcRequest( + {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, required String scannedCode, required int checkInType}); + + Future>>> getPatientAppointmentsForTimeLine(); + + Future>>> getPatientDoctorsList(); + + Future>> insertLiveCareVIDARequest({required clientRequestID, required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel}); + + Future>> getTamaraInstallmentsDetails(); + + Future>> getActiveAppointmentsCount(); + + Future>>> getAskDoctorRequestTypes(); + + Future>> isDoctorAvailable({required int projectID, required int clinicID, required int doctorID}); + + Future>> sendAskDocCallRequest( + {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, required String requestType, required String remarks, required String userMobileNumber}); +} + +class MyAppointmentsRepoImp implements MyAppointmentsRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + MyAppointmentsRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>>> getPatientAppointments({required bool isActiveAppointment, required bool isArrivedAppointments, bool isForEyeMeasurement = false}) async { + Map mapDevice = { + "IsActiveAppointment": isActiveAppointment, + "IsComingFromCOC": false, + "isForUpcomming": false, + "IsForMedicalReport": false, + "IsForArrived": isArrivedAppointments, + "IsIrisPrescription": isForEyeMeasurement + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PATIENT_APPOINTMENT_HISTORY, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['AppoimentAllHistoryResultList']; + // if (list == null || list.isEmpty) { + // throw Exception("Appointments list is empty"); + // } + + final appointmentsList = list.map((item) => PatientAppointmentHistoryResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: appointmentsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getPatientShareAppointment( + {required int projectID, required int clinicID, required String appointmentNo, required bool isLiveCareAppointment}) async { + Map mapRequest = {"ProjectID": projectID, "ClinicID": clinicID, "AppointmentNo": appointmentNo, "IsActiveAppointment": true, "IsForLiveCare": isLiveCareAppointment}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + isLiveCareAppointment ? GET_PATIENT_SHARE_LIVECARE : GET_PATIENT_SHARE, + body: mapRequest, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['OnlineCheckInAppointments']; + if (list == null || list.isEmpty) { + throw Exception("patient share list is empty"); + } + + final patientShareObj = PatientAppointmentShareResponseModel.fromJson(list[0]); + patientShareObj.isCash = response["IsCash"]; + patientShareObj.isEligible = response["IsEligible"]; + patientShareObj.isInsured = response["IsInsured"]; + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: patientShareObj, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> createAdvancePayment({ + required String paymentMethodName, + required int projectID, + required int clinicID, + required String appointmentNo, + required num payedAmount, + required String paymentReference, + required String patientID, + required int patientType, + }) async { + Map requestBody = { + "ProjectID": projectID, + "OnlineCheckInAppointment": { + "AppointmentNo": appointmentNo, + "PaymentMethodName": paymentMethodName, + "PaymentAmount": payedAmount == 0 ? "0" : payedAmount.toString(), + "PaymentDate": payedAmount == 0 ? "" : "/Date(${DateTime.now().millisecondsSinceEpoch})/", + "PaymentReferenceNumber": payedAmount == 0 ? "" : paymentReference, + "ProjectID": projectID, + "PatientID": patientID, + "ClinicID": clinicID, + "UserID": patientID, + "Status": patientType + } + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + CREATE_ADVANCE_PAYMENT, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> addAdvanceNumberRequest({required String advanceNumber, required String paymentReference, required String appointmentNo}) async { + Map requestBody = { + "AdvanceNumber": advanceNumber, + "AdvanceNumber_VP": advanceNumber, + "PaymentReferenceNumber": paymentReference, + "AppointmentID": appointmentNo, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ADD_ADVANCE_NUMBER_REQUEST, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> generateAppointmentQR({required int clinicID, required int projectID, required String appointmentNo, required int isFollowUp}) async { + Map requestBody = { + "AppointmentNo": appointmentNo, + "ClinicID": clinicID, + "ProjectID": projectID, + "IsFollowup": isFollowUp, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GENERATE_QR_APPOINTMENT, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> cancelAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel}) async { + Map requestBody = { + "AppointmentID": patientAppointmentHistoryResponseModel.appointmentNo, + "ClinicID": patientAppointmentHistoryResponseModel.clinicID, + "ProjectID": patientAppointmentHistoryResponseModel.projectID, + "CancelToReschadual": false, + "EndTime": patientAppointmentHistoryResponseModel.endTime, + "StartTime": patientAppointmentHistoryResponseModel.startTime, + "DoctorID": patientAppointmentHistoryResponseModel.doctorID, + "IsForLiveCare": patientAppointmentHistoryResponseModel.isLiveCareAppointment, + "OriginalClinicID": patientAppointmentHistoryResponseModel.originalClinicID, + "OriginalProjectID": patientAppointmentHistoryResponseModel.originalProjectID + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + CANCEL_APPOINTMENT, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> confirmAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel}) async { + Map requestBody = { + "AppointmentNumber": patientAppointmentHistoryResponseModel.appointmentNo, + "IsLiveCareAppointment": patientAppointmentHistoryResponseModel.isLiveCareAppointment, + "ClinicID": patientAppointmentHistoryResponseModel.clinicID, + "ProjectID": patientAppointmentHistoryResponseModel.projectID, + "ConfirmationBy": 102, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + CONFIRM_APPOINTMENT, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> sendCheckInNfcRequest( + {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, required String scannedCode, required int checkInType}) async { + Map requestBody = { + "AppointmentNo": patientAppointmentHistoryResponseModel.appointmentNo, + "NFC_Code": scannedCode, + "ProjectID": patientAppointmentHistoryResponseModel.projectID, + "ClinicID": patientAppointmentHistoryResponseModel.clinicID, + "CheckinBy": checkInType, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + SEND_CHECK_IN_NFC_REQUEST, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + isAllowAny: true, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientAppointmentsForTimeLine() async { + Map mapDevice = { + "isDentalAllowedBackend": false, + "PatientTypeID": 1, + "IsComingFromCOC": false, + "PatientType": 1, + "IsForTimeLine": true, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PATIENT_APPOINTMENT_HISTORY, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['AppoimentAllHistoryResultList']; + // if (list == null || list.isEmpty) { + // throw Exception("Appointments list is empty"); + // } + + final appointmentsList = list.map((item) => PatientAppointmentHistoryResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: appointmentsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientDoctorsList() async { + Map mapDevice = { + "Top": 0, + "beforeDays": 0, + "exludType": 4, + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_MY_DOCTOR, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['PatientDoctorAppointmentResultList']; + + final appointmentsList = list.map((item) => PatientAppointmentHistoryResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: appointmentsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> insertLiveCareVIDARequest({required clientRequestID, required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel}) async { + Map requestBody = { + "AppointmentNo": patientAppointmentHistoryResponseModel.appointmentNo, + "AppointmentDate": patientAppointmentHistoryResponseModel.appointmentDate, + "ClientRequestID": clientRequestID, + "ClinicID": patientAppointmentHistoryResponseModel.clinicID, + "ProjectID": patientAppointmentHistoryResponseModel.projectID, + "ServiceID": patientAppointmentHistoryResponseModel.serviceID, + "AcceptedBy": patientAppointmentHistoryResponseModel.doctorID, + "IsFlutter": true, + "DeviceToken": await Utils.getStringFromPrefs(CacheConst.pushToken), + "VoipToken": "", // TODO: Add VoIP Token functionality + "IsVoip": Platform.isIOS ? true : false + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + INSERT_VIDA_REQUEST, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getTamaraInstallmentsDetails() async { + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.get( + ApiConsts.GET_TAMARA_INSTALLMENTS_URL, + isExternal: true, + isAllowAny: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response; + + final tamaraInstallmentsList = GetTamaraInstallmentsDetailsResponseModel.fromJson(list.first); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: tamaraInstallmentsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> getActiveAppointmentsCount() async { + Map mapDevice = {}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_ACTIVE_APPOINTMENTS_LIST_URL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final appointmentCount = response['AppointmentActiveNumber']; + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: appointmentCount, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> isDoctorAvailable({required int projectID, required int clinicID, required int doctorID}) async { + Map mapDevice = {"isDentalAllowedBackend": false, "DoctorID": doctorID, "ProjectID": projectID, "ClinicID": clinicID}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + IS_DOCTOR_AVAILABLE_BY_CALENDAR_SCHEDULE, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final isDoctorAvailable = response['IsDoctorAvailable']; + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: isDoctorAvailable, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getAskDoctorRequestTypes() async { + Map mapDevice = {}; + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post(GET_CALL_REQUEST_TYPE, onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListReqTypes']; + + final askDoctorRequestTypesList = list.map((item) => AskDocRequestType.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: askDoctorRequestTypesList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, body: mapDevice); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> sendAskDocCallRequest( + {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, required String requestType, required String remarks, required String userMobileNumber}) async { + Map body = {}; + + body['ProjectID'] = patientAppointmentHistoryResponseModel.projectID; + body['SetupID'] = patientAppointmentHistoryResponseModel.setupID; + body['DoctorID'] = patientAppointmentHistoryResponseModel.doctorID; + body['PatientMobileNumber'] = userMobileNumber; + body['IsMessageSent'] = false; + body['RequestDate'] = DateUtil.convertDateToString(DateTime.now()); + body['RequestTime'] = DateUtil.convertDateToString(DateTime.now()); + body['Remarks'] = remarks; + body['Status'] = 2; // 4 for testing only.."cancelled status insert" else should be changed to 1 in live version + body['CreatedBy'] = 102; + body['CreatedOn'] = DateUtil.convertDateToString(DateTime.now()); + body['EditedBy'] = 102; + body['EditedOn'] = DateUtil.convertDateToString(DateTime.now()); + body['isDentalAllowedBackend'] = false; + body['AppointmentNo'] = patientAppointmentHistoryResponseModel.appointmentNo; + body['ClinicID'] = patientAppointmentHistoryResponseModel.clinicID; + body['QuestionType'] = num.parse(requestType); + body['RequestType'] = num.parse(requestType); + body['RequestTypeID'] = num.parse(requestType); + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post(INSERT_CALL_INFO, onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: true, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, body: body); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart new file mode 100644 index 0000000..fa1ad22 --- /dev/null +++ b/lib/features/my_appointments/my_appointments_view_model.dart @@ -0,0 +1,682 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/appointemnet_filters.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; + +class MyAppointmentsViewModel extends ChangeNotifier { + int selectedTabIndex = 0; + int previouslySelectedTab = -1; + + int eyeMeasurementsTabSelectedIndex = 0; + + MyAppointmentsRepo myAppointmentsRepo; + ErrorHandlerService errorHandlerService; + AppState appState; + + int activeAppointmentsCount = 0; + + bool isMyAppointmentsLoading = false; + bool isAppointmentPatientShareLoading = false; + bool isTimeLineAppointmentsLoading = false; + bool isPatientMyDoctorsLoading = false; + + bool isAppointmentDataToBeLoaded = true; + + bool isEyeMeasurementsAppointmentsLoading = false; + + List availableFilters = []; + List? selectedFilter = []; + bool isDateFilterSelected = false; + DateTime? start = null; + DateTime? end = null; + + List patientAppointmentsHistoryList = []; + List filteredAppointmentList = []; + + List patientUpcomingAppointmentsHistoryList = []; + List patientArrivedAppointmentsHistoryList = []; + + List patientTimelineAppointmentsList = []; + + List patientMyDoctorsList = []; + + List patientEyeMeasurementsAppointmentsHistoryList = []; + + List askDoctorRequestTypeList = []; + + PatientAppointmentShareResponseModel? patientAppointmentShareResponseModel; + + GetTamaraInstallmentsDetailsResponseModel? getTamaraInstallmentsDetailsResponseModel; + bool isTamaraDetailsLoading = false; + + MyAppointmentsViewModel({required this.myAppointmentsRepo, required this.errorHandlerService, required this.appState}); + + void onTabChange(int index) { + previouslySelectedTab = selectedTabIndex; + selectedTabIndex = index; + start = null; + end = null; + notifyListeners(); + } + + void onEyeMeasurementsTabChanged(int index) { + eyeMeasurementsTabSelectedIndex = index; + notifyListeners(); + } + + initAppointmentsViewModel() { + if (isAppointmentDataToBeLoaded) { + patientAppointmentsHistoryList.clear(); + patientUpcomingAppointmentsHistoryList.clear(); + patientArrivedAppointmentsHistoryList.clear(); + patientTimelineAppointmentsList.clear(); + patientEyeMeasurementsAppointmentsHistoryList.clear(); + isMyAppointmentsLoading = true; + isTimeLineAppointmentsLoading = true; + patientMyDoctorsList.clear(); + } + isTamaraDetailsLoading = true; + isAppointmentPatientShareLoading = true; + isEyeMeasurementsAppointmentsLoading = true; + notifyListeners(); + } + + setIsAppointmentsHistoryLoading(bool val) { + isMyAppointmentsLoading = val; + notifyListeners(); + } + + setIsPatientAppointmentShareLoading(bool val) { + isAppointmentPatientShareLoading = val; + notifyListeners(); + } + + setIsPatientTimeLineAppointmentLoading(bool val) { + isTimeLineAppointmentsLoading = val; + notifyListeners(); + } + + setIsPatientMyDoctorsLoading(bool val) { + isPatientMyDoctorsLoading = val; + notifyListeners(); + } + + setIsAppointmentDataToBeLoaded(bool val) { + if (val) { + isMyAppointmentsLoading = true; + } + isAppointmentDataToBeLoaded = val; + notifyListeners(); + } + + setIsTamaraDetailsLoading(bool val) { + isTamaraDetailsLoading = val; + notifyListeners(); + } + + setIsEyeMeasurementsAppointmentsLoading(bool val) { + isEyeMeasurementsAppointmentsLoading = val; + notifyListeners(); + } + + setAppointmentReminder(bool value, PatientAppointmentHistoryResponseModel item) { + int index = patientAppointmentsHistoryList.indexOf(item); + if (index != -1) { + patientAppointmentsHistoryList[index].hasReminder = value; + notifyListeners(); + } + } + + Future getPatientEyeMeasurementAppointments({Function(dynamic)? onSuccess, Function(String)? onError}) async { + patientEyeMeasurementsAppointmentsHistoryList.clear(); + notifyListeners(); + + final result = await myAppointmentsRepo.getPatientAppointments(isActiveAppointment: false, isArrivedAppointments: true, isForEyeMeasurement: true); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientEyeMeasurementsAppointmentsHistoryList = apiResponse.data!; + isEyeMeasurementsAppointmentsLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientAppointments(bool isActiveAppointment, bool isArrivedAppointments, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + if (!isAppointmentDataToBeLoaded) return; + + filteredAppointmentList.clear(); + patientAppointmentsHistoryList.clear(); + patientUpcomingAppointmentsHistoryList.clear(); + patientArrivedAppointmentsHistoryList.clear(); + notifyListeners(); + + final results = await Future.wait([ + myAppointmentsRepo.getPatientAppointments(isActiveAppointment: isActiveAppointment, isArrivedAppointments: isArrivedAppointments), + myAppointmentsRepo.getPatientAppointments(isActiveAppointment: false, isArrivedAppointments: true), + ]); + + results[0].fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientUpcomingAppointmentsHistoryList = apiResponse.data!; + isMyAppointmentsLoading = false; + isAppointmentDataToBeLoaded = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + + results[1].fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientArrivedAppointmentsHistoryList = apiResponse.data!; + isMyAppointmentsLoading = false; + isAppointmentDataToBeLoaded = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + + patientAppointmentsHistoryList.addAll(patientUpcomingAppointmentsHistoryList); + patientAppointmentsHistoryList.addAll(patientArrivedAppointmentsHistoryList); + filteredAppointmentList.addAll(patientAppointmentsHistoryList); + + print('Upcoming Appointments: ${patientUpcomingAppointmentsHistoryList.length}'); + print('Arrived Appointments: ${patientArrivedAppointmentsHistoryList.length}'); + print('All Appointments: ${patientAppointmentsHistoryList.length}'); + getFiltersForSelectedAppointmentList(filteredAppointmentList); + } + + void getFiltersForSelectedAppointmentList(List filteredAppointmentList) { + availableFilters.clear(); + if (filteredAppointmentList.isEmpty == true) return; + availableFilters.add(AppointmentListingFilters.DATESELECTION); + if (filteredAppointmentList.any((element) => element.isLiveCareAppointment == true)) { + availableFilters.add(AppointmentListingFilters.LIVECARE); + } + + if (filteredAppointmentList.any((element) => element.isLiveCareAppointment == false)) { + availableFilters.add(AppointmentListingFilters.WALKIN); + } + + if (filteredAppointmentList.any((element) => AppointmentType.isArrived(element) == true)) { + availableFilters.add(AppointmentListingFilters.ARRIVED); + } + + if (filteredAppointmentList.any((element) => AppointmentType.isBooked(element) == true)) { + availableFilters.add(AppointmentListingFilters.BOOKED); + } + + if (filteredAppointmentList.any((element) => AppointmentType.isConfirmed(element) == true)) { + availableFilters.add(AppointmentListingFilters.CONFIRMED); + } + notifyListeners(); + } + + Future getPatientShareAppointment(int projectID, int clinicID, String appointmentNo, bool isLiveCareAppointment, + {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.getPatientShareAppointment( + projectID: projectID, clinicID: clinicID, appointmentNo: appointmentNo, isLiveCareAppointment: isLiveCareAppointment); + + result.fold( + (failure) async { + await errorHandlerService.handleError( + failure: failure, + onOkPressed: () { + onError!(failure.message); + }); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientAppointmentShareResponseModel = apiResponse.data!; + isAppointmentPatientShareLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future addAdvanceNumberRequest( + {required String advanceNumber, + required String paymentReference, + required String appointmentNo, + Function(dynamic)? onSuccess, + Function(String)? onError}) async { + final result = + await myAppointmentsRepo.addAdvanceNumberRequest(advanceNumber: advanceNumber, paymentReference: paymentReference, appointmentNo: appointmentNo); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future generateAppointmentQR( + {required int clinicID, + required int projectID, + required String appointmentNo, + required int isFollowUp, + Function(dynamic)? onSuccess, + Function(String)? onError}) async { + final result = + await myAppointmentsRepo.generateAppointmentQR(clinicID: clinicID, projectID: projectID, appointmentNo: appointmentNo, isFollowUp: isFollowUp); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future cancelAppointment( + {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.cancelAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future confirmAppointment( + {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.confirmAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future createAdvancePayment( + {required String paymentMethodName, + required int projectID, + required int clinicID, + required String appointmentNo, + required num payedAmount, + required String paymentReference, + required String patientID, + required int patientType, + Function(dynamic)? onSuccess, + Function(String)? onError}) async { + final result = await myAppointmentsRepo.createAdvancePayment( + paymentMethodName: paymentMethodName, + projectID: projectID, + clinicID: clinicID, + appointmentNo: appointmentNo, + payedAmount: payedAmount, + paymentReference: paymentReference, + patientID: patientID, + patientType: patientType); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future sendCheckInNfcRequest( + {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + required String scannedCode, + required int checkInType, + Function(dynamic)? onSuccess, + Function(String)? onError}) async { + final result = await myAppointmentsRepo.sendCheckInNfcRequest( + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, scannedCode: scannedCode, checkInType: checkInType); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPatientMyDoctors({Function(dynamic)? onSuccess, Function(String)? onError}) async { + if (!isAppointmentDataToBeLoaded) return; + isPatientMyDoctorsLoading = true; + notifyListeners(); + + final result = await myAppointmentsRepo.getPatientDoctorsList(); + + result.fold( + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + isPatientMyDoctorsLoading = false; + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientMyDoctorsList = apiResponse.data!; + isPatientMyDoctorsLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future insertLiveCareVIDARequest( + {required clientRequestID, + required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + Function(dynamic)? onSuccess, + Function(String)? onError}) async { + final result = await myAppointmentsRepo.insertLiveCareVIDARequest( + clientRequestID: clientRequestID, patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + void updateListWRTTab(int index) { + isDateFilterSelected = false; + selectedFilter = []; + // if(previouslySelectedTab == selectedTabIndex ) return; + switch (index) { + case 0: + filteredAppointmentList.clear(); + filteredAppointmentList.addAll(patientAppointmentsHistoryList); + break; + case 1: + filteredAppointmentList.clear(); + filteredAppointmentList.addAll(patientUpcomingAppointmentsHistoryList); + break; + case 2: + filteredAppointmentList.clear(); + filteredAppointmentList.addAll(patientArrivedAppointmentsHistoryList); + break; + } + getFiltersForSelectedAppointmentList(filteredAppointmentList); + notifyListeners(); + } + + void setSelectedFilter(AppointmentListingFilters availableFilter) { + if (selectedFilter?.contains(availableFilter) == true) { + selectedFilter?.remove(availableFilter); + notifyListeners(); + + return; + } + selectedFilter?.add(availableFilter); + notifyListeners(); + } + + void getSelectedDateRange(DateTime? start, DateTime? end) { + this.start = start; + this.end = end; + isDateFilterSelected = true; + List sourceList = []; + if (selectedTabIndex == 0) { + sourceList = patientAppointmentsHistoryList; + } else if (selectedTabIndex == 1) { + sourceList = patientUpcomingAppointmentsHistoryList; + } else if (selectedTabIndex == 2) { + sourceList = patientArrivedAppointmentsHistoryList; + } + // if (isDateFilterSelected) sourceList = filteredAppointmentList; + if (start == null && end == null) { + isDateFilterSelected = false; + filteredAppointmentList.clear(); + for (var element in sourceList) { + if (isUnderFilter(element)) { + filteredAppointmentList.add(element); + } + } + } else { + filteredAppointmentList.clear(); + for (var element in sourceList) { + try { + var dateTime = DateUtil.convertStringToDate(element.appointmentDate).provideDateOnly(); + + if (start != null && end == null) { + if (dateTime.isAtSameMomentAs(start)) { + if (isUnderFilter(element)) { + filteredAppointmentList.add(element); + } + } + } else if (start != null && end != null) { + if ((dateTime.isAfter(start)) && ((dateTime.isBefore(end)) || ((dateTime.isAtSameMomentAs(end))))) { + if (isUnderFilter(element)) { + filteredAppointmentList.add(element); + } + } + } + } catch (e) {} + } + } + notifyListeners(); + } + + void filterTheListAsPerSelection() { + getSelectedDateRange(start, end); + } + + bool isUnderFilter(PatientAppointmentHistoryResponseModel element) { + if (selectedFilter == null || selectedFilter!.isEmpty) return true; + for (var filter in selectedFilter ?? []) { + switch (filter) { + case AppointmentListingFilters.WALKIN: + if (element.isLiveCareAppointment == false) return true; + case AppointmentListingFilters.BOOKED: + if (AppointmentType.isBooked(element)) return true; + + case AppointmentListingFilters.CONFIRMED: + if (AppointmentType.isConfirmed(element)) return true; + + case AppointmentListingFilters.ARRIVED: + if (AppointmentType.isArrived(element)) return true; + + case AppointmentListingFilters.LIVECARE: + if (element.isLiveCareAppointment == true) return true; + + case AppointmentListingFilters.DATESELECTION: + } + } + return false; + } + + Future getTamaraInstallmentsDetails({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.getTamaraInstallmentsDetails(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + getTamaraInstallmentsDetailsResponseModel = apiResponse.data!; + isTamaraDetailsLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + }, + ); + } + + Future getActiveAppointmentsCount({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.getActiveAppointmentsCount(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + activeAppointmentsCount = 0; + } else if (apiResponse.messageStatus == 1) { + activeAppointmentsCount = apiResponse.data ?? 0; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future isDoctorAvailable({required int projectID, required int doctorId, required int clinicId, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.isDoctorAvailable(projectID: projectID, doctorID: doctorId, clinicID: clinicId); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse.data); + } + } + }, + ); + } + + Future getAskDoctorRequestTypes({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.getAskDoctorRequestTypes(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + } else if (apiResponse.messageStatus == 1) { + askDoctorRequestTypeList = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse.data); + } + } + }, + ); + } + + Future sendAskDocCallRequest({ + required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + required String requestType, + required String remarks, + required String userMobileNumber, + Function(dynamic)? onSuccess, + Function(String)? onError, + }) async { + final result = await myAppointmentsRepo.sendAskDocCallRequest( + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, requestType: requestType, remarks: remarks, userMobileNumber: userMobileNumber); + + result.fold( + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + await errorHandlerService.handleError(failure: failure); + if (onError != null) onError(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse.data); + } + } + }, + ); + } +} diff --git a/lib/features/my_appointments/utils/appointment_type.dart b/lib/features/my_appointments/utils/appointment_type.dart new file mode 100644 index 0000000..abc23dc --- /dev/null +++ b/lib/features/my_appointments/utils/appointment_type.dart @@ -0,0 +1,121 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class AppointmentType { + static var BOOKED = 0; + static const BOOKED_STR = 'booked'; + static var CONFIRMED = 42; + static const CONFIRMED_STR = 'confirmed'; + static var ARRIVED = 43; + static const ARRIVED_STR = 'arrived'; + + static bool isConfirmed(PatientAppointmentHistoryResponseModel appo) { + return AppointmentType.isValid(appo) && appo.patientStatusType == AppointmentType.CONFIRMED; + } + + static bool isBooked(PatientAppointmentHistoryResponseModel appo) { + return AppointmentType.isValid(appo) && appo.patientStatusType == AppointmentType.BOOKED; + } + + static bool isArrived(PatientAppointmentHistoryResponseModel appo) { + return AppointmentType.isValid(appo) && appo.patientStatusType == AppointmentType.ARRIVED; + } + + static isValid(appo) { + return appo != null && appo.patientStatusType != null; + } + + static String getAppointmentStatusType(int appoStatus) { + switch (appoStatus) { + case 0: + return LocaleKeys.booked.tr(); + case 42: + return LocaleKeys.confirmed.tr(); + case 43: + return LocaleKeys.arrived.tr(); + default: + return LocaleKeys.booked.tr(); + } + } + + static Color getNextActionTextColor(nextAction) { + switch (nextAction) { + case 0: + return AppColors.successColor; + case 10: + return AppColors.successColor; + case 15: + return AppColors.textColor; + case 20: + return AppColors.infoColor; + case 50: + return AppColors.successColor; + case 90: + return AppColors.alertColor; + default: + return AppColors.successColor; + } + } + + static Color getNextActionButtonColor(nextAction) { + switch (nextAction) { + case 0: + return AppColors.successColor; + case 10: + return AppColors.successColor; + case 15: + return AppColors.greyColor; + case 20: + return AppColors.infoColor; + case 50: + return AppColors.successColor; + case 90: + return AppColors.alertColor; + default: + return AppColors.successColor; + } + } + + static String getNextActionText(nextAction) { + switch (nextAction) { + case 0: + return "No Action".needTranslation; + case 10: + return LocaleKeys.confirm.tr(); + case 15: + return LocaleKeys.pendingPayment.tr(); + case 20: + return LocaleKeys.payNow.tr(); + case 50: + return LocaleKeys.confirmLiveCare.tr(); + case 90: + return LocaleKeys.checkinOption.tr(); + default: + return "No Action".needTranslation; + } + } + + static String getNextActionIcon(nextAction) { + switch (nextAction) { + case 0: + return AppAssets.checkmark_icon; + case 10: + return AppAssets.confirm_appointment_icon; + case 15: + return AppAssets.appointment_pay_icon; + case 20: + return AppAssets.appointment_pay_icon; + case 50: + return AppAssets.confirm_appointment_icon; + case 90: + return AppAssets.appointment_checkin_icon; + default: + return AppAssets.checkmark_icon; + } + } +} diff --git a/lib/features/payfort/models/apple_pay_request_insert_model.dart b/lib/features/payfort/models/apple_pay_request_insert_model.dart new file mode 100644 index 0000000..6a7f1ac --- /dev/null +++ b/lib/features/payfort/models/apple_pay_request_insert_model.dart @@ -0,0 +1,187 @@ +class ApplePayInsertRequest { + String? clientRequestID; + int? clinicID; + String? currency; + String? customerEmail; + dynamic customerID; + String? customerName; + String? deviceToken; + String? voipToken; + int? doctorID; + String? projectID; + String? serviceID; + int? channelID; + dynamic patientID; + int? patientTypeID; + int? patientOutSA; + dynamic appointmentDate; + int? appointmentNo; + String? orderDescription; + String? liveServiceID; + String? latitude; + String? longitude; + String? amount; + String? isSchedule; + String? language; + int? userName; + String? responseContinueURL; + String? backClickUrl; + String? paymentOption; + double? versionID; + int? channel; + int? languageID; + String? iPAdress; + String? generalid; + String? sessionID; + bool? isDentalAllowedBackend; + int? deviceTypeID; + bool? isMobSDK; + String? merchantReference; + String? merchantIdentifier; + String? commandType; + String? signature; + String? accessCode; + String? shaRequestPhrase; + String? shaResponsePhrase; + String? returnURL; + + ApplePayInsertRequest( + {this.clientRequestID, + this.clinicID, + this.currency, + this.customerEmail, + this.customerID, + this.customerName, + this.deviceToken, + this.voipToken, + this.doctorID, + this.projectID, + this.serviceID, + this.channelID, + this.patientID, + this.patientTypeID, + this.patientOutSA, + this.appointmentDate, + this.appointmentNo, + this.orderDescription, + this.liveServiceID, + this.latitude, + this.longitude, + this.amount, + this.isSchedule, + this.language, + this.userName, + this.responseContinueURL, + this.backClickUrl, + this.paymentOption, + this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.isMobSDK, + this.merchantReference, + this.merchantIdentifier, + this.commandType, + this.signature, + this.accessCode, + this.shaRequestPhrase, + this.shaResponsePhrase, + this.returnURL, + }); + + ApplePayInsertRequest.fromJson(Map json) { + clientRequestID = json['ClientRequestID']; + clinicID = json['ClinicID']; + currency = json['Currency']; + customerEmail = json['CustomerEmail']; + customerID = json['CustomerID']; + customerName = json['CustomerName']; + deviceToken = json['DeviceToken']; + voipToken = json['VoipToken']; + doctorID = json['DoctorID']; + projectID = json['ProjectID']; + serviceID = json['Service_ID']; + channelID = json['Channel_ID']; + patientID = json['PatientID']; + patientTypeID = json['PatientTypeID']; + patientOutSA = json['PatientOutSA']; + appointmentDate = json['AppointmentDate']; + appointmentNo = json['AppointmentNo']; + orderDescription = json['OrderDescription']; + liveServiceID = json['Live_ServiceID']; + latitude = json['Latitude']; + longitude = json['Longitude']; + amount = json['Amount']; + isSchedule = json['IsSchedule']; + language = json['Language']; + userName = json['userName']; + responseContinueURL = json['ResponseContinueURL']; + backClickUrl = json['BackClickUrl']; + paymentOption = json['PaymentOption']; + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + } + + Map toJson() { + final Map data = new Map(); + data['ClientRequestID'] = this.clientRequestID; + data['ClinicID'] = this.clinicID; + data['Currency'] = this.currency; + data['CustomerEmail'] = this.customerEmail; + data['CustomerID'] = this.customerID; + data['CustomerName'] = this.customerName; + data['DeviceToken'] = this.deviceToken; + data['VoipToken'] = this.voipToken; + data['DoctorID'] = this.doctorID; + data['ProjectID'] = this.projectID; + data['Service_ID'] = this.serviceID; + data['Channel_ID'] = this.channelID; + data['PatientID'] = this.patientID; + data['PatientId'] = this.patientID; + data['PatientTypeID'] = this.patientTypeID; + data['PatientOutSA'] = this.patientOutSA; + data['AppointmentDate'] = this.appointmentDate; + data['AppointmentNo'] = this.appointmentNo; + data['OrderDescription'] = this.orderDescription; + data['Live_ServiceID'] = this.liveServiceID; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['Amount'] = this.amount; + data['IsSchedule'] = this.isSchedule; + data['Language'] = this.language; + data['userName'] = this.userName; + data['ResponseContinueURL'] = this.responseContinueURL; + data['BackClickUrl'] = this.backClickUrl; + data['PaymentOption'] = this.paymentOption; + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + + data['IsMobSDK'] = this.isMobSDK; + data['Merchant_Reference'] = this.merchantReference; + data['Merchant_Identifier'] = this.merchantIdentifier; + data['CommandType'] = this.commandType; + data['Signature'] = this.signature; + data['Access_code'] = this.accessCode; + data['SHA_RequestPhase'] = this.shaRequestPhrase; + data['SHA_ResponsePhase'] = this.shaResponsePhrase; + data['ReturnURL'] = this.returnURL; + + return data; + } +} diff --git a/lib/features/payfort/models/payfort_check_payment_status_response_model.dart b/lib/features/payfort/models/payfort_check_payment_status_response_model.dart new file mode 100644 index 0000000..78603b7 --- /dev/null +++ b/lib/features/payfort/models/payfort_check_payment_status_response_model.dart @@ -0,0 +1,60 @@ +class PayfortCheckPaymentStatusResponseModel { + num? amount; + String? cardNumber; + dynamic clientRequsetID; + dynamic errorMessage; + String? fortId; + String? merchantReference; + dynamic orderDescription; + dynamic patientFileNumber; + String? paymentMethod; + dynamic rRN; + String? responseMessage; + dynamic vidaAdvancedNumber; + + PayfortCheckPaymentStatusResponseModel( + {this.amount, + this.cardNumber, + this.clientRequsetID, + this.errorMessage, + this.fortId, + this.merchantReference, + this.orderDescription, + this.patientFileNumber, + this.paymentMethod, + this.rRN, + this.responseMessage, + this.vidaAdvancedNumber}); + + PayfortCheckPaymentStatusResponseModel.fromJson(Map json) { + amount = json['Amount']; + cardNumber = json['CardNumber']; + clientRequsetID = json['ClientRequsetID']; + errorMessage = json['ErrorMessage']; + fortId = json['Fort_id']; + merchantReference = json['Merchant_Reference']; + orderDescription = json['OrderDescription']; + patientFileNumber = json['PatientFileNumber']; + paymentMethod = json['PaymentMethod']; + rRN = json['RRN']; + responseMessage = json['Response_Message']; + vidaAdvancedNumber = json['VidaAdvancedNumber']; + } + + Map toJson() { + final Map data = new Map(); + data['Amount'] = this.amount; + data['CardNumber'] = this.cardNumber; + data['ClientRequsetID'] = this.clientRequsetID; + data['ErrorMessage'] = this.errorMessage; + data['Fort_id'] = this.fortId; + data['Merchant_Reference'] = this.merchantReference; + data['OrderDescription'] = this.orderDescription; + data['PatientFileNumber'] = this.patientFileNumber; + data['PaymentMethod'] = this.paymentMethod; + data['RRN'] = this.rRN; + data['Response_Message'] = this.responseMessage; + data['VidaAdvancedNumber'] = this.vidaAdvancedNumber; + return data; + } +} diff --git a/lib/features/payfort/models/payfort_project_details_resp_model.dart b/lib/features/payfort/models/payfort_project_details_resp_model.dart new file mode 100644 index 0000000..b4d9eae --- /dev/null +++ b/lib/features/payfort/models/payfort_project_details_resp_model.dart @@ -0,0 +1,37 @@ +class PayfortProjectDetailsRespModel { + String? accessCode; + int? integrationId; + String? merchantIdentifier; + int? projectID; + String? projectName; + int? servID; + String? shaRequest; + String? shaResponse; + String? signature; + + PayfortProjectDetailsRespModel({this.accessCode, this.integrationId, this.merchantIdentifier, this.projectID, this.projectName, this.servID, this.shaRequest, this.shaResponse, this.signature}); + + PayfortProjectDetailsRespModel.fromJson(Map json) { + accessCode = json['AccessCode']; + integrationId = json['Integration_Id']; + merchantIdentifier = json['MerchantIdentifier']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + servID = json['ServID']; + shaRequest = json['Sha_Request']; + shaResponse = json['Sha_Response']; + } + + Map toJson() { + final Map data = new Map(); + data['AccessCode'] = this.accessCode; + data['Integration_Id'] = this.integrationId; + data['MerchantIdentifier'] = this.merchantIdentifier; + data['ProjectID'] = this.projectID; + data['ProjectName'] = this.projectName; + data['ServID'] = this.servID; + data['Sha_Request'] = this.shaRequest; + data['Sha_Response'] = this.shaResponse; + return data; + } +} diff --git a/lib/features/payfort/models/sdk_token_response_model.dart b/lib/features/payfort/models/sdk_token_response_model.dart new file mode 100644 index 0000000..a0f48a4 --- /dev/null +++ b/lib/features/payfort/models/sdk_token_response_model.dart @@ -0,0 +1,55 @@ +class SdkTokenResponse { + SdkTokenResponse({ + this.responseCode, + this.deviceId, + this.responseMessage, + this.serviceCommand, + this.sdkToken, + this.signature, + this.merchantIdentifier, + this.accessCode, + this.language, + this.status, + }); + + String? responseCode; + String? deviceId; + String? responseMessage; + String? serviceCommand; + String? sdkToken; + String? signature; + String? merchantIdentifier; + String? accessCode; + String? language; + String? status; + + factory SdkTokenResponse.fromMap(Map data) { + return SdkTokenResponse( + responseCode: data['response_code'], + deviceId: data['device_id'], + responseMessage: data['response_message'], + serviceCommand: data['service_command'], + sdkToken: data['sdk_token'], + signature: data['signature'], + merchantIdentifier: data['merchant_identifier'], + accessCode: data['access_code'], + language: data['language'], + status: data['status'], + ); + } + + Map toMap() { + return { + 'response_code': responseCode, + 'device_id': deviceId, + 'response_message': responseMessage, + 'service_command': serviceCommand, + 'sdk_token': sdkToken, + 'signature': signature, + 'merchant_identifier': merchantIdentifier, + 'access_code': accessCode, + 'language': language, + 'status': status, + }; + } +} diff --git a/lib/features/payfort/payfort_repo.dart b/lib/features/payfort/payfort_repo.dart new file mode 100644 index 0000000..c00b01c --- /dev/null +++ b/lib/features/payfort/payfort_repo.dart @@ -0,0 +1,294 @@ +import 'package:amazon_payfort/amazon_payfort.dart'; +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/payfort_check_payment_status_response_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/payfort_project_details_resp_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/sdk_token_response_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class PayfortRepo { + Future>> getPayfortConfigurations({int? serviceId, int? projectId, int integrationId = 2}); + + Future>> applePayRequestInsert({required ApplePayInsertRequest applePayInsertRequest}); + + Future>> generateSdkSignatureFromAPI({required SdkTokenRequest tokenRequest}); + + Future>> checkPaymentStatus({required String transactionID}); + + Future>> checkTamaraPaymentStatus({required String transactionID}); + + Future>> markAppointmentAsTamaraPaid({required int projectID, required int appointmentNo}); + + Future>> updateTamaraRequestStatus( + {required String responseMessage, required String status, required String clientRequestID, required String tamaraOrderID}); + + Future>> getTamaraInstallmentsDetails(); +} + +class PayfortRepoImp implements PayfortRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + PayfortRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>> getPayfortConfigurations({int? serviceId, int? projectId, int integrationId = 2}) async { + Map body = {"Integration_Id": integrationId, "ServID": serviceId, "ProjectID": projectId}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post(getPayFortProjectDetails, body: body, onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response; + if (list == null || list.isEmpty) { + throw Exception("payfort list is empty"); + } + + final applePayConfigurationResponse = PayfortProjectDetailsRespModel.fromJson(list[0]); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: applePayConfigurationResponse, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, isAllowAny: true, isPaymentServices: true); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> applePayRequestInsert({required ApplePayInsertRequest applePayInsertRequest}) async { + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post(APPLE_PAY_INSERT_REQUEST, body: applePayInsertRequest.toJson(), onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response["result"], + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, isAllowAny: true, isPaymentServices: true); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> generateSdkSignatureFromAPI({required SdkTokenRequest tokenRequest}) async { + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post(ApiConsts.payFortEnvironment.paymentApi, body: tokenRequest.asRequest(), onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final sdkTokenResponse = SdkTokenResponse.fromMap(response); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: sdkTokenResponse, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, isAllowAny: true, isExternal: true, isPaymentServices: true); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> checkPaymentStatus({required String transactionID}) async { + Map body = {"ClientRequestID": transactionID, "IsPharmacy": false}; + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post(CHECK_PAYMENT_STATUS, body: body, onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final paymentStatusResponse = PayfortCheckPaymentStatusResponseModel.fromJson(response); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: paymentStatusResponse, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, isAllowAny: true, isPaymentServices: true); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> checkTamaraPaymentStatus({required String transactionID}) async { + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.get( + '${ApiConsts.GET_TAMARA_PAYMENT_STATUS}$transactionID', + isExternal: true, + isAllowAny: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> updateTamaraRequestStatus({required String responseMessage, required String status, required String clientRequestID, required String tamaraOrderID}) async { + Map body = { + "Response_Message": responseMessage, + "ClientRequestID": clientRequestID, + "Status": status, + "FortID": tamaraOrderID, // Tamara order ID + "LanguageID": 1, + "Installments_Number": 3, + }; + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post(UPDATE_TAMARA_STATUS, body: body, onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, isAllowAny: true, isPaymentServices: true); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> markAppointmentAsTamaraPaid({required int projectID, required int appointmentNo}) async { + Map body = {"ProjectID": projectID, "AppointmentNo": appointmentNo, "LanguageID": 1}; + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post(MARK_APPOINTMENT_TAMARA_STATUS, body: body, onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, isAllowAny: true, isPaymentServices: true); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getTamaraInstallmentsDetails() async { + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.get( + ApiConsts.GET_TAMARA_INSTALLMENTS_URL, + isExternal: true, + isAllowAny: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response; + + final tamaraInstallmentsList = GetTamaraInstallmentsDetailsResponseModel.fromJson(list.first); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: tamaraInstallmentsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + +} diff --git a/lib/features/payfort/payfort_view_model.dart b/lib/features/payfort/payfort_view_model.dart new file mode 100644 index 0000000..5910473 --- /dev/null +++ b/lib/features/payfort/payfort_view_model.dart @@ -0,0 +1,273 @@ +import 'package:amazon_payfort/amazon_payfort.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/payfort_check_payment_status_response_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/payfort_project_details_resp_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/sdk_token_response_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/payfort_repo.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:network_info_plus/network_info_plus.dart'; + +class PayfortViewModel extends ChangeNotifier { + PayfortRepo payfortRepo; + ErrorHandlerService errorHandlerService; + + bool isApplePayConfigurationLoading = false; + + PayfortProjectDetailsRespModel? payfortProjectDetailsRespModel; + PayfortCheckPaymentStatusResponseModel? payfortCheckPaymentStatusResponseModel; + late AmazonPayfort _payfort; + final NetworkInfo _info = NetworkInfo(); + + GetTamaraInstallmentsDetailsResponseModel? getTamaraInstallmentsDetailsResponseModel; + bool isTamaraDetailsLoading = false; + + PayfortViewModel({required this.payfortRepo, required this.errorHandlerService}); + + setIsApplePayConfigurationLoading(bool value) { + isApplePayConfigurationLoading = value; + notifyListeners(); + } + + initPayfortViewModel() async { + _payfort = AmazonPayfort.instance; + await AmazonPayfort.initialize( + PayFortOptions(environment: ApiConsts.payFortEnvironment), + ); + notifyListeners(); + } + + Future getPayfortConfigurations({int? serviceId, int? projectId, int integrationId = 2, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await payfortRepo.getPayfortConfigurations(serviceId: serviceId, projectId: projectId, integrationId: integrationId); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + payfortProjectDetailsRespModel = apiResponse.data!; + // isApplePayConfigurationLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future applePayRequestInsert({required ApplePayInsertRequest applePayInsertRequest, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await payfortRepo.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + // payfortProjectDetailsRespModel = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future checkPaymentStatus({required String transactionID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await payfortRepo.checkPaymentStatus(transactionID: transactionID); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + payfortCheckPaymentStatusResponseModel = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future checkTamaraPaymentStatus({required String transactionID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await payfortRepo.checkTamaraPaymentStatus(transactionID: transactionID); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + print(apiResponse.data); + if (onSuccess != null) { + onSuccess(apiResponse); + } + // } + }, + ); + } + + Future updateTamaraRequestStatus( + {required String responseMessage, required String status, required String clientRequestID, required String tamaraOrderID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await payfortRepo.updateTamaraRequestStatus(responseMessage: responseMessage, status: status, clientRequestID: clientRequestID, tamaraOrderID: tamaraOrderID); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + print(apiResponse.data); + if (onSuccess != null) { + onSuccess(apiResponse); + } + }, + ); + } + + Future _generateSdkResponse({ + String? applePayAccessCode, + String? merchantIdentifier, + String? applePayShaType, + String? applePayShaRequestPhrase, + }) async { + var sdkTokenResponse; + try { + String? deviceId = await _payfort.getDeviceId(); + + /// Step 2: Generate the Signature + SdkTokenRequest tokenRequest = SdkTokenRequest( + accessCode: applePayAccessCode!, + deviceId: deviceId ?? '', + merchantIdentifier: merchantIdentifier!, + ); + + String? signature = await _payfort.generateSignature( + shaType: applePayShaType!, + concatenatedString: tokenRequest.toConcatenatedString(applePayShaRequestPhrase!), + ); + + tokenRequest = tokenRequest.copyWith(signature: signature); + + /// Step 3: Generate the SDK Token + final result = await payfortRepo.generateSdkSignatureFromAPI(tokenRequest: tokenRequest); + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + // payfortProjectDetailsRespModel = apiResponse.data!; + sdkTokenResponse = apiResponse.data; + isApplePayConfigurationLoading = false; + notifyListeners(); + } + }, + ); + } catch (e) { + print("Error here: ${e.toString()}"); + } + return sdkTokenResponse; + } + + Future paymentWithApplePay({ + SucceededCallback? onSucceeded, + FailedCallback? onFailed, + String? customerName, + String? customerEmail, + String? orderDescription, + num? orderAmount, + String? merchantIdentifier, + String? applePayAccessCode, + String? applePayShaRequestPhrase, + String? merchantReference, + String currency = "SAR", + String applePayShaType = "SHA-256", + String countryIsoCode = "SA", + }) async { + try { + SdkTokenResponse? sdkTokenResponse = await _generateSdkResponse( + applePayAccessCode: applePayAccessCode, + merchantIdentifier: merchantIdentifier, + applePayShaType: applePayShaType, + applePayShaRequestPhrase: applePayShaRequestPhrase, + ); + + if (sdkTokenResponse != null && sdkTokenResponse.sdkToken == null) { + onFailed!((sdkTokenResponse.responseMessage ?? '') as PayFortFailureResult); + return; + } + + /// Step 4: Processing Payment [Don't multiply with 100] + /// Amount value send always round ex. [100] not [100.00, 100.21] + FortRequest request = FortRequest( + command: FortCommand.purchase, + amount: orderAmount!, + customerName: customerName!, + customerEmail: customerEmail!, + // orderDescription: orderDescription!, + orderDescription: "Dr. Sulaiman Al Habib Hospital", + sdkToken: sdkTokenResponse?.sdkToken ?? '', + merchantReference: merchantReference!, + currency: currency, + customerIp: (await _info.getWifiIP() ?? ''), + language: 'en'); + + isApplePayConfigurationLoading = false; + notifyListeners(); + LoaderBottomSheet.hideLoader(); + + _payfort.callPayFortForApplePay( + request: request, + countryIsoCode: countryIsoCode, + applePayMerchantId: ApiConsts.applePayMerchantId, + callback: ApplePayResultCallback( + onSucceeded: onSucceeded!, + onFailed: onFailed!, + ), + ); + } catch (e) { + onFailed!(e.toString() as PayFortFailureResult); + } + } + + Future markAppointmentAsTamaraPaid({required int projectID, required int appointmentNo, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await payfortRepo.markAppointmentAsTamaraPaid(projectID: projectID, appointmentNo: appointmentNo); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + print(apiResponse.data); + if (onSuccess != null) { + onSuccess(apiResponse); + } + }, + ); + } + + Future getTamaraInstallmentsDetails({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await payfortRepo.getTamaraInstallmentsDetails(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + getTamaraInstallmentsDetailsResponseModel = apiResponse.data!; + isTamaraDetailsLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + }, + ); + } + +} diff --git a/lib/features/prescriptions/models/resp_models/patient_prescriptions_response_model.dart b/lib/features/prescriptions/models/resp_models/patient_prescriptions_response_model.dart new file mode 100644 index 0000000..7b1d879 --- /dev/null +++ b/lib/features/prescriptions/models/resp_models/patient_prescriptions_response_model.dart @@ -0,0 +1,174 @@ +class PatientPrescriptionsResponseModel { + String? setupID; + int? projectID; + int? patientID; + int? appointmentNo; + String? appointmentDate; + String? doctorName; + String? clinicDescription; + String? name; + int? episodeID; + num? actualDoctorRate; + int? admission; + int? clinicID; + String? companyName; + num? decimalDoctorRate; + String? despensedStatus; + String? dischargeDate; + int? dischargeNo; + int? doctorID; + String? doctorImageURL; + num? doctorRate; + num? doctorStarsRate; + String? doctorTitle; + int? gender; + String? genderDescription; + bool? isActiveDoctorProfile; + bool? isDoctorAllowVedioCall; + bool? isExecludeDoctor; + bool? isHomeMedicineDeliverySupported; + bool? isInOutPatient; + String? isInOutPatientDescription; + String? isInOutPatientDescriptionN; + bool? isInsurancePatient; + bool? isLiveCareAppointment; + String? nationalityFlagURL; + int? noOfPatientsRate; + String? qR; + + // List? speciality; + String? strAppointmentDate; + + PatientPrescriptionsResponseModel( + {this.setupID, + this.projectID, + this.patientID, + this.appointmentNo, + this.appointmentDate, + this.doctorName, + this.clinicDescription, + this.name, + this.episodeID, + this.actualDoctorRate, + this.admission, + this.clinicID, + this.companyName, + this.decimalDoctorRate, + this.despensedStatus, + this.dischargeDate, + this.dischargeNo, + this.doctorID, + this.doctorImageURL, + this.doctorRate, + this.doctorStarsRate, + this.doctorTitle, + this.gender, + this.genderDescription, + this.isActiveDoctorProfile, + this.isDoctorAllowVedioCall, + this.isExecludeDoctor, + this.isHomeMedicineDeliverySupported, + this.isInOutPatient, + this.isInOutPatientDescription, + this.isInOutPatientDescriptionN, + this.isInsurancePatient, + this.isLiveCareAppointment, + this.nationalityFlagURL, + this.noOfPatientsRate, + this.qR, + // this.speciality, + this.strAppointmentDate}); + + PatientPrescriptionsResponseModel.fromJson(Map json) { + setupID = json['SetupID']; + projectID = json['ProjectID']; + patientID = json['PatientID']; + appointmentNo = json['AppointmentNo']; + appointmentDate = json['AppointmentDate']; + doctorName = json['DoctorName']; + clinicDescription = json['ClinicDescription']; + name = json['Name']; + episodeID = json['EpisodeID']; + actualDoctorRate = json['ActualDoctorRate']; + admission = json['Admission']; + clinicID = json['ClinicID']; + companyName = json['CompanyName']; + decimalDoctorRate = json['DecimalDoctorRate']; + despensedStatus = json['Despensed_Status']; + dischargeDate = json['DischargeDate']; + dischargeNo = json['DischargeNo']; + doctorID = json['DoctorID']; + doctorImageURL = json['DoctorImageURL']; + doctorRate = json['DoctorRate']; + doctorStarsRate = json['DoctorStarsRate']; + doctorTitle = json['DoctorTitle']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + isActiveDoctorProfile = json['IsActiveDoctorProfile']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isExecludeDoctor = json['IsExecludeDoctor']; + isHomeMedicineDeliverySupported = json['IsHomeMedicineDeliverySupported']; + isInOutPatient = json['IsInOutPatient']; + isInOutPatientDescription = json['IsInOutPatientDescription']; + isInOutPatientDescriptionN = json['IsInOutPatientDescriptionN']; + isInsurancePatient = json['IsInsurancePatient']; + isLiveCareAppointment = json['IsLiveCareAppointment']; + nationalityFlagURL = json['NationalityFlagURL']; + noOfPatientsRate = json['NoOfPatientsRate']; + qR = json['QR']; + // speciality = json['Speciality'].cast(); + strAppointmentDate = json['StrAppointmentDate']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['PatientID'] = this.patientID; + data['AppointmentNo'] = this.appointmentNo; + data['AppointmentDate'] = this.appointmentDate; + data['DoctorName'] = this.doctorName; + data['ClinicDescription'] = this.clinicDescription; + data['Name'] = this.name; + data['EpisodeID'] = this.episodeID; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['Admission'] = this.admission; + data['ClinicID'] = this.clinicID; + data['CompanyName'] = this.companyName; + data['DecimalDoctorRate'] = this.decimalDoctorRate; + data['Despensed_Status'] = this.despensedStatus; + data['DischargeDate'] = this.dischargeDate; + data['DischargeNo'] = this.dischargeNo; + data['DoctorID'] = this.doctorID; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorRate'] = this.doctorRate; + data['DoctorStarsRate'] = this.doctorStarsRate; + data['DoctorTitle'] = this.doctorTitle; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['IsHomeMedicineDeliverySupported'] = this.isHomeMedicineDeliverySupported; + data['IsInOutPatient'] = this.isInOutPatient; + data['IsInOutPatientDescription'] = this.isInOutPatientDescription; + data['IsInOutPatientDescriptionN'] = this.isInOutPatientDescriptionN; + data['IsInsurancePatient'] = this.isInsurancePatient; + data['IsLiveCareAppointment'] = this.isLiveCareAppointment; + data['NationalityFlagURL'] = this.nationalityFlagURL; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['QR'] = this.qR; + // data['Speciality'] = this.speciality; + data['StrAppointmentDate'] = this.strAppointmentDate; + return data; + } +} + +class PrescriptionsList { + String? filterName = ""; + List? prescriptionsList = []; + + PrescriptionsList({this.filterName, PatientPrescriptionsResponseModel? prescriptions}) { + prescriptionsList!.add(prescriptions!); + } +} diff --git a/lib/features/prescriptions/models/resp_models/prescription_detail_response_model.dart b/lib/features/prescriptions/models/resp_models/prescription_detail_response_model.dart new file mode 100644 index 0000000..b35cfef --- /dev/null +++ b/lib/features/prescriptions/models/resp_models/prescription_detail_response_model.dart @@ -0,0 +1,147 @@ +class PrescriptionDetailResponseModel { + String? address; + num? appointmentNo; + String? clinic; + dynamic companyName; + num? days; + String? doctorName; + num? doseDailyQuantity; + String? frequency; + num? frequencyNumber; + dynamic image; + dynamic imageExtension; + String? imageSRCUrl; + dynamic imageString; + String? imageThumbUrl; + String? isCovered; + String? itemDescription; + num? itemID; + String? orderDate; + num? patientID; + String? patientName; + String? phoneOffice1; + dynamic prescriptionQR; + num? prescriptionTimes; + dynamic productImage; + dynamic productImageBase64; + String? productImageString; + num? projectID; + String? projectName; + String? remarks; + String? route; + String? sKU; + num? scaleOffset; + String? startDate; + bool? hasReminder; + + PrescriptionDetailResponseModel( + {this.address, + this.appointmentNo, + this.clinic, + this.companyName, + this.days, + this.doctorName, + this.doseDailyQuantity, + this.frequency, + this.frequencyNumber, + this.image, + this.imageExtension, + this.imageSRCUrl, + this.imageString, + this.imageThumbUrl, + this.isCovered, + this.itemDescription, + this.itemID, + this.orderDate, + this.patientID, + this.patientName, + this.phoneOffice1, + this.prescriptionQR, + this.prescriptionTimes, + this.productImage, + this.productImageBase64, + this.productImageString, + this.projectID, + this.projectName, + this.remarks, + this.route, + this.sKU, + this.scaleOffset, + this.startDate, + this.hasReminder = false}); + + PrescriptionDetailResponseModel.fromJson(Map json) { + address = json['Address']; + appointmentNo = json['AppointmentNo']; + clinic = json['Clinic']; + companyName = json['CompanyName']; + days = json['Days']; + doctorName = json['DoctorName']; + doseDailyQuantity = json['DoseDailyQuantity']; + frequency = json['Frequency']; + frequencyNumber = json['FrequencyNumber']; + image = json['Image']; + imageExtension = json['ImageExtension']; + imageSRCUrl = json['ImageSRCUrl']; + imageString = json['ImageString']; + imageThumbUrl = json['ImageThumbUrl']; + isCovered = json['IsCovered']; + itemDescription = json['ItemDescription']; + itemID = json['ItemID']; + orderDate = json['OrderDate']; + patientID = json['PatientID']; + patientName = json['PatientName']; + phoneOffice1 = json['PhoneOffice1']; + prescriptionQR = json['PrescriptionQR']; + prescriptionTimes = json['PrescriptionTimes']; + productImage = json['ProductImage']; + productImageBase64 = json['ProductImageBase64']; + productImageString = json['ProductImageString']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + remarks = json['Remarks']; + route = json['Route']; + sKU = json['SKU']; + scaleOffset = json['ScaleOffset']; + startDate = json['StartDate']; + hasReminder = false; + } + + Map toJson() { + final Map data = new Map(); + data['Address'] = address; + data['AppointmentNo'] = appointmentNo; + data['Clinic'] = clinic; + data['CompanyName'] = companyName; + data['Days'] = days; + data['DoctorName'] = doctorName; + data['DoseDailyQuantity'] = doseDailyQuantity; + data['Frequency'] = frequency; + data['FrequencyNumber'] = frequencyNumber; + data['Image'] = image; + data['ImageExtension'] = imageExtension; + data['ImageSRCUrl'] = imageSRCUrl; + data['ImageString'] = imageString; + data['ImageThumbUrl'] = imageThumbUrl; + data['IsCovered'] = isCovered; + data['ItemDescription'] = itemDescription; + data['ItemID'] = itemID; + data['OrderDate'] = orderDate; + data['PatientID'] = patientID; + data['PatientName'] = patientName; + data['PhoneOffice1'] = phoneOffice1; + data['PrescriptionQR'] = prescriptionQR; + data['PrescriptionTimes'] = prescriptionTimes; + data['ProductImage'] = productImage; + data['ProductImageBase64'] = productImageBase64; + data['ProductImageString'] = productImageString; + data['ProjectID'] = projectID; + data['ProjectName'] = projectName; + data['Remarks'] = remarks; + data['Route'] = route; + data['SKU'] = sKU; + data['ScaleOffset'] = scaleOffset; + data['StartDate'] = startDate; + return data; + } +} diff --git a/lib/features/prescriptions/prescriptions_repo.dart b/lib/features/prescriptions/prescriptions_repo.dart new file mode 100644 index 0000000..2e3f1aa --- /dev/null +++ b/lib/features/prescriptions/prescriptions_repo.dart @@ -0,0 +1,209 @@ +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/patient_prescriptions_response_model.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/prescription_detail_response_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class PrescriptionsRepo { + Future>>> getPatientPrescriptionOrders({required String patientId}); + + Future>>> getPatientPrescriptionDetails({required PatientPrescriptionsResponseModel prescriptionsResponseModel}); + + Future>> getPrescriptionInstructionsPDF({required PatientPrescriptionsResponseModel prescriptionsResponseModel}); + + Future>> getPrescriptionPDF({required PatientPrescriptionsResponseModel prescriptionsResponseModel, required List prescriptionDetailsList}); +} + +class PrescriptionsRepoImp implements PrescriptionsRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + PrescriptionsRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>>> getPatientPrescriptionOrders({required String patientId}) async { + Map mapDevice = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + PRESCRIPTIONS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['PatientPrescriptionList']; + if (list == null || list.isEmpty) { + // throw Exception("lab list is empty"); + } + + final prescriptionOrders = list.map((item) => PatientPrescriptionsResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: prescriptionOrders, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getPatientPrescriptionDetails({required PatientPrescriptionsResponseModel prescriptionsResponseModel}) async { + Map mapDevice = { + "AppointmentNo": prescriptionsResponseModel.appointmentNo.toString(), + "SetupID": prescriptionsResponseModel.setupID, + "EpisodeID": prescriptionsResponseModel.episodeID.toString(), + "ClinicID": prescriptionsResponseModel.clinicID.toString(), + "ProjectID": prescriptionsResponseModel.projectID.toString(), + "DischargeNo": prescriptionsResponseModel.dischargeNo.toString() + }; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + prescriptionsResponseModel.isInOutPatient! ? GET_PRESCRIPTION_REPORT_ENH : GET_PRESCRIPTION_REPORT, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = prescriptionsResponseModel.isInOutPatient! ? response['ListPRM'] : response['INP_GetPrescriptionReport_List']; + if (list == null || list.isEmpty) { + // throw Exception("prescription list is empty"); + } + + final prescriptionOrders = list.map((item) => PrescriptionDetailResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: prescriptionOrders, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> getPrescriptionInstructionsPDF({required PatientPrescriptionsResponseModel prescriptionsResponseModel}) async { + Map mapDevice = { + "AppointmentNo": prescriptionsResponseModel.appointmentNo.toString(), + "SetupID": prescriptionsResponseModel.setupID, + "ClinicID": prescriptionsResponseModel.clinicID.toString(), + "ProjectID": prescriptionsResponseModel.projectID.toString(), + "LocationID": "0", + "SalesInvoiceNo": "0", + "IsTest": false, + "ChannelID": "3", + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_PRESCRIPTION_INSTRUCTIONS_PDF, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final prescriptionPDFURL = response["InvoiceUrl"]; + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: prescriptionPDFURL, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> getPrescriptionPDF({required PatientPrescriptionsResponseModel prescriptionsResponseModel, required List prescriptionDetailsList}) async { + Map mapDevice = { + "AppointmentDate": prescriptionsResponseModel.appointmentDate, + "ClinicName": prescriptionsResponseModel.clinicDescription, + "DoctorName": prescriptionsResponseModel.doctorName, + "ProjectID": prescriptionsResponseModel.projectID, + "DoctorID": prescriptionsResponseModel.doctorID, + "ClinicID": prescriptionsResponseModel.clinicID, + "DateofBirth": Utils.appState.getAuthenticatedUser()!.dateofBirth, + "ListPrescriptions": prescriptionDetailsList, + "PatientIditificationNum": Utils.appState.getAuthenticatedUser()!.patientIdentificationNo, + "PatientMobileNumber": Utils.appState.getAuthenticatedUser()!.mobileNumber, + "PatientName": "${Utils.appState.getAuthenticatedUser()!.firstName!} ${Utils.appState.getAuthenticatedUser()!.lastName!}", + "To": Utils.appState.getAuthenticatedUser()!.emailAddress, + "SetupID": prescriptionsResponseModel.setupID, + "IsDownload": true, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + SEND_PRESCRIPTION_EMAIL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final prescriptionPDFData = response["Base64Data"]; + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: prescriptionPDFData, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/prescriptions/prescriptions_view_model.dart b/lib/features/prescriptions/prescriptions_view_model.dart new file mode 100644 index 0000000..aac25c1 --- /dev/null +++ b/lib/features/prescriptions/prescriptions_view_model.dart @@ -0,0 +1,176 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/patient_prescriptions_response_model.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/prescription_detail_response_model.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_repo.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; + +class PrescriptionsViewModel extends ChangeNotifier { + bool isPrescriptionsOrdersLoading = false; + bool isPrescriptionsDetailsLoading = false; + + PrescriptionsRepo prescriptionsRepo; + ErrorHandlerService errorHandlerService; + + // Prescription Orders Lists + List patientPrescriptionOrders = []; + + List patientPrescriptionOrdersByClinic = []; + List patientPrescriptionOrdersByHospital = []; + List patientPrescriptionOrdersViewList = []; + + // Prescription Details List + List prescriptionDetailsList = []; + + bool isSortByClinic = true; + + String prescriptionInstructionsPDFLink = ""; + + String prescriptionPDFBase64Data = ""; + + PrescriptionsViewModel({required this.prescriptionsRepo, required this.errorHandlerService}); + + initPrescriptionsViewModel() { + patientPrescriptionOrders.clear(); + patientPrescriptionOrdersByClinic.clear(); + patientPrescriptionOrdersByHospital.clear(); + patientPrescriptionOrdersViewList.clear(); + isPrescriptionsOrdersLoading = true; + isSortByClinic = true; + getPatientPrescriptionOrders(); + notifyListeners(); + } + + setPrescriptionsDetailsLoading() { + isPrescriptionsDetailsLoading = true; + prescriptionDetailsList.clear(); + notifyListeners(); + } + + setPrescriptionItemReminder(bool value, PrescriptionDetailResponseModel item) { + int index = prescriptionDetailsList.indexOf(item); + if (index != -1) { + prescriptionDetailsList[index].hasReminder = value; + notifyListeners(); + } + } + + notify() { + notifyListeners(); + } + + setIsSortByClinic(bool value) { + isSortByClinic = value; + if (isSortByClinic) { + patientPrescriptionOrdersViewList = patientPrescriptionOrdersByClinic; + } else { + patientPrescriptionOrdersViewList = patientPrescriptionOrdersByHospital; + } + notifyListeners(); + } + + Future getPatientPrescriptionOrders({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await prescriptionsRepo.getPatientPrescriptionOrders(patientId: "1231755"); + + result.fold( + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + isPrescriptionsOrdersLoading = false; + notifyListeners(); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientPrescriptionOrders = apiResponse.data!; + isPrescriptionsOrdersLoading = false; + + for (var element in patientPrescriptionOrders) { + List prescriptionsByClinic = patientPrescriptionOrdersByClinic.where((elementClinic) => elementClinic.filterName == element.clinicDescription).toList(); + + if (prescriptionsByClinic.isNotEmpty) { + patientPrescriptionOrdersByClinic[patientPrescriptionOrdersByClinic.indexOf(prescriptionsByClinic[0])].prescriptionsList!.add(element); + } else { + patientPrescriptionOrdersByClinic.add(PrescriptionsList(filterName: element.clinicDescription, prescriptions: element)); + } + + List prescriptionsByHospital = patientPrescriptionOrdersByHospital.where((elementClinic) => elementClinic.filterName == element.name).toList(); + + if (prescriptionsByHospital.isNotEmpty) { + patientPrescriptionOrdersByHospital[patientPrescriptionOrdersByHospital.indexOf(prescriptionsByHospital[0])].prescriptionsList!.add(element); + } else { + patientPrescriptionOrdersByHospital.add(PrescriptionsList(filterName: element.name, prescriptions: element)); + } + } + patientPrescriptionOrdersViewList = patientPrescriptionOrdersByClinic; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPrescriptionDetails(PatientPrescriptionsResponseModel prescriptionsResponseModel, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await prescriptionsRepo.getPatientPrescriptionDetails(prescriptionsResponseModel: prescriptionsResponseModel); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + prescriptionDetailsList = apiResponse.data!; + isPrescriptionsDetailsLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPrescriptionInstructionsPDF(PatientPrescriptionsResponseModel prescriptionsResponseModel, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await prescriptionsRepo.getPrescriptionInstructionsPDF(prescriptionsResponseModel: prescriptionsResponseModel); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + prescriptionInstructionsPDFLink = apiResponse.data; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPrescriptionPDFBase64(PatientPrescriptionsResponseModel prescriptionsResponseModel, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await prescriptionsRepo.getPrescriptionPDF(prescriptionsResponseModel: prescriptionsResponseModel, prescriptionDetailsList: prescriptionDetailsList); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + } else if (apiResponse.messageStatus == 1) { + prescriptionPDFBase64Data = apiResponse.data; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } +} diff --git a/lib/features/profile_settings/profile_settings_view_model.dart b/lib/features/profile_settings/profile_settings_view_model.dart new file mode 100644 index 0000000..61acb26 --- /dev/null +++ b/lib/features/profile_settings/profile_settings_view_model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/foundation.dart'; + +class ProfileSettingsViewModel extends ChangeNotifier { + + void notify(){ + notifyListeners(); + } +} diff --git a/lib/features/radiology/models/resp_models/patient_radiology_response_model.dart b/lib/features/radiology/models/resp_models/patient_radiology_response_model.dart new file mode 100644 index 0000000..740c275 --- /dev/null +++ b/lib/features/radiology/models/resp_models/patient_radiology_response_model.dart @@ -0,0 +1,234 @@ +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; + +class PatientRadiologyResponseModel { + String? setupID; + int? projectID; + dynamic patientID; + int? invoiceLineItemNo; + int? invoiceNo; + int? doctorID; + int? clinicID; + DateTime? orderDate; + String? reportData; + String? imageURL; + String? procedureID; + int? appointmentNo; + dynamic dIAPacsURL; + bool? isRead; + String? readOn; + dynamic admissionNo; + bool? isInOutPatient; + int? actualDoctorRate; + dynamic admissionDate; + dynamic admissionNumber; + dynamic appointmentDate; + dynamic appointmentNumber; + dynamic appointmentTime; + String? clinicDescription; + String? dIAPACSURL; + dynamic decimalDoctorRate; + String? description; + String? doctorImageURL; + String? doctorName; + num? doctorRate; + num? doctorStarsRate; + String? doctorTitle; + String? examId; + int? gender; + dynamic genderDescription; + int? invoiceNoVP; + String? invoiceType; + bool? isActiveDoctorProfile; + bool? isExecludeDoctor; + String? isInOutPatientDescription; + String? isInOutPatientDescriptionN; + bool? isLiveCareAppointment; + dynamic nationalityFlagURL; + int? noOfPatientsRate; + int? orderNo; + dynamic procedureName; + String? projectName; + String? qR; + String? reportDataHTML; + String? reportDataTextString; + dynamic strAppointmentDate; + dynamic strOrderDate; + bool? isCVI; + bool? isRadMedicalReport; + dynamic vida3Id; + + PatientRadiologyResponseModel( + {this.setupID, + this.projectID, + this.patientID, + this.invoiceLineItemNo, + this.invoiceNo, + this.doctorID, + this.clinicID, + this.orderDate, + this.reportData, + this.imageURL, + this.procedureID, + this.appointmentNo, + this.dIAPacsURL, + this.isRead, + this.readOn, + this.admissionNo, + this.isInOutPatient, + this.actualDoctorRate, + this.admissionDate, + this.admissionNumber, + this.appointmentDate, + this.appointmentNumber, + this.appointmentTime, + this.clinicDescription, + this.dIAPACSURL, + this.decimalDoctorRate, + this.description, + this.doctorImageURL, + this.doctorName, + this.doctorRate, + this.doctorStarsRate, + this.doctorTitle, + this.examId, + this.gender, + this.genderDescription, + this.invoiceNoVP, + this.invoiceType, + this.isActiveDoctorProfile, + this.isExecludeDoctor, + this.isInOutPatientDescription, + this.isInOutPatientDescriptionN, + this.isLiveCareAppointment, + this.nationalityFlagURL, + this.noOfPatientsRate, + this.orderNo, + this.procedureName, + this.projectName, + this.qR, + this.reportDataHTML, + this.reportDataTextString, + this.strAppointmentDate, + this.strOrderDate, + this.isCVI, + this.isRadMedicalReport, + this.vida3Id}); + + PatientRadiologyResponseModel.fromJson(Map json) { + setupID = json['SetupID']; + projectID = json['ProjectID']; + patientID = json['PatientID']; + invoiceLineItemNo = json['InvoiceLineItemNo']; + invoiceNo = json['InvoiceNo']; + doctorID = json['DoctorID']; + clinicID = json['ClinicID']; + orderDate = DateUtil.convertStringToDate(json['OrderDate']); + reportData = json['ReportData']; + imageURL = json['ImageURL']; + procedureID = json['ProcedureID']; + appointmentNo = json['AppointmentNo']; + dIAPacsURL = json['DIAPacsURL']; + isRead = json['IsRead']; + readOn = json['ReadOn']; + admissionNo = json['AdmissionNo']; + isInOutPatient = json['IsInOutPatient']; + actualDoctorRate = json['ActualDoctorRate']; + admissionDate = json['AdmissionDate']; + admissionNumber = json['AdmissionNumber']; + appointmentDate = json['AppointmentDate']; + appointmentNumber = json['AppointmentNumber']; + appointmentTime = json['AppointmentTime']; + clinicDescription = json['ClinicDescription']; + dIAPACSURL = json['DIA_PACS_URL']; + decimalDoctorRate = json['DecimalDoctorRate']; + description = json['Description']; + doctorImageURL = json['DoctorImageURL']; + doctorName = json['DoctorName']; + doctorRate = json['DoctorRate']; + doctorStarsRate = json['DoctorStarsRate']; + doctorTitle = json['DoctorTitle']; + examId = json['Exam_id']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + invoiceNoVP = json['InvoiceNo_VP']; + invoiceType = json['InvoiceType']; + isActiveDoctorProfile = json['IsActiveDoctorProfile']; + isExecludeDoctor = json['IsExecludeDoctor']; + isInOutPatientDescription = json['IsInOutPatientDescription']; + isInOutPatientDescriptionN = json['IsInOutPatientDescriptionN']; + isLiveCareAppointment = json['IsLiveCareAppointment']; + nationalityFlagURL = json['NationalityFlagURL']; + noOfPatientsRate = json['NoOfPatientsRate']; + orderNo = json['OrderNo']; + procedureName = json['ProcedureName']; + projectName = json['ProjectName']; + qR = json['QR']; + reportDataHTML = json['ReportDataHTML']; + reportDataTextString = json['ReportDataTextString']; + strAppointmentDate = json['StrAppointmentDate']; + strOrderDate = json['StrOrderDate']; + isCVI = json['isCVI']; + isRadMedicalReport = json['isRadMedicalReport']; + vida3Id = json['vida3Id']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['PatientID'] = this.patientID; + data['InvoiceLineItemNo'] = this.invoiceLineItemNo; + data['InvoiceNo'] = this.invoiceNo; + data['DoctorID'] = this.doctorID; + data['ClinicID'] = this.clinicID; + data['OrderDate'] = this.orderDate; + data['ReportData'] = this.reportData; + data['ImageURL'] = this.imageURL; + data['ProcedureID'] = this.procedureID; + data['AppointmentNo'] = this.appointmentNo; + data['DIAPacsURL'] = this.dIAPacsURL; + data['IsRead'] = this.isRead; + data['ReadOn'] = this.readOn; + data['AdmissionNo'] = this.admissionNo; + data['IsInOutPatient'] = this.isInOutPatient; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['AdmissionDate'] = this.admissionDate; + data['AdmissionNumber'] = this.admissionNumber; + data['AppointmentDate'] = this.appointmentDate; + data['AppointmentNumber'] = this.appointmentNumber; + data['AppointmentTime'] = this.appointmentTime; + data['ClinicDescription'] = this.clinicDescription; + data['DIA_PACS_URL'] = this.dIAPACSURL; + data['DecimalDoctorRate'] = this.decimalDoctorRate; + data['Description'] = this.description; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorName'] = this.doctorName; + data['DoctorRate'] = this.doctorRate; + data['DoctorStarsRate'] = this.doctorStarsRate; + data['DoctorTitle'] = this.doctorTitle; + data['Exam_id'] = this.examId; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['InvoiceNo_VP'] = this.invoiceNoVP; + data['InvoiceType'] = this.invoiceType; + data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['IsInOutPatientDescription'] = this.isInOutPatientDescription; + data['IsInOutPatientDescriptionN'] = this.isInOutPatientDescriptionN; + data['IsLiveCareAppointment'] = this.isLiveCareAppointment; + data['NationalityFlagURL'] = this.nationalityFlagURL; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['OrderNo'] = this.orderNo; + data['ProcedureName'] = this.procedureName; + data['ProjectName'] = this.projectName; + data['QR'] = this.qR; + data['ReportDataHTML'] = this.reportDataHTML; + data['ReportDataTextString'] = this.reportDataTextString; + data['StrAppointmentDate'] = this.strAppointmentDate; + data['StrOrderDate'] = this.strOrderDate; + data['isCVI'] = this.isCVI; + data['isRadMedicalReport'] = this.isRadMedicalReport; + data['vida3Id'] = this.vida3Id; + return data; + } +} diff --git a/lib/features/radiology/radiology_repo.dart b/lib/features/radiology/radiology_repo.dart new file mode 100644 index 0000000..0a44428 --- /dev/null +++ b/lib/features/radiology/radiology_repo.dart @@ -0,0 +1,162 @@ +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; +import 'package:hmg_patient_app_new/features/radiology/models/resp_models/patient_radiology_response_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class RadiologyRepo { + Future>>> getPatientRadiologyOrders({required String patientId}); + + Future>> getRadiologyImage({required PatientRadiologyResponseModel patientRadiologyResponseModel}); + + Future>> getRadiologyReportPDF({required PatientRadiologyResponseModel patientRadiologyResponseModel, required AuthenticatedUser authenticatedUser}); +} + +class RadiologyRepoImp implements RadiologyRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + RadiologyRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>>> getPatientRadiologyOrders({required String patientId}) async { + Map mapDevice = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_PATIENT_ORDERS, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + final radOrders; + try { + if (response['FinalRadiologyList'] != null && response['FinalRadiologyList'].length != 0) { + final list = response['FinalRadiologyList']; + radOrders = list.map((item) => PatientRadiologyResponseModel.fromJson(item as Map)).toList().cast(); + } else { + final list = response['FinalRadiologyListAPI']; + radOrders = list.map((item) => PatientRadiologyResponseModel.fromJson(item as Map)).toList().cast(); + } + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: radOrders, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getRadiologyImage({required PatientRadiologyResponseModel patientRadiologyResponseModel}) async { + Map mapDevice = { + "InvoiceNo": Utils.isVidaPlusProject(patientRadiologyResponseModel.projectID!) ? "0" : patientRadiologyResponseModel.invoiceNo, + "InvoiceNo_VP": Utils.isVidaPlusProject(patientRadiologyResponseModel.projectID!) ? patientRadiologyResponseModel.invoiceNo : "0", + "LineItemNo": patientRadiologyResponseModel.invoiceLineItemNo, + "ProjectID": patientRadiologyResponseModel.projectID!, + "InvoiceType": patientRadiologyResponseModel.invoiceType!, + "ExamId": patientRadiologyResponseModel.examId ?? "", + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_RAD_IMAGE_URL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response["Data"], + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getRadiologyReportPDF({required PatientRadiologyResponseModel patientRadiologyResponseModel, required AuthenticatedUser authenticatedUser}) async { + Map mapDevice = { + "InvoiceNo": Utils.isVidaPlusProject(patientRadiologyResponseModel.projectID!) ? 0 : patientRadiologyResponseModel.invoiceNo, + "InvoiceNo_VP": Utils.isVidaPlusProject(patientRadiologyResponseModel.projectID!) ? patientRadiologyResponseModel.invoiceNo : 0, + "LineItemNo": patientRadiologyResponseModel.invoiceLineItemNo, + "InvoiceLineItemNo": patientRadiologyResponseModel.invoiceLineItemNo, + "ProjectID": patientRadiologyResponseModel.projectID!, + "InvoiceType": patientRadiologyResponseModel.invoiceType!, + "SetupID": patientRadiologyResponseModel.setupID!, + // "ExamId": patientRadiologyResponseModel.examId ?? "", + "IsDownload": true, + 'ClinicName': patientRadiologyResponseModel.clinicDescription, + 'DateofBirth': authenticatedUser.dateofBirth, + 'DoctorName': patientRadiologyResponseModel.doctorName, + 'OrderDate': '${patientRadiologyResponseModel.orderDate!.year}-${patientRadiologyResponseModel.orderDate!.month}-${patientRadiologyResponseModel.orderDate!.day}', + 'PatientIditificationNum': authenticatedUser.patientIdentificationNo, + 'PatientMobileNumber': authenticatedUser.mobileNumber, + 'PatientName': "${authenticatedUser.firstName!} ${authenticatedUser.lastName!}", + 'ProjectName': patientRadiologyResponseModel.projectName, + 'RadResult': patientRadiologyResponseModel.reportData, + "To": authenticatedUser.emailAddress + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + SEND_RAD_REPORT_EMAIL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response["Base64Data"], + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/radiology/radiology_view_model.dart b/lib/features/radiology/radiology_view_model.dart new file mode 100644 index 0000000..3441881 --- /dev/null +++ b/lib/features/radiology/radiology_view_model.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; +import 'package:hmg_patient_app_new/features/radiology/radiology_repo.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; + +import 'models/resp_models/patient_radiology_response_model.dart'; + +class RadiologyViewModel extends ChangeNotifier { + bool isRadiologyOrdersLoading = false; + bool isRadiologyPDFReportLoading = false; + + RadiologyRepo radiologyRepo; + ErrorHandlerService errorHandlerService; + + List patientRadiologyOrders = []; + + String radiologyImageURL = ""; + String patientRadiologyReportPDFBase64 = ""; + + RadiologyViewModel({required this.radiologyRepo, required this.errorHandlerService}); + + initRadiologyProvider() { + patientRadiologyOrders.clear(); + isRadiologyOrdersLoading = true; + isRadiologyPDFReportLoading = true; + radiologyImageURL = ""; + getPatientRadiologyOrders(); + notifyListeners(); + } + + Future getPatientRadiologyOrders({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await radiologyRepo.getPatientRadiologyOrders(patientId: "1231755"); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientRadiologyOrders = apiResponse.data!; + isRadiologyOrdersLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getRadiologyImage({required PatientRadiologyResponseModel patientRadiologyResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await radiologyRepo.getRadiologyImage(patientRadiologyResponseModel: patientRadiologyResponseModel); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + radiologyImageURL = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getRadiologyPDF( + {required PatientRadiologyResponseModel patientRadiologyResponseModel, required AuthenticatedUser authenticatedUser, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await radiologyRepo.getRadiologyReportPDF(patientRadiologyResponseModel: patientRadiologyResponseModel, authenticatedUser: authenticatedUser); + + result.fold( + (failure) async => await errorHandlerService.handleError( + failure: failure, + onOkPressed: () { + onError!(failure.message); + }, + ), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientRadiologyReportPDFBase64 = apiResponse.data!; + isRadiologyPDFReportLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } +} diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index a5fd007..7433ff7 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -2,13 +2,878 @@ // ignore_for_file: constant_identifier_names -abstract class LocaleKeys { +abstract class LocaleKeys { static const english = 'english'; static const arabic = 'arabic'; static const login = 'login'; static const noDataAvailable = 'noDataAvailable'; - static const ok = 'ok'; static const confirm = 'confirm'; static const loadingText = 'loadingText'; - + static const kilometerUnit = 'kilometerUnit'; + static const dashboardScreenToolbarTitle = 'dashboardScreenToolbarTitle'; + static const settings = 'settings'; + static const language = 'language'; + static const lanEnglish = 'lanEnglish'; + static const lanArabic = 'lanArabic'; + static const cancel = 'cancel'; + static const done = 'done'; + static const replay2 = 'replay2'; + static const home = 'home'; + static const services = 'services'; + static const mySchedule = 'mySchedule'; + static const logout = 'logout'; + static const respirationRate = 'respirationRate'; + static const bookAppo = 'bookAppo'; + static const searchBy = 'searchBy'; + static const clinic = 'clinic'; + static const byClinic = 'byClinic'; + static const hospital = 'hospital'; + static const byHospital = 'byHospital'; + static const name = 'name'; + static const doctor = 'doctor'; + static const clinicName = 'clinicName'; + static const hospitalName = 'hospitalName'; + static const noClinicFound = 'noClinicFound'; + static const doctorName = 'doctorName'; + static const nearestAppo = 'nearestAppo'; + static const searchByDocText = 'searchByDocText'; + static const enterDocName = 'enterDocName'; + static const search = 'search'; + static const noResultFound = 'noResultFound'; + static const noSearchResultFound = 'noSearchResultFound'; + static const pleaseEnterProductName = 'pleaseEnterProductName'; + static const bookNow = 'bookNow'; + static const docInfo = 'docInfo'; + static const appoInfo = 'appoInfo'; + static const availableAppo = 'availableAppo'; + static const gender = 'gender'; + static const nationality = 'nationality'; + static const neverWait = 'neverWait'; + static const reminderTitle = 'reminderTitle'; + static const appointmentCalendar = 'appointmentCalendar'; + static const appointmentSuccess = 'appointmentSuccess'; + static const docQualifications = 'docQualifications'; + static const pressAgain = 'pressAgain'; + static const laserMaxLimitReach = 'laserMaxLimitReach'; + static const confirmAppoHeading = 'confirmAppoHeading'; + static const patientInfo = 'patientInfo'; + static const doctorFilter = 'doctorFilter'; + static const bookSuccess = 'bookSuccess'; + static const patientShare = 'patientShare'; + static const patientShareWithTax = 'patientShareWithTax'; + static const confirmAppo = 'confirmAppo'; + static const confirmLiveCare = 'confirmLiveCare'; + static const waitingForDoctor = 'waitingForDoctor'; + static const appointment = 'appointment'; + static const confirmLater = 'confirmLater'; + static const todoList = 'todoList'; + static const appoActions = 'appoActions'; + static const date = 'date'; + static const time = 'time'; + static const pendingPayment = 'pendingPayment'; + static const payNow = 'payNow'; + static const viewQR = 'viewQR'; + static const instruction = 'instruction'; + static const livecare = 'livecare'; + static const livecareAppo = 'livecareAppo'; + static const agreeTo = 'agreeTo'; + static const termsConditoins = 'termsConditoins'; + static const cancelAppoMsg = 'cancelAppoMsg'; + static const changePayment = 'changePayment'; + static const upcomingNoAction = 'upcomingNoAction'; + static const upcomingConfirm = 'upcomingConfirm'; + static const bookSuccessConfirmMore2412 = 'bookSuccessConfirmMore2412'; + static const upcomingPaymentPending = 'upcomingPaymentPending'; + static const upcomingPaymentNow = 'upcomingPaymentNow'; + static const upcomingQR = 'upcomingQR'; + static const upcomingVirtual = 'upcomingVirtual'; + static const upcomingLivecare = 'upcomingLivecare'; + static const upcomingDetails = 'upcomingDetails'; + static const reschedule = 'reschedule'; + static const raise = 'raise'; + static const complaint = 'complaint'; + static const add = 'add'; + static const reminder = 'reminder'; + static const location = 'location'; + static const online = 'online'; + static const payment = 'payment'; + static const onlinePayment = 'onlinePayment'; + static const onlinePaymentSubtitle = 'onlinePaymentSubtitle'; + static const cancelNocaps = 'cancelNocaps'; + static const setReminder = 'setReminder'; + static const nationalIdNumber = 'nationalIdNumber'; + static const medicalFileNumber = 'medicalFileNumber'; + static const loginregister = 'loginregister'; + static const poweredBy = 'poweredBy'; + static const welcome = 'welcome'; + static const welcomeToDrSulaiman = 'welcomeToDrSulaiman'; + static const patientApp = 'patientApp'; + static const welcomeText = 'welcomeText'; + static const drSulaimanText = 'drSulaimanText'; + static const welcomeText2 = 'welcomeText2'; + static const yes = 'yes'; + static const no = 'no'; + static const logintyperadio = 'logintyperadio'; + static const registernow = 'registernow'; + static const nationalID = 'nationalID'; + static const nationalId = 'nationalId'; + static const fileNo = 'fileNo'; + static const fileno = 'fileno'; + static const forgotFileNo = 'forgotFileNo'; + static const forgotFileNoTitle = 'forgotFileNoTitle'; + static const enterNationalId = 'enterNationalId'; + static const profileInfo = 'profileInfo'; + static const submit = 'submit'; + static const forgotDesc = 'forgotDesc'; + static const dob = 'dob'; + static const hijriDate = 'hijriDate'; + static const gregorianDate = 'gregorianDate'; + static const verifyLoginWith = 'verifyLoginWith'; + static const registerUser = 'registerUser'; + static const verifyWithFingerprint = 'verifyWithFingerprint'; + static const verifyWithFaceid = 'verifyWithFaceid'; + static const verifyWithSms = 'verifyWithSms'; + static const verifyWithWhatsapp = 'verifyWithWhatsapp'; + static const verifyThrough = 'verifyThrough'; + static const lastLogin = 'lastLogin'; + static const lastLoginWith = 'lastLoginWith'; + static const verifyFingerprint = 'verifyFingerprint'; + static const searchMedicine = 'searchMedicine'; + static const pharmaciesList = 'pharmaciesList'; + static const searchMedicineHere = 'searchMedicineHere'; + static const description = 'description'; + static const howToUse = 'howToUse'; + static const price = 'price'; + static const youCanFindItIn = 'youCanFindItIn'; + static const pleaseEnterMedicineName = 'pleaseEnterMedicineName'; + static const verificationMessage = 'verificationMessage'; + static const validationMessage = 'validationMessage'; + static const notification = 'notification'; + static const appSettings = 'appSettings'; + static const rateApp = 'rateApp'; + static const before = 'before'; + static const minute = 'minute'; + static const hour = 'hour'; + static const reminderSuccess = 'reminderSuccess'; + static const reminderCancelSuccess = 'reminderCancelSuccess'; + static const patientShareToDo = 'patientShareToDo'; + static const patientTaxToDo = 'patientTaxToDo'; + static const patientShareTotalToDo = 'patientShareTotalToDo'; + static const paymentMethod = 'paymentMethod'; + static const noNeedToWaitInLine = 'noNeedToWaitInLine'; + static const useQRAppoAttend = 'useQRAppoAttend'; + static const passQRAppoAttend = 'passQRAppoAttend'; + static const sitWaitingQR = 'sitWaitingQR'; + static const attendRegisterCode = 'attendRegisterCode'; + static const scanQRHospital = 'scanQRHospital'; + static const scanNFC = 'scanNFC'; + static const sendEmail = 'sendEmail'; + static const success = 'success'; + static const emailSentSuccessfully = 'emailSentSuccessfully'; + static const emailSentError = 'emailSentError'; + static const close = 'close'; + static const closeIt = 'closeIt'; + static const booked = 'booked'; + static const confirmed = 'confirmed'; + static const arrived = 'arrived'; + static const payNowBookSuccess = 'payNowBookSuccess'; + static const payNowBookSuccesstext1 = 'payNowBookSuccesstext1'; + static const payNowBookSuccesstext2 = 'payNowBookSuccesstext2'; + static const payLater = 'payLater'; + static const askDocNotAllowed = 'askDocNotAllowed'; + static const moreVerify = 'moreVerify'; + static const welcomeBack = 'welcomeBack'; + static const accountInfo = 'accountInfo'; + static const anotherAcc = 'anotherAcc'; + static const next = 'next'; + static const firstName = 'firstName'; + static const middleName = 'middleName'; + static const lastName = 'lastName'; + static const female = 'female'; + static const preferredLanguage = 'preferredLanguage'; + static const locationsRegister = 'locationsRegister'; + static const ksa = 'ksa'; + static const dubai = 'dubai'; + static const enterEmail = 'enterEmail'; + static const family = 'family'; + static const familyTitle = 'familyTitle'; + static const myFamily = 'myFamily'; + static const addNewMember = 'addNewMember'; + static const sentRequests = 'sentRequests'; + static const recievedRequests = 'recievedRequests'; + static const manageFiles = 'manageFiles'; + static const oxygenation = 'oxygenation'; + static const bodyMeasurements = 'bodyMeasurements'; + static const temperature = 'temperature'; + static const pulse = 'pulse'; + static const respiration = 'respiration'; + static const bloodPressure = 'bloodPressure'; + static const painScale = 'painScale'; + static const weight = 'weight'; + static const height = 'height'; + static const heart = 'heart'; + static const heightUnit = 'heightUnit'; + static const weightUnit = 'weightUnit'; + static const unit = 'unit'; + static const request = 'request'; + static const memberName = 'memberName'; + static const switchLogin = 'switchLogin'; + static const removeMember = 'removeMember'; + static const allowView = 'allowView'; + static const rejectView = 'rejectView'; + static const deleteView = 'deleteView'; + static const approvals = 'approvals'; + static const approvalNo = 'approvalNo'; + static const companyName = 'companyName'; + static const receiptOn = 'receiptOn'; + static const expiryDate = 'expiryDate'; + static const expiryPoints = 'expiryPoints'; + static const expiryOn = 'expiryOn'; + static const procedureName = 'procedureName'; + static const procedure = 'procedure'; + static const procedureStatus = 'procedureStatus'; + static const usageStatus = 'usageStatus'; + static const unusedCount = 'unusedCount'; + static const totalApproval = 'totalApproval'; + static const category = 'category'; + static const expirationDate = 'expirationDate'; + static const patientCard = 'patientCard'; + static const policyNumber = 'policyNumber'; + static const seeDetails = 'seeDetails'; + static const insuranceCards = 'insuranceCards'; + static const requestType = 'requestType'; + static const registerInfoFamily = 'registerInfoFamily'; + static const removeFamilyMember = 'removeFamilyMember'; + static const myMedicalFile = 'myMedicalFile'; + static const myMedicalFileSubTitle = 'myMedicalFileSubTitle'; + static const viewMore = 'viewMore'; + static const homeHealthCareService = 'homeHealthCareService'; + static const onlinePharmacy = 'onlinePharmacy'; + static const emergencyService = 'emergencyService'; + static const onlinePaymentService = 'onlinePaymentService'; + static const offersAndPackages = 'offersAndPackages'; + static const comprehensiveMedicalCheckup = 'comprehensiveMedicalCheckup'; + static const hmgService = 'hmgService'; + static const viewAllHabibMedicalService = 'viewAllHabibMedicalService'; + static const viewAll = 'viewAll'; + static const view = 'view'; + static const contactUs = 'contactUs'; + static const contactUsLocation = 'contactUsLocation'; + static const contactUsTime = 'contactUsTime'; + static const viewAllWaysReachUs = 'viewAllWaysReachUs'; + static const medicalProfile = 'medicalProfile'; + static const consultation = 'consultation'; + static const logs = 'logs'; + static const textToSpeech = 'textToSpeech'; + static const locationDialogMessage = 'locationDialogMessage'; + static const userViewRequester = 'userViewRequester'; + static const userView = 'userView'; + static const parking = 'parking'; + static const alhabiServices = 'alhabiServices'; + static const parkingTitle = 'parkingTitle'; + static const parkingDescription = 'parkingDescription'; + static const appointments = 'appointments'; + static const all2 = 'all2'; + static const checkinOption = 'checkinOption'; + static const readBarcode = 'readBarcode'; + static const showMyPark = 'showMyPark'; + static const clearMyData = 'clearMyData'; + static const floor = 'floor'; + static const gate = 'gate'; + static const building = 'building'; + static const branch = 'branch'; + static const emergencyServices = 'emergencyServices'; + static const nearester = 'nearester'; + static const locationa = 'locationa'; + static const callNow = 'callNow'; + static const ambulancerequest = 'ambulancerequest'; + static const requestA = 'requestA'; + static const noBookedAppointments = 'noBookedAppointments'; + static const noConfirmedAppointments = 'noConfirmedAppointments'; + static const noArrivedAppointments = 'noArrivedAppointments'; + static const myAppointmentsList = 'myAppointmentsList'; + static const myAppointments = 'myAppointments'; + static const radiology = 'radiology'; + static const radiologySubtitle = 'radiologySubtitle'; + static const lab = 'lab'; + static const labSubtitle = 'labSubtitle'; + static const medicines = 'medicines'; + static const medicinesSubtitle = 'medicinesSubtitle'; + static const vitalSigns = 'vitalSigns'; + static const vitalSignsSubTitle = 'vitalSignsSubTitle'; + static const myMedical = 'myMedical'; + static const myMedicalSubtitle = 'myMedicalSubtitle'; + static const myDoctor = 'myDoctor'; + static const myDoctorSubtitle = 'myDoctorSubtitle'; + static const eye = 'eye'; + static const eyeSubtitle = 'eyeSubtitle'; + static const insurance = 'insurance'; + static const insuranceSubtitle = 'insuranceSubtitle'; + static const updateInsurance = 'updateInsurance'; + static const updateInsuranceSubtitle = 'updateInsuranceSubtitle'; + static const insuranceApproval = 'insuranceApproval'; + static const insuranceApprovalSubtitle = 'insuranceApprovalSubtitle'; + static const allergies = 'allergies'; + static const allergiesSubtitle = 'allergiesSubtitle'; + static const myVaccines = 'myVaccines'; + static const myVaccinesSubtitle = 'myVaccinesSubtitle'; + static const medical = 'medical'; + static const medicalSubtitle = 'medicalSubtitle'; + static const monthly = 'monthly'; + static const monthlySubtitle = 'monthlySubtitle'; + static const sick = 'sick'; + static const sickSubtitle = 'sickSubtitle'; + static const myBalance = 'myBalance'; + static const myBalanceSubtitle = 'myBalanceSubtitle'; + static const patientCall = 'patientCall'; + static const patientCallSubtitle = 'patientCallSubtitle'; + static const smartWatches = 'smartWatches'; + static const smartWatchesSubtitle = 'smartWatchesSubtitle'; + static const myTrackers = 'myTrackers'; + static const myTrackersSubtitle = 'myTrackersSubtitle'; + static const askYour = 'askYour'; + static const askYourSubtitle = 'askYourSubtitle'; + static const internet = 'internet'; + static const internetSubtitle = 'internetSubtitle'; + static const chatbot = 'chatbot'; + static const chatbotSubtitle = 'chatbotSubtitle'; + static const timeLine = 'timeLine'; + static const labOrders = 'labOrders'; + static const billNo = 'billNo'; + static const prescriptions = 'prescriptions'; + static const history = 'history'; + static const orderNo = 'orderNo'; + static const orderDetails = 'orderDetails'; + static const deliveryDriverTrack = 'deliveryDriverTrack'; + static const deliveryLocation = 'deliveryLocation'; + static const driver = 'driver'; + static const vitalSign = 'vitalSign'; + static const monthlyReports = 'monthlyReports'; + static const km = 'km'; + static const km_ = 'km_'; + static const patientHealthSummaryReport = 'patientHealthSummaryReport'; + static const toViewTheTermsAndConditions = 'toViewTheTermsAndConditions'; + static const clickHere = 'clickHere'; + static const iAgreeToTheTermsAndConditions = 'iAgreeToTheTermsAndConditions'; + static const iAgreeToTheTermsAndConditionsSubtitle = 'iAgreeToTheTermsAndConditionsSubtitle'; + static const save = 'save'; + static const userAgreement = 'userAgreement'; + static const updateSuccessfully = 'updateSuccessfully'; + static const checkVaccineAvailability = 'checkVaccineAvailability'; + static const myVaccinesAvailability = 'myVaccinesAvailability'; + static const paymentService = 'paymentService'; + static const paymentOnline = 'paymentOnline'; + static const onlineCheckIn = 'onlineCheckIn'; + static const myBalances = 'myBalances'; + static const myWallet = 'myWallet'; + static const balanceAmount = 'balanceAmount'; + static const totalBalance = 'totalBalance'; + static const createAdvancedPayment = 'createAdvancedPayment'; + static const advancePayment = 'advancePayment'; + static const advancePaymentLabel = 'advancePaymentLabel'; + static const fileNumber = 'fileNumber'; + static const amount = 'amount'; + static const depositorEmail = 'depositorEmail'; + static const notes = 'notes'; + static const selectPatientName = 'selectPatientName'; + static const selectFamilyPatientName = 'selectFamilyPatientName'; + static const selectHospital = 'selectHospital'; + static const selectCity = 'selectCity'; + static const city = 'city'; + static const distance = 'distance'; + static const myAccount = 'myAccount'; + static const otherAccount = 'otherAccount'; + static const selectBeneficiary = 'selectBeneficiary'; + static const confirmThePayment = 'confirmThePayment'; + static const depositorName = 'depositorName'; + static const mobileNumber = 'mobileNumber'; + static const phoneNumber = 'phoneNumber'; + static const country = 'country'; + static const ok = 'ok'; + static const averageWaitingTime = 'averageWaitingTime'; + static const waitingTime = 'waitingTime'; + static const waterConsumedInWeek = 'waterConsumedInWeek'; + static const waterConsumedInMonth = 'waterConsumedInMonth'; + static const theVerificationCodeExpiresIn = 'theVerificationCodeExpiresIn'; + static const pleaseEnterTheVerificationCode = 'pleaseEnterTheVerificationCode'; + static const eyeMeasurements = 'eyeMeasurements'; + static const measurements = 'measurements'; + static const classes = 'classes'; + static const contactLens = 'contactLens'; + static const rightEye = 'rightEye'; + static const sphere = 'sphere'; + static const cylinder = 'cylinder'; + static const axis = 'axis'; + static const prism = 'prism'; + static const va = 'va'; + static const leftEye = 'leftEye'; + static const brand = 'brand'; + static const power = 'power'; + static const diameter = 'diameter'; + static const remarks = 'remarks'; + static const activeMedications = 'activeMedications'; + static const expDate = 'expDate'; + static const route = 'route'; + static const frequency = 'frequency'; + static const dailyQuantity = 'dailyQuantity'; + static const addReminder = 'addReminder'; + static const cancelReminder = 'cancelReminder'; + static const reminderDes = 'reminderDes'; + static const pleaseSelectAllQuestionToContinue = 'pleaseSelectAllQuestionToContinue'; + static const startDay = 'startDay'; + static const endDay = 'endDay'; + static const days = 'days'; + static const pleaseVerify = 'pleaseVerify'; + static const scheduleTime = 'scheduleTime'; + static const askDoctor = 'askDoctor'; + static const doctorResponses = 'doctorResponses'; + static const ne_w = 'ne_w'; + static const all = 'all'; + static const dailyWater = 'dailyWater'; + static const questionHere = 'questionHere'; + static const viewDoctorResponses = 'viewDoctorResponses'; + static const serviceInformationButton = 'serviceInformationButton'; + static const serviceInformationTitle = 'serviceInformationTitle'; + static const serviceInformation = 'serviceInformation'; + static const homeHealthCare = 'homeHealthCare'; + static const noAppointmentAvailable = 'noAppointmentAvailable'; + static const homeHealthCareText = 'homeHealthCareText'; + static const loginRegister = 'loginRegister'; + static const orderLog = 'orderLog'; + static const infoLab = 'infoLab'; + static const infoRadiology = 'infoRadiology'; + static const noReviewsAvailable = 'noReviewsAvailable'; + static const noLocationAvailable = 'noLocationAvailable'; + static const orders = 'orders'; + static const lakum = 'lakum'; + static const lakumMsg = 'lakumMsg'; + static const lakumPoint = 'lakumPoint'; + static const wishlist = 'wishlist'; + static const products = 'products'; + static const reviews = 'reviews'; + static const brands = 'brands'; + static const productDetails = 'productDetails'; + static const medicationRefill = 'medicationRefill'; + static const pillReminder = 'pillReminder'; + static const shippingAddresses = 'shippingAddresses'; + static const reachUs = 'reachUs'; + static const ourLocations = 'ourLocations'; + static const edit = 'edit'; + static const whatsApp = 'whatsApp'; + static const phone = 'phone'; + static const delete = 'delete'; + static const deleteAddress = 'deleteAddress'; + static const deletedAddres = 'deletedAddres'; + static const addAddress = 'addAddress'; + static const addNewAddress = 'addNewAddress'; + static const order = 'order'; + static const delivered = 'delivered'; + static const pending = 'pending'; + static const enterNameHere = 'enterNameHere'; + static const processing = 'processing'; + static const cancelled = 'cancelled'; + static const writeReview = 'writeReview'; + static const shareReview = 'shareReview'; + static const review = 'review'; + static const viewMedicalFile = 'viewMedicalFile'; + static const viewAllServices = 'viewAllServices'; + static const medicalFile = 'medicalFile'; + static const verified = 'verified'; + static const checkup = 'checkup'; + static const hhcHome = 'hhcHome'; + static const refferal = 'refferal'; + static const refferalTitle = 'refferalTitle'; + static const refferalSubTitle = 'refferalSubTitle'; + static const healthCare = 'healthCare'; + static const emergency = 'emergency'; + static const erservices = 'erservices'; + static const services2 = 'services2'; + static const cantSeeProfile = 'cantSeeProfile'; + static const loginRegisterNow = 'loginRegisterNow'; + static const hmgPharmacy = 'hmgPharmacy'; + static const ecommerceSolution = 'ecommerceSolution'; + static const comprehensive = 'comprehensive'; + static const onlineConsulting = 'onlineConsulting'; + static const pendingOrder = 'pendingOrder'; + static const deliveredOrder = 'deliveredOrder'; + static const processingOrder = 'processingOrder'; + static const cancelledOrder = 'cancelledOrder'; + static const compare = 'compare'; + static const medicationsRefill = 'medicationsRefill'; + static const recommended = 'recommended'; + static const myPrescription = 'myPrescription'; + static const quantity = 'quantity'; + static const reviewAppointment = 'reviewAppointment'; + static const backMyAccount = 'backMyAccount'; + static const reviewSuccessful = 'reviewSuccessful'; + static const reviewShared = 'reviewShared'; + static const reviewComment = 'reviewComment'; + static const shippedMethod = 'shippedMethod'; + static const orderDetail = 'orderDetail'; + static const orderSummary = 'orderSummary'; + static const subtotal = 'subtotal'; + static const shipping = 'shipping'; + static const shipBy = 'shipBy'; + static const lakumPoints = 'lakumPoints'; + static const useLakumPoints = 'useLakumPoints'; + static const use = 'use'; + static const proceedPay = 'proceedPay'; + static const vat = 'vat'; + static const inclusiveVat = 'inclusiveVat'; + static const items = 'items'; + static const checkOut = 'checkOut'; + static const sar = 'sar'; + static const aed = 'aed'; + static const payOnline = 'payOnline'; + static const cancelOrder = 'cancelOrder'; + static const confirmAddress = 'confirmAddress'; + static const confirmLocation = 'confirmLocation'; + static const conditionsHMG = 'conditionsHMG'; + static const conditions = 'conditions'; + static const confirmDeleteMsg = 'confirmDeleteMsg'; + static const confirmDelete = 'confirmDelete'; + static const confirmCancellation = 'confirmCancellation'; + static const orderNumber = 'orderNumber'; + static const orderDate = 'orderDate'; + static const itemsNo = 'itemsNo'; + static const noOrder = 'noOrder'; + static const noResult = 'noResult'; + static const nonRecommended = 'nonRecommended'; + static const termsService = 'termsService'; + static const beforeusing = 'beforeusing'; + static const accept = 'accept'; + static const dataSafeInfo = 'dataSafeInfo'; + static const dataSafe = 'dataSafe'; + static const informational = 'informational'; + static const notUseInEmerbency = 'notUseInEmerbency'; + static const notUseInEmerbencyDetails = 'notUseInEmerbencyDetails'; + static const notUseInEmerbencyDetailsCall = 'notUseInEmerbencyDetailsCall'; + static const checkDiagnosis = 'checkDiagnosis'; + static const remeberthat = 'remeberthat'; + static const loginToUseService = 'loginToUseService'; + static const offersAndPromotions = 'offersAndPromotions'; + static const offers = 'offers'; + static const myPrescriptions = 'myPrescriptions'; + static const searchAndScanMedication = 'searchAndScanMedication'; + static const shopByBrands = 'shopByBrands'; + static const recentlyViewed = 'recentlyViewed'; + static const bestSellers = 'bestSellers'; + static const deleteAllItems = 'deleteAllItems'; + static const total = 'total'; + static const totalWithColonRight = 'totalWithColonRight'; + static const selectAddress = 'selectAddress'; + static const shippingAddress = 'shippingAddress'; + static const changeAddress = 'changeAddress'; + static const selectPaymentOption = 'selectPaymentOption'; + static const selectTamaraPlan = 'selectTamaraPlan'; + static const changeMethod = 'changeMethod'; + static const reviewOrder = 'reviewOrder'; + static const active = 'active'; + static const inactive = 'inactive'; + static const balance = 'balance'; + static const gained = 'gained'; + static const consumed = 'consumed'; + static const transferred = 'transferred'; + static const riyal = 'riyal'; + static const membersince = 'membersince'; + static const identification = 'identification'; + static const lakumMobile = 'lakumMobile'; + static const waitinggained = 'waitinggained'; + static const expired = 'expired'; + static const willBeExpired = 'willBeExpired'; + static const activateLAKUMAccount = 'activateLAKUMAccount'; + static const checkBeneficiary = 'checkBeneficiary'; + static const beneficiaryName = 'beneficiaryName'; + static const accountActivation = 'accountActivation'; + static const lakumTransfer = 'lakumTransfer'; + static const acceptLbl = 'acceptLbl'; + static const declineLbl = 'declineLbl'; + static const selectGender = 'selectGender'; + static const iAmA = 'iAmA'; + static const selectAge = 'selectAge'; + static const select = 'select'; + static const iAm = 'iAm'; + static const yearsOld = 'yearsOld'; + static const dragPoint = 'dragPoint'; + static const refine = 'refine'; + static const subGroup = 'subGroup'; + static const max = 'max'; + static const compeleteOrderMsg = 'compeleteOrderMsg'; + static const addToCompareMsg = 'addToCompareMsg'; + static const itInListMsg = 'itInListMsg'; + static const compareListFull = 'compareListFull'; + static const addQuantity = 'addQuantity'; + static const addToCartMsg = 'addToCartMsg'; + static const addToWishlistMsg = 'addToWishlistMsg'; + static const notifyMeMsg = 'notifyMeMsg'; + static const removeFromWishlistMsg = 'removeFromWishlistMsg'; + static const min = 'min'; + static const reset = 'reset'; + static const apply = 'apply'; + static const viewCategorise = 'viewCategorise'; + static const viewSubCategorise = 'viewSubCategorise'; + static const categorise = 'categorise'; + static const wishList = 'wishList'; + static const cart = 'cart'; + static const alhabibapp = 'alhabibapp'; + static const searchProductHere = 'searchProductHere'; + static const hhcNotAuthMsg = 'hhcNotAuthMsg'; + static const email = 'email'; + static const book = 'book'; + static const appointmentLabel = 'appointmentLabel'; + static const bloodType = 'bloodType'; + static const maritalStatus = 'maritalStatus'; + static const general = 'general'; + static const profile = 'profile'; + static const notifications = 'notifications'; + static const notificationDetails = 'notificationDetails'; + static const notificationDetailsa = 'notificationDetailsa'; + static const infoMyDoctorPoints = 'infoMyDoctorPoints'; + static const infoMyDoctor = 'infoMyDoctor'; + static const infoPrescriptions = 'infoPrescriptions'; + static const infoMyPrescriptionPoints = 'infoMyPrescriptionPoints'; + static const infoInsuranceCards = 'infoInsuranceCards'; + static const infoInsuranceCardsPoints = 'infoInsuranceCardsPoints'; + static const infoAllergies = 'infoAllergies'; + static const infoSickLeaves = 'infoSickLeaves'; + static const infoSickLeavePoints = 'infoSickLeavePoints'; + static const infoApprovals = 'infoApprovals'; + static const infoApprovalPoints = 'infoApprovalPoints'; + static const infoMonthReport = 'infoMonthReport'; + static const languageSetting = 'languageSetting'; + static const alert = 'alert'; + static const emailAlert = 'emailAlert'; + static const smsAlert = 'smsAlert'; + static const contactInfo = 'contactInfo'; + static const emrgName = 'emrgName'; + static const emrgNo = 'emrgNo'; + static const modes = 'modes'; + static const vibration = 'vibration'; + static const blindModes = 'blindModes'; + static const invertTheme = 'invertTheme'; + static const offTheme = 'offTheme'; + static const dimTheme = 'dimTheme'; + static const bwTheme = 'bwTheme'; + static const permissions = 'permissions'; + static const cameraPermission = 'cameraPermission'; + static const locationPermission = 'locationPermission'; + static const needPrescription = 'needPrescription'; + static const outOfStockMsg = 'outOfStockMsg'; + static const noArabicLetters = 'noArabicLetters'; + static const noOffersAvailable = 'noOffersAvailable'; + static const accessibility = 'accessibility'; + static const orderStatus = 'orderStatus'; + static const findUs = 'findUs'; + static const liveChat = 'liveChat'; + static const service = 'service'; + static const hmgServiceLabel = 'hmgServiceLabel'; + static const healthWeatherIndicators = 'healthWeatherIndicators'; + static const healthTipsBasedOnCurrentWeather = 'healthTipsBasedOnCurrentWeather'; + static const moreDetails = 'moreDetails'; + static const resendOrder = 'resendOrder'; + static const ports = 'ports'; + static const way = 'way'; + static const dailyDoses = 'dailyDoses'; + static const period = 'period'; + static const duration = 'duration'; + static const cm = 'cm'; + static const ft = 'ft'; + static const kg = 'kg'; + static const lb = 'lb'; + static const birthDate = 'birthDate'; + static const dateOfBirth = 'dateOfBirth'; + static const mass = 'mass'; + static const tempC = 'tempC'; + static const bpm = 'bpm'; + static const respirationSigns = 'respirationSigns'; + static const sysDias = 'sysDias'; + static const body = 'body'; + static const bodyString = 'bodyString'; + static const face = 'face'; + static const retouch = 'retouch'; + static const bikini = 'bikini'; + static const totalMinutes = 'totalMinutes'; + static const feedback = 'feedback'; + static const send = 'send'; + static const status = 'status'; + static const likeToHear = 'likeToHear'; + static const subject = 'subject'; + static const message = 'message'; + static const emptySubject = 'emptySubject'; + static const emptyMessage = 'emptyMessage'; + static const selectAttachment = 'selectAttachment'; + static const complainAppo = 'complainAppo'; + static const complainAppoAlt = 'complainAppoAlt'; + static const messageType = 'messageType'; + static const feedbackType = 'feedbackType'; + static const compliment = 'compliment'; + static const suggestion = 'suggestion'; + static const yourFeedback = 'yourFeedback'; + static const selectPart = 'selectPart'; + static const number = 'number'; + static const notClassified = 'notClassified'; + static const selectClinic = 'selectClinic'; + static const selectProject = 'selectProject'; + static const searchItemError = 'searchItemError'; + static const youCanFind = 'youCanFind'; + static const itemInSearch = 'itemInSearch'; + static const bloodDonation = 'bloodDonation'; + static const bloodDonationInfo = 'bloodDonationInfo'; + static const bloodInstruction = 'bloodInstruction'; + static const viewTerms = 'viewTerms'; + static const wantConnectHmgNetwork = 'wantConnectHmgNetwork'; + static const failedToAccessHmgServices = 'failedToAccessHmgServices'; + static const offerAndPackages = 'offerAndPackages'; + static const offerAndPackagesDetails = 'offerAndPackagesDetails'; + static const invoiceNo = 'invoiceNo'; + static const invoiceDate = 'invoiceDate'; + static const specialResult = 'specialResult'; + static const generalResult = 'generalResult'; + static const showMoreBtn = 'showMoreBtn'; + static const value = 'value'; + static const report = 'report'; + static const openRad = 'openRad'; + static const sendCopy = 'sendCopy'; + static const appoSurvey = 'appoSurvey'; + static const appoSurveySubtitle = 'appoSurveySubtitle'; + static const labResults = 'labResults'; + static const doctorRating = 'doctorRating'; + static const good = 'good'; + static const vGood = 'vGood'; + static const excellent = 'excellent'; + static const average = 'average'; + static const infoSigns = 'infoSigns'; + static const infoAdvancePayment = 'infoAdvancePayment'; + static const infoMyBalance = 'infoMyBalance'; + static const erContant = 'erContant'; + static const infoAmbulance = 'infoAmbulance'; + static const infoMyAppointments = 'infoMyAppointments'; + static const infoTodo = 'infoTodo'; + static const familyInfo = 'familyInfo'; + static const rrtdDetails = 'rrtdDetails'; + static const onlineCheckInAgreement = 'onlineCheckInAgreement'; + static const infoEreferral = 'infoEreferral'; + static const erConsultation = 'erConsultation'; + static const myInvoice = 'myInvoice'; + static const invoiceList = 'invoiceList'; + static const thisItemIsNotAvailable = 'thisItemIsNotAvailable'; + static const beforeAfterImages = 'beforeAfterImages'; + static const clinicAcceptLivecare = 'clinicAcceptLivecare'; + static const livecareModalTop = 'livecareModalTop'; + static const livecarePoint2 = 'livecarePoint2'; + static const livecarePoint3 = 'livecarePoint3'; + static const livecarePoint4 = 'livecarePoint4'; + static const livecarePoint5 = 'livecarePoint5'; + static const bookImmediateLivecare = 'bookImmediateLivecare'; + static const bookVideoLivecare2 = 'bookVideoLivecare2'; + static const noThankyou = 'noThankyou'; + static const visitClinic = 'visitClinic'; + static const generateCovidCertificate = 'generateCovidCertificate'; + static const isReportOutsideKsa = 'isReportOutsideKsa'; + static const passportNumber = 'passportNumber'; + static const enterPassportNumber = 'enterPassportNumber'; + static const validPassportNumber = 'validPassportNumber'; + static const continuePlan = 'continuePlan'; + static const aboutApp = 'aboutApp'; + static const dontHaveAccount = 'dontHaveAccount'; + static const loginOrRegister = 'loginOrRegister'; + static const myFiles = 'myFiles'; + static const resultsPending = 'resultsPending'; + static const resultsAvailable = 'resultsAvailable'; + static const viewReport = 'viewReport'; + static const checkAvailability = 'checkAvailability'; + static const readInstructions = 'readInstructions'; + static const searchLabReport = 'searchLabReport'; + static const prescriptionDeliveryError = 'prescriptionDeliveryError'; + static const receiveOtpToast = 'receiveOtpToast'; + static const enterPhoneNumber = 'enterPhoneNumber'; + static const enterEmailDesc = 'enterEmailDesc'; + static const enterPhoneDesc = 'enterPhoneDesc'; + static const pleaseChooseOption = 'pleaseChooseOption'; + static const prepareToElevate = 'prepareToElevate'; + static const iAcceptTermsConditions = 'iAcceptTermsConditions'; + static const alreadyHaveAccount = 'alreadyHaveAccount'; + static const loginNow = 'loginNow'; + static const notice = 'notice'; + static const oR = 'oR'; + static const sendOTPWHATSAPP = 'sendOTPWHATSAPP'; + static const sendOTPSMS = 'sendOTPSMS'; + static const fullName = 'fullName'; + static const married = 'married'; + static const uae = 'uae'; + static const malE = 'malE'; + static const loginBy = 'loginBy'; + static const loginByOTP = 'loginByOTP'; + static const guest = 'guest'; + static const switchAccount = 'switchAccount'; + static const lastLoginBy = 'lastLoginBy'; + static const allSet = 'allSet'; + static const enableQuickLogin = 'enableQuickLogin'; + static const enableMsg = 'enableMsg'; + static const notNow = 'notNow'; + static const pendingActivation = 'pendingActivation'; + static const awaitingApproval = 'awaitingApproval'; + static const news = 'news'; + static const ready = 'ready'; + static const enterValidNationalId = 'enterValidNationalId'; + static const enterValidPhoneNumber = 'enterValidPhoneNumber'; + static const medicalCentersWithCount = 'medicalCentersWithCount'; + static const medicalCenters = 'medicalCenters'; + static const hospitalsWithCount = 'hospitalsWithCount'; + static const selectRegion = 'selectRegion'; + static const selectFacility = 'selectFacility'; + static const selectFacilitiesSubTitle = 'selectFacilitiesSubTitle'; + static const selectHospitalSubTitle = 'selectHospitalSubTitle'; + static const iAcceptThe = 'iAcceptThe'; + static const personalDetailsVerification = 'personalDetailsVerification'; + static const otpVerification = 'otpVerification'; + static const weHaveSendOTP = 'weHaveSendOTP'; + static const via = 'via'; + static const forRegistrationVerification = 'forRegistrationVerification'; + static const didntReceiveIt = 'didntReceiveIt'; + static const resendOTP = 'resendOTP'; + static const resendIn = 'resendIn'; + static const pleaseEnterAnationalID = 'pleaseEnterAnationalID'; + static const pleaseEnterAFileNumber = 'pleaseEnterAFileNumber'; + static const pleaseEnterAValidEmail = 'pleaseEnterAValidEmail'; + static const pleaseEnterFullName = 'pleaseEnterFullName'; + static const pleaseAcceptTermsConditions = 'pleaseAcceptTermsConditions'; + static const pleaseEnterAValidIqamaID = 'pleaseEnterAValidIqamaID'; + static const pleaseEnterAValidNationalID = 'pleaseEnterAValidNationalID'; + static const pleaseEnterAValidDateOfBirth = 'pleaseEnterAValidDateOfBirth'; + static const pleaseEnterAValidName = 'pleaseEnterAValidName'; + static const pleaseSelectAGender = 'pleaseSelectAGender'; + static const pleaseSelectAMaritalStatus = 'pleaseSelectAMaritalStatus'; + static const pleaseSelectACountry = 'pleaseSelectACountry'; + static const pleaseEnterEmail = 'pleaseEnterEmail'; + static const pleaseEnterAValidEmailFormat = 'pleaseEnterAValidEmailFormat'; + static const selectCountry = 'selectCountry'; + static const forLoginVerification = 'forLoginVerification'; + static const searchHospital = 'searchHospital'; + static const skip = 'skip'; + static const getStarted = 'getStarted'; + static const onboardingHeading1 = 'onboardingHeading1'; + static const onboardingBody1 = 'onboardingBody1'; + static const onboardingHeading2 = 'onboardingHeading2'; + static const onboardingBody2 = 'onboardingBody2'; + static const hmgHospitals = 'hmgHospitals'; + static const hmcMedicalClinic = 'hmcMedicalClinic'; + static const applyFilter = 'applyFilter'; + static const facilityAndLocation = 'facilityAndLocation'; + static const regionAndLocation = 'regionAndLocation'; + static const clearAllFilters = 'clearAllFilters'; + static const filters = 'filters'; + static const searchClinic = 'searchClinic'; + static const normal = 'normal'; + static const attention = 'attention'; + static const monitor = 'monitor'; + static const noSpecialResult = 'noSpecialResult'; + static const setTheDateRange = 'setTheDateRange'; + static const historyFlowchart = 'historyFlowchart'; + static const to = 'to'; + static const startDate = 'startDate'; + static const endDate = 'endDate'; + static const walkin = 'walkin'; + static const laserClinic = 'laserClinic'; + static const continueString = 'continueString'; } diff --git a/lib/main.dart b/lib/main.dart index 48ea6ee..514ee69 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,36 +6,41 @@ import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:hmg_patient_app_new/providers/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/contact_us/contact_us_view_model.dart'; +import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/features/lab/history/lab_history_viewmodel.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; +import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; +import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart'; +import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; import 'package:hmg_patient_app_new/routes/app_routes.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/theme/app_theme.dart'; -import 'package:logger/logger.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart' show DateRangeSelectorRangeViewModel; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; import 'core/utils/size_utils.dart'; import 'firebase_options.dart'; -var globalMessengerKey = GlobalKey(); -final navigatorKey = GlobalKey(); - -Logger logger = Logger( - printer: PrettyPrinter( - lineLength: 0, - ), -); - -late AppState appState; - @pragma('vm:entry-point') Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); - print("Firebase backgroundMessageHandler Main!!!"); - // debugPrint('backgroundMessage: message => ${message.notification!.title.toString()}'); - // messagesOpended = message.notification!.title.toString(); - var payload = message.data; - // showCallkitIncoming(payload); - // await backgroundCallHandler(payload); + getIt.get().logInfo("Firebase backgroundMessageHandler Main!!!"); } class MyHttpOverrides extends HttpOverrides { @@ -45,12 +50,28 @@ class MyHttpOverrides extends HttpOverrides { } } -void main() async { +Future callAppStateInitializations() async { + final String deviceTypeId = (Platform.isIOS + ? "1" + : await Utils.isGoogleServicesAvailable() + ? "2" + : "3"); + AppState appState = getIt.get(); + appState.setDeviceTypeID = deviceTypeId; +} + +Future callInitializations() async { WidgetsFlutterBinding.ensureInitialized(); await EasyLocalization.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); + AppDependencies.addDependencies(); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); HttpOverrides.global = MyHttpOverrides(); + await callAppStateInitializations(); +} + +void main() async { + await callInitializations(); runApp( EasyLocalization( supportedLocales: const [ @@ -60,9 +81,62 @@ void main() async { path: 'assets/langs', fallbackLocale: Locale('en', 'US'), child: MultiProvider(providers: [ + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), ChangeNotifierProvider( - create: (_) => AuthenticationViewModel(), + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ),ChangeNotifierProvider( + create: (_) => getIt.get(), ), + ChangeNotifierProvider( + create: (_) => getIt.get(), + ) ], child: MyApp()), ), ); @@ -71,7 +145,6 @@ void main() async { class MyApp extends StatelessWidget { const MyApp({super.key}); - // This widget is the root of your application. @override Widget build(BuildContext context) { return SafeArea( @@ -88,7 +161,7 @@ class MyApp extends StatelessWidget { return MediaQuery( data: MediaQuery.of(context).copyWith( textScaler: TextScaler.linear(1.0), - ), //set desired text scale factor here + ), child: mchild!); }, showSemanticsDebugger: false, @@ -98,10 +171,8 @@ class MyApp extends StatelessWidget { locale: context.locale, initialRoute: AppRoutes.initialRoute, routes: AppRoutes.routes, - theme: AppTheme.getTheme( - EasyLocalization.of(context)?.locale.languageCode == "ar", - ), - navigatorKey: navigatorKey, + theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"), + navigatorKey: getIt.get().navigatorKey, ); }, ); @@ -110,3 +181,4 @@ class MyApp extends StatelessWidget { ); } } +// flutter pub run easy_localization:generate -S assets/langs -f keys -o locale_keys.g.dart diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart new file mode 100644 index 0000000..79084c9 --- /dev/null +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -0,0 +1,698 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/patient_prescriptions_response_model.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/appointment_payment_page.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_doctor_card.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/ask_doctor_request_type_select.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; +import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_detail_page.dart'; +import 'package:hmg_patient_app_new/presentation/prescriptions/prescriptions_list_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart'; +import 'package:maps_launcher/maps_launcher.dart'; +import 'package:provider/provider.dart'; + +import '../../core/dependencies.dart'; +import '../medical_file/widgets/medical_file_card.dart'; + +class AppointmentDetailsPage extends StatefulWidget { + const AppointmentDetailsPage({super.key, required this.patientAppointmentHistoryResponseModel}); + + final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; + + @override + State createState() => _AppointmentDetailsPageState(); +} + +class _AppointmentDetailsPageState extends State { + late MyAppointmentsViewModel myAppointmentsViewModel; + late PrescriptionsViewModel prescriptionsViewModel; + late BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + void initState() { + scheduleMicrotask(() { + if (AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel)) { + prescriptionsViewModel.setPrescriptionsDetailsLoading(); + prescriptionsViewModel.getPrescriptionDetails(getPrescriptionRequestModel()); + } + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + myAppointmentsViewModel = Provider.of(context, listen: false); + prescriptionsViewModel = Provider.of(context, listen: false); + bookAppointmentsViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Appointment Details".needTranslation, + report: AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) ? () {} : null, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppointmentDoctorCard( + patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, + onAskDoctorTap: () async { + LoaderBottomSheet.showLoader(loadingText: "Checking doctor availability...".needTranslation); + await myAppointmentsViewModel.isDoctorAvailable( + projectID: widget.patientAppointmentHistoryResponseModel.projectID, + doctorId: widget.patientAppointmentHistoryResponseModel.doctorID, + clinicId: widget.patientAppointmentHistoryResponseModel.clinicID, + onSuccess: (value) async { + if (value) { + print("Doctor is available"); + await myAppointmentsViewModel.getAskDoctorRequestTypes(onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.askDoctor.tr(context: context), + child: AskDoctorRequestTypeSelect( + askDoctorRequestTypeList: myAppointmentsViewModel.askDoctorRequestTypeList, + myAppointmentsViewModel: myAppointmentsViewModel, + patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } else { + print("Doctor is not available"); + } + }); + }, + onCancelTap: () async { + myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); + LoaderBottomSheet.showLoader(loadingText: "Cancelling Appointment, Please Wait...".needTranslation); + await myAppointmentsViewModel.cancelAppointment( + patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, + onSuccess: (apiResponse) { + LoaderBottomSheet.hideLoader(); + myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); + myAppointmentsViewModel.getPatientAppointments(true, false); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getSuccessWidget(loadingText: "Appointment Cancelled Successfully".needTranslation), + callBackFunc: () { + Navigator.of(context).pop(); + }, + title: "", + isCloseButtonVisible: true, + isDismissible: false, + isFullScreen: false, + ); + }); + }, + onRescheduleTap: () async { + openDoctorScheduleCalendar(); + }, + ), + SizedBox(height: 16.h), + !AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) + ? Column( + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + "Appointment Status".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(height: 4.h), + (!AppointmentType.isConfirmed(widget.patientAppointmentHistoryResponseModel) + ? "Not Confirmed".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500) + : "Confirmed".needTranslation.toText12(color: AppColors.successColor, fontWeight: FontWeight.w500)), + SizedBox(height: 16.h), + //TODO Add countdown timer in case of LiveCare Appointment + widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false + ? Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.livecare_clinic_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "The doctor will call you once the appointment time approaches." + .needTranslation + .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ), + ], + ) + : Stack( + children: [ + ClipRRect( + clipBehavior: Clip.hardEdge, + borderRadius: BorderRadius.circular(24.r), + // Todo: what is this???? Api Key??? 😲 + child: Image.network( + "https://maps.googleapis.com/maps/api/staticmap?center=${widget.patientAppointmentHistoryResponseModel.latitude},${widget.patientAppointmentHistoryResponseModel.longitude}&zoom=14&size=350x165&maptype=roadmap&markers=color:red%7C${widget.patientAppointmentHistoryResponseModel.latitude},${widget.patientAppointmentHistoryResponseModel.longitude}&key=AIzaSyB6TERnxIr0yJ3qG4ULBZbu0sAD4tGqtng", + fit: BoxFit.contain, + ), + ), + Positioned( + bottom: 0, + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.785, + child: CustomButton( + text: "Get Directions".needTranslation, + onPressed: () { + MapsLauncher.launchCoordinates( + double.parse(widget.patientAppointmentHistoryResponseModel.latitude!), + double.parse(widget.patientAppointmentHistoryResponseModel.longitude!), + widget.patientAppointmentHistoryResponseModel.projectName); + }, + backgroundColor: AppColors.textColor.withValues(alpha: 0.8), + borderColor: AppointmentType.getNextActionButtonColor( + widget.patientAppointmentHistoryResponseModel.nextAction) + .withValues(alpha: 0.01), + textColor: AppColors.whiteColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 40.h, + icon: AppAssets.directions_icon, + iconColor: AppColors.whiteColor, + iconSize: 14.h, + ).paddingAll(12.h), + ), + ), + ], + ), + ], + ), + ), + ), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.setReminder.tr(context: context).toText13(isBold: true), + "Notify me before the appointment" + .needTranslation + .toText11(color: AppColors.textColorLight, weight: FontWeight.w500), + ], + ), + const Spacer(), + Switch( + // activeThumbColor: AppColors.successColor, + activeTrackColor: AppColors.successColor.withValues(alpha: .15), + value: widget.patientAppointmentHistoryResponseModel.hasReminder!, + onChanged: (newValue) { + setState(() { + myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); + }); + }, + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ), + SizedBox(height: 16.h), + ], + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Lab & Radiology".needTranslation.toText18(isBold: true), + SizedBox(height: 16.h), + GridView( + padding: EdgeInsets.zero, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: isTablet || isFoldable ? 3 : 2, + crossAxisSpacing: 13.w, + mainAxisSpacing: 13.w, + ), + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + children: [ + MedicalFileCard( + label: LocaleKeys.labResults.tr(context: context), + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.lab_result_icon, + iconSize: 40.w, + isLargeText: true, + ), + MedicalFileCard( + label: "Radiology Results".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.radiology_icon, + iconSize: 40.w, + isLargeText: true, + ), + MedicalFileCard( + label: LocaleKeys.labResults.tr(context: context), + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.lab_result_icon, + iconSize: 40.w, + isLargeText: true, + ), + MedicalFileCard( + label: "Radiology Results".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.radiology_icon, + iconSize: 40.w, + isLargeText: true, + ), + ], + ), + SizedBox(height: 16.h), + LocaleKeys.prescriptions.tr().toText18(isBold: true), + SizedBox(height: 16.h), + Consumer(builder: (context, prescriptionVM, child) { + return prescriptionVM.isPrescriptionsDetailsLoading + ? const MoviesShimmerWidget() + : Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: Colors.white, + borderRadius: 20.r, + ), + padding: EdgeInsets.all(16.w), + child: Column( + children: [ + ListView.separated( + itemCount: prescriptionVM.prescriptionDetailsList.length, + shrinkWrap: true, + padding: EdgeInsets.only(right: 8.w), + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: Row( + children: [ + Utils.buildSvgWithAssets( + icon: AppAssets.prescription_item_icon, + width: 40.h, + height: 40.h, + ), + SizedBox(width: 8.h), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + children: [ + prescriptionVM.prescriptionDetailsList[index].itemDescription! + .toText12(isBold: true, maxLine: 1), + "Prescribed By: ${widget.patientAppointmentHistoryResponseModel.doctorTitle} ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}" + .needTranslation + .toText10( + weight: FontWeight.w500, + color: AppColors.greyTextColor, + letterSpacing: -0.4), + ], + ), + SizedBox(width: 68.w), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.blackColor, + width: 18.w, + height: 13.h, + fit: BoxFit.contain, + ), + ), + ], + ), + ], + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ).onPress(() { + prescriptionVM.setPrescriptionsDetailsLoading(); + Navigator.of(context).push( + CustomPageRoute( + page: PrescriptionDetailPage(prescriptionsResponseModel: getPrescriptionRequestModel()), + ), + ); + }), + SizedBox(height: 16.h), + const Divider(color: AppColors.dividerColor), + SizedBox(height: 16.h), + Wrap( + runSpacing: 6.w, + children: [ + // Expanded( + // child: CustomButton( + // text: widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? LocaleKeys.resendOrder.tr(context: context) : LocaleKeys.prescriptionDeliveryError.tr(context: context), + // onPressed: () {}, + // backgroundColor: AppColors.secondaryLightRedColor, + // borderColor: AppColors.secondaryLightRedColor, + // textColor: AppColors.primaryRedColor, + // fontSize: 14, + // fontWeight: FontWeight.w500, + // borderRadius: 12.h, + // height: 40.h, + // icon: AppAssets.appointment_calendar_icon, + // iconColor: AppColors.primaryRedColor, + // iconSize: 16.h, + // ), + // ), + // SizedBox(width: 16.h), + Expanded( + child: CustomButton( + text: "Refill & Delivery".needTranslation, + onPressed: () { + Navigator.of(context) + .push( + CustomPageRoute( + page: PrescriptionsListPage(), + ), + ) + .then((val) { + prescriptionsViewModel.setPrescriptionsDetailsLoading(); + prescriptionsViewModel.getPrescriptionDetails(getPrescriptionRequestModel()); + }); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + height: 40.h, + icon: AppAssets.requests, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + ), + ), + + SizedBox(width: 16.w), + Expanded( + child: CustomButton( + text: "All Prescriptions".needTranslation, + onPressed: () { + Navigator.of(context) + .push( + CustomPageRoute( + page: PrescriptionsListPage(), + ), + ) + .then((val) { + prescriptionsViewModel.setPrescriptionsDetailsLoading(); + prescriptionsViewModel.getPrescriptionDetails(getPrescriptionRequestModel()); + }); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + height: 40.h, + icon: AppAssets.requests, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + ), + ), + ], + ), + ], + ), + ); + }), + ], + ), + ], + ).paddingAll(24.w), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: SizedBox( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (widget.patientAppointmentHistoryResponseModel.nextAction == 15 || + widget.patientAppointmentHistoryResponseModel.nextAction == 20) + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Amount before tax".needTranslation.toText18(isBold: true), + Utils.getPaymentAmountWithSymbol( + widget.patientAppointmentHistoryResponseModel.patientShare!.toString().toText16(isBold: true), + AppColors.blackColor, + 13, + isSaudiCurrency: true), + ], + ), + SizedBox(height: 4.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: LocaleKeys.upcomingPaymentNow + .tr(context: context) + .toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor)), + "VAT 15%(${widget.patientAppointmentHistoryResponseModel.patientTaxAmount})" + .needTranslation + .toText14(isBold: true, color: AppColors.greyTextColor, letterSpacing: -2), + ], + ), + SizedBox(height: 18.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: 150.h, + child: Utils.getPaymentMethods(), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Utils.getPaymentAmountWithSymbol( + widget.patientAppointmentHistoryResponseModel.patientShareWithTax!.toString().toText24(isBold: true), + AppColors.blackColor, + 17, + isSaudiCurrency: true), + ], + ), + ], + ) + ], + ).paddingOnly(left: 16.h, top: 24.h, right: 16.h, bottom: 0.h), + AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) + ? CustomButton( + text: "Re-book Appointment".needTranslation, + onPressed: () { + openDoctorScheduleCalendar(); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 50.h, + icon: AppAssets.add_icon, + iconColor: AppColors.whiteColor, + iconSize: 18.h, + ).paddingSymmetrical(16.h, 24.h) + : CustomButton( + text: AppointmentType.getNextActionText(widget.patientAppointmentHistoryResponseModel.nextAction), + onPressed: () { + myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); + handleAppointmentNextAction(widget.patientAppointmentHistoryResponseModel.nextAction); + }, + backgroundColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction), + borderColor: + AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.01), + textColor: widget.patientAppointmentHistoryResponseModel.nextAction == 15 ? AppColors.textColor : AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 56.h, + icon: AppointmentType.getNextActionIcon(widget.patientAppointmentHistoryResponseModel.nextAction), + iconColor: AppColors.whiteColor, + iconSize: 18.h, + ).paddingSymmetrical(16.h, 24.h), + ], + ), + ), + ), + ], + ), + ); + } + + openDoctorScheduleCalendar() async { + DoctorsListResponseModel doctor = DoctorsListResponseModel( + clinicID: widget.patientAppointmentHistoryResponseModel.clinicID, + projectID: widget.patientAppointmentHistoryResponseModel.projectID, + doctorID: widget.patientAppointmentHistoryResponseModel.doctorID, + doctorImageURL: widget.patientAppointmentHistoryResponseModel.doctorImageURL, + doctorTitle: widget.patientAppointmentHistoryResponseModel.doctorTitle, + name: widget.patientAppointmentHistoryResponseModel.doctorNameObj, + nationalityFlagURL: "https://hmgwebservices.com/Images/flag/SYR.png", + speciality: [], + clinicName: widget.patientAppointmentHistoryResponseModel.clinicName, + projectName: widget.patientAppointmentHistoryResponseModel.projectName, + ); + bookAppointmentsViewModel.setSelectedDoctor(doctor); + LoaderBottomSheet.showLoader(loadingText: "Fetching Doctor Schedule, Please Wait...".needTranslation); + await bookAppointmentsViewModel.getDoctorFreeSlots( + isBookingForLiveCare: false, + onSuccess: (dynamic respData) async { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + title: "Pick a Date".needTranslation, + context, + child: AppointmentCalendar(), + isFullScreen: false, + isCloseButtonVisible: true, + callBackFunc: () {}, + ); + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } + + Future handleAppointmentNextAction(nextAction) async { + switch (nextAction) { + case 0: + break; + case 10: + LoaderBottomSheet.showLoader(loadingText: "Confirming Appointment, Please Wait...".needTranslation); + await myAppointmentsViewModel.confirmAppointment( + patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, + onSuccess: (apiResponse) { + LoaderBottomSheet.hideLoader(); + myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); + myAppointmentsViewModel.getPatientAppointments(true, false); + showCommonBottomSheet(context, child: Utils.getSuccessWidget(loadingText: "Appointment Confirmed Successfully".needTranslation), + callBackFunc: (str) { + Navigator.of(context).pop(); + }, + title: "", + height: ResponsiveExtension.screenHeight * 0.3, + isCloseButtonVisible: true, + isDismissible: false, + isFullScreen: false, + isSuccessDialog: true); + }); + // LoaderBottomSheet.hideLoader(); + case 15: + break; + case 20: + myAppointmentsViewModel.setIsPatientAppointmentShareLoading(true); + Navigator.of(context).push( + CustomPageRoute( + page: AppointmentPaymentPage(patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel), + ), + ); + case 50: + // return LocaleKeys.confirmLiveCare.tr(); + case 90: + showCommonBottomSheetWithoutHeight(context, + title: LocaleKeys.onlineCheckIn.tr(), + child: AppointmentCheckinBottomSheet( + patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, + myAppointmentsViewModel: myAppointmentsViewModel, + ), + callBackFunc: () {}, + isFullScreen: false); + default: + // return "No Action".needTranslation; + } + } + + PatientPrescriptionsResponseModel getPrescriptionRequestModel() { + return PatientPrescriptionsResponseModel( + appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo, + setupID: widget.patientAppointmentHistoryResponseModel.setupID, + episodeID: widget.patientAppointmentHistoryResponseModel.episodeID, + clinicID: widget.patientAppointmentHistoryResponseModel.clinicID, + projectID: widget.patientAppointmentHistoryResponseModel.projectID, + dischargeNo: 0, + isInOutPatient: widget.patientAppointmentHistoryResponseModel.isInOutPatient, + isHomeMedicineDeliverySupported: false, + doctorImageURL: widget.patientAppointmentHistoryResponseModel.doctorImageURL, + doctorName: "${widget.patientAppointmentHistoryResponseModel.doctorTitle} ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}", + appointmentDate: widget.patientAppointmentHistoryResponseModel.appointmentDate, + clinicDescription: widget.patientAppointmentHistoryResponseModel.clinicName, + decimalDoctorRate: widget.patientAppointmentHistoryResponseModel.decimalDoctorRate, + name: widget.patientAppointmentHistoryResponseModel.projectName, + ); + } +} diff --git a/lib/presentation/appointments/appointment_payment_page.dart b/lib/presentation/appointments/appointment_payment_page.dart new file mode 100644 index 0000000..d4e579b --- /dev/null +++ b/lib/presentation/appointments/appointment_payment_page.dart @@ -0,0 +1,637 @@ +import 'dart:async'; +import 'dart:developer'; +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/services/cache_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/in_app_browser/InAppBrowser.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; +import 'package:smooth_corner/smooth_corner.dart'; + +class AppointmentPaymentPage extends StatefulWidget { + AppointmentPaymentPage({super.key, required this.patientAppointmentHistoryResponseModel}); + + PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; + + @override + State createState() => _AppointmentPaymentPageState(); +} + +class _AppointmentPaymentPageState extends State { + late MyAppointmentsViewModel myAppointmentsViewModel; + late PayfortViewModel payfortViewModel; + late AppState appState; + + MyInAppBrowser? browser; + String selectedPaymentMethod = ""; + + String transID = ""; + + bool isShowTamara = false; + String tamaraPaymentStatus = ""; + String tamaraOrderID = ""; + + @override + void initState() { + scheduleMicrotask(() { + payfortViewModel.initPayfortViewModel(); + payfortViewModel.setIsApplePayConfigurationLoading(false); + myAppointmentsViewModel.getPatientShareAppointment( + widget.patientAppointmentHistoryResponseModel.projectID, + widget.patientAppointmentHistoryResponseModel.clinicID, + widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(), widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false, onSuccess: (val) { + myAppointmentsViewModel.getTamaraInstallmentsDetails().then((val) { + if (myAppointmentsViewModel.patientAppointmentShareResponseModel!.patientShareWithTax! >= myAppointmentsViewModel.getTamaraInstallmentsDetailsResponseModel!.minLimit!.amount! && + myAppointmentsViewModel.patientAppointmentShareResponseModel!.patientShareWithTax! <= myAppointmentsViewModel.getTamaraInstallmentsDetailsResponseModel!.maxLimit!.amount!) { + setState(() { + isShowTamara = true; + }); + } + }); + }, onError: (err) { + Navigator.of(context).pop(); + Navigator.of(context).pop(); + }); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + myAppointmentsViewModel = Provider.of(context); + payfortViewModel = Provider.of(context); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Consumer(builder: (context, myAppointmentsVM, child) { + return Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Appointment Payment".needTranslation, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.mada, width: 72.h, height: 25.h).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading), + SizedBox(height: 16.h), + "Mada".needTranslation.toText16(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "MADA"; + openPaymentURL("mada"); + }), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.asset(AppAssets.visa, width: 50.h, height: 50.h), + SizedBox(width: 8.h), + Image.asset(AppAssets.Mastercard, width: 40.h, height: 40.h), + ], + ).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading), + SizedBox(height: 16.h), + "Visa or Mastercard".needTranslation.toText16(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "VISA"; + openPaymentURL("visa"); + }), + SizedBox(height: 16.h), + isShowTamara + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.tamara_en, width: 72.h, height: 25.h).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading), + SizedBox(height: 16.h), + "Tamara".needTranslation.toText16(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "TAMARA"; + openPaymentURL("tamara"); + }) + : SizedBox.shrink(), + ], + ), + ), + ), + ), + myAppointmentsVM.isAppointmentPatientShareLoading + ? SizedBox.shrink() + : Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Consumer(builder: (context, payfortVM, child) { + //TODO: Need to add loading state & animation for Apple Pay Configuration + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (myAppointmentsVM.patientAppointmentShareResponseModel!.isCash ?? true) + ? Container( + height: 50.h, + decoration: ShapeDecoration( + color: AppColors.secondaryLightRedBorderColor, + shape: SmoothRectangleBorder( + borderRadius: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)), + smoothness: 1, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Insurance expired or inactive".needTranslation.toText14(color: AppColors.primaryRedColor, weight: FontWeight.w500).paddingSymmetrical(24.h, 0.h), + CustomButton( + text: LocaleKeys.updateInsurance.tr(context: context), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: InsuranceHomePage(), + ), + ); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.secondaryLightRedBorderColor, + textColor: AppColors.whiteColor, + fontSize: 10.f, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(15, 0, 15, 0), + height: 30.h, + ).paddingSymmetrical(24.h, 0.h), + ], + ), + ) + : const SizedBox(), + SizedBox(height: 24.h), + "Total amount to pay".needTranslation.toText18(isBold: true).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 17.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Amount before tax".needTranslation.toText14(isBold: true), + Utils.getPaymentAmountWithSymbol(myAppointmentsVM.patientAppointmentShareResponseModel!.patientShare!.toString().toText16(isBold: true), AppColors.blackColor, 13, + isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "VAT 15%".needTranslation.toText14(isBold: true, color: AppColors.greyTextColor), + Utils.getPaymentAmountWithSymbol( + myAppointmentsVM.patientAppointmentShareResponseModel!.patientTaxAmount!.toString().toText14(isBold: true, color: AppColors.greyTextColor), + AppColors.greyTextColor, + 13, + isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 17.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "".needTranslation.toText14(isBold: true), + Utils.getPaymentAmountWithSymbol(myAppointmentsVM.patientAppointmentShareResponseModel!.patientShareWithTax!.toString().toText24(isBold: true), AppColors.blackColor, 17, + isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + Platform.isIOS + ? Utils.buildSvgWithAssets( + icon: AppAssets.apple_pay_button, + width: 200.h, + height: 80.h, + fit: BoxFit.contain, + ).paddingSymmetrical(24.h, 0.h).onPress(() { + // payfortVM.setIsApplePayConfigurationLoading(true); + if (Utils.havePrivilege(103)) { + startApplePay(); + } else { + openPaymentURL("ApplePay"); + } + }) + : SizedBox(height: 12.h), + SizedBox(height: 12.h), + ], + ); + }), + ), + ], + ); + }), + ); + } + + onBrowserLoadStart(String url) { + print("onBrowserLoadStart"); + print(url); + + if (selectedPaymentMethod == "tamara") { + if (Platform.isAndroid) { + Uri uri = new Uri.dataFromString(url); + tamaraPaymentStatus = uri.queryParameters['status']!; + tamaraOrderID = uri.queryParameters['AuthorizePaymentId']!; + } else { + Uri uri = new Uri.dataFromString(url); + tamaraPaymentStatus = uri.queryParameters['paymentStatus']!; + tamaraOrderID = uri.queryParameters['orderId']!; + } + } + + // if(selectedPaymentMethod != "TAMARA") { + MyInAppBrowser.successURLS.forEach((element) { + if (url.contains(element)) { + browser?.close(); + MyInAppBrowser.isPaymentDone = true; + return; + } + }); + // } + + // if(selectedPaymentMethod != "TAMARA") { + MyInAppBrowser.errorURLS.forEach((element) { + if (url.contains(element)) { + browser?.close(); + MyInAppBrowser.isPaymentDone = false; + return; + } + }); + // } + } + + onBrowserExit(bool isPaymentMade) async { + checkPaymentStatus(); + } + + void checkPaymentStatus() async { + LoaderBottomSheet.showLoader(loadingText: "Checking payment status, Please wait...".needTranslation); + if (selectedPaymentMethod == "TAMARA") { + await payfortViewModel.checkTamaraPaymentStatus( + transactionID: transID, + onSuccess: (apiResponse) async { + if (apiResponse.data["status"].toString().toLowerCase() == "success") { + tamaraOrderID = apiResponse.data["tamara_order_id"].toString(); + await payfortViewModel.updateTamaraRequestStatus(responseMessage: "success", status: "14", clientRequestID: transID, tamaraOrderID: tamaraOrderID); + await payfortViewModel.markAppointmentAsTamaraPaid( + projectID: widget.patientAppointmentHistoryResponseModel.projectID, appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo); + await myAppointmentsViewModel.addAdvanceNumberRequest( + advanceNumber: "Tamara-Advance-0000", + paymentReference: tamaraOrderID, + appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(), + onSuccess: (value) async { + if (widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment!) { + //TODO: Implement LiveCare Check-In API Call + await myAppointmentsViewModel.insertLiveCareVIDARequest( + clientRequestID: tamaraOrderID, + patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, + onSuccess: (apiResponse) { + Future.delayed(Duration(milliseconds: 500), () { + LoaderBottomSheet.hideLoader(); + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + }); + }, + onError: (error) {}); + } else { + await myAppointmentsViewModel.generateAppointmentQR( + clinicID: widget.patientAppointmentHistoryResponseModel.clinicID, + projectID: widget.patientAppointmentHistoryResponseModel.projectID, + appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(), + isFollowUp: myAppointmentsViewModel.patientAppointmentShareResponseModel!.isFollowup!, + onSuccess: (apiResponse) { + Future.delayed(Duration(milliseconds: 500), () { + LoaderBottomSheet.hideLoader(); + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + }); + }); + } + }); + } else { + await payfortViewModel.updateTamaraRequestStatus(responseMessage: "Failed", status: "00", clientRequestID: transID, tamaraOrderID: tamaraOrderID); + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Payment Failed! Please try again.".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } else { + await payfortViewModel.checkPaymentStatus( + transactionID: transID, + onSuccess: (apiResponse) async { + print(apiResponse.data); + if (payfortViewModel.payfortCheckPaymentStatusResponseModel!.responseMessage!.toLowerCase() == "success") { + await myAppointmentsViewModel.createAdvancePayment( + paymentMethodName: selectedPaymentMethod, + projectID: widget.patientAppointmentHistoryResponseModel.projectID, + clinicID: widget.patientAppointmentHistoryResponseModel.clinicID, + appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(), + payedAmount: payfortViewModel.payfortCheckPaymentStatusResponseModel!.amount!, + paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!, + patientID: appState.getAuthenticatedUser()!.patientId.toString(), + patientType: appState.getAuthenticatedUser()!.patientType!, + onSuccess: (value) async { + print(value); + await myAppointmentsViewModel.addAdvanceNumberRequest( + advanceNumber: Utils.isVidaPlusProject(widget.patientAppointmentHistoryResponseModel.projectID) + ? value.data['OnlineCheckInAppointments'][0]['AdvanceNumber_VP'].toString() + : value.data['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(), + paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!, + appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(), + onSuccess: (value) async { + if (widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment!) { + //TODO: Implement LiveCare Check-In API Call + await myAppointmentsViewModel.insertLiveCareVIDARequest( + clientRequestID: transID, + patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, + onSuccess: (apiResponse) { + Future.delayed(Duration(milliseconds: 500), () { + LoaderBottomSheet.hideLoader(); + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + }); + }, + onError: (error) {}); + } else { + await myAppointmentsViewModel.generateAppointmentQR( + clinicID: widget.patientAppointmentHistoryResponseModel.clinicID, + projectID: widget.patientAppointmentHistoryResponseModel.projectID, + appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(), + isFollowUp: myAppointmentsViewModel.patientAppointmentShareResponseModel!.isFollowup!, + onSuccess: (apiResponse) { + Future.delayed(Duration(milliseconds: 500), () { + LoaderBottomSheet.hideLoader(); + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + }); + }); + } + }); + }); + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Payment Failed! Please try again.".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }); + } + } + + openPaymentURL(String paymentMethod) { + browser = MyInAppBrowser(onExitCallback: onBrowserExit, onLoadStartCallback: onBrowserLoadStart, context: context); + transID = Utils.getAppointmentTransID( + widget.patientAppointmentHistoryResponseModel.projectID, + widget.patientAppointmentHistoryResponseModel.clinicID, + widget.patientAppointmentHistoryResponseModel.appointmentNo, + ); + + //TODO: Need to pass dynamic params to the payment request instead of static values + browser?.openPaymentBrowser( + myAppointmentsViewModel.patientAppointmentShareResponseModel!.patientShareWithTax!, + "Appointment check in", + transID, + widget.patientAppointmentHistoryResponseModel.projectID.toString(), + "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", + selectedPaymentMethod, + appState.getAuthenticatedUser()!.patientType.toString(), + "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", + appState.getAuthenticatedUser()!.patientId.toString(), + appState.getAuthenticatedUser()!, + browser!, + widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false, + "2", + widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? myAppointmentsViewModel.patientAppointmentShareResponseModel!.clinicID.toString() : "", + context, + myAppointmentsViewModel.patientAppointmentShareResponseModel!.appointmentDate, + myAppointmentsViewModel.patientAppointmentShareResponseModel!.appointmentNo, + myAppointmentsViewModel.patientAppointmentShareResponseModel!.clinicID, + myAppointmentsViewModel.patientAppointmentShareResponseModel!.doctorID, + "3"); + } + + startApplePay() async { + LoaderBottomSheet.showLoader(); + transID = Utils.getAppointmentTransID( + widget.patientAppointmentHistoryResponseModel.projectID, + widget.patientAppointmentHistoryResponseModel.clinicID, + widget.patientAppointmentHistoryResponseModel.appointmentNo, + ); + + ApplePayInsertRequest applePayInsertRequest = ApplePayInsertRequest(); + + await payfortViewModel.getPayfortConfigurations( + serviceId: ServiceTypeEnum.appointmentPayment.getIdFromServiceEnum(), projectId: widget.patientAppointmentHistoryResponseModel.projectID, integrationId: 2); + + applePayInsertRequest.clientRequestID = transID; + applePayInsertRequest.clinicID = widget.patientAppointmentHistoryResponseModel.clinicID; + + applePayInsertRequest.currency = appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED"; + applePayInsertRequest.customerEmail = "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com"; + applePayInsertRequest.customerID = appState.getAuthenticatedUser()!.patientId.toString(); + applePayInsertRequest.customerName = "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}"; + + applePayInsertRequest.deviceToken = await Utils.getStringFromPrefs(CacheConst.pushToken); + applePayInsertRequest.voipToken = await Utils.getStringFromPrefs(CacheConst.voipToken); + applePayInsertRequest.doctorID = widget.patientAppointmentHistoryResponseModel.doctorID; + applePayInsertRequest.projectID = widget.patientAppointmentHistoryResponseModel.projectID.toString(); + applePayInsertRequest.serviceID = ServiceTypeEnum.appointmentPayment.getIdFromServiceEnum().toString(); + applePayInsertRequest.channelID = 3; + applePayInsertRequest.patientID = appState.getAuthenticatedUser()!.patientId.toString(); + applePayInsertRequest.patientTypeID = appState.getAuthenticatedUser()!.patientType; + applePayInsertRequest.patientOutSA = appState.getAuthenticatedUser()!.outSa; + applePayInsertRequest.appointmentDate = widget.patientAppointmentHistoryResponseModel.appointmentDate; + applePayInsertRequest.appointmentNo = widget.patientAppointmentHistoryResponseModel.appointmentNo; + applePayInsertRequest.orderDescription = "Appointment Payment"; + applePayInsertRequest.liveServiceID = "0"; + applePayInsertRequest.latitude = "0.0"; + applePayInsertRequest.longitude = "0.0"; + applePayInsertRequest.amount = myAppointmentsViewModel.patientAppointmentShareResponseModel!.patientShareWithTax!.toString(); + applePayInsertRequest.isSchedule = widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? "1" : "0"; + applePayInsertRequest.language = appState.isArabic() ? 'ar' : 'en'; + applePayInsertRequest.languageID = appState.isArabic() ? 1 : 2; + applePayInsertRequest.userName = appState.getAuthenticatedUser()!.patientId; + applePayInsertRequest.responseContinueURL = "http://hmg.com/Documents/success.html"; + applePayInsertRequest.backClickUrl = "http://hmg.com/Documents/success.html"; + applePayInsertRequest.paymentOption = "ApplePay"; + + applePayInsertRequest.isMobSDK = true; + applePayInsertRequest.merchantReference = transID; + applePayInsertRequest.merchantIdentifier = payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier; + applePayInsertRequest.commandType = "PURCHASE"; + applePayInsertRequest.signature = payfortViewModel.payfortProjectDetailsRespModel!.signature; + applePayInsertRequest.accessCode = payfortViewModel.payfortProjectDetailsRespModel!.accessCode; + applePayInsertRequest.shaRequestPhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaRequest; + applePayInsertRequest.shaResponsePhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaResponse; + applePayInsertRequest.returnURL = ""; + + //TODO: Need to pass dynamic params to the Apple Pay instead of static values + await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) { + payfortViewModel.paymentWithApplePay( + customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", + // customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress, + customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", + orderDescription: "Appointment Payment", + orderAmount: double.parse(myAppointmentsViewModel.patientAppointmentShareResponseModel!.patientShareWithTax!.toString()), + merchantReference: transID, + merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier, + applePayAccessCode: payfortViewModel.payfortProjectDetailsRespModel!.accessCode, + applePayShaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel!.shaRequest, + currency: appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED", + onFailed: (failureResult) async { + log("failureResult: ${failureResult.message.toString()}"); + Navigator.of(context).pop(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: failureResult.message.toString()), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }, + onSucceeded: (successResult) async { + log("successResult: ${successResult.responseMessage.toString()}"); + selectedPaymentMethod = successResult.paymentOption ?? "VISA"; + checkPaymentStatus(); + }, + // projectId: appo.projectID, + // serviceTypeEnum: ServiceTypeEnum.appointmentPayment, + ); + }); + } +} diff --git a/lib/presentation/appointments/my_appointments_page.dart b/lib/presentation/appointments/my_appointments_page.dart new file mode 100644 index 0000000..934aca4 --- /dev/null +++ b/lib/presentation/appointments/my_appointments_page.dart @@ -0,0 +1,212 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/appointemnet_filters.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/AppointmentFilter.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/date_range_calender.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +import '../../widgets/common_bottom_sheet.dart' show showCommonBottomSheetWithoutHeight; + +class MyAppointmentsPage extends StatefulWidget { + const MyAppointmentsPage({super.key}); + + @override + State createState() => _MyAppointmentsPageState(); +} + +class _MyAppointmentsPageState extends State { + late MyAppointmentsViewModel myAppointmentsViewModel; + late BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + void initState() { + scheduleMicrotask(() { + myAppointmentsViewModel.initAppointmentsViewModel(); + myAppointmentsViewModel.getPatientAppointments(true, false); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + myAppointmentsViewModel = Provider.of(context, listen: false); + bookAppointmentsViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: "Appointments List".needTranslation, + child: SingleChildScrollView( + child: Column( + children: [ + SizedBox(height: 16.h), + CustomTabBar( + activeTextColor: Color(0xffED1C2B), + activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), + tabs: [ + CustomTabBarModel(null, "All Appt.".needTranslation), + CustomTabBarModel(null, "Upcoming".needTranslation), + CustomTabBarModel(null, "Completed".needTranslation), + ], + onTabChange: (index) { + myAppointmentsViewModel.onTabChange(index); + myAppointmentsViewModel.updateListWRTTab(index); + context.read().flush(); + }, + ).paddingSymmetrical(24.h, 0.h), + Consumer(builder: (context, myAppointmentsVM, child) { + return getSelectedTabData(myAppointmentsVM.selectedTabIndex, myAppointmentsVM); + }), + ], + ), + ), + ), + ); + } + + Widget getSelectedTabData(int index, MyAppointmentsViewModel myAppointmentsVM) { + return getAppointList(myAppointmentsVM, myAppointmentsVM.filteredAppointmentList); + } + + Widget getAppointList(MyAppointmentsViewModel myAppointmentsVM, List filteredAppointmentList) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Visibility(visible: myAppointmentsVM.availableFilters.isNotEmpty, child: getAppointmentFilters(myAppointmentsVM)), + ListView.separated( + padding: EdgeInsets.only(top: 16.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: myAppointmentsVM.isMyAppointmentsLoading + ? 5 + : filteredAppointmentList.isNotEmpty + ? filteredAppointmentList.length + : 1, + itemBuilder: (context, index) { + return myAppointmentsVM.isMyAppointmentsLoading + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: AppointmentCard( + patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel(), + myAppointmentsViewModel: myAppointmentsViewModel, + bookAppointmentsViewModel: bookAppointmentsViewModel, + isLoading: true, + isFromHomePage: false, + ), + ).paddingSymmetrical(24.h, 0.h) + : filteredAppointmentList.isNotEmpty + ? AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: AppointmentCard( + patientAppointmentHistoryResponseModel: filteredAppointmentList[index], + myAppointmentsViewModel: myAppointmentsViewModel, + bookAppointmentsViewModel: bookAppointmentsViewModel, + isLoading: false, + isFromHomePage: false, + ), + ).paddingSymmetrical(24.h, 0.h), + ), + ), + ) + : Utils.getNoDataWidget( + context, + noDataText: "You don't have any appointments yet.".needTranslation, + callToActionButton: CustomButton( + text: LocaleKeys.bookAppo.tr(context: context), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: BookAppointmentPage(), + ), + ); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Color(0xffED1C2B), + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(10.w, 0, 10.w, 0), + height: 40.h, + icon: AppAssets.add_icon, + iconColor: AppColors.primaryRedColor, + ).paddingSymmetrical(48.h, 0.h), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + SizedBox(height: 24.h), + ], + ); + } + + Widget getAppointmentFilters(MyAppointmentsViewModel myAppointmentsVM) { + return SizedBox( + height: 60.h, + child: Row( + children: [ + Expanded( + child: ListView.separated( + separatorBuilder: (_, index) => SizedBox( + width: 8.h, + ), + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemCount: myAppointmentsVM.availableFilters.length, + itemBuilder: (_, index) => AppointmentFilters( + selectedFilter: myAppointmentsVM.selectedFilter, + item: myAppointmentsVM.availableFilters[index], + onClicked: () { + if (myAppointmentsVM.availableFilters[index] == AppointmentListingFilters.DATESELECTION) { + showCommonBottomSheetWithoutHeight( + title: "Set The Date Range".needTranslation, + context, + child: DateRangeSelector( + onRangeSelected: (start, end) { + // if (start != null) { + myAppointmentsVM.getSelectedDateRange(start, end); + // } + }, + ), + isFullScreen: false, + isCloseButtonVisible: true, + callBackFunc: () {}, + ); + } else { + myAppointmentsVM.setSelectedFilter(myAppointmentsVM.availableFilters[index]); + myAppointmentsVM.filterTheListAsPerSelection(); + } + }, + )), + ), + ], + )).paddingOnly(top: 16.h, left: 24.h, right: 24.h); + } +} diff --git a/lib/presentation/appointments/my_doctors_page.dart b/lib/presentation/appointments/my_doctors_page.dart new file mode 100644 index 0000000..51e9703 --- /dev/null +++ b/lib/presentation/appointments/my_doctors_page.dart @@ -0,0 +1,198 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_profile_page.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +import '../../widgets/chip/app_custom_chip_widget.dart'; + +class MyDoctorsPage extends StatelessWidget { + MyDoctorsPage({super.key}); + + late MyAppointmentsViewModel myAppointmentsViewModel; + late BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + myAppointmentsViewModel = Provider.of(context, listen: false); + bookAppointmentsViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: LocaleKeys.myDoctor.tr(context: context), + child: SingleChildScrollView( + child: Consumer(builder: (context, myAppointmentsVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + ListView.separated( + scrollDirection: Axis.vertical, + itemCount: myAppointmentsVM.isPatientMyDoctorsLoading ? 5 : myAppointmentsVM.patientMyDoctorsList.length, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.only(left: 24.h, right: 24.h), + itemBuilder: (context, index) { + return myAppointmentsVM.isPatientMyDoctorsLoading + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", + width: 63.h, + height: 63.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: true), + SizedBox(width: 16.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Dr John Smith".toText16(isBold: true).toShimmer2(isShow: true), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget(labelText: "").toShimmer2(isShow: true, width: 16.h), + AppCustomChipWidget(labelText: "").toShimmer2(isShow: true, width: 16.h), + ], + ), + ], + ), + ), + ], + ), + ], + ), + ), + ) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 1000), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + myAppointmentsVM.patientMyDoctorsList[index].doctorImageURL!, + width: 63.h, + height: 63.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: false), + SizedBox(width: 16.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (myAppointmentsVM.patientMyDoctorsList[index].doctorName).toString().toText16(isBold: true).toShimmer2(isShow: false), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget(labelText: myAppointmentsVM.patientMyDoctorsList[index].clinicName).toShimmer2(isShow: false, width: 16.h), + AppCustomChipWidget(labelText: myAppointmentsVM.patientMyDoctorsList[index].projectName).toShimmer2(isShow: false, width: 16.h), + ], + ), + ], + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "".toText16(), + Transform.flip( + flipX: appState.isArabic(), + child: + Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon_small, width: 15.h, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor)), + ], + ), + ], + ), + ), + ).onPress(() async { + bookAppointmentsViewModel.setSelectedDoctor(DoctorsListResponseModel( + clinicID: myAppointmentsVM.patientMyDoctorsList[index].clinicID, + projectID: myAppointmentsVM.patientMyDoctorsList[index].projectID, + doctorID: myAppointmentsVM.patientMyDoctorsList[index].doctorID, + )); + LoaderBottomSheet.showLoader(); + await bookAppointmentsViewModel.getDoctorProfile(onSuccess: (dynamic respData) { + LoaderBottomSheet.hideLoader(); + Navigator.of(context).push( + CustomPageRoute( + page: DoctorProfilePage(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + SizedBox(height: 60.h), + ], + ); + }), + ), + ), + ); + } +} diff --git a/lib/presentation/appointments/widgets/AppointmentFilter.dart b/lib/presentation/appointments/widgets/AppointmentFilter.dart new file mode 100644 index 0000000..98da22d --- /dev/null +++ b/lib/presentation/appointments/widgets/AppointmentFilter.dart @@ -0,0 +1,48 @@ +import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/appointemnet_filters.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:smooth_corner/smooth_corner.dart'; + +class AppointmentFilters extends StatelessWidget { + final AppointmentListingFilters item; + final List? selectedFilter; + final VoidCallback onClicked; + + const AppointmentFilters( + {super.key, + required this.item, + required this.onClicked, + required this.selectedFilter}); + + @override + Widget build(BuildContext context) { + return AppCustomChipWidget( + backgroundColor: selectedFilter?.contains(item) == true?AppColors.chipSecondaryLightRedColor:AppColors.whiteColor, + icon: item.leadingIcon, + textColor: selectedFilter?.contains(item) == true + ? AppColors.chipPrimaryRedBorderColor: AppColors.blackColor, + labelText: item.labelText.isNotEmpty?item.labelText.tr():"", + iconHasColor: true, + iconColor: selectedFilter?.contains(item) == true + ? AppColors.chipPrimaryRedBorderColor:AppColors.blackColor, + iconSize: 16, + deleteIcon: item.trailingIcon, + labelPadding: EdgeInsetsDirectional.only(start: 8.h, end: 0.h), + padding: EdgeInsets.symmetric(vertical: 12.h, horizontal: 8.h), + deleteIconSize: Size(18.h, 18.h), + shape: SmoothRectangleBorder( + borderRadius: BorderRadius.circular(10.h), + smoothness: 10.h, + side: BorderSide( + color: selectedFilter?.contains(item) == true + ? AppColors.chipPrimaryRedBorderColor + : AppColors.borderGrayColor, + width: 1), + )).onPress(onClicked); + } +} diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart new file mode 100644 index 0000000..e451088 --- /dev/null +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -0,0 +1,378 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/appointment_details_page.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/ask_doctor_request_type_select.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/eye_measurement_details_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; + +class AppointmentCard extends StatelessWidget { + final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; + final MyAppointmentsViewModel myAppointmentsViewModel; + final bool isLoading; + final bool isFromHomePage; + final bool isFromMedicalReport; + final bool isForEyeMeasurements; + final MedicalFileViewModel? medicalFileViewModel; + final BookAppointmentsViewModel bookAppointmentsViewModel; + + const AppointmentCard({ + super.key, + required this.patientAppointmentHistoryResponseModel, + required this.myAppointmentsViewModel, + required this.bookAppointmentsViewModel, + this.isLoading = false, + this.isFromHomePage = false, + this.isFromMedicalReport = false, + this.isForEyeMeasurements = false, + this.medicalFileViewModel, + }); + + @override + Widget build(BuildContext context) { + final appState = getIt.get(); + return InkWell( + onTap: () => _goToDetails(context), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildHeader(context, appState), + SizedBox(height: 16.h), + _buildDoctorRow(context), + SizedBox(height: 16.h), + _buildActionArea(context, appState), + ], + ), + ), + ); + } + + Widget _buildHeader(BuildContext context, AppState appState) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: _buildChips(context, appState)), + ], + ); + } + + Widget _buildChips(BuildContext context, AppState appState) { + final isLiveCare = !isLoading && patientAppointmentHistoryResponseModel.isLiveCareAppointment!; + + return Wrap( + alignment: WrapAlignment.start, + direction: Axis.horizontal, + spacing: 6.w, + runSpacing: 6.h, + children: [ + AppCustomChipWidget( + icon: isLoading ? AppAssets.walkin_appointment_icon : (isLiveCare ? AppAssets.small_livecare_icon : AppAssets.walkin_appointment_icon), + iconColor: isLoading ? AppColors.textColor : (isLiveCare ? AppColors.whiteColor : AppColors.textColor), + labelText: isLoading ? 'Walk In'.needTranslation : (isLiveCare ? LocaleKeys.livecare.tr(context: context) : 'Walk In'.needTranslation), + backgroundColor: isLoading ? AppColors.greyColor : (isLiveCare ? AppColors.successColor : AppColors.greyColor), + textColor: isLoading ? AppColors.textColor : (isLiveCare ? AppColors.whiteColor : AppColors.textColor), + ).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + labelText: isLoading + ? 'OutPatient'.needTranslation + : (appState.isArabic() + ? patientAppointmentHistoryResponseModel.isInOutPatientDescriptionN! + : patientAppointmentHistoryResponseModel.isInOutPatientDescription!), + backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.1), + textColor: AppColors.primaryRedColor, + ).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + labelText: isLoading + ? 'Booked'.needTranslation + : AppointmentType.getAppointmentStatusType(patientAppointmentHistoryResponseModel.patientStatusType!), + backgroundColor: AppColors.successColor.withValues(alpha: 0.1), + textColor: AppColors.successColor, + ).toShimmer2(isShow: isLoading), + ], + ).toShimmer2(isShow: isLoading); + } + + Widget _buildDoctorRow(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + isLoading + ? 'https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png' + : patientAppointmentHistoryResponseModel.doctorImageURL!, + width: 63.h, + height: 63.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: isLoading), + SizedBox(width: 16.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (isLoading + ? 'https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png' + : patientAppointmentHistoryResponseModel.doctorNameObj!) + .toText16(isBold: true, maxlines: 1) + .toShimmer2(isShow: isLoading), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + if (!isFromHomePage) + AppCustomChipWidget(labelText: isLoading ? 'Cardiology' : patientAppointmentHistoryResponseModel.clinicName!) + .toShimmer2(isShow: isLoading), + if (!isFromHomePage) + AppCustomChipWidget(labelText: isLoading ? 'Olaya' : patientAppointmentHistoryResponseModel.projectName!) + .toShimmer2(isShow: isLoading), + AppCustomChipWidget( + icon: AppAssets.appointment_calendar_icon, + labelText: isLoading + ? 'Cardiology' + : DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false), + ).toShimmer2(isShow: isLoading), + if (!isFromMedicalReport) + AppCustomChipWidget( + icon: AppAssets.appointment_time_icon, + labelText: isLoading + ? 'Cardiology' + : DateUtil.formatDateToTimeLang( + DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false), + ).toShimmer2(isShow: isLoading), + ], + ), + ], + ), + ), + ], + ); + } + + Widget _buildActionArea(BuildContext context, AppState appState) { + if (isFromMedicalReport) { + if (isForEyeMeasurements) { + return SizedBox.shrink(); + } else { + return CustomButton( + text: 'Select appointment'.needTranslation, + onPressed: () { + medicalFileViewModel!.setSelectedMedicalReportAppointment(patientAppointmentHistoryResponseModel); + Navigator.pop(context, false); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: isTablet || isFoldable ? 46.h : 40.h, + icon: AppAssets.checkmark_icon, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + ); + } + } + + return Row( + children: [ + Expanded( + flex: 6, + child: (AppointmentType.isArrived(patientAppointmentHistoryResponseModel) + ? _getArrivedButton(context) + : CustomButton( + text: AppointmentType.getNextActionText(patientAppointmentHistoryResponseModel.nextAction), + onPressed: () => _goToDetails(context), + backgroundColor: + AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.15), + borderColor: + AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), + textColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: isTablet || isFoldable ? 46.h : 40.h, + icon: AppointmentType.getNextActionIcon(patientAppointmentHistoryResponseModel.nextAction), + iconColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), + iconSize: 15.h, + )) + .toShimmer2(isShow: isLoading), + ), + SizedBox(width: 8.h), + Expanded( + flex: 1, + child: Container( + height: (isFoldable || isTablet) ? 50.h : 40.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.textColor, borderRadius: 10.h), + child: Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.whiteColor, + width: 24.w, + height: 24.h, + fit: BoxFit.contain, + ), + ), + ).toShimmer2(isShow: isLoading).onPress(() { + _goToDetails(context); + }), + ), + ], + ); + } + + Widget _getArrivedButton(BuildContext context) { + final isRecent = DateTime.now().difference(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate)).inDays <= 15; + + if (isRecent) { + return CustomButton( + text: LocaleKeys.askDoctor.tr(context: context), + onPressed: () async { + LoaderBottomSheet.showLoader(loadingText: "Checking doctor availability...".needTranslation); + await myAppointmentsViewModel.isDoctorAvailable( + projectID: patientAppointmentHistoryResponseModel.projectID, + doctorId: patientAppointmentHistoryResponseModel.doctorID, + clinicId: patientAppointmentHistoryResponseModel.clinicID, + onSuccess: (value) async { + if (value) { + print("Doctor is available"); + await myAppointmentsViewModel.getAskDoctorRequestTypes(onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.askDoctor.tr(context: context), + child: AskDoctorRequestTypeSelect( + askDoctorRequestTypeList: myAppointmentsViewModel.askDoctorRequestTypeList, + myAppointmentsViewModel: myAppointmentsViewModel, + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } else { + print("Doctor is not available"); + } + }); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: isTablet || isFoldable ? 46.h : 40.h, + icon: AppAssets.ask_doctor_icon, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + ); + } + + return CustomButton( + text: 'Rebook with same doctor'.needTranslation, + onPressed: () => openDoctorScheduleCalendar(context), + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: isTablet || isFoldable ? 46.h : 40.h, + icon: AppAssets.rebook_appointment_icon, + iconColor: AppColors.blackColor, + iconSize: 16.h, + ); + } + + void _goToDetails(BuildContext context) { + if (isForEyeMeasurements) { + Navigator.of(context).push( + CustomPageRoute( + page: EyeMeasurementDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), + ), + ); + } else { + Navigator.of(context) + .push( + CustomPageRoute( + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), + ), + ) + .then((_) { + myAppointmentsViewModel.initAppointmentsViewModel(); + myAppointmentsViewModel.getPatientAppointments(true, false); + }); + } + } + + void openDoctorScheduleCalendar(BuildContext context) async { + final doctor = DoctorsListResponseModel( + clinicID: patientAppointmentHistoryResponseModel.clinicID, + projectID: patientAppointmentHistoryResponseModel.projectID, + doctorID: patientAppointmentHistoryResponseModel.doctorID, + doctorImageURL: patientAppointmentHistoryResponseModel.doctorImageURL, + doctorTitle: patientAppointmentHistoryResponseModel.doctorTitle, + name: patientAppointmentHistoryResponseModel.doctorNameObj, + nationalityFlagURL: 'https://hmgwebservices.com/Images/flag/SYR.png', + speciality: [], + clinicName: patientAppointmentHistoryResponseModel.clinicName, + projectName: patientAppointmentHistoryResponseModel.projectName, + ); + + bookAppointmentsViewModel.setSelectedDoctor(doctor); + LoaderBottomSheet.showLoader(); + + await bookAppointmentsViewModel.getDoctorFreeSlots( + isBookingForLiveCare: false, + onSuccess: (respData) async { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: AppointmentCalendar(), + callBackFunc: () {}, + title: 'Pick a Date'.needTranslation, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }, + ); + } +} diff --git a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart new file mode 100644 index 0000000..74ab6b7 --- /dev/null +++ b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart @@ -0,0 +1,171 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_nfc_kit/flutter_nfc_kit.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/ProjectDetailListModel.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:barcode_scan2/barcode_scan2.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/nfc/nfc_reader_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; + +class AppointmentCheckinBottomSheet extends StatelessWidget { + AppointmentCheckinBottomSheet({super.key, required this.patientAppointmentHistoryResponseModel, required this.myAppointmentsViewModel}); + + PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; + MyAppointmentsViewModel myAppointmentsViewModel; + + bool _supportsNFC = false; + + late LocationUtils locationUtils; + late AppState appState; + ProjectDetailListModel projectDetailListModel = ProjectDetailListModel(); + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + FlutterNfcKit.nfcAvailability.then((value) { + _supportsNFC = (value == NFCAvailability.available); + }); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + checkInOptionCard( + AppAssets.checkin_location_icon, + "Live Location".needTranslation, + "Verify your location to be at hospital to check in".needTranslation, + ).onPress(() { + // locationUtils = LocationUtils( + // isShowConfirmDialog: false, + // navigationService: myAppointmentsViewModel.navigationService, + // appState: myAppointmentsViewModel.appState, + // ); + locationUtils.getCurrentLocation(onSuccess: (value) { + projectDetailListModel = Utils.getProjectDetailObj(appState, patientAppointmentHistoryResponseModel.projectID); + double dist = Utils.distance(value.latitude, value.longitude, double.parse(projectDetailListModel.latitude!), double.parse(projectDetailListModel.longitude!)).ceilToDouble() * 1000; + print(dist); + if (dist <= projectDetailListModel.geofenceRadius!) { + sendCheckInRequest(projectDetailListModel.checkInQrCode!, context); + } else { + showCommonBottomSheetWithoutHeight(context, + title: "Error".needTranslation, + child: Utils.getErrorWidget(loadingText: "Please ensure you're within the hospital location to perform online check-in.".needTranslation), callBackFunc: () { + Navigator.of(context).pop(); + }, isFullScreen: false); + } + }); + }), + SizedBox(height: 16.h), + checkInOptionCard( + AppAssets.checkin_nfc_icon, + "NFC (Near Field Communication)".needTranslation, + "Scan your phone via NFC board to check in".needTranslation, + ).onPress(() { + Future.delayed(const Duration(milliseconds: 500), () { + showNfcReader(context, onNcfScan: (String nfcId) { + Future.delayed(const Duration(milliseconds: 100), () { + sendCheckInRequest(nfcId, context); + }); + }, onCancel: () {}); + }); + }), + SizedBox(height: 16.h), + checkInOptionCard( + AppAssets.checkin_qr_icon, + "QR Code".needTranslation, + "Scan QR code with your camera to check in".needTranslation, + ).onPress(() async { + String onlineCheckInQRCode = (await BarcodeScanner.scan().then((value) => value.rawContent)); + if (onlineCheckInQRCode != "") { + sendCheckInRequest(onlineCheckInQRCode, context); + } else {} + }), + ], + ); + } + + Widget checkInOptionCard(String icon, String title, String subTitle) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: icon, width: 40.h, height: 40.h, fit: BoxFit.fill), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title.toText16(isBold: true, color: AppColors.textColor), + subTitle.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ), + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ), + ), + ], + ), + ], + ).paddingAll(16.h), + ); + } + + void sendCheckInRequest(String scannedCode, BuildContext context) async { + LoaderBottomSheet.showLoader(loadingText: "Processing Check-In...".needTranslation); + await myAppointmentsViewModel.sendCheckInNfcRequest( + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + scannedCode: scannedCode, + checkInType: 2, + onSuccess: (apiResponse) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight(context, title: "Success".needTranslation, child: Utils.getSuccessWidget(loadingText: LocaleKeys.success.tr()), callBackFunc: () { + Navigator.of(context).pop(); + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + Navigator.of(context).push( + CustomPageRoute(page: MyAppointmentsPage()), + ); + }, isFullScreen: false); + }, + onError: (error) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight(context, title: "Error".needTranslation, child: Utils.getErrorWidget(loadingText: error), callBackFunc: () { + Navigator.of(context).pop(); + }, isFullScreen: false); + }, + ); + } +} diff --git a/lib/presentation/appointments/widgets/appointment_doctor_card.dart b/lib/presentation/appointments/widgets/appointment_doctor_card.dart new file mode 100644 index 0000000..8d0f4e7 --- /dev/null +++ b/lib/presentation/appointments/widgets/appointment_doctor_card.dart @@ -0,0 +1,213 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; + +class AppointmentDoctorCard extends StatelessWidget { + const AppointmentDoctorCard( + {super.key, + required this.patientAppointmentHistoryResponseModel, + required this.onRescheduleTap, + required this.onCancelTap, + required this.onAskDoctorTap, this.renderWidgetForERDisplay = false}); + + final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; + final VoidCallback onRescheduleTap; + final VoidCallback onCancelTap; + final VoidCallback onAskDoctorTap; + final bool renderWidgetForERDisplay; + + @override + Widget build(BuildContext context) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + patientAppointmentHistoryResponseModel.doctorImageURL!, + width: 63.w, + height: 63.h, + fit: BoxFit.cover, + ).circle(100.r), + SizedBox(width: 16.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + patientAppointmentHistoryResponseModel.doctorNameObj!.toText16(isBold: true), + Wrap( + direction: Axis.horizontal, + spacing: 6.w, + runSpacing: 6.h, + children: [ + AppCustomChipWidget( + labelText: patientAppointmentHistoryResponseModel.clinicName!, + labelPadding: EdgeInsetsDirectional.only(start: 4.w, end: 4.w), + ), + AppCustomChipWidget( + labelText: patientAppointmentHistoryResponseModel.projectName!, + labelPadding: EdgeInsetsDirectional.only(start: 6.w, end: 6.w), + ), + AppCustomChipWidget( + icon: AppAssets.doctor_calendar_icon, + labelText: + "${DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false)}, ${DateUtil.formatDateToTimeLang( + DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), + false, + )}", + ), + AppCustomChipWidget( + icon: !patientAppointmentHistoryResponseModel.isLiveCareAppointment! + ? AppAssets.walkin_appointment_icon + : AppAssets.small_livecare_icon, + iconColor: !patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? AppColors.textColor : AppColors.whiteColor, + labelText: patientAppointmentHistoryResponseModel.isLiveCareAppointment! + ? LocaleKeys.livecare.tr(context: context) + : "Walk In".needTranslation, + backgroundColor: + !patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? AppColors.greyColor : AppColors.successColor, + textColor: !patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? AppColors.textColor : AppColors.whiteColor, + ), + AppCustomChipWidget( + icon: AppAssets.rating_icon, + iconColor: AppColors.ratingColorYellow, + labelText: "Rating: ${patientAppointmentHistoryResponseModel.decimalDoctorRate}"), + ], + ), + ], + ), + ), + ], + ), + SizedBox(height: 16.h), + + Visibility( + visible: renderWidgetForERDisplay == false, + child: getAppointmentActionButtons( + AppointmentType.isArrived(patientAppointmentHistoryResponseModel), + ), + ), + ], + ), + ), + ); + } + + Widget getAppointmentActionButtons(bool isAppointmentArrived) { + if (isAppointmentArrived) { + return DateTime.now().difference(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate)).inDays <= 15 + ? CustomButton( + text: LocaleKeys.askDoctor.tr(), + onPressed: () { + onAskDoctorTap(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(10.w, 0, 10.w, 0), + height: 40.h, + iconSize: 16.h, + icon: AppAssets.ask_doctor_icon, + iconColor: AppColors.primaryRedColor, + ) + : CustomButton( + text: "Rebook with same doctor".needTranslation, + onPressed: () { + onRescheduleTap(); + }, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(10.w, 0, 10.w, 0), + height: 40.h, + icon: AppAssets.rebook_appointment_icon, + iconColor: AppColors.blackColor, + iconSize: 16.h, + ); + } else { + return patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false + ? CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: () { + onCancelTap(); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + height: 40.h, + icon: AppAssets.cancel, + iconColor: AppColors.whiteColor, + iconSize: 16.h, + ) + : Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.reschedule.tr(), + onPressed: () { + onRescheduleTap(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + height: 40.h, + icon: AppAssets.appointment_calendar_icon, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + ), + ), + SizedBox(width: 16.h), + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: () { + onCancelTap(); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + height: 40.h, + icon: AppAssets.cancel, + iconColor: AppColors.whiteColor, + iconSize: 16.h, + ), + ), + ], + ); + } + } +} diff --git a/lib/presentation/appointments/widgets/appointment_queueing_screen.dart b/lib/presentation/appointments/widgets/appointment_queueing_screen.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart b/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart new file mode 100644 index 0000000..9f06a4d --- /dev/null +++ b/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart @@ -0,0 +1,138 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; + +class AskDoctorRequestTypeSelect extends StatelessWidget { + AskDoctorRequestTypeSelect({super.key, required this.askDoctorRequestTypeList, required this.myAppointmentsViewModel, required this.patientAppointmentHistoryResponseModel}); + + final MyAppointmentsViewModel myAppointmentsViewModel; + final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; + List askDoctorRequestTypeList = []; + int selectedParameterCodeValue = 2; + int selectedParameterCode = 0; + + final ValueNotifier requestTypeSelectNotifier = ValueNotifier(0); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + width: double.infinity, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24), + child: ListView.builder( + itemCount: askDoctorRequestTypeList.length, + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.only(top: 8, bottom: 8), + shrinkWrap: true, + itemBuilder: (context, index) { + return ValueListenableBuilder( + valueListenable: requestTypeSelectNotifier, + builder: (context, duration, child) { + return Theme( + data: Theme.of(context).copyWith( + listTileTheme: ListTileThemeData(horizontalTitleGap: 4), + ), + child: RadioListTile( + title: (askDoctorRequestTypeList[index].description ?? '').toText14(weight: FontWeight.w500), + value: index, + fillColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.selected)) { + return AppColors.primaryRedColor; + } + return Color(0xffEEEEEE); + }), + contentPadding: EdgeInsets.only(left: 12.h, right: 12.h), + groupValue: selectedParameterCode, + onChanged: (int? newValue) { + selectedParameterCode = newValue!; + selectedParameterCodeValue = askDoctorRequestTypeList[index].parameterCode!; + requestTypeSelectNotifier.value = selectedParameterCode; + debugPrint(selectedParameterCodeValue.toString()); + }, + ), + ); + }, + ); + }, + ), + ), + SizedBox(height: 16.h), + Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: () { + Navigator.pop(context); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + icon: AppAssets.cancel, + iconColor: AppColors.whiteColor, + borderRadius: 12.r, + iconSize: 14.h, + fontSize: 14.f, + height: 40.h, + ), + ), + SizedBox(width: 8.h), + Expanded( + child: CustomButton( + text: LocaleKeys.confirm.tr(), + onPressed: () async { + Navigator.pop(context); + LoaderBottomSheet.showLoader(loadingText: "Sending Request..."); + await myAppointmentsViewModel.sendAskDocCallRequest( + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + requestType: selectedParameterCodeValue.toString(), + remarks: "", + userMobileNumber: myAppointmentsViewModel.appState.getAuthenticatedUser()!.mobileNumber!, + onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getSuccessWidget(loadingText: "Request has been sent successfully, you will be contacted soon.".needTranslation), + callBackFunc: () { + Navigator.of(context).pop(); + }, + title: "", + isCloseButtonVisible: true, + isDismissible: false, + isFullScreen: false, + ); + }, + onError: (errMessage) { + LoaderBottomSheet.hideLoader(); + }); + }, + backgroundColor: AppColors.bgGreenColor, + borderColor: AppColors.bgGreenColor, + textColor: Colors.white, + icon: AppAssets.confirm, + iconSize: 14.h, + borderRadius: 12.r, + fontSize: 14.f, + height: 40.h, + ), + ), + ], + ) + ], + ); + } +} diff --git a/lib/presentation/appointments/widgets/faculity_selection/facility_selection_item.dart b/lib/presentation/appointments/widgets/faculity_selection/facility_selection_item.dart new file mode 100644 index 0000000..c7ef3a9 --- /dev/null +++ b/lib/presentation/appointments/widgets/faculity_selection/facility_selection_item.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; + +class FacilitySelectionItem extends StatelessWidget { + final String svgPath; + final String title; + final String subTitle; + + const FacilitySelectionItem( + {super.key, + required this.svgPath, + required this.subTitle, + required this.title}); + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets( + icon: svgPath, + width: 32, + height: 32, + fit: BoxFit.contain, + ), + SizedBox(height: 16,), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + info, + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18, + height: 13, + fit: BoxFit.contain, + ), + ), + ], + ) + ], + ).paddingAll(16.h), + ); + } + + + Widget get info => Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Align( + alignment: Alignment.centerLeft, + child: Text( + title, + style: TextStyle( + fontSize: 16.h, + fontWeight: FontWeight.w600, + color: AppColors.blackColor, + ), + ), + ), + Align( + alignment: Alignment.centerLeft, + child: Text( + subTitle, + style: TextStyle( + fontSize: 12.h, + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ), + ), + ), + ], + ); +} diff --git a/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart b/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart new file mode 100644 index 0000000..cacc9d3 --- /dev/null +++ b/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart @@ -0,0 +1,84 @@ +import 'package:easy_localization/easy_localization.dart' + show tr, StringTranslateExtension; +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart' + show MyAppointmentsViewModel; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/faculity_selection/facility_selection_item.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:provider/provider.dart' show Provider; + +class FacilityTypeSelectionWidget extends StatelessWidget { + late BookAppointmentsViewModel bookAppointmentViewModel; + late AppointmentViaRegionViewmodel regionalViewModel; + final String selectedRegion; + + FacilityTypeSelectionWidget({super.key, required this.selectedRegion}); + + @override + Widget build(BuildContext context) { + bookAppointmentViewModel = Provider.of(context); + regionalViewModel = Provider.of(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + LocaleKeys.selectFacility.tr(), + style: TextStyle( + fontSize: 21, + fontWeight: FontWeight.w600, + color: AppColors.blackColor, + ), + ), + Text( + LocaleKeys.selectFacilitiesSubTitle.tr(), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ), + ), + SizedBox(height: 24.h), + FacilitySelectionItem( + svgPath: AppAssets.hmg, + title: "HMG".needTranslation, + subTitle: LocaleKeys.hospitalsWithCount.tr(namedArgs: { + 'count': + "${bookAppointmentViewModel.hospitalList?.registeredDoctorMap?[selectedRegion]?.hmgSize ?? 0}" + }), + ).onPress( + () { + if(bookAppointmentViewModel.hospitalList?.registeredDoctorMap?[selectedRegion]?.hmgSize != 0) { + regionalViewModel.setFacility(FacilitySelection.HMG.name); + regionalViewModel.setBottomSheetState( + AppointmentViaRegionState.HOSPITAL_SELECTION); + } + }, + ), + SizedBox(height: 16.h), + FacilitySelectionItem( + svgPath: AppAssets.hmc, + title: "HMC".needTranslation, + subTitle: LocaleKeys.medicalCentersWithCount.tr(namedArgs: { + 'count': + "${bookAppointmentViewModel.hospitalList?.registeredDoctorMap?[selectedRegion]?.hmcSize ?? 0}" + })).onPress( + () { + if(bookAppointmentViewModel.hospitalList?.registeredDoctorMap?[selectedRegion]?.hmcSize!= 0 ) { + regionalViewModel.setFacility(FacilitySelection.HMC.name); + regionalViewModel.setBottomSheetState( + AppointmentViaRegionState.HOSPITAL_SELECTION); + } + }, + ), + ], + ); + } +} diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart new file mode 100644 index 0000000..29a7b96 --- /dev/null +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart @@ -0,0 +1,127 @@ +import 'package:easy_localization/easy_localization.dart' + show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class HospitalBottomSheetBody extends StatelessWidget { + late BookAppointmentsViewModel appointmentsViewModel; + late AppointmentViaRegionViewmodel regionalViewModel; + final TextEditingController searchText = TextEditingController(); + + HospitalBottomSheetBody({super.key}); + + @override + Widget build(BuildContext context) { + appointmentsViewModel = Provider.of(context); + regionalViewModel = Provider.of(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + LocaleKeys.selectHospital.tr(), + style: TextStyle( + fontSize: 21, + fontWeight: FontWeight.w600, + color: AppColors.blackColor, + ), + ), + Text( + LocaleKeys.selectHospitalSubTitle.tr(), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ), + ), + SizedBox(height: 16.h), + TextInputWidget( + labelText: LocaleKeys.search.tr(), + hintText: LocaleKeys.searchHospital.tr(), + controller: searchText, + onChange: (value) { + appointmentsViewModel.filterHospitalListByString(value, regionalViewModel.selectedRegionId , regionalViewModel.selectedFacilityType == + FacilitySelection.HMG.name); + }, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + isAllowLeadingIcon: true, + selectionType: SelectionTypeEnum.search, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), + ), + SizedBox(height: 24.h), + // TypeSelectionWidget( + // hmcCount: "0", + // hmgCount: "0", + // ), + // SizedBox(height: 21.h), + SizedBox( + height: MediaQuery.sizeOf(context).height * .4, + child: ListView.separated( + itemBuilder: (_, index) + { + var hospital = regionalViewModel.selectedFacilityType == + FacilitySelection.HMG.name + ? appointmentsViewModel + .filteredHospitalList! + .registeredDoctorMap![ + regionalViewModel.selectedRegionId!]! + .hmgDoctorList![index] + : appointmentsViewModel + .filteredHospitalList + ?.registeredDoctorMap?[ + regionalViewModel.selectedRegionId!] + ?.hmcDoctorList?[index]; + return HospitalListItem( + hospitalData: hospital, + isLocationEnabled: appointmentsViewModel.isLocationEnabled(), + ).onPress(() { + regionalViewModel.setHospitalModel(hospital); + if (regionalViewModel.regionBottomSheetType == RegionBottomSheetType.FOR_REGION) { + regionalViewModel.setBottomSheetState(AppointmentViaRegionState.CLINIC_SELECTION); + regionalViewModel.handleLastStepForRegion(); + } else if (regionalViewModel.regionBottomSheetType == RegionBottomSheetType.FOR_CLINIIC) { + regionalViewModel.setBottomSheetState(AppointmentViaRegionState.DOCTOR_SELECTION); + regionalViewModel.handleLastStepForClinic(); + } else if (regionalViewModel.regionBottomSheetType == RegionBottomSheetType.REGION_FOR_DENTAL_AND_LASER) { + regionalViewModel.setBottomSheetState(AppointmentViaRegionState.DOCTOR_SELECTION); + regionalViewModel.handleLastStepForClinicForDentalAndLaser(appointmentsViewModel.selectedClinic.clinicID??-1); + // regionalViewModel.handleLastStepForClinic(); + } + });}, + separatorBuilder: (_, __) => SizedBox( + height: 16.h, + ), + itemCount: (regionalViewModel.selectedFacilityType == + FacilitySelection.HMG.name + ? (appointmentsViewModel.filteredHospitalList?.registeredDoctorMap?[ + regionalViewModel.selectedRegionId]?.hmgDoctorList) + : (appointmentsViewModel + .filteredHospitalList + ?.registeredDoctorMap?[ + regionalViewModel.selectedRegionId]?.hmcDoctorList))?.length ?? + 0), + ) + ], + ); + } +} diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body_for_doctor_filter.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body_for_doctor_filter.dart new file mode 100644 index 0000000..58a0d00 --- /dev/null +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body_for_doctor_filter.dart @@ -0,0 +1,66 @@ +import 'package:easy_localization/easy_localization.dart' + show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class HospitalBottomSheetBodyForDoctorFilter extends StatelessWidget { + late BookAppointmentsViewModel appointmentsViewModel; + late AppointmentViaRegionViewmodel regionalViewModel; + final TextEditingController searchText = TextEditingController(); + + HospitalBottomSheetBodyForDoctorFilter({super.key}); + + @override + Widget build(BuildContext context) { + appointmentsViewModel = Provider.of(context); + regionalViewModel = Provider.of(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + LocaleKeys.selectHospital.tr(), + style: TextStyle( + fontSize: 21, + fontWeight: FontWeight.w600, + color: AppColors.blackColor, + ), + ), + SizedBox(height: 24.h), + SizedBox( + height: MediaQuery.sizeOf(context).height * .4, + child: ListView.separated( + itemBuilder: (_, index) + { + var hospital = appointmentsViewModel.searchedPatientDoctorAppointmentHospitalsList[index]; + return HospitalListItem( + hospitalData: hospital, + isLocationEnabled: appointmentsViewModel.isLocationEnabled(), + ).onPress(() { + regionalViewModel.setHospitalModel(hospital); + context.read().setSelectedHospital(hospital); + Navigator.pop(context); + });}, + separatorBuilder: (_, __) => SizedBox( + height: 16.h, + ), + itemCount: appointmentsViewModel.searchedPatientDoctorAppointmentHospitalsList?.length ?? 0), + ) + ], + ); + } +} diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart new file mode 100644 index 0000000..660f95e --- /dev/null +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; + +class HospitalListItem extends StatelessWidget { + final PatientDoctorAppointmentList? hospitalData; + final bool isLocationEnabled; + + late AppState appState; + + HospitalListItem({super.key, required this.hospitalData, required this.isLocationEnabled}); + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + return DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8.h, + children: [hospitalName, distanceInfo], + ), + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ); + } + + Widget get hospitalName => Row( + children: [ + Utils.buildSvgWithAssets( + icon: (hospitalData?.isHMC == true) ? AppAssets.hmc : AppAssets.hmg, + ).paddingOnly(right: 10), + Expanded( + child: Text( + hospitalData?.filterName ?? "", + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16, + color: AppColors.blackColor, + ), + ), + ) + ], + ); + + Widget get distanceInfo => Row( + spacing: 4.w, + children: [ + Visibility( + visible: (hospitalData?.distanceInKMs != "0"), + child: AppCustomChipWidget( + labelText: "${hospitalData?.distanceInKMs ?? ""} km".needTranslation, + deleteIcon: AppAssets.location_red, + deleteIconSize: Size(9, 12), + backgroundColor: AppColors.secondaryLightRedColor, + textColor: AppColors.errorColor, + ), + ), + Visibility( + visible: (hospitalData?.distanceInKMs == "0"), + child: Row( + children: [ + AppCustomChipWidget( + labelText: "Distance not available".needTranslation, + textColor: AppColors.blackColor, + ), + // SizedBox( + // width: 8.h, + // ) + ], + )), + Visibility( + visible: !isLocationEnabled, + child: AppCustomChipWidget( + labelText: "Location turned off".needTranslation, + deleteIcon: AppAssets.location_unavailable, + deleteIconSize: Size(9.w, 12.h), + textColor: AppColors.blackColor, + )), + ], + ); +} diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart new file mode 100644 index 0000000..b023f7a --- /dev/null +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:provider/provider.dart' show Consumer; + +class TypeSelectionWidget extends StatelessWidget { + final String hmcCount; + final String hmgCount; + + const TypeSelectionWidget( + {super.key, required this.hmcCount, required this.hmgCount}); + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (_, data, __) => Row( + spacing: 8, + mainAxisSize: MainAxisSize.max, + children: [ + AppCustomChipWidget( + labelText: "All Facilities".needTranslation, + shape: RoundedRectangleBorder( + side: BorderSide( + color: data.currentlySelectedFacility == FacilitySelection.ALL + ? AppColors.errorColor + : AppColors.chipBorderColorOpacity20, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + backgroundColor: + data.currentlySelectedFacility == FacilitySelection.ALL + ? AppColors.secondaryLightRedColor + : AppColors.whiteColor, + textColor: data.currentlySelectedFacility == FacilitySelection.ALL + ? AppColors.errorColor + : AppColors.blackColor, + ).onPress((){ + data.setSelectedFacility(FacilitySelection.ALL); + }), + AppCustomChipWidget( + icon: AppAssets.hmg, + iconHasColor: false, + labelText: "Hospitals".needTranslation, + shape: RoundedRectangleBorder( + side: BorderSide( + color: data.currentlySelectedFacility == FacilitySelection.HMG + ? AppColors.errorColor + : AppColors.chipBorderColorOpacity20, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + backgroundColor: + data.currentlySelectedFacility == FacilitySelection.HMG + ? AppColors.secondaryLightRedColor + : AppColors.whiteColor, + textColor: data.currentlySelectedFacility == FacilitySelection.HMG + ? AppColors.errorColor + : AppColors.blackColor, + ).onPress((){ + data.setSelectedFacility(FacilitySelection.HMG); + }), + AppCustomChipWidget( + icon: AppAssets.hmc, + iconHasColor: false, + labelText: "Medical Centers".needTranslation, + shape: RoundedRectangleBorder( + side: BorderSide( + color: data.currentlySelectedFacility == FacilitySelection.HMC + ? AppColors.errorColor + : AppColors.chipBorderColorOpacity20, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + backgroundColor: + data.currentlySelectedFacility == FacilitySelection.HMC + ? AppColors.secondaryLightRedColor + : AppColors.whiteColor, + textColor: data.currentlySelectedFacility == FacilitySelection.HMC + ? AppColors.errorColor + : AppColors.blackColor, + ).onPress((){ + data.setSelectedFacility(FacilitySelection.HMC); + }), + ], + ), + ); + } +} diff --git a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart new file mode 100644 index 0000000..754db53 --- /dev/null +++ b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart @@ -0,0 +1,103 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; + +class RegionListItem extends StatelessWidget { + final String title; + final String hmcCount; + final String hmgCount; + final String subTitle; + + const RegionListItem({super.key, required this.title, required this.subTitle, required this.hmcCount, required this.hmgCount}); + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + header, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + spacing: 8.h, + children: [ + placesCountItem(AppAssets.hmg, hmgCount, " ${LocaleKeys.hospital.tr()}"), + placesCountItem(AppAssets.hmc, hmcCount, " ${LocaleKeys.medicalCenters.tr()}"), + ], + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18, + height: 13, + fit: BoxFit.contain, + ), + ), + ], + ) + ], + ).paddingAll(16.h), + ); + } + + Widget placesCountItem(String svgPath, String count, String title) { + return AppCustomChipWidget( + iconSize: 14.h, + icon: svgPath, + iconHasColor: false, + richText: RichText( + text: TextSpan( + text: count, + style: TextStyle(fontSize: 12.h, fontWeight: FontWeight.w700, color: AppColors.blackColor), + children: [TextSpan(text: title, style: TextStyle(fontSize: 12.h, fontWeight: FontWeight.w500, color: AppColors.blackColor))])), + ); + } + + Widget get header => Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Align( + alignment: AlignmentDirectional.centerStart, + child: Text( + title, + style: TextStyle( + fontSize: 16.h, + fontWeight: FontWeight.w600, + color: AppColors.blackColor, + ), + ), + ), + Align( + alignment: Alignment.centerLeft, + child: Text( + subTitle, + style: TextStyle( + fontSize: 12.h, + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ), + ), + ), + ], + ); +} diff --git a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart new file mode 100644 index 0000000..6bc8007 --- /dev/null +++ b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart @@ -0,0 +1,92 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart' show MyAppointmentsViewModel; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart' show RegionListItem; +import 'package:provider/provider.dart'; + +import '../../../../widgets/common_bottom_sheet.dart'; + +class RegionBottomSheetBody extends StatefulWidget { + const RegionBottomSheetBody({super.key}); + + @override + State createState() => _RegionBottomSheetBodyState(); +} + +class _RegionBottomSheetBodyState extends State { + late BookAppointmentsViewModel myAppointmentsViewModel; + late AppointmentViaRegionViewmodel regionalViewModel; + + @override + void initState() { + scheduleMicrotask(() { + if (regionalViewModel.regionBottomSheetType == RegionBottomSheetType.FOR_REGION || regionalViewModel.regionBottomSheetType == RegionBottomSheetType.REGION_FOR_DENTAL_AND_LASER ) { + myAppointmentsViewModel.getRegionMappedProjectList(); + } else if (regionalViewModel.regionBottomSheetType == RegionBottomSheetType.FOR_CLINIIC) { + myAppointmentsViewModel.getMappedDoctors(onError: (err) { + Navigator.pop(context); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + myAppointmentsViewModel = Provider.of(context); + regionalViewModel = Provider.of(context); + return Consumer( + builder: (context, myAppointmentsVM, child) { + if (myAppointmentsVM.isRegionListLoading) { + return Container( + height: MediaQuery.of(context).size.height * 0.3, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(16)), + ), + child: Center( + child: Utils.getLoadingWidget(), + ), + ); + } else { + return SizedBox( + height: MediaQuery.of(context).size.height * 0.5, + child: ListView.separated( + itemCount: myAppointmentsVM.hospitalList?.registeredDoctorMap?.length ?? 0, + separatorBuilder: (_, __) { + return SizedBox( + height: 16.h, + ); + }, + itemBuilder: (_, index) { + String key = myAppointmentsVM.hospitalList?.registeredDoctorMap?.keys.toList()[index] ?? ''; + return RegionListItem( + title: key, + subTitle: "", + hmcCount: "${myAppointmentsVM.hospitalList?.registeredDoctorMap?[key]?.hmcSize ?? 0}", + hmgCount: "${myAppointmentsVM.hospitalList?.registeredDoctorMap?[key]?.hmgSize ?? 0}", + ).onPress(() { + regionalViewModel.setSelectedRegionId(key); + regionalViewModel.setBottomSheetState(AppointmentViaRegionState.TYPE_SELECTION); + }); + }, + ), + ); + } + }, + ); + } +} diff --git a/lib/presentation/authentication/login.dart b/lib/presentation/authentication/login.dart new file mode 100644 index 0000000..7e5f4a1 --- /dev/null +++ b/lib/presentation/authentication/login.dart @@ -0,0 +1,236 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; +import 'package:hmg_patient_app_new/extensions/context_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/register.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/app_bar_widget.dart'; +import 'package:hmg_patient_app_new/widgets/bottomsheet/generic_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class LoginScreen extends StatefulWidget { + const LoginScreen({super.key}); + + @override + LoginScreenState createState() => LoginScreenState(); +} + +class LoginScreenState extends State { + late FocusNode _nationalIdFocusNode; + + @override + void initState() { + super.initState(); + _nationalIdFocusNode = FocusNode(); + } + + @override + void dispose() { + _nationalIdFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + AuthenticationViewModel authVm = context.read(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + appBar: CustomAppBar( + onBackPressed: () { + Navigator.of(context).pop(); + }, + onLanguageChanged: (String value) { + context.setLocale(value == 'en' ? Locale('en', 'US') : Locale('ar', 'SA')); + }, + ), + body: GestureDetector( + onTap: () { + // Dismiss the keyboard and unfocus any focused widget when tapping outside + _nationalIdFocusNode.unfocus(); + FocusScope.of(context).unfocus(); + }, + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.showLottie(context: context, assetPath: AppAnimations.login, width: 200.h, height: 200.h, repeat: true, fit: BoxFit.cover), + SizedBox(height: 130.h), // Adjusted to sizer unit + LocaleKeys.welcomeToDrSulaiman.tr().toText32(isBold: true, color: AppColors.textColor), + SizedBox(height: 32.h), + TextInputWidget( + labelText: "${LocaleKeys.nationalId.tr()} / ${LocaleKeys.fileNo.tr()}", + hintText: "xxxxxxxxx", + controller: authVm.nationalIdController, + focusNode: _nationalIdFocusNode, + keyboardType: TextInputType.number, + isEnable: true, + prefix: null, + autoFocus: true, + isAllowRadius: true, + isBorderAllowed: false, + isAllowLeadingIcon: true, + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 10.h), + leadingIcon: AppAssets.student_card, + errorMessage: "Please enter a valid national ID or file number", + hasError: false, + ), + SizedBox(height: 16.h), // Adjusted to sizer unit (approx 16px) + CustomButton( + height: 50.h, + text: LocaleKeys.login.tr(), + icon: AppAssets.login1, + iconColor: Colors.white, + onPressed: () { + _nationalIdFocusNode.unfocus(); + FocusScope.of(context).unfocus(); + + if (ValidationUtils.isValidatedId( + nationalId: authVm.nationalIdController.text, + onOkPress: () { + Navigator.of(context).pop(); + })) { + showLoginModelSheet(context: context, phoneNumberController: authVm.phoneNumberController, authViewModel: authVm); + } + }, + ), + SizedBox(height: 10.h), // Adjusted to sizer unit (approx 14px) + Center( + child: RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: context.dynamicTextStyle( + color: Colors.black, + fontSize: 14.f, // Adjusted to sizer unit + height: 26 / 16, // This height is a ratio, may need re-evaluation + fontWeight: FontWeight.w500, + ), + children: [ + TextSpan(text: LocaleKeys.dontHaveAccount.tr(), style: context.dynamicTextStyle()), + TextSpan(text: " "), + TextSpan( + text: LocaleKeys.registernow.tr(), + style: context.dynamicTextStyle( + color: AppColors.primaryRedColor, + fontSize: 14.f, // Adjusted to sizer unit + height: 26 / 16, // Ratio + fontWeight: FontWeight.w500), + recognizer: TapGestureRecognizer() + ..onTap = () { + Navigator.of(context).push( + MaterialPageRoute(builder: (BuildContext context) => RegisterNew()), + ); + }, + ), + ], + ), + ).withVerticalPadding(2), // Adjusted to sizer unit + ), + SizedBox(height: 20.h), // Adjusted to sizer unit (approx 14px) + ], + ), + ), + ), + ), + ); + } + + void showLoginModelSheet({ + required BuildContext context, + required TextEditingController? phoneNumberController, + required AuthenticationViewModel authViewModel, + }) { + AppState appState = getIt(); + context.showBottomSheet( + isScrollControlled: true, + isDismissible: false, + useSafeArea: true, + constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width), + backgroundColor: AppColors.transparent, + child: StatefulBuilder(builder: (BuildContext context, StateSetter setModalState) { + return Padding( + padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + child: SingleChildScrollView( + child: GenericBottomSheet( + countryCode: authViewModel.selectedCountrySignup.countryCode, + initialPhoneNumber: "", + textController: phoneNumberController, + isEnableCountryDropdown: true, + onCountryChange: authViewModel.onCountryChange, + onChange: authViewModel.onPhoneNumberChange, + buttons: [ + Padding( + padding: EdgeInsets.only(bottom: 10.h), + child: CustomButton( + text: LocaleKeys.sendOTPSMS.tr(), + onPressed: () async { + if (ValidationUtils.isValidatePhone( + phoneNumber: phoneNumberController!.text, + onOkPress: () { + Navigator.of(context).pop(); + })) { + Navigator.of(context).pop(); + appState.setSelectDeviceByImeiRespModelElement(null); + await authViewModel.checkUserAuthentication(otpTypeEnum: OTPTypeEnum.sms); + } + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedBorderColor, + textColor: AppColors.whiteColor, + icon: AppAssets.message, + ), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 8.h), + child: LocaleKeys.oR.tr().toText16(color: AppColors.textColor), + ), + ], + ), + Padding( + padding: EdgeInsets.only(bottom: 10.h, top: 10.h), + child: CustomButton( + text: LocaleKeys.sendOTPWHATSAPP.tr(), + onPressed: () async { + if (ValidationUtils.isValidatePhone( + phoneNumber: phoneNumberController!.text, + onOkPress: () { + Navigator.of(context).pop(); + })) { + Navigator.of(context).pop(); + appState.setSelectDeviceByImeiRespModelElement(null); + await authViewModel.checkUserAuthentication(otpTypeEnum: OTPTypeEnum.whatsapp); + } + }, + backgroundColor: Colors.white, + borderColor: AppColors.borderOnlyColor, + textColor: AppColors.textColor, + icon: AppAssets.whatsapp, + iconColor: null, + ), + ), + ], + ), + ), + ); + })); + } +} diff --git a/lib/presentation/authentication/quick_login.dart b/lib/presentation/authentication/quick_login.dart new file mode 100644 index 0000000..f10d84f --- /dev/null +++ b/lib/presentation/authentication/quick_login.dart @@ -0,0 +1,135 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +class QuickLogin extends StatefulWidget { + final VoidCallback onPressed; + final bool isDone; + + const QuickLogin({super.key, required this.onPressed, this.isDone = false}); + + @override + QuickLoginState createState() => QuickLoginState(); +} + +class QuickLoginState extends State { + @override + Widget build(BuildContext context) { + NavigationService navigationService = getIt.get(); + return Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(24), + topRight: Radius.circular(24), + ), + ), + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + widget.isDone + ? Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + InkWell( + onTap: () { + navigationService.pop(); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.cross_circle)), + ], + ), + Utils.showLottie(context: context, assetPath: AppAnimations.checkmark, width: 120, height: 120, repeat: true), + LocaleKeys.allSet.tr().toText16(textAlign: TextAlign.center, weight: FontWeight.w500) + // Text( + // ' TranslationBase.of(context).allSet', + // textAlign: TextAlign.center, + // style: context.dynamicTextStyle( + // fontSize: 16, + // fontWeight: FontWeight.w500, + // color: Colors.black, + // ), + // ), + ], + ) + : Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.lockIcon, height: 100), + SizedBox(height: 10.h), + LocaleKeys.enableQuickLogin.tr().toText26(isBold: true), + // Text( + // ' TranslationBase.of(context).enableQuickLogin', + // style: context.dynamicTextStyle( + // fontSize: 26, + // fontWeight: FontWeight.bold, + // color: Colors.black, + // ), + // ), + SizedBox(height: 5.h), + LocaleKeys.enableQuickLogin.tr().toText16(color: AppColors.quickLoginColor), + // Description + // Text( + // 'TranslationBase.of(context).enableMsg', + // style: context.dynamicTextStyle( + // fontSize: 16, + // color: Color(0xFF666666), + // height: 1.5, + // ), + //), + const SizedBox(height: 24), + // Buttons + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.enableQuickLogin.tr(), + onPressed: () { + widget.onPressed(); + }, + backgroundColor: Color(0xffED1C2B), + borderColor: Color(0xffED1C2B), + textColor: Colors.white, + icon: AppAssets.apple_finder, + )), + ], + ), + SizedBox( + height: 16, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.notNow.tr(), + onPressed: () { + Navigator.pop(context, "true"); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Colors.red, + // icon: "assets/images/svg/apple-finder.svg", + )), + ], + ), + ], + ) + ], + ), + ); + } +} diff --git a/lib/presentation/authentication/register.dart b/lib/presentation/authentication/register.dart new file mode 100644 index 0000000..9551ba1 --- /dev/null +++ b/lib/presentation/authentication/register.dart @@ -0,0 +1,335 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/app_bar_widget.dart'; +import 'package:hmg_patient_app_new/widgets/bottomsheet/generic_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart' show CustomButton; +import 'package:hmg_patient_app_new/widgets/dropdown/country_dropdown_widget.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class RegisterNew extends StatefulWidget { + @override + _RegisterNew createState() => _RegisterNew(); +} + +class _RegisterNew extends State { + late FocusNode _nationalIdFocusNode; + late FocusNode _dobFocusNode; + + @override + void initState() { + super.initState(); + _nationalIdFocusNode = FocusNode(); + _dobFocusNode = FocusNode(); + } + + @override + void dispose() { + _nationalIdFocusNode.dispose(); + _dobFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + AuthenticationViewModel authVm = context.read(); + + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + appBar: CustomAppBar( + onBackPressed: () { + Navigator.of(context).pop(); + }, + onLanguageChanged: (String value) { + context.setLocale(value == 'en' ? Locale('en', 'US') : Locale('ar', 'SA')); + }, + ), + body: GestureDetector( + onTap: () { + // Dismiss keyboard and unfocus all input fields + _nationalIdFocusNode.unfocus(); + _dobFocusNode.unfocus(); + FocusScope.of(context).unfocus(); + }, + child: ScrollConfiguration( + behavior: ScrollConfiguration.of(context).copyWith(overscroll: false, physics: const ClampingScrollPhysics()), + child: NotificationListener( + onNotification: (notification) { + notification.disallowIndicator(); + return true; + }, + child: SingleChildScrollView( + physics: ClampingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.showLottie( + context: context, assetPath: 'assets/animations/lottie/register.json', width: 200.h, height: 200.h, fit: BoxFit.cover, repeat: true), + SizedBox(height: 16.h), + LocaleKeys.prepareToElevate.tr().toText32(isBold: true), + SizedBox(height: 24.h), + Directionality( + textDirection: Directionality.of(context), + child: Container( + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(24)), + padding: EdgeInsets.symmetric(horizontal: 16.h), + child: Column( + children: [ + CustomCountryDropdown( + countryList: CountryEnum.values, + onCountryChange: authVm.onCountryChange, + // isRtl: Directionality.of(context) == TextDirection.LTR, + ).withVerticalPadding(8.h), + Divider(height: 1.h), + TextInputWidget( + labelText: LocaleKeys.nationalIdNumber.tr(), + hintText: "xxxxxxxxx", + controller: authVm.nationalIdController, + focusNode: _nationalIdFocusNode, + isEnable: true, + prefix: null, + isAllowRadius: true, + isBorderAllowed: false, + isAllowLeadingIcon: true, + autoFocus: true, + padding: EdgeInsets.symmetric(vertical: 8.h), + leadingIcon: AppAssets.student_card, + ).withVerticalPadding(8), + Divider(height: 1), + TextInputWidget( + labelText: LocaleKeys.dob.tr(), + hintText: "11 July, 1994", + controller: authVm.dobController, + focusNode: _dobFocusNode, + isEnable: true, + prefix: null, + isAllowRadius: true, + isBorderAllowed: false, + isAllowLeadingIcon: true, + padding: EdgeInsets.symmetric(vertical: 8.h), + leadingIcon: AppAssets.birthday_cake, + selectionType: SelectionTypeEnum.calendar, + onCalendarTypeChanged: authVm.onCalenderTypeChange, + onChange: authVm.onDobChange, + ).withVerticalPadding(8), + ], + ), + ), + ), + SizedBox(height: 25.h), + GestureDetector( + onTap: authVm.onTermAccepted, + child: Row( + children: [ + Selector( + selector: (_, viewModel) => viewModel.isTermsAccepted, + shouldRebuild: (previous, next) => previous != next, + builder: (context, isTermsAccepted, child) { + return AnimatedContainer( + duration: const Duration(milliseconds: 200), + height: 24.h, + width: 24.h, + decoration: BoxDecoration( + color: isTermsAccepted ? AppColors.primaryRedColor : Colors.transparent, + borderRadius: BorderRadius.circular(6), + border: Border.all(color: isTermsAccepted ? AppColors.primaryRedBorderColor : AppColors.greyColor, width: 2.h), + ), + child: isTermsAccepted ? Icon(Icons.check, size: 16.f, color: Colors.white) : null, + ); + }, + ), + SizedBox(width: 12.h), + Row( + children: [ + Text( + LocaleKeys.iAcceptThe.tr(), + style: context.dynamicTextStyle(fontSize: 14.f, fontWeight: FontWeight.w500, color: Color(0xFF2E3039)), + ), + GestureDetector( + onTap: () { + // Navigate to terms and conditions page + Navigator.of(context).pushNamed('/terms'); + }, + child: Text( + LocaleKeys.termsConditoins.tr(), + style: context.dynamicTextStyle( + fontSize: 14.f, + fontWeight: FontWeight.w500, + color: AppColors.primaryRedColor, + decoration: TextDecoration.underline, + decorationColor: AppColors.primaryRedBorderColor, + ), + ), + ), + ], + ), + // Expanded( + // child: Text( + // LocaleKeys.iAcceptTermsConditions.tr().split("the").first, + // style: context.dynamicTextStyle(fontSize: 14.fSize, fontWeight: FontWeight.w500, color: Color(0xFF2E3039)), + // ), + // ), + ], + ), + ), + SizedBox(height: 25.h), + CustomButton( + text: LocaleKeys.registernow.tr(), + icon: AppAssets.note_edit, + onPressed: () { + // Dismiss keyboard before proceeding + _nationalIdFocusNode.unfocus(); + _dobFocusNode.unfocus(); + FocusScope.of(context).unfocus(); + + if (ValidationUtils.isValidatedId( + nationalId: authVm.nationalIdController.text, + selectedCountry: authVm.selectedCountrySignup, + isTermsAccepted: authVm.isTermsAccepted, + dob: authVm.dobController.text, + onOkPress: () { + Navigator.of(context).pop(); + })) { + showRegisterModel(context: context, authVM: authVm); + } + }, + ), + SizedBox(height: 14), + Center( + child: RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: context.dynamicTextStyle( + color: Colors.black, + fontSize: 16.f, + height: 26 / 16, + fontWeight: FontWeight.w500, + ), + children: [ + TextSpan(text: LocaleKeys.alreadyHaveAccount.tr(), style: context.dynamicTextStyle()), + TextSpan(text: " "), + TextSpan( + text: LocaleKeys.loginNow.tr(), + style: context.dynamicTextStyle( + color: AppColors.primaryRedColor, + fontSize: 16.f, + height: 26 / 16, + fontWeight: FontWeight.w500, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + Navigator.of(context).pop(); + }, + ), + ], + ), + ), + ), + SizedBox(height: 30), + ], + ), + ), + ), + ), + )); + } + + void showRegisterModel({required BuildContext context, required AuthenticationViewModel authVM}) { + AppState appState = getIt.get(); + showModalBottomSheet( + context: context, + isScrollControlled: true, + isDismissible: false, + useSafeArea: true, + backgroundColor: Colors.transparent, + builder: (bottomSheetContext) => Padding( + padding: EdgeInsets.only(bottom: MediaQuery.of(bottomSheetContext).viewInsets.bottom), + child: SingleChildScrollView( + child: GenericBottomSheet( + countryCode: authVM.selectedCountrySignup.countryCode, + initialPhoneNumber: authVM.phoneNumberController.text, + textController: authVM.phoneNumberController, + isEnableCountryDropdown: false, + onCountryChange: authVM.onCountryChange, + onChange: authVM.onPhoneNumberChange, + autoFocus: true, + buttons: [ + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: CustomButton( + text: LocaleKeys.sendOTPSMS.tr(), + onPressed: () async { + // Dismiss keyboard before validation + FocusScope.of(context).unfocus(); + + if (ValidationUtils.isValidatePhone( + phoneNumber: authVM.phoneNumberController.text, + onOkPress: () { + Navigator.of(context).pop(); + }, + )) { + appState.setSelectDeviceByImeiRespModelElement(null); + await authVM.onRegistrationStart(otpTypeEnum: OTPTypeEnum.sms); + } + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedBorderColor, + textColor: AppColors.whiteColor, + icon: AppAssets.message, + ), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 8.h), + child: LocaleKeys.oR.tr().toText16(color: AppColors.textColor), + ), + ], + ), + Padding( + padding: EdgeInsets.only(bottom: 10.h, top: 10.h), + child: CustomButton( + text: LocaleKeys.sendOTPWHATSAPP.tr(), + onPressed: () async { + FocusScope.of(context).unfocus(); + if (ValidationUtils.isValidatePhone( + phoneNumber: authVM.phoneNumberController.text, + onOkPress: () { + Navigator.of(context).pop(); + }, + )) { + appState.setSelectDeviceByImeiRespModelElement(null); + await authVM.onRegistrationStart(otpTypeEnum: OTPTypeEnum.whatsapp); + } + }, + backgroundColor: AppColors.whiteColor, + borderColor: AppColors.borderOnlyColor, + textColor: AppColors.textColor, + icon: AppAssets.whatsapp, + iconColor: null, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/authentication/register_step2.dart b/lib/presentation/authentication/register_step2.dart new file mode 100644 index 0000000..3466497 --- /dev/null +++ b/lib/presentation/authentication/register_step2.dart @@ -0,0 +1,370 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/common_models/nationality_country_model.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/app_bar_widget.dart'; +import 'package:hmg_patient_app_new/widgets/bottomsheet/generic_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/dropdown/dropdown_widget.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class RegisterNewStep2 extends StatefulWidget { + RegisterNewStep2({Key? key}) : super(key: key); + + @override + _RegisterNew createState() => _RegisterNew(); +} + +class _RegisterNew extends State { + AuthenticationViewModel? authVM; + + @override + void initState() { + super.initState(); + authVM = context.read(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + var name = authVM!.isUserFromUAE() + ? "" + : appState.getLanguageCode() == "en" + ? ("${appState.getNHICUserData.firstNameEn!.toUpperCase()} ${appState.getNHICUserData.lastNameEn!.toUpperCase()}") + : ("${appState.getNHICUserData.firstNameAr!.toUpperCase()} ${appState.getNHICUserData.lastNameAr!.toUpperCase()}"); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + appBar: CustomAppBar( + onBackPressed: () { + Navigator.of(context).pop(); + // authVM!.clearDefaultInputValues(); + authVM!.clearEmailInput(); + }, + onLanguageChanged: (lang) {}, + hideLogoAndLang: true, + ), + body: GestureDetector( + onTap: () { + FocusScope.of(context).unfocus(); + }, + behavior: HitTestBehavior.translucent, // Ensures taps on empty space are detected + child: SizedBox( + width: double.infinity, + height: double.infinity, + child: SingleChildScrollView( + reverse: false, + padding: EdgeInsets.only(left: 24.h, right: 24.h, top: 0.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.personalDetailsVerification.tr().toText26(color: AppColors.textColor, weight: FontWeight.w600, letterSpacing: -2), + SizedBox(height: 24.h), + Container( + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(24)), + padding: EdgeInsets.only(left: 16.h, right: 16.h), + child: Column( + children: [ + TextInputWidget( + labelText: authVM!.isUserFromUAE() ? LocaleKeys.fullName.tr() : LocaleKeys.name.tr(), + hintText: authVM!.isUserFromUAE() ? LocaleKeys.enterNameHere.tr() : (name), + controller: authVM!.isUserFromUAE() ? authVM!.nameController : null, + isEnable: true, + prefix: null, + isAllowRadius: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + // textInputAction: TextInputAction.done, + onSubmitted: (value) { + FocusScope.of(context).unfocus(); + }, + isAllowLeadingIcon: true, + isReadOnly: authVM!.isUserFromUAE() ? false : true, + leadingIcon: AppAssets.user_circle, + labelColor: AppColors.textColor, + ).paddingSymmetrical(0.h, 16.h), + Divider(height: 1, color: AppColors.greyColor), + TextInputWidget( + labelText: LocaleKeys.nationalIdNumber.tr(), + hintText: authVM!.isUserFromUAE() ? appState.getUserRegistrationPayload.patientIdentificationId.toString() : (appState.getNHICUserData.idNumber ?? ""), + controller: null, + isEnable: true, + prefix: null, + isAllowRadius: false, + isBorderAllowed: false, + isAllowLeadingIcon: true, + isReadOnly: true, + labelColor: AppColors.textColor, + leadingIcon: AppAssets.student_card) + .paddingSymmetrical(0.h, 16.h), + Divider(height: 1, color: AppColors.greyColor), + authVM!.isUserFromUAE() + ? Selector( + selector: (_, authViewModel) => authViewModel.genderType, + shouldRebuild: (previous, next) => previous != next, + builder: (context, genderType, child) { + final authVM = context.read(); + return DropdownWidget( + labelText: LocaleKeys.gender.tr(), + hintText: LocaleKeys.malE.tr(), + isEnable: true, + dropdownItems: GenderTypeEnum.values.map((e) => appState.isArabic() ? e.typeAr : e.type).toList(), + selectedValue: genderType != null ? (appState.isArabic() ? genderType.typeAr : genderType.type) : "", + onChange: authVM.onGenderChange, + isBorderAllowed: false, + hasSelectionCustomIcon: true, + isAllowRadius: false, + labelColor: AppColors.textColor, + padding: const EdgeInsets.only(top: 8, bottom: 8, left: 0, right: 0), + selectionCustomIcon: AppAssets.arrow_down, + leadingIcon: AppAssets.user_full, + ).withVerticalPadding(8); + }) + : TextInputWidget( + labelText: LocaleKeys.gender.tr(), + hintText: (appState.getNHICUserData.gender ?? ""), + controller: null, + isEnable: true, + prefix: null, + isAllowRadius: false, + isBorderAllowed: false, + isAllowLeadingIcon: true, + isReadOnly: authVM!.isUserFromUAE() ? false : true, + leadingIcon: AppAssets.user_full, + labelColor: AppColors.textColor, + onChange: (value) {}) + .paddingSymmetrical(0.h, 16.h), + Divider(height: 1, color: AppColors.greyColor), + authVM!.isUserFromUAE() + ? Selector( + selector: (_, authViewModel) => authViewModel.maritalStatus, + shouldRebuild: (previous, next) => previous != next, + builder: (context, maritalStatus, child) { + final authVM = context.read(); // For onChange + return DropdownWidget( + labelText: LocaleKeys.maritalStatus.tr(), + hintText: LocaleKeys.married.tr(), + isEnable: true, + dropdownItems: MaritalStatusTypeEnum.values.map((e) => appState.isArabic() ? e.typeAr : e.type).toList(), + selectedValue: maritalStatus != null ? (appState.isArabic() ? maritalStatus.typeAr : maritalStatus.type) : "", + onChange: authVM.onMaritalStatusChange, + isBorderAllowed: false, + hasSelectionCustomIcon: true, + isAllowRadius: false, + labelColor: AppColors.textColor, + padding: const EdgeInsets.only(top: 8, bottom: 8, left: 0, right: 0), + selectionCustomIcon: AppAssets.arrow_down, + leadingIcon: AppAssets.smart_phone, + ).withVerticalPadding(8); + }, + ) + : TextInputWidget( + labelText: LocaleKeys.maritalStatus.tr(), + hintText: appState.isArabic() + ? (MaritalStatusTypeExtension.fromValue(appState.getNHICUserData.maritalStatusCode)!.typeAr) + : (MaritalStatusTypeExtension.fromValue(appState.getNHICUserData.maritalStatusCode)!.type), + isEnable: true, + prefix: null, + isAllowRadius: false, + isBorderAllowed: false, + isAllowLeadingIcon: true, + isReadOnly: true, + labelColor: AppColors.textColor, + leadingIcon: AppAssets.smart_phone, + onChange: (value) {}) + .paddingSymmetrical(0.h, 16.h), + Divider(height: 1, color: AppColors.greyColor), + authVM!.isUserFromUAE() + ? Selector? countriesList, NationalityCountries? selectedCountry, bool isArabic})>( + selector: (context, authViewModel) { + final appState = getIt.get(); + return ( + countriesList: authViewModel.countriesList, + selectedCountry: authViewModel.pickedCountryByUAEUser, + isArabic: appState.isArabic(), + ); + }, + shouldRebuild: (previous, next) => previous.countriesList != next.countriesList || previous.selectedCountry != next.selectedCountry || previous.isArabic != next.isArabic, + builder: (context, data, child) { + final authVM = context.read(); + return DropdownWidget( + labelText: LocaleKeys.country.tr(), + hintText: LocaleKeys.uae.tr(), + isEnable: true, + dropdownItems: (data.countriesList ?? []).map((e) => data.isArabic ? e.nameN ?? "" : e.name ?? "").toList(), + selectedValue: data.selectedCountry != null + ? data.isArabic + ? data.selectedCountry!.nameN ?? "" + : data.selectedCountry!.name ?? "" + : "", + onChange: authVM.onUAEUserCountrySelection, + isBorderAllowed: false, + hasSelectionCustomIcon: true, + labelColor: AppColors.textColor, + isAllowRadius: false, + padding: const EdgeInsets.only(top: 8, bottom: 8, left: 0, right: 0), + selectionCustomIcon: AppAssets.arrow_down, + leadingIcon: AppAssets.globe, + ).withVerticalPadding(8); + }, + ) + : TextInputWidget( + labelText: LocaleKeys.nationality.tr(), + hintText: appState.isArabic() + ? (authVM!.countriesList!.firstWhere((e) => e.id == (appState.getNHICUserData.nationalityCode ?? ""), orElse: () => NationalityCountries()).nameN ?? "") + : (authVM!.countriesList!.firstWhere((e) => e.id == (appState.getNHICUserData.nationalityCode ?? ""), orElse: () => NationalityCountries()).name ?? ""), + isEnable: true, + prefix: null, + isAllowRadius: false, + isBorderAllowed: false, + isAllowLeadingIcon: true, + isReadOnly: true, + labelColor: AppColors.textColor, + leadingIcon: AppAssets.globe, + onChange: (value) {}) + .paddingSymmetrical(0.h, 16.h), + Divider( + height: 1, + color: AppColors.greyColor, + ), + TextInputWidget( + labelText: LocaleKeys.mobileNumber.tr(), + hintText: (appState.getUserRegistrationPayload.patientMobileNumber.toString() ?? ""), + controller: null, + isEnable: false, + prefix: null, + isAllowRadius: false, + isBorderAllowed: false, + isAllowLeadingIcon: true, + labelColor: AppColors.textColor, + isReadOnly: true, + leadingIcon: AppAssets.call) + .paddingSymmetrical(0.h, 16.h), + Divider( + height: 1, + color: AppColors.greyColor, + ), + TextInputWidget( + labelText: LocaleKeys.dob.tr(), + hintText: authVM!.isUserFromUAE() ? appState.getUserRegistrationPayload.dob! : appState.getNHICUserData.dateOfBirth ?? "", + controller: authVM!.isUserFromUAE() ? authVM!.dobController : null, + isEnable: false, + prefix: null, + isBorderAllowed: false, + isAllowLeadingIcon: true, + isReadOnly: true, + labelColor: AppColors.textColor, + leadingIcon: AppAssets.birthday_cake, + selectionType: null, + ).paddingSymmetrical(0.h, 16.h), + ], + ), + ), + SizedBox(height: 50.h), + Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(), + icon: AppAssets.cancel, + onPressed: () { + Navigator.of(context).pop(); + // authVM!.clearDefaultInputValues(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + iconColor: AppColors.primaryRedColor, + ), + ), + SizedBox( + width: 16, + ), + Expanded( + child: CustomButton( + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + text: LocaleKeys.confirm.tr(), + icon: AppAssets.confirm, + iconColor: AppColors.whiteColor, + onPressed: () { + if (appState.getUserRegistrationPayload.zipCode != CountryEnum.saudiArabia.countryCode) { + if (ValidationUtils.validateUaeRegistration( + name: authVM!.nameController.text, + gender: authVM!.genderType, + country: authVM!.pickedCountryByUAEUser, + maritalStatus: authVM!.maritalStatus, + onOkPress: () { + Navigator.of(context).pop(); + })) { + showModel(context: context); + } + } else { + showModel(context: context); + } + }, + ), + ) + ], + ), + ], + ), + ), + ), + ), + ); + } + + void showModel({required BuildContext context}) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + isDismissible: false, + backgroundColor: Colors.transparent, + builder: (bottomSheetContext) => Padding( + padding: EdgeInsets.only(bottom: MediaQuery.of(bottomSheetContext).viewInsets.bottom), + child: SingleChildScrollView( + child: GenericBottomSheet( + textController: authVM!.emailController, + isForEmail: true, + buttons: [ + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: CustomButton( + text: LocaleKeys.submit.tr(), + onPressed: () { + if (ValidationUtils.isValidateEmail( + email: authVM!.emailController.text, + onOkPress: () { + Navigator.of(context).pop(); + })) { + authVM!.onRegistrationComplete(); + } + }, + backgroundColor: AppColors.bgGreenColor, + borderColor: AppColors.bgGreenColor, + textColor: AppColors.whiteColor), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/authentication/saved_login_screen.dart b/lib/presentation/authentication/saved_login_screen.dart new file mode 100644 index 0000000..93b26c7 --- /dev/null +++ b/lib/presentation/authentication/saved_login_screen.dart @@ -0,0 +1,335 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/login.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/app_bar_widget.dart'; +import 'package:hmg_patient_app_new/widgets/bottomsheet/generic_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:provider/provider.dart'; + +class SavedLogin extends StatefulWidget { + const SavedLogin({super.key}); + + @override + _SavedLogin createState() => _SavedLogin(); +} + +class _SavedLogin extends State { + LoginTypeEnum loginType = LoginTypeEnum.sms; + late AuthenticationViewModel authVm; + late AppState appState; + + @override + void initState() { + authVm = context.read(); + appState = getIt.get(); + loginType = LoginTypeExtension.fromValue(appState.getSelectDeviceByImeiRespModelElement!.logInType!)!; + + authVm.phoneNumberController.text = appState.getSelectDeviceByImeiRespModelElement!.mobile!.startsWith("0") + ? appState.getSelectDeviceByImeiRespModelElement!.mobile!.replaceFirst("0", "") + : appState.getSelectDeviceByImeiRespModelElement!.mobile!; + authVm.nationalIdController.text = appState.getSelectDeviceByImeiRespModelElement!.identificationNo!; + + if (loginType == LoginTypeEnum.fingerprint || loginType == LoginTypeEnum.face) { + authVm.loginWithFingerPrintFace(() {}); + } + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.scaffoldBgColor, + appBar: CustomAppBar( + onBackPressed: () { + Navigator.of(context).pop(); + }, + onLanguageChanged: (value) { + context.setLocale(value == 'en' ? Locale('en', 'US') : Locale('ar', 'SA')); + }, + ), + body: SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: appState.getSelectDeviceByImeiRespModelElement != null + ? Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Spacer(flex: 2), + // Welcome back text + LocaleKeys.welcomeBack.tr().toText16(color: AppColors.inputLabelTextColor), + SizedBox(height: 16.h), + appState.getSelectDeviceByImeiRespModelElement != null + ? appState.getSelectDeviceByImeiRespModelElement!.name!.toCamelCase + .toText26(isBold: true, height: 26 / 36, color: AppColors.textColor) + : SizedBox(), + SizedBox(height: 24.h), + Container( + padding: EdgeInsets.all(16.h), + decoration: BoxDecoration( + color: AppColors.whiteColor, + border: Border.all(color: AppColors.whiteColor), + borderRadius: BorderRadius.circular(24.h), + boxShadow: [ + BoxShadow(color: Color(0x0D000000), blurRadius: 16.h, offset: Offset(0, 0), spreadRadius: 5.h), + ], + ), + child: Column( + children: [ + // Last login info + + ("${LocaleKeys.lastLoginBy.tr()} ${loginType.displayName}") + .toText14(isBold: true, color: AppColors.greyTextColor, letterSpacing: -1), + appState.getSelectDeviceByImeiRespModelElement != null + ? (appState.getSelectDeviceByImeiRespModelElement!.createdOn != null + ? DateUtil.getFormattedDate( + DateUtil.convertStringToDate(appState.getSelectDeviceByImeiRespModelElement!.createdOn!), + "d MMMM, y 'at' HH:mm") + : '--') + .toText16(isBold: true, color: AppColors.textColor) + : SizedBox(), + + appState.getSelectDeviceByImeiRespModelElement != null + ? Container( + margin: EdgeInsets.all(16.h), + child: Utils.buildSvgWithAssets( + icon: getTypeIcons(appState.getSelectDeviceByImeiRespModelElement!.logInType!), + height: 54.h, + width: 54.w, + iconColor: loginType.toInt == 4 ? null : AppColors.primaryRedColor)) + : SizedBox(), + // Face ID login button + CustomButton( + text: "${LocaleKeys.loginBy.tr()} ${loginType.displayName}", + onPressed: () { + if (loginType == LoginTypeEnum.fingerprint || loginType == LoginTypeEnum.face) { + authVm.loginWithFingerPrintFace(() {}); + } else { + authVm.checkUserAuthentication(otpTypeEnum: loginType == LoginTypeEnum.sms ? OTPTypeEnum.sms : OTPTypeEnum.whatsapp); + } + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: Colors.white, + fontSize: 12.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + height: 40.h, + padding: EdgeInsets.symmetric(vertical: 10.h), + icon: getTypeIcons(loginType.toInt), + //loginType == LoginTypeEnum.sms ? AppAssets.sms :AppAssets.whatsapp, + iconColor: loginType != LoginTypeEnum.whatsapp ? Colors.white : null, + ), + ], + ), + ), + SizedBox(height: 24.h), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Text( + LocaleKeys.oR.tr(), + style: context.dynamicTextStyle(fontSize: 16.f, fontWeight: FontWeight.w500), + ), + ), + SizedBox(height: 24.h), + // OTP login button + loginType.toInt != 1 + ? Column( + children: [ + loginType.toInt != 1 + ? CustomButton( + text: LocaleKeys.loginByOTP.tr(), + onPressed: () { + showModalBottomSheet( + context: context, + isScrollControlled: true, + isDismissible: false, + useSafeArea: true, + backgroundColor: Colors.transparent, + enableDrag: false, + // Prevent dragging to avoid focus conflicts + builder: (bottomSheetContext) => + StatefulBuilder(builder: (BuildContext context, StateSetter setModalState) { + return Padding( + padding: EdgeInsets.only(bottom: MediaQuery.of(bottomSheetContext).viewInsets.bottom), + child: SingleChildScrollView( + child: GenericBottomSheet( + countryCode: "966", + initialPhoneNumber: "", + textController: TextEditingController(), + isFromSavedLogin: true, + isEnableCountryDropdown: true, + onCountryChange: (value) {}, + onChange: (String? value) {}, + buttons: [ + Padding( + padding: EdgeInsets.only(bottom: 10.h), + child: CustomButton( + text: LocaleKeys.sendOTPSMS.tr(), + onPressed: () { + Navigator.of(context).pop(); + loginType = LoginTypeEnum.sms; + authVm.checkUserAuthentication(otpTypeEnum: OTPTypeEnum.sms); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + icon: AppAssets.sms), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 8.h), + child: (LocaleKeys.oR.tr()).toText16(color: AppColors.textColor)), + ], + ), + Padding( + padding: EdgeInsets.only(bottom: 10.h, top: 10.h), + child: CustomButton( + text: LocaleKeys.sendOTPWHATSAPP.tr(), + onPressed: () { + Navigator.of(context).pop(); + loginType = LoginTypeEnum.whatsapp; + authVm.checkUserAuthentication(otpTypeEnum: OTPTypeEnum.whatsapp); + }, + backgroundColor: AppColors.transparent, + borderColor: AppColors.textColor, + textColor: AppColors.textColor, + icon: AppAssets.whatsapp, + iconColor: null, + ), + ), + ], + ), + ), + ); + }), + ); + }, + backgroundColor: AppColors.whiteColor, + borderColor: AppColors.borderOnlyColor, + textColor: AppColors.textColor, + borderWidth: 2, + padding: EdgeInsets.fromLTRB(0, 14.h, 0, 14.h), + icon: AppAssets.sms, + iconColor: AppColors.textColor, + ) + : Container(), + SizedBox( + height: 20.h, + ), + ], + ) + : CustomButton( + text: "${LocaleKeys.loginBy.tr()} ${LoginTypeEnum.whatsapp.displayName}", + icon: AppAssets.whatsapp, + iconColor: null, + onPressed: () { + if (loginType == LoginTypeEnum.fingerprint || loginType == LoginTypeEnum.face) { + authVm.loginWithFingerPrintFace(() {}); + } else { + loginType = LoginTypeEnum.whatsapp; + authVm.checkUserAuthentication(otpTypeEnum: OTPTypeEnum.whatsapp); + } + }, + backgroundColor: AppColors.whiteColor, + borderColor: Color(0xFF2E3039), + textColor: Color(0xFF2E3039), + borderWidth: 2.w, + padding: EdgeInsets.fromLTRB(0, 14.h, 0, 14.h), + ), + const Spacer(flex: 2), + // OR divider + + SizedBox(height: 24.h), + // Guest and Switch account + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: SizedBox( + height: 56.h, + child: CustomButton( + text: LocaleKeys.guest.tr(), + onPressed: () { + Navigator.of(context).pushReplacement( + MaterialPageRoute(builder: (BuildContext context) => LandingNavigation()), + ); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Color(0xffED1C2B), + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(0, 10.h, 0, 10.h), + // icon: "assets/images/svg/apple-finder.svg", + ), + ), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.05, + ), + Expanded( + child: SizedBox( + height: 56.h, + child: CustomButton( + text: LocaleKeys.switchAccount.tr(), + onPressed: () async { + await authVm.clearDefaultInputValues(); + Navigator.of(context).push( + MaterialPageRoute(builder: (BuildContext context) => LoginScreen()), + ); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Color(0xffED1C2B), + fontSize: 15.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(0, 10.h, 0, 10.h), + // icon: "assets/images/svg/apple-finder.svg", + ), + ), + ), + ], + ), + SizedBox(height: 20.h), + ], + ) + : SizedBox.shrink(), + ), + ), + ); + } + + String getTypeIcons(int type) { + final types = { + 1: AppAssets.sms, + 2: AppAssets.fingerprint, + 3: AppAssets.fingerprint, + 4: AppAssets.whatsapp, + 0: AppAssets.sms, + }; + + if (types.containsKey(type)) { + return types[type]!; + } else { + throw Exception('Invalid login type: $type'); + } + } +} diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart new file mode 100644 index 0000000..a66ea4d --- /dev/null +++ b/lib/presentation/book_appointment/book_appointment_page.dart @@ -0,0 +1,490 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart' show RegionBottomSheetBody; +import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/search_doctor_by_name.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/select_clinic_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart' show showCommonBottomSheetWithoutHeight; +import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +import '../appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart'; + +class BookAppointmentPage extends StatefulWidget { + const BookAppointmentPage({super.key}); + + @override + State createState() => _BookAppointmentPageState(); +} + +class _BookAppointmentPageState extends State { + late AppState appState; + late AppointmentViaRegionViewmodel regionalViewModel; + late BookAppointmentsViewModel bookAppointmentsViewModel; + late ImmediateLiveCareViewModel immediateLiveCareViewModel; + late final AuthenticationViewModel authVM; + + @override + void initState() { + authVM = context.read(); + scheduleMicrotask(() { + bookAppointmentsViewModel.selectedTabIndex = 0; + bookAppointmentsViewModel.initBookAppointmentViewModel(); + bookAppointmentsViewModel.getLocation(); + immediateLiveCareViewModel.initImmediateLiveCare(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + bookAppointmentsViewModel = Provider.of(context, listen: false); + immediateLiveCareViewModel = Provider.of(context, listen: false); + appState = getIt.get(); + regionalViewModel = Provider.of(context, listen: true); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: LocaleKeys.bookAppo.tr(context: context), + child: SingleChildScrollView( + child: Consumer(builder: (context, bookAppointmentsVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + CustomTabBar( + activeTextColor: Color(0xffED1C2B), + activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), + tabs: [ + CustomTabBarModel(null, "General".needTranslation), + CustomTabBarModel(null, "LiveCare".needTranslation), + ], + onTabChange: (index) { + bookAppointmentsVM.onTabChanged(index); + }, + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 24.h), + getSelectedTabData(bookAppointmentsVM.selectedTabIndex), + ], + ); + }), + ), + ), + ); + } + + Widget getSelectedTabData(int index) { + switch (index) { + case 0: + return Column( + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.search_by_clinic_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Search By Clinic".needTranslation.toText14(color: AppColors.textColor, weight: FontWeight.w500), + "Tap to select clinic".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), + ], + ), + ], + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, iconColor: AppColors.textColor, width: 40.h, height: 40.h)), + ], + ).onPress(() { + bookAppointmentsViewModel.setIsClinicsListLoading(true); + bookAppointmentsViewModel.setLoadSpecificClinic(false); + bookAppointmentsViewModel.setIsLiveCareSchedule(false); + bookAppointmentsViewModel.setProjectID(null); + Navigator.of(context).push( + CustomPageRoute( + page: SelectClinicPage(), + ), + ); + }), + SizedBox(height: 16.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.search_by_doctor_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Search By Doctor".needTranslation.toText14(color: AppColors.textColor, weight: FontWeight.w500), + "Tap to select".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), + ], + ), + ], + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, iconColor: AppColors.textColor, width: 40.h, height: 40.h)), + ], + ).onPress(() { + bookAppointmentsViewModel.setIsDoctorSearchByNameStarted(false); + bookAppointmentsViewModel.setProjectID(null); + Navigator.of(context).push( + CustomPageRoute( + page: SearchDoctorByName(), + ), + ); + }), + SizedBox(height: 16.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.search_by_region_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Search By Region".needTranslation.toText14(color: AppColors.textColor, weight: FontWeight.w500), + "Central Region".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), + ], + ), + ], + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, iconColor: AppColors.textColor, width: 40.h, height: 40.h)), + ], + ).onPress(() { + bookAppointmentsViewModel.setProjectID(null); + openRegionListBottomSheet(context, RegionBottomSheetType.FOR_REGION); + }), + ], + ), + ), + ), + ], + ).paddingSymmetrical(24.h, 0.h); + case 1: + //TODO: Get LiveCare type Select UI from Hussain + return appState.isAuthenticated + ? Column( + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.search_by_clinic_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Immediate Consultation".needTranslation.toText14(color: AppColors.textColor, weight: FontWeight.w500), + "Tap to select clinic".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), + ], + ), + ], + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, iconColor: AppColors.textColor, width: 40.h, height: 40.h)), + ], + ).onPress(() async { + //TODO Implement API to check for existing LiveCare Requests + + LoaderBottomSheet.showLoader(); + await immediateLiveCareViewModel.getPatientLiveCareHistory(); + LoaderBottomSheet.hideLoader(); + + if (immediateLiveCareViewModel.patientHasPendingLiveCareRequest) { + Navigator.of(context).push( + CustomPageRoute( + page: ImmediateLiveCarePendingRequestPage(), + ), + ); + } else { + Navigator.of(context).push( + CustomPageRoute( + page: SelectImmediateLiveCareClinicPage(), + ), + ); + } + }), + SizedBox(height: 16.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.search_by_doctor_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Scheduled Consultation".needTranslation.toText14(color: AppColors.textColor, weight: FontWeight.w500), + "Tap to select clinic".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), + ], + ), + ], + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, iconColor: AppColors.textColor, width: 40.h, height: 40.h)), + ], + ).onPress(() { + bookAppointmentsViewModel.setIsClinicsListLoading(true); + bookAppointmentsViewModel.setIsLiveCareSchedule(true); + Navigator.of(context).push( + CustomPageRoute( + page: SelectClinicPage(), + ), + ); + }), + SizedBox(height: 16.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.search_by_region_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Pharma LiveCare".needTranslation.toText14(color: AppColors.textColor, weight: FontWeight.w500), + "".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), + ], + ), + ], + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, iconColor: AppColors.textColor, width: 40.h, height: 40.h)), + ], + ).onPress(() { + openRegionListBottomSheet(context, RegionBottomSheetType.FOR_REGION); + }), + ], + ), + ), + ), + ], + ).paddingSymmetrical(24.h, 0.h) + : getLiveCareNotLoggedInUI(); + default: + SizedBox.shrink(); + } + return Container(); + } + + void openRegionListBottomSheet(BuildContext context, RegionBottomSheetType type) { + regionalViewModel.flush(); + regionalViewModel.setBottomSheetType(type); + // AppointmentViaRegionViewmodel? viewmodel = null; + showCommonBottomSheetWithoutHeight(context, + title: "", + titleWidget: Consumer(builder: (_, data, __) => getTitle(data)), + isDismissible: false, child: Consumer(builder: (_, data, __) { + return getRegionalSelectionWidget(data); + }), callBackFunc: () {}); + } + + Widget getRegionalSelectionWidget(AppointmentViaRegionViewmodel data) { + if (data.bottomSheetState == AppointmentViaRegionState.REGION_SELECTION) { + return RegionBottomSheetBody(); + } + if (data.bottomSheetState == AppointmentViaRegionState.TYPE_SELECTION) { + bookAppointmentsViewModel.resetFilterList(); + return FacilityTypeSelectionWidget( + selectedRegion: data.selectedRegionId ?? "", + ); + } + if (data.bottomSheetState == AppointmentViaRegionState.HOSPITAL_SELECTION) { + return HospitalBottomSheetBody(); + } + if (data.bottomSheetState == AppointmentViaRegionState.CLINIC_SELECTION) { + // Navigator.of(context).pop(); + bookAppointmentsViewModel.setIsClinicsListLoading(true); + bookAppointmentsViewModel.setLoadSpecificClinic(true); + bookAppointmentsViewModel.setProjectID(regionalViewModel.selectedHospital?.hospitalList.first?.mainProjectID.toString()); + } else { + SizedBox.shrink(); + } + return SizedBox.shrink(); + } + + getTitle(AppointmentViaRegionViewmodel data) { + if (data.selectedRegionId == null) { + return LocaleKeys.selectRegion.tr().toText20(weight: FontWeight.w600); + } else { + return Transform.flip( + flipX: data.isArabic ? true : false, + child: Utils.buildSvgWithAssets( + icon: AppAssets.arrow_back, + iconColor: Color(0xff2B353E), + fit: BoxFit.contain, + ), + ).onPress(() { + data.handleBackPress(); + }); + } + } + + Widget getLiveCareNotLoggedInUI() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.immediate_service_icon, width: 58.h, height: 58.h), + SizedBox(width: 18.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Immediate service".needTranslation.toText18(color: AppColors.textColor, isBold: true), + "No need to wait, you will get medical consultation immediately via video call" + .needTranslation + .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ), + ], + ), + SizedBox(height: 24.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.no_visit_icon, width: 58.h, height: 58.h), + SizedBox(width: 18.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "No visit required".needTranslation.toText18(color: AppColors.textColor, isBold: true), + LocaleKeys.livecarePoint5.tr(context: context).toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ), + ], + ), + SizedBox(height: 24.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.doctor_contact_icon, width: 58.h, height: 58.h), + SizedBox(width: 18.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Doctor will contact".needTranslation.toText18(color: AppColors.textColor, isBold: true), + "A specialised doctor will contact you and will be able to view your medical history" + .needTranslation + .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ), + ], + ), + SizedBox(height: 24.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.free_med_delivery_icon, width: 58.h, height: 58.h), + SizedBox(width: 18.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Free medicine delivery".needTranslation.toText18(color: AppColors.textColor, isBold: true), + "Offers free medicine delivery for the LiveCare appointment" + .needTranslation + .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ), + ], + ), + SizedBox(height: 36.h), + CustomButton( + text: "Login to use this service".needTranslation, + onPressed: () async { + await authVM.onLoginPressed(); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + icon: AppAssets.login1, + iconColor: AppColors.whiteColor, + iconSize: 24.h, + ), + ], + ).paddingSymmetrical(24.h, 0.h); + } +} diff --git a/lib/presentation/book_appointment/dental_chief_complaints_page.dart b/lib/presentation/book_appointment/dental_chief_complaints_page.dart new file mode 100644 index 0000000..4dc3881 --- /dev/null +++ b/lib/presentation/book_appointment/dental_chief_complaints_page.dart @@ -0,0 +1,95 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/dental_chief_complaints_response_model.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/select_doctor_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/chief_complaint_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class DentalChiefComplaintsPage extends StatefulWidget { + const DentalChiefComplaintsPage({super.key}); + + @override + State createState() => _DentalChiefComplaintsPageState(); +} + +class _DentalChiefComplaintsPageState extends State { + late AppState appState; + late BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + void initState() { + scheduleMicrotask(() { + bookAppointmentsViewModel.getDentalChiefComplaintsList(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + bookAppointmentsViewModel = Provider.of(context, listen: false); + appState = getIt.get(); + return CollapsingListView( + title: "Dental Chief Complaints".needTranslation, + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Consumer(builder: (context, bookAppointmentsVM, child) { + return ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: bookAppointmentsVM.isChiefComplaintsListLoading ? 5 : bookAppointmentsVM.dentalChiefComplaintsList.length, + itemBuilder: (context, index) { + return bookAppointmentsVM.isChiefComplaintsListLoading + ? ChiefComplaintCard( + bookAppointmentsVM: bookAppointmentsVM, + dentalChiefComplaintsListResponseModel: DentalChiefComplaintsListResponseModel(), + isLoading: bookAppointmentsVM.isChiefComplaintsListLoading, + ) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: ChiefComplaintCard( + bookAppointmentsVM: bookAppointmentsVM, + dentalChiefComplaintsListResponseModel: bookAppointmentsVM.dentalChiefComplaintsList[index], + isLoading: bookAppointmentsVM.isChiefComplaintsListLoading, + ).onPress(() { + bookAppointmentsVM.setSelectedChiefComplaintID(bookAppointmentsVM.dentalChiefComplaintsList[index].iD!); + bookAppointmentsViewModel.setIsDoctorsListLoading(true); + Navigator.of(context).push( + CustomPageRoute( + page: SelectDoctorPage(), + ), + ); + }), + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ); + }), + ), + ), + ); + } +} diff --git a/lib/presentation/book_appointment/doctor_filter/RegionChips.dart b/lib/presentation/book_appointment/doctor_filter/RegionChips.dart new file mode 100644 index 0000000..c81e548 --- /dev/null +++ b/lib/presentation/book_appointment/doctor_filter/RegionChips.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart' + show BookAppointmentsViewModel; +import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:provider/provider.dart'; + +class RegionChips extends StatelessWidget { + const RegionChips({super.key}); + + @override + Widget build(BuildContext context) { + return Selector>( + selector: (_, model) => model.searchedRegionList, + builder: (__, data, ___) => + Selector?>( + selector: (_, model) => model.selectedRegionForFilters, + builder: (context, selectRegion, ___) => Row( + children: [ + Expanded( + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: data.length, + separatorBuilder: (_, __)=>SizedBox(width: 8.h,), + + itemBuilder: (_, index) => AppCustomChipWidget( + labelText: data[index], + textColor: selectRegion?.any((selectedRegion)=>data[index] == selectedRegion) == true + ? AppColors.primaryRedColor + + : AppColors.textColor, + backgroundColor: + selectRegion?.any((selectedRegion)=>data[index] == selectedRegion) == true + ? AppColors.primaryRedColor + .withOpacity(0.1) + : AppColors.whiteColor, + shape: RoundedRectangleBorder( + side: BorderSide( + color: selectRegion?.any((selectedRegion)=>data[index] == selectedRegion) == true + ? AppColors + .primaryRedBorderColor + : AppColors + .chipBorderColorOpacity20, + width: 1, + ), + borderRadius: + BorderRadius.circular(10))) + .onPress(() { + context + .read() + .setSelectedRegion(data[index]); + }))) + ], + ), + )); + } +} diff --git a/lib/presentation/book_appointment/doctor_filter/clinic_bottomsheet.dart b/lib/presentation/book_appointment/doctor_filter/clinic_bottomsheet.dart new file mode 100644 index 0000000..155d8e3 --- /dev/null +++ b/lib/presentation/book_appointment/doctor_filter/clinic_bottomsheet.dart @@ -0,0 +1,85 @@ +import 'package:easy_localization/easy_localization.dart' + show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_filter/clinic_item.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/clinic_card.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +import '../../../features/book_appointments/models/resp_models/get_clinic_list_response_model.dart' show GetClinicsListResponseModel; + +class ClinicBottomSheet extends StatelessWidget { + late BookAppointmentsViewModel appointmentsViewModel; + late AppointmentViaRegionViewmodel regionalViewModel; + final TextEditingController searchText = TextEditingController(); + + ClinicBottomSheet({super.key}); + + @override + Widget build(BuildContext context) { + appointmentsViewModel = Provider.of(context); + regionalViewModel = Provider.of(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + LocaleKeys.selectClinic.tr(), + style: TextStyle( + fontSize: 21, + fontWeight: FontWeight.w600, + color: AppColors.blackColor, + ), + ), + SizedBox(height: 24.h), + SizedBox( + height: MediaQuery.sizeOf(context).height * .4, + child: ListView.separated( + itemBuilder: (_, index) + { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: ClinicItem( + isArabic: appointmentsViewModel.isArabic(), + clinicName: appointmentsViewModel.searchedClinicList[index], + ), + ), + ), + ), + + ).onPress(() { + context.read() + .setSelectedClinicForFilter(appointmentsViewModel.searchedClinicList[index]); + Navigator.pop(context); + });}, + separatorBuilder: (_, __) => SizedBox( + height: 16.h, + ), + itemCount: appointmentsViewModel.searchedClinicList.length ?? 0), + ) + ], + ); + } +} diff --git a/lib/presentation/book_appointment/doctor_filter/clinic_item.dart b/lib/presentation/book_appointment/doctor_filter/clinic_item.dart new file mode 100644 index 0000000..0d5ba76 --- /dev/null +++ b/lib/presentation/book_appointment/doctor_filter/clinic_item.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; + +class ClinicItem extends StatelessWidget { + final String clinicName; + final bool isArabic; + + ClinicItem({super.key, required this.clinicName, required this.isArabic}); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets( + icon: AppAssets.generic_clinic_icon, + width: 24.h, + height: 24.h, + fit: BoxFit.contain), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: clinicName.toText16(isBold: true)), + Transform.flip( + flipX: isArabic, + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + width: 15.h, + height: 15.h, + fit: BoxFit.contain, + iconColor: AppColors.textColor), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart b/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart new file mode 100644 index 0000000..6e51f8a --- /dev/null +++ b/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart @@ -0,0 +1,249 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body_for_doctor_filter.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_filter/RegionChips.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_filter/clinic_bottomsheet.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_filter/facility_Chips.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +import '../../../widgets/buttons/custom_button.dart'; + +class DoctorsFilters extends StatelessWidget{ + + + TextEditingController hospitalController = TextEditingController(); + TextEditingController clinicController = TextEditingController(); + DoctorsFilters({super.key,}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + appBar: AppBar( + backgroundColor: AppColors.bgScaffoldColor, + + automaticallyImplyLeading: false, + centerTitle: false, + title: Utils.buildSvgWithAssets(icon: AppAssets.ic_close, height: 32.h, width: 32.h).onPress((){ + context.read() + .clearSelection() + ; + Navigator.pop(context); + }) + + + + ), + + body: Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + LocaleKeys.filters.tr(), + style:TextStyle( + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + fontSize: 27.f, + color: AppColors.textColor, + letterSpacing: -1 + ) + ), + Text( + LocaleKeys.clearAllFilters.tr(), + style:TextStyle( + fontFamily: 'Poppins', + fontWeight: FontWeight.w500, + fontSize: 14.f, + color: AppColors.errorColor + ) + ).onPress((){ + context.read().clearSelection(); + context.read().updateApplyFilters(false); + // context.read().setSelections( + // context.read().selectedFacilityForFilters, + // context.read().selectedRegionForFilters, + // context.read().selectedClinicForFilters, + // context.read().selectedHospitalForFilters, + // context.read().applyFilters); + context.read().updateList(); + }) + ], + ), + titleWidget(LocaleKeys.regionAndLocation.tr()), + SizedBox( + height: 42.h, + child: RegionChips()), + titleWidget(LocaleKeys.facilityAndLocation.tr()), + SizedBox( + height: 42.h, + child: FacilityChip()), + titleWidget(LocaleKeys.hospital.tr()), + TextInputWidget( + controller: TextEditingController()..text =context.watch().selectedHospitalForFilters?.filterName??'', + labelText: LocaleKeys.hospital.tr(context: context), + hintText: LocaleKeys.searchHospital.tr(context: context), + isEnable: false, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + suffix:context.watch().selectedHospitalForFilters != null + ? GestureDetector( + onTap: () { + context.read().setSelectedHospital(null); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.ic_cross_circle, width: 24.h, height: 24.h, fit: BoxFit.scaleDown), + ) + : null, + onChange: (value) { + // DoctorFilterViewModel.filterClinics(value!); + }, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(8).h, + horizontal: ResponsiveExtension(10).h, + ), + ).onPress((){ + openRegionListBottomSheet(context, RegionBottomSheetType.FOR_REGION); + }), + + titleWidget(LocaleKeys.clinic.tr()), + TextInputWidget( + controller: TextEditingController()..text =context.watch().selectedClinicForFilters ??'', + labelText: LocaleKeys.clinicName.tr(context: context), + hintText: LocaleKeys.searchClinic.tr().needTranslation, + isEnable: false, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + suffix:context.read().selectedClinicForFilters?.isNotEmpty == true + ? GestureDetector( + onTap: () { + context.read().setSelectedClinicForFilter(null); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.ic_cross_circle, width: 20.h, height: 20.h, fit: BoxFit.scaleDown), + ) + : null, + onChange: (value) { + // DoctorFilterViewModel.filterClinics(value!); + }, + padding: EdgeInsets.symmetric( + vertical: 8.h, + horizontal: 10.h, + ), + ).onPress((){ + openClinicListBottomSheet(context,); + }), + + + ], + ).paddingSymmetrical(24.h, 0.h), + Spacer(), + DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: Colors.white, + customBorder: BorderRadius.only(topLeft: Radius.circular(24.h), topRight: Radius.circular(24.h)) , + + ), + child: CustomButton( + text: LocaleKeys.applyFilter.tr(), + onPressed: () { + context.read().updateApplyFilters(true); + context.read().setSelections( + context.read().selectedFacilityForFilters?.toList()??[], + context.read().selectedRegionForFilters?.toList()??[], + context.read().selectedClinicForFilters, + context.read().selectedHospitalForFilters, + context.read().applyFilters); + context.read().updateList(); + Navigator.pop(context); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: Colors.white, + fontSize: 16.f, + padding: EdgeInsets.zero, + fontWeight: FontWeight.w500, + borderRadius: 10.r, + icon: AppAssets.add_icon, + iconColor: AppColors.primaryRedColor, + ).paddingAll(24.h), + ), + ], + ), + ); + } + + Widget titleWidget(String title){ + return Column( + children: [ + SizedBox(height: 24.h,), + Text( + title, + style:TextStyle( + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + fontSize: 16.f, + color: AppColors.textColor, + letterSpacing:-1 + ) + ), + SizedBox(height: 8.h,), + ], + ); + } + + void openRegionListBottomSheet(BuildContext context, RegionBottomSheetType type) { + context.read().flush(); + context.read().setBottomSheetType(type); + context.read().setBottomSheetState(AppointmentViaRegionState.HOSPITAL_SELECTION); + // AppointmentViaRegionViewmodel? viewmodel = null; + showCommonBottomSheetWithoutHeight(context, title: "", titleWidget: Consumer(builder: (_, data, __) => getTitle(data)), isDismissible: false, + child: Consumer(builder: (_, data, __) { + return getRegionalSelectionWidget(data); + }), callBackFunc: () {}); + } + + Widget getRegionalSelectionWidget(AppointmentViaRegionViewmodel data) { + + if (data.bottomSheetState == AppointmentViaRegionState.HOSPITAL_SELECTION) { + return HospitalBottomSheetBodyForDoctorFilter(); + } + if (data.bottomSheetState == AppointmentViaRegionState.CLINIC_SELECTION) { + } else { + SizedBox.shrink(); + } + return SizedBox.shrink(); + } + + getTitle(AppointmentViaRegionViewmodel data) { + return SizedBox.shrink(); + } + + void openClinicListBottomSheet(BuildContext context) { + showCommonBottomSheetWithoutHeight(context, title: "", titleWidget: Consumer(builder: (_, data, __) => getTitle(data)), isDismissible: false, + child: Consumer(builder: (_, data, __) { + return ClinicBottomSheet(); + }), callBackFunc: () {}); + } + +} \ No newline at end of file diff --git a/lib/presentation/book_appointment/doctor_filter/facility_Chips.dart b/lib/presentation/book_appointment/doctor_filter/facility_Chips.dart new file mode 100644 index 0000000..f416ed4 --- /dev/null +++ b/lib/presentation/book_appointment/doctor_filter/facility_Chips.dart @@ -0,0 +1,65 @@ + +import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart' + show BookAppointmentsViewModel; +import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:provider/provider.dart'; + +class FacilityChip extends StatelessWidget { + const FacilityChip({super.key}); + + @override + Widget build(BuildContext context) { + return Selector>( + selector: (_, model) => model.facilityList, + builder: (__, data, ___) => + Selector?>( + selector: (_, model) => model.selectedFacilityForFilters, + builder: (context, selectRegion, ___) => Row( + children: [ + Expanded( + child: ListView.separated( + scrollDirection: Axis.horizontal, + + itemCount: data.length, + separatorBuilder: (_, __)=>SizedBox(width: 8.h,), + itemBuilder: (_, index) => AppCustomChipWidget( + icon: data[index].contains("hmg")?AppAssets.hmg: AppAssets.hmc, + iconHasColor: false, + iconSize: 18, + labelText: data[index].tr(), + textColor: selectRegion?.any((selectedRegion)=>data[index] == selectedRegion) == true + ? AppColors.primaryRedColor + : AppColors.textColor, + backgroundColor: + data[index] == selectRegion + ? AppColors.primaryRedColor + .withOpacity(0.1) + : AppColors.whiteColor, + shape: RoundedRectangleBorder( + side: BorderSide( + color: selectRegion?.any((selectedRegion)=>data[index] == selectedRegion) == true + ? AppColors + .primaryRedBorderColor + : AppColors + .chipBorderColorOpacity20, + width: 1, + ), + borderRadius: + BorderRadius.circular(10))) + .onPress(() { + context + .read() + .setSelectedFacilityForFilter(data[index]); + }))) + ], + ), + )); + } +} diff --git a/lib/presentation/book_appointment/doctor_profile_page.dart b/lib/presentation/book_appointment/doctor_profile_page.dart new file mode 100644 index 0000000..1223842 --- /dev/null +++ b/lib/presentation/book_appointment/doctor_profile_page.dart @@ -0,0 +1,183 @@ +import 'dart:math'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hijri_gregorian_calendar/hijri_gregorian_calendar.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:provider/provider.dart'; + +class DoctorProfilePage extends StatelessWidget { + DoctorProfilePage({super.key}); + + late AppState appState; + late BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + Widget build(BuildContext context) { + bookAppointmentsViewModel = Provider.of(context, listen: false); + appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Doctor Profile".needTranslation, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image.network( + bookAppointmentsViewModel.doctorsProfileResponseModel.doctorImageURL!, + width: 63.h, + height: 63.h, + fit: BoxFit.cover, + ).circle(100), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ("${bookAppointmentsViewModel.doctorsProfileResponseModel.doctorTitleForProfile} ${bookAppointmentsViewModel.doctorsProfileResponseModel.doctorName}") + .toString() + .toText28(isBold: true), + (bookAppointmentsViewModel.doctorsProfileResponseModel.specialty!.isNotEmpty ? bookAppointmentsViewModel.doctorsProfileResponseModel.specialty!.first : "") + .toString() + .toText18(weight: FontWeight.w500, color: AppColors.primaryRedColor), + ], + ), + ], + ), + Image.network( + bookAppointmentsViewModel.doctorsProfileResponseModel.nationalityFlagURL!, + width: 32.h, + height: 32.h, + fit: BoxFit.cover, + ), + ], + ), + SizedBox(height: 12.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + icon: AppAssets.rating_icon, + iconColor: AppColors.ratingColorYellow, + labelText: "Rating: ${bookAppointmentsViewModel.doctorsProfileResponseModel.decimalDoctorRate}".needTranslation, + ), + AppCustomChipWidget( + icon: AppAssets.rating_icon, + iconColor: AppColors.ratingColorYellow, + labelText: "Reviews: ${bookAppointmentsViewModel.doctorsProfileResponseModel.noOfPatientsRate}".needTranslation, + ), + ], + ), + SizedBox(height: 16.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h), + SizedBox(height: 16.h), + "Biography".toText14(weight: FontWeight.w600, color: AppColors.textColor), + bookAppointmentsViewModel.doctorsProfileResponseModel.doctorProfileInfo!.toText12(fontWeight: FontWeight.w600, color: AppColors.greyTextColor), + ], + ).paddingSymmetrical(24.h, 0.h), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: CustomButton( + text: "View available appointments".needTranslation, + onPressed: () async { + LoaderBottomSheet.showLoader(); + bookAppointmentsViewModel.isLiveCareSchedule + ? await bookAppointmentsViewModel.getLiveCareDoctorFreeSlots( + isBookingForLiveCare: true, + onSuccess: (dynamic respData) async { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + title: "Pick a Date".needTranslation, + context, + child: AppointmentCalendar(), + isFullScreen: false, + isCloseButtonVisible: true, + callBackFunc: () {}, + ); + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }) + : await bookAppointmentsViewModel.getDoctorFreeSlots( + isBookingForLiveCare: false, + onSuccess: (dynamic respData) async { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + title: "Pick a Date".needTranslation, + context, + child: AppointmentCalendar(), + isFullScreen: false, + isCloseButtonVisible: true, + callBackFunc: () {}, + ); + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + icon: AppAssets.calendar, + iconColor: AppColors.whiteColor, + iconSize: 20.h, + ).paddingSymmetrical(24.h, 24.h), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/book_appointment/laser/laser_appointment.dart b/lib/presentation/book_appointment/laser/laser_appointment.dart new file mode 100644 index 0000000..440ae45 --- /dev/null +++ b/lib/presentation/book_appointment/laser/laser_appointment.dart @@ -0,0 +1,129 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/laser_body_parts.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/laser/widgets/body_part_listing.dart' show BodyPartsListing; +import 'package:hmg_patient_app_new/presentation/book_appointment/laser/widgets/body_type_listing.dart' + show BodyTypeListing; +import 'package:hmg_patient_app_new/presentation/book_appointment/select_doctor_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class LaserAppointment extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + bottomNavigationBar: + DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Selector(selector: (_, vm)=>vm.duration,builder: (_, duration, __)=> Row( + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + LocaleKeys.totalMinutes.tr(), + style: TextStyle( + fontSize: 12.f, + fontWeight: FontWeight.w600, + color: AppColors.textColor, + letterSpacing: -0.48, + ), + ), + Text( + "$duration / 90".tr(), + style: TextStyle( + fontSize: 16.f, + fontWeight: FontWeight.bold, + color: AppColors.textColor, + letterSpacing: -0.64, + ), + ), + ], + ), + ), + Expanded( + child: CustomButton( + isDisabled: duration==0, + text: LocaleKeys.continueString.tr(), onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: SelectDoctorPage(), + ), + ); + }, + ), + ), + ], + )).paddingSymmetrical(24.h, 12.h), + ), + body: CollapsingListView( + title: LocaleKeys.laserClinic.tr(), + child: SingleChildScrollView( + child: Column( + children: [ + CustomTabBar( + activeTextColor: Color(0xffED1C2B), + activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), + tabs: [ + CustomTabBarModel(null,LocaleKeys.malE.tr()), + CustomTabBarModel(null,LocaleKeys.female.tr()), + ], + onTabChange: (index) { + var viewmodel = context.read(); + viewmodel.setBodyType(index); + viewmodel.setSelectedCategory(0); + viewmodel.getLaserClinic(); + }, + ), + Selector( + selector: (_, vm) => vm.selectedBodyTypeIndex, + builder: (_, bodyType, __) { + return BodyTypeListing( + availableBodyArea: context + .read() + .bodyTypes[bodyType], + selectedBodyAreaIndex: context + .read() + .selectedCategory, + onCategoryChanged: (category) { + context + .read() + .setSelectedCategory(category); + }); + }, + ), + Selector>(selector: (_, vm) => vm.laserBodyPartsList, builder:(_, parts,__){ + return BodyPartsListing( + parts: parts, + onPartSelected: (part){ + context.read().setSelectedBodyPart(part); + }, + selectedPart: context.watch().selectedBodyPartList, + isLoading: context.watch().isBodyPartsLoading, + isMale: context.watch().selectedBodyTypeIndex == 0, + laserCategoryID: context.watch().readCurrentLaserCategoryID(), + ); + }), + ], + ).paddingSymmetrical(24.h, 12.h), + ), + ), + ); + } +} diff --git a/lib/presentation/book_appointment/laser/widgets/body_part_listing.dart b/lib/presentation/book_appointment/laser/widgets/body_part_listing.dart new file mode 100644 index 0000000..c957868 --- /dev/null +++ b/lib/presentation/book_appointment/laser/widgets/body_part_listing.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/laser_body_parts_data.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/laser_body_parts.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:provider/provider.dart'; + +class BodyPartsListing extends StatelessWidget { + final List parts; + final Function(LaserBodyPart) onPartSelected; + final List selectedPart; + final int laserCategoryID; + final bool isMale; + final bool isLoading; + + const BodyPartsListing( + {super.key, + required this.parts, + required this.onPartSelected, + required this.selectedPart, + required this.laserCategoryID, + required this.isMale, required this.isLoading}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Visibility( + visible: isLoading, + child: GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: 85 / 107, + crossAxisSpacing: 4.h, + mainAxisSpacing: 21.h), + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: 20, + // padding: fullBody != null ? EdgeInsets.only(top: 16) : EdgeInsets.zero, + padding: EdgeInsets.zero, + itemBuilder: (BuildContext context, int index) { + return SizedBox( height: 80, width: 80,).toShimmer2(isShow: isLoading); + })), + Visibility( + visible: !isLoading, + child: GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: 85 / 107, + crossAxisSpacing: 4.h, + mainAxisSpacing: 21.h), + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: parts.length, + // padding: fullBody != null ? EdgeInsets.only(top: 16) : EdgeInsets.zero, + padding: EdgeInsets.zero, + itemBuilder: (BuildContext context, int index) { + bool _isSelected = + selectedPart.any((file) => file.id == parts[index].id); + return InkWell( + onTap: () { + onPartSelected(parts[index]); + }, + child: AnimatedOpacity( + opacity: 1.0, + duration: Duration(milliseconds: 200), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AspectRatio( + aspectRatio: 97 / 97, + child: FittedBox( + fit: BoxFit.fitWidth, + child: Stack( + alignment: Alignment.topRight, + children: [ + Container( + margin: EdgeInsets.only(top: 5.h, right: 5.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15.0), + border: Border.all( + color: _isSelected + ? AppColors.primaryRedColor + : AppColors.borderGrayColor, + width: 2.h), + ), + child: LaserBodyParts().getCategoryImage(isMale, + laserCategoryID, parts[index].mappingCode!), + ), + if (_isSelected) + Container( + width: 18.h, + height: 18.h, + child: Icon(Icons.done, + color: Colors.white, size: 12.h), + decoration: BoxDecoration( + color: AppColors.primaryRedColor, + borderRadius: BorderRadius.circular(30.h), + ), + ), + ], + ), + ), + ), + SizedBox(height: 6.h), + Expanded( + child: Text( + context + .read() + .getLaserProcedureNameWRTLanguage(parts[index]), + style: TextStyle( + fontSize: 12.f, + fontWeight: FontWeight.w600, + color: Color(0xff2B353E), + letterSpacing: -0.48, + ), + maxLines: 1, + ), + ), + ], + ), + ), + ); + }, + ), + ), + ], + ); + } +} diff --git a/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart b/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart new file mode 100644 index 0000000..d8fa736 --- /dev/null +++ b/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart @@ -0,0 +1,66 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/LaserCategoryType.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:smooth_corner/smooth_corner.dart' show SmoothRectangleBorder; + +class BodyTypeListing extends StatelessWidget { + final List availableBodyArea; + final Function(int) onCategoryChanged; + final int selectedBodyAreaIndex; + + const BodyTypeListing( + {super.key, + required this.availableBodyArea, + required this.onCategoryChanged, + required this.selectedBodyAreaIndex}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 56.h, + child: Row( + children: [ + Expanded( + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: availableBodyArea.length, + separatorBuilder: (_, index) => SizedBox( + width: 8.h, + ), + itemBuilder: (_, index) => AppCustomChipWidget( + backgroundColor: index == selectedBodyAreaIndex + ? AppColors.chipSecondaryLightRedColor + : AppColors.whiteColor, + textColor: index == selectedBodyAreaIndex + ? AppColors.chipPrimaryRedBorderColor + : AppColors.blackColor, + labelText: availableBodyArea[index].title.tr(), + iconHasColor: false, + iconColor: index == selectedBodyAreaIndex + ? AppColors.chipPrimaryRedBorderColor + : AppColors.blackColor, + iconSize: 16, + labelPadding: + EdgeInsetsDirectional.only(start: 8.h, end: 0.h), + padding: + EdgeInsets.symmetric(vertical: 16.h, horizontal: 12.h), + deleteIconSize: Size(18.h, 18.h), + shape: SmoothRectangleBorder( + borderRadius: BorderRadius.circular(10), + smoothness: 10, + side: BorderSide( + color: index == selectedBodyAreaIndex + ? AppColors.chipPrimaryRedBorderColor + : AppColors.borderGrayColor, + width: 1), + )).onPress(() => onCategoryChanged(index)))) + ], + ), + ); + } +} diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart new file mode 100644 index 0000000..af7d053 --- /dev/null +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart @@ -0,0 +1,304 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:provider/provider.dart'; +import 'package:smooth_corner/smooth_corner.dart'; + +class ImmediateLiveCarePaymentDetails extends StatelessWidget { + ImmediateLiveCarePaymentDetails({super.key}); + + late ImmediateLiveCareViewModel immediateLiveCareViewModel; + late AppState appState; + + @override + Widget build(BuildContext context) { + immediateLiveCareViewModel = Provider.of(context, listen: false); + appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.scaffoldBgColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Review LiveCare Request".needTranslation, + child: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + LocaleKeys.patientInfo.tr(context: context).toText16(isBold: true), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Row( + children: [ + Image.asset( + appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, + width: 52.h, + height: 52.h, + ), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}".toText16(isBold: true), + SizedBox(height: 8.h), + AppCustomChipWidget(labelText: "${appState.getAuthenticatedUser()!.age} Years Old"), + ], + ), + ], + ), + ), + ), + SizedBox(height: 24.h), + "Clinic Information".needTranslation.toText16(isBold: true), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.generic_clinic_icon, width: 32.h, height: 32.h, fit: BoxFit.contain), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (appState.isArabic() + ? immediateLiveCareViewModel.immediateLiveCareSelectedClinic.serviceNameN + : immediateLiveCareViewModel.immediateLiveCareSelectedClinic.serviceName)! + .toText16(isBold: true), + // SizedBox(height: 8.h), + // AppCustomChipWidget(labelText: "${appState.getAuthenticatedUser()!.age} Years Old"), + ], + ), + ], + ), + ), + ), + SizedBox(height: 24.h), + "Selected LiveCare Type".needTranslation.toText16(isBold: true), + SizedBox(height: 16.h), + Consumer(builder: (context, bookAppointmentsVM, child) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.livecare_clinic_icon, width: 32.h, height: 32.h, fit: BoxFit.contain), + SizedBox(width: 8.h), + getLiveCareType(immediateLiveCareViewModel.liveCareSelectedCallType).toText16(isBold: true), + ], + ), + Utils.buildSvgWithAssets(icon: AppAssets.edit_icon, width: 24.h, height: 24.h, fit: BoxFit.contain), + ], + ), + ), + ).onPress(() { + showCommonBottomSheetWithoutHeight(context, child: SelectLiveCareCallType(immediateLiveCareViewModel: immediateLiveCareViewModel), callBackFunc: () async { + debugPrint("Selected Call Type: ${immediateLiveCareViewModel.liveCareSelectedCallType}"); + }, title: "Select LiveCare call type".needTranslation, isCloseButtonVisible: true, isFullScreen: false); + }); + }), + SizedBox(height: 24.h) + ], + ), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.isCash ?? true) + ? Container( + height: 50.h, + decoration: ShapeDecoration( + color: AppColors.secondaryLightRedBorderColor, + shape: SmoothRectangleBorder( + borderRadius: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)), + smoothness: 1, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Insurance expired or inactive".needTranslation.toText14(color: AppColors.primaryRedColor, weight: FontWeight.w500).paddingSymmetrical(24.h, 0.h), + CustomButton( + text: LocaleKeys.updateInsurance.tr(context: context), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: InsuranceHomePage(), + ), + ); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.secondaryLightRedBorderColor, + textColor: AppColors.whiteColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(15, 0, 15, 0), + height: 30.h, + ).paddingSymmetrical(24.h, 0.h), + ], + ), + ) + : const SizedBox(), + SizedBox(height: 24.h), + "Total amount to pay".needTranslation.toText18(isBold: true).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 17.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Amount before tax".needTranslation.toText14(isBold: true), + Utils.getPaymentAmountWithSymbol(immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.amount!.toText16(isBold: true), AppColors.blackColor, 13, + isSaudiCurrency: immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.currency!.toLowerCase() == "sar"), + ], + ).paddingSymmetrical(24.h, 0.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "VAT 15%".needTranslation.toText14(isBold: true, color: AppColors.greyTextColor), + Utils.getPaymentAmountWithSymbol( + immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.tax!.toText14(isBold: true, color: AppColors.greyTextColor), AppColors.greyTextColor, 13, + isSaudiCurrency: immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.currency!.toLowerCase() == "sar"), + ], + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 17.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox(width: 150.h, child: Utils.getPaymentMethods()), + Utils.getPaymentAmountWithSymbol(immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.total!.toText24(isBold: true), AppColors.blackColor, 17, + isSaudiCurrency: immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.currency!.toLowerCase() == "sar"), + ], + ).paddingSymmetrical(24.h, 0.h), + CustomButton( + text: LocaleKeys.payNow.tr(context: context), + onPressed: () async { + await askVideoCallPermission().then((val) { + if (val) { + Navigator.of(context).push( + CustomPageRoute( + page: ImmediateLiveCarePaymentPage(), + ), + ); + } else { + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: context), + context, + child: Utils.getWarningWidget( + loadingText: + "LiveCare requires Camera, Microphone & Location permissions to enable virtual consultation between patient & doctor, Please allow these to proceed.".needTranslation, + isShowActionButtons: true, + onCancelTap: () { + Navigator.pop(context); + }, + onConfirmTap: () async { + openAppSettings(); + }), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }); + }, + backgroundColor: AppColors.infoColor, + borderColor: AppColors.infoColor, + textColor: AppColors.whiteColor, + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + icon: AppAssets.appointment_pay_icon, + iconColor: AppColors.whiteColor, + iconSize: 18.h, + ).paddingSymmetrical(24.h, 24.h), + ], + ), + ), + ], + ), + ); + } + + Future askVideoCallPermission() async { + Map statuses = await [ + Permission.camera, + Permission.microphone, + ].request(); + + if (statuses[Permission.camera] == PermissionStatus.granted && statuses[Permission.microphone] == PermissionStatus.granted) { + // Camera permission granted + return true; + } else { + return false; + } + + // if (!(await Permission.camera.request().isGranted) || !(await Permission.microphone.request().isGranted)) { + // return false; + // } + } + + String getLiveCareType(int callType) { + switch (callType) { + case 1: + return "Video Call".needTranslation; + case 2: + return "Audio Call".needTranslation; + case 3: + return "Phone Call".needTranslation; + default: + return "Video Call".needTranslation; + } + } +} diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart new file mode 100644 index 0000000..914ac4a --- /dev/null +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart @@ -0,0 +1,580 @@ +import 'dart:async'; +import 'dart:developer'; +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/services/cache_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/in_app_browser/InAppBrowser.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:provider/provider.dart'; +import 'package:smooth_corner/smooth_corner.dart'; + +class ImmediateLiveCarePaymentPage extends StatefulWidget { + ImmediateLiveCarePaymentPage({super.key}); + + @override + State createState() => _ImmediateLiveCarePaymentPageState(); +} + +class _ImmediateLiveCarePaymentPageState extends State { + late PayfortViewModel payfortViewModel; + late ImmediateLiveCareViewModel immediateLiveCareViewModel; + late MyAppointmentsViewModel myAppointmentsViewModel; + late AppState appState; + + MyInAppBrowser? browser; + String selectedPaymentMethod = ""; + + String transID = ""; + + bool isShowTamara = false; + String tamaraPaymentStatus = ""; + String tamaraOrderID = ""; + + @override + void initState() { + scheduleMicrotask(() { + payfortViewModel.initPayfortViewModel(); + myAppointmentsViewModel.getTamaraInstallmentsDetails().then((val) { + if (num.parse(immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.total!) >= myAppointmentsViewModel.getTamaraInstallmentsDetailsResponseModel!.minLimit!.amount! && + num.parse(immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.total!) <= myAppointmentsViewModel.getTamaraInstallmentsDetailsResponseModel!.maxLimit!.amount!) { + setState(() { + isShowTamara = true; + }); + } + }); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + myAppointmentsViewModel = Provider.of(context, listen: false); + immediateLiveCareViewModel = Provider.of(context, listen: false); + payfortViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Consumer(builder: (context, myAppointmentsVM, child) { + return Column( + children: [ + Expanded( + child: CollapsingListView( + title: "LiveCare Payment".needTranslation, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.mada, width: 72.h, height: 25.h), + SizedBox(height: 16.h), + "Mada".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.blackColor, + width: 40.h, + height: 40.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "MADA"; + openPaymentURL("mada"); + }), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.asset(AppAssets.visa, width: 50.h, height: 50.h), + SizedBox(width: 8.h), + Image.asset(AppAssets.Mastercard, width: 40.h, height: 40.h), + ], + ), + SizedBox(height: 16.h), + "Visa or Mastercard".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.blackColor, + width: 40.h, + height: 40.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "VISA"; + openPaymentURL("visa"); + }), + SizedBox(height: 16.h), + isShowTamara + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.tamara_en, width: 72.h, height: 25.h), + SizedBox(height: 16.h), + "Tamara".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.blackColor, + width: 40.h, + height: 40.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "TAMARA"; + openPaymentURL("tamara"); + }) + : SizedBox.shrink(), + ], + ), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Consumer(builder: (context, payfortVM, child) { + //TODO: Need to add loading state & animation for Apple Pay Configuration + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.isCash ?? true) + ? Container( + height: 50.h, + decoration: ShapeDecoration( + color: AppColors.secondaryLightRedBorderColor, + shape: SmoothRectangleBorder( + borderRadius: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)), + smoothness: 1, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Insurance expired or inactive".needTranslation.toText14(color: AppColors.primaryRedColor, weight: FontWeight.w500).paddingSymmetrical(24.h, 0.h), + CustomButton( + text: LocaleKeys.updateInsurance.tr(context: context), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: InsuranceHomePage(), + ), + ); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.secondaryLightRedBorderColor, + textColor: AppColors.whiteColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(15, 0, 15, 0), + height: 30.h, + ).paddingSymmetrical(24.h, 0.h), + ], + ), + ) + : const SizedBox(), + SizedBox(height: 24.h), + "Total amount to pay".needTranslation.toText18(isBold: true).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 17.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Amount before tax".needTranslation.toText14(isBold: true), + Utils.getPaymentAmountWithSymbol(immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.amount!.toString().toText16(isBold: true), AppColors.blackColor, 13, + isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "VAT 15%".needTranslation.toText14(isBold: true, color: AppColors.greyTextColor), + Utils.getPaymentAmountWithSymbol( + immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.tax!.toString().toText14(isBold: true, color: AppColors.greyTextColor), AppColors.greyTextColor, 13, + isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 17.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "".needTranslation.toText14(isBold: true), + Utils.getPaymentAmountWithSymbol(immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.total!.toString().toText24(isBold: true), AppColors.blackColor, 17, + isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + Platform.isIOS + ? Utils.buildSvgWithAssets( + icon: AppAssets.apple_pay_button, + width: 200.h, + height: 80.h, + fit: BoxFit.contain, + ).paddingSymmetrical(24.h, 0.h).onPress(() { + // payfortVM.setIsApplePayConfigurationLoading(true); + if (Utils.havePrivilege(103)) { + startApplePay(); + } else { + openPaymentURL("ApplePay"); + } + }) + : SizedBox(height: 12.h), + SizedBox(height: 12.h), + ], + ); + }), + ), + ], + ); + }), + ); + } + + onBrowserLoadStart(String url) { + print("onBrowserLoadStart"); + print(url); + + if (selectedPaymentMethod == "TAMARA") { + if (Platform.isAndroid) { + Uri uri = new Uri.dataFromString(url); + tamaraPaymentStatus = uri.queryParameters['status']!; + tamaraOrderID = uri.queryParameters['AuthorizePaymentId']!; + } else { + Uri uri = new Uri.dataFromString(url); + tamaraPaymentStatus = uri.queryParameters['paymentStatus']!; + tamaraOrderID = uri.queryParameters['orderId']!; + } + } + + // if(selectedPaymentMethod != "TAMARA") { + MyInAppBrowser.successURLS.forEach((element) { + if (url.contains(element)) { + browser?.close(); + MyInAppBrowser.isPaymentDone = true; + return; + } + }); + // } + + // if(selectedPaymentMethod != "TAMARA") { + MyInAppBrowser.errorURLS.forEach((element) { + if (url.contains(element)) { + browser?.close(); + MyInAppBrowser.isPaymentDone = false; + return; + } + }); + // } + } + + onBrowserExit(bool isPaymentMade) async { + debugPrint("onBrowserExit Called!!!!"); + checkPaymentStatus(); + } + + void checkPaymentStatus() async { + LoaderBottomSheet.showLoader(loadingText: "Checking payment status, Please wait...".needTranslation); + + if (selectedPaymentMethod == "TAMARA") { + await payfortViewModel.checkTamaraPaymentStatus( + transactionID: transID, + onSuccess: (apiResponse) async { + if (apiResponse.data["status"].toString().toLowerCase() == "success") { + tamaraOrderID = apiResponse.data["tamara_order_id"].toString(); + await payfortViewModel.updateTamaraRequestStatus(responseMessage: "success", status: "14", clientRequestID: transID, tamaraOrderID: tamaraOrderID); + await immediateLiveCareViewModel.addNewCallRequestForImmediateLiveCare(transID); + await immediateLiveCareViewModel.getPatientLiveCareHistory(); + LoaderBottomSheet.hideLoader(); + if (immediateLiveCareViewModel.patientHasPendingLiveCareRequest) { + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + Navigator.of(context).push( + CustomPageRoute( + page: ImmediateLiveCarePendingRequestPage(), + ), + ); + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Unknown error occurred...".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } else { + await payfortViewModel.updateTamaraRequestStatus(responseMessage: "Failed", status: "00", clientRequestID: transID, tamaraOrderID: tamaraOrderID); + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Payment Failed! Please try again.".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } else { + await payfortViewModel.checkPaymentStatus( + transactionID: transID, + onSuccess: (apiResponse) async { + debugPrint(apiResponse.data.toString()); + if (payfortViewModel.payfortCheckPaymentStatusResponseModel!.responseMessage!.toLowerCase() == "success") { + await immediateLiveCareViewModel.addNewCallRequestForImmediateLiveCare(transID); + await immediateLiveCareViewModel.getPatientLiveCareHistory(); + LoaderBottomSheet.hideLoader(); + if (immediateLiveCareViewModel.patientHasPendingLiveCareRequest) { + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + Navigator.of(context).push( + CustomPageRoute( + page: ImmediateLiveCarePendingRequestPage(), + ), + ); + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Unknown error occurred...".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Payment Failed! Please try again.".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }); + } + } + + openPaymentURL(String paymentMethod) { + browser = MyInAppBrowser(onExitCallback: onBrowserExit, onLoadStartCallback: onBrowserLoadStart, context: context); + transID = Utils.getAppointmentTransID( + immediateLiveCareViewModel.immediateLiveCareSelectedClinic.serviceID!, + ApiConsts.appEnvironmentType == AppEnvironmentTypeEnum.uat ? 15 : 12, + DateTime.now().millisecondsSinceEpoch, + ); + + //TODO: Need to pass dynamic params to the payment request instead of static values + browser?.openPaymentBrowser( + num.parse(immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.total!), + "LiveCare Payment", + transID, + "12", + "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", + selectedPaymentMethod, + appState.getAuthenticatedUser()!.patientType.toString(), + "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", + appState.getAuthenticatedUser()!.patientId.toString(), + appState.getAuthenticatedUser()!, + browser!, + false, + "4", + immediateLiveCareViewModel.immediateLiveCareSelectedClinic.serviceID.toString(), + context, + "3"); + } + + startApplePay() async { + LoaderBottomSheet.showLoader(loadingText: "Fetching Apple Pay details, Please wait...".needTranslation); + transID = Utils.getAppointmentTransID( + immediateLiveCareViewModel.immediateLiveCareSelectedClinic.serviceID!, + ApiConsts.appEnvironmentType == AppEnvironmentTypeEnum.uat ? 15 : 12, + DateTime.now().millisecondsSinceEpoch, + ); + + ApplePayInsertRequest applePayInsertRequest = ApplePayInsertRequest(); + + await payfortViewModel.getPayfortConfigurations( + serviceId: ServiceTypeEnum.appointmentPayment.getIdFromServiceEnum(), projectId: ApiConsts.appEnvironmentType == AppEnvironmentTypeEnum.uat ? 15 : 12, integrationId: 2); + + applePayInsertRequest.clientRequestID = transID; + applePayInsertRequest.clinicID = immediateLiveCareViewModel.immediateLiveCareSelectedClinic.serviceID!; + + // TODO: Need to pass dynamic currency coming from the API + applePayInsertRequest.currency = appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED"; + applePayInsertRequest.customerEmail = "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com"; + applePayInsertRequest.customerID = appState.getAuthenticatedUser()!.patientId.toString(); + applePayInsertRequest.customerName = "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}"; + + applePayInsertRequest.deviceToken = await Utils.getStringFromPrefs(CacheConst.pushToken); + applePayInsertRequest.voipToken = await Utils.getStringFromPrefs(CacheConst.voipToken); + applePayInsertRequest.doctorID = 0; + applePayInsertRequest.projectID = "12"; + applePayInsertRequest.serviceID = ServiceTypeEnum.appointmentPayment.getIdFromServiceEnum().toString(); + applePayInsertRequest.channelID = 3; + applePayInsertRequest.patientID = appState.getAuthenticatedUser()!.patientId.toString(); + applePayInsertRequest.patientTypeID = appState.getAuthenticatedUser()!.patientType; + applePayInsertRequest.patientOutSA = appState.getAuthenticatedUser()!.outSa; + applePayInsertRequest.appointmentDate = DateUtil.convertDateToString(DateTime.now()); + applePayInsertRequest.appointmentNo = 0; + applePayInsertRequest.orderDescription = "LiveCare Payment"; + applePayInsertRequest.liveServiceID = immediateLiveCareViewModel.immediateLiveCareSelectedClinic.serviceID!.toString(); + applePayInsertRequest.latitude = "0.0"; + applePayInsertRequest.longitude = "0.0"; + applePayInsertRequest.amount = immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.total.toString(); + applePayInsertRequest.isSchedule = "0"; + applePayInsertRequest.language = appState.isArabic() ? 'ar' : 'en'; + applePayInsertRequest.languageID = appState.isArabic() ? 1 : 2; + applePayInsertRequest.userName = appState.getAuthenticatedUser()!.patientId; + applePayInsertRequest.responseContinueURL = "http://hmg.com/Documents/success.html"; + applePayInsertRequest.backClickUrl = "http://hmg.com/Documents/success.html"; + applePayInsertRequest.paymentOption = "ApplePay"; + + applePayInsertRequest.isMobSDK = true; + applePayInsertRequest.merchantReference = transID; + applePayInsertRequest.merchantIdentifier = payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier; + applePayInsertRequest.commandType = "PURCHASE"; + applePayInsertRequest.signature = payfortViewModel.payfortProjectDetailsRespModel!.signature; + applePayInsertRequest.accessCode = payfortViewModel.payfortProjectDetailsRespModel!.accessCode; + applePayInsertRequest.shaRequestPhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaRequest; + applePayInsertRequest.shaResponsePhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaResponse; + applePayInsertRequest.returnURL = ""; + + //TODO: Need to pass dynamic params to the Apple Pay instead of static values + await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) { + payfortViewModel.paymentWithApplePay( + customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", + // customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress, + customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", + orderDescription: "LiveCare Payment", + orderAmount: double.parse(immediateLiveCareViewModel.liveCareImmediateAppointmentFeesList.total!), + merchantReference: transID, + merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier, + applePayAccessCode: payfortViewModel.payfortProjectDetailsRespModel!.accessCode, + applePayShaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel!.shaRequest, + currency: appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED", + onFailed: (failureResult) async { + log("failureResult: ${failureResult.message.toString()}"); + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: failureResult.message.toString()), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }, + onSucceeded: (successResult) async { + LoaderBottomSheet.hideLoader(); + log("successResult: ${successResult.responseMessage.toString()}"); + selectedPaymentMethod = successResult.paymentOption ?? "VISA"; + checkPaymentStatus(); + }, + // projectId: appo.projectID, + // serviceTypeEnum: ServiceTypeEnum.appointmentPayment, + ); + }); + } +} diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart new file mode 100644 index 0000000..e9e5c5c --- /dev/null +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart @@ -0,0 +1,305 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:lottie/lottie.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class ImmediateLiveCarePendingRequestPage extends StatefulWidget { + ImmediateLiveCarePendingRequestPage({super.key}); + + @override + State createState() => _ImmediateLiveCarePendingRequestPageState(); +} + +class _ImmediateLiveCarePendingRequestPageState extends State { + late ImmediateLiveCareViewModel immediateLiveCareViewModel; + + late AppState appState; + + static Duration countdownDuration = Duration(minutes: 1, seconds: 0); + ValueNotifier durationNotifier = ValueNotifier(countdownDuration); + Timer? timer; + + @override + void initState() { + super.initState(); + scheduleMicrotask(() { + countdownDuration = Duration(minutes: immediateLiveCareViewModel.patientLiveCareHistoryList[0].watingtimeInteger!, seconds: 0); + durationNotifier = ValueNotifier(countdownDuration); + startTimer(); + }); + } + + @override + void dispose() { + timer?.cancel(); + durationNotifier.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + immediateLiveCareViewModel = Provider.of(context, listen: false); + appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Consumer(builder: (context, immediateLiveCareVM, child) { + return Column( + children: [ + Expanded( + child: CollapsingListView( + title: "LiveCare Pending Request".needTranslation, + child: Padding( + padding: EdgeInsets.all(24.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + side: BorderSide(color: AppColors.ratingColorYellow, width: 3.h), + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Expected waiting time: ".toText16(isBold: true), + SizedBox(height: 8.h), + ValueListenableBuilder( + valueListenable: durationNotifier, + builder: (context, duration, child) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + buildTime(duration), + ], + ); + }, + ), + SizedBox(height: 8.h), + ], + ), + ), + ), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + side: BorderSide(color: AppColors.ratingColorYellow, width: 3.h), + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppCustomChipWidget( + labelText: immediateLiveCareViewModel.patientLiveCareHistoryList[0].stringCallStatus, + backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.20), + textColor: AppColors.alertColor, + ), + Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h), + // Lottie.asset(AppAnimations.pending_loading_animation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 80.h, height: 80.h, fit: BoxFit.cover), + ], + ), + SizedBox(height: 8.h), + "Hala ${appState.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true), + SizedBox(height: 8.h), + AppCustomChipWidget( + icon: AppAssets.appointment_calendar_icon, + labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(immediateLiveCareViewModel.patientLiveCareHistoryList[0].arrivalTime), false)), + SizedBox(height: 8.h), + "Your turn is after ${immediateLiveCareViewModel.patientLiveCareHistoryList[0].patCount} patients.".toText16(isBold: true), + SizedBox(height: 8.h), + ], + ), + ), + ) + ], + ), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: CustomButton( + text: "Call LiveCare Support".needTranslation, + onPressed: () async { + launchUrl(Uri.parse("tel://" + "011 525 9553")); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + icon: AppAssets.call_fill, + iconColor: AppColors.whiteColor, + iconSize: 21.h, + ).paddingSymmetrical(24.h, 24.h), + ), + ], + ); + }), + ); + } + + void startTimer() { + timer = Timer.periodic(const Duration(seconds: 1), (_) => addTime()); + setState(() {}); + } + + void addTime() { + final seconds = durationNotifier.value.inSeconds - 1; + if (seconds < 0) { + timer?.cancel(); + // Handle end of timer here + // showEndMessage(); + } else { + durationNotifier.value = Duration(seconds: seconds); + } + } + + Future _onWillPop() async { + timer?.cancel(); + Navigator.of(context).pop(); + return true; + } + + Widget buildTime(Duration duration) { + String twoDigits(int n) => n.toString().padLeft(2, '0'); + final hours = twoDigits(duration.inHours); + final minutes = twoDigits(duration.inMinutes.remainder(60)); + final seconds = twoDigits(duration.inSeconds.remainder(60)); + + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + buildTimeColumn(hours, "Hours".needTranslation), + buildTimeColumn(minutes, "Mins".needTranslation), + buildTimeColumn(seconds, "Secs".needTranslation, isLast: true), + ], + ); + } + + Widget buildTimeColumn(String time, String label, {bool isLast = false}) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + buildDigit(time[0]), + buildDigit(time[1]), + if (!isLast) buildTimeSeparator(), + ], + ), + buildLabel(label), + ], + ); + } + + Widget buildDigit(String digit) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + // margin: const EdgeInsets.symmetric(horizontal: 2), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: ClipRect( + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 600), + switchInCurve: Curves.easeOutExpo, + switchOutCurve: Curves.easeInExpo, + transitionBuilder: (Widget child, Animation animation) { + return Stack( + children: [ + SlideTransition( + position: Tween( + begin: const Offset(0, -1), + end: const Offset(0, 1), + ).animate(CurvedAnimation( + parent: animation, + curve: Curves.easeOutCubic, + )), + child: FadeTransition( + opacity: animation, + child: child, + ), + ), + SlideTransition( + position: Tween( + begin: const Offset(0, -1), + end: const Offset(0, 0), + ).animate(CurvedAnimation( + parent: animation, + curve: Curves.bounceIn, + )), + child: FadeTransition( + opacity: animation, + child: child, + ), + ), + ], + ); + }, + child: Text( + digit, + key: ValueKey(digit), + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 20.f, + ), + ), + ), + ), + ); + } + + Widget buildLabel(String label) { + return label.toText14(isBold: true); + } + + Widget buildTimeSeparator() { + return const Padding( + padding: EdgeInsets.symmetric(horizontal: 2.0), + child: Text( + ":", + style: TextStyle( + color: Colors.black, + fontSize: 20, + ), + ), + ); + } +} diff --git a/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart b/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart new file mode 100644 index 0000000..8181d25 --- /dev/null +++ b/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart @@ -0,0 +1,173 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_livecare_clinics_response_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/clinic_card.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/widgets/livecare_clinic_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class SelectImmediateLiveCareClinicPage extends StatefulWidget { + const SelectImmediateLiveCareClinicPage({super.key}); + + @override + State createState() => _SelectImmediateLiveCareClinicPageState(); +} + +class _SelectImmediateLiveCareClinicPageState extends State { + TextEditingController searchEditingController = TextEditingController(); + FocusNode textFocusNode = FocusNode(); + late AppState appState; + late ImmediateLiveCareViewModel immediateLiveCareViewModel; + + @override + void initState() { + scheduleMicrotask(() { + immediateLiveCareViewModel.getLiveCareImmediateClinicsList(); + immediateLiveCareViewModel.setLiveCareSelectedCallType(0); + }); + super.initState(); + } + + @override + void dispose() { + textFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + immediateLiveCareViewModel = Provider.of(context, listen: false); + appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: "Select LiveCare Clinic".needTranslation, + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(24.h), + child: Consumer(builder: (context, immediateLiveCareVM, child) { + return Column( + children: [ + // SizedBox(height: 16.h), + // TextInputWidget( + // labelText: LocaleKeys.search.tr(context: context), + // hintText: LocaleKeys.clinicName.tr(context: context), + // controller: searchEditingController, + // isEnable: true, + // prefix: null, + // autoFocus: false, + // isBorderAllowed: false, + // keyboardType: TextInputType.text, + // focusNode: textFocusNode, + // suffix: searchEditingController.text.isNotEmpty + // ? GestureDetector( + // onTap: () { + // searchEditingController.clear(); + // bookAppointmentsViewModel.filterClinics(""); + // textFocusNode.unfocus(); + // }, + // child: Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown), + // ) + // : null, + // onChange: (value) { + // bookAppointmentsViewModel.filterClinics(value!); + // }, + // padding: EdgeInsets.symmetric( + // vertical: ResponsiveExtension(10).h, + // horizontal: ResponsiveExtension(15).h, + // ), + // ), + ListView.separated( + padding: EdgeInsets.only(top: 16.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: immediateLiveCareVM.isImmediateLiveCareClinicsLoading ? 5 : immediateLiveCareVM.immediateLiveCareClinicsList.length, + itemBuilder: (context, index) { + return immediateLiveCareVM.isImmediateLiveCareClinicsLoading + ? ClinicCard( + bookAppointmentsVM: getIt.get(), + liveCareClinicsResponseModel: GetLiveCareClinicsResponseModel(), + clinicsListResponseModel: GetClinicsListResponseModel(), + isLoading: immediateLiveCareVM.isImmediateLiveCareClinicsLoading, + ) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: LiveCareClinicCard( + immediateLiveCareViewModel: immediateLiveCareVM, + liveCareClinicListResponseModel: immediateLiveCareVM.immediateLiveCareClinicsList[index], + isLoading: immediateLiveCareVM.isImmediateLiveCareClinicsLoading, + ).onPress(() { + onImmediateLiveCareClinicSelected(immediateLiveCareVM.immediateLiveCareClinicsList[index]); + }), + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + ], + ); + }), + ), + ), + ), + ); + } + + onImmediateLiveCareClinicSelected(GetLiveCareClinicListResponseModel liveCareClinic) { + //TODO: add implementation to show clinic schedule + if (liveCareClinic.isOnline == 1) { + showCommonBottomSheetWithoutHeight(context, child: SelectLiveCareCallType(immediateLiveCareViewModel: immediateLiveCareViewModel), callBackFunc: () async { + if (immediateLiveCareViewModel.liveCareSelectedCallType != 0) { + immediateLiveCareViewModel.setImmediateLiveCareSelectedClinic(liveCareClinic); + LoaderBottomSheet.showLoader(loadingText: "Fetching fees, Please wait...".needTranslation); + await immediateLiveCareViewModel.getLiveCareImmediateAppointmentFees(onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + Navigator.of(context).push( + CustomPageRoute( + page: ImmediateLiveCarePaymentDetails(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + }); + } + }, title: "Select LiveCare call type".needTranslation, isCloseButtonVisible: true, isFullScreen: false); + } else { + showCommonBottomSheetWithoutHeight(context, + child: Utils.getErrorWidget( + loadingText: "The selected clinic is only available between ${liveCareClinic.shiftTimings!.first.startTime} & ${liveCareClinic.shiftTimings!.first.endTime} hours.".needTranslation), + callBackFunc: () {}, + title: "", + isCloseButtonVisible: true, + isFullScreen: false); + } + } +} diff --git a/lib/presentation/book_appointment/livecare/widgets/livecare_clinic_card.dart b/lib/presentation/book_appointment/livecare/widgets/livecare_clinic_card.dart new file mode 100644 index 0000000..7385c6b --- /dev/null +++ b/lib/presentation/book_appointment/livecare/widgets/livecare_clinic_card.dart @@ -0,0 +1,67 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class LiveCareClinicCard extends StatelessWidget { + LiveCareClinicCard({super.key, required this.liveCareClinicListResponseModel, required this.isLoading, required this.immediateLiveCareViewModel}); + + GetLiveCareClinicListResponseModel liveCareClinicListResponseModel; + bool isLoading; + ImmediateLiveCareViewModel immediateLiveCareViewModel; + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + return Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Column( + children: [ + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Utils.buildSvgWithAssets(icon: AppAssets.generic_clinic_icon, width: 24.h, height: 24.h, fit: BoxFit.contain).toShimmer2(isShow: isLoading), + Column( + children: [ + Utils.buildSvgWithAssets( + icon: AppAssets.livecare_online_icon, + width: 16.h, + height: 16.h, + fit: BoxFit.contain, + iconColor: liveCareClinicListResponseModel.isOnline == 1 ? AppColors.successColor : AppColors.primaryRedColor) + .toShimmer2(isShow: isLoading), + SizedBox(height: 4.h), + liveCareClinicListResponseModel.isOnline == 1 + ? LocaleKeys.online.tr(context: context).toText10(isBold: true, color: AppColors.successColor).toShimmer2(isShow: isLoading) + : "Offline".toText10(isBold: true, color: AppColors.primaryRedColor).toShimmer2(isShow: isLoading), + ], + ), + ]), + SizedBox(height: 8.h), + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Expanded( + child: (isLoading ? "Cardiology" : (appState.isArabic() ? liveCareClinicListResponseModel.serviceNameN : liveCareClinicListResponseModel.serviceName))! + .toText16(isBold: true) + .toShimmer2(isShow: isLoading)), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon, width: 40.h, height: 40.h, fit: BoxFit.contain, iconColor: AppColors.textColor).toShimmer2(isShow: isLoading)), + ]), + ], + ), + ); + } +} diff --git a/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart b/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart new file mode 100644 index 0000000..226ac50 --- /dev/null +++ b/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart @@ -0,0 +1,66 @@ +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/widgets/medical_file_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class SelectLiveCareCallType extends StatelessWidget { + SelectLiveCareCallType({super.key, required this.immediateLiveCareViewModel}); + + ImmediateLiveCareViewModel immediateLiveCareViewModel; + + @override + Widget build(BuildContext context) { + //TODO: Replace with actual icons + return GridView( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 16, + mainAxisSpacing: 16, + mainAxisExtent: 130, + ), + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + shrinkWrap: true, + children: [ + MedicalFileCard( + label: "Video Call".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.eye_result_icon, + isLargeText: true, + iconSize: 36.h, + ).onPress(() { + Navigator.of(context).pop(); + immediateLiveCareViewModel.setLiveCareSelectedCallType(1); + }), + MedicalFileCard( + label: "Audio Call".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.allergy_info_icon, + isLargeText: true, + iconSize: 36.h, + ).onPress(() { + Navigator.of(context).pop(); + immediateLiveCareViewModel.setLiveCareSelectedCallType(2); + }), + MedicalFileCard( + label: "Phone Call".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.vaccine_info_icon, + isLargeText: true, + iconSize: 36.h, + ).onPress(() { + Navigator.of(context).pop(); + immediateLiveCareViewModel.setLiveCareSelectedCallType(3); + }), + ], + ); + } +} diff --git a/lib/presentation/book_appointment/review_appointment_page.dart b/lib/presentation/book_appointment/review_appointment_page.dart new file mode 100644 index 0000000..0cb4b2d --- /dev/null +++ b/lib/presentation/book_appointment/review_appointment_page.dart @@ -0,0 +1,254 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/loading_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class ReviewAppointmentPage extends StatefulWidget { + const ReviewAppointmentPage({super.key}); + + @override + State createState() => _ReviewAppointmentPageState(); +} + +class _ReviewAppointmentPageState extends State { + late AppState appState; + late BookAppointmentsViewModel bookAppointmentsViewModel; + late AuthenticationViewModel authVM; + late MyAppointmentsViewModel myAppointmentsViewModel; + + @override + Widget build(BuildContext context) { + bookAppointmentsViewModel = Provider.of(context, listen: false); + myAppointmentsViewModel = Provider.of(context, listen: false); + authVM = Provider.of(context, listen: false); + appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.scaffoldBgColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: LocaleKeys.reviewAppointment.tr(context: context), + child: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + LocaleKeys.docInfo.tr(context: context).toText16(isBold: true), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.network( + bookAppointmentsViewModel.selectedDoctor.doctorImageURL!, + width: 50.h, + height: 50.h, + fit: BoxFit.cover, + ).circle(100), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + SizedBox( + width: MediaQuery.of(context).size.width * 0.49, + child: + "${bookAppointmentsViewModel.selectedDoctor.doctorTitle} ${bookAppointmentsViewModel.selectedDoctor.name}".toString().toText16(isBold: true, maxlines: 1), + ), + Image.network( + bookAppointmentsViewModel.selectedDoctor.nationalityFlagURL!, + width: 20.h, + height: 15.h, + fit: BoxFit.cover, + ), + ], + ), + SizedBox(height: 2.h), + (bookAppointmentsViewModel.selectedDoctor.speciality!.isNotEmpty ? bookAppointmentsViewModel.selectedDoctor.speciality!.first : "") + .toString() + .toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor, maxLine: 1), + ], + ), + ], + ), + SizedBox(height: 12.h), + Wrap( + direction: Axis.horizontal, + spacing: 8.h, + runSpacing: 8.h, + children: [ + AppCustomChipWidget( + labelText: "${LocaleKeys.clinic.tr(context: context)}: ${bookAppointmentsViewModel.selectedDoctor.clinicName}".needTranslation, + ), + AppCustomChipWidget( + labelText: "${LocaleKeys.branch.tr(context: context)} ${bookAppointmentsViewModel.selectedDoctor.projectName}".needTranslation, + ), + AppCustomChipWidget( + labelText: "${LocaleKeys.date.tr(context: context)}: ${bookAppointmentsViewModel.selectedAppointmentDate}".needTranslation, + ), + AppCustomChipWidget( + labelText: "${LocaleKeys.time.tr(context: context)}: ${bookAppointmentsViewModel.selectedAppointmentTime}".needTranslation, + ), + ], + ), + ], + ), + ), + ), + SizedBox(height: 24.h), + LocaleKeys.patientInfo.tr(context: context).toText16(isBold: true), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Row( + children: [ + Image.asset( + appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, + width: 52.h, + height: 52.h, + ), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}".toText16(isBold: true), + SizedBox(height: 8.h), + AppCustomChipWidget(labelText: "${appState.getAuthenticatedUser()!.age} Years Old"), + ], + ), + ], + ), + ), + ), + SizedBox(height: 24.h), + "Hospital Information".needTranslation.toText16(isBold: true), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Row( + children: [ + bookAppointmentsViewModel.selectedDoctor.projectName!.toText16(isBold: true), + ], + ), + ), + ), + ], + ), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: CustomButton( + text: LocaleKeys.bookAppo.tr(context: context), + onPressed: () async { + initiateBookAppointment(); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + ).paddingSymmetrical(24.h, 24.h), + ), + ], + ), + ); + } + + void initiateBookAppointment() async { + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: false, loadingText: "Booking your appointment...".needTranslation); + myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); + + if (bookAppointmentsViewModel.isLiveCareSchedule) { + await bookAppointmentsViewModel.insertSpecificAppointmentForLiveCare(onError: (err) { + print(err.data["ErrorEndUserMessage"]); + LoadingUtils.hideFullScreenLoader(); + }, onSuccess: (apiResp) async { + LoadingUtils.hideFullScreenLoader(); + await Future.delayed(Duration(milliseconds: 50)).then((value) async { + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: true, loadingText: LocaleKeys.appointmentSuccess.tr()); + await Future.delayed(Duration(milliseconds: 4000)).then((value) { + LoadingUtils.hideFullScreenLoader(); + bookAppointmentsViewModel.setIsLiveCareSchedule(false); + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + }); + }); + }); + } else { + //TODO: Add patient Derma package check API Here + await bookAppointmentsViewModel.insertSpecificAppointment(onError: (err) { + print(err.data["ErrorEndUserMessage"]); + LoadingUtils.hideFullScreenLoader(); + }, onSuccess: (apiResp) async { + LoadingUtils.hideFullScreenLoader(); + await Future.delayed(Duration(milliseconds: 50)).then((value) async { + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: true, loadingText: LocaleKeys.appointmentSuccess.tr()); + await Future.delayed(Duration(milliseconds: 4000)).then((value) { + LoadingUtils.hideFullScreenLoader(); + bookAppointmentsViewModel.setIsLiveCareSchedule(false); + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + }); + }); + }); + } + } +} diff --git a/lib/presentation/book_appointment/search_doctor_by_name.dart b/lib/presentation/book_appointment/search_doctor_by_name.dart new file mode 100644 index 0000000..fabea2d --- /dev/null +++ b/lib/presentation/book_appointment/search_doctor_by_name.dart @@ -0,0 +1,272 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_filter/doctors_filter.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_profile_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/doctor_card.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:provider/provider.dart'; + +import '../../features/book_appointments/models/resp_models/doctors_list_response_model.dart'; + +class SearchDoctorByName extends StatefulWidget { + const SearchDoctorByName({super.key}); + + @override + State createState() => _SearchDoctorByNameState(); +} + +class _SearchDoctorByNameState extends State { + TextEditingController searchEditingController = TextEditingController(); + FocusNode textFocusNode = FocusNode(); + late BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + Widget build(BuildContext context) { + bookAppointmentsViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Choose Doctor".needTranslation, + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Column( + children: [ + SizedBox(height: 16.h), + Row( + spacing: 8.h, + children: [ + Expanded( + child: TextInputWidget( + labelText: LocaleKeys.search.tr(context: context), + hintText: LocaleKeys.doctorName.tr(context: context), + controller: searchEditingController, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + focusNode: textFocusNode, + suffix: searchEditingController.text.isNotEmpty + ? GestureDetector( + onTap: () { + searchEditingController.clear(); + // bookAppointmentsViewModel.filterClinics(""); + textFocusNode.unfocus(); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown), + ) + : null, + onChange: (value) { + // bookAppointmentsViewModel.filterClinics(value!); + }, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), + ), + ), + Visibility( + visible: context.watch().doctorsList.isNotEmpty, + child: SizedBox( + height: 56.h, + width: 56.h, + child: DecoratedBox(decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 10.h, + hasShadow: false, + ), + child: Utils.buildSvgWithAssets(icon: AppAssets.ic_filters, + height: 24.h, + width: 24.h, ).paddingAll(16.h).onPress((){ + context.read() + ..clearSelection() + ..clearSearchFilters() + ..getFiltersFromDoctorList( + bookAppointmentsViewModel.doctorsList + )..setSelections( + bookAppointmentsViewModel.selectedFacilityForFilters?.toList(), + bookAppointmentsViewModel.selectedRegionForFilters?.toList(), + bookAppointmentsViewModel.selectedClinicForFilters, + bookAppointmentsViewModel.selectedHospitalForFilters, + bookAppointmentsViewModel.applyFilters) ; + Navigator.of(context).push( + PageRouteBuilder( + pageBuilder: (context, animation, secondaryAnimation) => DoctorsFilters(), // Replace YourNewPage with your actual page widget + transitionsBuilder: (context, animation, secondaryAnimation, child) { + const begin = Offset(0.0, 1.0); // Start from the bottom (y=1.0) + const end = Offset.zero; // End at the original position (y=0.0) + final tween = Tween(begin: begin, end: end); + final offsetAnimation = animation.drive(tween); + + return SlideTransition( + position: offsetAnimation, + child: child, + ); + }, + transitionDuration: Duration(milliseconds: 200), // Adjust duration as needed + ), + ); + }), + ), + ), + ) + ], + ), + SizedBox(height: 16.h), + Consumer(builder: (context, bookAppointmentsVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + bookAppointmentsVM.isDoctorSearchByNameStarted + ? ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: bookAppointmentsVM.isDoctorsListLoading ? 5 : bookAppointmentsVM.filteredDoctorList.length, + itemBuilder: (context, index) { + return bookAppointmentsVM.isDoctorsListLoading + ? DoctorCard( + doctorsListResponseModel: DoctorsListResponseModel(), + isLoading: true, + bookAppointmentsViewModel: bookAppointmentsViewModel, + ) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: DoctorCard( + doctorsListResponseModel: bookAppointmentsVM.filteredDoctorList[index], + isLoading: false, + bookAppointmentsViewModel: bookAppointmentsViewModel, + ).onPress(() async { + bookAppointmentsVM.setSelectedDoctor(bookAppointmentsVM.filteredDoctorList[index]); + // bookAppointmentsVM.setSelectedDoctor(DoctorsListResponseModel()); + LoaderBottomSheet.showLoader(); + await bookAppointmentsVM.getDoctorProfile(onSuccess: (dynamic respData) { + LoaderBottomSheet.hideLoader(); + Navigator.of(context).push( + CustomPageRoute( + page: DoctorProfilePage(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }), + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ) + : SizedBox.shrink(), + SizedBox(height: 24.h), + ], + ); + }), + ], + ), + ), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: CustomButton( + text: LocaleKeys.search.tr(context: context), + onPressed: () async { + textFocusNode.unfocus(); + print("the value is empty ${searchEditingController.text.isNotEmpty}"); + if (searchEditingController.text.isNotEmpty) { + bookAppointmentsViewModel.updateApplyFilters(false); + bookAppointmentsViewModel.clearSelection(); + bookAppointmentsViewModel.updateList(); + bookAppointmentsViewModel.setIsDoctorSearchByNameStarted(true); + bookAppointmentsViewModel.setIsDoctorsListLoading(true); + // LoaderBottomSheet.showLoader(); + await bookAppointmentsViewModel.getDoctorsList( + doctorName: searchEditingController.text, + onSuccess: (dynamic respData) {}, + onError: (err) { + bookAppointmentsViewModel.setIsDoctorSearchByNameStarted(false); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Please enter doctor name to search"), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 10.r, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + icon: AppAssets.search_icon, + iconColor: AppColors.whiteColor, + iconSize: 20.h, + ).paddingSymmetrical(24.h, 24.h), + ), + ], + ), + ); + } + @override + void dispose() { + bookAppointmentsViewModel.doctorsList.clear(); + super.dispose(); + } +} diff --git a/lib/presentation/book_appointment/select_clinic_page.dart b/lib/presentation/book_appointment/select_clinic_page.dart new file mode 100644 index 0000000..d0bd740 --- /dev/null +++ b/lib/presentation/book_appointment/select_clinic_page.dart @@ -0,0 +1,482 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_livecare_clinics_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/dental_chief_complaints_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/laser/laser_appointment.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/select_doctor_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/select_livecare_clinic_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/clinic_card.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:provider/provider.dart'; + +class SelectClinicPage extends StatefulWidget { + bool isFromRegionFlow; + + SelectClinicPage({super.key, this.isFromRegionFlow = false}); + + @override + State createState() => _SelectClinicPageState(); +} + +class _SelectClinicPageState extends State { + TextEditingController searchEditingController = TextEditingController(); + FocusNode textFocusNode = FocusNode(); + late AppointmentViaRegionViewmodel regionalViewModel; + late AppState appState; + late BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + void initState() { + scheduleMicrotask(() { + bookAppointmentsViewModel.getClinics(); + }); + super.initState(); + } + + @override + void dispose() { + textFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + bookAppointmentsViewModel = Provider.of(context, listen: false); + regionalViewModel = Provider.of(context, listen: true); + appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: bookAppointmentsViewModel.isLiveCareSchedule ? "Select LiveCare Clinic".needTranslation : LocaleKeys.selectClinic.tr(context: context), + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Consumer(builder: (context, bookAppointmentsVM, child) { + return Column( + children: [ + SizedBox(height: 16.h), + TextInputWidget( + labelText: LocaleKeys.search.tr(context: context), + hintText: LocaleKeys.clinicName.tr(context: context), + controller: searchEditingController, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + focusNode: textFocusNode, + suffix: searchEditingController.text.isNotEmpty + ? GestureDetector( + onTap: () { + searchEditingController.clear(); + bookAppointmentsViewModel.filterClinics(""); + textFocusNode.unfocus(); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown), + ) + : null, + onChange: (value) { + bookAppointmentsViewModel.filterClinics(value!); + }, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), + ), + bookAppointmentsVM.isLiveCareSchedule + ? ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: bookAppointmentsVM.isClinicsListLoading ? 5 : bookAppointmentsVM.liveCareClinicsList.length, + itemBuilder: (context, index) { + return bookAppointmentsVM.isClinicsListLoading + ? ClinicCard( + bookAppointmentsVM: bookAppointmentsVM, + liveCareClinicsResponseModel: GetLiveCareClinicsResponseModel(), + clinicsListResponseModel: GetClinicsListResponseModel(), + isLoading: bookAppointmentsVM.isClinicsListLoading, + ) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: ClinicCard( + bookAppointmentsVM: bookAppointmentsVM, + liveCareClinicsResponseModel: bookAppointmentsVM.liveCareClinicsList[index], + clinicsListResponseModel: GetClinicsListResponseModel(), + isLoading: bookAppointmentsVM.isClinicsListLoading, + ).onPress(() { + onLiveCareClinicSelected(bookAppointmentsVM.liveCareClinicsList[index]); + }), + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ) + : ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: bookAppointmentsVM.isClinicsListLoading ? 5 : bookAppointmentsVM.filteredClinicsList.length, + itemBuilder: (context, index) { + return bookAppointmentsVM.isClinicsListLoading + ? ClinicCard( + bookAppointmentsVM: bookAppointmentsVM, + liveCareClinicsResponseModel: GetLiveCareClinicsResponseModel(), + clinicsListResponseModel: GetClinicsListResponseModel(), + isLoading: bookAppointmentsVM.isClinicsListLoading, + ) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: ClinicCard( + bookAppointmentsVM: bookAppointmentsVM, + liveCareClinicsResponseModel: GetLiveCareClinicsResponseModel(), + clinicsListResponseModel: bookAppointmentsVM.filteredClinicsList[index], + isLoading: bookAppointmentsVM.isClinicsListLoading, + ).onPress(() { + onClinicSelected(bookAppointmentsVM.filteredClinicsList[index]); + }), + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + ], + ); + }), + ), + ), + ), + ); + } + + void onLiveCareClinicSelected(GetLiveCareClinicsResponseModel clinic) { + bookAppointmentsViewModel.setLiveCareSelectedClinic(clinic); + bookAppointmentsViewModel.setIsDoctorsListLoading(true); + Navigator.of(context).push( + CustomPageRoute( + page: SelectDoctorPage(), + ), + ); + } + + void onClinicSelected(GetClinicsListResponseModel clinic) { + bookAppointmentsViewModel.setSelectedClinic(clinic); + bookAppointmentsViewModel.setIsDoctorsListLoading(true); + if (clinic.isLiveCareClinicAndOnline ?? false) { + Navigator.of(context).push( + CustomPageRoute( + page: SelectLivecareClinicPage(onNegativeClicked: (){ + handleDoctorScreen(clinic); + },), + ), + ); + } else { + handleDoctorScreen(clinic); + } + } + + //17 and 235 + void handleDoctorScreen(GetClinicsListResponseModel clinic) async { + if (widget.isFromRegionFlow) { + //Dental Clinic Flow + if (clinic.clinicID == 17) { + if (appState.isAuthenticated) { + initDentalAppointmentBookingFlow(int.parse(bookAppointmentsViewModel + .currentlySelectedHospitalFromRegionFlow ?? + "0")); + return; + } else { + bookAppointmentsViewModel.setIsChiefComplaintsListLoading(true); + Navigator.of(context).push( + CustomPageRoute( + page: DentalChiefComplaintsPage(), + ), + ); + return; + } + } + else if (clinic.clinicID == 253) { + bookAppointmentsViewModel.resetLaserData(); + bookAppointmentsViewModel.getLaserClinic(); + Navigator.push( + context, + CustomPageRoute( + page: LaserAppointment(), + ), + ); + return; + } else { + Navigator.push( + context, + CustomPageRoute( + page: SelectDoctorPage(), + ), + ); + } + } else { + var bottomSheetType = RegionBottomSheetType.FOR_CLINIIC; + if (clinic.clinicID == 17 || clinic.clinicID == 253) { + bottomSheetType = RegionBottomSheetType.REGION_FOR_DENTAL_AND_LASER; + } + openRegionListBottomSheet(context, bottomSheetType); + } + } + + void openRegionListBottomSheet( + BuildContext context, RegionBottomSheetType type) { + bookAppointmentsViewModel.setProjectID(null); + + regionalViewModel.flush(); + regionalViewModel.setBottomSheetType(type); + // AppointmentViaRegionViewmodel? viewmodel = null; + showCommonBottomSheetWithoutHeight(context, title: "", titleWidget: Consumer(builder: (_, data, __) => getTitle(data)), isDismissible: false, + child: Consumer(builder: (_, data, __) { + return getRegionalSelectionWidget(data); + }), callBackFunc: () { + }); + } + + Widget getRegionalSelectionWidget(AppointmentViaRegionViewmodel data) { + if (data.bottomSheetState == AppointmentViaRegionState.REGION_SELECTION) { + return RegionBottomSheetBody(); + } + if (data.bottomSheetState == AppointmentViaRegionState.TYPE_SELECTION) { + bookAppointmentsViewModel.resetFilterList(); + return FacilityTypeSelectionWidget( + selectedRegion: data.selectedRegionId ?? "", + ); + } + if (data.bottomSheetState == AppointmentViaRegionState.HOSPITAL_SELECTION) { + return HospitalBottomSheetBody(); + } + if (data.bottomSheetState == AppointmentViaRegionState.DOCTOR_SELECTION) { + //if the region screen is opened for the dental clinic then the project id will be in the hospital list as the list is formed form the get project api + var id = ""; + if (data.regionBottomSheetType == RegionBottomSheetType.REGION_FOR_DENTAL_AND_LASER) { + id = regionalViewModel.selectedHospital?.hospitalList.first.iD?.toString() ?? ""; + } else { + id = regionalViewModel.selectedHospital?.patientDoctorAppointmentList?.first.projectID?.toString() ?? ""; + } + if (bookAppointmentsViewModel.selectedClinic.clinicID == 17) { + if (appState.isAuthenticated) { + initDentalAppointment(); + return SizedBox.shrink(); + }else { + bookAppointmentsViewModel.setIsChiefComplaintsListLoading(true); + } + } + + if (bookAppointmentsViewModel.selectedClinic.clinicID == 253) { + { + bookAppointmentsViewModel.resetLaserData(); + bookAppointmentsViewModel.getLaserClinic(); + } + } + bookAppointmentsViewModel.setProjectID(id); + return SizedBox.shrink(); + } + else { + return SizedBox.shrink(); + } + return SizedBox.shrink(); + } + + getTitle(AppointmentViaRegionViewmodel data) { + if (data.selectedRegionId == null) { + return LocaleKeys.selectRegion.tr().toText20(weight: FontWeight.w600); + } else { + return Transform.flip( + flipX: data.isArabic ? true : false, + child: Utils.buildSvgWithAssets( + icon: AppAssets.arrow_back, + iconColor: Color(0xff2B353E), + fit: BoxFit.contain, + ), + ).onPress(() { + data.handleBackPress(); + }); + } + } + + void initDentalAppointmentBookingFlow(int projectID) async { + bookAppointmentsViewModel.setProjectID(projectID.toString()); + LoaderBottomSheet.showLoader(loadingText: "Checking for an existing dental plan, Please wait...".needTranslation); + await bookAppointmentsViewModel.getPatientDentalEstimation(projectID: projectID).then((value) { + LoaderBottomSheet.hideLoader(); + if (bookAppointmentsViewModel.patientDentalPlanEstimationList.isNotEmpty) { + showCommonBottomSheetWithoutHeight( + // title: LocaleKeys.notice.tr(context: context), + title: "Dental treatment plan".needTranslation, + context, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "You have an existing treatment plan: ".needTranslation.toText14(weight: FontWeight.w500), + SizedBox(height: 8.h), + Container( + width: double.infinity, + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListView.separated( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: bookAppointmentsViewModel.patientDentalPlanEstimationList.length, + separatorBuilder: (_, __) { + return Column( + children: [ + SizedBox(height: 8.h), + Divider(height: 1, color: AppColors.greyColor), + SizedBox(height: 8.h), + ], + ); + }, + itemBuilder: (context, index) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + bookAppointmentsViewModel.patientDentalPlanEstimationList[index].procedureName!.toText12(isBold: true), + AppCustomChipWidget(icon: AppAssets.appointment_time_icon, labelText: "${bookAppointmentsViewModel.totalTimeNeededForDentalProcedure} Mins".needTranslation), + ], + ); + }, + ), + SizedBox( + height: 16.h, + ), + Divider(height: 1, color: AppColors.greyColor), + SizedBox( + height: 8.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Total time required".needTranslation.toText14(isBold: true), + AppCustomChipWidget(icon: AppAssets.appointment_time_icon, labelText: "30 Mins".needTranslation), + ], + ) + ], + ), + ), + SizedBox(height: 16.h), + "Would you like to continue it?".needTranslation.toText14(weight: FontWeight.w500), + SizedBox(height: 16.h), + Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: () { + bookAppointmentsViewModel.setIsContinueDentalPlan(false); + bookAppointmentsViewModel.setIsChiefComplaintsListLoading(true); + Navigator.of(context).pop(); + Navigator.of(context).push( + CustomPageRoute( + page: DentalChiefComplaintsPage(), + ), + ); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + icon: AppAssets.cancel, + iconColor: AppColors.whiteColor, + ), + ), + SizedBox(width: 8.h), + Expanded( + child: CustomButton( + text: LocaleKeys.confirm.tr(), + onPressed: () async { + bookAppointmentsViewModel.setIsContinueDentalPlan(true); + Navigator.of(context).pop(); + Navigator.of(context).push( + CustomPageRoute( + page: SelectDoctorPage(), + ), + ); + }, + backgroundColor: AppColors.bgGreenColor, + borderColor: AppColors.bgGreenColor, + textColor: Colors.white, + icon: AppAssets.confirm, + ), + ), + ], + ) + ], + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } else { + bookAppointmentsViewModel.setIsChiefComplaintsListLoading(true); + Navigator.of(context).push( + CustomPageRoute( + page: DentalChiefComplaintsPage(), + ), + ); + } + }); + } + + void initDentalAppointment() async { + await Future.delayed(Duration(milliseconds: 300)); + initDentalAppointmentBookingFlow(int.parse(bookAppointmentsViewModel + .currentlySelectedHospitalFromRegionFlow ?? + "0")); + return; + } +} diff --git a/lib/presentation/book_appointment/select_doctor_page.dart b/lib/presentation/book_appointment/select_doctor_page.dart new file mode 100644 index 0000000..46c3774 --- /dev/null +++ b/lib/presentation/book_appointment/select_doctor_page.dart @@ -0,0 +1,191 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_profile_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/doctor_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class SelectDoctorPage extends StatefulWidget { + SelectDoctorPage({super.key}); + + @override + State createState() => _SelectDoctorPageState(); +} + +class _SelectDoctorPageState extends State { + TextEditingController searchEditingController = TextEditingController(); + + FocusNode textFocusNode = FocusNode(); + + late AppState appState; + late BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + void initState() { + scheduleMicrotask(() { + if (bookAppointmentsViewModel.isLiveCareSchedule) { + bookAppointmentsViewModel.getLiveCareDoctorsList(); + } else { + if (bookAppointmentsViewModel.selectedClinic.clinicID == 17) { + bookAppointmentsViewModel.getDentalChiefComplaintDoctorsList(); + } else { + bookAppointmentsViewModel.getDoctorsList(); + } + } + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + bookAppointmentsViewModel = Provider.of(context, listen: false); + appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: "Choose Doctor".needTranslation, + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Consumer(builder: (context, bookAppointmentsVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + Row( + spacing: 8.h, + children: [ + Expanded( + child: TextInputWidget( + labelText: LocaleKeys.search.tr(context: context), + hintText: LocaleKeys.doctorName.tr(context: context), + controller: searchEditingController, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + focusNode: textFocusNode, + suffix: searchEditingController.text.isNotEmpty + ? GestureDetector( + onTap: () { + searchEditingController.clear(); + bookAppointmentsViewModel.filterClinics(""); + textFocusNode.unfocus(); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown), + ) + : null, + onChange: (value) { + bookAppointmentsViewModel.filterClinics(value!); + }, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), + ), + ), + ], + ), + ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: bookAppointmentsVM.isDoctorsListLoading + ? 5 + : (bookAppointmentsVM.isLiveCareSchedule + ? (bookAppointmentsVM.liveCareDoctorsList.isNotEmpty ? bookAppointmentsVM.liveCareDoctorsList.length : 1) + : (bookAppointmentsVM.doctorsList.isNotEmpty ? bookAppointmentsVM.doctorsList.length : 1)), + itemBuilder: (context, index) { + return bookAppointmentsVM.isDoctorsListLoading + ? DoctorCard( + doctorsListResponseModel: DoctorsListResponseModel(), + isLoading: true, + bookAppointmentsViewModel: bookAppointmentsViewModel, + ) + : checkIsDoctorsListEmpty() + ? Utils.getNoDataWidget(context, noDataText: "No Doctor found for selected criteria...".needTranslation) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: + RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: DoctorCard( + doctorsListResponseModel: bookAppointmentsVM.isLiveCareSchedule + ? bookAppointmentsVM.liveCareDoctorsList[index] + : bookAppointmentsVM.doctorsList[index], + isLoading: false, + bookAppointmentsViewModel: bookAppointmentsViewModel, + ).onPress(() async { + bookAppointmentsVM.setSelectedDoctor(bookAppointmentsVM.isLiveCareSchedule + ? bookAppointmentsVM.liveCareDoctorsList[index] + : bookAppointmentsVM.doctorsList[index]); + // bookAppointmentsVM.setSelectedDoctor(DoctorsListResponseModel()); + LoaderBottomSheet.showLoader(); + await bookAppointmentsVM.getDoctorProfile(onSuccess: (dynamic respData) { + LoaderBottomSheet.hideLoader(); + Navigator.of(context).push( + CustomPageRoute( + page: DoctorProfilePage(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }), + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + SizedBox(height: 24.h), + ], + ); + }), + ), + ), + ), + ); + } + + bool checkIsDoctorsListEmpty() { + if (bookAppointmentsViewModel.isLiveCareSchedule) { + return bookAppointmentsViewModel.liveCareDoctorsList.isEmpty; + } else { + return bookAppointmentsViewModel.doctorsList.isEmpty; + } + } +} diff --git a/lib/presentation/book_appointment/select_livecare_clinic_page.dart b/lib/presentation/book_appointment/select_livecare_clinic_page.dart new file mode 100644 index 0000000..719452d --- /dev/null +++ b/lib/presentation/book_appointment/select_livecare_clinic_page.dart @@ -0,0 +1,142 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +class SelectLivecareClinicPage extends StatelessWidget { + + final VoidCallback? onNegativeClicked; + const SelectLivecareClinicPage({super.key, this.onNegativeClicked}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: LocaleKeys.livecare.tr(context: context), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + LocaleKeys.livecareModalTop.tr(context: context).toText18(isBold: true), + SizedBox(height: 40.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.immediate_service_icon, width: 58.h, height: 58.h), + SizedBox(width: 18.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Immediate service".needTranslation.toText18(color: AppColors.textColor, isBold: true), + "No need to wait, you will get medical consultation immediately via video call".needTranslation.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ), + ], + ), + SizedBox(height: 24.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.no_visit_icon, width: 58.h, height: 58.h), + SizedBox(width: 18.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "No visit required".needTranslation.toText18(color: AppColors.textColor, isBold: true), + LocaleKeys.livecarePoint5.tr(context: context).toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ), + ], + ), + SizedBox(height: 24.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.doctor_contact_icon, width: 58.h, height: 58.h), + SizedBox(width: 18.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Doctor will contact".needTranslation.toText18(color: AppColors.textColor, isBold: true), + "A specialised doctor will contact you and will be able to view your medical history".needTranslation.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ), + ], + ), + SizedBox(height: 24.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.free_med_delivery_icon, width: 58.h, height: 58.h), + SizedBox(width: 18.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Free medicine delivery".needTranslation.toText18(color: AppColors.textColor, isBold: true), + "Offers free medicine delivery for the LiveCare appointment".needTranslation.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ), + ], + ), + ], + ).paddingSymmetrical(24.h, 0.h), + ), + ), + ), + Column( + children: [ + CustomButton( + text: "Yes please, I am in a hurry".needTranslation, + onPressed: () {}, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 10.r, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + icon: AppAssets.livecare_book_icon, + iconColor: AppColors.whiteColor, + iconSize: 18.h, + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 16.h), + CustomButton( + text: "No, Thanks. I would like a physical visit".needTranslation, + onPressed: () { + Navigator.of(context).pop(); + onNegativeClicked?.call(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 10.r, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 24.h), + ], + ), + ], + ), + ); + } +} diff --git a/lib/presentation/book_appointment/widgets/appointment_calendar.dart b/lib/presentation/book_appointment/widgets/appointment_calendar.dart new file mode 100644 index 0000000..d695ea6 --- /dev/null +++ b/lib/presentation/book_appointment/widgets/appointment_calendar.dart @@ -0,0 +1,391 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/timeslots.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/review_appointment_page.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:lottie/lottie.dart'; +import 'package:provider/provider.dart'; +import 'package:smooth_corner/smooth_corner.dart'; +import 'package:syncfusion_flutter_calendar/calendar.dart'; + +class AppointmentCalendar extends StatefulWidget { + const AppointmentCalendar({super.key}); + + @override + State createState() => _AppointmentCalendarState(); +} + +class _AppointmentCalendarState extends State { + late CalendarController _calendarController; + + late AppState appState; + late BookAppointmentsViewModel bookAppointmentsViewModel; + late AuthenticationViewModel authVM; + + var selectedDate = ""; + var selectedDateDisplay = ""; + var selectedNextDate = ""; + + int selectedButtonIndex = 0; + int selectedNextDayButtonIndex = -1; + + List dayEvents = []; + List nextDayEvents = []; + + late Map _events; + + String selectedTime = ""; + + bool isWaitingAppointmentAvailable = false; + final _selectedDay = DateTime.now(); + + @override + void initState() { + _calendarController = CalendarController(); + scheduleMicrotask(() { + _events = { + _selectedDay: ['Event A0'] + }; + _onDaySelected(DateUtil.convertStringToDate(bookAppointmentsViewModel.freeSlotsResponse[0])); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + bookAppointmentsViewModel = Provider.of(context, listen: false); + authVM = Provider.of(context, listen: false); + appState = getIt.get(); + return Padding( + padding: EdgeInsets.symmetric(horizontal: 0.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // SizedBox(height: 24.h), + // Row( + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // "Pick a Date".toText20(weight: FontWeight.w600).expanded, + // Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, iconColor: Color(0xff2B353E)).onPress(() { + // Navigator.of(context).pop(); + // }), + // ], + // ), + SizedBox( + height: 350.h, + child: SfCalendar( + controller: _calendarController, + minDate: DateTime.now(), + showNavigationArrow: true, + headerHeight: 60.h, + headerStyle: CalendarHeaderStyle( + backgroundColor: AppColors.scaffoldBgColor, + textAlign: TextAlign.start, + textStyle: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: AppColors.primaryRedColor, fontFamily: "Poppins"), + ), + viewHeaderStyle: ViewHeaderStyle( + backgroundColor: AppColors.scaffoldBgColor, + dayTextStyle: TextStyle(fontSize: 14.f, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: AppColors.textColor), + ), + view: CalendarView.month, + todayHighlightColor: Colors.transparent, + todayTextStyle: TextStyle(color: AppColors.textColor, fontWeight: FontWeight.bold), + selectionDecoration: ShapeDecoration( + color: AppColors.transparent, + shape: SmoothRectangleBorder( + borderRadius: BorderRadius.circular(10.r), + smoothness: 1, + side: BorderSide(color: AppColors.primaryRedColor, width: 1.5), + ), + ), + cellBorderColor: AppColors.transparent, + dataSource: MeetingDataSource(_getDataSource()), + monthCellBuilder: (context, details) => Padding( + padding: EdgeInsets.all(12.h), + child: details.date.day.toString().toText14( + isCenter: true, + color: details.date == _calendarController.selectedDate ? AppColors.primaryRedColor : AppColors.textColor, + ), + ), + monthViewSettings: MonthViewSettings( + dayFormat: "EEE", + appointmentDisplayMode: MonthAppointmentDisplayMode.indicator, + showTrailingAndLeadingDates: false, + appointmentDisplayCount: 1, + monthCellStyle: MonthCellStyle( + textStyle: TextStyle(fontSize: 19.f), + ), + ), + onTap: (CalendarTapDetails details) { + _calendarController.selectedDate = details.date; + _onDaySelected(details.date!); + }, + ), + ), + Transform.translate( + offset: const Offset(0.0, -20.0), + child: selectedDateDisplay.toText16(weight: FontWeight.w500), + ), + //TODO: Add Next Day Span here + SizedBox( + height: 100.h, + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Wrap( + direction: Axis.horizontal, + alignment: WrapAlignment.start, + spacing: 6.h, + runSpacing: 6.h, + children: List.generate( + dayEvents.length, // Generate a large number of items to ensure scrolling + (index) => TimeSlotChip( + label: dayEvents[index].isoTime!, + isSelected: index == selectedButtonIndex, + onTap: () { + setState(() { + selectedButtonIndex = index; + selectedTime = dayEvents[index].isoTime!; + }); + }, + ), + ), + ), + ), + ), + SizedBox(height: 16.h), + CustomButton( + text: "Select".needTranslation, + onPressed: () async { + if (appState.isAuthenticated) { + bookAppointmentsViewModel.setSelectedAppointmentDateTime(selectedDate, selectedTime); + Navigator.of(context).pop(); + Navigator.of(context).push( + CustomPageRoute( + page: ReviewAppointmentPage(), + ), + ); + } else { + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.notice.tr(context: context), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Lottie.asset(AppAnimations.errorAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), + SizedBox(height: 8.h), + (LocaleKeys.loginToUseService.tr()).toText16(color: AppColors.blackColor), + SizedBox(height: 16.h), + Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: () { + Navigator.of(context).pop(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + icon: AppAssets.cancel, + iconColor: AppColors.primaryRedColor, + ), + ), + SizedBox(width: 8.h), + Expanded( + child: CustomButton( + text: LocaleKeys.confirm.tr(), + onPressed: () async { + Navigator.of(context).pop(); + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + await authVM.onLoginPressed(); + // Navigator.of(context).push( + // FadePage(page: MyAppointmentsPage()), + // ); + }, + backgroundColor: AppColors.bgGreenColor, + borderColor: AppColors.bgGreenColor, + textColor: Colors.white, + icon: AppAssets.confirm, + ), + ), + ], + ), + SizedBox(height: 16.h), + ], + ).center, + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 10.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 50.h, + ), + ], + ), + ); + } + + List _getDataSource() { + final List meetings = []; + for (var slot in bookAppointmentsViewModel.freeSlotsResponse) { + final startTime = DateUtil.convertStringToDate(slot); + + final endTime = startTime.add(const Duration(minutes: 15)); + + meetings.add(Meeting( + "Available", // Or leave empty with "" + startTime, + endTime, + AppColors.primaryRedColor, + false, + "" // Optional notes + )); + } + return meetings; + } + + // TODO: + openTimeSlotsPickerForDate(DateTime dateStart, List freeSlots) { + dayEvents.clear(); + DateTime dateStartObj = new DateTime(dateStart.year, dateStart.month, dateStart.day, 0, 0, 0, 0, 0); + if (isWaitingAppointmentAvailable && DateUtils.isSameDay(dateStart, DateTime.now())) { + dayEvents.add(TimeSlot(isoTime: "Waiting Appointment", start: DateTime.now(), end: DateTime.now(), vidaDate: "")); + } + freeSlots.forEach((v) { + if (v.start == dateStartObj) dayEvents.add(v); + }); + selectedButtonIndex = 0; + List> timeList = []; + for (var i = 0; i < dayEvents.length; i++) { + Map timeSlot = {"isoTime": dayEvents[i].isoTime, "start": dayEvents[i].start.toString(), "end": dayEvents[i].end.toString(), "vidaDate": dayEvents[i].vidaDate}; + timeList.add(timeSlot); + } + selectedTime = dayEvents[selectedButtonIndex].isoTime!; + } + + void _onDaySelected(DateTime day) { + final DateFormat formatter = DateFormat('yyyy-MM-dd'); + setState(() { + selectedDateDisplay = DateUtil.getMonthDayYearDateFormatted(day); + selectedNextDate = DateUtil.getWeekDayMonthDayYearDateFormatted(day.add(Duration(days: 1)), "en"); + _calendarController.selectedDate = day; + openTimeSlotsPickerForDate(day, bookAppointmentsViewModel.docFreeSlots); + selectedDate = formatter.format(day); + selectedNextDayButtonIndex = -1; + print(_calendarController.selectedDate); + }); + } +} + +class TimeSlotChip extends StatelessWidget { + final String label; + final bool isSelected; + final VoidCallback? onTap; + + const TimeSlotChip({super.key, required this.label, this.isSelected = false, this.onTap}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 14.h, vertical: 8.h), + decoration: ShapeDecoration( + color: AppColors.whiteColor, + shape: SmoothRectangleBorder( + borderRadius: BorderRadius.circular(8.h), + smoothness: 1, + side: BorderSide(color: isSelected ? AppColors.primaryRedColor : AppColors.borderOnlyColor.withOpacity(0.2), width: 1), + ), + ), + child: label.toText12( + color: isSelected ? AppColors.primaryRedColor : Colors.black87, + fontWeight: FontWeight.w500, + ), + ), + ); + } +} + +class MeetingDataSource extends CalendarDataSource { + MeetingDataSource(List source) { + appointments = source; + } + + @override + DateTime getStartTime(int index) { + return _getMeetingData(index)!.from; + } + + @override + DateTime getEndTime(int index) { + return _getMeetingData(index)!.to; + } + + @override + String getSubject(int index) { + return _getMeetingData(index)!.eventName; + } + + @override + Color getColor(int index) { + return _getMeetingData(index)!.background; + } + + @override + bool isAllDay(int index) { + return _getMeetingData(index)!.isAllDay; + } + + Meeting? _getMeetingData(int index) { + final dynamic meeting = appointments?[index]; + Meeting? meetingData; + if (meeting is Meeting) { + meetingData = meeting; + } + return meetingData; + } +} + +class Meeting { + Meeting(this.eventName, this.from, this.to, this.background, this.isAllDay, this.notes); + + String eventName; + DateTime from; + DateTime to; + Color background; + bool isAllDay; + String notes; +} diff --git a/lib/presentation/book_appointment/widgets/chief_complaint_card.dart b/lib/presentation/book_appointment/widgets/chief_complaint_card.dart new file mode 100644 index 0000000..e80596c --- /dev/null +++ b/lib/presentation/book_appointment/widgets/chief_complaint_card.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/dental_chief_complaints_response_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class ChiefComplaintCard extends StatelessWidget { + ChiefComplaintCard({super.key, required this.isLoading, required this.bookAppointmentsVM, required this.dentalChiefComplaintsListResponseModel}); + + bool isLoading; + BookAppointmentsViewModel bookAppointmentsVM; + DentalChiefComplaintsListResponseModel dentalChiefComplaintsListResponseModel; + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + return Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Expanded(child: (isLoading ? "Cardiology" : dentalChiefComplaintsListResponseModel.name)!.toText16(isBold: true).toShimmer2(isShow: isLoading)), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon, width: 40.h, height: 40.h, fit: BoxFit.contain, iconColor: AppColors.textColor).toShimmer2(isShow: isLoading)), + ]), + ); + } +} diff --git a/lib/presentation/book_appointment/widgets/clinic_card.dart b/lib/presentation/book_appointment/widgets/clinic_card.dart new file mode 100644 index 0000000..cab3b1a --- /dev/null +++ b/lib/presentation/book_appointment/widgets/clinic_card.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_livecare_clinics_response_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class ClinicCard extends StatelessWidget { + ClinicCard({super.key, required this.clinicsListResponseModel, required this.liveCareClinicsResponseModel, required this.isLoading, required this.bookAppointmentsVM}); + + GetClinicsListResponseModel clinicsListResponseModel; + GetLiveCareClinicsResponseModel liveCareClinicsResponseModel; + bool isLoading; + BookAppointmentsViewModel bookAppointmentsVM; + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + return Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Column( + children: [ + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Utils.buildSvgWithAssets(icon: AppAssets.generic_clinic_icon, width: 24.h, height: 24.h, fit: BoxFit.contain).toShimmer2(isShow: isLoading), + (clinicsListResponseModel.isLiveCareClinicAndOnline ?? true) + ? Utils.buildSvgWithAssets(icon: AppAssets.livecare_clinic_icon, width: 32.h, height: 32.h, fit: BoxFit.contain).toShimmer2(isShow: isLoading) + : SizedBox.shrink(), + ], + ), + SizedBox(height: 16.h), + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Expanded( + child: (isLoading ? "Cardiology" : (bookAppointmentsVM.isLiveCareSchedule ? liveCareClinicsResponseModel.clinicDesc! : clinicsListResponseModel.clinicDescription!)) + .toText16(isBold: true) + .toShimmer2(isShow: isLoading)), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon, width: 40.h, height: 40.h, fit: BoxFit.contain, iconColor: AppColors.textColor).toShimmer2(isShow: isLoading)), + ]), + ], + ), + ); + } +} diff --git a/lib/presentation/book_appointment/widgets/doctor_card.dart b/lib/presentation/book_appointment/widgets/doctor_card.dart new file mode 100644 index 0000000..dd9d6df --- /dev/null +++ b/lib/presentation/book_appointment/widgets/doctor_card.dart @@ -0,0 +1,176 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; + +class DoctorCard extends StatelessWidget { + DoctorCard({super.key, required this.doctorsListResponseModel, required this.isLoading, required this.bookAppointmentsViewModel}); + + DoctorsListResponseModel doctorsListResponseModel; + bool isLoading = false; + BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + Widget build(BuildContext context) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.network( + isLoading + ? "https://hmgwebservices.com/Images/MobileImages/OALAY/1439.png" + : doctorsListResponseModel.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/OALAY/1439.png", + width: 63.h, + height: 63.h, + fit: BoxFit.fill, + ).circle(100).toShimmer2(isShow: isLoading), + SizedBox(width: 8.h), + Expanded( + flex: 9, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + SizedBox( + width: MediaQuery.of(context).size.width * 0.49, + child: (isLoading ? "Dr John Smith" : "${doctorsListResponseModel.doctorTitle} ${doctorsListResponseModel.name}").toString().toText16(isBold: true, maxlines: 1), + ).toShimmer2(isShow: isLoading), + Image.network( + isLoading ? "https://hmgwebservices.com/Images/flag/SYR.png" : doctorsListResponseModel.nationalityFlagURL ?? "https://hmgwebservices.com/Images/flag/SYR.png", + width: 20.h, + height: 15.h, + fit: BoxFit.fill, + ).toShimmer2(isShow: isLoading), + ], + ), + SizedBox(height: 2.h), + (isLoading + ? "Consultant Cardiologist" + : doctorsListResponseModel.speciality!.isNotEmpty + ? doctorsListResponseModel.speciality!.first + : "") + .toString() + .toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor, maxLine: 1) + .toShimmer2(isShow: isLoading), + ], + ), + ), + Expanded( + flex: 1, + child: Utils.buildSvgWithAssets(icon: AppAssets.doctor_profile_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown).toShimmer2(isShow: isLoading), + ), + ], + ), + SizedBox(height: 12.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + labelText: "Clinic: ${isLoading ? "Cardiologist" : doctorsListResponseModel.clinicName}".needTranslation, + ).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + labelText: "Branch: ${isLoading ? "Olaya Hospital" : doctorsListResponseModel.projectName}".needTranslation, + ).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + icon: AppAssets.rating_icon, + iconColor: AppColors.ratingColorYellow, + labelText: "Rating: ${isLoading ? 4.78 : doctorsListResponseModel.decimalDoctorRate}".needTranslation, + ).toShimmer2(isShow: isLoading), + ], + ), + SizedBox(height: 12.h), + CustomButton( + text: LocaleKeys.bookAppo.tr(context: context), + onPressed: () async { + bookAppointmentsViewModel.setSelectedDoctor(doctorsListResponseModel); + LoaderBottomSheet.showLoader(); + bookAppointmentsViewModel.isLiveCareSchedule + ? await bookAppointmentsViewModel.getLiveCareDoctorFreeSlots( + isBookingForLiveCare: true, + onSuccess: (dynamic respData) async { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + title: "Pick a Date".needTranslation, + context, + child: AppointmentCalendar(), + isFullScreen: false, + isCloseButtonVisible: true, + callBackFunc: () {}, + ); + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }) + : await bookAppointmentsViewModel.getDoctorFreeSlots( + isBookingForLiveCare: false, + onSuccess: (dynamic respData) async { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + title: "Pick a Date".needTranslation, + context, + child: AppointmentCalendar(), + isFullScreen: false, + isCloseButtonVisible: true, + callBackFunc: () {}, + ); + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Color(0xffED1C2B), + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 10.r, + padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0), + height: 40.h, + icon: AppAssets.add_icon, + iconColor: AppColors.primaryRedColor, + iconSize: 15.h, + ).toShimmer2(isShow: isLoading), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/contact_us/contact_us.dart b/lib/presentation/contact_us/contact_us.dart new file mode 100644 index 0000000..6890fb4 --- /dev/null +++ b/lib/presentation/contact_us/contact_us.dart @@ -0,0 +1,114 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/contact_us/contact_us_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/contact_us/find_us_page.dart'; +import 'package:hmg_patient_app_new/presentation/contact_us/live_chat_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class ContactUs extends StatelessWidget { + ContactUs({super.key}); + + late AppState appState; + late ContactUsViewModel contactUsViewModel; + late LocationUtils locationUtils; + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + locationUtils = getIt.get(); + locationUtils.isShowConfirmDialog = true; + contactUsViewModel = Provider.of(context); + return Column( + children: [ + checkInOptionCard( + AppAssets.checkin_location_icon, + LocaleKeys.findUs.tr(), + "View your nearest HMG locations".needTranslation, + ).onPress(() { + locationUtils.getCurrentLocation(onSuccess: (value) { + contactUsViewModel.initContactUsViewModel(); + Navigator.pop(context); + Navigator.of(context).push( + CustomPageRoute( + page: FindUsPage(), + ), + ); + }); + }), + SizedBox(height: 16.h), + checkInOptionCard( + AppAssets.checkin_location_icon, + LocaleKeys.feedback.tr(), + "Provide your feedback on our services".needTranslation, + ), + SizedBox(height: 16.h), + checkInOptionCard( + AppAssets.checkin_location_icon, + LocaleKeys.liveChat.tr(), + "Live chat option with HMG".needTranslation, + ).onPress(() { + locationUtils.getCurrentLocation(onSuccess: (value) { + Navigator.pop(context); + Navigator.of(context).push( + CustomPageRoute( + page: LiveChatPage(), + ), + ); + }); + }), + ], + ); + } + + Widget checkInOptionCard(String icon, String title, String subTitle) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: icon, width: 40.h, height: 40.h, fit: BoxFit.fill), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title.toText16(isBold: true, color: AppColors.textColor), + subTitle.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ), + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ), + ), + ], + ), + ], + ).paddingAll(16.h), + ); + } +} diff --git a/lib/presentation/contact_us/find_us_page.dart b/lib/presentation/contact_us/find_us_page.dart new file mode 100644 index 0000000..a4e4258 --- /dev/null +++ b/lib/presentation/contact_us/find_us_page.dart @@ -0,0 +1,165 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/contact_us/contact_us_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/contact_us/widgets/find_us_item_card.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/widgets/patient_sick_leave_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; +import 'package:provider/provider.dart'; + +class FindUsPage extends StatelessWidget { + FindUsPage({super.key}); + + late AppState appState; + late ContactUsViewModel contactUsViewModel; + + @override + Widget build(BuildContext context) { + contactUsViewModel = Provider.of(context); + appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: LocaleKeys.location.tr(), + child: Consumer(builder: (context, contactUsVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + contactUsVM.isHMGLocationsListLoading + ? SizedBox.shrink() + : CustomTabBar( + activeTextColor: AppColors.primaryRedColor, + activeBackgroundColor: AppColors.primaryRedColor.withValues(alpha: .1), + tabs: [ + CustomTabBarModel(null, LocaleKeys.hmgHospitals.tr()), + CustomTabBarModel(null, LocaleKeys.pharmaciesList.tr()), + ], + onTabChange: (index) { + contactUsVM.setHMGHospitalsListSelected(index == 0); + }, + ).paddingSymmetrical(24.h, 0.h), + ListView.separated( + padding: EdgeInsets.only(top: 16.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: contactUsVM.isHMGLocationsListLoading + ? 5 + : contactUsVM.isHMGHospitalsListSelected + ? contactUsVM.hmgHospitalsLocationsList.length + : contactUsVM.hmgPharmacyLocationsList.length, + itemBuilder: (context, index) { + return contactUsVM.isHMGLocationsListLoading + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", + width: 63.h, + height: 63.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: true), + SizedBox(width: 16.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Dr John Smith".toText16(isBold: true).toShimmer2(isShow: true), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget(labelText: "").toShimmer2(isShow: true, width: 16.h), + AppCustomChipWidget(labelText: "").toShimmer2(isShow: true, width: 16.h), + ], + ), + ], + ), + ), + ], + ), + ], + ), + ), + ), + ).paddingSymmetrical(24.h, 0.h) + : contactUsVM.isHMGHospitalsListSelected + // ? contactUsVM.hmgHospitalsLocationsList.isNotEmpty + ? AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: FindUsItemCard( + getHMGLocationsModel: contactUsVM.hmgHospitalsLocationsList[index], + ), + ).paddingSymmetrical(24.h, 0.h), + ), + ), + ) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: FindUsItemCard( + getHMGLocationsModel: contactUsVM.hmgPharmacyLocationsList[index], + ), + ).paddingSymmetrical(24.h, 0.h), + ), + ), + ); + // : Utils.getNoDataWidget( + // context, + // noDataText: "No any locations yet.".needTranslation, + // ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + SizedBox(height: 24.h), + // FindUsItemCard(), + // FindUsItemCard(), + // FindUsItemCard(), + ], + ); + }), + ), + ); + } +} diff --git a/lib/presentation/contact_us/live_chat_page.dart b/lib/presentation/contact_us/live_chat_page.dart new file mode 100644 index 0000000..aced678 --- /dev/null +++ b/lib/presentation/contact_us/live_chat_page.dart @@ -0,0 +1,27 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; + +class LiveChatPage extends StatelessWidget { + const LiveChatPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: LocaleKeys.liveChat.tr(), + child: SingleChildScrollView(), + ), + ), + Container() + ], + ), + ); + } +} diff --git a/lib/presentation/contact_us/widgets/find_us_item_card.dart b/lib/presentation/contact_us/widgets/find_us_item_card.dart new file mode 100644 index 0000000..a59959f --- /dev/null +++ b/lib/presentation/contact_us/widgets/find_us_item_card.dart @@ -0,0 +1,106 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/contact_us/models/resp_models/get_hmg_locations.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:maps_launcher/maps_launcher.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class FindUsItemCard extends StatelessWidget { + FindUsItemCard({super.key, required this.getHMGLocationsModel}); + + late AppState appState; + GetHMGLocationsModel getHMGLocationsModel; + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + return DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: false, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8.h, + children: [hospitalName, distanceInfo], + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ); + } + + Widget get hospitalName => Row( + children: [ + Image.network( + getHMGLocationsModel.projectImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", + width: 40.h, + height: 40.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: false).paddingOnly(right: 10), + Expanded( + child: Text( + getHMGLocationsModel.locationName!, + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16, + color: AppColors.blackColor, + ), + ), + ) + ], + ); + + Widget get distanceInfo => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppCustomChipWidget( + labelText: "${getHMGLocationsModel.distanceInKilometers ?? ""} km".needTranslation, + icon: AppAssets.location_red, + iconColor: AppColors.primaryRedColor, + backgroundColor: AppColors.secondaryLightRedColor, + textColor: AppColors.errorColor, + ), + Row( + children: [ + AppCustomChipWidget( + labelText: "Get Directions".needTranslation, + icon: AppAssets.directions_icon, + iconColor: AppColors.whiteColor, + backgroundColor: AppColors.textColor.withValues(alpha: 0.8), + textColor: AppColors.whiteColor, + onChipTap: () { + MapsLauncher.launchCoordinates(double.parse(getHMGLocationsModel.latitude ?? "0.0"), double.parse(getHMGLocationsModel.longitude ?? "0.0"), getHMGLocationsModel.locationName!); + }, + ), + SizedBox(width: 4.w), + AppCustomChipWidget( + labelText: LocaleKeys.callNow.tr(), + icon: AppAssets.call_fill, + iconColor: AppColors.whiteColor, + backgroundColor: AppColors.primaryRedColor.withValues(alpha: 1.0), + textColor: AppColors.whiteColor, + onChipTap: () { + launchUrl(Uri.parse("tel://" + "${getHMGLocationsModel.phoneNumber}")); + }, + ), + ], + ), + ], + ); +} diff --git a/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart new file mode 100644 index 0000000..4d22610 --- /dev/null +++ b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart @@ -0,0 +1,46 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/radio/custom_radio_button.dart'; +import 'package:provider/provider.dart'; + +class RrtRequestTypeSelect extends StatelessWidget { + const RrtRequestTypeSelect({super.key}); + + @override + Widget build(BuildContext context) { + return Consumer(builder: (context, emergencyServicesVM, child) { + return Column( + children: [ + Container( + padding: EdgeInsets.all(16.h), + height: 200.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + CustomRadioOption( + value: "", + groupValue: "", + onChanged: (value) {}, + text: "Home Visit Emergency", + ) + ], + ), + ], + ), + ), + SizedBox(height: 32.h), + ], + ); + }); + } +} diff --git a/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart b/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart new file mode 100644 index 0000000..5e4b885 --- /dev/null +++ b/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart @@ -0,0 +1,691 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/AmbulanceCallingPlace.dart'; +import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart'; +import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart'; +import 'package:hmg_patient_app_new/features/location/PlacePrediction.dart'; +import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_doctor_card.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/requesting_services_page.dart' show RequestingServicesPage; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/tracking_screen.dart' show TrackingScreen; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart' show AppointmentBottomSheet; +import 'package:hmg_patient_app_new/presentation/emergency_services/widgets/location_input_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/CustomSwitch.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/expandable_bottom_sheet/ExpandableBottomSheet.dart'; +import 'package:hmg_patient_app_new/widgets/expandable_bottom_sheet/model/BottomSheetType.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:hmg_patient_app_new/widgets/map/HMSMap.dart'; +import 'package:hmg_patient_app_new/widgets/map/map.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +import '../../../widgets/common_bottom_sheet.dart'; +import 'widgets/AddressItem.dart'; + +class CallAmbulancePage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + floatingActionButton: Visibility( + visible: context.watch().bottomSheetType == + BottomSheetType.FIXED, + child: Padding( + padding: EdgeInsetsDirectional.only(end: 8.h, bottom: 68.h), + child: DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, borderRadius: 12.h), + child: Utils.buildSvgWithAssets( + icon: AppAssets.locate_me, width: 24.h, height: 24.h) + .paddingAll(12.h) + .onPress(() { + context + .read() + .moveToCurrentLocation(); + }), + ), + ), + ), + bottomSheet: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ExpandableBottomSheet( + bottomSheetType: + context.watch().bottomSheetType, + children: { + BottomSheetType.EXPANDED: ExpanedBottomSheet(context), + BottomSheetType.FIXED: FixedBottomSheet(context), + }, + ), + ], + ), + body: Stack( + children: [ + if (context.read().isGMSAvailable ) + GMSMap( + currentLocation: + context.read().getGMSLocation(), + onCameraMoved: (value) => context + .read() + .handleGMSMapCameraMoved(value), + onCameraIdle: + context.read().handleOnCameraIdle, + myLocationEnabled: true, + inputController: + context.read().gmsController, + showCenterMarker: true, + ) + else + HMSMap( + currentLocation: + context.read().getHMSLocation(), + onCameraMoved: (value) => context + .read() + .handleHMSMapCameraMoved(value), + onCameraIdle: + context.read().handleOnCameraIdle, + myLocationEnabled: false, + inputController: + context.read().hmsController, + showCenterMarker: true, + ), + Align( + alignment: AlignmentDirectional.topStart, + child: Utils.buildSvgWithAssets( + icon: AppAssets.closeBottomNav, width: 32.h, height: 32.h) + .onPress(() { + context + .read() + .flushPickupInformation(); + Navigator.pop(context); + }), + ).paddingOnly(top: 51.h, left: 24.h), + ], + ), + ); + } + + Widget FixedBottomSheet(BuildContext context) { + return GestureDetector( + onVerticalDragUpdate: (details){ + + // if(details.delta.dy<0){ + // + // context.read().updateBottomSheetState(BottomSheetType.EXPANDED); + // } + }, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + // Row( + // mainAxisAlignment: MainAxisAlignment.end, + // children: [ + // Padding( + // + // padding: EdgeInsetsDirectional.only(end:24.h, bottom: 24.h), + // child: DecoratedBox( + // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + // color: AppColors.whiteColor, borderRadius: 12.h), + // child: Utils.buildSvgWithAssets( + // icon: AppAssets.locate_me, width: 24.h, height: 24.h) + // .paddingAll(12.h).onPress((){ + // context.read().moveToCurrentLocation(); + // }), + // ), + // ), + // ], + // ), + // PositionedDirectional( + // end: 1, + // child: Padding( + // padding: EdgeInsetsDirectional.only(end:24.h, bottom: 24.h), + // child: DecoratedBox( + // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + // color: AppColors.whiteColor, borderRadius: 12.h), + // child: Utils.buildSvgWithAssets( + // icon: AppAssets.locate_me, width: 24.h, height: 24.h) + // .paddingAll(12.h), + // ), + // ), + // ), + // .paddingOnly(right: 24.h, bottom: 24.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + spacing: 24.h, + children: [ + inputFields(context), + SizedBox( + height: 200.h, + child: DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.scaffoldBgColor, + customBorder: BorderRadius.only( + topLeft: Radius.circular(24.h), + topRight: Radius.circular(24.h), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 24.h, + children: [ + Column( + spacing: 4.h, + children: [ + "Select Pickup Details".needTranslation.toText21( + weight: FontWeight.w600, + color: AppColors.textColor, + ), + " Please select the details of pickup" + .needTranslation + .toText12( + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ) + ], + ), + CustomButton( + text: "Select Details".needTranslation, + onPressed: () { + context + .read() + .updateBottomSheetState(BottomSheetType.EXPANDED); + }) + ], + ).paddingOnly(top: 24.h, bottom: 32.h, left: 24.h, right: 24.h), + ), + ), + ], + ), + ], + ), + ); + } + + Widget ExpanedBottomSheet(BuildContext context) { + return GestureDetector( + onVerticalDragUpdate: (details){ + if(details.delta.dy>0){ + context.read().updateBottomSheetState(BottomSheetType.FIXED); + } + }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.scaffoldBgColor, + customBorder: BorderRadius.only( + topLeft: Radius.circular(24.h), + topRight: Radius.circular(24.h), + ), + ), + child: Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 16.h, + children: [ + + hospitalAndPickUpSection(context), + if(context.read().appointment != null) + AppointmentDoctorCard( + renderWidgetForERDisplay: true, + patientAppointmentHistoryResponseModel: context.read().appointment!, + onAskDoctorTap: () {}, + onCancelTap: () async {}, + onRescheduleTap: () async {}, + ).onPress((){ + openAppointmentList(context); + }) + + ], + ).paddingOnly(top: 24.h, bottom: 32.h,left: 24.h, right: 24.h), + + bottomPriceContent(context) + ], + ), + ), + ], + ), + ); + } + + locationsSections(BuildContext context) { + return DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + ), + child: Column(mainAxisSize: MainAxisSize.min, children: [ + ListView.separated( + separatorBuilder: (_, __) => Column( + children: [ + SizedBox(height: 16.h), + Divider( + color: AppColors.bottomNAVBorder, + height: 1, + thickness: 1, + ), + SizedBox(height: 16.h), + ], + ), + shrinkWrap: true, + itemCount: 3, + itemBuilder: (__, index) { + if (index == + 2) // todo means the end of the list so handle as per the viewmodel + { + return CustomButton( + height: 40.h, + backgroundColor: AppColors.lightRedButtonColor, + borderColor: Colors.transparent, + text: "Add new address".needTranslation, + textColor: AppColors.primaryRedColor, + iconColor: AppColors.primaryRedColor, + onPressed: () {}, + icon: AppAssets.add_icon); + } else { + return AddressItem( + isSelected: index == 0, + address: + "Flat No 301, Building No 12, Palm Spring Apartment, Sector 45, Gurugram, Haryana 122003", + title: index == 0 + ? "Home".needTranslation + : "Work".needTranslation, + onTap: () {}, + ); + } + }) + ]).paddingAll(16.h), + ); + } + + hospitalAndPickUpSection(BuildContext context) { + return DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 16.h, + children: [ + // Row( + // children: [ + // hospitalAndPickUpItemContent( + // title: "Select Hospital".needTranslation, + // subTitle: "hospital".needTranslation, + // leadingIcon: AppAssets.hospital, + // ), + // Utils.buildSvgWithAssets(icon: AppAssets.down_cheveron, + // width: 24.h, height: 24.h) + // .paddingAll(16.h) + // ], + // ).onPress((){ + // showHospitalBottomSheet(context); + // }), + // SizedBox(height: 16.h), + // Divider( + // color: AppColors.bottomNAVBorder, + // height: 1, + // thickness: 1, + // ), + // SizedBox(height: 16.h), + + Row( + children: [ + hospitalAndPickUpItemContent( + title: "Pick".needTranslation, + subTitle: "Inside the home".needTranslation, + leadingIcon: AppAssets.pickup_bed, + ), + CustomSwitch( + value: context + .watch() + .pickupFromInsideTheLocation, + onChanged: (value){ + context + .read() + .updateThePickupPlaceFromLocation(value); + }, + ) + ], + ), + + Row( + children: [ + hospitalAndPickUpItemContent( + title: '', + subTitle: "Have any appointment".needTranslation, + leadingIcon: AppAssets.appointment_checkin_icon, + ), + CustomSwitch( + value: context + .watch() + .haveAnAppointment, + onChanged: (value) async { + // if (value) { + // openAppointmentList(context); + // } + await context.read() + .updateAppointment(value); + if (context.read().appointments?.isNotEmpty == true) { + openAppointmentList(context); + } + }, + ) + ], + ), + ], + ).paddingAll(16.h), + ); + } + + leadingIcon(String leadingIcon) { + return Container( + height: 40.h, + width: 40.h, + margin: EdgeInsets.only(right: 10.h), + padding: EdgeInsets.all(8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + borderRadius: 12.h, + color: AppColors.greyColor, + ), + child: Utils.buildSvgWithAssets(icon: leadingIcon), + ); + } + + hospitalAndPickUpItemContent({ + required String title, + required String subTitle, + required String leadingIcon, + }) { + return Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + this.leadingIcon(leadingIcon), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Visibility( + visible: title.isNotEmpty, + child: Column( + children: [ + title.toText12( + color: AppColors.greyTextColor, + fontWeight: FontWeight.w500, + ), + SizedBox(height: 2.h), + ], + ), + ), + subTitle.toText14( + color: AppColors.textColor, + weight: FontWeight.w500, + ), + ], + ), + ), + ], + ), + ); + } + + bottomPriceContent(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.scaffoldBgColor, + customBorder: BorderRadius.only( + topLeft: Radius.circular(24.h), + topRight: Radius.circular(24.h), + ), + hasShadow: true + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12.h, + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4.h, + children: [ + "Total amount to pay".needTranslation.toText18( + weight: FontWeight.w600, + color: AppColors.textColor, + ), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.warning, + height: 18.h, width: 18.h), + SizedBox(width: 4.h,), + "Amount will be paid at the hospital" + .needTranslation + .toText12( + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ), + ], + ) + ], + ), + ), + Utils.getPaymentAmountWithSymbol( + (Utils.formatNumberToInternationalFormat(context + .read() + .getTotalPrice() ?? + 0)) + .toText24( + fontWeight: FontWeight.w600, + color: AppColors.textColor, + letterSpacing: -2), + AppColors.blackColor, + 17.h) + + // Utils.getPaymentAmountWithSymbol2(context.read().selectedTransportOption?.priceTotal??"0", letterSpacing: -2) + ], + ), + CustomButton( + text: "Submit Request".needTranslation, + onPressed: () { + LocationViewModel locationViewModel = context.read(); + GeocodeResponse? response = locationViewModel.geocodeResponse; + PlaceDetails? placeDetails = locationViewModel.placeDetails; + PlacePrediction? placePrediction = locationViewModel.selectedPrediction; + context.read().submitAmbulanceRequest(response?.results.first, placeDetails, placePrediction); + }) + ], + ).paddingOnly(top: 24.h, bottom: 12.h, left: 24.h, right: 24.h), + ), + ], + ); + } + + showHospitalBottomSheet(BuildContext context){ + showCommonBottomSheetWithoutHeight( + title: + LocaleKeys.selectHospital.tr(), + context, + child: Consumer( + builder:(_,vm,__)=> HospitalBottomSheetBody( + searchText: vm.searchController, + displayList: vm.displayList, + onFacilityClicked: (value) { + vm.setSelectedFacility(value); + vm.getDisplayList(); + }, + onHospitalClicked: (hospital) { + Navigator.pop(context); + vm.setSelectedHospital(hospital); + }, + onHospitalSearch: (value) { + vm.searchHospitals(value ?? ""); + }, + selectedFacility: + vm.selectedFacility, + hmcCount: vm.hmcCount, + hmgCount: vm.hmgCount, + ), + ), + isFullScreen: false, + isCloseButtonVisible: true, + hasBottomPadding: false, + backgroundColor: AppColors.bottomSheetBgColor, + callBackFunc: () { + context.read().clearSearchText(); + }, + ); + } + + ///it will show the places field first and then hospital field + PlaceFirstThanHospitalField(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 16.h, + children: [ + textPlaceInput(context), + hospitalField(context), + ], + ).paddingOnly(right: 24.h, left: 24.h); + } + + HospitalFieldFirstThanPlaces(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 16.h, + children: [hospitalField(context), textPlaceInput(context)], + ).paddingOnly(right: 24.h, left: 24.h); + } + + textPlaceInput(context) { + return Consumer(builder: (_, vm, __) { + print( + "the data is ${vm.geocodeResponse?.results.first.formattedAddress ?? vm.selectedPrediction?.description}"); + return SizedBox( + width: MediaQuery.sizeOf(context).width, + child: TextInputWidget( + labelText: "Enter Pickup Location Manually".needTranslation, + hintText: "Enter Pickup Location".needTranslation, + controller: TextEditingController( + text: vm.geocodeResponse?.results.first.formattedAddress ?? + vm.selectedPrediction?.description, + ), + leadingIcon: AppAssets.location_pickup, + isAllowLeadingIcon: true, + isEnable: false, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), + ).onPress(() { + openLocationInputBottomSheet(context); + }), + ); + }); + } + + ///decide which field to show first based on the selected calling place + inputFields(BuildContext context) { + return context.read().callingPlace == + AmbulanceCallingPlace.FROM_HOSPITAL + ? HospitalFieldFirstThanPlaces(context) + : PlaceFirstThanHospitalField(context); + } + + openLocationInputBottomSheet(BuildContext context) { + context.read().flushSearchPredictions(); + showCommonBottomSheetWithoutHeight( + title: "".needTranslation, + context, + child: SizedBox( + height: MediaQuery.sizeOf(context).height * .8, + child: LocationInputBottomSheet(), + ), + isFullScreen: false, + isCloseButtonVisible: true, + hasBottomPadding: false, + backgroundColor: AppColors.bottomSheetBgColor, + callBackFunc: () {}, + ); + } + + hospitalField(BuildContext context) { + return DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, borderRadius: 12.h), + child: Row( + children: [ + hospitalAndPickUpItemContent( + title: "Select Hospital".needTranslation, + subTitle: context + .read() + .getSelectedHospitalName() ?? + "Select Hospital".needTranslation, + leadingIcon: AppAssets.hospital, + ), + Utils.buildSvgWithAssets( + icon: AppAssets.down_cheveron, width: 24.h, height: 24.h) + .paddingAll(16.h) + ], + ).onPress(() { + print("the item is clicked"); + showHospitalBottomSheet(context); + }).paddingSymmetrical( + 10.w, + 12.h, + ), + ); + } + + void openAppointmentList(BuildContext context) { + showCommonBottomSheetWithoutHeight( + title: "Select Appointment".needTranslation, + context, + child: SizedBox( + height: MediaQuery.sizeOf(context).height * .5, + child: AppointmentBottomSheet( + list: context.read().appointments!, + onAppointmentSelection: (appointment) { + Navigator.pop(context); + context.read().setSelectedAppointment(appointment); + }), + ), + isFullScreen: false, + isCloseButtonVisible: true, + hasBottomPadding: false, + backgroundColor: AppColors.bottomSheetBgColor, + callBackFunc: () { + context.read().checkHasAppointment(); + }, + ); + // ); + } +} diff --git a/lib/presentation/emergency_services/call_ambulance/requesting_services_page.dart b/lib/presentation/emergency_services/call_ambulance/requesting_services_page.dart new file mode 100644 index 0000000..83c16b6 --- /dev/null +++ b/lib/presentation/emergency_services/call_ambulance/requesting_services_page.dart @@ -0,0 +1,43 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/request_model/PatientER_RC.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/tracking_screen.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart' + show CustomPageRoute; +import 'package:lottie/lottie.dart'; + +class RequestingServicesPage extends StatelessWidget { + + + const RequestingServicesPage({super.key,}); + @override + Widget build(BuildContext context) { + return Material( + color: AppColors.scaffoldBgColor, + child: Stack( + children: [ + Lottie.asset(AppAnimations.loadingAnimation, + width: 80.h, + height: 80.h, + repeat: true, + reverse: false, + frameRate: FrameRate(60), + fit: BoxFit.fill) + .center, + Positioned( + bottom: 1, + child: "Submitting your request. \nPlease wait for a moment" + .needTranslation + .toText16(color: AppColors.textColor, weight: FontWeight.w500) + .paddingOnly(bottom: 100.h, left: 100.h, right: 100.h)) + ], + ), + ); + } +} diff --git a/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart b/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart new file mode 100644 index 0000000..eddca11 --- /dev/null +++ b/lib/presentation/emergency_services/call_ambulance/tracking_screen.dart @@ -0,0 +1,461 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/AmbulanceRequestOrdersModel.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/map/HMSMap.dart'; +import 'package:hmg_patient_app_new/widgets/map/map.dart' show GMSMap; +import 'package:hmg_patient_app_new/widgets/order_tracking/order_tracking_state.dart'; +import 'package:hmg_patient_app_new/widgets/order_tracking/request_tracking.dart'; +import 'package:lottie/lottie.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart' show launchUrl; + +class TrackingScreen extends StatelessWidget { + OrderTrackingState? state ; + final AmbulanceRequestOrdersModel? order; + + TrackingScreen({super.key, OrderTrackingState? state, this.order}){ + if(state == null){ + switch (order?.statusId) { + case 1: //pending + case 2: //processing + this.state = OrderTrackingState.waitingForCall; + break; + case 3: //completed + this.state = OrderTrackingState.dispactched; + break; + case 4: //cancel + case 6: + case 7: + this.state = OrderTrackingState.cancel; + break; + } + + }else { + this.state = state; + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + bottomNavigationBar: Visibility( + visible: state == OrderTrackingState.ended, + child: SafeArea( + child: CustomButton( + height: 56.h, + backgroundColor: AppColors.bgGreenColor, + borderColor: Colors.transparent, + text: "Close".needTranslation, + textColor: AppColors.whiteColor, + onPressed: () {}, + ).paddingOnly(left: 16.h, right: 16.h), + ), + ), + body: CollapsingListView( + title: "Tracking Details".needTranslation, + child: SingleChildScrollView( + child: Column( + children: [ + animationSection(), + Column( + spacing: 16.h, + children: [orderStatus(context), orderTrackingId(), contactSection()], + ).paddingAll(16.h), + ], + ))), + ); + } + + animationSection() { + switch (state) { + case OrderTrackingState.waitingForCall: + case OrderTrackingState.dispactched: + case OrderTrackingState.returning: + return Lottie.asset(AppAnimations.ambulance, repeat: true, reverse: false, width: 260.h, height: 200.h); + case OrderTrackingState.ended: + return Lottie.asset(AppAnimations.checkmark, repeat: true, width: 260.h, height: 200.h); + case OrderTrackingState.failed: + case OrderTrackingState.cancel: + case null: + return Lottie.asset(AppAnimations.errorAnimation, repeat: true, width: 260.h, height: 200.h); + } + } + + orderStatus(BuildContext context) { + return Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + getTitle(state), + SizedBox(height: 12.h), + OrderTrackingWidget( + height: 6.h, + state: state, + parentPaddingValue: 16.h, + ), + SizedBox(height: 24.h), + informationRegardingTrackingSection(), + trackingBottomSection(context) + ], + ), + ); + } + + Widget trackingBottomSection(BuildContext context) { + if(state == null ) + { + return SizedBox.shrink(); + } + switch (state!) { + case OrderTrackingState.waitingForCall: + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 16, + ), + CustomButton( + text: "Cancel Request".needTranslation, + onPressed: () async { + openCancelOrderBottomSheet(context); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: Colors.white, + icon: AppAssets.cancel, + ), + ], + ); + case OrderTrackingState.dispactched: + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12.h, + children: [ + dividerSection, + doctorSection(), + mapSection(context), + CustomButton( + height: 40.h, + backgroundColor: AppColors.lightRedButtonColor, + borderColor: Colors.transparent, + text: "Share Your Live Location on Whatsapp".needTranslation, + fontSize: 12.f, + textColor: AppColors.primaryRedColor, + iconColor: AppColors.primaryRedColor, + onPressed: () {}, + icon: AppAssets.share_location, + ), + ], + ); + case OrderTrackingState.returning: + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12.h, + children: [dividerSection, doctorSection(), mapSection(context)], + ); + case OrderTrackingState.ended: + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12.h, + children: [ + dividerSection, + doctorSection(), + ], + ); + case OrderTrackingState.failed: + case OrderTrackingState.cancel: + return SizedBox.shrink(); + + } + } + + Widget get dividerSection => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 16, + ), + Divider( + thickness: 1.5.h, + color: AppColors.borderGrayColor, + ), + SizedBox( + height: 4, + ) + ], + ); + + doctorSection() { + return Row( + spacing: 16.h, + children: [ + Utils.buildImgWithNetwork(url: "", iconColor: Colors.transparent).circle(52.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Dr. John Doe".toText16(color: AppColors.textColor, weight: FontWeight.w600), + SizedBox(height: 4.h), + "MBBS, MD - General Medicine".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + ], + ), + ), + SizedBox( + height: 36.h, + width: 36.h, + child: CustomButton( + text: '', + iconSize: 16.h, + icon: AppAssets.call_fill, + onPressed: () {}, + backgroundColor: AppColors.lightRedButtonColor, + iconColor: AppColors.primaryRedColor, + borderColor: Colors.transparent, + height: 36.h, + ), + ) + ], + ); + } + + Widget mapForRequestedCoordinate(BuildContext context) { + // return SizedBox.shrink(); + if (context.read().isGMSAvailable || Platform.isIOS) { + return GMSMap( + myLocationEnabled: false, + onCameraIdle: (){ + + }, + currentLocation: context.read().getGMSLocation(), + onCameraMoved: (value) => context.read().handleGMSMapCameraMoved(value)); + } else { + return HMSMap( + myLocationEnabled: false, + onCameraIdle: (){ + + }, + currentLocation: context.read().getHMSLocation(), + onCameraMoved: (value) => context.read().handleHMSMapCameraMoved(value)); + } + } + + informationRegardingTrackingSection() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [currentStatus(), SizedBox(height: 4.h), "You will receive a call from HMG for confirmation ".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500)], + ); + } + + currentStatus() { + if(state == null){ + return SizedBox.shrink(); + } + switch (state!) { + case OrderTrackingState.waitingForCall: + case OrderTrackingState.dispactched: + return RichText( + text: TextSpan(children: [ + TextSpan( + text: "Please wait for the call".needTranslation, + style: TextStyle( + fontSize: 21.f, + fontWeight: FontWeight.w600, + color: AppColors.textColor, + ), + ), + TextSpan( + text: "...".needTranslation, + style: TextStyle( + fontSize: 21.f, + fontWeight: FontWeight.w600, + color: AppColors.errorColor, + ), + ), + ]), + ); + case OrderTrackingState.returning: + return RichText( + text: TextSpan(children: [ + TextSpan( + text: "15:30".needTranslation, + style: TextStyle( + fontSize: 21.f, + fontWeight: FontWeight.w600, + color: AppColors.textColor, + ), + ), + TextSpan( + text: " mins ".needTranslation, + style: TextStyle( + fontSize: 21.f, + fontWeight: FontWeight.w600, + color: AppColors.errorColor, + ), + ), + TextSpan( + text: "to hospital".needTranslation, + style: TextStyle( + fontSize: 21.f, + fontWeight: FontWeight.w600, + color: AppColors.textColor, + ), + ), + ]), + ); + case OrderTrackingState.ended: + + return "Arrived".needTranslation.toText21(color: AppColors.textColor, weight: FontWeight.w600); + case OrderTrackingState.failed: + case OrderTrackingState.cancel: + return SizedBox.shrink(); + } + } + + orderTrackingId() { + if(state == OrderTrackingState.failed){ + return SizedBox.shrink(); + } + return Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8.h, + children: [ + + Visibility(visible:order != null ,child: "Req ID: ${order?.iD}".toText16(color: AppColors.textColor, weight: FontWeight.w600)), + Row( + spacing: 8.h, + children: [ + Flexible(child: + chip(order?.pickupLocation??"", AppAssets.location_pickup, AppColors.blackBgColor), + + ), + Flexible(child: + chip(order?.dropOffLocation??"", AppAssets.hospital, AppColors.blackBgColor), + + ) + ], + ), + ], + ), + ); + } + + chip(String title, String iconString, Color iconColor) { + return AppCustomChipWidget( + labelText: title, + icon: iconString, + iconColor: iconColor, + iconSize: 14.h, + ); + } + + contactSection() { + return Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4.h, + children: [ + "Contact Rapid Response Team (RRT)".needTranslation.toText14(color: AppColors.textColor, weight: FontWeight.w600), + "0115259555".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), + SizedBox(height: 8.h), + ], + ), + ), + SizedBox( + height: 36.h, + width: 36.h, + child: CustomButton( + text: '', + iconSize: 16.h, + icon: AppAssets.call_fill, + onPressed: () {}, + backgroundColor: AppColors.lightRedButtonColor, + iconColor: AppColors.primaryRedColor, + borderColor: Colors.transparent, + height: 36.h, + ), + ).onPress((){ + launchUrl( + Uri.parse("tel://0115259555"), + ); + }) + ], + ), + ); + } + + // "c": { + // "a": 0, + // "k": [ + // 1, + // 1, + // 1 + // ] + // } + + getTitle(OrderTrackingState? state) { + if(state == null) + return "Failed".needTranslation.toText16(color: AppColors.textColor, weight: FontWeight.w600); + + switch (state) { + case OrderTrackingState.waitingForCall: + return "Confirmation Call".needTranslation.toText16(color: AppColors.textColor, weight: FontWeight.w600); + case OrderTrackingState.dispactched: + return "Pickup Up from Home".needTranslation.toText16(color: AppColors.textColor, weight: FontWeight.w600); + case OrderTrackingState.returning: + return " On The Way To Hospital".needTranslation.toText16(color: AppColors.textColor, weight: FontWeight.w600); + case OrderTrackingState.ended: + return "Arrived at Hospital".needTranslation.toText16(color: AppColors.textColor, weight: FontWeight.w600); + case OrderTrackingState.failed: + return "Failed".needTranslation.toText16(color: AppColors.textColor, weight: FontWeight.w600); + + case OrderTrackingState.cancel: + return "Order Cancel".needTranslation.toText16(color: AppColors.textColor, weight: FontWeight.w600); + } + } + + mapSection(BuildContext context) { + return SizedBox( + height: 170.h, + width: double.infinity, + child: ClipRRect(borderRadius: BorderRadius.circular(20.h), child: mapForRequestedCoordinate(context)), + ); + } + + + openCancelOrderBottomSheet(BuildContext context){ + context.read().cancelOrder(order, shouldPop: true); + } +} diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/AddressItem.dart b/lib/presentation/emergency_services/call_ambulance/widgets/AddressItem.dart new file mode 100644 index 0000000..13e3256 --- /dev/null +++ b/lib/presentation/emergency_services/call_ambulance/widgets/AddressItem.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class AddressItem extends StatelessWidget { + final bool isSelected; + final String address; + final VoidCallback? onTap; + final String title; + + const AddressItem( + {super.key, + required this.isSelected, + required this.address, + this.onTap, + required this.title}); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + SizedBox( + height: 18.h, + width: 18.h, + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.all( + color: AppColors.bottomNAVBorder, + width: 1.5, + ), + borderRadius: BorderRadius.circular(70.h)), + child: CircleAvatar( + radius: 70.h, + backgroundColor: + isSelected ? AppColors.errorLightColor : Colors.transparent, + ).paddingAll(3.h), + ), + ), + SizedBox(width: 12.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 2.h, + children: [ + title.toText12( + color: AppColors.greyTextColor, + fontWeight: FontWeight.w500, + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: address.toText14( + color: AppColors.textColor, + weight: FontWeight.w500, + textOverflow : TextOverflow.ellipsis, + maxlines: 2 + ), + ), + ], + ) + ], + ), + ), + + Container( + height: 40.h, + width: 40.h, + margin: EdgeInsets.only(right: 10.h), + padding: EdgeInsets.all(8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + borderRadius: 10.h, + color: AppColors.greyColor, + ), + child: Utils.buildSvgWithAssets( + fit: BoxFit.contain, + icon: AppAssets.location, + iconColor: AppColors.greyTextColor)) + ], + ); + } +} diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart b/lib/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart new file mode 100644 index 0000000..71e589e --- /dev/null +++ b/lib/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart @@ -0,0 +1,98 @@ +import 'package:easy_localization/easy_localization.dart' + show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/debouncer.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart' show HospitalsModel; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class HospitalBottomSheetBody extends StatelessWidget { + + final TextEditingController searchText ; + final Debouncer debouncer = Debouncer(milliseconds: 500); + + final int hmcCount; + final int hmgCount; + final List? displayList; + final FacilitySelection selectedFacility; + final Function(FacilitySelection) onFacilityClicked; + final Function(HospitalsModel) onHospitalClicked; + final Function(String) onHospitalSearch; + + HospitalBottomSheetBody({super.key, required this.hmcCount, required this.hmgCount, this.displayList, required this.selectedFacility, required this.onFacilityClicked, required this.onHospitalClicked, required this.onHospitalSearch, required this.searchText}); + + @override + Widget build(BuildContext context) { + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextInputWidget( + labelText: LocaleKeys.search.tr(), + hintText: LocaleKeys.searchHospital.tr(), + controller: searchText, + onChange: (value) { + debouncer.run((){ + onHospitalSearch(value??""); + }); + }, + isEnable: true, + prefix: null, + + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + isAllowLeadingIcon: true, + selectionType: SelectionTypeEnum.search, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), + ), + SizedBox(height: 24.h), + TypeSelectionWidget( + selectedFacility:selectedFacility , + hmcCount: hmcCount.toString(), + hmgCount: hmgCount.toString(), + onitemClicked: (selectedValue){ + onFacilityClicked(selectedValue); + }, + ), + SizedBox(height: 21.h), + SizedBox( + height: MediaQuery.sizeOf(context).height * .4, + child: ListView.separated( + itemBuilder: (_, index) + { + var hospital = displayList?[index]; + return HospitalListItem( + hospitalData: Utils.convertToPatientDoctorAppointmentList(hospital), + isLocationEnabled: true, + ).onPress(() { + onHospitalClicked(hospital!); + });}, + separatorBuilder: (_, __) => SizedBox( + height: 16.h, + ), + itemCount: displayList?.length ?? 0, + )) + ], + ); + } +} diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/ambulance_option_selection_bottomsheet.dart b/lib/presentation/emergency_services/call_ambulance/widgets/ambulance_option_selection_bottomsheet.dart new file mode 100644 index 0000000..de20d1a --- /dev/null +++ b/lib/presentation/emergency_services/call_ambulance/widgets/ambulance_option_selection_bottomsheet.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart' show AppAssets; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/PatientERTransportationMethod.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/transport_option_Item.dart' show TransportOptionItem; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:provider/provider.dart'; + +class AmbulanceOptionSelectionBottomSheet extends StatelessWidget { + final Function onTap; + + const AmbulanceOptionSelectionBottomSheet({super.key, required this.onTap}); + @override + Widget build(BuildContext context) { + return Selector>( + selector: (_, model) => model.transportationOptions, + builder: (_, data, __) => Column( + spacing: 16.h, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: ListView.separated( + separatorBuilder: (_,__)=> SizedBox( + height: 16.h, + ), + itemCount: data.length??0, + itemBuilder: (_, index) => TransportOptionItem( + title: Utils.getTextWRTCurrentLanguage(data[index].text, data[index].textN), + subTitle: "", + firstIcon: AppAssets.location_pickup, + middleIcon: AppAssets.to_arrow, + lastIcon: AppAssets.hospital, + price: data[index].priceTotal.toString(), + onTap: () { + onTap(); + context.read().setTransportationOption(data[index]); + }, + ), + ), + ), + + ], + ), + ); + } +} diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart b/lib/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart new file mode 100644 index 0000000..6f5db92 --- /dev/null +++ b/lib/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart @@ -0,0 +1,54 @@ +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_doctor_card.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/doctor_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:provider/provider.dart'; + +class AppointmentBottomSheet extends StatelessWidget{ + + + final Function(PatientAppointmentHistoryResponseModel) onAppointmentSelection; + final List list; + + const AppointmentBottomSheet({super.key, required this.onAppointmentSelection, required this.list}); + + @override + Widget build(BuildContext context) => getAppointList(list); + + Widget getAppointList( List list) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: BouncingScrollPhysics(), + itemCount: list.length, + itemBuilder: (context, index) { + PatientAppointmentHistoryResponseModel item = list[index]; + return AppointmentDoctorCard( + renderWidgetForERDisplay: true, + patientAppointmentHistoryResponseModel: item, + onAskDoctorTap: () {}, + onCancelTap: () async {}, + onRescheduleTap: () async {}, + ).onPress((){ + onAppointmentSelection(item); + }); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + ), + SizedBox(height: 24.h), + ], + ); + } + + +} \ No newline at end of file diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/pickup_location.dart b/lib/presentation/emergency_services/call_ambulance/widgets/pickup_location.dart new file mode 100644 index 0000000..5d073d4 --- /dev/null +++ b/lib/presentation/emergency_services/call_ambulance/widgets/pickup_location.dart @@ -0,0 +1,172 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/AmbulanceCallingPlace.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/ambulance_direction.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:provider/provider.dart'; + +import '../../../../generated/locale_keys.g.dart' show LocaleKeys; + +class PickupLocation extends StatelessWidget { + final VoidCallback onTap; + const PickupLocation({super.key, required this.onTap}); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Select Pickup Direction" + .needTranslation + .toText24(color: AppColors.textColor,isBold: true), + SizedBox( + height: 16.h, + ), + "Select Direction" + .needTranslation + .toText14(color: AppColors.textColor, weight: FontWeight.w600), + SizedBox( + height: 12.h, + ), + Selector( + selector: (context, viewModel) => viewModel.callingPlace, + builder: (context, value, _) { + return Column( + spacing: 12.h, + children: [ + RadioGroup( + groupValue: value, + onChanged: (value) { + context + .read() + .updateCallingPlace(value); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 24.h, + children: [ + Row( + children: [ + Radio( + value: AmbulanceCallingPlace.TO_HOSPITAL, + groupValue: value, + activeColor: AppColors.primaryRedColor, + + fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), + ), + "To Hospital" + .needTranslation + .toText12(color: AppColors.textColor) + ], + ).onPress((){ + context + .read() + .updateCallingPlace(AmbulanceCallingPlace.TO_HOSPITAL); + }), + Row( + children: [ + Radio( + value: AmbulanceCallingPlace.FROM_HOSPITAL, + activeColor: AppColors.primaryRedColor, + + fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), + ), + "From Hospital" + .needTranslation + .toText12(color: AppColors.textColor) + ], + ).onPress((){ + context + .read() + .updateCallingPlace(AmbulanceCallingPlace.FROM_HOSPITAL); + }), + ], + ), + ), + Visibility( + visible: value == AmbulanceCallingPlace.TO_HOSPITAL, + child: Selector( + selector: (context, viewModel) => + viewModel.ambulanceDirection, + builder: (context, directionValue, _) { + return Column( + spacing: 12.h, + children: [ + "Select Way" + .needTranslation + .toText14(color: AppColors.textColor, weight: FontWeight.w600), + RadioGroup( + groupValue: directionValue, + onChanged: (value) { + context + .read() + .updateDirection(value); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 24.h, + children: [ + Row( + children: [ + Radio( + value: AmbulanceDirection.ONE_WAY, + activeColor: AppColors.primaryRedColor, + + fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), + ), + "One Way" + .needTranslation + .toText12(color: AppColors.textColor) + ], + ).onPress((){ + context + .read() + .updateDirection(AmbulanceDirection.ONE_WAY); + }), + Row( + children: [ + Radio( + value: AmbulanceDirection.TWO_WAY, + // activeColor: AppColors.primaryRedColor, + + fillColor: MaterialStateProperty.all(AppColors.primaryRedColor), + ), + "Two Way" + .needTranslation + .toText12(color: AppColors.textColor) + ], + ).onPress((){ + context + .read() + .updateDirection(AmbulanceDirection.TWO_WAY); + }), + ], + ), + ), + ], + ); + }), + ) + ], + ); + }), + SizedBox( + height: 16.h, + ), + CustomButton( + text: LocaleKeys.confirm.tr(context: context), + onPressed: onTap, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + iconColor: AppColors.whiteColor, + ), + ], + ); + } +} diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/transport_option_Item.dart b/lib/presentation/emergency_services/call_ambulance/widgets/transport_option_Item.dart new file mode 100644 index 0000000..9a959eb --- /dev/null +++ b/lib/presentation/emergency_services/call_ambulance/widgets/transport_option_Item.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +class TransportOptionItem extends StatelessWidget { + final String title; + final String subTitle; + final String firstIcon; + final String middleIcon; + final String lastIcon; + final String price; + final VoidCallback onTap; + + const TransportOptionItem( + {super.key, + required this.title, + required this.subTitle, + required this.firstIcon, + required this.middleIcon, + required this.lastIcon, + required this.price, + required this.onTap}); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Column( + spacing: 16.h, + children: [ + headerSection(), + titleSection(), + ], + )).onPress((){ + onTap(); + }); + } + + titleSection() { + return Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title.toText16( + color: AppColors.textColor, weight: FontWeight.w600), + // subTitle.toText12( + // color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + ], + ), + ), + Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_medium, width: 24.h, height: 24.h) + ], + ); + } + + headerSection() { + return Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + // Expanded( + // child: Row( + // children: [ + // buildIcon(firstIcon), + // Utils.buildSvgWithAssets( + // icon: middleIcon, width: 24.h, height: 24.h).paddingAll(8.h), + // buildIcon(lastIcon) + // ], + // ), + // ), + Utils.getPaymentAmountWithSymbol2( + num.tryParse(price) ?? 0.0, + fontSize: 18.f, + letterSpacing:-2 + ), + ], + ); + } + + buildIcon(String icon) { + return CustomButton( + text: '', + iconSize: 24.h, + icon: icon, + onPressed: () {}, + backgroundColor: AppColors.greyColor, + iconColor: AppColors.greyTextColor, + borderColor: Colors.transparent, + height: 40.h, + ); + } +} diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart b/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart new file mode 100644 index 0000000..3b8d8d7 --- /dev/null +++ b/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:provider/provider.dart' show Consumer; + +class TypeSelectionWidget extends StatelessWidget { + final String hmcCount; + final String hmgCount; + final FacilitySelection selectedFacility; + final Function(FacilitySelection) onitemClicked; + + const TypeSelectionWidget( + {super.key, + required this.hmcCount, + required this.hmgCount, + required this.onitemClicked, + required this.selectedFacility}); + + @override + Widget build(BuildContext context) { + + return Row( + spacing: 8, + mainAxisSize: MainAxisSize.max, + children: [ + AppCustomChipWidget( + labelText: "All Facilities".needTranslation, + shape: RoundedRectangleBorder( + side: BorderSide( + color: selectedFacility == FacilitySelection.ALL + ? AppColors.errorColor + : AppColors.chipBorderColorOpacity20, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + backgroundColor: + selectedFacility == FacilitySelection.ALL + ?AppColors.secondaryLightRedColor: AppColors.whiteColor, + textColor: selectedFacility == FacilitySelection.ALL + ? AppColors.errorColor:AppColors.blackColor + , + ).onPress((){ + onitemClicked(FacilitySelection.ALL); + }), + Visibility( + visible: hmgCount != "0", + child: AppCustomChipWidget( + icon: AppAssets.hmg, + iconHasColor: false, + labelText: "Hospitals".needTranslation, + shape: RoundedRectangleBorder( + side: BorderSide( + color: selectedFacility == FacilitySelection.HMG + ? AppColors.errorColor + : AppColors.chipBorderColorOpacity20, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + backgroundColor: + selectedFacility == FacilitySelection.HMG + ?AppColors.secondaryLightRedColor: AppColors.whiteColor, + textColor: selectedFacility == FacilitySelection.HMG + ? AppColors.errorColor + : AppColors.blackColor, + ).onPress((){ + onitemClicked(FacilitySelection.HMG); + }), + ), + Visibility( + visible: hmcCount != "0", + child: AppCustomChipWidget( + icon: AppAssets.hmc, + iconHasColor: false, + labelText: "Medical Centers".needTranslation, + shape: RoundedRectangleBorder( + side: BorderSide( + color: selectedFacility == FacilitySelection.HMC + ? AppColors.errorColor + : AppColors.chipBorderColorOpacity20, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + backgroundColor: + selectedFacility == FacilitySelection.HMC + ?AppColors.secondaryLightRedColor: AppColors.whiteColor, + textColor: selectedFacility == FacilitySelection.HMC + ? AppColors.errorColor + : AppColors.blackColor, + ).onPress((){ + onitemClicked(FacilitySelection.HMC); + }), + ), + ], + ); + } +} diff --git a/lib/presentation/emergency_services/emergency_services_page.dart b/lib/presentation/emergency_services/emergency_services_page.dart new file mode 100644 index 0000000..3cbce23 --- /dev/null +++ b/lib/presentation/emergency_services/emergency_services_page.dart @@ -0,0 +1,428 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/RRT/rrt_request_type_select.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/call_ambulance_page.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/ambulance_option_selection_bottomsheet.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/pickup_location.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/history/er_history_listing.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/nearest_er_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:lottie/lottie.dart'; +import 'package:provider/provider.dart'; + +class EmergencyServicesPage extends StatelessWidget { + EmergencyServicesPage({super.key}); + + late EmergencyServicesViewModel emergencyServicesViewModel; + LocationUtils? locationUtils; + + @override + Widget build(BuildContext context) { + emergencyServicesViewModel = Provider.of(context, listen: false); + locationUtils = getIt.get(); + locationUtils!.isShowConfirmDialog = true; + return CollapsingListView( + title: LocaleKeys.emergencyServices.tr(), + requests: () { + Navigator.of(context).push(CustomPageRoute(page: ErHistoryListing(), direction: AxisDirection.up)); + }, + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.call_ambulance_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Call Ambulance".needTranslation.toText16(isBold: true, color: AppColors.blackColor), + "Request an ambulance in emergency from home or hospital".needTranslation.toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + ], + ), + ), + SizedBox(width: 12.h), + Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, width: 13.h, height: 13.h), + ], + ).onPress(() { + + + showCommonBottomSheetWithoutHeight( + context, + child: Container( + decoration: + RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.primaryRedColor, + borderRadius: 24.h, + ), + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "".toText14(), + Utils.buildSvgWithAssets( + icon: AppAssets.cancel_circle_icon, + iconColor: AppColors.whiteColor, + width: 24.h, + height: 24.h, + fit: BoxFit.contain, + ).onPress(() { + Navigator.of(context).pop(); + }), + ], + ), + Lottie.asset(AppAnimations.ambulance_alert, + repeat: false, + reverse: false, + frameRate: FrameRate(60), + width: 120.h, + height: 120.h, + fit: BoxFit.contain), + SizedBox(height: 8.h), + "Confirmation".needTranslation.toText28( + color: AppColors.whiteColor, isBold: true), + SizedBox(height: 8.h), + "Are you sure you want to call an ambulance?" + .needTranslation + .toText14( + color: AppColors.whiteColor, + weight: FontWeight.w500), + SizedBox(height: 24.h), + CustomButton( + text: LocaleKeys.confirm.tr(context: context), + onPressed: () async { + // + Navigator.of(context).pop(); + await emergencyServicesViewModel.getTransportationOption(); + openTranportationSelectionBottomSheet(context); + }, + backgroundColor: AppColors.whiteColor, + borderColor: AppColors.whiteColor, + textColor: AppColors.primaryRedColor, + icon: AppAssets.checkmark_icon, + iconColor: AppColors.primaryRedColor, + ), + SizedBox(height: 8.h), + ], + ), + ), + ), + isFullScreen: false, + isCloseButtonVisible: false, + hasBottomPadding: false, + backgroundColor: AppColors.primaryRedColor, + callBackFunc: () {}, + ); + }), + ), + SizedBox(height: 16.h), + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.nearest_er_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Nearest ER Location".needTranslation.toText16(isBold: true, color: AppColors.blackColor), + "Get the details of nearest branch including directions".needTranslation.toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + ], + ), + ), + SizedBox(width: 12.h), + Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, width: 13.h, height: 13.h), + ], + ).onPress(() { + context.read().navigateToNearestERPage(); + }), + ), + SizedBox(height: 16.h), + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.rrt_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Rapid Response Team (RRT)".toText16(isBold: true, color: AppColors.blackColor), + "Comprehensive medical service for all sorts of urgent and stable cases".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + ], + ), + ), + SizedBox(width: 12.h), + Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, width: 13.h, height: 13.h), + ], + ).onPress(() { + showCommonBottomSheetWithoutHeight( + context, + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.primaryRedColor, + borderRadius: 24.h, + ), + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "".toText14(), + Utils.buildSvgWithAssets( + icon: AppAssets.cancel_circle_icon, + iconColor: AppColors.whiteColor, + width: 24.h, + height: 24.h, + fit: BoxFit.contain, + ).onPress(() { + Navigator.of(context).pop(); + }), + ], + ), + Lottie.asset(AppAnimations.ambulance_alert, repeat: false, reverse: false, frameRate: FrameRate(60), width: 120.h, height: 120.h, fit: BoxFit.contain), + SizedBox(height: 8.h), + LocaleKeys.confirm.tr().toText28(color: AppColors.whiteColor, isBold: true), + SizedBox(height: 8.h), + "Are you sure you want to call Rapid Response Team (RRT)?".needTranslation.toText14(color: AppColors.whiteColor, weight: FontWeight.w500), + SizedBox(height: 24.h), + CustomButton( + text: LocaleKeys.confirm.tr(context: context), + onPressed: () async { + Navigator.of(context).pop(); + + LoaderBottomSheet.showLoader(); + await emergencyServicesViewModel.getRRTProcedures(onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + title: "Rapid Response Team (RRT)".needTranslation, + context, + child: RrtRequestTypeSelect(), + isFullScreen: false, + isCloseButtonVisible: true, + hasBottomPadding: false, + backgroundColor: AppColors.bottomSheetBgColor, + callBackFunc: () {}, + ); + }); + }, + backgroundColor: AppColors.whiteColor, + borderColor: AppColors.whiteColor, + textColor: AppColors.primaryRedColor, + icon: AppAssets.checkmark_icon, + iconColor: AppColors.primaryRedColor, + ), + SizedBox(height: 8.h), + ], + ), + ), + ), + isFullScreen: false, + isCloseButtonVisible: false, + hasBottomPadding: false, + backgroundColor: AppColors.primaryRedColor, + callBackFunc: () {}, + ); + }), + ), + SizedBox(height: 16.h), + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.rrt_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Emergency Check-In".needTranslation.toText16(isBold: true, color: AppColors.blackColor), + "Prior ER Check-In to skip the line & payment at the reception.".needTranslation.toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + ], + ), + ), + SizedBox(width: 12.h), + Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, width: 13.h, height: 13.h), + ], + ).onPress(() { + showCommonBottomSheetWithoutHeight( + context, + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.primaryRedColor, + borderRadius: 24.h, + ), + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "".toText14(), + Utils.buildSvgWithAssets( + icon: AppAssets.cancel_circle_icon, + iconColor: AppColors.whiteColor, + width: 24.h, + height: 24.h, + fit: BoxFit.contain, + ).onPress(() { + Navigator.of(context).pop(); + }), + ], + ), + Lottie.asset(AppAnimations.ambulance_alert, repeat: false, reverse: false, frameRate: FrameRate(60), width: 120.h, height: 120.h, fit: BoxFit.contain), + SizedBox(height: 8.h), + LocaleKeys.confirm.tr().toText28(color: AppColors.whiteColor, isBold: true), + SizedBox(height: 8.h), + "Are you sure you want to make ER Check-In?".needTranslation.toText14(color: AppColors.whiteColor, weight: FontWeight.w500), + SizedBox(height: 24.h), + CustomButton( + text: LocaleKeys.confirm.tr(context: context), + onPressed: () async { + Navigator.of(context).pop(); + LoaderBottomSheet.showLoader(loadingText: "Checking your ER Appointment status...".needTranslation); + await context.read().checkPatientERAdvanceBalance(onSuccess: (dynamic response) { + LoaderBottomSheet.hideLoader(); + context.read().navigateToEROnlineCheckIn(); + }); + }, + backgroundColor: AppColors.whiteColor, + borderColor: AppColors.whiteColor, + textColor: AppColors.primaryRedColor, + icon: AppAssets.checkmark_icon, + iconColor: AppColors.primaryRedColor, + ), + SizedBox(height: 8.h), + ], + ), + ), + ), + isFullScreen: false, + isCloseButtonVisible: false, + hasBottomPadding: false, + backgroundColor: AppColors.primaryRedColor, + callBackFunc: () {}, + ); + }), + ), + ], + ), + ), + ); + } + + openPickupDetailsBottomSheet(BuildContext context){ + showCommonBottomSheetWithoutHeight( + onCloseClicked: (){ + context + .read() + .flushPickupInformation(); + }, + titleWidget: Transform.flip( + flipX: emergencyServicesViewModel.isArabic ? true : false, + child: Utils.buildSvgWithAssets( + icon: AppAssets.arrow_back, + iconColor: Color(0xff2B353E), + fit: BoxFit.contain, + ), + ).onPress(() { + context + .read() + .flushPickupInformation(); + Navigator.pop(context); + openTranportationSelectionBottomSheet(context); + }), + context, + child: PickupLocation( + onTap: () { + Navigator.of(context).pop(); + context.read().flushSearchPredictions(); + context + .read() + .navigateTOAmbulancePage(); + }), + isFullScreen: false, + isCloseButtonVisible: true, + hasBottomPadding: false, + + backgroundColor: AppColors.bottomSheetBgColor, + callBackFunc: () {}, + ); + } + + void openTranportationSelectionBottomSheet(BuildContext context) { + if(emergencyServicesViewModel.transportationOptions.isNotEmpty) { + showCommonBottomSheetWithoutHeight( + title: "Transport Options".needTranslation, + context, + child: SizedBox( + height: 400.h, + child: AmbulanceOptionSelectionBottomSheet( + onTap: () { + Navigator.of(context).pop(); + openPickupDetailsBottomSheet(context); + // context + // .read() + // .navigateTOAmbulancePage(); + }), + ), + isFullScreen: false, + isCloseButtonVisible: true, + hasBottomPadding: false, + backgroundColor: AppColors.bottomSheetBgColor, + callBackFunc: () {}, + ); + } + } +} diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart new file mode 100644 index 0000000..0dfd081 --- /dev/null +++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart @@ -0,0 +1,181 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_nfc_kit/flutter_nfc_kit.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/er_online_checkin/er_online_checkin_select_checkin_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/nfc/nfc_reader_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +import '../call_ambulance/widgets/HospitalBottomSheetBody.dart'; + +class ErOnlineCheckinHome extends StatelessWidget { + ErOnlineCheckinHome({super.key}); + + late EmergencyServicesViewModel emergencyServicesViewModel; + bool _supportsNFC = false; + + @override + Widget build(BuildContext context) { + emergencyServicesViewModel = Provider.of(context, listen: false); + FlutterNfcKit.nfcAvailability.then((value) { + _supportsNFC = (value == NFCAvailability.available); + }); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Emergency Check-In".needTranslation, + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.immediate_service_icon, width: 58.h, height: 58.h), + SizedBox(width: 18.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Online Check-In".needTranslation.toText18(color: AppColors.textColor, isBold: true), + "This service lets patients to register their ER appointment prior to arrival.".needTranslation.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ), + ], + ), + ], + ), + ), + ), + ), + ), + CustomButton( + text: emergencyServicesViewModel.patientHasAdvanceERBalance ? LocaleKeys.checkinOption.tr() : LocaleKeys.bookAppo.tr(), + onPressed: () async { + if (emergencyServicesViewModel.patientHasAdvanceERBalance) { + Future.delayed(const Duration(milliseconds: 500), () { + showNfcReader(context, onNcfScan: (String nfcId) { + Future.delayed(const Duration(milliseconds: 100), () async { + print(nfcId); + LoaderBottomSheet.showLoader(loadingText: "Processing check-in...".needTranslation); + await emergencyServicesViewModel.getProjectIDFromNFC( + nfcCode: nfcId, + onSuccess: (value) async { + await emergencyServicesViewModel.autoGenerateInvoiceERClinic( + projectID: value, + onSuccess: (value) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight(context, + title: LocaleKeys.onlineCheckIn.tr(), + child: Utils.getSuccessWidget(loadingText: "Your ER Online Check-In has been successfully done. Please proceed to the waiting area.".needTranslation), + callBackFunc: () { + Navigator.pushAndRemoveUntil( + context, + CustomPageRoute( + page: LandingNavigation(), + ), + (r) => false); + }, isFullScreen: false); + }, + onError: (errMessage) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Unexpected error occurred during check-in. Please contact support.".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }, + onError: (err) {}); + }); + }, onCancel: () {}); + }); + // showCommonBottomSheetWithoutHeight(context, + // title: LocaleKeys.onlineCheckIn.tr(), + // child: ErOnlineCheckinSelectCheckinBottomSheet( + // projectID: 15, + // ), + // callBackFunc: () {}, + // isFullScreen: false); + } else { + LoaderBottomSheet.showLoader(loadingText: "Fetching hospitals list...".needTranslation); + await context.read().getProjects(); + LoaderBottomSheet.hideLoader(); + //Project Selection Dropdown + showHospitalBottomSheet(context); + } + }, + backgroundColor: emergencyServicesViewModel.patientHasAdvanceERBalance ? AppColors.alertColor : AppColors.primaryRedColor, + borderColor: emergencyServicesViewModel.patientHasAdvanceERBalance ? AppColors.alertColor : AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 10.r, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + icon: emergencyServicesViewModel.patientHasAdvanceERBalance ? AppAssets.appointment_checkin_icon : AppAssets.bookAppoBottom, + iconColor: AppColors.whiteColor, + iconSize: 18.h, + ).paddingSymmetrical(24.h, 24.h), + ], + ), + ); + } + + showHospitalBottomSheet(BuildContext context) { + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.selectHospital.tr(), + context, + child: Consumer( + builder: (_, vm, __) => HospitalBottomSheetBody( + displayList: vm.displayList, + onFacilityClicked: (value) { + vm.setSelectedFacility(value); + vm.getDisplayList(); + }, + onHospitalClicked: (hospital) async { + Navigator.pop(context); + vm.setSelectedHospital(hospital); + LoaderBottomSheet.showLoader(loadingText: "Fetching payment information...".needTranslation); + await vm.getPatientERPaymentInformation(onSuccess: (response) { + LoaderBottomSheet.hideLoader(); + vm.navigateToEROnlineCheckInPaymentPage(); + }); + }, + onHospitalSearch: (value) { + vm.searchHospitals(value ?? ""); + }, + selectedFacility: vm.selectedFacility, + hmcCount: vm.hmcCount, + hmgCount: vm.hmgCount, + searchText: vm.searchController, + ), + ), + isFullScreen: false, + isCloseButtonVisible: true, + hasBottomPadding: false, + backgroundColor: AppColors.bottomSheetBgColor, + callBackFunc: () {}, + ); + } +} diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_details_page.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_details_page.dart new file mode 100644 index 0000000..3aa975d --- /dev/null +++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_details_page.dart @@ -0,0 +1,177 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class ErOnlineCheckinPaymentDetailsPage extends StatelessWidget { + ErOnlineCheckinPaymentDetailsPage({super.key}); + + late AppState appState; + late EmergencyServicesViewModel emergencyServicesViewModel; + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + emergencyServicesViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Emergency Check-In".needTranslation, + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "ER Visit Details".needTranslation.toText18(color: AppColors.textColor, isBold: true), + SizedBox(height: 24.h), + Row( + children: [ + "${appState.getAuthenticatedUser()!.firstName!} ${appState.getAuthenticatedUser()!.lastName!}".toText14(color: AppColors.textColor, isBold: true), + ], + ), + SizedBox(height: 12.h), + Wrap( + direction: Axis.horizontal, + spacing: 6.w, + runSpacing: 6.h, + children: [ + AppCustomChipWidget( + labelText: "File No.: ${appState.getAuthenticatedUser()!.patientId!.toString()}", + labelPadding: EdgeInsetsDirectional.only(start: 4.w, end: 4.w), + ), + AppCustomChipWidget( + labelText: "ER Clinic".needTranslation, + labelPadding: EdgeInsetsDirectional.only(start: 4.w, end: 4.w), + ), + AppCustomChipWidget( + labelText: emergencyServicesViewModel.selectedHospital!.name, + labelPadding: EdgeInsetsDirectional.only(start: 4.w, end: 4.w), + ), + AppCustomChipWidget( + icon: AppAssets.calendar, + labelText: DateUtil.formatDateToDate(DateTime.now(), false), + labelPadding: EdgeInsetsDirectional.only(start: 4.w, end: 4.w), + ), + ], + ), + SizedBox(height: 12.h), + ], + ), + ), + ) + ], + ), + ), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: SizedBox( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Amount before tax".needTranslation.toText18(isBold: true), + Utils.getPaymentAmountWithSymbol(emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShare.toString().toText16(isBold: true), AppColors.blackColor, 13, + isSaudiCurrency: true), + ], + ), + SizedBox(height: 4.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: "".toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor)), + "VAT 15% (${emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientTaxAmount})" + .needTranslation + .toText14(isBold: true, color: AppColors.greyTextColor, letterSpacing: -1), + ], + ), + SizedBox(height: 18.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: 150.h, + child: Utils.getPaymentMethods(), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Utils.getPaymentAmountWithSymbol( + emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax.toString().toText24(isBold: true), AppColors.blackColor, 17, + isSaudiCurrency: true), + ], + ), + ], + ) + ], + ).paddingOnly(left: 16.h, top: 24.h, right: 16.h, bottom: 0.h), + CustomButton( + text: LocaleKeys.payNow.tr(), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute(page: ErOnlineCheckinPaymentPage()), + ); + }, + backgroundColor: AppColors.infoColor, + borderColor: AppColors.infoColor.withOpacity(0.01), + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 56.h, + icon: AppAssets.appointment_pay_icon, + iconColor: AppColors.whiteColor, + iconSize: 18.h, + ).paddingSymmetrical(16.h, 24.h), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart new file mode 100644 index 0000000..a3524fd --- /dev/null +++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart @@ -0,0 +1,510 @@ +import 'dart:async'; +import 'dart:developer'; +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/in_app_browser/InAppBrowser.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; +import 'package:smooth_corner/smooth_corner.dart'; + +class ErOnlineCheckinPaymentPage extends StatefulWidget { + ErOnlineCheckinPaymentPage({super.key}); + + @override + State createState() => _ErOnlineCheckinPaymentPageState(); +} + +class _ErOnlineCheckinPaymentPageState extends State { + late PayfortViewModel payfortViewModel; + late EmergencyServicesViewModel emergencyServicesViewModel; + + late AppState appState; + + MyInAppBrowser? browser; + + String selectedPaymentMethod = ""; + + String transID = ""; + + bool isShowTamara = false; + + String tamaraPaymentStatus = ""; + + String tamaraOrderID = ""; + + @override + void initState() { + scheduleMicrotask(() { + payfortViewModel.initPayfortViewModel(); + // payfortViewModel.getTamaraInstallmentsDetails().then((val) { + // if (emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax! >= payfortViewModel.getTamaraInstallmentsDetailsResponseModel!.minLimit!.amount! && + // emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax! <= payfortViewModel.getTamaraInstallmentsDetailsResponseModel!.maxLimit!.amount!) { + // setState(() { + // isShowTamara = true; + // }); + // } + // }); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + payfortViewModel = Provider.of(context, listen: false); + emergencyServicesViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Emergency Check-In".needTranslation, + child: SingleChildScrollView( + child: Column( + children: [ + SizedBox(height: 24.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.mada, width: 72.h, height: 25.h), + SizedBox(height: 16.h), + "Mada".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.blackColor, + width: 40.h, + height: 40.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "MADA"; + openPaymentURL("mada"); + }), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.asset(AppAssets.visa, width: 50.h, height: 50.h), + SizedBox(width: 8.h), + Image.asset(AppAssets.Mastercard, width: 40.h, height: 40.h), + ], + ), + SizedBox(height: 16.h), + "Visa or Mastercard".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.blackColor, + width: 40.h, + height: 40.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "VISA"; + openPaymentURL("visa"); + }), + SizedBox(height: 16.h), + isShowTamara + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.tamara_en, width: 72.h, height: 25.h), + SizedBox(height: 16.h), + "Tamara".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.blackColor, + width: 40.h, + height: 40.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "TAMARA"; + openPaymentURL("tamara"); + }) + : SizedBox.shrink(), + ], + ), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Consumer(builder: (context, payfortVM, child) { + //TODO: Need to add loading state & animation for Apple Pay Configuration + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.isCash ?? true) + ? Container( + height: 50.h, + decoration: ShapeDecoration( + color: AppColors.secondaryLightRedBorderColor, + shape: SmoothRectangleBorder( + borderRadius: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)), + smoothness: 1, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Insurance expired or inactive".needTranslation.toText14(color: AppColors.primaryRedColor, weight: FontWeight.w500).paddingSymmetrical(24.h, 0.h), + CustomButton( + text: LocaleKeys.updateInsurance.tr(context: context), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: InsuranceHomePage(), + ), + ); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.secondaryLightRedBorderColor, + textColor: AppColors.whiteColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(15, 0, 15, 0), + height: 30.h, + ).paddingSymmetrical(24.h, 0.h), + ], + ), + ) + : const SizedBox(), + SizedBox(height: 24.h), + "Total amount to pay".needTranslation.toText18(isBold: true).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 17.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Amount before tax".needTranslation.toText14(isBold: true), + Utils.getPaymentAmountWithSymbol(emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShare.toString().toText16(isBold: true), AppColors.blackColor, 13, + isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "VAT 15%".needTranslation.toText14(isBold: true, color: AppColors.greyTextColor), + Utils.getPaymentAmountWithSymbol( + emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientTaxAmount.toString().toText14(isBold: true, color: AppColors.greyTextColor), AppColors.greyTextColor, 13, + isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 17.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "".needTranslation.toText14(isBold: true), + Utils.getPaymentAmountWithSymbol(emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax.toString().toText24(isBold: true), AppColors.blackColor, 17, + isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + Platform.isIOS + ? Utils.buildSvgWithAssets( + icon: AppAssets.apple_pay_button, + width: 200.h, + height: 80.h, + fit: BoxFit.contain, + ).paddingSymmetrical(24.h, 0.h).onPress(() { + if (Utils.havePrivilege(103)) { + startApplePay(); + } else { + openPaymentURL("ApplePay"); + } + }) + : SizedBox(height: 12.h), + SizedBox(height: 12.h), + ], + ); + }), + ), + ], + ), + ); + } + + openPaymentURL(String paymentMethod) { + browser = MyInAppBrowser(onExitCallback: onBrowserExit, onLoadStartCallback: onBrowserLoadStart, context: context); + transID = Utils.getAdvancePaymentTransID( + emergencyServicesViewModel.selectedHospital!.iD, + appState.getAuthenticatedUser()!.patientId!, + ); + + //TODO: Need to pass dynamic params to the payment request instead of static values + browser?.openPaymentBrowser( + emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax!, + "ER Online Check-In Payment", + transID, + emergencyServicesViewModel.selectedHospital!.iD.toString(), + "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", + selectedPaymentMethod, + appState.getAuthenticatedUser()!.patientType.toString(), + "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", + appState.getAuthenticatedUser()!.patientId.toString(), + appState.getAuthenticatedUser()!, + browser!, + false, + "3", + "", + context, + null, + 0, + 10, + 0, + "3"); + } + + startApplePay() async { + // showCommonBottomSheet(context, + // child: Utils.getLoadingWidget(), callBackFunc: (str) {}, title: "", height: ResponsiveExtension.screenHeight * 0.3, isCloseButtonVisible: false, isDismissible: false, isFullScreen: false); + LoaderBottomSheet.showLoader(); + transID = Utils.getAdvancePaymentTransID( + emergencyServicesViewModel.selectedHospital!.iD, + appState.getAuthenticatedUser()!.patientId!, + ); + + ApplePayInsertRequest applePayInsertRequest = ApplePayInsertRequest(); + + await payfortViewModel.getPayfortConfigurations(serviceId: ServiceTypeEnum.erOnlineCheckIn.getIdFromServiceEnum(), projectId: emergencyServicesViewModel.selectedHospital!.iD); + + applePayInsertRequest.clientRequestID = transID; + applePayInsertRequest.clinicID = 10; + + applePayInsertRequest.currency = appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED"; + applePayInsertRequest.customerEmail = "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com"; + applePayInsertRequest.customerID = appState.getAuthenticatedUser()!.patientId.toString(); + applePayInsertRequest.customerName = "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}"; + + applePayInsertRequest.deviceToken = await Utils.getStringFromPrefs(CacheConst.pushToken); + applePayInsertRequest.voipToken = await Utils.getStringFromPrefs(CacheConst.voipToken); + applePayInsertRequest.doctorID = 0; + applePayInsertRequest.projectID = emergencyServicesViewModel.selectedHospital!.iD.toString(); + applePayInsertRequest.serviceID = ServiceTypeEnum.erOnlineCheckIn.getIdFromServiceEnum().toString(); + applePayInsertRequest.channelID = 3; + applePayInsertRequest.patientID = appState.getAuthenticatedUser()!.patientId.toString(); + applePayInsertRequest.patientTypeID = appState.getAuthenticatedUser()!.patientType; + applePayInsertRequest.patientOutSA = appState.getAuthenticatedUser()!.outSa; + applePayInsertRequest.appointmentDate = null; + applePayInsertRequest.appointmentNo = 0; + applePayInsertRequest.orderDescription = "ER Online Check-In Payment"; + applePayInsertRequest.liveServiceID = "0"; + applePayInsertRequest.latitude = "0.0"; + applePayInsertRequest.longitude = "0.0"; + applePayInsertRequest.amount = emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax!.toString(); + applePayInsertRequest.isSchedule = "0"; + applePayInsertRequest.language = appState.isArabic() ? 'ar' : 'en'; + applePayInsertRequest.languageID = appState.isArabic() ? 1 : 2; + applePayInsertRequest.userName = appState.getAuthenticatedUser()!.patientId; + applePayInsertRequest.responseContinueURL = "http://hmg.com/Documents/success.html"; + applePayInsertRequest.backClickUrl = "http://hmg.com/Documents/success.html"; + applePayInsertRequest.paymentOption = "ApplePay"; + + applePayInsertRequest.isMobSDK = true; + applePayInsertRequest.merchantReference = transID; + applePayInsertRequest.merchantIdentifier = payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier; + applePayInsertRequest.commandType = "PURCHASE"; + applePayInsertRequest.signature = payfortViewModel.payfortProjectDetailsRespModel!.signature; + applePayInsertRequest.accessCode = payfortViewModel.payfortProjectDetailsRespModel!.accessCode; + applePayInsertRequest.shaRequestPhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaRequest; + applePayInsertRequest.shaResponsePhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaResponse; + applePayInsertRequest.returnURL = ""; + + //TODO: Need to pass dynamic params to the Apple Pay instead of static values + await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) { + payfortViewModel.paymentWithApplePay( + customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", + // customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress, + customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", + orderDescription: "Appointment Payment", + orderAmount: double.parse(emergencyServicesViewModel.erOnlineCheckInPaymentDetailsResponse.patientShareWithTax!.toString()), + merchantReference: transID, + merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier, + applePayAccessCode: payfortViewModel.payfortProjectDetailsRespModel!.accessCode, + applePayShaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel!.shaRequest, + currency: appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED", + onFailed: (failureResult) async { + log("failureResult: ${failureResult.message.toString()}"); + Navigator.of(context).pop(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: failureResult.message.toString()), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }, + onSucceeded: (successResult) async { + log("successResult: ${successResult.responseMessage.toString()}"); + selectedPaymentMethod = successResult.paymentOption ?? "VISA"; + checkPaymentStatus(); + }, + ); + }); + } + + void checkPaymentStatus() async { + LoaderBottomSheet.showLoader(loadingText: "Checking payment status, Please wait...".needTranslation); + await payfortViewModel.checkPaymentStatus( + transactionID: transID, + onSuccess: (apiResponse) async { + print(apiResponse.data); + if (payfortViewModel.payfortCheckPaymentStatusResponseModel!.responseMessage!.toLowerCase() == "success") { + if (emergencyServicesViewModel.isERBookAppointment) { + await emergencyServicesViewModel.ER_CreateAdvancePayment( + paymentMethodName: selectedPaymentMethod, + paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!, + onSuccess: (value) async { + await emergencyServicesViewModel.addAdvanceNumberRequest( + advanceNumber: value, + paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!, + appointmentNo: "0", + onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + if (emergencyServicesViewModel.isERBookAppointment) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getSuccessWidget(loadingText: "Your appointment has been booked successfully. Please perform Check-In once you arrive at the hospital.".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } else {} + }); + }); + } else {} + } else { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Payment Failed! Please try again.".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }); + } + + onBrowserLoadStart(String url) { + print("onBrowserLoadStart"); + print(url); + + if (selectedPaymentMethod == "tamara") { + if (Platform.isAndroid) { + Uri uri = new Uri.dataFromString(url); + tamaraPaymentStatus = uri.queryParameters['status']!; + tamaraOrderID = uri.queryParameters['AuthorizePaymentId']!; + } else { + Uri uri = new Uri.dataFromString(url); + tamaraPaymentStatus = uri.queryParameters['paymentStatus']!; + tamaraOrderID = uri.queryParameters['orderId']!; + } + } + + // if(selectedPaymentMethod != "TAMARA") { + MyInAppBrowser.successURLS.forEach((element) { + if (url.contains(element)) { + browser?.close(); + MyInAppBrowser.isPaymentDone = true; + return; + } + }); + // } + + // if(selectedPaymentMethod != "TAMARA") { + MyInAppBrowser.errorURLS.forEach((element) { + if (url.contains(element)) { + browser?.close(); + MyInAppBrowser.isPaymentDone = false; + return; + } + }); + // } + } + + onBrowserExit(bool isPaymentMade) async { + checkPaymentStatus(); + } +} diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_select_checkin_bottom_sheet.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_select_checkin_bottom_sheet.dart new file mode 100644 index 0000000..0b22417 --- /dev/null +++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_select_checkin_bottom_sheet.dart @@ -0,0 +1,169 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_nfc_kit/flutter_nfc_kit.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/common_models/privilege/ProjectDetailListModel.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:barcode_scan2/barcode_scan2.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/nfc/nfc_reader_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; + +class ErOnlineCheckinSelectCheckinBottomSheet extends StatelessWidget { + ErOnlineCheckinSelectCheckinBottomSheet({super.key, required this.projectID}); + + bool _supportsNFC = false; + int projectID = 0; + + late LocationUtils locationUtils; + late AppState appState; + ProjectDetailListModel projectDetailListModel = ProjectDetailListModel(); + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + FlutterNfcKit.nfcAvailability.then((value) { + _supportsNFC = (value == NFCAvailability.available); + }); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + checkInOptionCard( + AppAssets.checkin_location_icon, + "Live Location".needTranslation, + "Verify your location to be at hospital to check in".needTranslation, + ).onPress(() { + // locationUtils = LocationUtils( + // isShowConfirmDialog: false, + // navigationService: myAppointmentsViewModel.navigationService, + // appState: myAppointmentsViewModel.appState, + // ); + locationUtils.getCurrentLocation(onSuccess: (value) { + projectDetailListModel = Utils.getProjectDetailObj(appState, projectID); + double dist = Utils.distance(value.latitude, value.longitude, double.parse(projectDetailListModel.latitude!), double.parse(projectDetailListModel.longitude!)).ceilToDouble() * 1000; + print(dist); + if (dist <= projectDetailListModel.geofenceRadius!) { + sendCheckInRequest(projectDetailListModel.checkInQrCode!, context); + } else { + showCommonBottomSheetWithoutHeight(context, + title: "Error".needTranslation, + child: Utils.getErrorWidget(loadingText: "Please ensure you're within the hospital location to perform online check-in.".needTranslation), callBackFunc: () { + Navigator.of(context).pop(); + }, isFullScreen: false); + } + }); + }), + SizedBox(height: 16.h), + checkInOptionCard( + AppAssets.checkin_nfc_icon, + "NFC (Near Field Communication)".needTranslation, + "Scan your phone via NFC board to check in".needTranslation, + ).onPress(() { + Future.delayed(const Duration(milliseconds: 500), () { + showNfcReader(context, onNcfScan: (String nfcId) { + Future.delayed(const Duration(milliseconds: 100), () { + sendCheckInRequest(nfcId, context); + }); + }, onCancel: () {}); + }); + }), + SizedBox(height: 16.h), + checkInOptionCard( + AppAssets.checkin_qr_icon, + "QR Code".needTranslation, + "Scan QR code with your camera to check in".needTranslation, + ).onPress(() async { + String onlineCheckInQRCode = (await BarcodeScanner.scan().then((value) => value.rawContent)); + if (onlineCheckInQRCode != "") { + sendCheckInRequest(onlineCheckInQRCode, context); + } else {} + }), + ], + ); + } + + Widget checkInOptionCard(String icon, String title, String subTitle) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: icon, width: 40.h, height: 40.h, fit: BoxFit.fill), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title.toText16(isBold: true, color: AppColors.textColor), + subTitle.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ), + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ), + ), + ], + ), + ], + ).paddingAll(16.h), + ); + } + + void sendCheckInRequest(String scannedCode, BuildContext context) async { + showCommonBottomSheet(context, + child: Utils.getLoadingWidget(), callBackFunc: (str) {}, title: "", height: ResponsiveExtension.screenHeight * 0.3, isCloseButtonVisible: false, isDismissible: false, isFullScreen: false); + // await myAppointmentsViewModel.sendCheckInNfcRequest( + // patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + // scannedCode: scannedCode, + // checkInType: 2, + // onSuccess: (apiResponse) { + // Navigator.of(context).pop(); + // showCommonBottomSheetWithoutHeight(context, title: "Success".needTranslation, child: Utils.getSuccessWidget(loadingText: LocaleKeys.success.tr()), callBackFunc: () { + // Navigator.of(context).pop(); + // Navigator.pushAndRemoveUntil( + // context, + // CustomPageRoute( + // page: LandingNavigation(), + // ), + // (r) => false); + // Navigator.of(context).push( + // CustomPageRoute(page: MyAppointmentsPage()), + // ); + // }, isFullScreen: false); + // }, + // onError: (error) { + // Navigator.of(context).pop(); + // showCommonBottomSheetWithoutHeight(context, title: "Error".needTranslation, child: Utils.getErrorWidget(loadingText: error), callBackFunc: () { + // Navigator.of(context).pop(); + // }, isFullScreen: false); + // }, + // ); + } +} diff --git a/lib/presentation/emergency_services/history/er_history_listing.dart b/lib/presentation/emergency_services/history/er_history_listing.dart new file mode 100644 index 0000000..e5dd1e4 --- /dev/null +++ b/lib/presentation/emergency_services/history/er_history_listing.dart @@ -0,0 +1,62 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/history/widget/ambulance_history_item.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:provider/provider.dart'; + +class ErHistoryListing extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "History Log".needTranslation, + child: SingleChildScrollView( + physics: NeverScrollableScrollPhysics(), + child: Column( + children: [Visibility( + visible: context + .read() + .orders + ?.isNotEmpty == true, + child: ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: context + .read() + .orders + ?.length ?? 0, + itemBuilder: (_, index) => + Consumer( builder: (_, vm, __)=> + AmbulanceHistoryItem(order: vm.orders![index]), + ) + ), + ),] + ).paddingAll(16.h) + + )) + + ), + + + Visibility( + visible: context + .read() + .orders + ?.isEmpty == true, + child: Utils.getNoDataWidget(context, + noDataText: "You don't have any history" + .needTranslation)), + ], + ), + ); + } +} diff --git a/lib/presentation/emergency_services/history/widget/RequestStatus.dart b/lib/presentation/emergency_services/history/widget/RequestStatus.dart new file mode 100644 index 0000000..de95bdc --- /dev/null +++ b/lib/presentation/emergency_services/history/widget/RequestStatus.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; + +class RequestStatus extends StatelessWidget { + final int status; + + const RequestStatus({super.key, required this.status}); + + @override + Widget build(BuildContext context) { + return AppCustomChipWidget( + labelText: getTitle(status), + backgroundColor: getBackgroundColor(status), + textColor: getTextColor(status), + ); + } + + String? getTitle(int status) { + switch (status) { + case 1: //pending + case 2: //processing + return "Under Processing".needTranslation; + case 3: //completed + return "Completed".needTranslation; + break; + case 4: //cancel + case 6: + case 7: + return "Canceled by patient".needTranslation; + break; + } + return null; + } + + Color? getBackgroundColor(int status) { + switch (status) { + case 1: //pending + case 2: //processing + case 3: //completed + return AppColors.switchBackgroundColor; + break; + case 4: //cancel + case 6: + case 7: + return AppColors.lightRedButtonColor; + break; + } + return null; + } + + Color? getTextColor(int status) { + switch (status) { + case 1: //pending + case 2: + return AppColors.successColor;//processing + case 3: //completed + case 4: //cancel + case 6: + case 7: + return AppColors.errorColor; + break; + } + return null; + } +} diff --git a/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart b/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart new file mode 100644 index 0000000..5f4c8b2 --- /dev/null +++ b/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/AmbulanceRequestOrdersModel.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/history/widget/RequestStatus.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:provider/provider.dart'; + +import '../../../../core/utils/utils.dart'; + + +class AmbulanceHistoryItem extends StatelessWidget { + final AmbulanceRequestOrdersModel order; + + const AmbulanceHistoryItem({super.key, required this.order}); + + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: Colors.white, + hasShadow: true, + customBorder: BorderRadius.all( + Radius.circular(20.h), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8.h, + children: [ + RequestStatus(status: order.statusId ?? 0), + "Req ID: ${order.iD}".toText16(color: AppColors.textColor, weight: FontWeight.w600), + Row( + spacing: 4.w, + children: [ + chip( Utils.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(order.time)), AppAssets.calendar, AppColors.blackBgColor), + chip("Ambulance".needTranslation, AppAssets.ambulance, AppColors.blackBgColor), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Flexible(child: chip(order?.dropOffLocation ?? "", (order.dropOffLocation?.toLowerCase().contains("hospital") == true)?AppAssets.hospital:AppAssets.location_pickup, AppColors + .blackBgColor),) + ], + ), + if (order.statusId == 1 || order.statusId == 2) + CustomButton( + text: "Cancel Request".needTranslation, + onPressed: () async { + openCancelOrderBottomSheet(context); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: Colors.white, + icon: AppAssets.cancel, + ), + ], + ).paddingAll(16.h), + ).paddingOnly(bottom: 16.h); + } + + chip(String title, String iconString, Color iconColor) { + return AppCustomChipWidget( + labelText: title, + icon: iconString, + iconColor: iconColor, + iconSize: 14.h, + ); + } + + openCancelOrderBottomSheet(BuildContext context) { + context.read().cancelOrder(order); + } +} diff --git a/lib/presentation/emergency_services/nearest_er_page.dart b/lib/presentation/emergency_services/nearest_er_page.dart new file mode 100644 index 0000000..13373f1 --- /dev/null +++ b/lib/presentation/emergency_services/nearest_er_page.dart @@ -0,0 +1,104 @@ +import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/ProjectAvgERWaitingTime.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/widgets/nearestERItem.dart' show NearestERItem; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart' show Selector, WatchContext, ReadContext; + +import '../../core/enums.dart' show SelectionTypeEnum; +import '../../core/utils/debouncer.dart' show Debouncer; + +class NearestErPage extends StatefulWidget { + const NearestErPage({super.key}); + + @override + State createState() => _NearestErPageState(); +} + +class _NearestErPageState extends State { + final TextEditingController searchText = TextEditingController(); + final Debouncer debouncer = Debouncer(milliseconds: 500); + + @override + void dispose() { + debouncer.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return CollapsingListView( + title: "Nearest ER".needTranslation, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + TextInputWidget( + labelText: LocaleKeys.search.tr(), + hintText: 'Type any facility name'.needTranslation, + controller: searchText, + onChange: (value) { + debouncer.run(() { + context.read().filterErList(value ?? ''); + }); + }, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + isAllowLeadingIcon: true, + leadingIcon: AppAssets.search_icon, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), + ), + Selector( + selector: (___, viewModel) => viewModel.isERListLoading, + builder: (_, isLoading, __) => Selector>( + selector: (___, viewModel) => viewModel.nearestERFilteredList, + shouldRebuild: (previous, next) => previous != next, + builder: (_, value, __) { + if (isLoading || value.isNotEmpty) { + return ListView.separated( + padding: EdgeInsets.only(top: 24.h), + itemCount: isLoading ? 6 : value.length, + separatorBuilder: (____, _____) => SizedBox( + height: 16.h, + ), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: NearestERItem( + isLoading: isLoading, + nearestERItem: isLoading ? ProjectAvgERWaitingTime() : value[index], + )))); + }, + ); + } else { + return Center(child: Utils.getNoDataWidget(context, noDataText: "No nearest Er Arround you".needTranslation)); + } + }), + ), + ], + ).paddingAll(16.h), + )); + } +} diff --git a/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart b/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart new file mode 100644 index 0000000..559a0a5 --- /dev/null +++ b/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart @@ -0,0 +1,118 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart' + show AnimationConfiguration, SlideAnimation, FadeInAnimation; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/debouncer.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart'; +import 'package:hmg_patient_app_new/features/location/PlacePrediction.dart'; +import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +import '../../../theme/colors.dart'; +import '../../appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart'; + +class LocationInputBottomSheet extends StatelessWidget { + final Debouncer debouncer = Debouncer(milliseconds: 500); + + LocationInputBottomSheet({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextInputWidget( + labelText: LocaleKeys.search.tr(), + hintText: "Search Location".needTranslation, + controller: TextEditingController(), + onChange: (value){ + debouncer.run(() { + context.read().updateSearchQuery(value); + }); + }, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + isAllowLeadingIcon: true, + selectionType: SelectionTypeEnum.search, + padding: EdgeInsets.symmetric( + vertical: 10.h, + horizontal: 15.h, + ), + ), + SizedBox(height: 24.h), + Selector>( + selector: (_, vm) => vm.predictions ?? [], + builder: (context, predictions, _) { + if (predictions.isEmpty) return SizedBox.shrink(); + return Expanded( + child: ListView.separated( + separatorBuilder: (_,__)=>SizedBox(height: 16.h,), + itemCount: predictions.length, + itemBuilder: (_, index) { + final prediction = predictions[index]; + + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder() + .toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: prediction.description.toText14( + color: AppColors.textColor, + weight: FontWeight.w500), + ), + + Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 20.h, + height: 15.h, + fit: BoxFit.contain, + ), + ], + ).paddingAll(24.h),), + ), + ), + ).onPress(() async { + await context.read().selectPlacePrediction(prediction); + Navigator.of(context).pop(); + var location = context.read().placeDetails; + if(location != null) { + context.read().moveController( + Location(lat: location.lat, lng: location.lng)); + } + }); + + }, + ), + ); + }, + ) + ], + ); + } +} diff --git a/lib/presentation/emergency_services/widgets/nearestERItem.dart b/lib/presentation/emergency_services/widgets/nearestERItem.dart new file mode 100644 index 0000000..bbce56a --- /dev/null +++ b/lib/presentation/emergency_services/widgets/nearestERItem.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/ProjectAvgERWaitingTime.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:provider/provider.dart'; + +class NearestERItem extends StatelessWidget { + final ProjectAvgERWaitingTime nearestERItem; + final bool isLoading; + + + const NearestERItem({ super.key, + required this.nearestERItem, + required this.isLoading + }) ; + + @override + Widget build(BuildContext context) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: Colors.white, + customBorder: BorderRadius.only( + topLeft: Radius.circular(24.h), + topRight: Radius.circular(24.h), + ), + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + (isLoading || nearestERItem.projectImageURL?.isEmpty == true) + ? Container( + width: 24.h, + height: 24.h, + decoration: BoxDecoration( + color: Colors.grey.shade300, + shape: BoxShape.circle, + ), + ).toShimmer2(isShow: isLoading) + : Utils.buildImgWithNetwork( + url: nearestERItem.projectImageURL ?? '', + iconColor: Colors.transparent, + ).circle(24.h).toShimmer2(isShow: isLoading), + const SizedBox(width: 12), + Expanded( + child: (nearestERItem.projectName?.toText16( + color: AppColors.textColor, + weight: FontWeight.w600, + ) ?? + SizedBox.shrink()).toShimmer2(isShow: isLoading), + ), + // TODO: Add hospital icon logic here if needed + ], + ), + SizedBox(height: 8.h), + Row( + spacing: 8.h, + children: [ + AppCustomChipWidget( + labelText: "${nearestERItem.distanceInKilometers} km".needTranslation, + icon: AppAssets.location, + iconHasColor: false, + labelPadding: EdgeInsetsDirectional.only(start: 4.h, end: 0.h), + padding: EdgeInsets.all(8.h), + ).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + labelText: "Expected waiting time: ${nearestERItem.getTime()} mins".needTranslation, + icon: AppAssets.waiting_time_clock, + iconHasColor: false, + labelPadding: EdgeInsetsDirectional.only(start: 4.h, end: 0.h), + padding: EdgeInsets.all(8.h), + ).toShimmer2(isShow: isLoading), + ], + ), + SizedBox(height: 16.h), + Row( + children: [ + Expanded( + child: CustomButton( + text: "View Location on Google Maps".needTranslation, + iconSize: 18.h, + icon: AppAssets.location, + onPressed: () { + context.read().openDirections(destLat: double.parse(nearestERItem.latitude??"0.0"), destLng: double.parse(nearestERItem.longitude??"0.0") ); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + iconColor: AppColors.primaryRedColor, + height: 40.h, + fontSize: 14, + fontWeight: FontWeight.w500, + ).toShimmer2(isShow: isLoading), + ), + SizedBox(width: 8.h), + SizedBox( + height: 40.h, + width: 40.h, + child: CustomButton( + text: '', + iconSize: 18.h, + icon: AppAssets.call_fill, + onPressed: () { + context.read().openDialer( nearestERItem.phonenumber??""); + + }, + backgroundColor: AppColors.greyColor, + iconColor: AppColors.textColor, + borderColor: AppColors.greyColor, + height: 40.h, + ).toShimmer2(isShow: isLoading), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/habib_wallet/habib_wallet_page.dart b/lib/presentation/habib_wallet/habib_wallet_page.dart new file mode 100644 index 0000000..a7ec23d --- /dev/null +++ b/lib/presentation/habib_wallet/habib_wallet_page.dart @@ -0,0 +1,117 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/habib_wallet/recharge_wallet_page.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class HabibWalletPage extends StatefulWidget { + const HabibWalletPage({super.key}); + + @override + State createState() => _HabibWalletState(); +} + +class _HabibWalletState extends State { + late HabibWalletViewModel habibWalletVM; + + @override + Widget build(BuildContext context) { + habibWalletVM = Provider.of(context, listen: false); + AppState _appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: LocaleKeys.myWallet.tr(), + child: Padding( + padding: EdgeInsets.all(24.h), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.infinity, + height: 180.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.blackBgColor, + borderRadius: 24, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "${_appState.getAuthenticatedUser()!.firstName!} ${_appState.getAuthenticatedUser()!.lastName!}".toText19(isBold: true, color: AppColors.whiteColor), + "MRN: ${_appState.getAuthenticatedUser()!.patientId!}".toText14(weight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ).expanded, + Utils.buildSvgWithAssets(icon: AppAssets.habiblogo, width: 24.h, height: 24.h), + ], + ), + Spacer(), + LocaleKeys.balanceAmount.tr(context: context).toText14(weight: FontWeight.w500, color: AppColors.whiteColor), + SizedBox(height: 4.h), + Consumer(builder: (context, habibWalletVM, child) { + return Utils.getPaymentAmountWithSymbol2(habibWalletVM.habibWalletAmount, textColor: AppColors.whiteColor, iconColor: AppColors.whiteColor, iconSize: 13, isExpanded: false) + .toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.h, width: 80.h, height: 24.h); + }), + ], + ), + ), + ), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CustomButton( + icon: AppAssets.recharge_icon, + iconSize: 21.h, + text: "Recharge".needTranslation, + onPressed: () { + Navigator.of(context) + .push( + CustomPageRoute( + page: RechargeWalletPage(), + ), + ) + .then((val) { + habibWalletVM.getPatientBalanceAmount(); + }); + }, + backgroundColor: AppColors.infoColor, + borderColor: AppColors.infoColor, + textColor: AppColors.whiteColor, + fontSize: 14, + fontWeight: FontWeight.bold, + borderRadius: 12, + // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + ], + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/habib_wallet/recharge_wallet_page.dart b/lib/presentation/habib_wallet/recharge_wallet_page.dart new file mode 100644 index 0000000..74eebec --- /dev/null +++ b/lib/presentation/habib_wallet/recharge_wallet_page.dart @@ -0,0 +1,309 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/habib_wallet/wallet_payment_confirm_page.dart'; +import 'package:hmg_patient_app_new/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +import 'widgets/select-medical_file.dart'; + +class RechargeWalletPage extends StatefulWidget { + const RechargeWalletPage({super.key}); + + @override + State createState() => _RechargeWalletPageState(); +} + +class _RechargeWalletPageState extends State { + FocusNode textFocusNode = FocusNode(); + + late HabibWalletViewModel habibWalletVM; + late AppState appState; + final TextEditingController amountTextController = TextEditingController(); + + @override + void initState() { + scheduleMicrotask(() { + habibWalletVM.setDepositorDetails(appState.getAuthenticatedUser()!.patientId.toString(), "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", + appState.getAuthenticatedUser()!.mobileNumber!); + habibWalletVM.setSelectedRechargeType(0); + habibWalletVM.getProjectsList(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + habibWalletVM = Provider.of(context, listen: false); + appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: CollapsingListView( + title: LocaleKeys.createAdvancedPayment.tr(context: context), + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 135.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + side: BorderSide(color: AppColors.textColor, width: 2.h), + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + //TODO: Check with hussain to show AED or SAR + "Enter an amount".needTranslation.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + Spacer(), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Utils.getPaymentAmountWithSymbol( + SizedBox( + width: 150.h, + child: TextInputWidget( + controller: amountTextController, + labelText: "", + hintText: "", + isEnable: true, + prefix: null, + isAllowRadius: true, + isBorderAllowed: false, + isAllowLeadingIcon: true, + autoFocus: true, + fontSize: 40, + padding: EdgeInsets.symmetric(horizontal: 8.h, vertical: 0.h), + focusNode: textFocusNode, + isWalletAmountInput: true, + keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true), + // leadingIcon: AppAssets.student_card, + ), + ), + AppColors.textColor, + 13.h, + isExpanded: false), + const Spacer(), + "SAR".needTranslation.toText20(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ], + ), + ), + ), + SizedBox(height: 24.h), + Consumer(builder: (context, habibWalletVM, child) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.my_account_icon, width: 40.h, height: 40.h), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (habibWalletVM.getSelectedRechargeTypeValue()).toText16(color: AppColors.textColor, weight: FontWeight.w500), + "${LocaleKeys.medicalFile.tr(context: context)}: ${habibWalletVM.fileNumber}" + .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + ], + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, width: 25.h, height: 25.h), + ], + ).onPress(() async { + habibWalletVM.setCurrentIndex(0); + showCommonBottomSheetWithoutHeight(context, title: "Select Medical File".needTranslation, + titleWidget: Consumer(builder: (context, habibWalletVM, child) { + return habibWalletVM.currentIndex != 0 + ? IconButton( + icon: Utils.buildSvgWithAssets(icon: AppAssets.arrow_back, width: 24.h, height: 24.h), + padding: EdgeInsets.zero, + onPressed: () => habibWalletVM.setCurrentIndex(0), + highlightColor: Colors.transparent, + ) + : "Select Medical File".needTranslation.toText20(weight: FontWeight.w600); + }), child: Consumer(builder: (context, habibWalletVM, child) { + return MultiPageBottomSheet(); + }), callBackFunc: () {}, isFullScreen: false, isCloseButtonVisible: true); + }), + SizedBox(height: 16.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.select_hospital_icon, width: 40.h, height: 40.h), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.hospital.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500), + SizedBox( + width: MediaQuery.of(context).size.width * 0.55, + child: (habibWalletVM.selectedHospital != null ? habibWalletVM.selectedHospital!.name : LocaleKeys.selectHospital.tr(context: context))! + .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ), + ], + ), + ], + ).onPress(() { + showCommonBottomSheetWithoutHeight(context, + title: LocaleKeys.selectHospital.tr(context: context), isDismissible: false, child: SelectHospitalBottomSheet(), callBackFunc: () {}); + }), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, width: 25.h, height: 25.h), + ], + ), + SizedBox(height: 16.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.email_icon, width: 40.h, height: 40.h), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.email.tr(context: context).toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + "${appState.getAuthenticatedUser()!.emailAddress}".toText16(color: AppColors.textColor, weight: FontWeight.w500), + ], + ), + ], + ), + ], + ), + SizedBox(height: 16.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.notes_icon, width: 40.h, height: 40.h), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.notes.tr(context: context).toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + "Lorem Ipsum".toText16(color: AppColors.textColor, weight: FontWeight.w500), + ], + ), + ], + ), + ], + ), + SizedBox(height: 8.h), + ], + ), + ), + ); + }), + ], + ), + ), + ), + ), + ), + //TODO: Handle Family member selection & Other Account Selection + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: CustomButton( + text: LocaleKeys.next.tr(context: context), + onPressed: () { + if (amountTextController.text.isEmpty) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Please enter amount to continue.".needTranslation), + callBackFunc: () { + textFocusNode.requestFocus(); + }, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } else if (habibWalletVM.selectedHospital == null) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Please select hospital to continue.".needTranslation), + callBackFunc: () { + textFocusNode.requestFocus(); + }, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } else { + habibWalletVM.setWalletRechargeAmount(num.parse(amountTextController.text)); + // habibWalletVM.setDepositorDetails(appState.getAuthenticatedUser()!.patientId.toString(), "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", + // appState.getAuthenticatedUser()!.mobileNumber!); + Navigator.of(context).push( + CustomPageRoute( + page: WalletPaymentConfirmPage(), + ), + ); + } + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + icon: AppAssets.appointment_pay_icon, + iconColor: AppColors.whiteColor, + iconSize: 18.h, + ).paddingSymmetrical(24.h, 24.h), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart b/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart new file mode 100644 index 0000000..b414799 --- /dev/null +++ b/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart @@ -0,0 +1,430 @@ +import 'dart:async'; +import 'dart:developer'; +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/in_app_browser/InAppBrowser.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:provider/provider.dart'; + +class WalletPaymentConfirmPage extends StatefulWidget { + const WalletPaymentConfirmPage({super.key}); + + @override + State createState() => _WalletPaymentConfirmPageState(); +} + +class _WalletPaymentConfirmPageState extends State { + late PayfortViewModel payfortViewModel; + late AppState appState; + late HabibWalletViewModel habibWalletVM; + + MyInAppBrowser? browser; + String selectedPaymentMethod = ""; + + String transID = ""; + + @override + void initState() { + scheduleMicrotask(() { + payfortViewModel.initPayfortViewModel(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + habibWalletVM = Provider.of(context, listen: false); + payfortViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: CollapsingListView( + title: "Select Payment Method", + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.mada, width: 72.h, height: 25.h).toShimmer2(isShow: false), + SizedBox(height: 16.h), + "Mada".needTranslation.toText16(isBold: true).toShimmer2(isShow: false), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ).toShimmer2(isShow: false), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "MADA"; + openPaymentURL("mada"); + }), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.asset(AppAssets.visa, width: 40.h, height: 40.h), + SizedBox(width: 8.h), + Image.asset(AppAssets.Mastercard, width: 40.h, height: 40.h), + ], + ).toShimmer2(isShow: false), + SizedBox(height: 16.h), + "Visa or Mastercard".needTranslation.toText16(isBold: true).toShimmer2(isShow: false), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ).toShimmer2(isShow: false), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "VISA"; + openPaymentURL("visa"); + }), + ], + ), + ), + ), + ), + Container( + // height: 200.h, + width: MediaQuery.of(context).size.width, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + habibWalletVM.depositorName.toText18(isBold: true).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 12.h), + Wrap( + direction: Axis.horizontal, + spacing: 4.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget(labelText: "${LocaleKeys.fileno.tr(context: context)}.: ${habibWalletVM.fileNumber}"), + AppCustomChipWidget(labelText: "${LocaleKeys.mobileNumber.tr(context: context)}: ${habibWalletVM.mobileNumber}"), + AppCustomChipWidget(labelText: "${habibWalletVM.selectedHospital!.name}"), + ], + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 16.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Total amount to pay".needTranslation.toText16(isBold: true), + Utils.getPaymentAmountWithSymbol(habibWalletVM.walletRechargeAmount.toString().toText24(isBold: true), AppColors.blackColor, 15.h, isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 12.h), + Platform.isIOS + ? Utils.buildSvgWithAssets( + icon: AppAssets.apple_pay_button, + width: 200.h, + height: 56.h, + fit: BoxFit.contain, + ).paddingSymmetrical(24.h, 0.h).onPress(() { + if (Utils.havePrivilege(103)) { + startApplePay(); + } else { + openPaymentURL("ApplePay"); + } + }) + : SizedBox(height: 12.h), + SizedBox(height: 32.h), + ], + ), + ), + ], + ), + ); + } + + startApplePay() async { + LoaderBottomSheet.showLoader(); + ApplePayInsertRequest applePayInsertRequest = ApplePayInsertRequest(); + + transID = Utils.getAdvancePaymentTransID(habibWalletVM.selectedHospital!.iD!, int.parse(habibWalletVM.fileNumber)); + + await payfortViewModel.getPayfortConfigurations(serviceId: ServiceTypeEnum.advancePayment.getIdFromServiceEnum(), projectId: habibWalletVM.selectedHospital!.iD!, integrationId: 2); + + applePayInsertRequest.clientRequestID = transID; + applePayInsertRequest.clinicID = 0; + + applePayInsertRequest.currency = appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED"; + applePayInsertRequest.customerEmail = "CustID_${habibWalletVM.fileNumber.toString()}@HMG.com"; + applePayInsertRequest.customerID = habibWalletVM.fileNumber.toString(); + applePayInsertRequest.customerName = "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}"; + + applePayInsertRequest.deviceToken = await Utils.getStringFromPrefs(CacheConst.pushToken); + applePayInsertRequest.voipToken = await Utils.getStringFromPrefs(CacheConst.voipToken); + applePayInsertRequest.doctorID = 0; + applePayInsertRequest.projectID = habibWalletVM.selectedHospital!.iD!.toString(); + applePayInsertRequest.serviceID = ServiceTypeEnum.appointmentPayment.getIdFromServiceEnum().toString(); + applePayInsertRequest.channelID = 3; + applePayInsertRequest.patientID = habibWalletVM.fileNumber.toString(); + applePayInsertRequest.patientTypeID = appState.getAuthenticatedUser()!.patientType; + applePayInsertRequest.patientOutSA = appState.getAuthenticatedUser()!.outSa; + applePayInsertRequest.appointmentDate = null; + applePayInsertRequest.appointmentNo = 0; + applePayInsertRequest.orderDescription = "Advance Payment"; + applePayInsertRequest.liveServiceID = "0"; + applePayInsertRequest.latitude = "0.0"; + applePayInsertRequest.longitude = "0.0"; + applePayInsertRequest.amount = habibWalletVM.walletRechargeAmount.toString(); + applePayInsertRequest.isSchedule = "0"; + applePayInsertRequest.language = appState.isArabic() ? 'ar' : 'en'; + applePayInsertRequest.languageID = appState.isArabic() ? 1 : 2; + applePayInsertRequest.userName = int.parse(habibWalletVM.fileNumber); + applePayInsertRequest.responseContinueURL = "http://hmg.com/Documents/success.html"; + applePayInsertRequest.backClickUrl = "http://hmg.com/Documents/success.html"; + applePayInsertRequest.paymentOption = "ApplePay"; + + applePayInsertRequest.isMobSDK = true; + applePayInsertRequest.merchantReference = transID; + applePayInsertRequest.merchantIdentifier = payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier; + applePayInsertRequest.commandType = "PURCHASE"; + applePayInsertRequest.signature = payfortViewModel.payfortProjectDetailsRespModel!.signature; + applePayInsertRequest.accessCode = payfortViewModel.payfortProjectDetailsRespModel!.accessCode; + applePayInsertRequest.shaRequestPhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaRequest; + applePayInsertRequest.shaResponsePhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaResponse; + applePayInsertRequest.returnURL = ""; + + //TODO: Need to pass dynamic params to the Apple Pay instead of static values + await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) { + payfortViewModel.paymentWithApplePay( + customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}", + // customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress, + customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com", + orderDescription: "Appointment Payment", + orderAmount: double.parse(habibWalletVM.walletRechargeAmount.toString()), + merchantReference: transID, + merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier, + applePayAccessCode: payfortViewModel.payfortProjectDetailsRespModel!.accessCode, + applePayShaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel!.shaRequest, + currency: appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED", + onFailed: (failureResult) async { + log("failureResult: ${failureResult.message.toString()}"); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: failureResult.message.toString()), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }, + onSucceeded: (successResult) async { + log("successResult: ${successResult.responseMessage.toString()}"); + selectedPaymentMethod = successResult.paymentOption ?? "VISA"; + checkPaymentStatus(); + }, + ); + }); + } + + void checkPaymentStatus() async { + LoaderBottomSheet.showLoader(); + await payfortViewModel.checkPaymentStatus( + transactionID: transID, + onSuccess: (apiResponse) async { + print(apiResponse.data); + if (payfortViewModel.payfortCheckPaymentStatusResponseModel!.responseMessage!.toLowerCase() == "success") { + await habibWalletVM.HISCreateAdvancePayment( + paymentMethodName: selectedPaymentMethod, + paidAmount: habibWalletVM.walletRechargeAmount, + paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!, + patientID: habibWalletVM.fileNumber, + projectID: habibWalletVM.selectedHospital!.iD!, + depositorName: habibWalletVM.depositorName, + onSuccess: (value) async { + await habibWalletVM.addAdvanceNumberRequest( + advanceNumber: Utils.isVidaPlusProject(habibWalletVM.selectedHospital!.iD) + ? value.data['OnlineCheckInAppointments'][0]['AdvanceNumber_VP'].toString() + : value.data['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(), + paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!, + onSuccess: (value) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getSuccessWidget(loadingText: "Payment Successful!".needTranslation), + callBackFunc: () { + Navigator.of(context).pop(); + Navigator.of(context).pop(); + }, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Payment Failed - ${err}".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }, + onError: (err) {}); + } else { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Payment Failed! Please try again.".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }, + ); + } + + onBrowserLoadStart(String url) { + print("onBrowserLoadStart"); + print(url); + + if (selectedPaymentMethod == "tamara") { + if (Platform.isAndroid) { + Uri uri = new Uri.dataFromString(url); + // tamaraPaymentStatus = uri.queryParameters['status']!; + // tamaraOrderID = uri.queryParameters['AuthorizePaymentId']!; + } else { + Uri uri = new Uri.dataFromString(url); + // tamaraPaymentStatus = uri.queryParameters['paymentStatus']!; + // tamaraOrderID = uri.queryParameters['orderId']!; + } + } + + // if(selectedPaymentMethod != "TAMARA") { + MyInAppBrowser.successURLS.forEach((element) { + if (url.contains(element)) { + browser?.close(); + MyInAppBrowser.isPaymentDone = true; + return; + } + }); + // } + + // if(selectedPaymentMethod != "TAMARA") { + MyInAppBrowser.errorURLS.forEach((element) { + if (url.contains(element)) { + browser?.close(); + MyInAppBrowser.isPaymentDone = false; + return; + } + }); + // } + } + + onBrowserExit(bool isPaymentMade) async { + print("onBrowserExit Called!!!!"); + if (selectedPaymentMethod == "TAMARA") { + // checkTamaraPaymentStatus(transID!, appo); + // if (tamaraPaymentStatus != null && tamaraPaymentStatus.toLowerCase() == "approved") { + // updateTamaraRequestStatus("success", "14", Utils.getAppointmentTransID(appo.projectID, appo.clinicID, appo.appointmentNo), tamaraOrderID, num.parse(selectedInstallments), appo); + // } else { + // updateTamaraRequestStatus("Failed", "00", Utils.getAppointmentTransID(appo.projectID, appo.clinicID, appo.appointmentNo), tamaraOrderID, num.parse(selectedInstallments), appo); + // } + } else { + checkPaymentStatus(); + // checkPaymentStatus(appo); + } + } + + openPaymentURL(String paymentMethod) { + browser = MyInAppBrowser(onExitCallback: onBrowserExit, onLoadStartCallback: onBrowserLoadStart, context: context); + transID = Utils.getAdvancePaymentTransID(habibWalletVM.selectedHospital!.iD!, int.parse(habibWalletVM.fileNumber)); + + browser?.openPaymentBrowser( + habibWalletVM.walletRechargeAmount, + "Advance Payment", + transID, + habibWalletVM.selectedHospital!.iD!.toString(), + "CustID_${habibWalletVM.fileNumber.toString()}@HMG.com", + selectedPaymentMethod, + appState.getAuthenticatedUser()!.patientType.toString(), + habibWalletVM.depositorName, + habibWalletVM.fileNumber.toString(), + appState.getAuthenticatedUser()!, + browser!, + false, + "3", + "0", + context, + "", + "", + "", + "", + "3"); + } +} diff --git a/lib/presentation/habib_wallet/widgets/hospital_list_item.dart b/lib/presentation/habib_wallet/widgets/hospital_list_item.dart new file mode 100644 index 0000000..ae47326 --- /dev/null +++ b/lib/presentation/habib_wallet/widgets/hospital_list_item.dart @@ -0,0 +1,106 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class HospitalListItemAdvancePayment extends StatelessWidget { + final HospitalsModel hospitalModel; + final bool isLocationEnabled; + + late AppState appState; + + HospitalListItemAdvancePayment({super.key, required this.hospitalModel, required this.isLocationEnabled}); + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + return DecoratedBox( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8.h, + children: [hospitalName], + ), + ), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon, + iconColor: AppColors.blackColor, + width: 40.h, + height: 40.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ); + } + + Widget get hospitalName => Row( + children: [ + Utils.buildSvgWithAssets( + icon: (hospitalModel.isHMC == true) ? AppAssets.hmc : AppAssets.hmg, + ).paddingOnly(right: 10), + Expanded( + child: Text( + hospitalModel.name ?? "", + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16, + color: AppColors.blackColor, + ), + ), + ) + ], + ); + +// Widget get distanceInfo => Row( +// children: [ +// Visibility( +// visible: (hospitalModel.distanceInKMs != "0"), +// child: AppCustomChipWidget( +// labelText: "${hospitalData?.distanceInKMs ?? ""} km".needTranslation, +// deleteIcon: AppAssets.location_red, +// deleteIconSize: Size(9, 12), +// backgroundColor: AppColors.secondaryLightRedColor, +// textColor: AppColors.errorColor, +// ), +// ), +// Visibility( +// visible: (hospitalData?.distanceInKMs == "0"), +// child: Row( +// children: [ +// AppCustomChipWidget( +// labelText: "Distance not available".needTranslation, +// textColor: AppColors.blackColor, +// ), +// SizedBox( +// width: 8.h, +// ) +// ], +// )), +// Visibility( +// visible: !isLocationEnabled, +// child: AppCustomChipWidget( +// labelText: "Location turned off".needTranslation, +// deleteIcon: AppAssets.location_unavailable, +// deleteIconSize: Size(9, 12), +// textColor: AppColors.blackColor, +// )), +// ], +// ); +} diff --git a/lib/presentation/habib_wallet/widgets/select-medical_file.dart b/lib/presentation/habib_wallet/widgets/select-medical_file.dart new file mode 100644 index 0000000..73a7dfe --- /dev/null +++ b/lib/presentation/habib_wallet/widgets/select-medical_file.dart @@ -0,0 +1,197 @@ +// import 'package:flutter/cupertino.dart'; +// import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +// +// class SelectMedicalFile extends StatelessWidget { +// const SelectMedicalFile({super.key}); +// +// @override +// Widget build(BuildContext context) { +// return Padding( +// padding: EdgeInsets.all(24.h), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Container() +// ], +// ), +// ); +// } +// } + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class MultiPageBottomSheet extends StatefulWidget { + const MultiPageBottomSheet({Key? key}) : super(key: key); + + @override + State createState() => _MultiPageBottomSheetState(); +} + +class _MultiPageBottomSheetState extends State { + late AppState appState; + static final DialogService _dialogService = getIt.get(); + + TextEditingController fileNumberEditingController = TextEditingController(); + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + return Consumer(builder: (context, habibWalletVM, child) { + return Padding( + padding: MediaQuery.of(context).viewInsets, + child: habibWalletVM.isBottomSheetContentLoading ? Utils.getLoadingWidget() : getCurrentIndexWidget(habibWalletVM), + ); + }); + } + + Widget getCurrentIndexWidget(HabibWalletViewModel habibWalletVM) { + switch (habibWalletVM.currentIndex) { + case 0: + return getSelectMedicalFileContent(habibWalletVM); + case 1: + return getOtherAccountContent(habibWalletVM); + case 2: + return getOtherAccountContent(habibWalletVM); + default: + return getSelectMedicalFileContent(habibWalletVM); + } + } + + Widget getOtherAccountContent(HabibWalletViewModel habibWalletVM) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Enter File Number".needTranslation.toText20(weight: FontWeight.w600), + SizedBox(height: 12.h), + TextInputWidget( + labelText: LocaleKeys.fileNumber.tr(), + hintText: "xxxxxxxxx", + controller: fileNumberEditingController, + isEnable: true, + prefix: null, + isAllowRadius: true, + isBorderAllowed: false, + isAllowLeadingIcon: true, + autoFocus: false, + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 8.h), + leadingIcon: AppAssets.requests, + ).withVerticalPadding(8), + SizedBox(height: 12.h), + CustomButton( + text: LocaleKeys.submit.tr(), + onPressed: () async { + await habibWalletVM.getPatientInfoByPatientID( + patientID: fileNumberEditingController.text, + onSuccess: (response) async { + print(response.data["GetPatientInfoByPatientIDList"][0]["FullName"]); + await _dialogService.showCommonBottomSheetWithoutH( + message: "A file was found with name: ${response.data["GetPatientInfoByPatientIDList"][0]["FullName"]}, Would you like to recharge wallet for this file number?".needTranslation, + label: LocaleKeys.notice.tr(), + onOkPressed: () { + habibWalletVM.setSelectedRechargeType(3); + habibWalletVM.setDepositorDetails(response.data["GetPatientInfoByPatientIDList"][0]["PatientID"].toString(), response.data["GetPatientInfoByPatientIDList"][0]["FullName"], + response.data["GetPatientInfoByPatientIDList"][0]["MobileNumber"]); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + }, + onCancelPressed: () {}); + }, + onError: (error) {}); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedBorderColor, + textColor: AppColors.whiteColor, + ), + ], + ); + } + + Widget getSelectMedicalFileContent(HabibWalletViewModel habibWalletVM) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 16.h, + hasShadow: false, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.myMedicalFile.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500), + "${LocaleKeys.fileno.tr(context: context)}: ${appState.getAuthenticatedUser()!.patientId}".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + ], + ), + Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h), + ], + ).paddingAll(16.h), + ).onPress(() { + Navigator.of(context).pop(); + }), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 16.h, + hasShadow: false, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.familyTitle.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500), + "Select a medical file from your family".needTranslation.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h), + ], + ).paddingAll(16.h), + ), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 16.h, + hasShadow: false, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.otherAccount.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500), + "Any active medical file from HMG".toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), + Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h), + ], + ).paddingAll(16.h), + ).onPress(() { + habibWalletVM.setCurrentIndex(2); + }), + ], + ); + } +} diff --git a/lib/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart b/lib/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart new file mode 100644 index 0000000..b7a16c5 --- /dev/null +++ b/lib/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart @@ -0,0 +1,96 @@ +import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart'; +import 'package:hmg_patient_app_new/presentation/habib_wallet/widgets/hospital_list_item.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class SelectHospitalBottomSheet extends StatelessWidget { + late HabibWalletViewModel habibWalletVM; + final TextEditingController searchText = TextEditingController(); + + SelectHospitalBottomSheet({super.key}); + + @override + Widget build(BuildContext context) { + habibWalletVM = Provider.of(context, listen: false); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Text( + // LocaleKeys.selectHospital.tr(), + // style: TextStyle( + // fontSize: 21, + // fontWeight: FontWeight.w600, + // color: AppColors.blackColor, + // ), + // ), + Text( + "Please select the hospital you want to make an advance payment for.".needTranslation, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ), + ), + SizedBox(height: 16.h), + // TextInputWidget( + // labelText: LocaleKeys.search.tr(), + // hintText: "Search Hospital".tr(), + // controller: searchText, + // onChange: (value) { + // // appointmentsViewModel.filterHospitalListByString(value, regionalViewModel.selectedRegionId , regionalViewModel.selectedFacilityType == + // // FacilitySelection.HMG.name); + // }, + // isEnable: true, + // prefix: null, + // autoFocus: false, + // isBorderAllowed: false, + // keyboardType: TextInputType.text, + // isAllowLeadingIcon: true, + // selectionType: SelectionTypeEnum.search, + // padding: EdgeInsets.symmetric( + // vertical: ResponsiveExtension(10).h, + // horizontal: ResponsiveExtension(15).h, + // ), + // ), + // SizedBox(height: 24.h), + // TypeSelectionWidget( + // hmcCount: "0", + // hmgCount: "0", + // ), + // SizedBox(height: 21.h), + SizedBox( + height: MediaQuery.sizeOf(context).height * .4, + child: ListView.separated( + itemBuilder: (_, index) { + return HospitalListItemAdvancePayment( + hospitalModel: habibWalletVM.advancePaymentHospitals[index], + isLocationEnabled: false, + ).onPress(() { + habibWalletVM.setSelectedHospital(habibWalletVM.advancePaymentHospitals[index]); + Navigator.of(context).pop(); + }); + }, + separatorBuilder: (_, __) => SizedBox( + height: 16.h, + ), + itemCount: habibWalletVM.advancePaymentHospitals.length), + ) + ], + ); + } +} diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart new file mode 100644 index 0000000..f79aae0 --- /dev/null +++ b/lib/presentation/hmg_services/services_page.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; + +class ServicesPage extends StatelessWidget { + const ServicesPage({super.key}); + + @override + Widget build(BuildContext context) { + return CollapsingListView( + title: "Explore Services".needTranslation, + isLeading: false, + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Medical & Care Services".needTranslation.toText18(isBold: true) + ], + ), + ), + ); + } +} diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart new file mode 100644 index 0000000..31b4598 --- /dev/null +++ b/lib/presentation/home/data/landing_page_data.dart @@ -0,0 +1,185 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/presentation/home/data/service_card_data.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class LandingPageData { + static List getNotLoggedInServiceCardsList = [ + ServiceCardData( + serviceName: "emergency", + icon: AppAssets.emergency_services_icon, + title: "Emergency", + subtitle: "Services", + backgroundColor: AppColors.primaryRedColor, + iconColor: AppColors.whiteColor, + textColor: AppColors.whiteColor, + isBold: true, + ), + ServiceCardData( + serviceName: "indoor_navigation", + icon: AppAssets.indoor_nav_icon, + title: "Indoor", + subtitle: "Navigation", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + serviceName: "search_doctor", + icon: AppAssets.search_doctor_icon, + title: "Search", + subtitle: "Doctor", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + serviceName: "health_calculators", + icon: AppAssets.health_calculators_icon, + title: "Health", + subtitle: "Calculators", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + serviceName: "health_converters", + icon: AppAssets.health_calculators_icon, + title: "Health", + subtitle: "Converters", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + serviceName: "parking_guide", + icon: AppAssets.health_calculators_icon, + title: "Parking", + subtitle: "Guide", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ]; + + static List getLoggedInServiceCardsList = [ + ServiceCardData( + serviceName: "emergency", + icon: AppAssets.emergency_services_icon, + title: "Emergency", + subtitle: "Services", + backgroundColor: AppColors.primaryRedColor, + iconColor: AppColors.whiteColor, + textColor: AppColors.whiteColor, + isBold: true, + ), + ServiceCardData( + serviceName: "lab_results", + icon: AppAssets.home_lab_result_icon, + title: "My Lab", + subtitle: "Results", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + serviceName: "radiology_results", + icon: AppAssets.home_lab_result_icon, + title: "My Radiology", + subtitle: "Results", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + serviceName: "prescriptions", + icon: AppAssets.my_prescription_icon, + title: "My", + subtitle: "Prescriptions", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + serviceName: "insurance_update", + icon: AppAssets.insurance_update_icon, + title: "Insurance", + subtitle: "Update", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + serviceName: "my_doctors", + icon: AppAssets.insurance_update_icon, + title: "My", + subtitle: "Doctors", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + serviceName: "sick_leaves", + icon: AppAssets.insurance_update_icon, + title: "My Sick", + subtitle: "Leaves", + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ]; + + static List getServiceCardsList = [ + ServiceCardData( + icon: AppAssets.livecare_service, + title: "LiveCare", + subtitle: "Explore our app, View our services and offers", + largeCardIcon: AppAssets.livecare_icon, + backgroundColor: Colors.transparent, + iconColor: Colors.transparent, + textColor: Colors.transparent, + isBold: true, + ), + ServiceCardData( + icon: AppAssets.lab_result_icon, + title: "Dermatology", + subtitle: "Explore our app, View our services and offers", + largeCardIcon: AppAssets.livecare_icon, + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + icon: AppAssets.my_prescription_icon, + title: "Home Health Care", + subtitle: "Explore our app, View our services and offers", + largeCardIcon: AppAssets.livecare_icon, + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ServiceCardData( + icon: AppAssets.insurance_update_icon, + title: "Pharmacy", + subtitle: "Explore our app, View our services and offers", + largeCardIcon: AppAssets.livecare_icon, + backgroundColor: AppColors.whiteColor, + iconColor: AppColors.blackColor, + textColor: AppColors.blackColor, + isBold: false, + ), + ]; +} diff --git a/lib/presentation/home/data/service_card_data.dart b/lib/presentation/home/data/service_card_data.dart new file mode 100644 index 0000000..49e7e3d --- /dev/null +++ b/lib/presentation/home/data/service_card_data.dart @@ -0,0 +1,27 @@ +import 'dart:ui'; + +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class ServiceCardData { + final String serviceName; + final String icon; + final String title; + final String subtitle; + final Color iconColor; + final Color textColor; + final Color backgroundColor; + final bool isBold; + final String largeCardIcon; + + ServiceCardData({ + this.serviceName = "", + this.icon = "", + this.title = "", + this.subtitle = "", + this.largeCardIcon = "", + this.backgroundColor = AppColors.whiteColor, + this.iconColor = AppColors.blackColor, + this.textColor = AppColors.blackColor, + this.isBold = false, + }); +} diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index b3ddd19..3347902 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -1,5 +1,51 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:flutter_swiper_view/flutter_swiper_view.dart'; +import 'package:get_it/get_it.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/quick_login.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart'; +import 'package:hmg_patient_app_new/presentation/contact_us/contact_us.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart'; +import 'package:hmg_patient_app_new/presentation/home/data/landing_page_data.dart'; +import 'package:hmg_patient_app_new/presentation/home/widgets/habib_wallet_card.dart'; +import 'package:hmg_patient_app_new/presentation/home/widgets/large_service_card.dart'; +import 'package:hmg_patient_app_new/presentation/home/widgets/small_service_card.dart'; +import 'package:hmg_patient_app_new/presentation/home/widgets/welcome_widget.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; +import 'package:hmg_patient_app_new/presentation/profile_settings/profile_settings.dart'; +import 'package:hmg_patient_app_new/services/cache_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/routes/spring_page_route_builder.dart'; +import 'package:provider/provider.dart'; class LandingPage extends StatefulWidget { const LandingPage({super.key}); @@ -9,17 +55,542 @@ class LandingPage extends StatefulWidget { } class _LandingPageState extends State { + late final AuthenticationViewModel authVM; + bool isDone = false; + late final HabibWalletViewModel habibWalletVM; + + late AppState appState; + late MyAppointmentsViewModel myAppointmentsViewModel; + late PrescriptionsViewModel prescriptionsViewModel; + final CacheService cacheService = GetIt.instance(); + + late InsuranceViewModel insuranceViewModel; + late ImmediateLiveCareViewModel immediateLiveCareViewModel; + late BookAppointmentsViewModel bookAppointmentsViewModel; + late EmergencyServicesViewModel emergencyServicesViewModel; + + final SwiperController _controller = SwiperController(); + + @override + void initState() { + authVM = context.read(); + habibWalletVM = context.read(); + // myAppointmentsViewModel = context.read(); + // prescriptionsViewModel = context.read(); + // insuranceViewModel = context.read(); + // immediateLiveCareViewModel = context.read(); + + authVM.savePushTokenToAppState(); + if (mounted) { + authVM.checkLastLoginStatus(() { + showQuickLogin(context); + }); + } + scheduleMicrotask(() { + if (appState.isAuthenticated) { + habibWalletVM.initHabibWalletProvider(); + habibWalletVM.getPatientBalanceAmount(); + myAppointmentsViewModel.initAppointmentsViewModel(); + myAppointmentsViewModel.getPatientAppointments(true, false); + myAppointmentsViewModel.getPatientMyDoctors(); + prescriptionsViewModel.initPrescriptionsViewModel(); + insuranceViewModel.initInsuranceProvider(); + immediateLiveCareViewModel.initImmediateLiveCare(); + immediateLiveCareViewModel.getPatientLiveCareHistory(); + emergencyServicesViewModel.checkPatientERAdvanceBalance(); + } + }); + super.initState(); + } + @override Widget build(BuildContext context) { - return Scaffold( - body: Column( - children: [ - Padding( - padding: const EdgeInsets.all(64.0), - child: "Login".toText18(color: Colors.black), + bookAppointmentsViewModel = Provider.of(context, listen: false); + myAppointmentsViewModel = Provider.of(context, listen: false); + prescriptionsViewModel = Provider.of(context, listen: false); + insuranceViewModel = Provider.of(context, listen: false); + immediateLiveCareViewModel = Provider.of(context, listen: false); + emergencyServicesViewModel = Provider.of(context, listen: false); + appState = getIt.get(); + return PopScope( + canPop: false, + child: Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: SingleChildScrollView( + padding: EdgeInsets.only(top: kToolbarHeight + 0.h, bottom: 24), + child: Column( + spacing: 16.h, + children: [ + Row( + spacing: 8.h, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + appState.isAuthenticated + ? WelcomeWidget( + onTap: () { + Navigator.of(context).push(springPageRoute(ProfileSettings())); + }, + name: ('${appState.getAuthenticatedUser()!.firstName!} ${appState.getAuthenticatedUser()!.lastName!}'), + imageUrl: appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, + ).expanded + : CustomButton( + text: LocaleKeys.loginOrRegister.tr(context: context), + onPressed: () async { + await authVM.onLoginPressed(); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Color(0xffED1C2B), + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0), + height: 40.h, + ), + Row( + mainAxisSize: MainAxisSize.min, + spacing: 12.h, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.bell, height: 18.h, width: 18.h).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: MedicalFilePage(), + // page: LoginScreen(), + ), + ); + }), + Utils.buildSvgWithAssets(icon: AppAssets.search_icon, height: 18.h, width: 18.h).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: MedicalFilePage(), + // page: LoginScreen(), + ), + ); + }), + Utils.buildSvgWithAssets(icon: AppAssets.contact_icon, height: 18.h, width: 18.h).onPress(() { + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.contactUs.tr(), + child: ContactUs(), + callBackFunc: () {}, + isFullScreen: false, + ); + }), + ], + ), + ], + ).paddingSymmetrical(24.h, 0.h), + appState.isAuthenticated + ? Column( + children: [ + SizedBox(height: 12.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Appointments & Visits".toText16(isBold: true), + Row( + children: [ + LocaleKeys.viewAll.tr(context: context).toText12(color: AppColors.primaryRedColor), + SizedBox(width: 2.h), + Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h), + ], + ), + ], + ).paddingSymmetrical(24.h, 0.h).onPress(() { + Navigator.of(context).push(CustomPageRoute(page: MyAppointmentsPage())); + }), + SizedBox(height: 16.h), + Consumer( + builder: (context, myAppointmentsVM, child) { + return myAppointmentsVM.isMyAppointmentsLoading + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: AppointmentCard( + patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel(), + myAppointmentsViewModel: myAppointmentsViewModel, + bookAppointmentsViewModel: bookAppointmentsViewModel, + isLoading: true, + isFromHomePage: true, + ), + ).paddingSymmetrical(24.h, 0.h) + : myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty + ? myAppointmentsVM.patientAppointmentsHistoryList.length == 1 + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: AppointmentCard( + patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList.first, + myAppointmentsViewModel: myAppointmentsViewModel, + bookAppointmentsViewModel: bookAppointmentsViewModel, + isLoading: false, + isFromHomePage: true, + ), + ).paddingSymmetrical(24.h, 0.h) + : Swiper( + itemCount: myAppointmentsVM.isMyAppointmentsLoading + ? 3 + : myAppointmentsVM.patientAppointmentsHistoryList.length < 3 + ? myAppointmentsVM.patientAppointmentsHistoryList.length + : 3, + layout: SwiperLayout.STACK, + loop: true, + itemWidth: MediaQuery.of(context).size.width - 48.h, + indicatorLayout: PageIndicatorLayout.COLOR, + axisDirection: AxisDirection.right, + controller: _controller, + itemHeight: 210 + 25, + pagination: const SwiperPagination( + alignment: Alignment.bottomCenter, + margin: EdgeInsets.only(top: 210 + 8 + 24), + builder: DotSwiperPaginationBuilder(color: Color(0xffD9D9D9), activeColor: AppColors.blackBgColor), + ), + itemBuilder: (BuildContext context, int index) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: AppointmentCard( + patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index], + myAppointmentsViewModel: myAppointmentsViewModel, + bookAppointmentsViewModel: bookAppointmentsViewModel, + isLoading: false, + isFromHomePage: true, + ), + ); + }, + ) + : Container( + width: double.infinity, + decoration: RoundedRectangleBorder() + .toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Padding( + padding: EdgeInsets.all(12.h), + child: Column( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h), + SizedBox(height: 12.h), + "You do not have any upcoming appointment. Please book an appointment" + .needTranslation + .toText12(isCenter: true), + SizedBox(height: 12.h), + CustomButton( + text: LocaleKeys.bookAppo.tr(context: context), + onPressed: () { + Navigator.of(context).push(CustomPageRoute(page: BookAppointmentPage())); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Color(0xffED1C2B), + fontSize: 14.f, + fontWeight: FontWeight.w500, + padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0), + icon: AppAssets.add_icon, + iconColor: AppColors.primaryRedColor, + height: 46.h, + ), + ], + ), + ), + ).paddingSymmetrical(24.h, 0.h); + }, + ), + + // Consumer for LiveCare pending request + Consumer( + builder: (context, immediateLiveCareVM, child) { + return immediateLiveCareVM.patientHasPendingLiveCareRequest + ? Column( + children: [ + SizedBox(height: 12.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: true, + side: BorderSide(color: AppColors.ratingColorYellow, width: 3.h), + ), + width: double.infinity, + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppCustomChipWidget( + labelText: immediateLiveCareViewModel.patientLiveCareHistoryList[0].stringCallStatus, + backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.20), + textColor: AppColors.alertColor, + ), + Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h), + // Lottie.asset(AppAnimations.pending_loading_animation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 40.h, height: 40.h, fit: BoxFit.contain), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "You have a pending LiveCare request".needTranslation.toText12(isBold: true), + Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 20.h, + height: 15.h, + fit: BoxFit.contain, + ), + ], + ), + ], + ), + ), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + Navigator.of(context).push(CustomPageRoute(page: ImmediateLiveCarePendingRequestPage())); + }), + SizedBox(height: 12.h), + ], + ) + : SizedBox(height: 12.h); + }, + ), + + // Consumer for ER Online Check-In pending request + Consumer( + builder: (context, emergencyServicesVM, child) { + return emergencyServicesVM.patientHasAdvanceERBalance + ? Column( + children: [ + SizedBox(height: 4.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: true, + side: BorderSide(color: AppColors.primaryRedColor, width: 3.h), + ), + width: double.infinity, + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppCustomChipWidget( + labelText: "ER Online Check-In Request", + backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.10), + textColor: AppColors.primaryRedColor, + ), + Utils.buildSvgWithAssets(icon: AppAssets.appointment_checkin_icon, width: 24.h, height: 24.h, iconColor: AppColors.primaryRedColor), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "You have ER Online Check-In Request".needTranslation.toText12(isBold: true), + Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 20.h, + height: 15.h, + fit: BoxFit.contain, + ), + ], + ), + ], + ), + ), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + Navigator.of(context).push(CustomPageRoute(page: ErOnlineCheckinHome())); + // context.read().navigateToEROnlineCheckIn(); + }), + SizedBox(height: 12.h), + ], + ) + : SizedBox(height: 12.h); + }, + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Quick Links".needTranslation.toText16(isBold: true), + Row( + children: [ + "View medical file".needTranslation.toText12(color: AppColors.primaryRedColor), + SizedBox(width: 2.h), + Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h), + ], + ), + ], + ).paddingSymmetrical(24.h, 0.h).onPress(() { + Navigator.of(context).push(CustomPageRoute(page: MedicalFilePage())); + }), + SizedBox(height: 16.h), + Container( + height: 120.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), + child: Column( + children: [ + Expanded( + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: LandingPageData.getLoggedInServiceCardsList.length, + shrinkWrap: true, + padding: EdgeInsets.only(left: 16.h, right: 16.h), + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 1000), + child: SlideAnimation( + horizontalOffset: 100.0, + child: FadeInAnimation( + child: SmallServiceCard( + icon: LandingPageData.getLoggedInServiceCardsList[index].icon, + title: LandingPageData.getLoggedInServiceCardsList[index].title, + subtitle: LandingPageData.getLoggedInServiceCardsList[index].subtitle, + iconColor: LandingPageData.getLoggedInServiceCardsList[index].iconColor, + textColor: LandingPageData.getLoggedInServiceCardsList[index].textColor, + backgroundColor: LandingPageData.getLoggedInServiceCardsList[index].backgroundColor, + isBold: LandingPageData.getLoggedInServiceCardsList[index].isBold, + serviceName: LandingPageData.getLoggedInServiceCardsList[index].serviceName, + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => 10.width, + ), + ), + ], + ), + ).paddingSymmetrical(24.h, 0.h), + ], + ) + : Container( + height: 127.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), + child: Column( + children: [ + Expanded( + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: LandingPageData.getNotLoggedInServiceCardsList.length, + shrinkWrap: true, + padding: EdgeInsets.only(left: 16.h, right: 16.h), + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 1000), + child: SlideAnimation( + horizontalOffset: 100.0, + child: FadeInAnimation( + child: SmallServiceCard( + serviceName: LandingPageData.getNotLoggedInServiceCardsList[index].serviceName, + icon: LandingPageData.getNotLoggedInServiceCardsList[index].icon, + title: LandingPageData.getNotLoggedInServiceCardsList[index].title, + subtitle: LandingPageData.getNotLoggedInServiceCardsList[index].subtitle, + iconColor: LandingPageData.getNotLoggedInServiceCardsList[index].iconColor, + textColor: LandingPageData.getNotLoggedInServiceCardsList[index].textColor, + backgroundColor: LandingPageData.getNotLoggedInServiceCardsList[index].backgroundColor, + isBold: LandingPageData.getNotLoggedInServiceCardsList[index].isBold, + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => 0.width, + ), + ), + ], + ), + ).paddingSymmetrical(24.h, 0.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Services".toText16(isBold: true), + Row( + children: [ + "View all services".toText12(color: AppColors.primaryRedColor), + SizedBox(width: 2.h), + Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h), + ], + ), + ], + ).paddingSymmetrical(24.h, 0.h), + SizedBox( + height: 280.h, + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: LandingPageData.getServiceCardsList.length, + shrinkWrap: true, + padding: EdgeInsets.only(left: 24.w, right: 24.w), + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 1000), + child: SlideAnimation( + horizontalOffset: 100.0, + child: FadeInAnimation( + child: LargeServiceCard( + image: LandingPageData.getServiceCardsList[index].icon, + title: LandingPageData.getServiceCardsList[index].title, + subtitle: LandingPageData.getServiceCardsList[index].subtitle, + icon: LandingPageData.getServiceCardsList[index].largeCardIcon, + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 8.w), + ), + ), + appState.isAuthenticated ? HabibWalletCard() : SizedBox(), + ], ), - ], + ), + ), + ); + } + + void showQuickLogin(BuildContext context) { + showCommonBottomSheetWithoutHeight( + context, + title: "", + isCloseButtonVisible: false, + + child: StatefulBuilder( + builder: (context, setState) { + return QuickLogin( + isDone: isDone, + onPressed: () { + // sharedPref.setBool(HAS_ENABLED_QUICK_LOGIN, true); + authVM.loginWithFingerPrintFace(() { + isDone = true; + cacheService.saveBool(key: CacheConst.quickLoginEnabled, value: true); + setState(() {}); + }); + }, + ); + }, ), + // height: isDone == false ? ResponsiveExtension.screenHeight * 0.5 : ResponsiveExtension.screenHeight * 0.3, + isFullScreen: false, + callBackFunc: () { + isDone = true; + setState(() {}); + }, ); } } diff --git a/lib/presentation/home/navigation_screen.dart b/lib/presentation/home/navigation_screen.dart new file mode 100644 index 0000000..9c7566d --- /dev/null +++ b/lib/presentation/home/navigation_screen.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart'; +import 'package:hmg_patient_app_new/presentation/hmg_services/services_page.dart'; +import 'package:hmg_patient_app_new/presentation/home/landing_page.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; +import 'package:hmg_patient_app_new/presentation/todo/todo_page.dart'; +import 'package:hmg_patient_app_new/widgets/bottom_navigation/bottom_navigation.dart'; + +class LandingNavigation extends StatefulWidget { + const LandingNavigation({super.key}); + + @override + State createState() => _LandingNavigationState(); +} + +class _LandingNavigationState extends State { + int _currentIndex = 0; + late AppState appState; + final PageController _pageController = PageController(); + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + return Scaffold( + body: PageView( + controller: _pageController, + physics: const NeverScrollableScrollPhysics(), + children: [ + const LandingPage(), + appState.isAuthenticated ? MedicalFilePage() : /* need add feedback page */ const LandingPage(), + BookAppointmentPage(), + const ToDoPage(), + appState.isAuthenticated ? /* need add news page */ ServicesPage() : const LandingPage(), + ], + ), + bottomNavigationBar: BottomNavigation( + currentIndex: _currentIndex, + onTap: (index) { + setState(() => _currentIndex = index); + _pageController.animateToPage(index, duration: const Duration(milliseconds: 300), curve: Curves.easeInOut); + }, + ), + ); + } +} diff --git a/lib/presentation/home/widgets/habib_wallet_card.dart b/lib/presentation/home/widgets/habib_wallet_card.dart new file mode 100644 index 0000000..6ea4507 --- /dev/null +++ b/lib/presentation/home/widgets/habib_wallet_card.dart @@ -0,0 +1,140 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/habib_wallet/habib_wallet_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:provider/provider.dart'; + +class HabibWalletCard extends StatelessWidget { + const HabibWalletCard({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "My Balance".toText16(isBold: true), + Row( + children: [ + "View all services".toText12(color: AppColors.primaryRedColor), + SizedBox(width: 2.h), + Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h), + ], + ), + ], + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 16.h), + Container( + // height: 150.h, + width: double.infinity, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24, + ), + child: Stack(children: [ + Positioned( + right: 0, + child: ClipRRect(borderRadius: BorderRadius.circular(24.0), child: Utils.buildSvgWithAssets(icon: AppAssets.habib_background_icon, width: 150.h, height: 150.h)), + ), + Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Habib Wallet".toText15(isBold: true), + Container( + height: 40.h, + width: 40.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.textColor, + borderRadius: 8.h, + ), + child: Padding( + padding: EdgeInsets.all(8.h), + child: Utils.buildSvgWithAssets( + icon: AppAssets.show_icon, + width: 12.h, + height: 12.h, + fit: BoxFit.contain, + ), + ), + ), + ], + ), + SizedBox(height: 4.h), + Consumer(builder: (context, habibWalletVM, child) { + return Row( + children: [ + Utils.buildSvgWithAssets( + icon: AppAssets.saudi_riyal_icon, + iconColor: AppColors.dividerColor, + width: 24.h, + height: 24.h, + fit: BoxFit.contain, + ), + SizedBox(width: 8.h), + habibWalletVM.habibWalletAmount.toString().toText32(isBold: true).toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.h, width: 80.h, height: 40.h), + ], + ); + }), + Padding( + padding: EdgeInsets.symmetric(horizontal: 50.h), + child: Row( + children: [ + "View details".toText12(color: AppColors.primaryRedColor), + SizedBox(width: 2.h), + Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h), + ], + ).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: HabibWalletPage(), + ), + ); + }), + ), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: 150.h, + child: Utils.getPaymentMethods(), + ), + CustomButton( + icon: AppAssets.recharge_icon, + iconSize: 18.h, + text: "Recharge".needTranslation, + onPressed: () {}, + backgroundColor: AppColors.infoColor, + borderColor: AppColors.infoColor, + textColor: AppColors.whiteColor, + fontSize: 12, + fontWeight: FontWeight.bold, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 35.h, + ), + ], + ), + ], + ), + ), + ]), + ).paddingSymmetrical(24.h, 0.h), + ], + ); + } +} diff --git a/lib/presentation/home/widgets/large_service_card.dart b/lib/presentation/home/widgets/large_service_card.dart new file mode 100644 index 0000000..3989523 --- /dev/null +++ b/lib/presentation/home/widgets/large_service_card.dart @@ -0,0 +1,63 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +import '../../../core/utils/utils.dart'; +import '../../../theme/colors.dart'; + +class LargeServiceCard extends StatelessWidget { + final String image; + final String icon; + final String title; + final String subtitle; + + const LargeServiceCard({ + super.key, + this.image = "", + this.icon = "", + this.title = "", + this.subtitle = "", + }); + + @override + Widget build(BuildContext context) { + return Container( + width: 150.w, + padding: EdgeInsets.symmetric(horizontal: 3.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.transparent, borderRadius: 16.r), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.livecare_service, width: 220.w, fit: BoxFit.contain), + SizedBox(height: 10.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: icon, width: 24.w, height: 24.h), + Flexible(child: title.toText14(color: AppColors.blackColor, isBold: true, textOverflow: TextOverflow.clip, maxlines: 1)), + ], + ), + subtitle.toText11(color: AppColors.blackColor), + SizedBox(height: 10.h), + CustomButton( + text: LocaleKeys.bookNow.tr(context: context), + onPressed: () {}, + backgroundColor: AppColors.borderOnlyColor, + borderColor: AppColors.borderOnlyColor, + textColor: AppColors.whiteColor, + fontSize: 14.f, + fontWeight: FontWeight.bold, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(10.w, 0, 10.w, 0), + height: 40.h, + ), + ], + ), + ); + } +} diff --git a/lib/presentation/home/widgets/small_service_card.dart b/lib/presentation/home/widgets/small_service_card.dart new file mode 100644 index 0000000..234fad1 --- /dev/null +++ b/lib/presentation/home/widgets/small_service_card.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/my_doctors_page.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/emergency_services_page.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_orders_page.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/patient_sickleaves_list_page.dart'; +import 'package:hmg_patient_app_new/presentation/prescriptions/prescriptions_list_page.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:provider/provider.dart'; + +import '../../../core/utils/utils.dart'; +import '../../../theme/colors.dart'; +import '../../radiology/radiology_orders_page.dart' show RadiologyOrdersPage; + +class SmallServiceCard extends StatelessWidget { + final String serviceName; + final String icon; + final String title; + final String subtitle; + final Color iconColor; + final Color textColor; + final Color backgroundColor; + final bool isBold; + + SmallServiceCard({ + super.key, + this.icon = "", + this.serviceName = "", + this.title = "", + this.subtitle = "", + this.backgroundColor = AppColors.whiteColor, + this.iconColor = AppColors.blackColor, + this.textColor = AppColors.blackColor, + this.isBold = false, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 0.h, vertical: 12.h), + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: backgroundColor, + borderRadius: 16, + ), + child: Padding( + padding: EdgeInsets.all(12.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: icon, iconColor: iconColor, width: 32.h, height: 32.h), + SizedBox(height: 6.h), + title.toText11(color: textColor, isBold: isBold, isCenter: true), + subtitle.toText11(color: textColor, isBold: isBold, isCenter: true), + ], + ), + ), + ), + ).onPress(() { + switch (serviceName) { + case "lab_results": + Navigator.of(context).push( + CustomPageRoute( + page: LabOrdersPage(), + ), + ); + break; + case "radiology_results": + Navigator.of(context).push( + CustomPageRoute( + page: RadiologyOrdersPage(), + ), + ); + break; + case "prescriptions": + Navigator.of(context).push( + CustomPageRoute( + page: PrescriptionsListPage(), + ), + ); + break; + case "insurance_update": + Navigator.of(context).push( + CustomPageRoute( + page: InsuranceHomePage(), + ), + ); + break; + + case "my_doctors": + Navigator.of(context).push( + CustomPageRoute( + page: MyDoctorsPage(), + ), + ); + break; + + case "sick_leaves": + Navigator.of(context).push( + CustomPageRoute( + page: PatientSickleavesListPage(), + ), + ); + break; + case "emergency": + context.read().flushData(); + context.read().getTransportationOrders(showLoader: false,); + Navigator.of(context).push( + CustomPageRoute( + page: EmergencyServicesPage(), + settings: const RouteSettings(name: '/EmergencyServicesPage'), + ), + ); + break; + default: + // Handle unknown service + break; + } + }); + } +} diff --git a/lib/presentation/home/widgets/welcome_widget.dart b/lib/presentation/home/widgets/welcome_widget.dart new file mode 100644 index 0000000..f710ab2 --- /dev/null +++ b/lib/presentation/home/widgets/welcome_widget.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class WelcomeWidget extends StatelessWidget { + final String name; + final String imageUrl; + final VoidCallback? onTap; + + const WelcomeWidget({ + super.key, + required this.name, + required this.imageUrl, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(30), + child: Row( + mainAxisSize: MainAxisSize.min, + spacing: 8.h, + children: [ + Image.asset(imageUrl, width: 40, height: 40), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4.h, + mainAxisSize: MainAxisSize.min, + children: [ + "Welcome".needTranslation.toText14(color: AppColors.greyTextColor, height: 1, weight: FontWeight.w500), + Row( + spacing: 4.h, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Flexible(child: name.toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1, height: 1)), + const Icon(Icons.keyboard_arrow_down, size: 20, color: Colors.black), + ], + ), + ], + ).expanded, + ], + ), + ); + } +} diff --git a/lib/presentation/insurance/insurance_approval_details_page.dart b/lib/presentation/insurance/insurance_approval_details_page.dart new file mode 100644 index 0000000..437c870 --- /dev/null +++ b/lib/presentation/insurance/insurance_approval_details_page.dart @@ -0,0 +1,160 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:provider/provider.dart'; + +class InsuranceApprovalDetailsPage extends StatelessWidget { + InsuranceApprovalDetailsPage({super.key, required this.insuranceApprovalResponseModel}); + + InsuranceApprovalResponseModel insuranceApprovalResponseModel; + late InsuranceViewModel insuranceViewModel; + late AppState appState; + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + insuranceViewModel = Provider.of(context, listen: false); + return CollapsingListView( + title: "${LocaleKeys.insurance.tr(context: context)} ${LocaleKeys.approvals.tr(context: context)}", + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + alignment: WrapAlignment.start, + direction: Axis.horizontal, + spacing: 6.h, + runSpacing: 6.h, + children: [ + AppCustomChipWidget( + labelText: insuranceApprovalResponseModel.approvalStatusDescption, + backgroundColor: insuranceApprovalResponseModel.status == 9 ? AppColors.successColor.withOpacity(0.1) : AppColors.primaryRedColor.withOpacity(0.1), + textColor: insuranceApprovalResponseModel.status == 9 ? AppColors.successColor : AppColors.primaryRedColor, + ), + AppCustomChipWidget( + icon: (!insuranceApprovalResponseModel.isLiveCareAppointment! ? AppAssets.walkin_appointment_icon : AppAssets.small_livecare_icon), + iconColor: !insuranceApprovalResponseModel.isLiveCareAppointment! ? AppColors.textColor : AppColors.whiteColor, + labelText: insuranceApprovalResponseModel.isLiveCareAppointment! ? LocaleKeys.livecare.tr(context: context) : "Walk In".needTranslation, + backgroundColor: (!insuranceApprovalResponseModel.isLiveCareAppointment! ? AppColors.greyColor : AppColors.successColor), + textColor: (!insuranceApprovalResponseModel.isLiveCareAppointment! ? AppColors.textColor : AppColors.whiteColor), + ), + AppCustomChipWidget( + labelText: appState.isArabic() ? insuranceApprovalResponseModel.isInOutPatientDescriptionN! : insuranceApprovalResponseModel.isInOutPatientDescription!, + backgroundColor: AppColors.primaryRedColor.withOpacity(0.1), + textColor: AppColors.primaryRedColor, + ), + ], + ), + SizedBox(height: 16.h), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + insuranceApprovalResponseModel.doctorImageURL!, + width: 63.h, + height: 63.h, + fit: BoxFit.cover, + ).circle(100), + SizedBox(width: 16.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (insuranceApprovalResponseModel.doctorName!).toText16(isBold: true), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget(labelText: insuranceApprovalResponseModel.clinicName!), + AppCustomChipWidget(labelText: "${LocaleKeys.approvalNo.tr(context: context)} ${insuranceApprovalResponseModel.approvalNo}"), + AppCustomChipWidget(labelText: "${LocaleKeys.unusedCount.tr(context: context)} ${insuranceApprovalResponseModel.unUsedCount}"), + AppCustomChipWidget(labelText: "${LocaleKeys.companyName.tr(context: context)} ${insuranceApprovalResponseModel.companyName}"), + AppCustomChipWidget( + labelText: + "${LocaleKeys.receiptOn.tr(context: context)} ${DateUtil.formatDateToDate(DateUtil.convertStringToDate(insuranceApprovalResponseModel.receiptOn), false)}"), + AppCustomChipWidget( + labelText: + "${LocaleKeys.expiryOn.tr(context: context)} ${DateUtil.formatDateToDate(DateUtil.convertStringToDate(insuranceApprovalResponseModel.expiryDate), false)}"), + ], + ), + ], + ), + ), + ], + ), + ], + ), + ), + ), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Approval Details".toText16(isBold: true), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.procedureName.tr(context: context).toText14(isBold: true), + Expanded( + child: insuranceApprovalResponseModel.apporvalDetails!.procedureName! + .toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor, textAlignment: TextAlign.end, maxLine: 2), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Status:".needTranslation.toText14(isBold: true), + insuranceApprovalResponseModel.apporvalDetails!.status!.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "${LocaleKeys.usageStatus.tr(context: context)}: ".toText14(isBold: true), + insuranceApprovalResponseModel.apporvalDetails!.isInvoicedDesc!.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ), + ], + ), + ), + ) + ], + ).paddingSymmetrical(24.h, 24.h), + ); + } +} diff --git a/lib/presentation/insurance/insurance_approvals_page.dart b/lib/presentation/insurance/insurance_approvals_page.dart new file mode 100644 index 0000000..b70c116 --- /dev/null +++ b/lib/presentation/insurance/insurance_approvals_page.dart @@ -0,0 +1,109 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/widgets/insurance_approval_card.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/insurance_approval_details_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class InsuranceApprovalsPage extends StatefulWidget { + const InsuranceApprovalsPage({super.key}); + + @override + State createState() => _InsuranceApprovalsPageState(); +} + +class _InsuranceApprovalsPageState extends State { + late InsuranceViewModel insuranceViewModel; + late AppState appState; + + @override + void initState() { + scheduleMicrotask(() { + insuranceViewModel.setIsInsuranceApprovalsLoading(true); + insuranceViewModel.getPatientInsuranceApprovalsList(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + insuranceViewModel = Provider.of(context, listen: false); + return CollapsingListView( + title: "${LocaleKeys.insurance.tr(context: context)} ${LocaleKeys.approvals.tr(context: context)}", + child: SingleChildScrollView( + child: Consumer(builder: (context, insuranceVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: insuranceVM.isInsuranceApprovalsLoading + ? 5 + : insuranceVM.patientInsuranceApprovalsList.isNotEmpty + ? insuranceVM.patientInsuranceApprovalsList.length + : 1, + itemBuilder: (context, index) { + return insuranceVM.isInsuranceApprovalsLoading + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: InsuranceApprovalCard( + insuranceApprovalResponseModel: InsuranceApprovalResponseModel(), + appState: appState, + isLoading: true, + ), + ).paddingSymmetrical(24.h, 0.h) + : insuranceVM.patientInsuranceApprovalsList.isNotEmpty + ? AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: InsuranceApprovalCard( + insuranceApprovalResponseModel: insuranceVM.patientInsuranceApprovalsList[index], + appState: appState, + isLoading: false, + ).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: InsuranceApprovalDetailsPage(insuranceApprovalResponseModel: insuranceVM.patientInsuranceApprovalsList[index]), + ), + ); + }), + ).paddingSymmetrical(24.h, 0.h), + ), + ), + ) + : Utils.getNoDataWidget(context, noDataText: "You don't have any insurance approvals yet.".needTranslation); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + SizedBox(height: 24.h), + ], + ); + }), + ), + ); + } +} diff --git a/lib/presentation/insurance/insurance_home_page.dart b/lib/presentation/insurance/insurance_home_page.dart new file mode 100644 index 0000000..bd195c3 --- /dev/null +++ b/lib/presentation/insurance/insurance_home_page.dart @@ -0,0 +1,114 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/widgets/insurance_update_details_card.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/widgets/patient_insurance_card.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart'; +import 'package:provider/provider.dart'; + +import 'widgets/insurance_history.dart'; + +class InsuranceHomePage extends StatefulWidget { + const InsuranceHomePage({super.key}); + + @override + State createState() => _InsuranceHomePageState(); +} + +class _InsuranceHomePageState extends State { + late InsuranceViewModel insuranceViewModel; + late AppState appState; + + @override + void initState() { + scheduleMicrotask(() { + insuranceViewModel.initInsuranceProvider(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + insuranceViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: "${LocaleKeys.insurance.tr(context: context)} ${LocaleKeys.updateInsurance.tr(context: context)}", + history: () { + insuranceViewModel.setIsInsuranceHistoryLoading(true); + insuranceViewModel.getPatientInsuranceCardHistory(); + showCommonBottomSheetWithoutHeight(context, child: InsuranceHistory(), callBackFunc: () {}, title: "", isCloseButtonVisible: false, isFullScreen: false); + }, + child: SingleChildScrollView( + child: Consumer(builder: (context, insuranceVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + insuranceVM.isInsuranceLoading + ? LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ).paddingSymmetrical(24.h, 24.h) + : insuranceVM.patientInsuranceList.isNotEmpty + ? Padding( + padding: EdgeInsets.only(top: 24.h), + child: PatientInsuranceCard( + insuranceCardDetailsModel: insuranceVM.patientInsuranceList.first, + isInsuranceExpired: DateTime.now().isAfter(DateUtil.convertStringToDate(insuranceVM.patientInsuranceList.first.cardValidTo))), + ) + : Padding( + padding: EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.12), + child: Utils.getNoDataWidget( + context, + noDataText: "You don't have insurance registered with HMG.".needTranslation, + callToActionButton: CustomButton( + icon: AppAssets.update_insurance_card_icon, + iconColor: AppColors.successColor, + iconSize: 15.h, + text: "${LocaleKeys.updateInsurance.tr(context: context)} ${LocaleKeys.updateInsuranceSubtitle.tr(context: context)}", + onPressed: () { + insuranceViewModel.setIsInsuranceUpdateDetailsLoading(true); + insuranceViewModel.getPatientInsuranceDetailsForUpdate( + appState.getAuthenticatedUser()!.patientId.toString(), appState.getAuthenticatedUser()!.patientIdentificationNo.toString()); + showCommonBottomSheetWithoutHeight(context, + child: PatientInsuranceCardUpdateCard(), callBackFunc: () {}, title: "", isCloseButtonVisible: false, isFullScreen: false); + }, + backgroundColor: AppColors.bgGreenColor.withOpacity(0.20), + borderColor: AppColors.bgGreenColor.withOpacity(0.0), + textColor: AppColors.bgGreenColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ).paddingSymmetrical(64.h, 0.h), + ), + ), + ], + ); + }), + ), + ), + ); + } +} diff --git a/lib/presentation/insurance/widgets/insurance_approval_card.dart b/lib/presentation/insurance/widgets/insurance_approval_card.dart new file mode 100644 index 0000000..bea2e56 --- /dev/null +++ b/lib/presentation/insurance/widgets/insurance_approval_card.dart @@ -0,0 +1,129 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; + +class InsuranceApprovalCard extends StatelessWidget { + InsuranceApprovalCard({super.key, required this.insuranceApprovalResponseModel, required this.isLoading, required this.appState}); + + InsuranceApprovalResponseModel insuranceApprovalResponseModel; + AppState appState; + bool isLoading; + + @override + Widget build(BuildContext context) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + alignment: WrapAlignment.start, + direction: Axis.horizontal, + spacing: 6.h, + runSpacing: 6.h, + children: [ + AppCustomChipWidget( + labelText: isLoading ? "Approved" : insuranceApprovalResponseModel.approvalStatusDescption, + backgroundColor: insuranceApprovalResponseModel.status == 9 ? AppColors.successColor.withOpacity(0.1) : AppColors.primaryRedColor.withOpacity(0.1), + textColor: insuranceApprovalResponseModel.status == 9 ? AppColors.successColor : AppColors.primaryRedColor, + ).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + icon: isLoading ? AppAssets.walkin_appointment_icon : (!insuranceApprovalResponseModel.isLiveCareAppointment! ? AppAssets.walkin_appointment_icon : AppAssets.small_livecare_icon), + iconColor: isLoading + ? AppColors.textColor + : !insuranceApprovalResponseModel.isLiveCareAppointment! + ? AppColors.textColor + : AppColors.whiteColor, + labelText: isLoading + ? "Walk In" + : insuranceApprovalResponseModel.isLiveCareAppointment! + ? LocaleKeys.livecare.tr(context: context) + : "Walk In".needTranslation, + backgroundColor: isLoading ? AppColors.greyColor : (!insuranceApprovalResponseModel.isLiveCareAppointment! ? AppColors.greyColor : AppColors.successColor), + textColor: isLoading ? AppColors.textColor : (!insuranceApprovalResponseModel.isLiveCareAppointment! ? AppColors.textColor : AppColors.whiteColor), + ).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + labelText: isLoading + ? "OutPatient" + : appState.isArabic() + ? insuranceApprovalResponseModel.isInOutPatientDescriptionN! + : insuranceApprovalResponseModel.isInOutPatientDescription!, + backgroundColor: AppColors.primaryRedColor.withOpacity(0.1), + textColor: AppColors.primaryRedColor, + ).toShimmer2(isShow: isLoading), + ], + ).toShimmer2(isShow: isLoading), + SizedBox(height: 16.h), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + isLoading ? "https://hmgwebservices.com/Images/MobileImages/OALAY/1439.png" : insuranceApprovalResponseModel.doctorImageURL!, + width: 63.h, + height: 63.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: isLoading), + SizedBox(width: 16.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (isLoading ? "John Smith" : insuranceApprovalResponseModel.doctorName!).toText16(isBold: true).toShimmer2(isShow: isLoading), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + // AppCustomChipWidget(labelText: isLoading ? "Approved" : insuranceApprovalResponseModel.approvalStatusDescption!, + // backgroundColor: insuranceApprovalResponseModel.status == 9 ? AppColors.successColor.withValues(alpha: 0.1) : AppColors.primaryRedColor.withValues(alpha: 0.1), + // textColor: insuranceApprovalResponseModel.status == 9 ? AppColors.successColor : AppColors.primaryRedColor, + // ).toShimmer2(isShow: isLoading), + AppCustomChipWidget(labelText: isLoading ? "Cardiology" : insuranceApprovalResponseModel.clinicName!).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + icon: AppAssets.doctor_calendar_icon, + labelText: isLoading ? "Cardiology" : DateUtil.formatDateToDate(DateUtil.convertStringToDate(insuranceApprovalResponseModel.submitOn), false)) + .toShimmer2(isShow: isLoading), + isLoading + ? SizedBox.shrink() + : AppCustomChipWidget( + labelText: isLoading ? LocaleKeys.approvalNo.tr(context: context) : "${LocaleKeys.approvalNo.tr(context: context)} ${insuranceApprovalResponseModel.approvalNo}") + .toShimmer2(isShow: isLoading), + ], + ), + ], + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Transform.flip( + flipX: appState.isArabic(), child: Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon_small, width: 15.h, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor)), + ], + ).toShimmer2(isShow: isLoading), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/insurance/widgets/insurance_history.dart b/lib/presentation/insurance/widgets/insurance_history.dart new file mode 100644 index 0000000..1c7b1b9 --- /dev/null +++ b/lib/presentation/insurance/widgets/insurance_history.dart @@ -0,0 +1,124 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart'; +import 'package:provider/provider.dart'; + +class InsuranceHistory extends StatelessWidget { + InsuranceHistory({super.key}); + + late InsuranceViewModel insuranceViewModel; + + @override + Widget build(BuildContext context) { + insuranceViewModel = Provider.of(context); + return Consumer(builder: (context, insuranceVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.history.tr(context: context).toText24(isBold: true), + Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon).onPress(() { + Navigator.of(context).pop(); + }), + ], + ).paddingSymmetrical(24.h, 24.h), + insuranceVM.isInsuranceHistoryLoading + ? LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ).paddingSymmetrical(24.h, 24.h) + : insuranceVM.patientInsuranceCardHistoryList.isNotEmpty + ? ListView.separated( + itemCount: insuranceVM.patientInsuranceCardHistoryList.length, + shrinkWrap: true, + padding: const EdgeInsets.only(left: 0, right: 8), + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 1000), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: Container( + // height: 120.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + CustomButton( + text: insuranceVM.patientInsuranceCardHistoryList[index].statusDescription!, + onPressed: () {}, + backgroundColor: AppColors.primaryRedColor.withOpacity(0.1), + borderColor: AppColors.primaryRedColor.withOpacity(0.0), + textColor: AppColors.primaryRedColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 30.h, + ), + ], + ), + SizedBox(height: 8.h), + // "Haroon Amjad".toText16(weight: FontWeight.w600), + SizedBox(height: 8.h), + Row( + children: [ + Wrap( + direction: Axis.horizontal, + spacing: 4.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + labelText: "File No.: ${insuranceVM.patientInsuranceCardHistoryList[index].patientID}", + ), + AppCustomChipWidget( + labelText: insuranceVM.patientInsuranceCardHistoryList[index].createdOn!, + ), + ], + ), + ], + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ) + : Utils.getNoDataWidget( + context, + noDataText: "No insurance update requests found.".needTranslation, + // isSmallWidget: true, + // width: 62, + // height: 62, + ), + ], + ); + }); + } +} diff --git a/lib/presentation/insurance/widgets/insurance_update_details_card.dart b/lib/presentation/insurance/widgets/insurance_update_details_card.dart new file mode 100644 index 0000000..acdf1c7 --- /dev/null +++ b/lib/presentation/insurance/widgets/insurance_update_details_card.dart @@ -0,0 +1,116 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart'; +import 'package:provider/provider.dart'; + +class PatientInsuranceCardUpdateCard extends StatelessWidget { + PatientInsuranceCardUpdateCard({super.key}); + + late InsuranceViewModel insuranceViewModel; + + @override + Widget build(BuildContext context) { + insuranceViewModel = Provider.of(context); + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.insuranceCards.tr(context: context).toText24(isBold: true), + Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon).onPress(() { + Navigator.of(context).pop(); + }), + ], + ).paddingSymmetrical(24.h, 24.h), + insuranceViewModel.isInsuranceUpdateDetailsLoading + ? LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ).paddingSymmetrical(24.h, 24.h) + : insuranceViewModel.patientInsuranceUpdateResponseModel != null + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Haroon Amjad".toText16(weight: FontWeight.w600), + "Policy: ${insuranceViewModel.patientInsuranceUpdateResponseModel!.policyNumber}".toText12(isBold: true, color: AppColors.lightGrayColor), + SizedBox(height: 8.h), + Row( + children: [ + insuranceViewModel.patientInsuranceUpdateResponseModel!.companyName!.toText12(isBold: true), + SizedBox( + width: 6.h, + ), + Container( + padding: EdgeInsets.symmetric(horizontal: 6.h, vertical: 3.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.infoColor, + borderRadius: 50, + ), + child: insuranceViewModel.patientInsuranceUpdateResponseModel!.subCategory!.toText8(isBold: true, color: AppColors.whiteColor), + ), + ], + ), + SizedBox(height: 8.h), + Row( + children: [ + Wrap( + direction: Axis.horizontal, + spacing: 4.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + icon: AppAssets.doctor_calendar_icon, + labelText: "${LocaleKeys.expiryOn.tr(context: context)} ${insuranceViewModel.patientInsuranceUpdateResponseModel!.effectiveTo}", + ), + AppCustomChipWidget( + labelText: "Member ID: ${insuranceViewModel.patientInsuranceUpdateResponseModel!.memberID!}", + ), + ], + ), + ], + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h) + : Utils.getNoDataWidget(context, noDataText: "No insurance data found...".needTranslation), + SizedBox( + height: 24.h, + ), + CustomButton( + icon: AppAssets.insurance_active_icon, + iconColor: AppColors.whiteColor, + iconSize: 20.w, + text: "${LocaleKeys.updateInsurance.tr(context: context)} ${LocaleKeys.updateInsuranceSubtitle.tr(context: context)}", + onPressed: () {}, + backgroundColor: insuranceViewModel.patientInsuranceUpdateResponseModel != null ? AppColors.successColor : AppColors.lightGrayBGColor, + borderColor: AppColors.successColor.withOpacity(0.01), + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + ).paddingSymmetrical(24.w, 0.h), + ], + ); + } +} diff --git a/lib/presentation/insurance/widgets/patient_insurance_card.dart b/lib/presentation/insurance/widgets/patient_insurance_card.dart new file mode 100644 index 0000000..5190e5b --- /dev/null +++ b/lib/presentation/insurance/widgets/patient_insurance_card.dart @@ -0,0 +1,117 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_details_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/widgets/insurance_update_details_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:provider/provider.dart'; + +class PatientInsuranceCard extends StatelessWidget { + PatientInsuranceCard({super.key, required this.insuranceCardDetailsModel, required this.isInsuranceExpired}); + + PatientInsuranceDetailsResponseModel insuranceCardDetailsModel; + bool isInsuranceExpired = false; + + late InsuranceViewModel insuranceViewModel; + late AppState appState; + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + insuranceViewModel = Provider.of(context); + return Container( + width: double.infinity, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}".toText18(isBold: true), + "Policy: ${insuranceCardDetailsModel.insurancePolicyNo}".toText12(isBold: true, color: AppColors.lightGrayColor), + ], + ), + AppCustomChipWidget( + icon: isInsuranceExpired ? AppAssets.cancel_circle_icon : AppAssets.insurance_active_icon, + labelText: isInsuranceExpired ? "Insurance Expired".needTranslation : "Insurance Active".needTranslation, + iconColor: isInsuranceExpired ? AppColors.primaryRedColor : AppColors.successColor, + textColor: isInsuranceExpired ? AppColors.primaryRedColor : AppColors.successColor, + iconSize: 12, + backgroundColor: isInsuranceExpired ? AppColors.primaryRedColor.withOpacity(0.1) : AppColors.successColor.withOpacity(0.1), + labelPadding: EdgeInsetsDirectional.only(start: -4.h, end: 8.h), + ), + ], + ), + SizedBox(height: 12.h), + insuranceCardDetailsModel.groupName!.toText12(isBold: true), + insuranceCardDetailsModel.companyName!.toText12(isBold: true), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 4.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + icon: AppAssets.doctor_calendar_icon, + labelText: "${LocaleKeys.expiryDate.tr(context: context)} ${DateUtil.formatDateToDate(DateUtil.convertStringToDate(insuranceCardDetailsModel.cardValidTo), false)}", + labelPadding: EdgeInsetsDirectional.only(start: -4.h, end: 8.h), + ), + AppCustomChipWidget(labelText: "Patient Card ID: ${insuranceCardDetailsModel.patientCardID}".needTranslation), + ], + ), + SizedBox(height: 10.h), + isInsuranceExpired + ? CustomButton( + icon: AppAssets.update_insurance_card_icon, + iconColor: AppColors.successColor, + iconSize: 15.h, + text: "${LocaleKeys.updateInsurance.tr(context: context)} ${LocaleKeys.updateInsuranceSubtitle.tr(context: context)}", + onPressed: () { + insuranceViewModel.setIsInsuranceUpdateDetailsLoading(true); + insuranceViewModel.getPatientInsuranceDetailsForUpdate( + appState.getAuthenticatedUser()!.patientId.toString(), appState.getAuthenticatedUser()!.patientIdentificationNo.toString()); + showCommonBottomSheetWithoutHeight(context, + child: PatientInsuranceCardUpdateCard(), + callBackFunc: () {}, + title: "", + // height: ResponsiveExtension.screenHeight * 0.42, + isCloseButtonVisible: false, + isFullScreen: false); + }, + backgroundColor: AppColors.bgGreenColor.withOpacity(0.20), + borderColor: AppColors.bgGreenColor.withOpacity(0.0), + textColor: AppColors.bgGreenColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ) + : Container(), + ], + ), + ), + ).paddingSymmetrical(24.h, 0.h); + } +} diff --git a/lib/presentation/lab/lab_order_by_test.dart b/lib/presentation/lab/lab_order_by_test.dart new file mode 100644 index 0000000..2b791ae --- /dev/null +++ b/lib/presentation/lab/lab_order_by_test.dart @@ -0,0 +1,83 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; + +class LabOrderByTest extends StatelessWidget { + final VoidCallback onTap; + final int index; + final TestDetails? tests; + final bool isLoading; + final bool isExpanded; + final AppState appState; + + const LabOrderByTest({super.key, required this.onTap, required this.appState, this.tests, required this.index, this.isLoading = false, this.isExpanded = false}); + + @override + build(BuildContext context) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + margin: EdgeInsets.symmetric(vertical: 8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), + child: Container( + key: ValueKey(index), + padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + '${tests!.description}'.toText16(isBold: true), + SizedBox(height: 4.h), + (appState.isArabic() ? tests!.testDescriptionAr : tests!.testDescriptionEn)!.toText12(fontWeight: FontWeight.w500), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppCustomChipWidget( + richText: '${"Last Tested:".needTranslation} ${DateUtil.formatDateToDate(DateUtil.convertStringToDate(tests!.createdOn), false)}'.toText12(fontWeight: FontWeight.w500), + backgroundColor: AppColors.greyLightColor, + textColor: AppColors.textColor, + ), + ], + ), + SizedBox(height: 16.h), + Row( + children: [ + Expanded(child: Container()), + Expanded( + child: CustomButton( + icon: AppAssets.view_report_icon, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + text: LocaleKeys.viewReport.tr(context: context), + onPressed: () { + onTap(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + ), + ], + ), + ], + ), + )); + } +} diff --git a/lib/presentation/lab/lab_orders_page.dart b/lib/presentation/lab/lab_orders_page.dart new file mode 100644 index 0000000..0b9d093 --- /dev/null +++ b/lib/presentation/lab/lab_orders_page.dart @@ -0,0 +1 @@ +import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_order_by_test.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import '../../widgets/appbar/collapsing_list_view.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingListView( title: LocaleKeys.labResults.tr(), search: () async { final lavVM = Provider.of(context, listen: false); if (lavVM.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; lavVM.filterLabReports(value); } } }, child: SingleChildScrollView( padding: EdgeInsets.all(24.h), physics: NeverScrollableScrollPhysics(), child: Consumer( builder: (context, model, child) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: 16.h), CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, "By Visit".needTranslation), CustomTabBarModel(null, "By Test".needTranslation), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), SizedBox(height: 16.h), selectedFilterText!.isNotEmpty ? CustomChipWidget( chipText: selectedFilterText!, chipType: ChipTypeEnum.alert, isSelected: true, ) : SizedBox(), activeIndex == 0 ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.isLabOrdersLoading ? 5 : model.patientLabOrders.isNotEmpty ? model.patientLabOrders.length : 1, itemBuilder: (context, index) { final isExpanded = expandedIndex == index; return model.isLabOrdersLoading ? LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ) : model.patientLabOrders.isNotEmpty ? AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: LabResultItemView( onTap: () { model.currentlySelectedPatientOrder = model.patientLabOrders[ index]; labProvider.getPatientLabResultByHospital(model.patientLabOrders[ index]); labProvider .getPatientSpecialResult( model.patientLabOrders[ index]); Navigator.push( context, CustomPageRoute( page: LabResultByClinic(labOrder: model.patientLabOrders[index]), )); }, labOrder: model.patientLabOrders[index], index: index, isExpanded: isExpanded), ), ), ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation); }, ) : ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.isLabOrdersLoading ? 5 : model.uniqueTests.toList().isNotEmpty ? model.uniqueTests.toList().length : 1, itemBuilder: (context, index) { final isExpanded = expandedIndex == index; return model.isLabOrdersLoading ? LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ) : model.uniqueTests.toList().isNotEmpty ? AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: LabOrderByTest( appState: _appState, onTap: () { if (model.uniqueTests.toList()[index].model != null) { rangeViewModel.flush(); model.getPatientLabResult(model.uniqueTests.toList()[index].model!, model.uniqueTests.toList()[index].description!, (_appState.isArabic() ? model.uniqueTests.toList()[index].testDescriptionAr! : model.uniqueTests.toList()[index].testDescriptionEn!)); } }, tests: model.uniqueTests.toList()[index], index: index, isExpanded: isExpanded)), ), ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation); }, ) ], ); }, ), ), )); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file diff --git a/lib/presentation/lab/lab_result_item_view.dart b/lib/presentation/lab/lab_result_item_view.dart new file mode 100644 index 0000000..9269c6d --- /dev/null +++ b/lib/presentation/lab/lab_result_item_view.dart @@ -0,0 +1,187 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; + +class LabResultItemView extends StatelessWidget { + final VoidCallback onTap; + final int index; + final PatientLabOrdersResponseModel? labOrder; + final bool isLoading; + final bool isExpanded; + + LabResultItemView({Key? key, required this.onTap, this.labOrder, required this.index, this.isLoading = false, this.isExpanded = false}) : super(key: key); + + @override + Widget build(BuildContext context) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + margin: EdgeInsets.symmetric(vertical: 8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), + child: InkWell( + onTap: () { + if (!isLoading) { + onTap(); + } + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppCustomChipWidget( + labelText: getLabOrderStatusText(labOrder?.status ?? 0, context), + backgroundColor: getLabOrderStatusColor(labOrder?.status ?? 0).withOpacity(0.15), + textColor: getLabOrderStatusColor(labOrder?.status ?? 0), + ).toShimmer2(isShow: isLoading, width: 100), + // if (!isLoading) Icon(isExpanded ? Icons.expand_less : Icons.expand_more), + ], + ), + SizedBox(height: 8.h), + Row( + children: [ + Image.network( + isLoading ? "" : labOrder!.doctorImageURL!, + width: 24.h, + height: 24.h, + fit: BoxFit.cover, + errorBuilder: (cxt, child, tr) { + return SizedBox(height: 24, width: 24); + }, + ).toShimmer2(isShow: isLoading).circle(100), + SizedBox(width: 4.h), + (labOrder?.doctorName ?? "").toText16(isBold: true).toShimmer2(isShow: isLoading, width: 200) + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Wrap( + spacing: 8.h, + runSpacing: 0.h, + children: [ + AppCustomChipWidget(labelText: isLoading ? "null" : DateUtil.formatDateToDate(DateUtil.convertStringToDate(labOrder!.createdOn), false)).toShimmer2(isShow: isLoading, width: 70), + AppCustomChipWidget(labelText: isLoading ? "null" : labOrder!.clinicDescription!).toShimmer2(isShow: isLoading, width: 100), + ], + ), + isLoading + ? SizedBox.shrink() + : Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.textColor, + width: 20.h, + height: 14.h, + fit: BoxFit.contain, + ), + ], + ), + ], + ), + ), + // AnimatedSwitcher( + // duration: Duration(milliseconds: 300), + // switchInCurve: Curves.easeIn, + // switchOutCurve: Curves.easeOut, + // transitionBuilder: (Widget child, Animation animation) { + // return FadeTransition( + // opacity: animation, + // child: SizeTransition( + // sizeFactor: animation, + // axisAlignment: 0.0, + // child: child, + // ), + // ); + // }, + // child: isExpanded + // ? Container( + // key: ValueKey(index), + // padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ...labOrder!.testDetails!.map((detail) { + // return Padding( + // padding: EdgeInsets.only(bottom: 8.h), + // child: '● ${detail.description}'.toText14(weight: FontWeight.w500), + // ); + // }).toList(), + // SizedBox(height: 16.h), + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // SizedBox(), + // CustomButton( + // icon: AppAssets.view_report_icon, + // iconColor: AppColors.primaryRedColor, + // iconSize: 16.h, + // text: LocaleKeys.viewReport.tr(context: context), + // onPressed: () {}, + // backgroundColor: AppColors.secondaryLightRedColor, + // borderColor: AppColors.secondaryLightRedColor, + // textColor: AppColors.primaryRedColor, + // fontSize: 14, + // fontWeight: FontWeight.bold, + // borderRadius: 12, + // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + // height: 40.h, + // ), + // ], + // ), + // ], + // ), + // ) + // : SizedBox.shrink(key: ValueKey(-index)), + // ), + ], + ), + ), + ); + } + + String getLabOrderStatusText(num status, context) { + switch (status) { + case 44: + return LocaleKeys.resultsPending.tr(context: context); + case 45: + return LocaleKeys.resultsPending.tr(context: context); + case 16: + return LocaleKeys.resultsAvailable.tr(context: context); + case 17: + return LocaleKeys.resultsAvailable.tr(context: context); + default: + return ""; + } + } + + Color getLabOrderStatusColor(num status) { + switch (status) { + case 44: + return AppColors.warningColorYellow; + case 45: + return AppColors.warningColorYellow; + case 16: + return AppColors.successColor; + case 17: + return AppColors.successColor; + default: + return AppColors.greyColor; + } + } +} diff --git a/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart b/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart new file mode 100644 index 0000000..a603ecb --- /dev/null +++ b/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart @@ -0,0 +1,144 @@ +import 'package:easy_localization/easy_localization.dart' + show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultList.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/lab_order_specialResult.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:open_filex/open_filex.dart'; +import 'package:provider/provider.dart'; + +class LabResultByClinic extends StatelessWidget { + LabResultByClinic({required this.labOrder, Key? key}); + + late LabViewModel labViewModel; + PatientLabOrdersResponseModel labOrder; + @override + Widget build(BuildContext context) { + labViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: LocaleKeys.labResults.tr(), + child: SingleChildScrollView( + child: Column( + spacing: 8.h, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Selector( + selector: (_, model) => model.isLabResultByHospitalLoading, + builder: (_, isLoading, __) { + if (isLoading) { + return Column( + children: [ + LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ), + LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ), + LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ), + LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ), + ], + ); + } else { + return LabResultList(); + } + }, + ), + LabOrderSpecialResult() + ], + ).paddingAll(24.h), + )), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: CustomButton( + text: "Download report".needTranslation, + onPressed: () async { + LoaderBottomSheet.showLoader(loadingText: "Generating report, Please wait...".needTranslation); + await labViewModel + .getLabResultReportPDF( + labOrder: labOrder, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }) + .then((val) async { + LoaderBottomSheet.hideLoader(); + if (labViewModel.patientLabResultReportPDFBase64.isNotEmpty) { + String path = await Utils.createFileFromString(labViewModel.patientLabResultReportPDFBase64, "pdf"); + try { + OpenFilex.open(path); + } catch (ex) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Cannot open file".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } + }); + }, + backgroundColor: AppColors.successColor, + borderColor: AppColors.successColor, + textColor: AppColors.whiteColor, + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 45.h, + icon: AppAssets.download, + iconColor: AppColors.whiteColor, + iconSize: 20.h, + ).paddingSymmetrical(24.h, 24.h), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/lab/lab_result_via_clinic/LabResultList.dart b/lib/presentation/lab/lab_result_via_clinic/LabResultList.dart new file mode 100644 index 0000000..8893ffd --- /dev/null +++ b/lib/presentation/lab/lab_result_via_clinic/LabResultList.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/lab_result.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart'; +import 'package:provider/provider.dart' show Selector, Provider, ReadContext; + +class LabResultList extends StatelessWidget { + late LabViewModel model; + + @override + Widget build(BuildContext context) { + model = Provider.of(context); + return Selector>( + selector: (_, model) => model.mainLabResultsByHospitals, + builder: (__, list, ___) { + if (list.isEmpty && context.read().labSpecialResult.isEmpty) { + return Utils.getNoDataWidget(context, + noDataText: "You don't have any lab results yet." + .needTranslation); + } else { + return ListView.builder( + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + shrinkWrap: true,itemCount: list.length,itemBuilder: (____, index) { + var labItem = list[index]; + return LabOrderResultItem(onTap: () { + model.getPatientLabResult(model.currentlySelectedPatientOrder!, labItem.description ?? "", labItem.packageShortDescription!); + }, + tests: labItem, + index: index, + iconColor: model.getColor(labItem.calculatedResultFlag ?? "N"), + severityText: model.getSeverityText(labItem.calculatedResultFlag ?? "N")); + }); + } + }, + ); + } +} \ No newline at end of file diff --git a/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart new file mode 100644 index 0000000..36cdc2b --- /dev/null +++ b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart @@ -0,0 +1,137 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart' show LabViewModel; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/lab_result.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; +import 'package:provider/provider.dart'; + +class LabOrderResultItem extends StatelessWidget { + final VoidCallback onTap; + final int index; + final LabResult? tests; + final String severityText; + final bool isLoading; + final bool isExpanded; + final Color iconColor; + + const LabOrderResultItem({super.key, required this.onTap, this.tests, required this.index, this.isLoading = false, this.isExpanded = false,required this.iconColor, required this.severityText}); + + @override + build(BuildContext context) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + margin: EdgeInsets.symmetric(vertical: 8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), + child: Container( + key: ValueKey(index), + padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // ...labOrder!.testDetails!.map((detail) { + Padding( + padding: EdgeInsets.only(bottom: 8.h), + child: '${tests!.description}'.toText14(weight: FontWeight.w500), + ), + '${tests!.packageShortDescription}'.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + SizedBox(height: 12.h), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Flexible( + child: Text( + "${tests?.resultValue} ${tests?.uOM}", + style: TextStyle( + fontSize: 24.f, + fontWeight: FontWeight.w600, + fontFamily: 'Poppins', + color: context.read().getColor( + tests?.calculatedResultFlag ?? "", + ), + letterSpacing: -2, + ), + ), + ), + SizedBox(width: 4.h,), + Visibility( + visible: tests?.checkIfGraphShouldBeDisplayed() == true, + child: Expanded( + flex: 2, + child: Visibility( + visible: tests?.referanceRange != null, + child: Text( + "(Reference range ${tests?.referanceRange})".needTranslation, + style: TextStyle( + fontSize: 12.f, + fontWeight: FontWeight.w500, + fontFamily: 'Poppins', + color: AppColors.greyTextColor, + ), + // overflow: TextOverflow.ellipsis, + // maxLines: 2, + softWrap: true, + ), + ), + ), + ) + ], + ), + + SizedBox(height: 12.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Visibility( + visible: tests?.checkIfGraphShouldBeDisplayed() == true, + child: Column( + spacing: 6.h, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + severityText.tr().toText10( + weight: FontWeight.w500, + color: AppColors.greyTextColor), + Utils.buildSvgWithAssets( + icon: AppAssets.lab_result_indicator, + width: 21, + height: 23, + iconColor: iconColor), + ], + ), + ), + CustomButton( + icon: AppAssets.view_report_icon, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + text: LocaleKeys.viewReport.tr(context: context), + onPressed: () { + onTap(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + ], + ), + ], + ), + )); + } +} diff --git a/lib/presentation/lab/lab_result_via_clinic/lab_order_specialResult.dart b/lib/presentation/lab/lab_result_via_clinic/lab_order_specialResult.dart new file mode 100644 index 0000000..5f71a7e --- /dev/null +++ b/lib/presentation/lab/lab_result_via_clinic/lab_order_specialResult.dart @@ -0,0 +1,120 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:provider/provider.dart'; + +class LabOrderSpecialResult extends StatelessWidget { + const LabOrderSpecialResult({super.key}); + + @override + Widget build(BuildContext context) { + return Selector( + selector: (_, model) => model.isSpecialResultsLoading, + builder: (_, isLoading, __) { + return Selector( + selector: (_, model) => model.labSpecialResult, + builder: (_, data, __) { + if(isLoading){ + return Container( + margin: EdgeInsets.symmetric(vertical: 8.h), + padding: EdgeInsets.symmetric( + horizontal: 16.h, vertical: 16.h), + width: MediaQuery.sizeOf(context).width - 24, + decoration: RoundedRectangleBorder() + .toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true), + child:Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12.h, + children: [ + "loading".toText14().toShimmer2(isShow: isLoading), + "loading".toText14().toShimmer2(isShow: isLoading), + ], + ) + ); + } + if(data.isNotEmpty ) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + margin: EdgeInsets.symmetric(vertical: 8.h), + decoration: RoundedRectangleBorder() + .toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true), + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 16.h, vertical: 16.h), + width: MediaQuery.sizeOf(context).width - 24, + child: Column( + spacing: 8.h, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // ...labOrder!.testDetails!.map((detail) { + LocaleKeys.specialResult + .tr() + .toText14(weight: FontWeight.w500) + .toShimmer2(isShow: isLoading), + + data.isEmpty + ? LocaleKeys.noSpecialResult + .tr() + .toText12( + fontWeight: FontWeight.w500, + color: AppColors.textColorLight) + .toShimmer2(isShow: isLoading) + : HtmlWidget(data).toShimmer2(isShow: isLoading) + + // + ], + ), + )); + } return SizedBox.shrink(); + }); + + }); + } +} + +/*Text( + "Special Results", + style: TextStyle( + fontSize: 18.fSize, + fontWeight: FontWeight.w600, + color: AppColors.blackColor), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true + ), + padding: EdgeInsets.all(16.h), + width: MediaQuery.sizeOf(context).width-24, + child: Selector( + selector: (_, model) => + model.isLabResultByHospitalLoading, + builder: (_, isLoading, __) { + return Selector( + selector: (_, model) => model.labSpecialResult, + builder: (_, data, __) { + return (data.isEmpty) + ? Text("No result available".needTranslation, + style: TextStyle( + fontSize: 12.fSize, + fontWeight: FontWeight.w500, + color: AppColors.textColorLight)) + .toShimmer2(isShow: isLoading) + : HtmlWidget(data) + .toShimmer2(isShow: isLoading); + }); + }))*/ diff --git a/lib/presentation/lab/lab_results/lab_result_details.dart b/lib/presentation/lab/lab_results/lab_result_details.dart new file mode 100644 index 0000000..2330d0d --- /dev/null +++ b/lib/presentation/lab/lab_results/lab_result_details.dart @@ -0,0 +1,381 @@ + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/lab_result.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/date_range_calender.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_results/lab_result_list_item.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/graph/custom_graph.dart'; +import 'package:provider/provider.dart' show Consumer, Provider, ReadContext; + +import '../../../widgets/common_bottom_sheet.dart' + show showCommonBottomSheetWithoutHeight; + +class LabResultDetails extends StatelessWidget { + final LabResult recentLabResult; + final String? testDescription; + + const LabResultDetails( + {super.key, + required this.recentLabResult, + required this.testDescription}); + + @override + Widget build(BuildContext context) { + return CollapsingListView( + title: 'Lab Result Details'.needTranslation, + child: SingleChildScrollView( + child: Column( + spacing: 16.h, + children: [ + LabNameAndStatus(context), + getLabDescription(context), + LabGraph(context) + ], + ).paddingAll(24.h), + ), + ); + } + + Widget LabNameAndStatus(BuildContext context) => Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8.h, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + recentLabResult.testCode ?? "", + style: TextStyle( + fontSize: 32, + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + color: AppColors.textColor, + letterSpacing: -2), + ), + Text( + "Result of ${recentLabResult.verifiedOn ?? ""}".needTranslation, + style: TextStyle( + fontSize: 12, + fontFamily: 'Poppins', + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ), + ), + ], + ), + //todo change the text color according to the provided test values + Row( + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Expanded( + child: Row( + + mainAxisSize: MainAxisSize.max, + children: [ + Flexible( + child: Text( + "${recentLabResult.resultValue} ${recentLabResult.uOM}" ?? + "", + style: TextStyle( + fontSize: 24.f, + fontWeight: FontWeight.w600, + fontFamily: 'Poppins', + color: context.read().getColor( + recentLabResult.calculatedResultFlag ?? "", + ), + letterSpacing: -2, + ), + overflow: TextOverflow.ellipsis, // prevent overflow + maxLines: 1, + softWrap: false, + ), + ), + SizedBox(width: 4.h,), + Expanded( + flex: 2, + child: Visibility( + visible: recentLabResult.referanceRange != null, + child: Text( + "(Reference range ${recentLabResult.referanceRange})".needTranslation, + style: TextStyle( + fontSize: 12.f, + fontWeight: FontWeight.w500, + fontFamily: 'Poppins', + color: AppColors.greyTextColor, + ), + // overflow: TextOverflow.ellipsis, + // maxLines: 2, + softWrap: true, + ), + ), + ), + ], + ), + ), + Visibility( + visible: + recentLabResult.checkIfGraphShouldBeDisplayed() == true, + child: Column( + spacing: 6.h, + children: [ + context + .read() + .getSeverityText( + recentLabResult.calculatedResultFlag ?? "", + ) + .tr() + .toText10( + weight: FontWeight.w500, + color: AppColors.greyTextColor), + Utils.buildSvgWithAssets( + icon: AppAssets.lab_result_indicator, + width: 21, + height: 23, + iconColor: context.read().getColor( + recentLabResult.calculatedResultFlag ?? "", + )), + ], + ), + ), + // SizedBox( + // width: 21, + // child: Utils.buildSvgWithAssets( + // icon: AppAssets.lab_result_indicator, + // width: 21, + // height: 23, + // iconColor: context.read().getColor( + // recentLabResult.calculatedResultFlag ?? "", + // ), + // ), + // ), + ], + ) + + ], + )); + + Widget LabGraph(BuildContext context) => Consumer( + builder: (_, labmodel, ___) => Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + height: labmodel.isGraphVisible + ? 260.h + : (labmodel.filteredGraphValues.length < 3) + ? (labmodel.filteredGraphValues.length * 64) + 80.h + : 260.h, + padding: EdgeInsets.all(16.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + //title and filter icon + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + labmodel.isGraphVisible + ? LocaleKeys.historyFlowchart.tr() + : LocaleKeys.history.tr(), + style: TextStyle( + fontSize: 16, + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + color: AppColors.textColor, + ), + ), + Row( + spacing: 16.h, + children: [ + //todo handle when the graph icon is being displayed + Utils.buildSvgWithAssets( + icon: labmodel.isGraphVisible + ? AppAssets.ic_list + : AppAssets.ic_graph, + width: 24.h, + height: 24.h) + .onPress(() { + if (labmodel.shouldShowGraph) { + labmodel.alterGraphVisibility(); + } + }), + Utils.buildSvgWithAssets( + icon: AppAssets.ic_date_filter, + width: 24, + height: 24) + .onPress(() { + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.setTheDateRange.tr(), + context, + child: DateRangeSelector( + onRangeSelected: (start, end) { + // if (start != null) { + labmodel.getSelectedDateRange(start, end); + // } + }, + ), + isFullScreen: false, + isCloseButtonVisible: true, + callBackFunc: () {}, + ); + }), + ], + ) + ], + ).paddingOnly(bottom: labmodel.isGraphVisible ? 16.h : 24.h), + historyBody(labmodel) + ], + )), + ); + + Widget leftLabels(String value) { + return Text( + value, + style: TextStyle( + fontWeight: FontWeight.w600, + fontFamily: 'Poppins', + fontSize: 8.f, + color: AppColors.textColor, + ), + ); + } + + Widget buildBottomLabel(String label) { + return Padding( + padding: const EdgeInsets.only(top:8.0), + child: Text( + label, + style: TextStyle( + fontSize: 8.f, + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + color: AppColors.labelTextColor), + ), + ); + } + + Widget historyBody(LabViewModel labmodel) { + if (labmodel.isGraphVisible && labmodel.shouldShowGraph) { + var graphColor = labmodel.getColor(recentLabResult.calculatedResultFlag??"N"); + return CustomGraph( + dataPoints: labmodel.filteredGraphValues, + makeGraphBasedOnActualValue: true, + leftLabelReservedSize: 40, + leftLabelInterval: getInterval(labmodel), + maxY: (labmodel.maxY)+(getInterval(labmodel)??0)/2, + maxX: labmodel.filteredGraphValues.length.toDouble()-.75, + leftLabelFormatter: (value) { + return leftLabels(value.toStringAsFixed(2)); + // switch (value.toInt()) { + // case 10: + // return leftLabels("Critical Low".needTranslation); + // case 30: + // return leftLabels("Low".needTranslation); + // case 50: + // return leftLabels("Normal".needTranslation); + // case 70: + // return leftLabels("High".needTranslation); + // case 90: + // return leftLabels( + // "Critical High".needTranslation); + // default: + // return SizedBox.shrink(); + // } + }, + graphColor:graphColor , + graphShadowColor: graphColor.withOpacity(.1), + graphGridColor: graphColor.withOpacity(.4), + bottomLabelFormatter: (value, data) { + if(data.isEmpty) return SizedBox.shrink(); + if (value == 0) { + return buildBottomLabel(data[value.toInt()].label); + } + if (value == data.length - 1) { + return buildBottomLabel(data[value.toInt()].label); + } + if (value == ((data.length - 1) / 2)) { + return buildBottomLabel(data[value.toInt()].label); + } + return SizedBox.shrink(); + }, + minX:(labmodel.filteredGraphValues.length == 1)?null : -.2, + scrollDirection: Axis.horizontal, + height: 180.h); + }else { + return labHistoryList(labmodel); + } + } + + Widget labHistoryList(LabViewModel labmodel) { + return SizedBox( + height: labmodel.filteredGraphValues.length<3?labmodel.filteredGraphValues.length*64:180.h, + child: ListView.separated( + padding: EdgeInsets.zero, + itemCount: labmodel.filteredGraphValues.length,itemBuilder: (context, index){ + var data = labmodel.filteredGraphValues.reversed.toList()[index]; + return LabHistoryItem( + dayNameAndDate: labmodel.getFormattedDate(data.time), + result: data.actualValue, + assetUrl: labmodel.getAssetUrlWRTResult(data.referenceValue), + shouldRotateIcon: labmodel.getRotationWRTResult(data.referenceValue), + ); + }, + separatorBuilder: (_, __) => Divider( + color: AppColors.spacerLineColor, + thickness: 1.h, + ).paddingOnly(top: 4.h, bottom: 4.h), + ), + ); + } + + double? getInterval(LabViewModel labmodel) { + var maxX = labmodel.maxY; + if(maxX<1) return .5; + if(maxX >1 && maxX < 5) return 1; + if(maxX >5 && maxX < 10) return 5; + if(maxX >10 && maxX < 50) return 10; + if(maxX >50 && maxX < 100) return 20; + if(maxX >100 && maxX < 200) return 30; + return 50; + } + + Widget getLabDescription(BuildContext context) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8.h, + children: [ + "What is this result?" + .needTranslation + .toText16(weight: FontWeight.w600, color: AppColors.textColor), + testDescription?.toText12( + fontWeight: FontWeight.w500, color: AppColors.textColorLight) ?? + SizedBox.shrink() + ], + )); + } +} diff --git a/lib/presentation/lab/lab_results/lab_result_list_item.dart b/lib/presentation/lab/lab_results/lab_result_list_item.dart new file mode 100644 index 0000000..f90df7b --- /dev/null +++ b/lib/presentation/lab/lab_results/lab_result_list_item.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart' ; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class LabHistoryItem extends StatelessWidget{ + + final String dayNameAndDate; + final String result; + final String assetUrl; + final bool shouldRotateIcon; + + const LabHistoryItem({super.key, required this.dayNameAndDate, required this.result, required this.assetUrl, this.shouldRotateIcon = false}); + + @override + Widget build(BuildContext context) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + dayNameAndDate, + style: TextStyle( + fontSize: 14.f, + fontWeight: FontWeight.w500, + fontFamily: 'Poppins', + color: AppColors.labelTextColor + ), + ), + Text( + result, + style: TextStyle( + fontSize: 18.f, + fontWeight: FontWeight.w600, + fontFamily: 'Poppins', + color: AppColors.textColor + ), + ) + ], + ), + Transform.flip( + flipY: shouldRotateIcon, + child: Utils.buildSvgWithAssets(icon: assetUrl,height: 18, width: 18) + ), + ], + ); + +} \ No newline at end of file diff --git a/lib/presentation/lab/search_lab_report.dart b/lib/presentation/lab/search_lab_report.dart new file mode 100644 index 0000000..f1fd389 --- /dev/null +++ b/lib/presentation/lab/search_lab_report.dart @@ -0,0 +1,154 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:sizer/sizer.dart'; + +class SearchLabResultsContent extends StatefulWidget { + final List labSuggestionsList; + + const SearchLabResultsContent({super.key, required this.labSuggestionsList}); + + @override + State createState() => _SearchLabResultsContentState(); +} + +class _SearchLabResultsContentState extends State { + TextEditingController searchEditingController = TextEditingController(); + List filteredSuggestions = []; + + @override + void initState() { + super.initState(); + filteredSuggestions = List.from(widget.labSuggestionsList); + + // Listen for changes in the search field + searchEditingController.addListener(() { + filterSuggestions(); + }); + } + + @override + void dispose() { + searchEditingController.dispose(); + super.dispose(); + } + + void filterSuggestions() { + final query = searchEditingController.text.toLowerCase(); + + if (query.isEmpty) { + setState(() { + filteredSuggestions = List.from(widget.labSuggestionsList); + }); + } else { + setState(() { + filteredSuggestions = widget.labSuggestionsList.where((suggestion) => suggestion.toLowerCase().contains(query)).toList(); + }); + } + } + + @override + Widget build(BuildContext context) { + return CollapsingListView( + title: LocaleKeys.labResults.tr(), + isClose: true, + bottomChild: Container( + color: Colors.white, + padding: EdgeInsets.all(ResponsiveExtension(20).h), + child: CustomButton( + text: LocaleKeys.search.tr(), + icon: AppAssets.search_icon, + iconColor: Colors.white, + onPressed: () => Navigator.pop(context, searchEditingController.text), + ), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 24, right: 24, top: 24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextInputWidget( + labelText: "Search lab results", + hintText: "Type test name", + controller: searchEditingController, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), + ), + SizedBox(height: ResponsiveExtension(20).h), + if (filteredSuggestions.isNotEmpty) ...[ + "Suggestions".toText16(isBold: true), + ], + ], + ), + ), + SingleChildScrollView( + physics: NeverScrollableScrollPhysics(), + padding: const EdgeInsets.only(left: 24, right: 24, bottom: 24, top: 16), + child: Wrap( + alignment: WrapAlignment.start, + spacing: 10, + runSpacing: 10, + children: filteredSuggestions + .map((label) => SuggestionChip( + label: label, + onTap: () { + searchEditingController.text = label; + }, + )) + .toList(), + ), + ), + ], + ), + ); + } +} + +class SuggestionChip extends StatelessWidget { + final String label; + final bool isSelected; + final VoidCallback? onTap; + + const SuggestionChip({ + super.key, + required this.label, + this.isSelected = false, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + color: isSelected ? AppColors.primaryRedColor : AppColors.whiteColor, + borderRadius: BorderRadius.circular(8), + ), + child: label.toText12( + color: isSelected ? Colors.white : Colors.black87, + fontWeight: FontWeight.w500, + ), + ), + ); + } +} diff --git a/lib/presentation/medical_file/eye_measurement_details_page.dart b/lib/presentation/medical_file/eye_measurement_details_page.dart new file mode 100644 index 0000000..e69766a --- /dev/null +++ b/lib/presentation/medical_file/eye_measurement_details_page.dart @@ -0,0 +1,198 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/main.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; +import 'package:provider/provider.dart'; + +class EyeMeasurementDetailsPage extends StatelessWidget { + EyeMeasurementDetailsPage({super.key, required this.patientAppointmentHistoryResponseModel}); + + final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; + late BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + Widget build(BuildContext context) { + bookAppointmentsViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: LocaleKeys.eyeMeasurements.tr(), + child: SingleChildScrollView( + child: Consumer(builder: (context, myAppointmentsVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: AppointmentCard( + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, + myAppointmentsViewModel: myAppointmentsVM, + bookAppointmentsViewModel: bookAppointmentsViewModel, + isLoading: false, + isFromHomePage: false, + isFromMedicalReport: true, + isForEyeMeasurements: true, + ), + ), + SizedBox(height: 16.h), + CustomTabBar( + activeTextColor: AppColors.primaryRedColor, + activeBackgroundColor: AppColors.primaryRedColor.withValues(alpha: .1), + tabs: [ + CustomTabBarModel(null, LocaleKeys.classes.tr()), + CustomTabBarModel(null, LocaleKeys.contactLens.tr()), + ], + onTabChange: (index) { + myAppointmentsVM.onEyeMeasurementsTabChanged(index); + }, + ), + SizedBox(height: 12.h), + getSelectedTabContent(myAppointmentsVM), + ], + ).paddingSymmetrical(24.w, 0); + }), + ), + ), + ); + } + + Widget getSelectedTabContent(MyAppointmentsViewModel myAppointmentsVM) { + switch (myAppointmentsVM.eyeMeasurementsTabSelectedIndex) { + case 0: + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r, hasShadow: true), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.rightEye.tr().toText14(isBold: true), + SizedBox(height: 16.h), + getRow(LocaleKeys.sphere.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].rightEyeSpherical}', '-'), + getRow(LocaleKeys.cylinder.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].rightEyeCylinder}', '-'), + getRow(LocaleKeys.axis.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].rightEyeAxis}', '-'), + getRow(LocaleKeys.prism.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].rightEyePrism}', '-'), + getRow(LocaleKeys.va.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].rightEyeVA}', '-'), + getRow(LocaleKeys.remarks.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].rightEyeRemarks}', '-', isLast: true), + ], + ), + ), + SizedBox(height: 16.h), + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r, hasShadow: true), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.leftEye.tr().needTranslation.toText14(isBold: true), + SizedBox(height: 16.h), + getRow(LocaleKeys.sphere.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].leftEyeSpherical}', '-'), + getRow(LocaleKeys.cylinder.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].leftEyeCylinder}', '-'), + getRow(LocaleKeys.axis.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].leftEyeAxis}', '-'), + getRow(LocaleKeys.prism.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].leftEyePrism}', '-'), + getRow(LocaleKeys.va.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].leftEyeVA}', '-'), + getRow(LocaleKeys.remarks.tr(), '${patientAppointmentHistoryResponseModel.listHISGetGlassPrescription![0].leftEyeRemarks}', '-', isLast: true), + ], + ), + ), + SizedBox(height: 24.h), + ], + ); + case 1: + return Column( + children: [ + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r, hasShadow: true), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.rightEye.tr().toText14(isBold: true), + SizedBox(height: 16.h), + getRow(LocaleKeys.brand.tr(), '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![0].brand}', ''), + getRow('B.C', '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![0].baseCurve}', ''), + getRow(LocaleKeys.power.tr(), '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![0].power}', ''), + getRow(LocaleKeys.diameter.tr(), '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![0].diameter}', ''), + getRow('OZ', '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![0].oZ}', ''), + getRow('CT', '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![0].cT}', ''), + getRow('Blend', '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![0].blend}', ''), + getRow(LocaleKeys.remarks.tr(), '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![0].remarks}', '', isLast: true), + ], + ), + ), + SizedBox(height: 16.h), + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r, hasShadow: true), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.leftEye.tr().needTranslation.toText14(isBold: true), + SizedBox(height: 16.h), + getRow(LocaleKeys.brand.tr(), '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![1].brand}', ''), + getRow('B.C', '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![1].baseCurve}', ''), + getRow(LocaleKeys.power.tr(), '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![1].power}', ''), + getRow(LocaleKeys.diameter.tr(), '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![1].diameter}', ''), + getRow('OZ', '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![1].oZ}', ''), + getRow('CT', '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![1].cT}', ''), + getRow('Blend', '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![1].blend}', ''), + getRow(LocaleKeys.remarks.tr(), '${patientAppointmentHistoryResponseModel.listHISGetContactLensPrescription![1].remarks}', '', isLast: true), + ], + ), + ), + SizedBox(height: 24.h), + ], + ); + default: + return Container(); + } + } + + Widget getRow(String title, String val1, String val2, {bool isLast = false}) => Padding( + padding: EdgeInsets.only(left: 8.w, right: 8.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(8.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(flex: 2, child: title.toText11(weight: FontWeight.w500)), + Expanded( + flex: 2, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + SizedBox(width: 120.w, child: (val1 == 'null' ? '-' : val1).toText10(isBold: true, textOverflow: TextOverflow.clip)), + (val2 == 'null' ? '-' : val2).toText10(isBold: true, textOverflow: TextOverflow.ellipsis), + ], + ), + ) + ], + ), + ), + isLast + ? Container( + height: 4, + ) + : Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 2.h) + ], + ), + ); +} diff --git a/lib/presentation/medical_file/eye_measurements_appointments_page.dart b/lib/presentation/medical_file/eye_measurements_appointments_page.dart new file mode 100644 index 0000000..3b82ad4 --- /dev/null +++ b/lib/presentation/medical_file/eye_measurements_appointments_page.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:provider/provider.dart'; + +class EyeMeasurementsAppointmentsPage extends StatelessWidget { + EyeMeasurementsAppointmentsPage({super.key}); + + late BookAppointmentsViewModel bookAppointmentsViewModel; + + @override + Widget build(BuildContext context) { + bookAppointmentsViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: "Eye Measurements", + child: SingleChildScrollView( + child: Consumer(builder: (context, myAppointmentsVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + ListView.separated( + scrollDirection: Axis.vertical, + itemCount: myAppointmentsVM.isEyeMeasurementsAppointmentsLoading + ? 5 + : myAppointmentsVM.patientEyeMeasurementsAppointmentsHistoryList.isNotEmpty + ? myAppointmentsVM.patientEyeMeasurementsAppointmentsHistoryList.length + : 1, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.only(left: 24.h, right: 24.h), + itemBuilder: (context, index) { + return myAppointmentsVM.isEyeMeasurementsAppointmentsLoading + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: AppointmentCard( + patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel(), + myAppointmentsViewModel: myAppointmentsVM, + bookAppointmentsViewModel: bookAppointmentsViewModel, + isLoading: true, + isFromHomePage: false, + ), + ) + : myAppointmentsVM.patientEyeMeasurementsAppointmentsHistoryList.isNotEmpty + ? AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 1000), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: AppointmentCard( + patientAppointmentHistoryResponseModel: myAppointmentsVM.patientEyeMeasurementsAppointmentsHistoryList[index], + myAppointmentsViewModel: myAppointmentsVM, + bookAppointmentsViewModel: bookAppointmentsViewModel, + isLoading: false, + isFromHomePage: false, + isForEyeMeasurements: true, + ), + ), + ), + ), + ) + : Utils.getNoDataWidget(context, noDataText: "No Ophthalmology appointments found...".needTranslation); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + SizedBox(height: 60.h), + ], + ); + }), + ), + ), + ); + } +} diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart new file mode 100644 index 0000000..828cbb4 --- /dev/null +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -0,0 +1,999 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_config.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/my_doctors_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_profile_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/insurance_approvals_page.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/widgets/insurance_update_details_card.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/widgets/patient_insurance_card.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_orders_page.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/eye_measurements_appointments_page.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/patient_sickleaves_list_page.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/vaccine_list_page.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/widgets/lab_rad_card.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/widgets/medical_file_card.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/widgets/patient_sick_leave_card.dart'; +import 'package:hmg_patient_app_new/presentation/medical_report/medical_reports_page.dart'; +import 'package:hmg_patient_app_new/presentation/my_family/my_family.dart'; +import 'package:hmg_patient_app_new/presentation/prescriptions/prescriptions_list_page.dart'; +import 'package:hmg_patient_app_new/presentation/radiology/radiology_orders_page.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart'; +import 'package:provider/provider.dart'; + +import '../prescriptions/prescription_detail_page.dart'; +import 'widgets/medical_file_appointment_card.dart'; + +class MedicalFilePage extends StatefulWidget { + const MedicalFilePage({super.key}); + + @override + State createState() => _MedicalFilePageState(); +} + +class _MedicalFilePageState extends State { + late InsuranceViewModel insuranceViewModel; + late AppState appState; + late MyAppointmentsViewModel myAppointmentsViewModel; + late MedicalFileViewModel medicalFileViewModel; + late BookAppointmentsViewModel bookAppointmentsViewModel; + late LabViewModel labViewModel; + + int currentIndex = 0; + + @override + void initState() { + appState = getIt.get(); + scheduleMicrotask(() { + if (appState.isAuthenticated) { + labViewModel.initLabProvider(); + insuranceViewModel.initInsuranceProvider(); + medicalFileViewModel.setIsPatientSickLeaveListLoading(true); + medicalFileViewModel.getPatientSickLeaveList(); + medicalFileViewModel.onTabChanged(0); + } + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + labViewModel = Provider.of(context, listen: false); + insuranceViewModel = Provider.of(context, listen: false); + myAppointmentsViewModel = Provider.of(context, listen: false); + medicalFileViewModel = Provider.of(context, listen: false); + bookAppointmentsViewModel = Provider.of(context, listen: false); + NavigationService navigationService = getIt.get(); + return CollapsingListView( + title: "Medical File".needTranslation, + trailing: Row( + children: [ + Wrap( + children: [ + Utils.buildImgWithAssets( + icon: AppAssets.babyGirlImg, + height: 32.h, + border: 1.5, + fit: BoxFit.contain, + borderRadius: 50.r, + ), + Utils.buildImgWithAssets( + icon: AppAssets.femaleImg, + height: 32.h, + border: 1.5, + borderRadius: 50.r, + fit: BoxFit.contain, + ), + Utils.buildImgWithAssets( + icon: AppAssets.male_img, + height: 32.h, + border: 1.5, + borderRadius: 50.r, + fit: BoxFit.contain, + ), + ], + ), + SizedBox(width: 4.h), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, height: 22.h, width: 22.w) + ], + ).withHorizontalPadding(24.w).onPress(() { + DialogService dialogService = getIt.get(); + dialogService.showFamilyBottomSheetWithoutH( + label: "Family Files".needTranslation, + message: "This clinic or doctor is only available for the below eligible profiles.".needTranslation, + onSwitchPress: (FamilyFileResponseModelLists profile) { + medicalFileViewModel.switchFamilyFiles(responseID: profile.responseId, patientID: profile.patientId, phoneNumber: profile.mobileNumber); + }, + profiles: medicalFileViewModel.patientFamilyFiles); + }), + isLeading: false, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + TextInputWidget( + labelText: LocaleKeys.search.tr(context: context), + hintText: "Type any record".needTranslation, + controller: TextEditingController(), + keyboardType: TextInputType.number, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + isAllowLeadingIcon: true, + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 8.h), + leadingIcon: AppAssets.student_card, + ).paddingSymmetrical(24.w, 0.0), + SizedBox(height: 16.h), + Container( + width: double.infinity, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.r), + child: Padding( + padding: EdgeInsets.all(16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, + width: 56.w, height: 56.h), + SizedBox(width: 8.w), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}" + .toText18(isBold: true, weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1), + SizedBox(height: 4.h), + Wrap( + direction: Axis.horizontal, + spacing: 4.w, + runSpacing: 6.w, + children: [ + AppCustomChipWidget( + icon: AppAssets.file_icon, + labelText: "${LocaleKeys.fileNo.tr(context: context)}: ${appState.getAuthenticatedUser()!.patientId}", + labelPadding: EdgeInsetsDirectional.only(end: 6.w), + onChipTap: () { + navigationService.pushPage( + page: FamilyMedicalScreen( + profiles: medicalFileViewModel.patientFamilyFiles, + onSelect: (FamilyFileResponseModelLists p1) {}, + )); + }, + ), + AppCustomChipWidget( + icon: AppAssets.checkmark_icon, + labelText: LocaleKeys.verified.tr(context: context), + iconColor: AppColors.successColor, + labelPadding: EdgeInsetsDirectional.only(end: 6.w), + ), + ], + ), + ], + ) + ], + ), + SizedBox(height: 16.h), + Divider(color: AppColors.dividerColor, height: 1.h), + SizedBox(height: 16.h), + Wrap( + direction: Axis.horizontal, + spacing: 4.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + labelText: "${appState.getAuthenticatedUser()!.age} Years Old", + labelPadding: EdgeInsetsDirectional.only(start: 8.w, end: 8.w), + ), + AppCustomChipWidget( + icon: AppAssets.blood_icon, + labelText: "Blood: ${appState.getUserBloodGroup.isEmpty ? "N/A" : appState.getUserBloodGroup.isEmpty}", + iconColor: AppColors.primaryRedColor, + labelPadding: EdgeInsetsDirectional.only(end: 8.w), + ), + Consumer(builder: (context, insuranceVM, child) { + return AppCustomChipWidget( + icon: insuranceVM.isInsuranceExpired ? AppAssets.cancel_circle_icon : AppAssets.insurance_active_icon, + labelText: insuranceVM.isInsuranceExpired ? "Insurance Expired".needTranslation : "Insurance Active".needTranslation, + iconColor: insuranceVM.isInsuranceExpired ? AppColors.primaryRedColor : AppColors.successColor, + textColor: insuranceVM.isInsuranceExpired ? AppColors.primaryRedColor : AppColors.successColor, + iconSize: 12.w, + backgroundColor: insuranceVM.isInsuranceExpired ? AppColors.primaryRedColor.withOpacity(0.1) : AppColors.successColor.withOpacity(0.1), + labelPadding: EdgeInsetsDirectional.only(end: 8.w), + ); + }), + ], + ), + ], + ), + ), + ).paddingSymmetrical(24.w, 0.0), + SizedBox(height: 16.h), + Consumer(builder: (context, medicalFileVM, child) { + return Column( + children: [ + CustomTabBar( + activeTextColor: AppColors.primaryRedColor, + activeBackgroundColor: AppColors.primaryRedColor.withValues(alpha: .1), + tabs: [ + CustomTabBarModel(AppAssets.myFilesBottom, LocaleKeys.general.tr(context: context).needTranslation), + CustomTabBarModel(AppAssets.insurance, LocaleKeys.insurance.tr(context: context)), + CustomTabBarModel(AppAssets.requests, LocaleKeys.request.tr(context: context).needTranslation), + CustomTabBarModel(AppAssets.more, "More".needTranslation), + ], + onTabChange: (index) { + medicalFileVM.onTabChanged(index); + }, + ).paddingSymmetrical(24.w, 0.0), + SizedBox(height: 24.h), + getSelectedTabData(medicalFileVM.selectedTabIndex), + ], + ); + }), + ], + ), + ); + } + + openDoctorScheduleCalendar(PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel) async { + DoctorsListResponseModel doctor = DoctorsListResponseModel( + clinicID: patientAppointmentHistoryResponseModel.clinicID, + projectID: patientAppointmentHistoryResponseModel.projectID, + doctorID: patientAppointmentHistoryResponseModel.doctorID, + doctorImageURL: patientAppointmentHistoryResponseModel.doctorImageURL, + doctorTitle: patientAppointmentHistoryResponseModel.doctorTitle, + name: patientAppointmentHistoryResponseModel.doctorNameObj, + nationalityFlagURL: "https://hmgwebservices.com/Images/flag/SYR.png", + speciality: [], + clinicName: patientAppointmentHistoryResponseModel.clinicName, + projectName: patientAppointmentHistoryResponseModel.projectName, + ); + bookAppointmentsViewModel.setSelectedDoctor(doctor); + LoaderBottomSheet.showLoader(); + await bookAppointmentsViewModel.getDoctorFreeSlots( + isBookingForLiveCare: false, + onSuccess: (dynamic respData) async { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + title: "Pick a Date".needTranslation, + context, + child: AppointmentCalendar(), + isFullScreen: false, + isCloseButtonVisible: true, + callBackFunc: () {}, + ); + }, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } + + Widget getSelectedTabData(int index) { + switch (index) { + case 0: + //General Tab Data + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Appointments & visits".needTranslation.toText18(isBold: true), + Row( + children: [ + LocaleKeys.viewAll.tr().toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), + SizedBox(width: 2.h), + Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h), + ], + ), + ], + ).paddingSymmetrical(24.w, 0.h).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: MyAppointmentsPage(), + ), + ); + }), + SizedBox(height: 16.h), + Consumer(builder: (context, myAppointmentsVM, child) { + // Provide an explicit height so the horizontal ListView has a bounded height + return SizedBox( + height: 190.h, + child: myAppointmentsVM.isMyAppointmentsLoading + ? MedicalFileAppointmentCard( + patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel(), + myAppointmentsViewModel: myAppointmentsVM, + onRescheduleTap: () {}, + onAskDoctorTap: () {}, + ) + : myAppointmentsVM.patientAppointmentsHistoryList.isEmpty + ? Container( + padding: EdgeInsets.all(12.w), + width: MediaQuery.of(context).size.width, + decoration: + RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.r, hasShadow: true), + child: Column( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h), + SizedBox(height: 12.h), + "You do not have any appointments. Please book an appointment".needTranslation.toText12(isCenter: true), + SizedBox(height: 12.h), + CustomButton( + text: LocaleKeys.bookAppo.tr(context: context), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: BookAppointmentPage(), + ), + ); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Color(0xffED1C2B), + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: isFoldable || isTablet ? 50.h : 40.h, + icon: AppAssets.add_icon, + iconColor: AppColors.primaryRedColor, + ), + ], + ), + ) + : ListView.separated( + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemCount: myAppointmentsVM.patientAppointmentsHistoryList.length, + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + horizontalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + child: MedicalFileAppointmentCard( + patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index], + myAppointmentsViewModel: myAppointmentsViewModel, + onRescheduleTap: () { + openDoctorScheduleCalendar(myAppointmentsVM.patientAppointmentsHistoryList[index]); + }, + onAskDoctorTap: () {}, + )), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 12.h), + ), + ).paddingSymmetrical(24.w, 0); + }), + SizedBox(height: 24.h), + "Lab & Radiology".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0.h), + SizedBox(height: 16.h), + Row( + children: [ + Expanded( + child: LabRadCard( + icon: AppAssets.lab_result_icon, + labelText: LocaleKeys.labResults.tr(context: context), + // labOrderTests: ["Complete blood count", "Creatinine", "Blood Sugar"], + labOrderTests: labViewModel.isLabOrdersLoading ? [] : labViewModel.labOrderTests, + isLoading: labViewModel.isLabOrdersLoading, + ).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: LabOrdersPage(), + ), + ); + }), + ), + SizedBox(width: 16.h), + Expanded( + child: LabRadCard( + icon: AppAssets.radiology_icon, + labelText: LocaleKeys.radiology.tr(context: context), + // labOrderTests: ["Chest X-ray", "Abdominal Ultrasound", "Dental X-ray"], + labOrderTests: [], + isLoading: false, + ).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: RadiologyOrdersPage(), + ), + ); + }), + ), + ], + ).paddingSymmetrical(24.w, 0.h), + SizedBox(height: 24.h), + "Active Medications & Prescriptions".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0.h), + SizedBox(height: 16.h), + Consumer(builder: (context, prescriptionVM, child) { + return prescriptionVM.isPrescriptionsOrdersLoading + ? const MoviesShimmerWidget().paddingSymmetrical(24.w, 0.h) + : prescriptionVM.patientPrescriptionOrders.isNotEmpty + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: Colors.white, + borderRadius: 12.r, + ), + child: Padding( + padding: EdgeInsets.all(16.w), + child: Column( + children: [ + ListView.separated( + itemCount: prescriptionVM.patientPrescriptionOrders.length, + shrinkWrap: true, + padding: EdgeInsets.only(left: 0, right: 8.w), + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: Row( + children: [ + Image.network( + prescriptionVM.patientPrescriptionOrders[index].doctorImageURL!, + width: 40.w, + height: 40.h, + fit: BoxFit.cover, + ).circle(100.r), + SizedBox(width: 16.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + prescriptionVM.patientPrescriptionOrders[index].doctorName!.toText16(isBold: true), + SizedBox(height: 4.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.w, + runSpacing: 4.w, + children: [ + AppCustomChipWidget( + labelText: prescriptionVM.patientPrescriptionOrders[index].clinicDescription!), + AppCustomChipWidget( + icon: AppAssets.doctor_calendar_icon, + labelText: DateUtil.formatDateToDate( + DateUtil.convertStringToDate( + prescriptionVM.patientPrescriptionOrders[index].appointmentDate), + false, + ), + ), + ], + ), + ], + ), + ), + // SizedBox(width: 40.h), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + width: 15.w, + height: 15.h, + fit: BoxFit.contain, + iconColor: AppColors.textColor)), + ], + ).onPress(() { + prescriptionVM.setPrescriptionsDetailsLoading(); + Navigator.of(context).push( + CustomPageRoute( + page: PrescriptionDetailPage( + prescriptionsResponseModel: prescriptionVM.patientPrescriptionOrders[index]), + ), + ); + }), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + SizedBox(height: 24.h), + const Divider(color: AppColors.dividerColor), + SizedBox(height: 24.h), + Row( + children: [ + Expanded( + child: CustomButton( + text: "All Prescriptions".needTranslation, + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: PrescriptionsListPage(), + ), + ); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 12.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + height: 56.h, + icon: AppAssets.requests, + iconColor: AppColors.primaryRedColor, + iconSize: 16.w, + ), + ), + SizedBox(width: 10.w), + Expanded( + child: CustomButton( + text: "All Medications".needTranslation, + onPressed: () {}, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 12.f, + fontWeight: FontWeight.w500, + borderRadius: 12.h, + height: 56.h, + icon: AppAssets.all_medications_icon, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + ), + ), + ], + ), + ], + ), + ), + ).paddingSymmetrical(24.w, 0.h) + : Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + hasShadow: false, + ), + child: Utils.getNoDataWidget( + context, + noDataText: "You don't have any prescriptions yet.".needTranslation, + isSmallWidget: true, + width: 62.w, + height: 62.h, + ), + ).paddingSymmetrical(24.w, 0.h); + }), + SizedBox(height: 24.h), + //My Doctor Section + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.myDoctor.tr(context: context).toText18(isBold: true), + Row( + children: [ + LocaleKeys.viewAll.tr().toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), + SizedBox(width: 2.w), + Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h), + ], + ).onPress(() { + myAppointmentsViewModel.getPatientMyDoctors(); + Navigator.of(context).push( + CustomPageRoute( + page: MyDoctorsPage(), + ), + ); + }), + ], + ).paddingSymmetrical(24.w, 0.h), + SizedBox(height: 16.h), + Consumer(builder: (context, myAppointmentsVM, child) { + return myAppointmentsVM.isPatientMyDoctorsLoading + ? Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.network( + "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", + width: 64.w, + height: 64.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: true, radius: 50.r), + SizedBox(height: 8.h), + ("Dr. John Smith Smith Smith") + .toString() + .toText12(fontWeight: FontWeight.w500, isCenter: true, maxLine: 2) + .toShimmer2(isShow: true), + ], + ) + : myAppointmentsVM.patientMyDoctorsList.isEmpty + ? Container( + width: SizeConfig.screenWidth, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + hasShadow: false, + ), + child: Utils.getNoDataWidget( + context, + noDataText: "You don't have any completed visits yet".needTranslation, + isSmallWidget: true, + width: 62.w, + height: 62.h, + ), + ).paddingSymmetrical(24.w, 0.h) + : SizedBox( + height: 100.h, + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: myAppointmentsVM.patientMyDoctorsList.length, + shrinkWrap: true, + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 1000), + child: SlideAnimation( + horizontalOffset: 100.0, + child: FadeInAnimation( + child: SizedBox( + // width: 80.w, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.network( + myAppointmentsVM.patientMyDoctorsList[index].doctorImageURL!, + width: 64.w, + height: 64.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: false, radius: 50.r), + SizedBox(height: 8.h), + Expanded( + child: (myAppointmentsVM.patientMyDoctorsList[index].doctorName) + .toString() + .toText12(fontWeight: FontWeight.w500, isCenter: true, maxLine: 2) + .toShimmer2(isShow: false), + ), + ], + ), + ).onPress(() async { + bookAppointmentsViewModel.setSelectedDoctor(DoctorsListResponseModel( + clinicID: myAppointmentsVM.patientMyDoctorsList[index].clinicID, + projectID: myAppointmentsVM.patientMyDoctorsList[index].projectID, + doctorID: myAppointmentsVM.patientMyDoctorsList[index].doctorID, + )); + LoaderBottomSheet.showLoader(); + await bookAppointmentsViewModel.getDoctorProfile(onSuccess: (dynamic respData) { + LoaderBottomSheet.hideLoader(); + Navigator.of(context).push( + CustomPageRoute( + page: DoctorProfilePage(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 8.h), + ), + ).paddingSymmetrical(24.w, 0); + }), + SizedBox(height: 24.h), + "Others".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0.h), + SizedBox(height: 16.h), + GridView( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 16.h, + mainAxisSpacing: 16.w, + mainAxisExtent: 110.h, + ), + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + shrinkWrap: true, + children: [ + MedicalFileCard( + label: "Eye Test Results".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.eye_result_icon, + isLargeText: true, + iconSize: 36.w, + ).onPress(() { + myAppointmentsViewModel.setIsEyeMeasurementsAppointmentsLoading(true); + myAppointmentsViewModel.onEyeMeasurementsTabChanged(0); + myAppointmentsViewModel.getPatientEyeMeasurementAppointments(); + Navigator.of(context).push( + CustomPageRoute( + page: EyeMeasurementsAppointmentsPage(), + ), + ); + }), + MedicalFileCard( + label: "Allergy Info".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.allergy_info_icon, + isLargeText: true, + iconSize: 36.w, + ), + MedicalFileCard( + label: "Vaccine Info".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.vaccine_info_icon, + isLargeText: true, + iconSize: 36.w, + ).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: VaccineListPage(), + ), + ); + }), + ], + ).paddingSymmetrical(24.w, 0.0), + SizedBox(height: 24.h), + ], + ); + case 1: + //Insurance Tab Data + return Column( + children: [ + Consumer(builder: (context, insuranceVM, child) { + return insuranceVM.isInsuranceLoading + ? LabResultItemView( + onTap: () {}, + labOrder: null, + index: index, + isLoading: true, + ).paddingSymmetrical(24.w, 0.0) + : insuranceVM.patientInsuranceList.isNotEmpty + ? PatientInsuranceCard( + insuranceCardDetailsModel: insuranceVM.patientInsuranceList.first, + isInsuranceExpired: DateTime.now().isAfter( + DateUtil.convertStringToDate(insuranceVM.patientInsuranceList.first.cardValidTo), + ), + ) + : Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + hasShadow: false, + ), + child: Utils.getNoDataWidget( + context, + noDataText: "You don't have insurance registered with HMG.".needTranslation, + isSmallWidget: true, + width: 62.w, + height: 62.h, + callToActionButton: CustomButton( + icon: AppAssets.update_insurance_card_icon, + iconColor: AppColors.successColor, + iconSize: 15.h, + text: "${LocaleKeys.updateInsurance.tr(context: context)} ${LocaleKeys.updateInsuranceSubtitle.tr(context: context)}", + onPressed: () { + insuranceViewModel.setIsInsuranceUpdateDetailsLoading(true); + insuranceViewModel.getPatientInsuranceDetailsForUpdate(appState.getAuthenticatedUser()!.patientId.toString(), + appState.getAuthenticatedUser()!.patientIdentificationNo.toString()); + showCommonBottomSheetWithoutHeight(context, + child: PatientInsuranceCardUpdateCard(), + callBackFunc: () {}, + title: "", + isCloseButtonVisible: false, + isFullScreen: false); + }, + backgroundColor: AppColors.bgGreenColor.withOpacity(0.20), + borderColor: AppColors.bgGreenColor.withOpacity(0.0), + textColor: AppColors.bgGreenColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(10.w, 0, 10.w, 0), + height: isFoldable ? 50.h : 40.h, + ).paddingOnly(left: 12.w, right: 12.w, bottom: 12.h), + ), + ).paddingSymmetrical(24.w, 0.h); + }), + SizedBox(height: 10.h), + GridView( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 16.h, + mainAxisSpacing: 16.w, + mainAxisExtent: 120.h, + ), + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.only(top: 12.h), + shrinkWrap: true, + children: [ + MedicalFileCard( + label: "Update Insurance".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.eye_result_icon, + isLargeText: true, + iconSize: 36.w, + ).onPress(() { + Navigator.of(context).push(CustomPageRoute(page: InsuranceHomePage())); + }), + MedicalFileCard( + label: "${LocaleKeys.insurance.tr(context: context)} ${LocaleKeys.approvals.tr(context: context)}", + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.eye_result_icon, + isLargeText: true, + iconSize: 36.w, + ).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: InsuranceApprovalsPage(), + ), + ); + }), + MedicalFileCard( + label: "My Invoices List".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.eye_result_icon, + isLargeText: true, + iconSize: 36.w, + ), + MedicalFileCard( + label: "Ancillary Orders List".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.eye_result_icon, + isLargeText: true, + iconSize: 36.w, + ), + ], + ).paddingSymmetrical(24.w, 0.0), + SizedBox(height: 16.h), + ], + ); + case 2: + // Requests Tab Data + return Column( + children: [ + Consumer(builder: (context, medicalFileVM, child) { + return medicalFileVM.isPatientSickLeaveListLoading + ? PatientSickLeaveCard( + patientSickLeavesResponseModel: PatientSickLeavesResponseModel(), + isLoading: true, + ).paddingSymmetrical(24.w, 0.0) + : medicalFileVM.patientSickLeaveList.isNotEmpty + ? PatientSickLeaveCard( + patientSickLeavesResponseModel: medicalFileVM.patientSickLeaveList.first, + isLoading: false, + ).paddingSymmetrical(24.w, 0.0) + : Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + hasShadow: false, + ), + child: Utils.getNoDataWidget( + context, + noDataText: "You don't have any sick leaves yet.".needTranslation, + isSmallWidget: true, + width: 62.w, + height: 62.h, + ), + ).paddingSymmetrical(24.w, 0.h); + }), + SizedBox(height: 16.h), + GridView( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 16.h, + mainAxisSpacing: 16.w, + mainAxisExtent: 110.h, + ), + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + shrinkWrap: true, + children: [ + MedicalFileCard( + label: LocaleKeys.monthlyReports.tr(context: context), + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.eye_result_icon, + isLargeText: true, + iconSize: 36.h, + ), + MedicalFileCard( + label: "Medical Reports".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.allergy_info_icon, + isLargeText: true, + iconSize: 36.h, + ).onPress(() { + medicalFileViewModel.setIsPatientMedicalReportsLoading(true); + medicalFileViewModel.getPatientMedicalReportList(); + Navigator.of(context).push( + CustomPageRoute( + page: MedicalReportsPage(), + ), + ); + }), + MedicalFileCard( + label: "Sick Leave Report".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.vaccine_info_icon, + isLargeText: true, + iconSize: 36.h, + ).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: PatientSickleavesListPage(), + ), + ); + }), + ], + ).paddingSymmetrical(24.w, 0.0), + SizedBox(height: 24.h), + ], + ); + case 3: + return Container(); + default: + return Container(); + } + } +} diff --git a/lib/presentation/medical_file/patient_sickleaves_list_page.dart b/lib/presentation/medical_file/patient_sickleaves_list_page.dart new file mode 100644 index 0000000..a28f518 --- /dev/null +++ b/lib/presentation/medical_file/patient_sickleaves_list_page.dart @@ -0,0 +1,92 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:provider/provider.dart'; + +import 'widgets/patient_sick_leave_card.dart'; + +class PatientSickleavesListPage extends StatefulWidget { + const PatientSickleavesListPage({super.key}); + + @override + State createState() => _PatientSickleavesListPageState(); +} + +class _PatientSickleavesListPageState extends State { + late MedicalFileViewModel medicalFileViewModel; + + @override + void initState() { + scheduleMicrotask(() { + medicalFileViewModel.setIsPatientSickLeaveListLoading(true); + medicalFileViewModel.getPatientSickLeaveList(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + medicalFileViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: "${LocaleKeys.sick.tr(context: context)} ${LocaleKeys.sickSubtitle.tr(context: context)}", + child: SingleChildScrollView( + child: Consumer(builder: (context, medicalFileVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListView.separated( + scrollDirection: Axis.vertical, + itemCount: medicalFileVM.isPatientSickLeaveListLoading + ? 3 + : medicalFileVM.patientSickLeaveList.isNotEmpty + ? medicalFileVM.patientSickLeaveList.length + : 1, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return medicalFileVM.isPatientSickLeaveListLoading + ? PatientSickLeaveCard( + patientSickLeavesResponseModel: PatientSickLeavesResponseModel(), + isLoading: true, + ).paddingSymmetrical(24.h, 0.0) + : medicalFileVM.patientSickLeaveList.isNotEmpty + ? AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 1000), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: PatientSickLeaveCard( + patientSickLeavesResponseModel: medicalFileVM.patientSickLeaveList.first, + isLoading: false, + isSickLeaveListPage: true, + ).paddingSymmetrical(24.h, 0.0), + ), + ), + ) + : Utils.getNoDataWidget(context, noDataText: "You don't have any sick leaves yet.".needTranslation); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 8.h), + ), + SizedBox(height: 60.h), + ], + ); + }), + ), + ), + ); + } +} diff --git a/lib/presentation/medical_file/vaccine_list_page.dart b/lib/presentation/medical_file/vaccine_list_page.dart new file mode 100644 index 0000000..777426f --- /dev/null +++ b/lib/presentation/medical_file/vaccine_list_page.dart @@ -0,0 +1,185 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:provider/provider.dart'; + +import '../../widgets/chip/app_custom_chip_widget.dart'; + +class VaccineListPage extends StatefulWidget { + const VaccineListPage({super.key}); + + @override + State createState() => _VaccineListPageState(); +} + +class _VaccineListPageState extends State { + late MedicalFileViewModel medicalFileViewModel; + + @override + void initState() { + scheduleMicrotask(() { + medicalFileViewModel.setIsPatientVaccineListLoading(true); + medicalFileViewModel.getPatientVaccinesList(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + medicalFileViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: "Vaccine Info".needTranslation, + child: SingleChildScrollView( + child: Consumer(builder: (context, medicalFileVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + ListView.separated( + scrollDirection: Axis.vertical, + itemCount: medicalFileVM.isPatientVaccineListLoading + ? 5 + : medicalFileVM.patientVaccineList.isNotEmpty + ? medicalFileVM.patientVaccineList.length + : 1, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.only(left: 24.h, right: 24.h), + itemBuilder: (context, index) { + return medicalFileVM.isPatientVaccineListLoading + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", + width: 63.h, + height: 63.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: true), + SizedBox(width: 16.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Dr John Smith".toText16(isBold: true).toShimmer2(isShow: true), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget(labelText: "").toShimmer2(isShow: true, width: 16.h), + AppCustomChipWidget(labelText: "").toShimmer2(isShow: true, width: 16.h), + ], + ), + ], + ), + ), + ], + ), + ], + ), + ), + ) + : medicalFileVM.patientVaccineList.isNotEmpty + ? AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 1000), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(14.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Image.network( + // medicalFileVM.patientVaccineList[index].doctorImageURL, + // width: 63.h, + // height: 63.h, + // fit: BoxFit.fill, + // ).circle(100).toShimmer2(isShow: false), + SizedBox(width: 16.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (medicalFileVM.patientVaccineList[index].doctorName).toString().toText16(isBold: true).toShimmer2(isShow: false), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + icon: AppAssets.doctor_calendar_icon, + labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(medicalFileVM.patientVaccineList[index].vaccinationDate), false)), + AppCustomChipWidget(labelText: medicalFileVM.patientVaccineList[index].vaccineName).toShimmer2(isShow: false, width: 16.h), + AppCustomChipWidget(labelText: medicalFileVM.patientVaccineList[index].clinicName).toShimmer2(isShow: false, width: 16.h), + AppCustomChipWidget(labelText: medicalFileVM.patientVaccineList[index].projectName).toShimmer2(isShow: false, width: 16.h), + ], + ), + ], + ), + ), + ], + ), + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // "".toText16(), + // Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon, width: 15.h, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor), + // ], + // ), + ], + ), + ), + ), + ), + ), + ) + : Utils.getNoDataWidget(context, noDataText: "No vaccines data found...".needTranslation); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + SizedBox(height: 60.h), + ], + ); + }), + ), + ), + ); + } +} diff --git a/lib/presentation/medical_file/widgets/lab_rad_card.dart b/lib/presentation/medical_file/widgets/lab_rad_card.dart new file mode 100644 index 0000000..42f5bff --- /dev/null +++ b/lib/presentation/medical_file/widgets/lab_rad_card.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class LabRadCard extends StatelessWidget { + const LabRadCard({ + super.key, + required this.icon, + required this.labelText, + required this.labOrderTests, + required this.isLoading, + }); + + final String icon; + final String labelText; + final List labOrderTests; + + final bool isLoading; + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.r, hasShadow: false), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets( + icon: icon, + width: 40.w, + height: 40.h, + fit: BoxFit.contain, + ).toShimmer2(isShow: false, radius: 12.r), + SizedBox(width: 8.w), + Flexible(child: labelText.toText14(isBold: true).toShimmer2(isShow: false, radius: 6.r, height: 32.h)), + ], + ), + SizedBox(height: 16.h), + labOrderTests.isNotEmpty + ? ListView.separated( + scrollDirection: Axis.vertical, + padding: EdgeInsets.zero, + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemBuilder: (cxt, index) { + return labOrderTests[index] + .toText12(isBold: true, maxLine: 1) + .toShimmer2(isShow: false, radius: 6.r, height: 24.h, width: 120.w) + .toShimmer2(isShow: isLoading); + }, + separatorBuilder: (cxt, index) => SizedBox(height: 8.h), + itemCount: 3, + ) + : "You don't have any records yet".needTranslation.toText13( + color: AppColors.greyTextColor, + isCenter: true, + ), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox.shrink(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, width: 15.w, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor) + .toShimmer2(isShow: false, radius: 12.r), + ), + ], + ) + ], + ).paddingAll(16.w), + ); + } +} diff --git a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart new file mode 100644 index 0000000..0f382dc --- /dev/null +++ b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart @@ -0,0 +1,200 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/appointment_details_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; + +class MedicalFileAppointmentCard extends StatelessWidget { + final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; + final MyAppointmentsViewModel myAppointmentsViewModel; + final Function onRescheduleTap; + final Function onAskDoctorTap; + + const MedicalFileAppointmentCard({ + super.key, + required this.patientAppointmentHistoryResponseModel, + required this.myAppointmentsViewModel, + required this.onRescheduleTap, + required this.onAskDoctorTap, + }); + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppCustomChipWidget( + richText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false) + .toText12( + color: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, + fontWeight: FontWeight.w500) + .paddingOnly(left: 8.w), + icon: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppAssets.appointment_calendar_icon : AppAssets.alarm_clock_icon, + iconColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, + iconSize: 16.w, + backgroundColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.greyColor : AppColors.secondaryLightRedColor, + textColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, + padding: EdgeInsets.only(top: 12.h, bottom: 12.h, left: 8.w, right: 8.w), + ).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + width: 200.w, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.network( + patientAppointmentHistoryResponseModel.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", + width: 25.w, + height: 27.h, + fit: BoxFit.fill, + ).circle(100).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), + SizedBox(width: 8.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (patientAppointmentHistoryResponseModel.doctorNameObj ?? "") + .toText14(isBold: true, maxlines: 1) + .toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), + (patientAppointmentHistoryResponseModel.clinicName ?? "") + .toText12(maxLine: 1, fontWeight: FontWeight.w500, color: AppColors.greyTextColor) + .toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), + ], + ), + ), + ], + ), + SizedBox(height: 12.h), + Row( + children: [ + myAppointmentsViewModel.isMyAppointmentsLoading + ? Container().toShimmer2(isShow: true, height: 40.h, width: 100.w, radius: 12.r) + : Expanded( + flex: 6, + child: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) + ? getArrivedAppointmentButton(context).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading) + : CustomButton( + text: AppointmentType.getNextActionText(patientAppointmentHistoryResponseModel.nextAction), + onPressed: () { + Navigator.of(context) + .push(CustomPageRoute( + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), + )) + .then((val) { + // widget.myAppointmentsViewModel.initAppointmentsViewModel(); + // widget.myAppointmentsViewModel.getPatientAppointments(true, false); + }); + }, + backgroundColor: + AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.15), + borderColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.01), + textColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 40.h, + icon: AppointmentType.getNextActionIcon(patientAppointmentHistoryResponseModel.nextAction), + iconColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), + iconSize: 14.h, + ).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), + ), + SizedBox(width: 8.w), + Expanded( + flex: 2, + child: Container( + height: 40.h, + width: 40.w, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.textColor, + borderRadius: 10.r, + ), + child: Padding( + padding: EdgeInsets.all(10.w), + child: Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + iconColor: AppColors.whiteColor, + icon: AppAssets.forward_arrow_icon_small, + width: 40.w, + height: 40.h, + fit: BoxFit.contain, + ), + ), + ), + ).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading).onPress(() { + Navigator.of(context) + .push( + CustomPageRoute( + page: AppointmentDetailsPage(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel), + ), + ) + .then((val) { + // widget.myAppointmentsViewModel.initAppointmentsViewModel(); + // widget.myAppointmentsViewModel.getPatientAppointments(true, false); + }); + }), + ), + ], + ), + ], + ).paddingAll(16.w), + ), + ], + ); + } + + Widget getArrivedAppointmentButton(BuildContext context) { + return DateTime.now().difference(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate)).inDays <= 15 + ? CustomButton( + text: LocaleKeys.askDoctor.tr(context: context), + onPressed: () {}, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 40.h, + icon: AppAssets.ask_doctor_icon, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + ) + : CustomButton( + text: "Rebook".needTranslation, + onPressed: () { + onRescheduleTap(); + }, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 40.h, + icon: AppAssets.rebook_appointment_icon, + iconColor: AppColors.blackColor, + iconSize: 16.h, + ); + } +} diff --git a/lib/presentation/medical_file/widgets/medical_file_card.dart b/lib/presentation/medical_file/widgets/medical_file_card.dart new file mode 100644 index 0000000..00d62c9 --- /dev/null +++ b/lib/presentation/medical_file/widgets/medical_file_card.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; + +class MedicalFileCard extends StatelessWidget { + final String label; + final Color textColor; + final Color backgroundColor; + final String svgIcon; + final double? iconSize; + final bool isLargeText; + + const MedicalFileCard({ + super.key, + required this.label, + required this.textColor, + required this.backgroundColor, + this.svgIcon = "", + this.iconSize, + this.isLargeText = false, + }); + + @override + Widget build(BuildContext context) { + final iconS = iconSize ?? 30.w; + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: backgroundColor, + borderRadius: 12.r, + ), + child: Padding( + padding: EdgeInsets.all(12.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: svgIcon, width: iconS, height: iconS, fit: BoxFit.contain), + SizedBox(height: 12.h), + isLargeText ? label.toText13(color: textColor, isBold: true, maxLine: 2) : label.toText11(color: textColor, isBold: true, maxLine: 2), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart b/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart new file mode 100644 index 0000000..a818ae5 --- /dev/null +++ b/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart @@ -0,0 +1,198 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/patient_sickleaves_list_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:open_filex/open_filex.dart'; +import 'package:provider/provider.dart'; + +class PatientSickLeaveCard extends StatelessWidget { + PatientSickLeaveCard({super.key, required this.patientSickLeavesResponseModel, this.isLoading = false, this.isSickLeaveListPage = false}); + + late MedicalFileViewModel medicalFileViewModel; + PatientSickLeavesResponseModel patientSickLeavesResponseModel; + bool isLoading; + bool isSickLeaveListPage = false; + + @override + Widget build(BuildContext context) { + AppState _appState = getIt.get(); + medicalFileViewModel = Provider.of(context, listen: false); + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24, hasShadow: true), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "${LocaleKeys.sick.tr(context: context)} ${LocaleKeys.sickSubtitle.tr(context: context)}".toText16(isBold: true).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + labelText: isLoading ? "" : getStatusText(context), + backgroundColor: getStatusColor().withOpacity(0.15), + textColor: getStatusColor(), + ).toShimmer2(isShow: isLoading, width: 100.h), + ], + ), + SizedBox(height: 16.h), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + isLoading ? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png" : patientSickLeavesResponseModel.doctorImageURL!, + width: 30.h, + height: 30.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: isLoading), + SizedBox(width: 16.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (isLoading ? "" : patientSickLeavesResponseModel.doctorName!).toText16(isBold: true).toShimmer2(isShow: isLoading), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + icon: AppAssets.doctor_calendar_icon, + labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientSickLeavesResponseModel.appointmentDate), false), + labelPadding: EdgeInsetsDirectional.only(start: -4.h, end: 8.h), + ).toShimmer2(isShow: isLoading), + AppCustomChipWidget(labelText: isLoading ? "Pending Activation" : patientSickLeavesResponseModel.clinicName!).toShimmer2(isShow: isLoading), + ], + ), + ], + ), + ), + ], + ), + SizedBox(height: 16.h), + Row( + children: [ + isLoading + ? Container().toShimmer2(isShow: true, height: 40.h, width: 100.h, radius: 12.h) + : Expanded( + flex: 6, + child: CustomButton( + text: "Download Report".needTranslation, + onPressed: () async { + LoaderBottomSheet.showLoader(); + await medicalFileViewModel.getPatientSickLeavePDF(patientSickLeavesResponseModel, _appState.getAuthenticatedUser()!).then((val) async { + LoaderBottomSheet.hideLoader(); + if (medicalFileViewModel.patientSickLeavePDFBase64.isNotEmpty) { + String path = await Utils.createFileFromString(medicalFileViewModel.patientSickLeavePDFBase64, "pdf"); + try { + OpenFilex.open(path); + } catch (ex) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Cannot open file".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } + }); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + icon: AppAssets.download, + iconColor: AppColors.primaryRedColor, + iconSize: 14.h, + ).toShimmer2(isShow: isLoading), + ), + SizedBox(width: 8.h), + isSickLeaveListPage ? SizedBox.shrink() : Expanded( + flex: 1, + child: Container( + height: 40.h, + width: 40.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.textColor, + borderRadius: 10.h, + ), + child: Padding( + padding: EdgeInsets.all(10.h), + child: Transform.flip( + flipX: _appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.whiteColor, + width: 40.h, + height: 40.h, + fit: BoxFit.contain, + ), + ), + ), + ).toShimmer2(isShow: isLoading).onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: PatientSickleavesListPage(), + ), + ); + }), + ), + ], + ), + ], + ), + ), + ); + } + + String getStatusText(BuildContext context) { + String statusText = ""; + if (patientSickLeavesResponseModel.status == 1) { + statusText = LocaleKeys.pendingActivation.tr(context: context); + } else if (patientSickLeavesResponseModel.status == 2) { + statusText = LocaleKeys.ready.tr(context: context); + } else if (patientSickLeavesResponseModel.status == 3) { + statusText = LocaleKeys.awaitingApproval.tr(context: context); + } else { + statusText = ""; + } + return statusText; + } + + Color getStatusColor() { + Color statusColor = Colors.white; + if (patientSickLeavesResponseModel.status == 1) { + statusColor = Color(0xffCC9B14); // TODO change color as per In Queue design + } else if (patientSickLeavesResponseModel.status == 2) { + statusColor = AppColors.successColor; + } else if (patientSickLeavesResponseModel.status == 3) { + statusColor = AppColors.primaryRedColor; + } else { + statusColor = Colors.white; + } + return statusColor; + } +} diff --git a/lib/presentation/medical_report/medical_report_request_page.dart b/lib/presentation/medical_report/medical_report_request_page.dart new file mode 100644 index 0000000..8eabcdd --- /dev/null +++ b/lib/presentation/medical_report/medical_report_request_page.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:provider/provider.dart'; + +class MedicalReportRequestPage extends StatelessWidget { + MedicalReportRequestPage({super.key}); + + late MedicalFileViewModel medicalFileViewModel; + + @override + Widget build(BuildContext context) { + medicalFileViewModel = Provider.of(context, listen: false); + return CollapsingListView( + title: "Medical Reports".needTranslation, + isClose: true, + child: Column( + children: [ + ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: medicalFileViewModel.patientMedicalReportAppointmentHistoryList.length, + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: AppointmentCard( + patientAppointmentHistoryResponseModel: medicalFileViewModel.patientMedicalReportAppointmentHistoryList[index], + myAppointmentsViewModel: Provider.of(context, listen: false), + bookAppointmentsViewModel: Provider.of(context, listen: false), + medicalFileViewModel: medicalFileViewModel, + isLoading: false, + isFromHomePage: false, + isFromMedicalReport: true, + ), + ).paddingSymmetrical(24.h, 0.h), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + SizedBox(height: 24.h), + ], + ), + ); + } +} diff --git a/lib/presentation/medical_report/medical_reports_page.dart b/lib/presentation/medical_report/medical_reports_page.dart new file mode 100644 index 0000000..71abcb7 --- /dev/null +++ b/lib/presentation/medical_report/medical_reports_page.dart @@ -0,0 +1,240 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/medical_report/medical_report_request_page.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/presentation/medical_report/widgets/patient_medical_report_card.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +class MedicalReportsPage extends StatefulWidget { + const MedicalReportsPage({super.key}); + + @override + State createState() => _MedicalReportsPageState(); +} + +class _MedicalReportsPageState extends State { + late MedicalFileViewModel medicalFileViewModel; + + @override + Widget build(BuildContext context) { + medicalFileViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Medical Reports".needTranslation, + child: SingleChildScrollView( + child: Consumer(builder: (context, medicalFileVM, child) { + return Column( + children: [ + SizedBox(height: 16.h), + Row( + children: [ + CustomButton( + text: "Requested".needTranslation, + onPressed: () { + medicalFileViewModel.onMedicalReportTabChange(0); + }, + backgroundColor: medicalFileVM.selectedMedicalReportsTabIndex == 0 ? AppColors.bgRedLightColor : AppColors.whiteColor, + borderColor: medicalFileVM.selectedMedicalReportsTabIndex == 0 ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), + textColor: medicalFileVM.selectedMedicalReportsTabIndex == 0 ? AppColors.primaryRedColor : AppColors.blackColor, + fontSize: 12, + fontWeight: FontWeight.w500, + borderRadius: 10, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + SizedBox(width: 8.h), + CustomButton( + text: LocaleKeys.ready.tr(context: context), + onPressed: () { + medicalFileViewModel.onMedicalReportTabChange(1); + }, + backgroundColor: medicalFileVM.selectedMedicalReportsTabIndex == 1 ? AppColors.bgRedLightColor : AppColors.whiteColor, + borderColor: medicalFileVM.selectedMedicalReportsTabIndex == 1 ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), + textColor: medicalFileVM.selectedMedicalReportsTabIndex == 1 ? AppColors.primaryRedColor : AppColors.blackColor, + fontSize: 12, + fontWeight: FontWeight.w500, + borderRadius: 10, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + SizedBox(width: 8.h), + CustomButton( + text: LocaleKeys.cancelled.tr(context: context), + onPressed: () { + medicalFileViewModel.onMedicalReportTabChange(2); + }, + backgroundColor: medicalFileVM.selectedMedicalReportsTabIndex == 2 ? AppColors.bgRedLightColor : AppColors.whiteColor, + borderColor: medicalFileVM.selectedMedicalReportsTabIndex == 2 ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), + textColor: medicalFileVM.selectedMedicalReportsTabIndex == 2 ? AppColors.primaryRedColor : AppColors.blackColor, + fontSize: 12, + fontWeight: FontWeight.w500, + borderRadius: 10, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + ], + ).paddingSymmetrical(24.h, 0.h), + // CustomTabBar( + // activeTextColor: Color(0xffED1C2B), + // activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), + // tabs: [ + // CustomTabBarModel(null, "Requested".needTranslation), + // CustomTabBarModel(null, "Ready".needTranslation), + // CustomTabBarModel(null, "Cancelled".needTranslation), + // ], + // onTabChange: (index) { + // medicalFileViewModel.onMedicalReportTabChange(index); + // }, + // ).paddingSymmetrical(24.h, 0.h), + ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: medicalFileViewModel.isPatientMedicalReportsListLoading + ? 3 + : medicalFileViewModel.patientMedicalReportList.isNotEmpty + ? medicalFileViewModel.patientMedicalReportList.length + : 1, + itemBuilder: (context, index) { + return medicalFileViewModel.isPatientMedicalReportsListLoading + ? PatientMedicalReportCard( + patientMedicalReportResponseModel: PatientMedicalReportResponseModel(), + medicalFileViewModel: medicalFileVM, + isLoading: true, + ).paddingSymmetrical(24.h, 0.h) + : medicalFileViewModel.patientMedicalReportList.isNotEmpty + ? AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: PatientMedicalReportCard( + patientMedicalReportResponseModel: medicalFileVM.patientMedicalReportList[index], + medicalFileViewModel: medicalFileVM, + isLoading: false, + ), + ).paddingSymmetrical(24.h, 0.h), + ), + ), + ) + : Utils.getNoDataWidget(context, noDataText: "You don't have any medical reports yet.".needTranslation).paddingSymmetrical(24.h, 24.h); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + SizedBox(height: 24.h), + ], + ); + }), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: CustomButton( + text: "Request medical report".needTranslation, + onPressed: () async { + LoaderBottomSheet.showLoader(); + await medicalFileViewModel.getPatientMedicalReportAppointmentsList(onSuccess: (val) async { + LoaderBottomSheet.hideLoader(); + bool? value = await Navigator.of(context).push( + CustomPageRoute( + page: MedicalReportRequestPage(), + fullScreenDialog: true, + direction: AxisDirection.down, + ), + ); + if (value != null) { + showConfirmRequestMedicalReportBottomSheet(); + } + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "You do not have any appointments to request a medical report.".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 45.h, + icon: AppAssets.requests, + iconColor: AppColors.whiteColor, + iconSize: 20.h, + ).paddingSymmetrical(24.h, 24.h), + ), + ], + ), + ); + } + + showConfirmRequestMedicalReportBottomSheet() { + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: context), + context, + child: Utils.getWarningWidget( + loadingText: "Are you sure you want to request a medical report for this appointment?".needTranslation, + isShowActionButtons: true, + onCancelTap: () { + Navigator.pop(context); + }, + onConfirmTap: () async { + Navigator.pop(context); + LoaderBottomSheet.showLoader(); + await medicalFileViewModel.insertRequestForMedicalReport(onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight(context, child: Utils.getSuccessWidget(loadingText: "Your medical report request has been successfully submitted.".needTranslation), callBackFunc: () { + medicalFileViewModel.setIsPatientMedicalReportsLoading(true); + medicalFileViewModel.onMedicalReportTabChange(0); + medicalFileViewModel.getPatientMedicalReportList(); + }); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight(context, child: Utils.getErrorWidget(loadingText: err), callBackFunc: () { + medicalFileViewModel.setIsPatientMedicalReportsLoading(true); + medicalFileViewModel.onMedicalReportTabChange(0); + medicalFileViewModel.getPatientMedicalReportList(); + }); + }); + }), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } +} diff --git a/lib/presentation/medical_report/widgets/patient_medical_report_card.dart b/lib/presentation/medical_report/widgets/patient_medical_report_card.dart new file mode 100644 index 0000000..1762886 --- /dev/null +++ b/lib/presentation/medical_report/widgets/patient_medical_report_card.dart @@ -0,0 +1,159 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:open_filex/open_filex.dart'; +import 'package:share_plus/share_plus.dart'; + +class PatientMedicalReportCard extends StatelessWidget { + PatientMedicalReportCard({super.key, required this.patientMedicalReportResponseModel, required this.medicalFileViewModel, this.isLoading = false}); + + PatientMedicalReportResponseModel patientMedicalReportResponseModel; + MedicalFileViewModel medicalFileViewModel; + + bool isLoading = true; + + @override + Widget build(BuildContext context) { + AppState _appState = getIt.get(); + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.network( + isLoading ? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png" : patientMedicalReportResponseModel.doctorImageURL!, + width: 63.h, + height: 63.h, + fit: BoxFit.fill, + ).circle(100).toShimmer2(isShow: isLoading), + SizedBox(width: 16.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (isLoading ? "" : patientMedicalReportResponseModel.doctorName!).toText16(isBold: true).toShimmer2(isShow: isLoading), + SizedBox(height: 4.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget(labelText: isLoading ? "" : patientMedicalReportResponseModel.clinicDescription!).toShimmer2(isShow: isLoading), + AppCustomChipWidget(labelText: isLoading ? "" : patientMedicalReportResponseModel.projectName!).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + icon: AppAssets.doctor_calendar_icon, + labelText: isLoading + ? "" + : "${DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientMedicalReportResponseModel.requestDate), false)}, ${DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(patientMedicalReportResponseModel.requestDate), false)}") + .toShimmer2(isShow: isLoading), + AppCustomChipWidget( + icon: AppAssets.rating_icon, iconColor: AppColors.ratingColorYellow, labelText: isLoading ? "" : "Rating: ${patientMedicalReportResponseModel.decimalDoctorRate}") + .toShimmer2(isShow: isLoading), + ], + ), + ], + ), + ), + ], + ), + patientMedicalReportResponseModel.status == 2 + ? Padding( + padding: EdgeInsets.only(top: 16.h), + child: Row( + children: [ + Expanded( + child: CustomButton( + text: "Share", + onPressed: () { + getMedicalReportPDF(true, context, _appState); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12.h, + height: 40.h, + icon: AppAssets.download_1, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + ).toShimmer2(isShow: isLoading), + ), + SizedBox(width: 16.h), + Expanded( + child: CustomButton( + text: "Download", + onPressed: () async { + getMedicalReportPDF(false, context, _appState); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12.h, + height: 40.h, + icon: AppAssets.download_1, + iconColor: AppColors.whiteColor, + iconSize: 16.h, + ).toShimmer2(isShow: isLoading), + ), + ], + ), + ) + : SizedBox.shrink() + ], + ), + ), + ); + } + + void getMedicalReportPDF(bool isShare, BuildContext context, AppState _appState) async { + LoaderBottomSheet.showLoader(); + await medicalFileViewModel.getPatientMedicalReportPDF(patientMedicalReportResponseModel, _appState.getAuthenticatedUser()!).then((val) async { + LoaderBottomSheet.hideLoader(); + if (medicalFileViewModel.patientMedicalReportPDFBase64.isNotEmpty) { + String path = await Utils.createFileFromString(medicalFileViewModel.patientMedicalReportPDFBase64, "pdf"); + if (isShare) { + Share.shareXFiles([XFile(path)], text: "Medical Report"); + } else { + try { + OpenFilex.open(path); + } catch (ex) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Cannot open file".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } + } + }); + } +} diff --git a/lib/presentation/my_family/my_family.dart b/lib/presentation/my_family/my_family.dart new file mode 100644 index 0000000..5020b82 --- /dev/null +++ b/lib/presentation/my_family/my_family.dart @@ -0,0 +1,133 @@ +import 'dart:convert'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/my_family/widget/family_cards.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; +import 'package:hmg_patient_app_new/widgets/dropdown/country_dropdown_widget.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart'; + +class FamilyMedicalScreen extends StatefulWidget { + final List profiles; + final Function(FamilyFileResponseModelLists) onSelect; + + const FamilyMedicalScreen({ + super.key, + required this.profiles, + required this.onSelect, + }); + + @override + State createState() => _FamilyMedicalScreenState(); +} + +class _FamilyMedicalScreenState extends State { + MedicalFileViewModel? medicalVM; + + @override + void initState() { + super.initState(); + medicalVM = context.read(); + } + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + + return CollapsingListView( + title: "Medical Files".needTranslation, + bottomChild: appState.getAuthenticatedUser()!.isParentUser! + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + customBorder: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)), + ), + padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 20.h), + child: CustomButton( + text: "Add a new family member".needTranslation, + onPressed: () { + DialogService dialogService = getIt.get(); + dialogService.showAddFamilyFileSheet( + label: "Add Family Member".needTranslation, + message: "Please fill the below field to add a new family member to your profile".needTranslation, + onVerificationPress: () { + medicalVM!.addFamilyFile(otpTypeEnum: OTPTypeEnum.sms); + }); + }, + icon: AppAssets.add_icon, + fontSize: 16.f, + borderRadius: 12.r, + fontWeight: FontWeight.w500)) + : SizedBox(), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + appState.isChildLoggedIn + ? SizedBox() + : CustomTabBar( + activeBackgroundColor: AppColors.secondaryLightRedColor, + activeTextColor: AppColors.primaryRedColor, + tabs: [CustomTabBarModel(null, LocaleKeys.family.tr()), CustomTabBarModel(null, LocaleKeys.request.tr())], + onTabChange: (index) { + medicalVM!.onFamilyFileTabChange(index); + }, + ), + appState.isChildLoggedIn ? SizedBox() : SizedBox(height: 25.h), + Selector(selector: (_, model) => model.getSelectedFamilyFileTabIndex, builder: (context, selectedIndex, child) => getFamilyTabs(index: selectedIndex)), + SizedBox(height: 20.h), + ], + ).paddingSymmetrical(20, 0), + ); + } + + Widget getFamilyTabs({required int index}) { + switch (index) { + case 0: + return FamilyCards( + profiles: medicalVM!.patientFamilyFiles, + onSelect: (FamilyFileResponseModelLists profile) { + medicalVM!.switchFamilyFiles(responseID: profile.responseId, patientID: profile.patientId, phoneNumber: profile.mobileNumber); + }, + onRemove: (FamilyFileResponseModelLists profile) { + medicalVM!.removeFileFromFamilyMembers(id: profile.id); + }, + isLeftAligned: true, + isShowDetails: true, + isShowRemoveButton: true, + ); + case 1: + return FamilyCards( + profiles: medicalVM!.pendingFamilyFiles, + isRequestDesign: true, + onSelect: (FamilyFileResponseModelLists profile) { + medicalVM!.acceptRejectFileFromFamilyMembers(id: profile.id, status: 3); + }, + onRemove: (FamilyFileResponseModelLists profile) { + medicalVM!.acceptRejectFileFromFamilyMembers(id: profile.id, status: 4); + }, + isShowDetails: true, + ); + default: + return SizedBox.shrink(); + } + } +} diff --git a/lib/presentation/my_family/widget/family_cards.dart b/lib/presentation/my_family/widget/family_cards.dart new file mode 100644 index 0000000..4db5470 --- /dev/null +++ b/lib/presentation/my_family/widget/family_cards.dart @@ -0,0 +1,389 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; + +class FamilyCards extends StatefulWidget { + final List profiles; + final Function(FamilyFileResponseModelLists) onSelect; + final Function(FamilyFileResponseModelLists) onRemove; + final bool isShowDetails; + final bool isBottomSheet; + final bool isRequestDesign; + final bool isLeftAligned; + final bool isShowRemoveButton; + + const FamilyCards( + {super.key, + required this.profiles, + required this.onSelect, + required this.onRemove, + this.isShowDetails = false, + this.isBottomSheet = false, + this.isRequestDesign = false, + this.isLeftAligned = false, + this.isShowRemoveButton = false}); + + @override + State createState() => _FamilyCardsState(); +} + +class _FamilyCardsState extends State { + AppState appState = getIt(); + + @override + Widget build(BuildContext context) { + DialogService dialogService = getIt.get(); + if (widget.isRequestDesign) { + return Column( + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.alertSquare), + SizedBox(width: 8.h), + "Who can view my medical file ?" + .needTranslation + .toText14(color: AppColors.textColor, isUnderLine: true, weight: FontWeight.w500) + .onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Manage Family".needTranslation, + message: "", + child: manageFamily(), + onOkPressed: () {}, + ); + }), + SizedBox(width: 4.h), + Utils.buildSvgWithAssets(icon: AppAssets.arrowRight), + ], + ), + SizedBox(height: 24.h), + widget.profiles.where((profile) => profile.isRequestFromMySide ?? false).isEmpty + ? Utils.getNoDataWidget(context) + : ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + itemCount: widget.profiles.where((profile) => profile.isRequestFromMySide ?? false).length, + itemBuilder: (context, index) { + final mySideProfiles = widget.profiles.where((profile) => profile.isRequestFromMySide ?? false).toList(); + FamilyFileResponseModelLists profile = mySideProfiles[index]; + return Container( + margin: EdgeInsets.only(bottom: 12.h), + padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24), + child: Opacity( + opacity: 1.0, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: profile.status == FamilyFileEnum.pending.toInt + ? AppColors.alertLightColor.withValues(alpha: 0.20) + : profile.status == FamilyFileEnum.rejected.toInt + ? AppColors.primaryRedColor.withValues(alpha: 0.20) + : profile.status == FamilyFileEnum.active.toInt + ? AppColors.lightGreenColor + : AppColors.lightGrayBGColor, + chipText: profile.statusDescription ?? "N/A", + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: profile.status == FamilyFileEnum.pending.toInt + ? AppColors.alertLightColor + : profile.status == FamilyFileEnum.rejected.toInt + ? AppColors.primaryRedColor + : profile.status == FamilyFileEnum.active.toInt + ? AppColors.textGreenColor + : AppColors.alertColor), + SizedBox(height: 8.h), + Wrap( + alignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + runAlignment: WrapAlignment.start, + spacing: 0.h, + children: [ + (profile.patientName ?? "").toText14(isBold: false, isCenter: false, maxlines: 1, weight: FontWeight.w600), + (getStatusTextByRequest( + FamilyFileEnum.values.firstWhere((e) => e.toInt == profile.status), profile.isRequestFromMySide ?? false)) + .toText12( + isBold: false, isCenter: false, maxLine: 1, fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + ]), + SizedBox(height: 8.h), + CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: "Medical File: ${profile.responseId ?? "N/A"}", + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor), + ], + ), + ), + ); + }, + ), + SizedBox(height: 20.h), + ], + ); + } else { + return GridView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: widget.profiles.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 10.w, + mainAxisSpacing: 10.h, + childAspectRatio: widget.isShowDetails ? 0.56.h : 0.65.h, + ), + padding: EdgeInsets.only(bottom: 20.h), + itemBuilder: (context, index) { + final profile = widget.profiles[index]; + final isActive = (profile.responseId == appState.getAuthenticatedUser()?.patientId); + final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false; + final canSwitch = isParentUser || (!isParentUser && profile.responseId == appState.getSuperUserID); + return Container( + padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24), + child: Opacity( + opacity: isActive || profile.status == FamilyFileEnum.pending.toInt || !canSwitch ? 0.4 : 1.0, // Fade all content if active + child: Stack( + children: [ + Column( + mainAxisSize: MainAxisSize.min, + children: [ + Utils.buildImgWithAssets( + icon: profile.gender == null + ? AppAssets.dummy_user + : profile.gender == 1 + ? ((profile.age ?? 0) < 7 ? AppAssets.babyBoyImg : AppAssets.male_img) + : (profile.age! < 7 ? AppAssets.babyGirlImg : AppAssets.femaleImg), + width: 72.h, + height: 70.h, + ), + SizedBox(height: 8.h), + (profile.patientName ?? "Unknown").toText14(isBold: false, isCenter: true, maxlines: 1, weight: FontWeight.w600), + SizedBox(height: 8.h), + CustomChipWidget( + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: "Relation:${profile.relationship ?? " N/A"}", + iconAsset: AppAssets.heart, + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor), + widget.isShowDetails ? SizedBox(height: 4.h) : SizedBox(), + widget.isShowDetails + ? CustomChipWidget( + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: "Age:${profile.age ?? "N/A"} Years", + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor, + ) + : SizedBox(), + widget.isShowDetails + ? SizedBox(height: 8.h) + : SizedBox( + height: 4.h, + ), + Spacer(), + CustomButton( + height: 40.h, + onPressed: () { + if (canSwitch) widget.onSelect(profile); + }, + text: isActive ? "Active".needTranslation : "Switch".needTranslation, + backgroundColor: isActive || !canSwitch ? Colors.grey.shade200 : AppColors.secondaryLightRedColor, + borderColor: isActive || !canSwitch ? Colors.grey.shade200 : AppColors.secondaryLightRedColor, + textColor: isActive || !canSwitch ? AppColors.greyTextColor : AppColors.primaryRedColor, + fontSize: 13.h, + icon: isActive ? AppAssets.activeCheck : AppAssets.switch_user, + iconColor: isActive || !canSwitch ? (isActive ? null : AppColors.greyTextColor) : AppColors.primaryRedColor, + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 0), + ).paddingOnly(top: 0, bottom: 0), + ], + ), + if (widget.isShowRemoveButton) ...[ + Positioned( + top: 0, + right: 0, + child: Utils.buildSvgWithAssets(icon: AppAssets.deleteIcon).onPress(() { + if (!isActive) widget.onRemove(profile); + }), + ), + ], + ], + ), + ), + ); + }, + ); + } + } + + Widget manageFamily() { + NavigationService navigationService = getIt(); + + return widget.profiles.where((profile) => !(profile.isRequestFromMySide ?? false)).isEmpty + ? Utils.getNoDataWidget(context) + : ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsetsGeometry.zero, + itemCount: widget.profiles.where((profile) => !(profile.isRequestFromMySide ?? false)).length, + itemBuilder: (context, index) { + final otherProfiles = widget.profiles.where((profile) => !(profile.isRequestFromMySide ?? false)).toList(); + FamilyFileResponseModelLists profile = otherProfiles[index]; + return Container( + margin: EdgeInsets.only(bottom: 12.h), + padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24), + child: Opacity( + opacity: 1.0, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: profile.status == FamilyFileEnum.pending.toInt + ? AppColors.alertLightColor.withValues(alpha: 0.20) + : profile.status == FamilyFileEnum.rejected.toInt + ? AppColors.primaryRedColor.withValues(alpha: 0.20) + : profile.status == FamilyFileEnum.active.toInt + ? AppColors.lightGreenColor + : AppColors.lightGrayBGColor, + chipText: profile.statusDescription ?? "N/A", + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: profile.status == FamilyFileEnum.pending.toInt + ? AppColors.alertLightColor + : profile.status == FamilyFileEnum.rejected.toInt + ? AppColors.primaryRedColor + : profile.status == FamilyFileEnum.active.toInt + ? AppColors.textGreenColor + : AppColors.alertColor, + ), + SizedBox(height: 8.h), + Wrap( + alignment: WrapAlignment.start, + children: [ + (profile.patientName ?? "").toText14(isBold: false, isCenter: true, maxlines: 1, weight: FontWeight.w600), + (getStatusTextByRequest( + FamilyFileEnum.values.firstWhere((e) => e.toInt == profile.status), profile.isRequestFromMySide ?? false)) + .toText14( + isBold: false, + isCenter: true, + maxlines: 1, + weight: FontWeight.w500, + color: AppColors.greyTextColor, + ), + ], + ), + SizedBox(height: 8.h), + CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: "Medical File: ${profile.patientId ?? "N/A".needTranslation}", + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor, + ), + SizedBox(height: 16.h), + Row( + children: [ + profile.status == FamilyFileEnum.active.toInt + ? SizedBox() + : Expanded( + child: CustomButton( + height: 40.h, + text: LocaleKeys.confirm.tr(), + onPressed: () { + navigationService.pop(); + widget.onSelect(profile); + }, + backgroundColor: AppColors.lightGreenButtonColor, + borderColor: AppColors.lightGreenButtonColor, + textColor: AppColors.textGreenColor, + icon: null, + ), + ), + profile.status == FamilyFileEnum.active.toInt ? SizedBox() : SizedBox(width: 8.h), + Expanded( + child: CustomButton( + height: 40.h, + text: profile.status == FamilyFileEnum.active.toInt ? LocaleKeys.removeMember.tr() : LocaleKeys.cancel.tr(), + onPressed: () { + navigationService.pop(); + widget.onRemove(profile); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + icon: null, + iconColor: AppColors.primaryRedColor, + ), + ), + ], + ), + ], + ), + ), + ); + }, + ); + } + + String getStatusTextByRequest(FamilyFileEnum status, bool isRequestFromMySide) { + switch (status) { + case FamilyFileEnum.active: + if (isRequestFromMySide) { + return "${status.displayName} your request to be your family member".needTranslation; + } else { + return "can view your file".needTranslation; + } + case FamilyFileEnum.pending: + if (isRequestFromMySide) { + return "has a request ${status.displayName} to be your family member".needTranslation; + } else { + return "wants to add you as their family member".needTranslation; + } + case FamilyFileEnum.rejected: + if (isRequestFromMySide) { + return "${status.displayName} your request to be your family member".needTranslation; + } else { + return "${status.displayName} your family member request".needTranslation; + } + case FamilyFileEnum.inactive: + return "Inactive".needTranslation; + default: + return "N/A".needTranslation; + } + } +} diff --git a/lib/presentation/my_family/widget/my_family_sheet.dart b/lib/presentation/my_family/widget/my_family_sheet.dart new file mode 100644 index 0000000..d469ab2 --- /dev/null +++ b/lib/presentation/my_family/widget/my_family_sheet.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; +import 'package:hmg_patient_app_new/presentation/my_family/widget/family_cards.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; + +class MyFamilySheet { + static Future show(BuildContext context, List familyLists, Function(FamilyFileResponseModelLists) onSelect) async { + NavigationService navigationService = getIt(); + return showCommonBottomSheetWithoutHeight( + context, + titleWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 'Please select a profile'.needTranslation.toText21(isBold: true), + 'switch from the below list of medical file'.needTranslation.toText16(weight: FontWeight.w100, color: AppColors.greyTextColor), + ], + ), + child: FamilyCards( + profiles: familyLists, + onSelect: (profile) { + navigationService.pop(); + onSelect(profile); + }, + onRemove: (profile) {}, + isBottomSheet: true), + callBackFunc: () {}, + ); + } +} diff --git a/lib/presentation/onboarding/onboarding_screen.dart b/lib/presentation/onboarding/onboarding_screen.dart new file mode 100644 index 0000000..265559b --- /dev/null +++ b/lib/presentation/onboarding/onboarding_screen.dart @@ -0,0 +1,184 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:lottie/lottie.dart'; + +import '../../core/dependencies.dart'; + +class OnboardingScreen extends StatefulWidget { + OnboardingScreen({Key? key}) : super(key: key); + + @override + _OnboardingScreenState createState() { + return _OnboardingScreenState(); + } +} + +class _OnboardingScreenState extends State { + int selectedIndex = 0; + + late PageController pageController; + + void goToHomePage() { + Utils.saveBoolFromPrefs(CacheConst.firstLaunch, false); + Navigator.of(context).pushReplacement(FadePage(page: LandingNavigation())); + } + + @override + void initState() { + super.initState(); + pageController = PageController(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.whiteColor, + body: SafeArea( + top: false, + left: false, + right: false, + child: Column( + spacing: 24.h, + children: [ + PageView( + controller: pageController, + children: [ + onboardingView( + AppAnimations.onboarding_1, + "Booking appointment has never been easy".needTranslation, + "In few clicks find yourself having consultation with the doctor of your choice.".needTranslation, + ), + onboardingView( + AppAnimations.onboarding_2, + "Access the medical history on finger tips".needTranslation, + "Keep track on your medical history including labs, prescription, insurance, etc".needTranslation, + ), + ], + onPageChanged: (int index) { + selectedIndex = index; + setState(() {}); + }, + ).expanded, + Row( + spacing: 4.w, + children: [ + AnimatedContainer( + duration: const Duration(milliseconds: 250), + height: 6.h, + width: selectedIndex == 0 ? 18.w : 6.w, + decoration: BoxDecoration( + color: selectedIndex == 0 ? AppColors.textColor : AppColors.inputLabelTextColor, borderRadius: BorderRadius.circular(30.r)), + ), + AnimatedContainer( + duration: const Duration(milliseconds: 250), + height: 6.h, + width: selectedIndex == 1 ? 18.w : 6.w, + decoration: BoxDecoration( + color: selectedIndex == 1 ? AppColors.textColor : AppColors.inputLabelTextColor, borderRadius: BorderRadius.circular(30.r)), + ), + ], + ).paddingOnly(left: 24.w, right: 24.w), + Row( + children: [ + AnimatedSwitcher( + duration: const Duration(milliseconds: 250), + transitionBuilder: (child, anim) => FadeTransition(opacity: anim, child: child), + child: selectedIndex == 0 + ? CustomButton( + text: "Skip".needTranslation, + onPressed: () => goToHomePage(), + width: 86.w, + height: 56.h, + backgroundColor: Color(0xffFEE9EA), + textColor: AppColors.primaryRedColor, + borderColor: Colors.transparent, + ).paddingOnly(left: 24.w) + : const SizedBox.shrink(), + ), + const Spacer(), + AnimatedContainer( + duration: const Duration(milliseconds: 400), + curve: Curves.easeInOut, + width: selectedIndex == 0 ? 86.w : MediaQuery.of(context).size.width - 48.w, + margin: EdgeInsets.only(left: 24.w, right: 24.w), + decoration: BoxDecoration( + color: AppColors.primaryRedColor, + borderRadius: BorderRadius.circular(12.r), + ), + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 250), + transitionBuilder: (child, anim) => FadeTransition(opacity: anim, child: child), + child: selectedIndex == 0 + ? CustomButton( + icon: getIt.get().isArabic() ? AppAssets.arrow_back : AppAssets.arrow_forward, + iconSize: 32.w, + width: 86.w, + height: 56.h, + text: "".needTranslation, + backgroundColor: Colors.transparent, + onPressed: () { + pageController.animateToPage(1, duration: Duration(milliseconds: 400), curve: Curves.easeInOut); + }) + : CustomButton( + text: "Get Started".needTranslation, + fontWeight: FontWeight.w500, + fontSize: 16.f, + height: 56.h, + textOverflow: TextOverflow.ellipsis, + backgroundColor: Colors.transparent, + onPressed: () => goToHomePage(), + ), + ), + ), + ], + ).paddingOnly(bottom: (isFoldable || isTablet) ? 20.h : 10.h), + ], + ), + ), + ); + } + + Widget onboardingView(String icon, String heading, String body) { + return Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12.h, + children: [ + Align( + alignment: Alignment.bottomCenter, + child: Transform.flip( + flipX: getIt.get().isArabic() ? true : false, + child: Lottie.asset(icon, + repeat: true, + reverse: false, + frameRate: FrameRate(60), + width: MediaQuery.sizeOf(context).width - 50.w, + height: MediaQuery.sizeOf(context).width - 50.w))) + .expanded, + Text( + heading, + style: TextStyle(fontSize: 36.f, fontWeight: FontWeight.w600, color: AppColors.textColor, letterSpacing: -0.4, height: 1), + ), + Text( + body, + style: TextStyle(fontSize: 16.f, fontWeight: FontWeight.w500, color: AppColors.greyTextColor, letterSpacing: 0, height: 26 / 16), + ), + ], + ).paddingOnly(left: 24.w, right: 24.w); + } +} diff --git a/lib/presentation/onboarding/splash_animation_screen.dart b/lib/presentation/onboarding/splash_animation_screen.dart new file mode 100644 index 0000000..bca9681 --- /dev/null +++ b/lib/presentation/onboarding/splash_animation_screen.dart @@ -0,0 +1,383 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/login.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:lottie/lottie.dart'; + +class SplashAnimationScreen extends StatefulWidget { + final Widget? routeWidget; + + SplashAnimationScreen({super.key, this.routeWidget}); + + @override + _SplashAnimationScreenState createState() { + return _SplashAnimationScreenState(); + } +} + +class _SplashAnimationScreenState extends State with SingleTickerProviderStateMixin { + late final AnimationController _controller; + + @override + void initState() { + super.initState(); + _controller = AnimationController(vsync: this); + _controller.addListener(() { + if (_controller.status == AnimationStatus.completed) { + Navigator.of(context).pushReplacement(FadePage(page: widget.routeWidget ?? LandingNavigation())); + } + }); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.whiteColor, + body: Stack( + children: [ + Lottie.asset(AppAnimations.splashLaunching, controller: _controller, width: double.infinity, height: double.infinity, onLoaded: (composition) { + _controller + ..duration = composition.duration + ..forward(); // Start the animation + }, repeat: false, reverse: false, frameRate: FrameRate(60), fit: BoxFit.fill) + .center, + ], + ), + ); + } +} + +// todo: do-not remove this code,as animation need to test on multiple screen sizes + +class AnimatedScreen extends StatefulWidget { + const AnimatedScreen({super.key}); + + @override + State createState() => _AnimatedScreenState(); +} + +class _AnimatedScreenState extends State with TickerProviderStateMixin { + late AnimationController _moveController; + late Animation _positionAnimation; + late AnimationController _expandController; + late Animation _expandAnimation; + + bool isRipple = false; + late final AnimationController _controller; + + @override + void initState() { + super.initState(); + _controller = AnimationController(vsync: this); + _controller.addListener(() { + if (_controller.status == AnimationStatus.completed) { + // Navigator.of(context).pushReplacement( + // FadePage( + // page: LoginScreen(), + // ), + // ); + } + }); + + // Step 1: Move circle from bottom-left to top-right + _moveController = AnimationController(vsync: this, duration: const Duration(seconds: 1)); + _positionAnimation = Tween( + begin: const Offset(-1, 1), + end: const Offset(1, -1), + ).animate( + CurvedAnimation(parent: _moveController, curve: const Cubic(0.82, -0.01, 0.58, 1)), + ); + + // Step 2: Expand white circle from center + _expandController = AnimationController(vsync: this, duration: const Duration(milliseconds: 1000)); + _expandAnimation = Tween( + begin: 0.0, + end: 4.0, + ).animate(CurvedAnimation(parent: _expandController, curve: Curves.easeOut)); + + // Trigger the animations in sequence + _moveController.forward().whenComplete(() { + setState(() { + isRipple = true; + }); + _expandController.forward().whenComplete(() { + setState(() { + isRipple = false; + }); + }); + }); + } + + @override + void dispose() { + _controller.dispose(); + _moveController.dispose(); + _expandController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final screenSize = MediaQuery.of(context).size; + + return Scaffold( + backgroundColor: AppColors.whiteColor, + body: Stack( + children: [ + // Moving rotated ellipse + + Lottie.asset(AppAnimations.splashLaunching, controller: _controller, onLoaded: (composition) { + _controller + ..duration = composition.duration + ..forward(); // Start the animation + }, repeat: false, reverse: false, frameRate: FrameRate(60), fit: BoxFit.fill) + .center, + Lottie.asset(AppAnimations.loadingAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 80.h, height: 80.h, fit: BoxFit.fill).center, + + AnimatedContainer( + duration: Duration(milliseconds: 500), + width: screenSize.width, + height: screenSize.height, + color: isRipple ? AppColors.primaryRedColor : AppColors.whiteColor, + ), + + AnimatedBuilder( + animation: _moveController, + builder: (context, child) { + final pos = _positionAnimation.value; + return Positioned( + left: ((screenSize.width * .75) * (pos.dx)).h, + top: ((screenSize.height * 0.75) * (pos.dy)).h, + child: Transform.rotate( + angle: -120 * 3.1415927 / 150, // convert degrees to radians + child: Container( + width: 400.h, + height: 653.h, + decoration: BoxDecoration( + color: Color(0xffED1C2B), + borderRadius: BorderRadius.circular(330.h), + ), + ), + ), + ); + }, + ), + // Expanding white circle + AnimatedBuilder( + animation: _expandController, + builder: (context, child) { + return Center( + child: Transform.scale( + scale: _expandAnimation.value, + child: Opacity( + opacity: 1.0, //- _expandAnimation.value.clamp(0.0, 1.0), + child: Container( + decoration: const BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + // border: Border.fromBorderSide(BorderSide( + // width: 0, + // color: Color(0xffED1C2B), + // ) + )), + ), + // ), + ), + ); + }, + ), + // AnimatedBuilder( + // animation: _expandController, + // builder: (context, child) { + // final screenSize = MediaQuery.of(context).size; + // final maxDiameter = + // (screenSize.width > screenSize.height ? screenSize.width : screenSize.height) * 2; + // + // return Center( + // child: Transform.scale( + // scale: _expandAnimation.value * maxDiameter / 100, // scale up to fill screen + // child: Opacity( + // opacity: (1.0 - _expandAnimation.value).clamp(0.0, 1.0), + // child: Container( + // decoration: const BoxDecoration( + // color: Colors.white, + // shape: BoxShape.circle, + // ), + // ), + // ), + // ), + // ); + // }, + // ), + ], + ), + ); + } +} + +class MoveObjectDemo extends StatefulWidget { + const MoveObjectDemo({super.key}); + + @override + State createState() => _MoveObjectDemoState(); +} + +class _MoveObjectDemoState extends State with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _alignmentAnimation; + + @override + void initState() { + super.initState(); + + _controller = AnimationController( + vsync: this, + duration: const Duration(seconds: 1), + ); + + _alignmentAnimation = AlignmentTween( + begin: Alignment(-2.0, 2.5), + end: Alignment(2.5, -2), + ).animate(CurvedAnimation(parent: _controller, curve: Curves.easeInOut)); + + _controller.forward(); // start animation + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: AnimatedBuilder( + animation: _alignmentAnimation, + builder: (context, child) { + return Align( + alignment: _alignmentAnimation.value, + child: Transform.rotate( + angle: -120 * 3.1415927 / 180, + child: Container( + width: 200, + height: 375, + decoration: BoxDecoration( + color: const Color(0xffED1C2B), + borderRadius: BorderRadius.circular(330), + ), + ), + ), + + // Transform.rotate( + // angle: -120 * 3.1415927 / 180, // convert to radians + // child: Container( + // width: 400, + // height: 653, + // decoration: BoxDecoration( + // color: const Color(0xffED1C2B), + // borderRadius: BorderRadius.circular(330), + // ), + // ), + // ), + ); + }, + ), + ); + } +} + +class MoveOnClickDemo extends StatefulWidget { + const MoveOnClickDemo({super.key}); + + @override + State createState() => _MoveOnClickDemoState(); +} + +class _MoveOnClickDemoState extends State with TickerProviderStateMixin { + late AnimationController _controller; + late Animation _alignmentAnimation; + + @override + void initState() { + super.initState(); + init(); + } + + init() { + _controller = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1000), // Figma duration + ); + + _alignmentAnimation = AlignmentTween( + // begin: Alignment(-10.0, 5), + // end: Alignment(5, -2), + begin: Alignment.bottomLeft, + end: Alignment.topRight, + ).animate(CurvedAnimation( + parent: _controller, + curve: const Cubic(0.82, -0.01, 0.58, 1), // Figma cubic-bezier + )); + _animate(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + void _animate() { + if (_controller.isCompleted) { + _controller.reverse(); + } else { + _controller.forward(); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: GestureDetector( + onTap: _animate, // trigger on click + onDoubleTap: () { + _controller.dispose(); + init(); + }, + child: AnimatedBuilder( + animation: _alignmentAnimation, + builder: (context, child) { + print(_alignmentAnimation.value); + return Align( + alignment: _alignmentAnimation.value, + child: Transform.rotate( + angle: -120 * 3.1415927 / 145, // -120 deg + child: Container( + width: 100, + height: 150, + decoration: BoxDecoration( + color: const Color(0xffED1C2B), + borderRadius: BorderRadius.circular(330), + ), + ), + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/presentation/prescriptions/prescription_detail_page.dart b/lib/presentation/prescriptions/prescription_detail_page.dart new file mode 100644 index 0000000..473f79a --- /dev/null +++ b/lib/presentation/prescriptions/prescription_detail_page.dart @@ -0,0 +1,236 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/calendar_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/patient_prescriptions_response_model.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_item_view.dart'; +import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_reminder_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart'; +import 'package:open_filex/open_filex.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class PrescriptionDetailPage extends StatefulWidget { + PrescriptionDetailPage({super.key, required this.prescriptionsResponseModel}); + + PatientPrescriptionsResponseModel prescriptionsResponseModel; + + @override + State createState() => _PrescriptionDetailPageState(); +} + +class _PrescriptionDetailPageState extends State { + late PrescriptionsViewModel prescriptionsViewModel; + + bool _isSwitched = false; // Initial state of the switch + + @override + void initState() { + checkAndRemove(false); + // locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context); + // WidgetsBinding.instance.addPostFrameCallback((_) => locationUtils.getCurrentLocation()); + scheduleMicrotask(() { + prescriptionsViewModel.setPrescriptionsDetailsLoading(); + prescriptionsViewModel.getPrescriptionDetails(widget.prescriptionsResponseModel); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + prescriptionsViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: LocaleKeys.prescriptions.tr(context: context), + instructions: () async { + LoaderBottomSheet.showLoader(loadingText: "Fetching prescription PDF, Please wait...".needTranslation); + await prescriptionsViewModel.getPrescriptionInstructionsPDF(widget.prescriptionsResponseModel, onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + if (prescriptionsViewModel.prescriptionInstructionsPDFLink.isNotEmpty) { + Uri uri = Uri.parse(prescriptionsViewModel.prescriptionInstructionsPDFLink); + launchUrl(uri, mode: LaunchMode.platformDefault, webOnlyWindowName: ""); + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Unable to fetch PDF".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }, + child: SingleChildScrollView( + child: Consumer(builder: (context, prescriptionVM, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Image.network( + widget.prescriptionsResponseModel.doctorImageURL!, + width: 24.h, + height: 24.h, + fit: BoxFit.fill, + ).circle(100), + SizedBox(width: 8.h), + Expanded(child: widget.prescriptionsResponseModel.doctorName!.toText16(isBold: true)), + ], + ), + SizedBox(height: 16.h), + Wrap( + direction: Axis.horizontal, + spacing: 4.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + icon: AppAssets.doctor_calendar_icon, + labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(widget.prescriptionsResponseModel.appointmentDate), false), + labelPadding: EdgeInsetsDirectional.only(start: -4.h, end: 8.h), + ), + AppCustomChipWidget( + labelText: widget.prescriptionsResponseModel.clinicDescription!, + ), + AppCustomChipWidget( + icon: AppAssets.rating_icon, + iconColor: AppColors.ratingColorYellow, + labelText: "Rating: ${widget.prescriptionsResponseModel.decimalDoctorRate}".needTranslation, + ), + AppCustomChipWidget( + labelText: widget.prescriptionsResponseModel.name!, + ), + ], + ), + SizedBox(height: 16.h), + CustomButton( + text: "Download Prescription".needTranslation, + onPressed: () async { + LoaderBottomSheet.showLoader(); + await prescriptionVM.getPrescriptionPDFBase64(widget.prescriptionsResponseModel).then((val) async { + LoaderBottomSheet.hideLoader(); + if (prescriptionVM.prescriptionPDFBase64Data.isNotEmpty) { + String path = await Utils.createFileFromString(prescriptionVM.prescriptionPDFBase64Data, "pdf"); + try { + OpenFilex.open(path); + } catch (ex) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Cannot open file".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } + }); + }, + backgroundColor: AppColors.successColor.withValues(alpha: 0.15), + borderColor: AppColors.successColor.withValues(alpha: 0.01), + textColor: AppColors.successColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + icon: AppAssets.download, + iconColor: AppColors.successColor, + iconSize: 14.h, + ), + ], + ), + ), + ).paddingSymmetrical(24.h, 0.h), + ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: prescriptionVM.isPrescriptionsDetailsLoading ? 5 : prescriptionVM.prescriptionDetailsList.length, + itemBuilder: (context, index) { + return prescriptionVM.isPrescriptionsDetailsLoading + ? PrescriptionItemView(prescriptionVM: prescriptionVM, index: index, isLoading: true) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: PrescriptionItemView(prescriptionVM: prescriptionVM, index: index), + ), + ), + ); + }, + ).paddingSymmetrical(24.h, 0.h), + ], + ); + }), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: CustomButton( + text: widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? LocaleKeys.resendOrder.tr(context: context) : LocaleKeys.prescriptionDeliveryError.tr(context: context), + onPressed: () {}, + backgroundColor: widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? AppColors.successColor : AppColors.greyF7Color, + borderColor: AppColors.successColor.withOpacity(0.01), + textColor: widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? AppColors.whiteColor : AppColors.textColor.withOpacity(0.35), + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + icon: AppAssets.prescription_refill_icon, + iconColor: widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? AppColors.whiteColor : AppColors.textColor.withOpacity(0.35), + iconSize: 20.h, + ).paddingSymmetrical(24.h, 24.h), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/prescriptions/prescription_item_view.dart b/lib/presentation/prescriptions/prescription_item_view.dart new file mode 100644 index 0000000..acf03f5 --- /dev/null +++ b/lib/presentation/prescriptions/prescription_item_view.dart @@ -0,0 +1,219 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/calendar_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +class PrescriptionItemView extends StatelessWidget { + int index; + PrescriptionsViewModel prescriptionVM; + bool isLoading; + + PrescriptionItemView({Key? key, required this.prescriptionVM, required this.index, this.isLoading = false}) : super(key: key); + + @override + Widget build(BuildContext context) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + margin: EdgeInsets.symmetric(vertical: 8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 8.h, + children: [ + Image.network( + isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].imageThumbUrl!, + width: 60.h, + height: 60.h, + errorBuilder: (cxt, child, tr) { + return SizedBox(height: 60, width: 60); + }, + fit: BoxFit.fill, + ).toShimmer2(isShow: isLoading).circle(100), + Expanded( + child: (isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].itemDescription!).toText16(isBold: true, maxlines: 2).toShimmer2(isShow: isLoading), + ), + ], + ).paddingSymmetrical(16.h, 0.h), + SizedBox(height: 16.h), + Wrap( + direction: Axis.horizontal, + spacing: 6.h, + runSpacing: 6.h, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + CustomButton( + text: "${LocaleKeys.route.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].route}", + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 30.h, + ).toShimmer2(isShow: isLoading), + ], + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + CustomButton( + text: "${LocaleKeys.frequency.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].frequency}", + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 30.h, + ).toShimmer2(isShow: isLoading), + ], + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + CustomButton( + text: "${LocaleKeys.dailyDoses.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].doseDailyQuantity}", + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 30.h, + ).toShimmer2(isShow: isLoading), + ], + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + CustomButton( + text: "${LocaleKeys.days.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].days}", + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 30.h, + ).toShimmer2(isShow: isLoading), + ], + ), + ], + ).paddingSymmetrical(16.h, 0.h), + SizedBox(height: 8.h), + if (!isLoading) + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.prescription_remarks_icon, width: 18.h, height: 18.h), + SizedBox(width: 9.h), + Expanded(child: "${LocaleKeys.remarks.tr(context: context)}: ${isLoading ? "" : prescriptionVM.prescriptionDetailsList[index].remarks!}".toText10(isBold: true)), + ], + ).paddingSymmetrical(16.h, 0.h), + SizedBox(height: 14.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), + SizedBox(height: 14.h), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h).toShimmer2(isShow: isLoading), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.setReminder.tr(context: context).toText13(isBold: true), + "Notify me before the consumption time".toText10(color: AppColors.textColorLight), + ], + ).toShimmer2(isShow: isLoading).expanded, + Switch( + activeColor: AppColors.successColor, + activeTrackColor: AppColors.successColor.withValues(alpha: .15), + value: isLoading ? false : prescriptionVM.prescriptionDetailsList[index].hasReminder!, + onChanged: (newValue) async { + if (prescriptionVM.prescriptionDetailsList[index].hasReminder ?? false) { + await checkAndRemove(prescriptionVM.prescriptionDetailsList[index].hasReminder, delete: true); + prescriptionVM.notify(); + return; + } + + DateTime startDate = DateTime.now(); + DateTime endDate = DateTime(startDate.year, startDate.month, startDate.day + prescriptionVM.prescriptionDetailsList[index].days!.toInt()); + showReminderBottomSheet( + context, + endDate, + "", + prescriptionVM.prescriptionDetailsList[index].itemID.toString(), + "", + "", + title: "${prescriptionVM.prescriptionDetailsList[index].itemDescription} Prescription Reminder", + description: + "${prescriptionVM.prescriptionDetailsList[index].itemDescription} ${prescriptionVM.prescriptionDetailsList[index].frequency} ${prescriptionVM.prescriptionDetailsList[index].route} ", + onSuccess: () { + prescriptionVM.setPrescriptionItemReminder(newValue, prescriptionVM.prescriptionDetailsList[index]); + }, + isMultiAllowed: true, + onMultiDateSuccess: (int selectedIndex) { + setCalender(context, + eventId: prescriptionVM.prescriptionDetailsList[index].itemID.toString(), + selectedMinutes: selectedIndex, + frequencyNumber: prescriptionVM.prescriptionDetailsList[index].frequencyNumber?.toInt(), + days: prescriptionVM.prescriptionDetailsList[index].days!.toInt(), + orderDate: prescriptionVM.prescriptionDetailsList[index].orderDate!, + itemDescriptionN: prescriptionVM.prescriptionDetailsList[index].itemDescription!, + route: prescriptionVM.prescriptionDetailsList[index].route!); + }, + ); + }, + ).toShimmer2(isShow: isLoading), + ], + ).paddingSymmetrical(16.h, 0.h), + SizedBox(height: 14.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), + Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.checkAvailability.tr(context: context), + onPressed: () {}, + backgroundColor: AppColors.primaryRedColor.withOpacity(0.1), + borderColor: AppColors.primaryRedColor.withOpacity(0.0), + textColor: AppColors.primaryRedColor, + fontSize: 13, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ).toShimmer2(isShow: isLoading), + ), + // SizedBox(width: 16.h), + ], + ).paddingSymmetrical(16.h, 16.h), + ], + ), + ); + } +} diff --git a/lib/presentation/prescriptions/prescription_reminder_view.dart b/lib/presentation/prescriptions/prescription_reminder_view.dart new file mode 100644 index 0000000..8b7df0b --- /dev/null +++ b/lib/presentation/prescriptions/prescription_reminder_view.dart @@ -0,0 +1,116 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +class PrescriptionReminderView extends StatefulWidget { + Function(int) setReminder; + + PrescriptionReminderView({Key? key, required this.setReminder}) : super(key: key); + + @override + _PrescriptionReminderViewState createState() { + return _PrescriptionReminderViewState(); + } +} + +class _PrescriptionReminderViewState extends State { + final List _options = [15, 30, 60, 90]; + int _selectedOption = 0; // Nullable to represent no selection initially + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + spacing: 16.h, + children: [ + Container( + width: double.infinity, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24), + child: ListView.builder( + itemCount: _options.length, + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.only(top: 8, bottom: 8), + shrinkWrap: true, + itemBuilder: (context, index) { + return Theme( + data: Theme.of(context).copyWith( + listTileTheme: ListTileThemeData(horizontalTitleGap: 4), + ), + child: RadioListTile( + title: Text( + "${_options[index]} minutes before".needTranslation, + style: TextStyle( + fontSize: 16.h, + fontWeight: FontWeight.w500, + ), + ), + value: index, + fillColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.selected)) { + return AppColors.primaryRedColor; + } + return Color(0xffEEEEEE); + }), + contentPadding: EdgeInsets.only(left: 12.h, right: 12.h), + groupValue: _selectedOption, + onChanged: (int? newValue) { + setState(() { + _selectedOption = newValue!; + }); + }, + ), + ); + }, + ), + ), + Row( + spacing: 16.h, + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: () { + Navigator.of(context).pop(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + icon: AppAssets.cancel, + iconColor: AppColors.primaryRedColor, + ), + ), + Expanded( + child: CustomButton( + text: LocaleKeys.setReminder.tr(), + onPressed: () { + Navigator.of(context).pop(); + widget.setReminder(_selectedOption); + }, + backgroundColor: AppColors.bgGreenColor, + borderColor: AppColors.bgGreenColor, + textColor: Colors.white, + icon: AppAssets.reminder_bell, + ), + ), + ], + ), + ], + ); + } +} diff --git a/lib/presentation/prescriptions/prescriptions_list_page.dart b/lib/presentation/prescriptions/prescriptions_list_page.dart new file mode 100644 index 0000000..1293c9c --- /dev/null +++ b/lib/presentation/prescriptions/prescriptions_list_page.dart @@ -0,0 +1,316 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_detail_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:provider/provider.dart'; + +class PrescriptionsListPage extends StatefulWidget { + const PrescriptionsListPage({super.key}); + + @override + State createState() => _PrescriptionsListPageState(); +} + +class _PrescriptionsListPageState extends State { + int? expandedIndex; + + late PrescriptionsViewModel prescriptionsViewModel; + + @override + void initState() { + scheduleMicrotask(() { + prescriptionsViewModel.initPrescriptionsViewModel(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + prescriptionsViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: LocaleKeys.prescriptions.tr(context: context), + child: SingleChildScrollView( + child: Consumer(builder: (context, model, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + // Clinic & Hospital Sort + Row( + children: [ + CustomButton( + text: LocaleKeys.byClinic.tr(context: context), + onPressed: () { + model.setIsSortByClinic(true); + }, + backgroundColor: model.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, + borderColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), + textColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, + fontSize: 12, + fontWeight: FontWeight.w500, + borderRadius: 10, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + SizedBox(width: 8.h), + CustomButton( + text: LocaleKeys.byHospital.tr(context: context), + onPressed: () { + model.setIsSortByClinic(false); + }, + backgroundColor: model.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, + borderColor: model.isSortByClinic ? AppColors.textColor.withOpacity(0.2) : AppColors.primaryRedColor, + textColor: model.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, + fontSize: 12, + fontWeight: FontWeight.w500, + borderRadius: 10, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + ], + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 20.h), + // Expandable list + ListView.builder( + itemCount: model.isPrescriptionsOrdersLoading + ? 4 + : model.patientPrescriptionOrders.isNotEmpty + ? model.patientPrescriptionOrdersViewList.length + : 1, + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: const EdgeInsets.only(left: 0, right: 8), + itemBuilder: (context, index) { + final isExpanded = expandedIndex == index; + return model.isPrescriptionsOrdersLoading + ? LabResultItemView( + onTap: () {}, + labOrder: null, + index: index, + isLoading: true, + ) + : model.patientPrescriptionOrders.isNotEmpty + ? AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + margin: EdgeInsets.symmetric(vertical: 8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), + child: InkWell( + onTap: () { + setState(() { + expandedIndex = isExpanded ? null : index; + }); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomButton( + text: "${model.patientPrescriptionOrdersViewList[index].prescriptionsList!.length} Prescriptions Available", + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 30.h, + ), + Icon(isExpanded ? Icons.expand_less : Icons.expand_more), + ], + ), + SizedBox(height: 8.h), + model.patientPrescriptionOrdersViewList[index].filterName!.toText16(isBold: true) + ], + ), + ), + AnimatedSwitcher( + duration: Duration(milliseconds: 500), + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + transitionBuilder: (Widget child, Animation animation) { + return FadeTransition( + opacity: animation, + child: SizeTransition( + sizeFactor: animation, + axisAlignment: 0.0, + child: child, + ), + ); + }, + child: isExpanded + ? Container( + key: ValueKey(index), + padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...model.patientPrescriptionOrdersViewList[index].prescriptionsList!.map((prescription) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Image.network( + prescription.doctorImageURL!, + width: 24.h, + height: 24.h, + fit: BoxFit.fill, + ).circle(100), + SizedBox(width: 8.h), + Expanded(child: prescription.doctorName!.toText14(weight: FontWeight.w500)), + ], + ), + SizedBox(height: 8.h), + Row( + children: [ + CustomButton( + text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(prescription.appointmentDate), false), + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 24.h, + ), + SizedBox(width: 8.h), + CustomButton( + text: model.isSortByClinic ? prescription.name! : prescription.clinicDescription!, + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 24.h, + ), + ], + ), + SizedBox(height: 8.h), + Row( + children: [ + Expanded( + flex: 6, + child: CustomButton( + text: prescription.isHomeMedicineDeliverySupported! + ? LocaleKeys.resendOrder.tr(context: context) + : LocaleKeys.prescriptionDeliveryError.tr(context: context), + onPressed: () {}, + backgroundColor: prescription.isHomeMedicineDeliverySupported! ? AppColors.successColor.withOpacity(0.15) : AppColors.greyF7Color, + borderColor: AppColors.successColor.withOpacity(0.01), + textColor: prescription.isHomeMedicineDeliverySupported! ? AppColors.successColor : AppColors.textColor.withOpacity(0.35), + fontSize: prescription.isHomeMedicineDeliverySupported! ? 14 : 12, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + icon: AppAssets.prescription_refill_icon, + iconColor: prescription.isHomeMedicineDeliverySupported! ? AppColors.successColor : AppColors.textColor.withOpacity(0.35), + iconSize: 14.h, + ), + ), + SizedBox(width: 8.h), + Expanded( + flex: 1, + child: Container( + height: 40.h, + width: 40.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.textColor, + borderRadius: 10.h, + ), + child: Padding( + padding: EdgeInsets.all(8.h), + child: Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.whiteColor, + width: 10.h, + height: 10.h, + fit: BoxFit.contain, + ), + ), + ), + ).onPress(() { + model.setPrescriptionsDetailsLoading(); + Navigator.of(context).push( + CustomPageRoute( + page: PrescriptionDetailPage(prescriptionsResponseModel: prescription), + ), + ); + }), + ), + ], + ), + SizedBox(height: 12.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), + SizedBox(height: 12.h), + ], + ); + }).toList(), + ], + ), + ) + : SizedBox.shrink(), + ), + ], + ), + ), + ), + ), + ), + ) + : Utils.getNoDataWidget(context, noDataText: "You don't have any prescriptions yet.".needTranslation); + }, + ).paddingSymmetrical(24.h, 0.h), + ], + ); + }), + ), + ), + ); + } +} diff --git a/lib/presentation/profile_settings/profile_settings.dart b/lib/presentation/profile_settings/profile_settings.dart new file mode 100644 index 0000000..ee7465d --- /dev/null +++ b/lib/presentation/profile_settings/profile_settings.dart @@ -0,0 +1,470 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_swiper_view/flutter_swiper_view.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; +import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/habib_wallet/habib_wallet_page.dart'; +import 'package:hmg_patient_app_new/presentation/habib_wallet/recharge_wallet_page.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/app_language_change.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +import '../../core/dependencies.dart' show getIt; + +class ProfileSettings extends StatefulWidget { + ProfileSettings({Key? key}) : super(key: key); + + @override + _ProfileSettingsState createState() { + return _ProfileSettingsState(); + } +} + +class _ProfileSettingsState extends State { + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + double dynamicItemHeight(BuildContext context) { + final double w = SizeUtils.width; + final double h = SizeUtils.height; + + double longer = w > h ? w : h; + double shorter = w < h ? w : h; + + final double aspect = longer / (shorter == 0 ? 1 : shorter); + + // Choose multiplier based on aspect ratio (handles near-square / foldable) + double multiplier; + if (aspect < 1.05) { + multiplier = 0.28; // nearly square / foldable -> smaller card height + } else if (aspect > 1.8) { + multiplier = 0.40; // very tall/wide -> larger height + } else { + multiplier = 0.34; // normal phones/tablets + } + + // Compute and clamp using sensible bounds (uses .h extension) + final double minH = 210.h; + final double maxH = 380.h; + final double computed = (shorter * multiplier); + + return computed.clamp(minH, maxH); + } + + int length = 3; + final SwiperController _controller = SwiperController(); + + @override + Widget build(BuildContext context) { + return CollapsingListView( + title: "Profile & Settings".needTranslation, + logout: () {}, + isClose: true, + child: SingleChildScrollView( + padding: EdgeInsets.only(top: 24.h, bottom: 24.h), + physics: NeverScrollableScrollPhysics(), + child: Consumer2( + builder: (context, profileVm, medicalVm, child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Swiper( + itemCount: medicalVm.patientFamilyFiles.length, + layout: SwiperLayout.STACK, + loop: true, + itemHeight: dynamicItemHeight(context), + itemWidth: SizeUtils.width - 30.w, + indicatorLayout: PageIndicatorLayout.COLOR, + axisDirection: AxisDirection.right, + controller: _controller, + pagination: SwiperPagination( + alignment: Alignment.bottomCenter, + margin: EdgeInsets.only(top: (210.h + 8.h + 24.h)), + builder: DotSwiperPaginationBuilder(color: Color(0xffD9D9D9), activeColor: AppColors.blackBgColor), + ), + itemBuilder: (BuildContext context, int index) { + return FamilyCardWidget( + profile: medicalVm.patientFamilyFiles[index], + onAddFamilyMemberPress: () { + DialogService dialogService = getIt.get(); + dialogService.showAddFamilyFileSheet( + label: "Add Family Member".needTranslation, + message: "Please fill the below field to add a new family member to your profile".needTranslation, + onVerificationPress: () { + medicalVm.addFamilyFile(otpTypeEnum: OTPTypeEnum.sms); + }); + }, + onFamilySwitchPress: (FamilyFileResponseModelLists profile) { + medicalVm.switchFamilyFiles(responseID: profile.responseId, patientID: profile.patientId, phoneNumber: profile.mobileNumber); + }, + ).paddingOnly(right: 16.w, left: 8.w); + }, + ), + SizedBox(height: 5.h), + GridView( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: isTablet ? 3 : 2), + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.only(left: 24.w, right: 24.w, bottom: 24.h), + shrinkWrap: true, + children: [ + Container( + padding: EdgeInsets.all(16.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: true, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + // spacing: 4.h, + children: [ + Row( + spacing: 8.w, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 40.w, height: 40.h), + "Habib Wallet".needTranslation.toText16(weight: FontWeight.w600, maxlines: 2).expanded, + Utils.buildSvgWithAssets(icon: AppAssets.arrow_forward), + ], + ), + Spacer(), + Consumer(builder: (context, habibWalletVM, child) { + return Utils.getPaymentAmountWithSymbol2(habibWalletVM.habibWalletAmount, isExpanded: false) + .toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.r, width: 80.w, height: 24.h); + }), + Spacer(), + CustomButton( + height: 40.h, + icon: AppAssets.recharge_icon, + iconSize: 22.w, + iconColor: AppColors.infoColor, + textColor: AppColors.infoColor, + text: "Recharge".needTranslation, + borderWidth: 0.w, + fontWeight: FontWeight.w500, + borderColor: Colors.transparent, + backgroundColor: Color(0xff45A2F8).withValues(alpha: 0.08), + padding: EdgeInsets.all(8.w), + fontSize: 14.f, + onPressed: () { + Navigator.of(context).push(CustomPageRoute(page: RechargeWalletPage())); + }, + ), + ], + ).onPress(() { + Navigator.of(context).push(CustomPageRoute(page: HabibWalletPage())); + }), + ), + ], + ), + "Quick Actions".needTranslation.toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24.w, right: 24.w), + Container( + margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h, bottom: 24.h), + padding: EdgeInsets.only(top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + actionItem(AppAssets.language_change, "Language".needTranslation, () { + showCommonBottomSheetWithoutHeight(context, title: "Application Language".needTranslation, child: AppLanguageChange(), callBackFunc: () {}, isFullScreen: false); + }, trailingLabel: Utils.appState.isArabic() ? "العربية".needTranslation : "English".needTranslation), + 1.divider, + actionItem(AppAssets.accessibility, "Accessibility".needTranslation, () {}), + 1.divider, + actionItem(AppAssets.bell, "Notifications Settings".needTranslation, () {}), + 1.divider, + actionItem(AppAssets.touch_face_id, "Touch ID / Face ID Services".needTranslation, () {}, switchValue: true), + ], + ), + ), + "Personal Information".needTranslation.toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24.w, right: 24.w), + Container( + margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h, bottom: 24.h), + padding: EdgeInsets.only(top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + actionItem(AppAssets.email_transparent, "Update Email Address".needTranslation, () {}), + 1.divider, + actionItem(AppAssets.smart_phone_fill, "Phone Number".needTranslation, () {}), + 1.divider, + actionItem(AppAssets.my_address, "My Addresses".needTranslation, () {}), + 1.divider, + actionItem(AppAssets.emergency, "Emergency Contact".needTranslation, () {}), + ], + ), + ), + "Help & Support".needTranslation.toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24.w, right: 24.w), + Container( + margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h), + padding: EdgeInsets.only(top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + actionItem(AppAssets.call_fill, "Contact Us".needTranslation, () {}, trailingLabel: "9200666666"), + 1.divider, + actionItem(AppAssets.permission, "Permissions".needTranslation, () {}, trailingLabel: "Location, Camera"), + 1.divider, + actionItem(AppAssets.rate, "Rate Our App".needTranslation, () {}, isExternalLink: true), + 1.divider, + actionItem(AppAssets.privacy_terms, "Privacy Policy".needTranslation, () {}, isExternalLink: true), + 1.divider, + actionItem(AppAssets.privacy_terms, "Terms & Conditions".needTranslation, () {}, isExternalLink: true), + ], + ), + ), + CustomButton( + height: 56.h, + icon: AppAssets.minus, + text: "Deactivate account".needTranslation, + onPressed: () {}, + ).paddingAll(24.w), + ], + ); + }, + ), + ), + ); + } + + Widget actionItem(String icon, String label, VoidCallback onPress, {String trailingLabel = "", bool? switchValue, bool isExternalLink = false}) { + return SizedBox( + height: 56.h, + child: Row( + spacing: 8.w, + children: [ + Utils.buildSvgWithAssets(icon: icon, iconColor: AppColors.greyTextColor), + label.toText14(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + if (trailingLabel.isNotEmpty) trailingLabel.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1), + switchValue != null + ? Switch( + value: switchValue, + onChanged: (value) {}, + activeColor: AppColors.successColor, + activeTrackColor: AppColors.successColor.withValues(alpha: .15), + ) + : Transform.scale( + scaleX: Utils.appState.isArabic() ? -1 : 1, + child: Utils.buildSvgWithAssets(icon: isExternalLink ? AppAssets.externalLink : AppAssets.arrow_forward), + ) + ], + ).paddingOnly(left: 16.w, right: 16.w).onPress(onPress), + ); + } +} + +class FamilyCardWidget extends StatelessWidget { + final Function() onAddFamilyMemberPress; + final Function(FamilyFileResponseModelLists member) onFamilySwitchPress; + final FamilyFileResponseModelLists profile; + + const FamilyCardWidget({ + super.key, + required this.onAddFamilyMemberPress, + required this.profile, + required this.onFamilySwitchPress(FamilyFileResponseModelLists member), + }); + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + final isActive = (profile.responseId == appState.getAuthenticatedUser()?.patientId); + final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false; + final canSwitch = isParentUser || (!isParentUser && profile.responseId == appState.getSuperUserID); + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8.h, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(profile.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, width: 56.w, height: 56.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + "${profile.patientName}".toText18(isBold: true, weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1), + AppCustomChipWidget( + icon: AppAssets.file_icon, + labelText: "${LocaleKeys.fileNo.tr(context: context)}: ${profile.responseId}", + iconSize: 12.w, + ), + ], + ).expanded, + Icon(Icons.qr_code, size: 56.h) + ], + ), + SizedBox(height: 4.h), + SizedBox( + child: Wrap( + alignment: WrapAlignment.start, + spacing: 4.w, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + labelText: "${profile.age} Years Old".needTranslation, + ), + isActive && appState.getAuthenticatedUser()!.bloodGroup != null + ? AppCustomChipWidget( + icon: AppAssets.blood_icon, + labelPadding: EdgeInsetsDirectional.only(start: -6.w, end: 8.w), + labelText: "Blood: ${appState.getAuthenticatedUser()!.bloodGroup ?? ""}", + iconColor: AppColors.primaryRedColor) + : SizedBox(), + Selector( + selector: (context, insuranceVM) => ( + isEmpty: insuranceVM.patientInsuranceList.isEmpty, + patientID: insuranceVM.patientInsuranceList.isNotEmpty ? insuranceVM.patientInsuranceList.first.patientID : null, + isLoading: insuranceVM.isInsuranceLoading, + cardValidTo: insuranceVM.patientInsuranceList.isNotEmpty ? insuranceVM.patientInsuranceList.first.cardValidTo : null + ), + builder: (context, data, child) { + if (data.isEmpty) { + return const SizedBox(); + } else if (profile.responseId != data.patientID) { + return SizedBox(); + } + + final isLoading = data.isLoading; + final isExpired = !isLoading && DateTime.now().isAfter(DateUtil.convertStringToDate(data.cardValidTo)); + + final String icon; + final String labelText; + final Color iconColor; + final Color backgroundColor; + + if (isLoading) { + icon = AppAssets.cancel_circle_icon; + labelText = "Insurance".needTranslation; + iconColor = AppColors.primaryRedColor; + backgroundColor = AppColors.primaryRedColor; + } else if (isExpired) { + icon = AppAssets.cancel_circle_icon; + labelText = "Insurance Expired".needTranslation; + iconColor = AppColors.primaryRedColor; + backgroundColor = AppColors.primaryRedColor.withValues(alpha: 0.15); + } else { + icon = AppAssets.insurance_active_icon; + labelText = "Insurance Active".needTranslation; + iconColor = AppColors.successColor; + backgroundColor = AppColors.successColor.withValues(alpha: 0.15); + } + + return AppCustomChipWidget( + icon: icon, + labelText: labelText, + iconColor: iconColor, + iconSize: 12.w, + backgroundColor: backgroundColor, + labelPadding: EdgeInsetsDirectional.only(start: -6.w, end: 8.w), + // padding: EdgeInsets.zero, + ).toShimmer2(isShow: isLoading); + }, + ) + ], + ), + ), + ], + ).paddingOnly(top: 16.h, right: 16.w, left: 16.w, bottom: 12.h), + 1.divider, + _buildActionButton(appState), + ], + ), + ); + } + + Widget _buildActionButton(AppState appState) { + final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false; + final int? currentUserId = appState.getAuthenticatedUser()?.patientId; + final int? superUserId = appState.getSuperUserID; + + if (isParentUser) { + return _buildParentUserButton(currentUserId); + } else { + return _buildNonParentUserButton(superUserId); + } + } + + Widget _buildParentUserButton(int? currentUserId) { + final canSwitch = profile.responseId != currentUserId; + + return CustomButton( + icon: canSwitch ? AppAssets.switch_user : AppAssets.add_family, + text: canSwitch ? "Switch Family File".needTranslation : "Add a new family member".needTranslation, + onPressed: canSwitch ? () => onFamilySwitchPress(profile) : onAddFamilyMemberPress, + backgroundColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor, + borderColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor, + textColor: canSwitch ? AppColors.primaryRedColor : AppColors.whiteColor, + iconColor: canSwitch ? AppColors.primaryRedColor : AppColors.whiteColor, + height: isFoldable ? 50.h : 40.h, + fontSize: 14.f, + ).paddingOnly(top: 12.h, right: 16.w, left: 16.w, bottom: 16.h); + } + + Widget _buildNonParentUserButton(int? superUserId) { + final canSwitchBack = superUserId != null && superUserId == profile.responseId; + + return CustomButton( + icon: AppAssets.switch_user, + text: canSwitchBack ? "Switch Back To Family File".needTranslation : "Switch".needTranslation, + backgroundColor: canSwitchBack ? AppColors.primaryRedColor : Colors.grey.shade200, + borderColor: canSwitchBack ? AppColors.primaryRedColor : Colors.grey.shade200, + textColor: canSwitchBack ? AppColors.whiteColor : AppColors.greyTextColor, + iconColor: canSwitchBack ? AppColors.whiteColor : AppColors.greyTextColor, + onPressed: canSwitchBack ? () => onFamilySwitchPress(profile) : () {}, + height: isFoldable ? 50.h : 40.h, + fontSize: 14.f, + ).paddingOnly(top: 12.h, right: 16.w, left: 16.w, bottom: 16.h); + } + +// //TODO: Add family file switch logic here +// isRootUser +// ? CustomButton(icon: AppAssets.add_family, text: "Add a new family member".needTranslation, height: 40.h, fontSize: 14, onPressed: () {}) +// .paddingOnly(top: 12, right: 16, left: 16, bottom: 16) +// : CustomButton( +// icon: AppAssets.add_family, +// backgroundColor: AppColors.secondaryLightRedColor, +// borderColor: AppColors.secondaryLightRedColor, +// textColor: AppColors.primaryRedColor, +// iconColor: AppColors.primaryRedColor, +// text: "Switch to this medical file".needTranslation, +// height: 40.h, +// fontSize: 14, +// onPressed: () {}) +// .paddingOnly(top: 12, right: 16, left: 16, bottom: 16), +// +} diff --git a/lib/presentation/radiology/radiology_orders_page.dart b/lib/presentation/radiology/radiology_orders_page.dart new file mode 100644 index 0000000..6662a8e --- /dev/null +++ b/lib/presentation/radiology/radiology_orders_page.dart @@ -0,0 +1,243 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/presentation/radiology/radiology_result_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart'; +import 'package:provider/provider.dart'; + +import '../../features/radiology/radiology_view_model.dart'; + +class RadiologyOrdersPage extends StatefulWidget { + const RadiologyOrdersPage({super.key}); + + @override + State createState() => _RadiologyOrdersPageState(); +} + +class _RadiologyOrdersPageState extends State { + late RadiologyViewModel radiologyViewModel; + + int? expandedIndex; + + @override + void initState() { + scheduleMicrotask(() { + radiologyViewModel.initRadiologyProvider(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + radiologyViewModel = Provider.of(context); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: LocaleKeys.radiology.tr(context: context), + child: SingleChildScrollView( + child: Consumer( + builder: (context, model, child) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Expandable list + ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: model.isRadiologyOrdersLoading + ? 5 + : model.patientRadiologyOrders.isNotEmpty + ? model.patientRadiologyOrders.length + : 1, + itemBuilder: (context, index) { + final isExpanded = expandedIndex == index; + return model.isRadiologyOrdersLoading + ? LabResultItemView( + onTap: () {}, + labOrder: null, + index: index, + isLoading: true, + ) + : model.patientRadiologyOrders.isNotEmpty + ? AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + margin: EdgeInsets.symmetric(vertical: 8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), + child: InkWell( + onTap: () { + setState(() { + expandedIndex = isExpanded ? null : index; + }); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppCustomChipWidget( + labelText: LocaleKeys.resultsAvailable.tr(context: context), + backgroundColor: AppColors.successColor.withOpacity(0.15), + textColor: AppColors.successColor, + ).toShimmer2(isShow: model.isRadiologyOrdersLoading, width: 100), + SizedBox(height: 8.h), + Row( + children: [ + Image.network( + model.isRadiologyOrdersLoading + ? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png" + : model.patientRadiologyOrders[index].doctorImageURL!, + width: 24.h, + height: 24.h, + fit: BoxFit.fill, + ).circle(100).toShimmer2(isShow: model.isRadiologyOrdersLoading), + SizedBox(width: 4.h), + (model.isRadiologyOrdersLoading ? "Dr John Smith" : model.patientRadiologyOrders[index].doctorName!) + .toText16(isBold: true) + .toShimmer2(isShow: model.isRadiologyOrdersLoading) + ], + ), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 3.h, + runSpacing: 4.h, + children: [ + AppCustomChipWidget( + icon: AppAssets.doctor_calendar_icon, + labelText: model.isRadiologyOrdersLoading ? "01 Jan 2025" : DateUtil.formatDateToDate(model.patientRadiologyOrders[index].orderDate!, false), + ).toShimmer2(isShow: model.isRadiologyOrdersLoading), + AppCustomChipWidget( + labelText: model.isRadiologyOrdersLoading ? "01 Jan 2025" : model.patientRadiologyOrders[index].clinicDescription!, + ).toShimmer2(isShow: model.isRadiologyOrdersLoading), + + // AppCustomChipWidget(labelText: "").toShimmer2(isShow: model.isRadiologyOrdersLoading, width: 16.h), + // AppCustomChipWidget(labelText: "").toShimmer2(isShow: model.isRadiologyOrdersLoading, width: 16.h), + ], + ), + ], + ), + ), + model.isRadiologyOrdersLoading + ? SizedBox.shrink() + : AnimatedCrossFade( + firstChild: SizedBox.shrink(), + secondChild: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 8.h), + child: '● ${model.patientRadiologyOrders[index].description}'.toText14(weight: FontWeight.w500), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox(), + CustomButton( + icon: AppAssets.view_report_icon, + iconColor: AppColors.primaryRedColor, + iconSize: 16.h, + text: LocaleKeys.viewReport.tr(context: context), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: RadiologyResultPage(patientRadiologyResponseModel: model.patientRadiologyOrders[index]), + ), + ); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + fontSize: 14, + fontWeight: FontWeight.bold, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + ], + ), + ], + ), + ), + crossFadeState: isExpanded ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + ], + ), + ), + ), + ), + ), + ) + : Utils.getNoDataWidget(context, noDataText: "You don't have any radiology results yet.".needTranslation); + }, + ), + ], + ), + ); + }, + ), + ), + ), + ); + } + + Color getLabOrderStatusColor(num status) { + switch (status) { + case 44: + return AppColors.warningColorYellow; + case 45: + return AppColors.warningColorYellow; + case 16: + return AppColors.successColor; + case 17: + return AppColors.successColor; + default: + return AppColors.greyColor; + } + } + + String getLabOrderStatusText(num status) { + switch (status) { + case 44: + return LocaleKeys.resultsPending.tr(context: context); + case 45: + return LocaleKeys.resultsPending.tr(context: context); + case 16: + return LocaleKeys.resultsAvailable.tr(context: context); + case 17: + return LocaleKeys.resultsAvailable.tr(context: context); + default: + return ""; + } + } +} diff --git a/lib/presentation/radiology/radiology_result_page.dart b/lib/presentation/radiology/radiology_result_page.dart new file mode 100644 index 0000000..df34164 --- /dev/null +++ b/lib/presentation/radiology/radiology_result_page.dart @@ -0,0 +1,162 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/radiology/models/resp_models/patient_radiology_response_model.dart'; +import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:open_filex/open_filex.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class RadiologyResultPage extends StatefulWidget { + RadiologyResultPage({super.key, required this.patientRadiologyResponseModel}); + + PatientRadiologyResponseModel patientRadiologyResponseModel; + + @override + State createState() => _RadiologyResultPageState(); +} + +class _RadiologyResultPageState extends State { + late RadiologyViewModel radiologyViewModel; + + @override + void initState() { + scheduleMicrotask(() { + radiologyViewModel.getRadiologyImage(patientRadiologyResponseModel: widget.patientRadiologyResponseModel); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + radiologyViewModel = Provider.of(context); + AppState _appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Radiology Result".needTranslation, + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + // widget.patientRadiologyResponseModel.description!.toText16(isBold: true), + SizedBox(height: 8.h), + widget.patientRadiologyResponseModel.reportData!.trim().toText12(isBold: true, color: AppColors.textColorLight), + SizedBox(height: 16.h), + CustomButton( + text: "View Radiology Image".needTranslation, + onPressed: () async { + if (radiologyViewModel.radiologyImageURL.isNotEmpty) { + Uri uri = Uri.parse(radiologyViewModel.radiologyImageURL); + launchUrl(uri, mode: LaunchMode.platformDefault, webOnlyWindowName: ""); + } else { + Utils.showToast("Radiology image not available".needTranslation); + } + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + icon: AppAssets.download, + iconColor: AppColors.whiteColor, + iconSize: 20.h, + ), + SizedBox(height: 16.h), + ], + ).paddingSymmetrical(16.h, 0.h), + ), + SizedBox(height: 24.h), + ], + ), + ), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: CustomButton( + text: "Download report".needTranslation, + onPressed: () async { + LoaderBottomSheet.showLoader(); + await radiologyViewModel.getRadiologyPDF(patientRadiologyResponseModel: widget.patientRadiologyResponseModel, authenticatedUser: _appState.getAuthenticatedUser()!, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }).then((val) async { + LoaderBottomSheet.hideLoader(); + if (radiologyViewModel.patientRadiologyReportPDFBase64.isNotEmpty) { + String path = await Utils.createFileFromString(radiologyViewModel.patientRadiologyReportPDFBase64, "pdf"); + try { + OpenFilex.open(path); + } catch (ex) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Cannot open file".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } + }); + }, + backgroundColor: AppColors.successColor, + borderColor: AppColors.successColor, + textColor: AppColors.whiteColor, + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 45.h, + icon: AppAssets.download, + iconColor: AppColors.whiteColor, + iconSize: 20.h, + ).paddingSymmetrical(24.h, 24.h), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/services/services_page.dart b/lib/presentation/services/services_page.dart new file mode 100644 index 0000000..24a259b --- /dev/null +++ b/lib/presentation/services/services_page.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class ServicesPage extends StatelessWidget { + const ServicesPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + appBar: AppBar( + title: const Text('Appointments'), + backgroundColor: AppColors.bgScaffoldColor, + ), + body: const Center( + child: Text( + 'Appointments Page', + style: TextStyle(fontSize: 24), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/presentation/todo/todo_page.dart b/lib/presentation/todo/todo_page.dart new file mode 100644 index 0000000..20f8cd4 --- /dev/null +++ b/lib/presentation/todo/todo_page.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; + +class ToDoPage extends StatefulWidget { + const ToDoPage({super.key}); + + @override + State createState() => _ToDoPageState(); +} + +class _ToDoPageState extends State { + @override + Widget build(BuildContext context) { + return CollapsingListView( + title: "ToDo List".needTranslation, + isLeading: false, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + "Ancillary Orders".needTranslation.toText18(isBold: true), + + ], + ).paddingSymmetrical(24.w, 0), + ); + } +} \ No newline at end of file diff --git a/lib/providers/authentication_view_model.dart b/lib/providers/authentication_view_model.dart deleted file mode 100644 index af542ac..0000000 --- a/lib/providers/authentication_view_model.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:flutter/material.dart'; - -class AuthenticationViewModel extends ChangeNotifier { - // Add properties and methods related to authentication here -} \ No newline at end of file diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index ce31fb7..5a93216 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -1,8 +1,26 @@ import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/login.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/register.dart'; +import 'package:hmg_patient_app_new/presentation/authentication/register_step2.dart'; +import 'package:hmg_patient_app_new/presentation/home/landing_page.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; import 'package:hmg_patient_app_new/splashPage.dart'; class AppRoutes { static const String initialRoute = '/initialRoute'; + static const String loginScreen = '/loginScreen'; + static const String register = '/register'; + static const String registerStepTwo = '/registerStepTwo'; + static const String landingScreen = '/landingScreen'; + static const String medicalFilePage = '/medicalFilePage'; - static Map get routes => {initialRoute: (context) => SplashPage()}; + static Map get routes => { + initialRoute: (context) => SplashPage(), + loginScreen: (context) => LoginScreen(), + landingScreen: (context) => LandingNavigation(), + register: (context) => RegisterNew(), + registerStepTwo: (context) => RegisterNewStep2(), + medicalFilePage: (context) => MedicalFilePage(), + }; } diff --git a/lib/services/analytics/analytics_service.dart b/lib/services/analytics/analytics_service.dart new file mode 100644 index 0000000..3411157 --- /dev/null +++ b/lib/services/analytics/analytics_service.dart @@ -0,0 +1,143 @@ + +import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; +import 'package:hmg_patient_app_new/services/analytics/flows/advance_payments.dart'; +import 'package:hmg_patient_app_new/services/analytics/flows/app_nav.dart'; +import 'package:hmg_patient_app_new/services/analytics/flows/appointments.dart'; +import 'package:hmg_patient_app_new/services/analytics/flows/error_tracking.dart'; +import 'package:hmg_patient_app_new/services/analytics/flows/hamburger_menu.dart'; +import 'package:hmg_patient_app_new/services/analytics/flows/hmg_services.dart'; +import 'package:hmg_patient_app_new/services/analytics/flows/live_care.dart'; +import 'package:hmg_patient_app_new/services/analytics/flows/login_registration.dart'; +import 'package:hmg_patient_app_new/services/analytics/flows/offers_promotions.dart'; +import 'package:hmg_patient_app_new/services/analytics/flows/todo_list.dart'; +import 'package:http/http.dart' as AnalyticEvents; + + +typedef GALogger = Function(String name, {Map parameters}); + +var _analytics = FirebaseAnalytics.instance; + +_logger(String name, {Map? parameters}) async { + // return; + if (name.isNotEmpty) { + if (name.contains(' ')) name = name.replaceAll(' ', '_'); + + // To LowerCase + if (parameters != null && parameters.isNotEmpty) { + parameters = parameters.map((key, value) { + final key_ = key.toLowerCase(); + var value_ = value; + if (value is String) value_ = value.toLowerCase(); + return MapEntry(key_, value_); + }); + } + + try { + final safeParameters = parameters?.map((key, value) => MapEntry(key, value as Object)); + await _analytics.logEvent( + name: name.trim().toLowerCase(), + parameters: safeParameters, + ); + } catch (e) { + print('Error sending analytics event: $e'); + } + + } +} + +class GAnalytics { + static String? TREATMENT_TYPE; + static String? APPOINTMENT_DETAIL_FLOW_TYPE; + static String? PAYMENT_TYPE; + + setUser(AuthenticatedUser user) async { + try { + _analytics.setUserProperty(name: 'user_language', value: user.preferredLanguage == '1' ? 'arabic' : 'english'); + _analytics.setUserProperty(name: 'userid', value: Utils.generateMd5Hash(user.emailAddress!)); + _analytics.setUserProperty(name: 'login_status', value: user == null ? 'guest' : 'loggedin'); + // if (await PermissionService.isLocationEnabled()) { + // final location = await Geolocator.getCurrentPosition(); + // if (location != null && !location.isMocked) { + // final places = await placemarkFromCoordinates(location.latitude, location.longitude,); + // final countryCode = places.first.isoCountryCode; + // _analytics.setUserProperty(name: 'user_country', value: countryCode); + // } + // } else { + // _analytics.setUserProperty(name: 'user_country', value: "N/A"); + // } + } catch (e) {} + } + + // NavObserver navObserver() => NavObserver(); + final hamburgerMenu = HamburgerMenu(_logger); + final bottomTabNavigation = AppNav(_logger); + final hmgServices = HMGServices(_logger); + final loginRegistration = LoginRegistration(_logger); + final appointment = Appointment(_logger); + final liveCare = LiveCare(_logger); + final todoList = TodoList(_logger); + final advancePayments = AdvancePayments(_logger); + final offerPackages = OfferAndPromotion(_logger); + final errorTracking = ErrorTracking(_logger); +} + +// // adb shell setprop debug.firebase.analytics.app com.ejada.hmg -> Android +// class NavObserver extends RouteObserver> { +// _sendScreenView(PageRoute route) async { +// log(String className) { +// var event = AnalyticEvents.get(className); +// if (event.active != null) { +// _analytics.setCurrentScreen(screenName: event.flutterName(), screenClassOverride: className).catchError( +// (Object error) { +// print('$FirebaseAnalyticsObserver: $error'); +// }, +// test: (Object error) { +// return error is PlatformException; +// }, +// ); +// } +// } +// +// if (route.settings.name != null && route.settings.name!.isNotEmpty && route.settings.name != "null") { +// var class_ = routes[route.settings.name]!(0); +// if (class_ != null) log(class_.toStringShort()); +// } else if (route is FadePage) { +// var class_ = route.page; +// if (class_ != null) log(class_.toStringShort()); +// } else if (route is MaterialPageRoute) { +// var class_ = route.builder(route.subtreeContext!); +// log(class_.toStringShort()); +// } else { +// print(""); +// } +// } +// +// @override +// void didPush(Route route, Route? previousRoute) { +// super.didPush(route, previousRoute); +// if (route is PageRoute) { +// _sendScreenView(route); +// } +// } +// +// @override +// void didReplace({Route? newRoute, Route? oldRoute}) { +// super.didReplace(newRoute: newRoute, oldRoute: oldRoute); +// if (newRoute is PageRoute) { +// _sendScreenView(newRoute); +// } +// } +// +// @override +// void didPop(Route route, Route? previousRoute) { +// super.didPop(route, previousRoute); +// // if (previousRoute is PageRoute && route is PageRoute) { +// // _sendScreenView(previousRoute); +// // } +// } +// } diff --git a/lib/services/analytics/flows/advance_payments.dart b/lib/services/analytics/flows/advance_payments.dart new file mode 100644 index 0000000..9c8baa1 --- /dev/null +++ b/lib/services/analytics/flows/advance_payments.dart @@ -0,0 +1,91 @@ +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; + +class AdvancePayments{ + + final GALogger logger; + AdvancePayments(this.logger); + + // R038 + payment_services({required String service_type}){ + logger('payment_services', parameters: { + 'service_type' : service_type + }); + } + + // R039 + wallet_recharge({required String service_type}){ + logger('wallet_recharge', parameters: { + 'service_type' : service_type + }); + } + + // R040 + wallet_payment_details(){ + logger('wallet_payment_details'); + } + + // R041 + payment_method({required String method,type}){ + logger('payment_method', parameters: { + 'payment_method' : method, + 'payment_type' : type + }); + } + + // R042 + payment_confirm({required String method,type}){ + logger('payment_confirm', parameters: { + 'payment_method' : method, + 'payment_type' : type + }); + } + + // R043 + payment_otp_confirmation({required String method,type}){ + logger('payment_otp_confirmation', parameters: { + 'payment_method' : method, + 'payment_type' : type + }); + } + + // R044 + payment_confirm_card_details({required String method,type}){ + logger('payment_confirm_card_details', parameters: { + 'payment_method' : method, + 'payment_type' : type + }); + } + + // R045 + payment_pay({required String method,type}){ + logger('payment_pay', parameters: { + 'payment_method' : method, + 'payment_type' : type + }); + } + + // R046 + payment_success({required String hospital, payment_method, payment_type, txn_number, txn_amount, txn_currency}){ + logger('payment_success', parameters: { + 'payment_method' : payment_method, + 'payment_type' : payment_type, + 'hospital_name' : hospital, + 'transaction_number' : txn_number, + 'transaction_amount' : txn_amount, + 'transaction_currency' : txn_currency + }); + } + + payment_fail({required String hospital, payment_method, payment_type, txn_amount, txn_currency, error_type}){ + logger('payment_fail', parameters: { + 'payment_method' : payment_method, + 'payment_type' : payment_type, + 'hospital_name' : hospital, + 'transaction_amount' : txn_amount, + 'transaction_currency' : txn_currency, + 'error_type' : error_type + }); + } + +} \ No newline at end of file diff --git a/lib/services/analytics/flows/app_nav.dart b/lib/services/analytics/flows/app_nav.dart new file mode 100644 index 0000000..bd9186c --- /dev/null +++ b/lib/services/analytics/flows/app_nav.dart @@ -0,0 +1,30 @@ +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; + +class AppNav{ + final name = 'app_nav'; + final GALogger logger; + AppNav(this.logger); + + logNavName(String value){ + logger(name, parameters: { + 'nav_name' : value + }); + } + + log({int? tabIndex, bool? isLoggedIn}){ + var nav_name = ""; + if(tabIndex == 1) + nav_name = "medical file"; + if(tabIndex == 3) + nav_name = "my family"; + if(tabIndex == 4) + nav_name = "todo list"; + if(tabIndex == 5) + nav_name = "help"; + + if(nav_name.isNotEmpty) + logger(name, parameters: { + 'nav_name' : nav_name + }); + } +} \ No newline at end of file diff --git a/lib/services/analytics/flows/appointments.dart b/lib/services/analytics/flows/appointments.dart new file mode 100644 index 0000000..57c45e6 --- /dev/null +++ b/lib/services/analytics/flows/appointments.dart @@ -0,0 +1,268 @@ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; +import 'package:intl/intl.dart'; + +class Appointment { + final GALogger logger; + + Appointment(this.logger); + + // R015 + book_appointment() { + logger('book_appointment'); + } + + // R016.1, R017.2 + book_appointment_by_clinic() { + logger('book_appointment_by_clinic'); + } + + // R016.2, R018.2 + book_appointment_by_doctor() { + logger('book_appointment_by_doctor'); + } + +// // R017.1 +// book_appointment_doctor_search({required String query}) { +// // doctor_search_query : value +// logger('book_appointment_doctor_search', parameters: {'doctor_search_query': query}); +// } +// +// // R018.1 +// book_appointment_select_clinic({required String appointment_type, clinic}) { +// // appointment_type: regular | livecare +// // clinic_type : $clinic_type +// logger('book_appointment_select_clinic', parameters: {'appointment_type': appointment_type, 'clinic_type': clinic}); +// } +// +// // R019.1 +// book_appointment_livecare_accept() { +// logger('book_appointment_livecare_accept'); +// } +// +// // R019.2 +// book_appointment_livecare_decline() { +// logger('book_appointment_livecare_decline'); +// } +// +// // R020 +// book_appointment_chief_complaints({ +// required String appointment_type, +// ListClinicCentralized? clinic, +// HospitalsModel? hospital, +// ListDentalChiefComplain? treatment, +// }) { +// GAnalytics.TREATMENT_TYPE = treatment!.name; +// logger('book_appointment_chief_complaints', parameters: { +// 'appointment_type': appointment_type, +// 'clinic_type': clinic!.clinicDescription, +// 'hospital_name':hospital!=null ? hospital!.name :"", +// 'treatment_type': treatment.name, +// }); +// } +// +// // R021 +// book_appointment_select_doctor({required String appointment_type, required DoctorList doctor}) { +// // appointment_type, clinic_type, hospital_name, treatment_type, doctor_name, doctor_nationality, doctor_gender +// logger('book_appointment_select_doctor', parameters: { +// 'appointment_type': appointment_type, +// 'clinic_type': doctor.clinicName, +// 'hospital_name': doctor.projectName, +// 'treatment_type': GAnalytics.TREATMENT_TYPE ?? '', +// 'doctor_name': doctor.name, +// 'doctor_nationality': doctor.nationalityName, +// 'doctor_gender': doctor.genderDescription, +// }); +// } +// +// // R022 +// book_appointment_schedule({required String appointment_type, required DoctorList doctor}) { +// // appointment_type, clinic_type, hospital_name, treatment_type, doctor_name, doctor_nationality, doctor_gender +// logger('book_appointment_schedule', parameters: { +// 'appointment_type': appointment_type, +// 'clinic_type': doctor.clinicName, +// 'hospital_name': doctor.projectName, +// 'treatment_type': GAnalytics.TREATMENT_TYPE ?? '', +// 'doctor_name': doctor.name, +// 'doctor_nationality': doctor.nationalityName, +// 'doctor_gender': doctor.genderDescription, +// }); +// } +// +// // R023 +// book_appointment_date_selection({required String appointment_type, required day, required DoctorList doctor}) { +// logger('book_appointment_date_selection', parameters: { +// 'appointment_type': appointment_type, +// 'clinic_type': doctor.clinicName, +// 'hospital_name': doctor.projectName, +// 'treatment_type': GAnalytics.TREATMENT_TYPE ?? '', +// 'doctor_name': doctor.name, +// 'doctor_nationality': doctor.nationalityName, +// 'doctor_gender': doctor.genderDescription, +// 'appointment_day': day +// }); +// } +// +// // R024.1 +// book_appointment_time_selection({required String appointment_type, required DateTime? dateTime, required DoctorList doctor}) { +// final day = DateUtil.getWeekDay(dateTime!.weekday); +// final hour = DateFormat('HH').format(dateTime); +// logger('book_appointment_time_selection', parameters: { +// 'appointment_type': appointment_type, +// 'clinic_type': doctor.clinicName, +// 'hospital_name': doctor.projectName, +// 'treatment_type': GAnalytics.TREATMENT_TYPE ?? '', +// 'doctor_name': doctor.name, +// 'doctor_nationality': doctor.nationalityName, +// 'doctor_gender': doctor.genderDescription, +// 'appointment_day': day, +// 'appointment_hour': hour +// }); +// } +// +// // R024.2 +// book_appointment_review({required String appointment_type, required DateTime dateTime, required DoctorList doctor}) { +// final day = DateUtil.getWeekDay(dateTime.weekday); +// final hour = DateFormat('HH').format(dateTime); +// logger('book_appointment_review', parameters: { +// 'appointment_type': appointment_type, +// 'clinic_type': doctor.clinicName, +// 'hospital_name': doctor.projectName, +// 'treatment_type': GAnalytics.TREATMENT_TYPE ?? '', +// 'doctor_name': doctor.name, +// 'doctor_nationality': doctor.nationalityName, +// 'doctor_gender': doctor.genderDescription, +// 'appointment_day': day, +// 'appointment_hour': hour +// }); +// } +// +// // R025 +// book_appointment_click_confirm({required String appointment_type, required DateTime dateTime, required DoctorList doctor}) { +// final day = DateUtil.getWeekDay(dateTime.weekday); +// final hour = DateFormat('HH').format(dateTime); +// logger('book_appointment_click_confirm', parameters: { +// 'appointment_type': appointment_type, +// 'clinic_type': doctor.clinicName, +// 'hospital_name': doctor.projectName, +// 'treatment_type': GAnalytics.TREATMENT_TYPE ?? '', +// 'doctor_name': doctor.name, +// 'doctor_nationality': doctor.nationalityName, +// 'doctor_gender': doctor.genderDescription, +// 'appointment_day': day, +// 'appointment_hour': hour // '5-6' +// }); +// } +// +// // R026 +// book_appointment_confirmation_success({required String appointment_type, required DateTime dateTime, required DoctorList doctor}) { +// final day = DateUtil.getWeekDay(dateTime.weekday); +// final hour = DateFormat('HH').format(dateTime); +// logger('book_appointment_confirmation_success', parameters: { +// 'appointment_type': appointment_type, +// 'clinic_type': doctor.clinicName, +// 'hospital_name': doctor.projectName, +// 'treatment_type': GAnalytics.TREATMENT_TYPE ?? '', +// 'doctor_name': doctor.name, +// 'doctor_nationality': doctor.nationalityName, +// 'doctor_gender': doctor.genderDescription, +// 'appointment_day': day, +// 'appointment_hour': hour +// }); +// } +// +// // R049.1 // should be for appointment flow +// appointment_actions(AppoitmentAllHistoryResultList appointment, String action) { +// logger('appointment_actions', parameters: { +// 'action_type': action, +// 'flow_type': GAnalytics.APPOINTMENT_DETAIL_FLOW_TYPE, +// 'appointment_type': appointment.appointmentType, +// 'clinic_type_online': appointment.clinicName, +// 'hospital_name': appointment.projectName, +// 'doctor_name': (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName, +// 'payment_type': 'appointment', +// }); +// } +// +// // R027 +// appointment_reminder(bool value) { +// logger('appointment_reminder', parameters: {'reminder': value ? 'yes' : 'no'}); +// } +// +// // R028 +// appointment_reminder_time({required String reminde_before}) { +// logger('appointment_reminder_time', parameters: {'reminder_before': reminde_before}); +// } +// +// // R053 +// // Note : - Payment flow beyond this step are same as listed under ‘Advance Payment’ section of this document +// pay_now_for_appointment({required String appointment_type, required DoctorList doctorDetail, bool payNow = true}) { +// logger('pay_now_for_appointment', parameters: { +// 'appointment_type': appointment_type, +// 'clinic_type': doctorDetail.clinicName, +// 'hospital_name': doctorDetail.projectName, +// 'doctor_name': doctorDetail.name, +// 'payment_type': 'appointment' +// }); +// } +// +// // R033 +// payment_method({required String appointment_type, clinic, payment_method, payment_type}) { +// logger('payment_method', parameters: {'appointment_type': appointment_type, 'clinic_type': clinic, 'payment_method': payment_method, 'payment_type': payment_type}); +// } +// +// // R036 +// payment_success({required String appointment_type, clinic, hospital, payment_method, payment_type, txn_number, txn_amount, txn_currency}) { +// logger('payment_success', parameters: { +// 'appointment_type': appointment_type, +// 'payment_method': payment_method, +// 'payment_type': payment_type, +// 'hospital_name': hospital, +// 'clinic_type_online': clinic, +// 'transaction_number': txn_number, +// 'transaction_amount': txn_amount, +// 'transaction_currency': txn_currency, +// }); +// } +// +// payment_fail({required String appointment_type, clinic, hospital, payment_method, payment_type, txn_amount, txn_currency, error_type}) { +// logger('payment_fail', parameters: { +// 'appointment_type': appointment_type, +// 'payment_method': payment_method, +// 'payment_type': payment_type, +// 'hospital_name': hospital, +// 'clinic_type_online': clinic, +// 'transaction_amount': txn_amount, +// 'transaction_currency': txn_currency, +// 'error_type': error_type +// }); +// } +// +// // Note : - Payment flow beyond this step are same as listed under ‘Advance Payment’ section of this document +// appointment_detail_action({required AppoitmentAllHistoryResultList appointment, required String action}) { +// logger('appointment_detail_action', parameters: { +// 'action_type': action, +// 'flow_type': GAnalytics.APPOINTMENT_DETAIL_FLOW_TYPE, +// }); +// } +// +// // Note : - Payment flow beyond this step are same as listed under ‘Advance Payment’ section of this document +// appointment_details_confirm({required AppoitmentAllHistoryResultList appointment}) { +// logger('appointment_details_confirm', parameters: {}); +// } +// +// // R053 +// // Note : - Payment flow beyond this step are same as listed under ‘Advance Payment’ section of this document +// appointment_details_cancel({required AppoitmentAllHistoryResultList appointment, appointment_type}) { +// logger('cancel_appointment', parameters: { +// 'flow_type': GAnalytics.APPOINTMENT_DETAIL_FLOW_TYPE, +// 'appointment_type': appointment_type, +// 'clinic_type_online': appointment.clinicName, +// 'hospital_name': appointment.projectName, +// 'doctor_name': (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName +// }); +// } +// } +} diff --git a/lib/services/analytics/flows/error_tracking.dart b/lib/services/analytics/flows/error_tracking.dart new file mode 100644 index 0000000..6cc2882 --- /dev/null +++ b/lib/services/analytics/flows/error_tracking.dart @@ -0,0 +1,16 @@ + +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; + +class ErrorTracking{ + + final GALogger logger; + ErrorTracking(this.logger); + + log(String type, {String? error}){ + logger('errors', parameters: { + 'error_type' : type ?? 'unknown', + 'error' : error ?? 'unknown', + }); + } + +} \ No newline at end of file diff --git a/lib/services/analytics/flows/hamburger_menu.dart b/lib/services/analytics/flows/hamburger_menu.dart new file mode 100644 index 0000000..22301a2 --- /dev/null +++ b/lib/services/analytics/flows/hamburger_menu.dart @@ -0,0 +1,16 @@ + +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; + +class HamburgerMenu{ + final hamburger_menu = 'hamburger_menu'; + + final GALogger logger; + HamburgerMenu(this.logger); + + logMenuItemClick(String value){ + logger(hamburger_menu, parameters: { + 'menu_item' : value + }); + } + +} \ No newline at end of file diff --git a/lib/services/analytics/flows/hmg_services.dart b/lib/services/analytics/flows/hmg_services.dart new file mode 100644 index 0000000..1a9a47e --- /dev/null +++ b/lib/services/analytics/flows/hmg_services.dart @@ -0,0 +1,19 @@ + +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; + +class HMGServices{ + final hmg_services = 'hmg_services'; + + final GALogger logger; + HMGServices(this.logger); + logServiceName(String value){ + logger('hmg_services', parameters: { + 'services_name' : value + }); + } + viewAll(){ + logger('hmg_services', parameters: { + 'services_name' : 'view all services' + }); + } +} \ No newline at end of file diff --git a/lib/services/analytics/flows/live_care.dart b/lib/services/analytics/flows/live_care.dart new file mode 100644 index 0000000..5e7f330 --- /dev/null +++ b/lib/services/analytics/flows/live_care.dart @@ -0,0 +1,102 @@ +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; + +class LiveCare{ + + final GALogger logger; + LiveCare(this.logger); + + // R030.1 + livecare_immediate_consultation(){ + logger('livecare_immediate_consultation'); + } + + // R030.2 + livecare_schedule_video_call(){ + logger('livecare_schedule_video_call'); + } + + // R031.1 + livecare_clinic_schedule({required String clinic}){ + logger('livecare_clinic_schedule', parameters: { + 'clinic_type_online' : clinic + }); + } + + // R031.2 + livecare_immediate_consultation_clinic({required String clinic}){ + logger('livecare_immediate_consultation_clinic', parameters: { + 'clinic_type_online' : clinic + }); + } + + // R031.2 + livecare_schedule_video_call_clinic({required String clinic}){ + logger('livecare_schedule_video_call_clinic', parameters: { + 'clinic_type_online' : clinic + }); + } + + // R032 + livecare_immediate_consultation_TnC({required String clinic}){ + logger('livecare_immediate_consultation_tandc', parameters: { + 'clinic_type_online' : clinic + }); + } + + // R033 + payment_method({required String appointment_type, clinic, payment_method, payment_type}){ + logger('payment_method', parameters: { + 'appointment_type' : appointment_type, + 'clinic_type_online' : clinic, + 'payment_method' : payment_method, + 'payment_type' : payment_type + }); + } + + // R034 + payment_confirm({required String appointment_type, clinic, payment_method, payment_type}){ + logger('payment_confirm', parameters: { + 'appointment_type' : appointment_type, + 'clinic_type_online' : clinic, + 'payment_method' : payment_method, + 'payment_type' : payment_type + }); + } + + // R035 + payment_pay({required String appointment_type, clinic, hospital, payment_method, payment_type}){ + // logger('payment_pay', parameters: { + // 'appointment_type' : appointment_type, + // 'clinic_type_online' : clinic, + // 'payment_method' : payment_method, + // 'payment_type' : payment_type, + // 'hospital_name' : hospital + // }); + } + + // R036 + payment_success({required String appointment_type, clinic, hospital, payment_method, payment_type, txn_number, txn_amount, txn_currency}){ + // appointment_type + // clinic_type_online + // payment_method + // payment_type + // hospital_name + // transaction_number + // transaction_amount + // transaction_currency + } + + // R037 + livecare_immediate_consultation_payment_failed({required String appointment_type, clinic, payment_method, payment_type, txn_amount, txn_currency, error_message}){ + logger('livecare_immediate_consult_payment_fail', parameters: { + 'payment_method' : payment_method, + 'appointment_type' : appointment_type, + 'payment_type' : payment_type, + 'clinic_type_online' : clinic, + 'transaction_amount' : txn_amount, + 'transaction_currency' : txn_currency, + 'error_type' : error_message + }); + } +} \ No newline at end of file diff --git a/lib/services/analytics/flows/login_registration.dart b/lib/services/analytics/flows/login_registration.dart new file mode 100644 index 0000000..9488324 --- /dev/null +++ b/lib/services/analytics/flows/login_registration.dart @@ -0,0 +1,156 @@ +import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; + +class LoginRegistration{ + static int loginMethod = 0; + static int verificationMethod = 0; + + final GALogger logger; + LoginRegistration(this.logger); + // R004.1 + login_register_initiate(){ + logger('login_register_initiate'); + } + + // R005.1 + visited_alhabib_group(bool value){ + // selection_type: yes/no + logger('visited_alhabib_group', parameters: { + 'selection_type' : value ? 'yes' : 'no' + }); + } + + // R006.1, R007.1, R008.1, R009.1 + registration_cancel({required String step}){ + // registration_step : enter details + // registration_step : personal info + // registration_step : patient info + // fourth (verification) + logger('registration_cancel', parameters: { + 'registration_step' : step + }); + } + + // R006.2 + registration_enter_details(){ + logger('registration_enter_details'); + } + + // R007.2 + registration_personal_info(){ + logger('registration_personal_info'); + } + + // R008.2 + registration_patient_info(){ + logger('registration_patient_info'); + } + + // R009.2 + registration_verification_option(){ + logger('registration_verification_option'); + } + + // R010:registration_confirmation + registration_confirmation(){ + // verification_method: by + logger('registration_confirmation'); + } + + registration_fail({required String errorType}){ + // verification_method: by + logger('registration_fail', parameters: { + 'error_type' : errorType + }); + } + + // R011.1 + login_start({required String method}){ + logger('login_start', parameters: { + 'login_method' : method + }); + } + + // R011:login_verify_otp | R009:registration_verification_option + verify_otp_method({bool forRegistration = false}){ + if(forRegistration == false) + logger("login_verify_otp", parameters: { + 'login_method' : _getLoginMethod(), + 'verification_method' : _getVerificationMethod(), + }); + else + logger("registration_verification_option", parameters: { + 'verification_method' : _getVerificationMethod() + }); + } + + // R011:login_verify_otp | R009:registration_verification_option + login_verfication({bool forRegistration = false}){ + if(forRegistration == false) + logger("login_verfication", parameters: { + 'login_method' : _getLoginMethod(), + 'verification_method' : _getVerificationMethod(), + }); + else + logger("login_varification_register", parameters: { + 'login_method' : _getLoginMethod(), + 'verification_method' : _getVerificationMethod(), + }); + } + + // R011.2 + forget_file_number(){ + logger('forget_file_number'); + } + + // R011.3 + register_now(){ + logger('register_now'); + } + + // R012.1, R014.1 + login_successful(){ + logger('login_successful', parameters: { + 'login_method' : _getVerificationMethod() + }); + } + + // R012.4 + login_unsuccessful({required String method, error}){ + logger('login_unsuccessful', parameters: { + 'login_method' : method + }); + } + + login_fail({error}){ + logger('login_unsuccessful', parameters: { + 'login_method' : loginMethod, + 'error': error + }); + } + + // R013 + recover_file_number(){ + logger('recover_file_number'); + } + + // R014.2 + login_with_other_account(){ + logger('login_with_other_account'); + } + + + _getLoginMethod(){ + if(loginMethod == 1) return 'national id'; + if(loginMethod == 2) return 'file number'; + return 'otp'; + } + + String _getVerificationMethod(){ + if(verificationMethod == 1) return 'sms'; + if(verificationMethod == 2) return 'fingerprint'; + if(verificationMethod == 3) return 'face id'; + if(verificationMethod == 4) return 'whatsapp'; + return "unknown"; + } +} \ No newline at end of file diff --git a/lib/services/analytics/flows/offers_promotions.dart b/lib/services/analytics/flows/offers_promotions.dart new file mode 100644 index 0000000..bd2511f --- /dev/null +++ b/lib/services/analytics/flows/offers_promotions.dart @@ -0,0 +1,17 @@ + +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; + +class OfferAndPromotion{ + + final GALogger logger; + OfferAndPromotion(this.logger); + + final offers_and_promotion = 'offers_&_promotion'; + + log(){ + logger('offers_and_promotion', parameters: { + 'promotion_name' : "offer" + }); + } + +} \ No newline at end of file diff --git a/lib/services/analytics/flows/todo_list.dart b/lib/services/analytics/flows/todo_list.dart new file mode 100644 index 0000000..c1c874b --- /dev/null +++ b/lib/services/analytics/flows/todo_list.dart @@ -0,0 +1,111 @@ + + +import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; + +class TodoList{ + + final GALogger logger; + TodoList(this.logger); + + // R047.1 + // to_do_list_pay_now(AppoitmentAllHistoryResultList appointment){ + // logger('to_do_list_pay_now', parameters: { + // 'appointment_type' : appointment.isLiveCareAppointment! ? 'livecare' : 'regular', + // 'clinic_type_online' : appointment.clinicName, + // 'hospital_name' : appointment.projectName, + // 'doctor_name' : (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName, + // 'payment_type' : 'appointment', + // }); + // } + + // // R047.2 + // to_do_list_more_details(AppoitmentAllHistoryResultList appointment){ + // logger('to_do_list_more_details', parameters: { + // 'appointment_type' : appointment.isLiveCareAppointment! ? 'livecare' : 'regular', + // 'clinic_type_online' : appointment.clinicName, + // 'hospital_name' : appointment.projectName, + // 'doctor_name' : (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName, + // 'payment_type' : 'appointment', + // }); + // } + // + // // R048 + // to_do_list_confirm_payment_details(AppoitmentAllHistoryResultList appointment){ + // logger('to_do_list_confirm_payment_details', parameters: { + // 'appointment_type' : appointment.isLiveCareAppointment! ? 'livecare' : 'regular', + // 'clinic_type_online' : appointment.clinicName, + // 'hospital_name' : appointment.projectName, + // 'doctor_name' : (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName, + // 'payment_type' : 'appointment', + // }); + // } + // + // // R048 + // to_do_list_cancel_payment_details(AppoitmentAllHistoryResultList appointment){ + // logger('to_do_list_cancel_payment_details', parameters: { + // 'appointment_type' : appointment.isLiveCareAppointment! ? 'livecare' : 'regular', + // 'clinic_type_online' : appointment.clinicName, + // 'hospital_name' : appointment.projectName, + // 'doctor_name' : (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName, + // 'payment_type' : 'appointment', + // }); + // } + // + // + // + // // R049.2 + // to_do_list_cancel_appointment(AppoitmentAllHistoryResultList appointment){ + // logger('to_do_list_cancel_appointment', parameters: { + // 'appointment_type' : appointment.isLiveCareAppointment! ? 'livecare' : 'regular', + // 'clinic_type_online' : appointment.clinicName, + // 'hospital_name' : appointment.projectName, + // 'doctor_name' : (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName, + // 'payment_type' : 'appointment', + // }); + // } + // + // // R049.3 + // to_do_list_confirm_appointment(AppoitmentAllHistoryResultList appointment){ + // logger('confirm_appointment', parameters: { + // 'appointment_type' : appointment.isLiveCareAppointment! ? 'livecare' : 'regular', + // 'flow_type' : 'todo list', + // 'clinic_type_online' : appointment.clinicName, + // 'hospital_name' : appointment.projectName, + // 'doctor_name' : (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName, + // 'payment_type' : 'appointment', + // }); + // } + // + // // R050 + // to_do_list_check_in(AppoitmentAllHistoryResultList appointment){ + // logger('to_do_list_check_in', parameters: { + // 'appointment_type' : appointment.isLiveCareAppointment! ? 'livecare' : 'regular', + // 'clinic_type_online' : appointment.clinicName, + // 'hospital_name' : appointment.projectName, + // 'doctor_name' : (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName, + // 'payment_type' : 'appointment', + // }); + // } + // + // // R051 + // to_do_list_nfc(AppoitmentAllHistoryResultList appointment){ + // logger('to_do_list_nfc', parameters: { + // 'appointment_type' : appointment.isLiveCareAppointment! ? 'livecare' : 'regular', + // 'clinic_type_online' : appointment.clinicName, + // 'hospital_name' : appointment.projectName, + // 'doctor_name' : (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName, + // 'payment_type' : 'appointment', + // }); + // } + // + // // R052 + // to_do_list_nfc_cancel(AppoitmentAllHistoryResultList appointment){ + // logger('to_do_list_nfc_cancel', parameters: { + // 'appointment_type' : appointment.isLiveCareAppointment != null ? appointment.isLiveCareAppointment! ? 'livecare' : 'regular' : 'regular', + // 'clinic_type_online' : appointment.clinicName, + // 'hospital_name' : appointment.projectName, + // 'doctor_name' : (appointment.doctorName == null || appointment.doctorName == '') ? appointment.doctorNameObj : appointment.doctorName, + // 'payment_type' : 'appointment', + // }); + // } +} \ No newline at end of file diff --git a/lib/services/api_client.dart b/lib/services/api_client.dart deleted file mode 100644 index 4cab84d..0000000 --- a/lib/services/api_client.dart +++ /dev/null @@ -1,300 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; - -import 'package:flutter/foundation.dart'; -import 'package:hmg_patient_app_new/services/api_exception.dart'; -import 'package:http/http.dart'; -import 'package:http/io_client.dart'; - -import '../core/app_state.dart'; -import '../core/consts.dart'; -import '../core/utils/utils.dart'; -import '../main.dart'; - -// ignore_for_file: avoid_annotating_with_dynamic - -typedef FactoryConstructor = U Function(dynamic); - -class APIError { - int? errorCode; - String? errorMessage; - - APIError(this.errorCode, this.errorMessage); - - Map toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage}; - - @override - String toString() { - return jsonEncode(this); - } -} - -APIException _throwAPIException(Response response, Function retryCallBack) { - switch (response.statusCode) { - case 200: - APIError? apiError; - if (response.body != null && response.body.isNotEmpty) { - var jsonError = jsonDecode(response.body); - print(jsonError); - apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage']); - } - return APIException(APIException.BAD_REQUEST, error: apiError); - case 400: - APIError? apiError; - if (response.body != null && response.body.isNotEmpty) { - var jsonError = jsonDecode(response.body); - apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage']); - } - return APIException(APIException.BAD_REQUEST, error: apiError); - case 401: - return APIException(APIException.UNAUTHORIZED); - case 403: - return APIException(APIException.FORBIDDEN); - case 404: - return APIException(APIException.NOT_FOUND); - case 500: - return APIException(APIException.INTERNAL_SERVER_ERROR); - case 444: - var downloadUrl = response.headers["location"]; - return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl); - default: - return APIException(APIException.OTHER); - } -} - -abstract class IApiClient { - Future postJsonForObject(FactoryConstructor factoryConstructor, String url, T jsonObject, - {String? token, Map? queryParameters, Map? headers, int retryTimes = 0, bool isFormData = false}); - - Future postJsonForResponse(String url, T jsonObject, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0, bool isFormData = false}); - - Future getJsonForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}); - - void setHomeUrl(String url); -} - -class ApiClient implements IApiClient { - // static final ApiClient _instance = ApiClient._internal(); - - // ApiClient._internal(); - - // factory ApiClient() => _instance; - - @override - Future postJsonForObject(FactoryConstructor factoryConstructor, String url, T jsonObject, - {String? token, Map? queryParameters, Map? headers, int retryTimes = 0, bool isFormData = false}) async { - var _headers = {'Accept': 'application/json'}; - if (headers != null && headers.isNotEmpty) { - _headers.addAll(headers); - } - if (!kReleaseMode) { - print("Url:$url"); - var bodyJson = json.encode(jsonObject); - print("body:$bodyJson"); - } - var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes, isFormData: isFormData); - // try { - if (!kReleaseMode) { - logger.i("res: " + response.body); - } - var jsonData = jsonDecode(response.body); - if (jsonData["IsAuthenticated"] != null) { - AppState().setIsAuthenticated = jsonData["IsAuthenticated"]; - } - if (jsonData["ErrorMessage"] == null) { - return factoryConstructor(jsonData); - } else { - APIError? apiError; - apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']); - throw APIException(APIException.BAD_REQUEST, error: apiError); - } - // } catch (ex) { - // if (ex is APIException) { - // rethrow; - // } else { - // throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); - // } - // } - } - - @override - Future postJsonForResponse(String url, T jsonObject, - {String? token, - Map? queryParameters, - Map? headers, - int retryTimes = 0, - bool isFormData = false, - bool isAuthAPI = false, - bool isHISAPI = false, - bool isSanedAPI = false, - bool isPutRequest = false}) async { - String? requestBody; - late Map stringObj; - if (jsonObject != null) { - requestBody = jsonEncode(jsonObject); - if (headers == null) { - headers = {'Content-Type': 'application/json'}; - } else { - headers['Content-Type'] = 'application/json'; - } - } - - return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); - } - - Future _postForResponse(String url, requestBody, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { - try { - var _headers = {}; - // if (token != null) { - // _headers['Authorization'] = 'Bearer $token'; - // } - - if (headers != null && headers.isNotEmpty) { - _headers.addAll(headers); - } - if (queryParameters != null) { - // var queryString = new Uri(queryParameters: queryParameters).query; - var queryString = Uri(queryParameters: queryParameters.map((key, value) => MapEntry(key, value == null ? null : value.toString()))).query; - url = url + '?' + queryString; - } - - // if (!kReleaseMode && url.contains("saned")) { - if (!kReleaseMode) { - print("Url: $url"); - print("Headers: $_headers"); - // var bodyJson = json.encode(requestBody); - print("body: $requestBody"); - } - - var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 120)); - - if (response.statusCode >= 200 && response.statusCode < 300) { - return response; - } else { - throw _throwAPIException(response, () { - // _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes, isAuthAPI: isAuthAPI); - postJsonForResponse(url, requestBody); - }); - } - } on SocketException catch (e) { - if (retryTimes > 0) { - print('will retry after 3 seconds...'); - await Future.delayed(Duration(seconds: 3)); - return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } on HttpException catch (e) { - if (retryTimes > 0) { - print('will retry after 3 seconds...'); - await Future.delayed(Duration(seconds: 3)); - return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } on TimeoutException catch (e) { - throw APIException(APIException.TIMEOUT, arguments: e); - } on ClientException catch (e) { - if (retryTimes > 0) { - print('will retry after 3 seconds...'); - await Future.delayed(Duration(seconds: 3)); - return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } - } - - @override - Future getJsonForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0, bool isAuthAPI = false}) async { - logger.i("Url:$url"); - if (headers == null) { - headers = {'Content-Type': 'application/json'}; - } else { - headers['Content-Type'] = 'application/json'; - } - return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes, isAuthAPI: isAuthAPI); - } - - Future _getForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0, bool isAuthAPI = false}) async { - try { - var _headers = {}; - if (token != null) { - _headers['Authorization'] = 'Bearer $token'; - } - - if (headers != null && headers.isNotEmpty) { - _headers.addAll(headers); - } - - if (isAuthAPI) { - String token = await Utils.getStringFromPrefs(SharedPrefsConsts.appAuthToken); - _headers['Authorization'] = "Bearer $token"; - } - - if (queryParameters != null) { - var queryString = new Uri(queryParameters: queryParameters).query; - url = url + '?' + queryString; - } - var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60)); - - if (response.statusCode >= 200 && response.statusCode < 300) { - return response; - } else { - throw _throwAPIException(response, () { - _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); - }); - } - } on SocketException catch (e) { - if (retryTimes > 0) { - print('will retry after 3 seconds...'); - await Future.delayed(Duration(seconds: 3)); - return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } on HttpException catch (e) { - if (retryTimes > 0) { - print('will retry after 3 seconds...'); - await Future.delayed(Duration(seconds: 3)); - return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } on TimeoutException catch (e) { - throw APIException(APIException.TIMEOUT, arguments: e); - } on ClientException catch (e) { - if (retryTimes > 0) { - print('will retry after 3 seconds...'); - await Future.delayed(Duration(seconds: 3)); - return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } - } - - Future _get(url, {Map? headers}) => _withClient((client) => client.get(url, headers: headers)); - - bool _certificateCheck(X509Certificate cert, String host, int port) => true; - - Future _withClient(Future Function(Client) fn) async { - var httpClient = HttpClient()..badCertificateCallback = _certificateCheck; - var client = IOClient(httpClient); - try { - return await fn(client); - } finally { - client.close(); - } - } - - Future _post(url, {Map? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding)); - - Future _put(url, {Map? headers, body, Encoding? encoding}) => _withClient((client) => client.put(url, headers: headers, body: body, encoding: encoding)); - - @override - void setHomeUrl(String url) { - // TODO: implement setHomeUrl - } -} diff --git a/lib/services/api_exception.dart b/lib/services/api_exception.dart deleted file mode 100644 index f0f1ff9..0000000 --- a/lib/services/api_exception.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'dart:convert'; - -import 'package:hmg_patient_app_new/services/api_client.dart'; - -class APIException implements Exception { - static const String BAD_REQUEST = 'api_common_bad_request'; - static const String UNAUTHORIZED = 'api_common_unauthorized'; - static const String FORBIDDEN = 'api_common_forbidden'; - static const String NOT_FOUND = 'api_common_not_found'; - static const String INTERNAL_SERVER_ERROR = 'api_common_internal_server_error'; - static const String UPGRADE_REQUIRED = 'api_common_upgrade_required'; - static const String BAD_RESPONSE_FORMAT = 'api_common_bad_response_format'; - static const String OTHER = 'api_common_http_error'; - static const String TIMEOUT = 'api_common_http_timeout'; - static const String UNKNOWN = 'unexpected_error'; - - final String message; - final APIError? error; - final arguments; - - const APIException(this.message, {this.arguments, this.error}); - - Map toJson() => {'message': message, 'error': error, 'arguments': '$arguments'}; - - @override - String toString() { - return jsonEncode(this); - } -} diff --git a/lib/services/cache_service.dart b/lib/services/cache_service.dart new file mode 100644 index 0000000..8a015d8 --- /dev/null +++ b/lib/services/cache_service.dart @@ -0,0 +1,116 @@ +import 'dart:convert'; + +import 'package:hmg_patient_app_new/services/logger_service.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +abstract class CacheService { + Future saveString({required String key, required String value}); + + Future saveInt({required String key, required int value}); + + Future saveDouble({required String key, required double value}); + + Future saveBool({required String key, required bool value}); + + Future saveStringList({required String key, required List value}); + + String? getString({required String key}); + + int? getInt({required String key}); + + double? getDouble({required String key}); + + bool? getBool({required String key}); + + List? getStringList({required String key}); + + Future getObject({required String key}); + + Future saveObject({required String key, required dynamic value}); + + Future remove({required String key}); + + Future clear(); +} + +class CacheServiceImp implements CacheService { + final SharedPreferences sharedPreferences; + final LoggerService loggerService; + + CacheServiceImp({ + required this.sharedPreferences, + required this.loggerService, + }); + + @override + Future saveString({required String key, required String value}) async { + await sharedPreferences.setString(key, value); + } + + @override + Future saveInt({required String key, required int value}) async { + await sharedPreferences.setInt(key, value); + } + + @override + Future saveDouble({required String key, required double value}) async { + await sharedPreferences.setDouble(key, value); + } + + @override + Future saveBool({required String key, required bool value}) async { + await sharedPreferences.setBool(key, value); + } + + @override + Future saveStringList({required String key, required List value}) async { + await sharedPreferences.setStringList(key, value); + } + + @override + String? getString({required String key}) => sharedPreferences.getString(key); + + @override + int? getInt({required String key}) => sharedPreferences.getInt(key); + + @override + double? getDouble({required String key}) => sharedPreferences.getDouble(key); + + @override + bool? getBool({required String key}) => sharedPreferences.getBool(key); + + @override + List? getStringList({required String key}) => sharedPreferences.getStringList(key); + + @override + Future remove({required String key}) async { + await sharedPreferences.remove(key); + } + + @override + Future getObject({required String key}) async { + try { + await sharedPreferences.reload(); + var string = sharedPreferences.getString(key); + if (string == null) return null; + return json.decode(string); + } catch (ex) { + loggerService.errorLogs(ex.toString()); + return null; + } + } + + @override + Future saveObject({required String key, required dynamic value}) async { + try { + await sharedPreferences.setString(key, json.encode(value)); + } catch (ex) { + loggerService.errorLogs(ex.toString()); + } + } + + @override + Future clear() async { + await sharedPreferences.clear(); + } +} diff --git a/lib/services/dialog_service.dart b/lib/services/dialog_service.dart new file mode 100644 index 0000000..b91e093 --- /dev/null +++ b/lib/services/dialog_service.dart @@ -0,0 +1,301 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/route_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/my_family/widget/family_cards.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/bottomsheet/exception_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/family_files/family_file_add_widget.dart'; + +abstract class DialogService { + Future showErrorBottomSheet({String title = "", required String message, Function()? onOkPressed, Function()? onCancelPressed}); + + Future showExceptionBottomSheet({required String message, required Function() onOkPressed, Function()? onCancelPressed}); + + Future showCommonBottomSheetWithoutH({String? label, required String message, required Function() onOkPressed, Function()? onCancelPressed}); + + Future showFamilyBottomSheetWithoutH( + {String? label, + required String message, + required Function(FamilyFileResponseModelLists response) onSwitchPress, + required List profiles}); + + Future showFamilyBottomSheetWithoutHWithChild( + {String? label, required String message, Widget? child, required Function() onOkPressed, Function()? onCancelPressed}); + + Future showPhoneNumberPickerSheet({String? label, String? message, required Function() onSMSPress, required Function() onWhatsappPress}); + + Future showAddFamilyFileSheet({String? label, String? message, required Function() onVerificationPress}); +// TODO : Need to be Fixed showPhoneNumberPickerSheet ( From Login ADn Signup Bottom Sheet Move Here +} + +class DialogServiceImp implements DialogService { + final NavigationService navigationService; + + bool _isErrorSheetShowing = false; + + DialogServiceImp({required this.navigationService}); + + @override + Future showErrorBottomSheet({String title = "", required String message, Function()? onOkPressed, Function()? onCancelPressed}) async { + if (_isErrorSheetShowing) return; + final context = navigationService.navigatorKey.currentContext; + if (context == null) return; + + _isErrorSheetShowing = true; + await showModalBottomSheet( + context: context, + isScrollControlled: false, + constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(16)), + ), + builder: (_) => ExceptionBottomSheet( + // title: title, + message: message, + showCancel: onCancelPressed != null ? true : false, + onOkPressed: () { + print('ok button is pressed'); + if (onOkPressed != null) { + print('onOkPressed is not null'); + onOkPressed(); + }else { + Navigator.pop(context); + } + }, + onCancelPressed: () { + if (onCancelPressed != null) { + onCancelPressed(); + }else { + Navigator.pop(context); + } + }, + ), + ); + _isErrorSheetShowing = false; + } + + @override + Future showExceptionBottomSheet({required String message, required Function() onOkPressed, Function()? onCancelPressed}) async { + final context = navigationService.navigatorKey.currentContext; + if (context == null) return; + + await showModalBottomSheet( + context: context, + constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width), + isScrollControlled: false, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(16)), + ), + builder: (_) => ExceptionBottomSheet( + message: message, + showCancel: onCancelPressed != null ? true : false, + onOkPressed: onOkPressed, + onCancelPressed: () { + if (onCancelPressed != null) { + Navigator.of(context).pop(); + } + }, + ), + ); + } + + @override + Future showCommonBottomSheetWithoutH({String? label, required String message, required Function() onOkPressed, Function()? onCancelPressed}) async { + final context = navigationService.navigatorKey.currentContext; + if (context == null) return; + showCommonBottomSheetWithoutHeight( + context, + title: label ?? "", + child: exceptionBottomSheetWidget(context: context, message: message, onOkPressed: onOkPressed, onCancelPressed: onCancelPressed), + callBackFunc: () {}, + ); + } + + @override + Future showFamilyBottomSheetWithoutH( + {String? label, + required String message, + required Function(FamilyFileResponseModelLists response) onSwitchPress, + required List profiles}) async { + final context = navigationService.navigatorKey.currentContext; + if (context == null) return; + showCommonBottomSheetWithoutHeight(context, + title: label ?? "", + child: FamilyCards( + profiles: profiles, + onSelect: (FamilyFileResponseModelLists profile) { + onSwitchPress(profile); + }, + onRemove: (FamilyFileResponseModelLists profile) {}, + isShowDetails: false, + ), + callBackFunc: () {}); + } + + @override + Future showFamilyBottomSheetWithoutHWithChild( + {String? label, required String message, Widget? child, required Function() onOkPressed, Function()? onCancelPressed}) async { + final context = navigationService.navigatorKey.currentContext; + if (context == null) return; + showCommonBottomSheetWithoutHeight( + context, + title: label ?? "", + child: child ?? SizedBox(), + callBackFunc: () {}, + ); + } + + @override + Future showPhoneNumberPickerSheet({String? label, String? message, required Function() onSMSPress, required Function() onWhatsappPress}) async { + final context = navigationService.navigatorKey.currentContext; + if (context == null) return; + showCommonBottomSheetWithoutHeight(context, + title: label ?? "", + child: showPhoneNumberPickerWidget(context: context, message: message, onSMSPress: onSMSPress, onWhatsappPress: onWhatsappPress), + callBackFunc: () {}); + } + + @override + Future showAddFamilyFileSheet({String? label, String? message, required Function() onVerificationPress}) async { + final context = navigationService.navigatorKey.currentContext; + if (context == null) return; + showCommonBottomSheetWithoutHeight(context, + title: label ?? "", + child: FamilyFileAddWidget(() { + onVerificationPress(); + }, message ?? ""), + callBackFunc: () {}); + } +} + +Widget exceptionBottomSheetWidget({required BuildContext context, required String message, required Function() onOkPressed, Function()? onCancelPressed}) { + return Column( + children: [ + (message).toText16(isBold: false, color: AppColors.textColor), + SizedBox(height: 10.h), + SizedBox(height: 24.h), + if (onCancelPressed != null) + Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: () { + Navigator.of(context).pop(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + icon: AppAssets.cancel, + iconColor: AppColors.primaryRedColor, + ), + ), + SizedBox(width: 10.h), + Expanded( + child: CustomButton( + text: LocaleKeys.confirm.tr(), + onPressed: onOkPressed, + backgroundColor: AppColors.bgGreenColor, + borderColor: AppColors.bgGreenColor, + textColor: Colors.white, + icon: AppAssets.confirm, + ), + ), + ], + ), + if (onCancelPressed == null) + Padding( + padding: EdgeInsets.only(bottom: 10.h), + child: CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: (onCancelPressed == null) + ? () { + context.pop(); + } + : onCancelPressed, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedBorderColor, + textColor: Colors.white, + icon: AppAssets.confirm, + ), + ), + ], + ); +} + +Widget showPhoneNumberPickerWidget({required BuildContext context, String? message, required Function() onSMSPress, required Function() onWhatsappPress}) { + return StatefulBuilder(builder: (BuildContext context, StateSetter setModalState) { + return Column( + children: [ + (message ?? "").toText16(isBold: false, color: AppColors.textColor), + SizedBox(height: 10.h), + Padding( + padding: EdgeInsets.only(bottom: 10.h), + child: CustomButton( + text: LocaleKeys.sendOTPSMS.tr(), + onPressed: onSMSPress, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedBorderColor, + textColor: AppColors.whiteColor, + icon: AppAssets.message, + ), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 8.h), + child: LocaleKeys.oR.tr().toText16(color: AppColors.textColor), + ), + ], + ), + Padding( + padding: EdgeInsets.only(bottom: 10.h, top: 10.h), + child: CustomButton( + text: LocaleKeys.sendOTPWHATSAPP.tr(), + onPressed: onWhatsappPress, + backgroundColor: Colors.white, + borderColor: AppColors.borderOnlyColor, + textColor: AppColors.textColor, + icon: AppAssets.whatsapp, + iconColor: null, + ), + ), + ], + ); + //return Padding( + // padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + // child: SingleChildScrollView( + // child: GenericBottomSheet( + // countryCode: authViewModel.selectedCountrySignup.countryCode, + // initialPhoneNumber: "", + // textController: authViewModel.phoneNumberController, + // isEnableCountryDropdown: true, + // onCountryChange: authViewModel.onCountryChange, + // onChange: authViewModel.onPhoneNumberChange, + // buttons: [ + // + // ], + // ), + // ), + // ); + }); +} + +// Widget familyMemberAddWidget() { +// AuthenticationViewModel authVm = getIt.get(); +// return showCommonBottomSheetWithoutHeight(context, +// title: "Add Family Member".needTranslation, +// useSafeArea: true, +// child: +// callBackFunc: () {}); +// } diff --git a/lib/services/error_handler_service.dart b/lib/services/error_handler_service.dart new file mode 100644 index 0000000..aeefefb --- /dev/null +++ b/lib/services/error_handler_service.dart @@ -0,0 +1,80 @@ +import 'dart:io'; + +import 'package:hmg_patient_app_new/core/exceptions/api_exception.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/core/utils/loading_utils.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; + +abstract class ErrorHandlerService { + Future handleError({required Failure failure, Function() onOkPressed, Function(Failure)? onUnHandledFailure, Function(Failure)? onMessageStatusFailure}); +} + +class ErrorHandlerServiceImp implements ErrorHandlerService { + final DialogService dialogService; + final LoggerService loggerService; + final NavigationService navigationService; + + ErrorHandlerServiceImp({ + required this.dialogService, + required this.loggerService, + required this.navigationService, + }); + + @override + Future handleError({required Failure failure, Function()? onOkPressed, Function(Failure)? onUnHandledFailure, Function(Failure)? onMessageStatusFailure}) async { + if (failure is APIException) { + loggerService.errorLogs("API Exception: ${failure.message}"); + } else if (failure is ServerFailure) { + loggerService.errorLogs("URL: ${failure.url} \n Server Failure: ${failure.message}"); + await _showDialog(failure, title: "Server Failure"); + } else if (failure is DataParsingFailure) { + loggerService.errorLogs("Data Parsing Failure: ${failure.message}"); + await _showDialog(failure, title: "Data Error"); + } else if (failure is StatusCodeFailure) { + loggerService.errorLogs("StatusCode Failure: ${failure.message}"); + await _showDialog(failure, title: "StatusCodeFailure"); + } else if (failure is ConnectivityFailure) { + loggerService.errorLogs("ConnectivityFailure : ${failure.message}"); + await _showDialog(failure, title: "ConnectivityFailure ", onOkPressed: () {}); + } else if (failure is UnAuthenticatedUserFailure) { + loggerService.errorLogs("URL: ${failure.url} \n UnAuthenticatedUser Failure: ${failure.message}"); + await _showDialog(failure, title: "UnAuthenticatedUser Failure", onOkPressed: () => navigationService.replaceAllRoutesAndNavigateToLanding()); + } else if (failure is AppUpdateFailure) { + loggerService.errorLogs("AppUpdateFailure : ${failure.message}"); + await _showDialog(failure, title: "AppUpdateFailure Error", onOkPressed: () => navigationService.replaceAllRoutesAndNavigateToLanding()); + } else if (failure is HttpException) { + loggerService.errorLogs("Http Exception: ${failure.message}"); + await _showDialog(failure, title: "Network Error"); + } else if (failure is UnknownFailure) { + loggerService.errorLogs("URL: ${failure.url} \n Unknown Failure: ${failure.message}"); + await _showDialog(failure, title: "Unknown Failure"); + } else if (failure is InvalidCredentials) { + loggerService.errorLogs("Invalid Credentials : ${failure.message}"); + await _showDialog(failure, title: "Invalid Credentials "); + } else if (failure is UserIntimationFailure) { + if (onUnHandledFailure != null) { + onUnHandledFailure(failure); + } else { + await _showDialog(failure, title: "UserIntimationFailure", onOkPressed: onOkPressed); + } + } else if (failure is MessageStatusFailure) { + if (onMessageStatusFailure != null) { + onMessageStatusFailure(failure); + } else { + await _showDialog(failure, title: "MessageStatusFailure", onOkPressed: onOkPressed); + } + } else { + loggerService.errorLogs("Unhandled failure type: $failure"); + await _showDialog(failure, title: "Unhandled Error", onOkPressed: onOkPressed); + } + } + + Future _showDialog(Failure failure, {required String title, Function()? onOkPressed}) async { + if (LoadingUtils.isLoading) { + LoadingUtils.hideFullScreenLoader(); + } + await dialogService.showErrorBottomSheet(title: title, message: failure.message, onOkPressed: onOkPressed); + } +} diff --git a/lib/services/firebase_service.dart b/lib/services/firebase_service.dart new file mode 100644 index 0000000..f6c712e --- /dev/null +++ b/lib/services/firebase_service.dart @@ -0,0 +1,31 @@ +import 'package:firebase_messaging/firebase_messaging.dart' show FirebaseMessaging; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class FirebaseService { + Future getDeviceToken(); +} + +class FirebaseServiceImpl implements FirebaseService { + final FirebaseMessaging firebaseMessaging; + final LoggerService loggerService; + final AppState appState; + + FirebaseServiceImpl({ + required this.firebaseMessaging, + required this.loggerService, + required this.appState, + }); + + @override + Future getDeviceToken() async { + try { + String? deviceToken = await firebaseMessaging.getToken(); + appState.setDeviceToken = deviceToken; + return deviceToken ?? ""; + } catch (e) { + loggerService.logInfo(e.toString()); + return ""; + } + } +} diff --git a/lib/services/localauth_service.dart b/lib/services/localauth_service.dart new file mode 100644 index 0000000..2875a7f --- /dev/null +++ b/lib/services/localauth_service.dart @@ -0,0 +1,49 @@ +import 'package:local_auth/local_auth.dart'; + +import 'logger_service.dart'; + +class LocalAuthService { + final LocalAuthentication localAuth; + final LoggerService loggerService; + LocalAuthService({required this.localAuth, required this.loggerService}); + Future authenticate() async { + try { + final canCheck = await localAuth.canCheckBiometrics; + final isDeviceSupported = await localAuth.isDeviceSupported(); + + if (!canCheck || !isDeviceSupported) { + return false; + } + + final isAuthenticated = await localAuth.authenticate( + localizedReason: 'Please authenticate to proceed', + options: const AuthenticationOptions( + biometricOnly: true, + stickyAuth: true, + ), + ); + + return isAuthenticated; + } catch (e) { + print(e); + return false; + } + } + + + Future canCheckBiometrics() async { + try { + return await localAuth.canCheckBiometrics; + } catch (e) { + return false; + } + } + + Future> getAvailableBiometrics() async { + try { + return await localAuth.getAvailableBiometrics(); + } catch (e) { + return []; + } + } +} \ No newline at end of file diff --git a/lib/services/logger_service.dart b/lib/services/logger_service.dart new file mode 100644 index 0000000..9df6633 --- /dev/null +++ b/lib/services/logger_service.dart @@ -0,0 +1,23 @@ +import 'package:logger/logger.dart'; + +abstract class LoggerService { + void errorLogs(String message); + + void logInfo(String message); +} + +class LoggerServiceImp implements LoggerService { + Logger logger; + + LoggerServiceImp({required this.logger}); + + @override + void errorLogs(String message) { + logger.e(message); + } + + @override + void logInfo(String message) { + logger.d(message); + } +} diff --git a/lib/services/navigation_service.dart b/lib/services/navigation_service.dart new file mode 100644 index 0000000..cb4405c --- /dev/null +++ b/lib/services/navigation_service.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/features/authentication/widgets/otp_verification_screen.dart'; +import 'package:hmg_patient_app_new/routes/app_routes.dart'; + +class NavigationService { + final GlobalKey navigatorKey = GlobalKey(); + + BuildContext? get context => navigatorKey.currentContext; + + Future push(Route route) { + return navigatorKey.currentState!.push(route); + } + + Future pushAndRemoveUntil(Route route,RoutePredicate predicate) { + return navigatorKey.currentState!.pushAndRemoveUntil(route,predicate); + } + + void pop([T? result]) { + navigatorKey.currentState!.pop(result); + } + + void popUntilNamed(String routeName) { + navigatorKey.currentState?.popUntil(ModalRoute.withName(routeName)); + } + + void replaceAllRoutesAndNavigateToLanding() { + AppState appState = getIt.get(); + appState.isAuthenticated = false; + navigatorKey.currentState?.pushNamedAndRemoveUntil( + AppRoutes.landingScreen, + (Route route) => false, + ); + } + + void pushAndReplace(String routeName) { + navigatorKey.currentState?.pushReplacementNamed(routeName); + } + + + + Future pushToOtpScreen({required String phoneNumber, required Function(int code) checkActivationCode, required Function(String phoneNumber) onResendOTPPressed, bool isFormFamilyFile = false}) { + return navigatorKey.currentState!.push( + MaterialPageRoute(builder: (_) => OTPVerificationScreen(phoneNumber: phoneNumber, checkActivationCode: checkActivationCode, onResendOTPPressed: onResendOTPPressed, isFormFamilyFile : isFormFamilyFile)), + ); + } + + Future pushPage({ + required Widget page, + bool fullscreenDialog = false, + bool maintainState = true, + }) { + return navigatorKey.currentState!.push( + MaterialPageRoute( + builder: (_) => page, + fullscreenDialog: fullscreenDialog, + maintainState: maintainState, + ), + ); + } +} diff --git a/lib/services/permission_service.dart b/lib/services/permission_service.dart new file mode 100644 index 0000000..6287234 --- /dev/null +++ b/lib/services/permission_service.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; + +import 'package:permission_handler/permission_handler.dart'; + +// import 'package:vibration/vibration.dart'; +import 'package:geolocator/geolocator.dart' as geo; + +class PermissionService { + // final LocalStorage storage = new LocalStorage("permission"); + geo.LocationPermission? locationPermission; + + // AppGlobal appGlobal = new AppGlobal(); + + // setVibrationPermission(flag) async { + // storage.setItem('isVibration', flag); + // } + // + // isVibrationEnabled() { + // return (storage.getItem('isVibration') == null) || + // (storage.getItem('isVibration')) == false + // ? false + // : true; + // } + + // vibrate(callback, context) async { + // if (callback == null) return null; + // if (isVibrationEnabled() == true) { + // // if (await Vibration.hasVibrator() !=null) { + // // Vibration.vibrate(duration: 100); + // // callback(); + // // } + // } else { + // callback(); + // } + // } + + // setTheme(flag) async { + // storage.setItem('isTheme', flag); + // } + // + // isThemeEnabled() { + // return storage.getItem('isTheme'); + // } + + cameraPermission() async { + Map statuses = await [ + Permission.camera, + ].request(); + } + + static isCameraEnabled() async { + return await Permission.camera.isGranted; + } + + static isExternalStorageEnabled() async { + return await Permission.storage.isGranted; + } + + static isHealthDataPermissionEnabled() async { + return await Permission.sensors.isGranted; + } + + static isMicrophonePermissionEnabled() async { + return await Permission.microphone.isGranted; + } + + static isCalendarPermissionEnabled() async { + return await Permission.calendarFullAccess.isGranted; + } + + setCameraLocationPermission(context) async { + Navigator.pop(context); + openAppSettings(); + } + + static isLocationEnabled() async { + var permission = await geo.Geolocator.checkPermission(); + if (permission == geo.LocationPermission.denied) { + return false; + } else { + return true; + } + } + + openSettings() async { + openAppSettings(); + } + + openAccessbility() { + // OpenSettings.openAppSetting(); + } +} diff --git a/lib/splashPage.dart b/lib/splashPage.dart index b05cab8..ba7cefd 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -6,13 +6,28 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_zoom_videosdk/native/zoom_videosdk.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_orders_page.dart'; +import 'package:hmg_patient_app_new/presentation/onboarding/onboarding_screen.dart'; +import 'package:hmg_patient_app_new/presentation/onboarding/splash_animation_screen.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; + +// import 'package:hmg_patient_app_new/presentation/authantication/login.dart'; import 'package:hmg_patient_app_new/presentation/home/landing_page.dart'; +import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; +import 'package:lottie/lottie.dart'; import 'package:provider/provider.dart'; -import 'core/consts.dart'; -import 'core/utils/LocalNotification.dart'; -import 'core/utils/push-notification-handler.dart'; +import 'core/cache_consts.dart'; +import 'core/utils/local_notifications.dart'; +import 'core/utils/push_notification_handler.dart'; +import 'widgets/routes/custom_page_route.dart'; class SplashPage extends StatefulWidget { @override @@ -20,10 +35,9 @@ class SplashPage extends StatefulWidget { } class _SplashScreenState extends State { - @override - void initState() { - super.initState(); - print("Splash init called............."); + late AuthenticationViewModel authVm; + + Future initializeStuff() async { Timer( Duration(milliseconds: 500), () async { @@ -31,15 +45,16 @@ class _SplashScreenState extends State { PushNotificationHandler().init(context); // Asyncronously }, ); - Timer(Duration(seconds: 3, milliseconds: 500), () async { + await authVm.getServicePrivilege(); + Timer(Duration(seconds: 2, milliseconds: 500), () async { LocalNotification.init(onNotificationClick: (payload) {}); - Navigator.of(context).pushReplacement( - FadePage( - page: LandingPage(), - ), - ); - }); + if (await Utils.getBoolFromPrefs(CacheConst.firstLaunch)) { + Navigator.of(context).pushReplacement(FadePage(page: SplashAnimationScreen(routeWidget: OnboardingScreen()))); + } else { + Navigator.of(context).pushReplacement(FadePage(page: SplashAnimationScreen(routeWidget: LandingNavigation()))); + } + }); var zoom = ZoomVideoSdk(); InitConfig initConfig = InitConfig( domain: "zoom.us", @@ -66,53 +81,17 @@ class _SplashScreenState extends State { PushNotificationHandler().init(context); // Asyncronously } + @override + void initState() { + authVm = context.read(); + super.initState(); + initializeStuff(); + } + @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Color(0xffF8F8F8), - body: Stack( - alignment: Alignment.center, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 53), - child: Image.asset( - 'assets/images/new/hmg_logo.png', - fit: BoxFit.fitWidth, - width: MediaQuery.of(context).size.width, - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - "Powered by", - style: TextStyle(fontSize: 14, fontWeight: FontWeight.w400, color: Color(0xff333C45), letterSpacing: -0.56, height: 16 / 14), - ), - SizedBox( - height: 5, - ), - SvgPicture.asset( - 'assets/images/new/cloud_logo.svg', - width: 40, - height: 40, - ), - SizedBox( - height: 7, - ), - // Text( - // "Version 1.1.0", - // style: TextStyle(fontSize: 10, fontWeight: FontWeight.w400, color: Color(0xff3989898), letterSpacing: 0, height: 12 / 10), - // ), - SizedBox( - height: 18, - ) - ], - ), - ) - ], - ), - ); + backgroundColor: AppColors.whiteColor, + body: Lottie.asset(AppAnimations.loadingAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 80.h, height: 80.h, fit: BoxFit.fill).center); } } diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index 2539e88..f185479 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -3,7 +3,7 @@ import 'package:flutter/services.dart'; class AppTheme { static ThemeData getTheme(isArabic) => ThemeData( - fontFamily: isArabic ? 'NotoSansArabic' : 'Jost', + fontFamily: isArabic ? 'GESSTwo' : 'Poppins', primarySwatch: Colors.red, visualDensity: VisualDensity.adaptivePlatformDensity, brightness: Brightness.light, @@ -27,9 +27,11 @@ class AppTheme { // primaryColorDark: primaryColor, // toggleableActiveColor: secondaryColor, // indicatorColor: secondaryColor, - bottomSheetTheme: const BottomSheetThemeData( - backgroundColor: Color(0xFFE0E0E0), - ), + // bottomSheetTheme: const BottomSheetThemeData( + // backgroundColor: Color(0xFFE0E0E0), + // ), + bottomSheetTheme: BottomSheetThemeData( + backgroundColor: Colors.black.withOpacity(0)), // primaryTextTheme: const TextTheme( // bodyText2: TextStyle(color: Colors.white), // ), @@ -47,6 +49,7 @@ class AppTheme { color: Colors.grey[800], ), systemOverlayStyle: SystemUiOverlayStyle.light, + surfaceTintColor: Colors.transparent, ), ); } diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index 5296ada..6ccf8b1 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -1,18 +1,83 @@ import 'package:flutter/material.dart'; -const mainPurple = Color(0xFF7954F7); -const purpleBg = Color(0xFFAEA4FC); -const deepPurple = Color(0xFF7C65E7); -const logoColor = Color(0xFF7C65E7); -const buttonColor = Color(0xFF6A46F5); -const splashBgColor = Color(0xFF3C355D); -const whiteColor = Color(0xFFffffff); -const blackColor = Color(0xFF000000); -const lightGray = Color(0xFFF4F5F7); -const lightPurple = Color(0xFFB7A3E6); -const scaffoldBgColor = Color(0xFFF8F8F8); -const lightGreyEFColor = Color(0xffeaeaff); -const greyF7Color = Color(0xffF7F7F7); -const lightGrayColor = Color(0xff808080); -const buttonGrayColor = Color(0xffF1F1F1); -const lightPurpleAlpha = Color(0x5AB7A3E6); +class AppColors { + static const transparent = Colors.transparent; + static const mainPurple = Color(0xFF7954F7); + static const purpleBg = Color(0xFFAEA4FC); + static const deepPurple = Color(0xFF7C65E7); + static const logoColor = Color(0xFF7C65E7); + static const buttonColor = Color(0xFF6A46F5); + static const splashBgColor = Color(0xFF3C355D); + + static const lightGray = Color(0xFFF4F5F7); + static const lightPurple = Color(0xFFB7A3E6); + static const scaffoldBgColor = Color(0xFFF8F8F8); + static const bottomSheetBgColor = Color(0xFFF8F8FA); + static const lightGreyEFColor = Color(0xffeaeaff); + static const greyF7Color = Color(0xffF7F7F7); + static const lightGrayColor = Color(0xff808080); + static const buttonGrayColor = Color(0xffF1F1F1); + static const lightPurpleAlpha = Color(0x5AB7A3E6); + +// New UI Colors + static const whiteColor = Color(0xFFffffff); + static const Color bgScaffoldColor = Color(0xffF8F8F8); + static const Color primaryRedColor = Color(0xFFED1C2B); + static const Color primaryRedBorderColor = Color(0xFFED1C2B); + static const Color secondaryLightRedColor = Color(0xFFFEE9EA); + static const Color secondaryLightRedBorderColor = Color(0xFFFEE9EA); + static const Color bgRedLightColor = Color(0xFFFEE9EA); + static const Color bgGreenColor = Color(0xFF18C273); + static const Color textColor = Color(0xFF2E3039); + static const Color borderGrayColor = Color(0x332E3039); + static const Color textColorLight = Color(0xFF5E5E5E); + static const Color borderOnlyColor = Color(0xFF2E3039); + static const Color chipBorderColorOpacity20 = Color(0x332E3039); + static const Color dividerColor = Color(0x40D2D2D2); + static const Color warningColorYellow = Color(0xFFF4A308); + static const Color blackBgColor = Color(0xFF2E3039); + static const blackColor = textColor; + static const Color inputLabelTextColor = Color(0xff898A8D); + static const Color greyTextColor = Color(0xFF8F9AA3); + static const Color lightGrayBGColor = Color(0x142E3039); + + + static const lightGreenColor = Color(0xFF0ccedde); + static const textGreenColor = Color(0xFF18C273); + static const Color ratingColorYellow = Color(0xFFFFAF15); + static const Color spacerLineColor = Color(0x2E30391A); + + //Chips + static const Color successColor = Color(0xff18C273); + static const Color errorColor = Color(0xFFED1C2B); + static const Color alertColor = Color(0xFFD48D05); + static const Color infoColor = Color(0xFF0B85F7); + static const Color warningColor = Color(0xFFFFCC00); + static const Color greyColor = Color(0xFFEFEFF0); + static const Color chipPrimaryRedBorderColor = Color(0xFFED1C2B); + static const Color chipSecondaryLightRedColor = Color(0xFFFEE9EA); + +static const Color successLightColor = Color(0xFF18C273); +static const Color errorLightColor = Color(0xFFED1C2B); +static const Color alertLightColor = Color(0xFFD48D05); +static const Color infoLightColor = Color(0xFF0B85F7); +static const Color warningLightColor = Color(0xFFFFCC00); +static const Color greyLightColor = Color(0xFFEFEFF0); +static const Color thumbColor = Color(0xFF18C273); +static const Color switchBackgroundColor = Color(0x2618C273); + +static const Color bottomNAVBorder = Color(0xFFEEEEEE); + +static const Color quickLoginColor = Color(0xFF666666); + +static const Color tooltipTextColor = Color(0xFF414D55); +static const Color graphGridColor = Color(0x4D18C273); +static const Color criticalLowAndHigh = Color(0xFFED1C2B); +static const Color highAndLow = Color(0xFFFFAF15); +static const Color labelTextColor = Color(0xFF838383); +static const Color calenderTextColor = Color(0xFFD0D0D0); +static const Color lightGreenButtonColor = Color(0x2618C273); + +static const Color lightRedButtonColor = Color(0x1AED1C2B); + +} diff --git a/lib/widgets/CustomSwitch.dart b/lib/widgets/CustomSwitch.dart new file mode 100644 index 0000000..784e446 --- /dev/null +++ b/lib/widgets/CustomSwitch.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class CustomSwitch extends StatefulWidget { + final bool value; + final ValueChanged onChanged; + + const CustomSwitch({super.key, required this.value, required this.onChanged}); + + @override + State createState() => _CustomSwitchState(); +} + +class _CustomSwitchState extends State { + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => widget.onChanged(!widget.value), + child: Container( + width: 48.w, + height: 30.h, + decoration: BoxDecoration( + color: AppColors.switchBackgroundColor , + borderRadius: BorderRadius.circular(18), + ), + child: AnimatedAlign( + duration: Duration(milliseconds: 300), + alignment: widget.value ? Alignment.centerRight : Alignment.centerLeft, + child: Container( + margin: EdgeInsets.all(2.h), + width: 28.w, + height: 28.h, + decoration: BoxDecoration( + color: AppColors.thumbColor, + shape: BoxShape.circle, + ), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/widgets/app_bar_widget.dart b/lib/widgets/app_bar_widget.dart deleted file mode 100644 index 9a7906d..0000000 --- a/lib/widgets/app_bar_widget.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:hmg_patient_app_new/widgets/arrow_back.dart'; -import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; - -AppBar AppBarWidget( - BuildContext context, { - required String title, - String? image, - bool isNeedLeading = true, - List? actions, - Function? onTap, - Color? backgroundColor, - Color? foregroundColor, - bool? isCenter, -}) { - return AppBar( - // leadingWidth: 0, - titleSpacing: -8, - leading: isNeedLeading - ? ArrowBack( - onTap: onTap, - color: foregroundColor ?? whiteColor, - ) - : Container(), - title: title.toText16(color: foregroundColor ?? whiteColor, isBold: true), - centerTitle: isCenter ?? true, - elevation: 0, - backgroundColor: backgroundColor ?? mainPurple, - actions: actions, - ); -} diff --git a/lib/widgets/app_language_change.dart b/lib/widgets/app_language_change.dart new file mode 100644 index 0000000..de9cda5 --- /dev/null +++ b/lib/widgets/app_language_change.dart @@ -0,0 +1,87 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +class AppLanguageChange extends StatefulWidget { + AppLanguageChange({Key? key}) : super(key: key); + + @override + _AppLanguageChangeState createState() { + return _AppLanguageChangeState(); + } +} + +class _AppLanguageChangeState extends State { + String? selectedValue; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + selectedValue ??= context.locale.languageCode; + return Column( + spacing: 24.h, + children: [ + Container( + padding: EdgeInsets.only(top: 4, bottom: 4), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: Column( + children: [ + languageItem("English".needTranslation, "en"), + 1.divider, + languageItem("العربية".needTranslation, "ar"), + ], + ), + ), + CustomButton( + text: LocaleKeys.save.tr(), + onPressed: () { + context.setLocale(selectedValue == 'en' ? Locale('en', 'US') : Locale('ar', 'SA')).then((val) { + Navigator.pop(context); + }); + }), + ], + ); + } + + Widget languageItem(String title, String _value) { + return SizedBox( + height: 72, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: _value, + groupValue: selectedValue, + activeColor: AppColors.errorColor, + onChanged: (value) { + setState(() { + selectedValue = _value; + }); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + title.toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).paddingOnly(left: 16, right: 16).onPress(() { + setState(() { + selectedValue = _value; + }); + }), + ); + } +} diff --git a/lib/widgets/appbar/app_bar_widget.dart b/lib/widgets/appbar/app_bar_widget.dart new file mode 100644 index 0000000..b3bc3eb --- /dev/null +++ b/lib/widgets/appbar/app_bar_widget.dart @@ -0,0 +1,83 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/widgets/language_switcher.dart'; + +import '../../generated/locale_keys.g.dart'; + +class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { + final VoidCallback onBackPressed; + final ValueChanged onLanguageChanged; + final bool hideLogoAndLang; + + const CustomAppBar({ + super.key, + required this.onBackPressed, + required this.onLanguageChanged, + this.hideLogoAndLang = false, + }); + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); + + @override + Widget build(BuildContext context) { + return AppBar( + backgroundColor: Colors.transparent, + leading: null, + automaticallyImplyLeading: false, + title: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.h), + child: Row( + // mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Align( + alignment: context.locale.languageCode == "ar" ? Alignment.centerRight : Alignment.centerLeft, + child: GestureDetector( + onTap: onBackPressed, + child: context.locale.languageCode == "ar" + ? RotatedBox( + quarterTurns: 90, + child: Utils.buildSvgWithAssets( + icon: AppAssets.arrow_back, + width: 32.w, + height: 32.h, + ), + ) + : Utils.buildSvgWithAssets( + icon: AppAssets.arrow_back, + width: 32.w, + height: 32.h, + ), + ), + ), + ), + + // Logo + if (!hideLogoAndLang) Utils.buildSvgWithAssets(icon: AppAssets.habiblogo, height: 24.h), + + if (!hideLogoAndLang) + Expanded( + child: Align( + alignment: context.locale.languageCode == "ar" ? Alignment.centerLeft : Alignment.centerRight, + child: LanguageSelector( + currentLanguage: context.locale.languageCode, + showOnlyIcon: false, + onLanguageChanged: onLanguageChanged, + languages: [ + {'code': 'ar', 'name': LocaleKeys.arabic.tr()}, + {'code': 'en', 'name': LocaleKeys.english.tr()} + ], + ), + ), + ), + ], + ), + ), + centerTitle: true, + ); + } +} diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart new file mode 100644 index 0000000..8e07631 --- /dev/null +++ b/lib/widgets/appbar/collapsing_list_view.dart @@ -0,0 +1,186 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +import '../../core/dependencies.dart'; + +class CollapsingListView extends StatelessWidget { + final String title; + Widget? child; + VoidCallback? search; + VoidCallback? report; + VoidCallback? logout; + VoidCallback? history; + VoidCallback? instructions; + VoidCallback? requests; + Widget? bottomChild; + Widget? trailing; + bool isClose; + bool isLeading; + + CollapsingListView({ + super.key, + required this.title, + this.child, + this.search, + this.isClose = false, + this.bottomChild, + this.report, + this.logout, + this.history, + this.instructions, + this.requests, + this.isLeading = true, + this.trailing, + }); + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + CustomScrollView( + slivers: [ + SliverAppBar( + automaticallyImplyLeading: false, + pinned: true, + expandedHeight: MediaQuery.of(context).size.height * 0.12.h, + stretch: true, + systemOverlayStyle: SystemUiOverlayStyle(statusBarBrightness: Brightness.light), + surfaceTintColor: Colors.transparent, + backgroundColor: AppColors.bgScaffoldColor, + leading: isLeading + ? Transform.flip( + flipX: appState.isArabic(), + child: IconButton( + icon: Utils.buildSvgWithAssets(icon: isClose ? AppAssets.closeBottomNav : AppAssets.arrow_back, width: 32.h, height: 32.h), + padding: EdgeInsets.only(left: 12), + onPressed: () => Navigator.pop(context), + highlightColor: Colors.transparent, + ), + ) + : SizedBox.shrink(), + flexibleSpace: LayoutBuilder( + builder: (context, constraints) { + final double maxHeight = 100.h; + final double minHeight = kToolbarHeight; + double t = (constraints.maxHeight - minHeight) / (maxHeight - minHeight); + t = t - 1; + if (t < 0.7) t = 0.7; + t = t.clamp(0.0, 1.0); + + final double fontSize = lerpDouble(14, 18, t)!; + final double bottomPadding = lerpDouble(0, 0, t)!; + final double leftPadding = lerpDouble(150, 24, t)!; + + return Stack( + children: [ + Align( + alignment: Alignment.lerp( + Alignment.center, + Alignment.bottomLeft, + t, + )!, + child: Padding( + padding: EdgeInsets.only( + left: appState.isArabic() ? 0 : leftPadding, right: appState.isArabic() ? leftPadding : 0, bottom: bottomPadding), + child: Row( + spacing: 4.h, + children: [ + Text( + title, + maxLines: 1, + style: TextStyle( + fontSize: (27 - (5 * (2 - t))).f, + fontWeight: FontWeight.lerp( + FontWeight.w300, + FontWeight.w600, + t, + )!, + color: AppColors.blackColor, + letterSpacing: -0.5), + ).expanded, + if (logout != null) + actionButton(context, t, title: "Logout".needTranslation, icon: AppAssets.logout).onPress(logout!), + if (report != null) + actionButton(context, t, title: "Report".needTranslation, icon: AppAssets.report_icon).onPress(report!), + if (history != null) + actionButton(context, t, title: "History".needTranslation, icon: AppAssets.insurance_history_icon) + .onPress(history!), + if (instructions != null) + actionButton(context, t, title: "Instructions".needTranslation, icon: AppAssets.requests).onPress(instructions!), + if (requests != null) + actionButton(context, t, title: "Requests".needTranslation, icon: AppAssets.insurance_history_icon) + .onPress(requests!), + if (search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(search!).paddingOnly(right: 24), + if (trailing != null) trailing!, + ], + )), + ), + ], + ); + }, + ), + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) => child, + childCount: 1, + ), + ), + ], + ).expanded, + if (bottomChild != null) bottomChild! + ], + ), + ); + } + + Widget actionButton(BuildContext context, double t, {required String title, required String icon}) { + return AnimatedSize( + duration: Duration(milliseconds: 150), + child: Container( + height: 40.h, + padding: EdgeInsets.all(8.w), + margin: EdgeInsets.only(right: 24.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.secondaryLightRedColor, + borderRadius: 10.r, + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + spacing: 8.h, + children: [ + Utils.buildSvgWithAssets(icon: icon, iconColor: AppColors.primaryRedColor), + if (t == 1) + Text( + title, + style: context.dynamicTextStyle( + color: AppColors.primaryRedColor, + letterSpacing: -0.4, + fontSize: (14 - (2 * (1 - t))).f, + fontWeight: FontWeight.lerp( + FontWeight.w300, + FontWeight.w500, + t, + )!, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/arrow_back.dart b/lib/widgets/arrow_back.dart index 56d46e8..cf3e52e 100644 --- a/lib/widgets/arrow_back.dart +++ b/lib/widgets/arrow_back.dart @@ -5,7 +5,7 @@ class ArrowBack extends StatelessWidget { final Function? onTap; final Color color; - ArrowBack({Key? key, this.onTap, this.color = whiteColor}) : super(key: key); + ArrowBack({Key? key, this.onTap, this.color = AppColors.whiteColor}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/widgets/attachment_options.dart b/lib/widgets/attachment_options.dart index 7848bdd..64c2485 100644 --- a/lib/widgets/attachment_options.dart +++ b/lib/widgets/attachment_options.dart @@ -44,14 +44,16 @@ class AttachmentOptions extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SvgPicture.asset("assets/images/$icon", color: mainPurple,), + SvgPicture.asset( + "assets/images/$icon", + ), title.toText11(isBold: true), ], ).paddingOnly(left: 13, right: 13, top: 16, bottom: 12).expanded.objectContainerBorderView( disablePadding: true, radius: 10, - color: greyF7Color.withOpacity(.48), - borderColor: lightGreyEFColor.withOpacity(.48), + color: AppColors.greyF7Color.withOpacity(.48), + borderColor: AppColors.lightGreyEFColor.withOpacity(.48), ), ); } diff --git a/lib/widgets/bottom_navigation/bottom_navigation.dart b/lib/widgets/bottom_navigation/bottom_navigation.dart new file mode 100644 index 0000000..a3e117f --- /dev/null +++ b/lib/widgets/bottom_navigation/bottom_navigation.dart @@ -0,0 +1,103 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class BottomNavigation extends StatelessWidget { + final int currentIndex; + final ValueChanged onTap; + + const BottomNavigation({super.key, required this.currentIndex, required this.onTap}); + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + final items = [ + BottomNavItem(icon: AppAssets.homeBottom, label: LocaleKeys.home.tr(context: context)), + appState.isAuthenticated + ? BottomNavItem(icon: AppAssets.myFilesBottom, label: LocaleKeys.myFiles.tr(context: context)) + : BottomNavItem(icon: AppAssets.feedback, label: LocaleKeys.feedback.tr()), + BottomNavItem( + icon: AppAssets.bookAppoBottom, + label: LocaleKeys.appointment.tr(context: context), + iconSize: 27, + isSpecial: true, + ), + appState.isAuthenticated + ? BottomNavItem(icon: AppAssets.toDoBottom, label: LocaleKeys.todoList.tr(context: context)) + : BottomNavItem(icon: AppAssets.news, label: LocaleKeys.news.tr()), + BottomNavItem(icon: AppAssets.servicesBottom, label: LocaleKeys.services2.tr(context: context)), + ]; + + return Container( + decoration: _containerDecoration, + padding: _containerPadding, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: List.generate( + items.length, + (index) => _buildNavItem(items[index], index), + ), + ), + ); + } + + Widget _buildNavItem(BottomNavItem item, int index) { + final bool isSelected = currentIndex == index; + + return GestureDetector( + onTap: () => onTap(index), + behavior: HitTestBehavior.opaque, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Center( + child: Utils.buildSvgWithAssets( + icon: item.icon, + height: item.iconSize.h, + width: item.iconSize.h, + // iconColor: isSelected ? Colors.black87 : Colors.black87, + ), + ), + const SizedBox(height: 10), + item.label.toText12(fontWeight: FontWeight.w500), + SizedBox(height: item.isSpecial ? 5 : 0) + ], + ), + ); + } +} + +class BottomNavItem { + final String icon; + final String label; + final double iconSize; + final bool isSpecial; + final Color? color; + + const BottomNavItem({ + required this.icon, + required this.label, + this.iconSize = 21, + this.isSpecial = false, + this.color, + }); +} + +// Constants +const EdgeInsets _containerPadding = EdgeInsets.all(15); +const BoxDecoration _containerDecoration = BoxDecoration( + color: Colors.white, + border: Border( + top: BorderSide( + color: AppColors.bottomNAVBorder, + width: 0.5, + ), + ), +); diff --git a/lib/widgets/bottomsheet/exception_bottom_sheet.dart b/lib/widgets/bottomsheet/exception_bottom_sheet.dart new file mode 100644 index 0000000..fe23264 --- /dev/null +++ b/lib/widgets/bottomsheet/exception_bottom_sheet.dart @@ -0,0 +1,126 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +class ExceptionBottomSheet extends StatelessWidget { + final String? title; + final String message; + final bool showOKButton; + final bool showCancel; + final Function() onOkPressed; + final Function()? onCancelPressed; + + const ExceptionBottomSheet({ + super.key, + this.title, + required this.message, + this.showOKButton = true, + this.showCancel = false, + required this.onOkPressed, + this.onCancelPressed, + }); + + @override + Widget build(BuildContext context) { + return SafeArea( + bottom: Platform.isIOS ? false : true, // Adjust for iOS to avoid bottom padding + child: GestureDetector( + onTap: () { + FocusScope.of(context).unfocus(); // Dismiss the keyboard when tapping outside + }, + child: Builder(builder: (context) { + return Directionality( + textDirection: Directionality.of(context), + child: Container( + padding: EdgeInsets.all(24.h), + decoration: BoxDecoration( + color: Color(0xFFF8F8FA), + borderRadius: const BorderRadius.vertical(top: Radius.circular(16)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + (title ?? LocaleKeys.notice.tr()).toText28(), + InkWell( + onTap: () { + Navigator.of(context).pop(); + }, + child: Utils.buildSvgWithAssets( + icon: AppAssets.cross_circle, + height: 24.h, + ), + ) + ], + ), + SizedBox(height: 10.h), + (message).toText16(isBold: false, color: AppColors.textColor), + SizedBox(height: 10.h), + SizedBox(height: 24.h), + if (showOKButton && showCancel) + Row( + children: [ + Expanded( + child: CustomButton( + height: 56.h, + text: LocaleKeys.cancel.tr(), + onPressed: onCancelPressed != null + ? onCancelPressed! + : () { + Navigator.of(context).pop(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + icon: AppAssets.cancel, + iconColor: AppColors.primaryRedColor, + ), + ), + SizedBox(width: 5.h), + Expanded( + child: CustomButton( + height: 56.h, + text: showCancel ? LocaleKeys.confirm.tr() : LocaleKeys.ok.tr(), + onPressed: onOkPressed, + backgroundColor: AppColors.bgGreenColor, + borderColor: AppColors.bgGreenColor, + textColor: Colors.white, + icon: AppAssets.confirm, + ), + ), + ], + ), + if (showOKButton && !showCancel) + Padding( + padding: EdgeInsets.only(bottom: 10.h), + child: CustomButton( + height: 56.h, + text: LocaleKeys.ok.tr(), + onPressed: onOkPressed, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedBorderColor, + textColor: Colors.white, + icon: AppAssets.confirm, + ), + ), + ], + ), + ), + ); + }), + ), + ); + } +} diff --git a/lib/widgets/bottomsheet/generic_bottom_sheet.dart b/lib/widgets/bottomsheet/generic_bottom_sheet.dart new file mode 100644 index 0000000..b6be36c --- /dev/null +++ b/lib/widgets/bottomsheet/generic_bottom_sheet.dart @@ -0,0 +1,177 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; + +class GenericBottomSheet extends StatefulWidget { + final String? countryCode; + final String? initialPhoneNumber; + final List buttons; + final TextEditingController? textController; + final bool isForEmail; + final Function(CountryEnum)? onCountryChange; + final bool isEnableCountryDropdown; + final bool isFromSavedLogin; + final Function(String?)? onChange; + final bool autoFocus; + + // FocusNode myFocusNode; + + const GenericBottomSheet({ + super.key, + this.countryCode = "", + this.initialPhoneNumber = "", + required this.buttons, + this.textController, + this.isForEmail = false, + this.onCountryChange, + this.isEnableCountryDropdown = false, + this.isFromSavedLogin = false, + this.onChange, + this.autoFocus = false, + // required this.myFocusNode + }); + + @override + GenericBottomSheetState createState() => GenericBottomSheetState(); +} + +class GenericBottomSheetState extends State { + late FocusNode _textFieldFocusNode; + + @override + void initState() { + super.initState(); + _textFieldFocusNode = FocusNode(); + + if (!widget.isForEmail && widget.textController != null) { + widget.textController!.text = widget.initialPhoneNumber ?? ""; + } + + // Auto focus the text field if specified + if (widget.autoFocus && widget.textController != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + _textFieldFocusNode.requestFocus(); + }); + } + } + + @override + void dispose() { + _textFieldFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return SafeArea( + top: false, + bottom: Platform.isIOS ? false : true, + child: GestureDetector( + onTap: () { + _textFieldFocusNode.unfocus(); + FocusScope.of(context).unfocus(); + }, + child: Directionality( + textDirection: Directionality.of(context), + child: Container( + padding: EdgeInsets.all(24.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.bgScaffoldColor, + borderRadius: 16.r, + customBorder: BorderRadius.only(topLeft: Radius.circular(16.r), topRight: Radius.circular(16.r)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // Title + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible( + child: widget.isFromSavedLogin + ? LocaleKeys.receiveOtpToast.tr().toText24() + : widget.isForEmail + ? LocaleKeys.enterEmail.tr().toText24() + : LocaleKeys.enterPhoneNumber.tr().toText24()), + InkWell( + onTap: () { + // Dismiss keyboard before closing + _textFieldFocusNode.unfocus(); + FocusScope.of(context).unfocus(); + Navigator.of(context).pop(); + }, + child: Padding( + padding: EdgeInsets.only(top: 10.h), + child: Utils.buildSvgWithAssets( + icon: AppAssets.cross_circle, + height: 24.h, + ), + ), + ), + ], + ), + SizedBox(height: 8.h), + // Subtitle + widget.isFromSavedLogin + ? LocaleKeys.pleaseChooseOption.tr().toText16() + : widget.isForEmail + ? LocaleKeys.enterEmailDesc.tr().toText16() + : LocaleKeys.enterPhoneDesc.tr().toText16(), + + if (widget.isFromSavedLogin) + ...[] + else ...[ + widget.textController != null + ? TextInputWidget( + labelText: widget.isForEmail ? LocaleKeys.email.tr() : LocaleKeys.phoneNumber.tr(), + hintText: widget.isForEmail ? "demo@gmail.com" : "5xxxxxxxx", + controller: widget.textController!, + focusNode: _textFieldFocusNode, + autoFocus: widget.autoFocus, + padding: EdgeInsets.all(8.h), + keyboardType: widget.isForEmail ? TextInputType.emailAddress : TextInputType.number, + onChange: (value) { + if (widget.onChange != null) { + widget.onChange!(value); + } + }, + onCountryChange: (value) { + if (widget.onCountryChange != null) { + widget.onCountryChange!(value); + } + }, + isEnable: true, + isReadOnly: widget.isFromSavedLogin, + prefix: widget.isForEmail ? null : widget.countryCode, + isBorderAllowed: false, + isAllowLeadingIcon: true, + fontSize: 13, + isCountryDropDown: widget.isEnableCountryDropdown, + leadingIcon: widget.isForEmail ? AppAssets.email : AppAssets.smart_phone, + ) + : SizedBox(), + ], + + SizedBox(height: 24.h), + ...widget.buttons, + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/buttons/category_buttons.dart b/lib/widgets/buttons/category_buttons.dart new file mode 100644 index 0000000..f0ceb8f --- /dev/null +++ b/lib/widgets/buttons/category_buttons.dart @@ -0,0 +1,34 @@ +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:flutter/material.dart'; + +import '../../theme/colors.dart'; + +class CategoryButtons extends StatelessWidget { + CategoryButtons({super.key, required this.label, required this.selected, required this.onTap}); + + late String label; + late bool selected; + late Function onTap; + + @override + Widget build(BuildContext context) { + return Expanded( + child: InkWell( + onTap: () { + onTap(); + }, + child: Container( + height: 64.h, + decoration: BoxDecoration( + color: selected ? AppColors.mainPurple : Colors.grey.shade200, + borderRadius: BorderRadius.circular(16), + ), + child: Center( + child: label.toText13(color: selected ? Colors.white : Colors.black, isBold: true), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/buttons/custom_button.dart b/lib/widgets/buttons/custom_button.dart new file mode 100644 index 0000000..f236bd9 --- /dev/null +++ b/lib/widgets/buttons/custom_button.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; + +class CustomButton extends StatelessWidget { + final String text; + final String? icon; + final VoidCallback onPressed; + final Color backgroundColor; + final Color borderColor; + final Color textColor; + final double? borderRadius; + final double borderWidth; + final EdgeInsetsGeometry padding; + final double? fontSize; + final String? fontFamily; + final FontWeight fontWeight; + final bool isDisabled; + final Color? iconColor; + final double? height; + final double? width; + final double? iconSize; + final TextOverflow? textOverflow; + final BorderSide? borderSide; + + const CustomButton({ + super.key, + required this.text, + required this.onPressed, + this.backgroundColor = const Color(0xFFED1C2B), + this.borderColor = const Color(0xFFED1C2B), + this.textColor = Colors.white, + this.borderRadius, + this.borderWidth = 2, + this.padding = const EdgeInsets.fromLTRB(8, 10, 8, 10), + this.fontSize, + this.fontFamily, + this.fontWeight = FontWeight.w500, + this.isDisabled = false, + this.icon, + this.iconColor = Colors.white, + this.height, + this.width, + this.iconSize, + this.textOverflow, + this.borderSide, + }); + + @override + Widget build(BuildContext context) { + final radius = borderRadius ?? (12.r); + final iconS = iconSize ?? (24.h); + final fontS = fontSize ?? (16.f); + return GestureDetector( + onTap: isDisabled ? null : onPressed, + child: Container( + height: height == null + ? 56.h + : (isFoldable || isTablet) + ? height! + 10.h + : height, + width: width, + padding: padding, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: isDisabled ? backgroundColor.withOpacity(.5) : backgroundColor, + borderRadius: radius, + customBorder: BorderRadius.circular(radius), + side: borderSide ?? BorderSide(width: borderWidth.h, color: isDisabled ? borderColor.withValues(alpha: 0.5) : borderColor)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (icon != null) + Padding( + padding: text.isNotEmpty ? EdgeInsets.only(right: 8.h, left: 8.h) : EdgeInsets.zero, + child: Utils.buildSvgWithAssets(icon: icon!, iconColor: iconColor, isDisabled: isDisabled, width: iconS, height: iconS), + ), + Visibility( + visible: text.isNotEmpty, + child: Padding( + padding: EdgeInsets.only(top: 0), + child: Text( + text, + overflow: textOverflow, + style: context.dynamicTextStyle( + fontSize: fontS, + color: isDisabled ? textColor.withOpacity(0.5) : textColor, + letterSpacing: 0, + fontWeight: fontWeight, + ), + ), + ), + ), + ], + ), + )); + } +} diff --git a/lib/widgets/buttons/default_button.dart b/lib/widgets/buttons/default_button.dart new file mode 100644 index 0000000..eb02c38 --- /dev/null +++ b/lib/widgets/buttons/default_button.dart @@ -0,0 +1,133 @@ +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +extension WithContainer on Widget { + Widget get insideContainer => Container( + color: Colors.white, + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), + child: this, + ); +} + +class DefaultButton extends StatelessWidget { + final String text; + final VoidCallback? onPress; + final Color textColor; + final Color? color; + final Color? disabledColor; + final IconData? iconData; + final String? svgIcon; + final double? fontSize; + final bool isTextExpanded; + final int count; + final List? colors; + final double height; + final double borderRadius; + + const DefaultButton(this.text, this.onPress, + {Key? key, + this.color, + this.isTextExpanded = true, + this.svgIcon, + this.disabledColor, + this.count = 0, + this.textColor = Colors.white, + this.iconData, + this.fontSize, + this.colors, + this.height = 50, + this.borderRadius = 100}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onPress, + child: Container( + height: height, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(borderRadius), + gradient: onPress == null + ? LinearGradient( + colors: [ + disabledColor ?? const Color(0xffEAEAEA), + disabledColor ?? const Color(0xffEAEAEA), + ], + ) + : LinearGradient( + transform: const GradientRotation(.83), + begin: Alignment.topRight, + end: Alignment.bottomLeft, + colors: colors ?? + [ + AppColors.buttonColor, + AppColors.buttonColor, + ], + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (iconData != null) Icon(iconData, color: textColor), + if (svgIcon != null) SvgPicture.asset(svgIcon ?? "", color: textColor), + if (!isTextExpanded) + Padding( + padding: EdgeInsets.only( + left: (iconData ?? svgIcon) != null ? 6 : 0, + ), + child: Text( + text, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: fontSize ?? 18.f, + fontWeight: FontWeight.w600, + color: textColor, + letterSpacing: -0.48, + ), + ), + ), + if (isTextExpanded) + Expanded( + child: Text( + text, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: fontSize ?? 18.f, + fontWeight: FontWeight.w600, + color: textColor, + letterSpacing: -0.48, + ), + ), + ), + if (count > 0) + Align( + alignment: Alignment.topCenter, + child: Container( + margin: const EdgeInsets.only(top: 6, bottom: 6), + padding: const EdgeInsets.only(left: 5, right: 5), + alignment: Alignment.center, + height: 16, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + color: Colors.white, + ), + child: Text( + "$count", + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w700, + color: Color(0xffD02127), + letterSpacing: -0.6, + ), + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/category_buttons.dart b/lib/widgets/category_buttons.dart deleted file mode 100644 index 331c2e0..0000000 --- a/lib/widgets/category_buttons.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; -import 'package:flutter/material.dart'; - -import '../theme/colors.dart'; - -class CategoryButtons extends StatelessWidget { - CategoryButtons({super.key, required this.label, required this.selected, required this.onTap}); - - late String label; - late bool selected; - late Function onTap; - - @override - Widget build(BuildContext context) { - return Expanded( - child: InkWell( - onTap: () { - onTap(); - }, - child: Container( - height: 64.h, - decoration: BoxDecoration( - color: selected ? mainPurple : Colors.grey.shade200, - borderRadius: BorderRadius.circular(16), - ), - child: Center( - child: label.toText13(color: selected ? Colors.white : Colors.black, isBold: true), - ), - ), - ), - ); - } -} diff --git a/lib/widgets/chip/app_custom_chip_widget.dart b/lib/widgets/chip/app_custom_chip_widget.dart new file mode 100644 index 0000000..f090f4f --- /dev/null +++ b/lib/widgets/chip/app_custom_chip_widget.dart @@ -0,0 +1,119 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:smooth_corner/smooth_corner.dart'; + +class AppCustomChipWidget extends StatelessWidget { + const AppCustomChipWidget({ + super.key, + this.labelText, + this.textColor = AppColors.textColor, + this.backgroundColor = AppColors.greyColor, + this.iconSize, + this.icon = "", + this.iconColor = AppColors.textColor, + this.richText, + this.iconHasColor = true, + this.shape, + this.deleteIcon, + this.deleteIconSize, + this.deleteIconColor = AppColors.textColor, + this.deleteIconHasColor = false, + this.padding = EdgeInsets.zero, + this.onChipTap, + this.labelPadding, + }); + + final String? labelText; + final Widget? richText; + final Color? textColor; + final Color? backgroundColor; + final double? iconSize; + final String icon; + final String? deleteIcon; + final Size? deleteIconSize; + final Color iconColor; + final Color? deleteIconColor; + final bool iconHasColor; + final bool deleteIconHasColor; + final OutlinedBorder? shape; + final EdgeInsets? padding; + final EdgeInsetsDirectional? labelPadding; + final void Function()? onChipTap; + + @override + Widget build(BuildContext context) { + final iconS = iconSize ?? 12.w; + return GestureDetector( + onTap: onChipTap, + child: ChipTheme( + data: ChipThemeData( + padding: EdgeInsets.zero, + shape: SmoothRectangleBorder( + side: BorderSide( + width: 10.w, + color: Colors.transparent, // Crucially, set color to transparent + style: BorderStyle.none, + ), + borderRadius: BorderRadius.circular(isFoldable || isTablet ? 6.r : 8.r), + ), + ), + child: icon.isNotEmpty + ? Chip( + avatar: icon.isNotEmpty + ? Padding( + padding: EdgeInsets.only(left: 8.w, right: 6.w), + child: Utils.buildSvgWithAssets( + icon: icon, + width: iconS, + height: iconS, + iconColor: iconHasColor ? iconColor : null, + fit: BoxFit.contain, + ), + ) + : SizedBox.shrink(), + avatarBoxConstraints: BoxConstraints(), + label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), + padding: EdgeInsets.zero, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + labelPadding: EdgeInsetsDirectional.only(end: 8.w), + backgroundColor: backgroundColor, + shape: shape ?? + SmoothRectangleBorder( + borderRadius: BorderRadius.circular(8.r), + smoothness: 10, + side: BorderSide(color: AppColors.transparent, width: 1.5), + ), + deleteIcon: deleteIcon?.isNotEmpty == true + ? Utils.buildSvgWithAssets( + icon: deleteIcon!, + width: iconS, + height: iconS, + iconColor: deleteIconHasColor ? deleteIconColor : null, + ) + : null, + onDeleted: deleteIcon?.isNotEmpty == true ? () {} : null, + ) + : Chip( + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), + padding: EdgeInsets.zero, + backgroundColor: backgroundColor, + shape: shape ?? + SmoothRectangleBorder( + borderRadius: BorderRadius.circular(8.r), + smoothness: 10, + side: BorderSide(color: AppColors.transparent, width: 1.5), + ), + labelPadding: EdgeInsetsDirectional.only(start: 8.w, end: 8.w), + deleteIcon: deleteIcon?.isNotEmpty == true + ? Utils.buildSvgWithAssets(icon: deleteIcon!, width: iconS, height: iconS, iconColor: deleteIconHasColor ? deleteIconColor : null) + : null, + onDeleted: deleteIcon?.isNotEmpty == true ? () {} : null, + ), + ), + ); + } +} diff --git a/lib/widgets/chip/custom_chip_widget.dart b/lib/widgets/chip/custom_chip_widget.dart new file mode 100644 index 0000000..5dee4f0 --- /dev/null +++ b/lib/widgets/chip/custom_chip_widget.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; + +class CustomChipWidget extends StatelessWidget { + final ChipTypeEnum chipType; + final String chipText; + final String? iconAsset; + final VoidCallback? onTap; + final bool isSelected; + final double borderRadius; + final EdgeInsetsGeometry padding; + final Color? backgroundColor; + final Color? textColor; + final Color? borderColor; + final bool isShowBorder; + final double? height; + + const CustomChipWidget({ + super.key, + required this.chipType, + required this.chipText, + this.iconAsset, + this.onTap, + this.isSelected = false, + this.borderRadius = 12, + this.padding = const EdgeInsets.all(8), + this.backgroundColor, + this.textColor, + this.borderColor, + this.isShowBorder = false, + this.height, + }); + + @override + Widget build(BuildContext context) { + final hasIcon = iconAsset != null; + final hasOnTap = onTap != null || hasIcon; + + return Container( + height: height, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(borderRadius), + color: isSelected ? chipType.color : backgroundColor ?? chipType.backgroundColor, + border: isShowBorder + ? Border.all( + color: chipType.color, + width: isSelected ? 0 : 1, + ) + : null, + ), + child: InkWell( + onTap: hasOnTap ? onTap : null, + borderRadius: BorderRadius.circular(borderRadius), + child: Container( + padding: padding, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(borderRadius), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (iconAsset != null) ...[ + Utils.buildSvgWithAssets(icon: iconAsset!), + SizedBox(width: 4.h), + ], + chipText.toText10(isBold: true, color: isSelected ? Colors.white : textColor ?? chipType.color, maxlines: 1, weight: FontWeight.w500, letterSpacing: -0.5), + ], + ), + ), + ), + ); + } +} diff --git a/lib/widgets/common_bottom_sheet.dart b/lib/widgets/common_bottom_sheet.dart new file mode 100644 index 0000000..3aaefe7 --- /dev/null +++ b/lib/widgets/common_bottom_sheet.dart @@ -0,0 +1,248 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +void showCommonBottomSheet(BuildContext context, + {required Widget child, + Function(String?)? callBackFunc, + String? title, + required double height, + bool isCloseButtonVisible = true, + bool isFullScreen = true, + bool isDismissible = true, + bool isSuccessDialog = false}) { + showModalBottomSheet( + sheetAnimationStyle: AnimationStyle( + duration: Duration(milliseconds: 500), // Custom animation duration + reverseDuration: Duration(milliseconds: 300), // Custom reverse animation duration + ), + context: context, + isScrollControlled: true, + showDragHandle: false, + isDismissible: isDismissible, + backgroundColor: isSuccessDialog ? AppColors.whiteColor : AppColors.scaffoldBgColor, + builder: (BuildContext context) { + return Container( + height: height, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.scaffoldBgColor, borderRadius: 24.h), + child: ButtonSheetContent( + title: title!, + isCloseButtonVisible: isCloseButtonVisible, + isFullScreen: isFullScreen, + child: child, + ), + ); + }).then((value) { + if (value != null) { + callBackFunc!(value); + } + }); +} + +class ButtonSheetContent extends StatelessWidget { + final Widget child; + final String title; + final bool isCloseButtonVisible; + final bool isFullScreen; + + const ButtonSheetContent({super.key, required this.child, required this.isCloseButtonVisible, required this.title, required this.isFullScreen}); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // SizedBox( + // height: 20.h, + // ), + // Center( + // child: Container( + // margin: const EdgeInsets.only(top: 18, bottom: 12), + // height: 4, + // width: 40.h, + // decoration: BoxDecoration( + // color: Colors.grey[400], + // borderRadius: BorderRadius.circular(2), + // ), + // ), + // ), + + // Close button + isCloseButtonVisible && isFullScreen + ? Column(children: [ + SizedBox( + height: 40.h, + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 16, + ), + child: Utils.buildSvgWithAssets(icon: AppAssets.closeBottomNav, width: 32, height: 32).onPress(() { + Navigator.of(context).pop(); + }), + ) + ]) + : SizedBox(), + + isFullScreen + ? Column( + children: [ + SizedBox(height: 20.h), + Padding(padding: EdgeInsets.symmetric(horizontal: 16.h), child: title.toText24(isBold: true)), + SizedBox(height: 16.h), + ], + ) + : SizedBox(), + + Expanded(child: child) + ], + ); + } +} + +void showCommonBottomSheetWithoutHeight( + BuildContext context, { + required Widget child, + required VoidCallback callBackFunc, + String title = "", + bool isCloseButtonVisible = true, + bool isFullScreen = true, + bool isDismissible = true, + Widget? titleWidget, + bool useSafeArea = false, + bool hasBottomPadding = true, + Color backgroundColor = AppColors.bottomSheetBgColor, + VoidCallback? onCloseClicked +}) { + showModalBottomSheet( + sheetAnimationStyle: AnimationStyle( + duration: Duration(milliseconds: 500), + reverseDuration: Duration(milliseconds: 300), + ), + constraints: BoxConstraints( + maxWidth: MediaQuery.of(context).size.width, // Full width + ), + context: context, + isScrollControlled: true, + showDragHandle: false, + isDismissible: isDismissible, + backgroundColor: backgroundColor, + useSafeArea: useSafeArea, + builder: (BuildContext context) { + return SafeArea( + top: false, + left: false, + right: false, + bottom: hasBottomPadding, + child: Padding( + padding: EdgeInsets.only( + bottom: MediaQuery.of(context).viewInsets.bottom, + ), + child: SingleChildScrollView( + physics: ClampingScrollPhysics(), + child: isCloseButtonVisible + ? Container( + padding: EdgeInsets.only( + left: 24, + top: 24, + right: 24, + bottom: 12, + ), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.bottomSheetBgColor, + borderRadius: 24.h, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + titleWidget ?? + Expanded( + child: title.toText20(weight: FontWeight.w600), + ), + Utils.buildSvgWithAssets( + icon: AppAssets.close_bottom_sheet_icon, + iconColor: Color(0xff2B353E), + ).onPress(() { + onCloseClicked?.call(); + Navigator.of(context).pop(); + }), + ], + ), + SizedBox(height: 16.h), + child, + ], + ), + ) + : child, + ), + ), + ); + }, + ).then((value) { + callBackFunc(); + }); +} + +// void showCommonBottomSheetWithoutHeight( +// BuildContext context, { +// required Widget child, +// required VoidCallback callBackFunc, +// String title = "", +// bool isCloseButtonVisible = true, +// bool isFullScreen = true, +// bool isDismissible = true, +// Widget? titleWidget, +// bool useSafeArea = false, +// +// }) { +// showModalBottomSheet( +// sheetAnimationStyle: AnimationStyle( +// duration: Duration(milliseconds: 500), // Custom animation duration +// reverseDuration: Duration(milliseconds: 300), // Custom reverse animation duration +// ), +// context: context, +// isScrollControlled: true, +// showDragHandle: false, +// isDismissible: isDismissible, +// backgroundColor: AppColors.bottomSheetBgColor, +// useSafeArea: useSafeArea, +// builder: (BuildContext context) { +// return SafeArea( +// top: false, +// left: false, +// right: false, +// child: isCloseButtonVisible +// ? Container( +// padding: EdgeInsets.only(left: 24, top: 24, right: 24, bottom: 12), +// decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.bottomSheetBgColor, borderRadius: 24.h), +// child: Column( +// mainAxisSize: MainAxisSize.min, +// spacing: 16.h, +// children: [ +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// titleWidget ?? Expanded(child: title.toText20(weight: FontWeight.w600)), +// Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, iconColor: Color(0xff2B353E)).onPress(() { +// Navigator.of(context).pop(); +// }), +// ], +// ), +// child, +// ], +// )) +// : child, +// ); +// }).then((value) { +// callBackFunc(); +// }); +// } diff --git a/lib/widgets/custom_dropdown.dart b/lib/widgets/custom_dropdown.dart deleted file mode 100644 index b1234ef..0000000 --- a/lib/widgets/custom_dropdown.dart +++ /dev/null @@ -1,73 +0,0 @@ -// Dropdown Field -import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; -import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; -import 'package:flutter/material.dart'; - -import '../theme/colors.dart'; - -class DropdownField extends StatelessWidget { - late String hint; - late T? value; - late IconData? icon; - late List? items; - late ValueChanged? onChanged; - late bool isEnabled; - - final String keyName = "dropdown_field"; - - DropdownField({ - required this.hint, - this.value, - this.icon, - this.items, - this.onChanged, - this.isEnabled = true, - }); - - @override - Widget build(BuildContext context) { - return Container( - height: 54.h, - margin: const EdgeInsets.symmetric(vertical: 8), - padding: const EdgeInsets.symmetric(horizontal: 16), - decoration: BoxDecoration( - color: const Color(0xFFF4F5F7), - borderRadius: BorderRadius.circular(13), - ), - child: Row( - children: [ - if (icon != null) Icon(icon, color: mainPurple), - if (icon != null) SizedBox(width: 8.h), - Expanded( - child: items != null - ? DropdownButton( - value: value, - isExpanded: true, - icon: const Icon(Icons.keyboard_arrow_down_rounded, color: mainPurple), - underline: const SizedBox(), - items: items! - .map( - (item) => DropdownMenuItem( - value: item, - child: item.toString().toText15(isBold: true), - ), - ) - .toList(), - hint: hint.toText15(color: Colors.black45), - onChanged: onChanged, - ) - : Text( - value?.toString() ?? hint, - style: TextStyle( - color: value != null ? Colors.black : Colors.black45, - fontWeight: value != null ? FontWeight.bold : FontWeight.normal, - fontSize: 15, - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/widgets/custom_tab_bar.dart b/lib/widgets/custom_tab_bar.dart new file mode 100644 index 0000000..35aafa4 --- /dev/null +++ b/lib/widgets/custom_tab_bar.dart @@ -0,0 +1,121 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class CustomTabBarModel { + String? image; + String title; + + CustomTabBarModel(this.image, this.title); +} + +class CustomTabBar extends StatefulWidget { + final int initialIndex = 0; + final List tabs; + final Color activeTextColor; + final Color activeBackgroundColor; + final Color inActiveTextColor; + final Color inActiveBackgroundColor; + final Function(int)? onTabChange; + + const CustomTabBar({ + super.key, + required this.tabs, + this.activeTextColor = const Color(0xff2E3039), + this.inActiveTextColor = const Color(0xff898A8D), + this.activeBackgroundColor = const Color(0x142E3039), + this.inActiveBackgroundColor = Colors.white, + this.onTabChange, + }); + + @override + CustomTabBarState createState() => CustomTabBarState(); +} + +class CustomTabBarState extends State { + int selectedIndex = 0; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + void callBackCurrentIndex() { + if (widget.onTabChange != null) widget.onTabChange!(selectedIndex); + } + + @override + Widget build(BuildContext context) { + late Widget parentWidget; + + if (widget.tabs.length > 3) { + parentWidget = ListView.separated( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.zero, + physics: const BouncingScrollPhysics(), + itemBuilder: (cxt, index) => myTab(widget.tabs[index], index), + separatorBuilder: (cxt, index) => 4.width, + itemCount: widget.tabs.length, + ); + } else { + parentWidget = Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4.w, + children: [for (int i = 0; i < widget.tabs.length; i++) myTab(widget.tabs[i], i).expanded], + ); + } + + return Container( + height: 62.h, + padding: EdgeInsets.all(4.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 10.r, + ), + child: Center(child: parentWidget)); + } + + Widget myTab(CustomTabBarModel tabBar, int currentIndex) { + bool isSelected = selectedIndex == currentIndex; + return Container( + height: (isTablet || isFoldable) ? 60.h : 54.h, + padding: EdgeInsets.only(top: 4.h, bottom: 4.h, left: 14.w, right: 14.w), + alignment: Alignment.center, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: isSelected ? widget.activeBackgroundColor : widget.inActiveBackgroundColor, + borderRadius: 10.r, + ), + child: Row( + mainAxisSize: MainAxisSize.min, + spacing: 4.w, + children: [ + if (tabBar.image != null) + Utils.buildSvgWithAssets( + icon: tabBar.image!, + height: 18.h, + width: 18.w, + iconColor: isSelected ? widget.activeTextColor : widget.inActiveTextColor, + ), + tabBar.title.toText13( + weight: isSelected ? FontWeight.w600 : FontWeight.w500, + color: isSelected ? widget.activeTextColor : widget.inActiveTextColor, + letterSpacing: isSelected ? -0.3 : -0.1), + ], + )).onPress(() { + setState(() { + selectedIndex = currentIndex; + }); + callBackCurrentIndex(); + }); + } +} diff --git a/lib/widgets/date_range_selector/date_range_calender.dart b/lib/widgets/date_range_selector/date_range_calender.dart new file mode 100644 index 0000000..8620ab5 --- /dev/null +++ b/lib/widgets/date_range_selector/date_range_calender.dart @@ -0,0 +1,350 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/lab/models/Range.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart' show DateRangeSelectorRangeViewModel; +import 'package:provider/provider.dart'; +import 'package:syncfusion_flutter_calendar/calendar.dart'; +import 'package:syncfusion_flutter_datepicker/datepicker.dart'; + +typedef OnRangeSelected = void Function(DateTime? start, DateTime? end); + +class DateRangeSelector extends StatefulWidget { + final OnRangeSelected onRangeSelected; + + const DateRangeSelector({super.key, required this.onRangeSelected}); + + @override + State createState() => _DateRangeSelectorState(); +} + +class _DateRangeSelectorState extends State { + late DateRangePickerController _calendarController; + DateTime? start; + DateTime? end; + late DateRangeSelectorRangeViewModel model; + @override + void initState() { + _calendarController = DateRangePickerController(); + scheduleMicrotask(() { + _calendarController.selectedRange = PickerDateRange(model.fromDate,model.toDate); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + model = Provider.of(context); + + + _calendarController.selectedRange = PickerDateRange(model.fromDate,model.toDate); + + return Padding( + padding: EdgeInsets.symmetric(horizontal: 0.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Consumer( + builder: (_, model, __) => selectionChip(model), + ).paddingOnly(bottom: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + padding: EdgeInsets.all( + 16.h + ), + child: Column( + children: [ + Row( + children: [ + fromDateComponent(), + Text( + LocaleKeys.to.tr(), + style: TextStyle( + color: AppColors.calenderTextColor, + fontSize: 14.h, + fontWeight: FontWeight.w500, + letterSpacing: -.2 + ), + ).paddingSymmetrical(24.h,0.h), + toDateComponent(), + ], + ), + Divider( + color: AppColors.spacerLineColor, + thickness: 1, + ).paddingOnly(bottom: 16.h, top: 16.h), + Material( + color: Colors.white, + child: SfDateRangePicker( + controller: _calendarController, + selectionMode: DateRangePickerSelectionMode.range, + showNavigationArrow: true, + headerHeight: 40.h, + backgroundColor: Colors.white, + headerStyle: DateRangePickerHeaderStyle( + backgroundColor: Colors.white, + textAlign: TextAlign.start, + textStyle: TextStyle( + fontSize: 18.f, + fontWeight: FontWeight.w600, + letterSpacing: -0.46, + color: AppColors.primaryRedColor, + fontFamily: "Poppins", + ), + ), + monthViewSettings: DateRangePickerMonthViewSettings( + viewHeaderStyle: DateRangePickerViewHeaderStyle( + backgroundColor: Colors.white, + textStyle: TextStyle( + fontSize: 14.f, + fontWeight: FontWeight.w600, + letterSpacing: -0.46, + color: AppColors.textColor, + ), + ), + showTrailingAndLeadingDates: false, + dayFormat: "EEE", + ), + selectionShape: DateRangePickerSelectionShape.rectangle, + selectionRadius: 12.h, + selectionColor: AppColors.transparent, + startRangeSelectionColor: AppColors.primaryRedColor, + endRangeSelectionColor: AppColors.primaryRedColor, + rangeSelectionColor: + AppColors.primaryRedColor.withOpacity(0.1), + todayHighlightColor: Colors.transparent, + monthCellStyle: DateRangePickerMonthCellStyle( + textStyle: TextStyle( + fontSize: 12.f, + color: AppColors.textColor, + ), + todayTextStyle: TextStyle( + color: AppColors.textColor, + fontWeight: FontWeight.bold, + ), + ), + onSelectionChanged: + (DateRangePickerSelectionChangedArgs args) { + print("the value is ${args.value}"); + if (args.value is PickerDateRange) { + final PickerDateRange range = args.value; + start = range.startDate; + end = range.endDate; + model.fromDate = start; + model.toDate = end; + if(end == null) { + scheduleMicrotask((){ + model.resetCurrentlySelectedRange(); + }); + + } + } + }, + ), + ), + ], + ), + ), + Row( + children: [ + Consumer( + builder: (_, model, __) => Visibility( + visible: (model.fromDate != null || model.toDate != null), + child: Expanded( + child: Row( + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: () { + _calendarController.selectedRange = null; + _calendarController.selectedDate = null; + model.flush(); + Navigator.of(context).pop(); + widget.onRangeSelected(null, null); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + icon: AppAssets.cancel, + iconColor: AppColors.primaryRedColor, + height: 56.h, + ), + ), + SizedBox(width: 16.h,) + ], + ), + ), + ), + ), + Expanded( + child: CustomButton( + text: LocaleKeys.search.tr(), + onPressed: () { + Navigator.of(context).pop(); + widget.onRangeSelected(model.fromDate, model.toDate); + }, + backgroundColor: AppColors.lightGreenButtonColor, + borderColor: Colors.transparent, + textColor: AppColors.textGreenColor, + icon: AppAssets.reminder_bell, + iconColor: AppColors.textGreenColor, + + height: 56.h, + ), + ), + ], + ).paddingOnly(top: 24.h), + ], + ), + ); + } + + fromDateComponent() { + return Consumer( + builder: (_, model, __) { + return displayDate(LocaleKeys.startDate.tr(), + model.getDateString(model.fromDate), model.fromDate == null); + }, + ); + } + + toDateComponent() { + return Consumer( + builder: (_, model, __) { + return displayDate(LocaleKeys.endDate.tr(), + model.getDateString(model.toDate), model.toDate == null); + }, + ); + } + + displayDate(String label, String? date, bool isNotSelected) => Expanded( + child: Row( + spacing: 12.h, + children: [ + Utils.buildSvgWithAssets( + icon: AppAssets.rangeCalendar, + iconColor: isNotSelected ? AppColors.borderOnlyColor: AppColors.blackColor , + height: 24, + width: 24), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: TextStyle( + color: AppColors.inputLabelTextColor, + fontSize: 12.h, + fontWeight: FontWeight.w500, + ), + ), + Text( + date!, + style: TextStyle( + color: AppColors.textColor, + fontSize: 14.h, + fontWeight: FontWeight.w500, + ), + ) + ], + ) + ], + ), + ); + + selectionChip(DateRangeSelectorRangeViewModel model) { + return Row( + spacing: 8.h, + children: [ + AppCustomChipWidget( + labelText: "This Week".needTranslation, + backgroundColor: model.currentlySelectedRange == Range.WEEKLY + ? AppColors.primaryRedColor.withOpacity(0.1) + : AppColors.whiteColor, + shape: RoundedRectangleBorder( + side: BorderSide( + color: model.currentlySelectedRange == Range.WEEKLY + ? AppColors.primaryRedBorderColor + : AppColors.chipBorderColorOpacity20, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + ).onPress((){ + _calendarController.selectedRange = null; + model.currentlySelectedRange = Range.WEEKLY; + model.calculateDatesFromRange(); + }), + AppCustomChipWidget( + labelText: "Last Month".needTranslation, + backgroundColor: model.currentlySelectedRange == Range.LAST_MONTH + ? AppColors.primaryRedColor.withOpacity(0.1) + : AppColors.whiteColor, + shape: RoundedRectangleBorder( + side: BorderSide( + color: model.currentlySelectedRange == Range.LAST_MONTH + ? AppColors.primaryRedBorderColor + : AppColors.chipBorderColorOpacity20, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + ).onPress((){ + _calendarController.selectedRange = null; + model.currentlySelectedRange = Range.LAST_MONTH; + model.calculateDatesFromRange(); + }), + AppCustomChipWidget( + labelText: "Last 6 Months".needTranslation, + backgroundColor: model.currentlySelectedRange == Range.LAST_6MONTH + ? AppColors.primaryRedColor.withOpacity(0.1) + : AppColors.whiteColor, + shape: RoundedRectangleBorder( + side: BorderSide( + color: model.currentlySelectedRange == Range.LAST_6MONTH + ? AppColors.primaryRedBorderColor + : AppColors.chipBorderColorOpacity20, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + ).onPress((){ + _calendarController.selectedRange = null; + model.currentlySelectedRange = Range.LAST_6MONTH; + model.calculateDatesFromRange(); + + }), + AppCustomChipWidget( + labelText: "Year ${model.getCurrentYear}", + backgroundColor: model.currentlySelectedRange == Range.THIS_YEAR + ? AppColors.primaryRedColor.withOpacity(0.1) + : AppColors.whiteColor, + shape: RoundedRectangleBorder( + side: BorderSide( + color: model.currentlySelectedRange == Range.THIS_YEAR + ? AppColors.primaryRedBorderColor + : AppColors.chipBorderColorOpacity20, + width: 1, + ), + borderRadius: BorderRadius.circular(10)), + ).onPress((){ + _calendarController.selectedRange = null; + model.currentlySelectedRange = Range.THIS_YEAR; + model.calculateDatesFromRange(); + + }), + ], + ); + } +} diff --git a/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart b/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart new file mode 100644 index 0000000..d295987 --- /dev/null +++ b/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart @@ -0,0 +1,89 @@ +import 'package:dartz/dartz.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/features/lab/models/Range.dart'; + +class DateRangeSelectorRangeViewModel extends ChangeNotifier { + List months = [ + 'Jan', + 'Feb', + 'Mar', + 'April', + 'May', + 'Jun', + 'July', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec' + ]; + + Range? _currentlySelectedRange; + + Range? get currentlySelectedRange => _currentlySelectedRange; + + set currentlySelectedRange(Range? value) { + _currentlySelectedRange = value; + } + + DateTime? _toDate; + + DateTime? get toDate => _toDate; + + set toDate(DateTime? value) { + _toDate = value; + + } + + DateTime? _fromDate; + + DateTime? get fromDate => _fromDate; + + set fromDate(DateTime? value) { + _fromDate = value; + + + } + + DateRangeSelectorRangeViewModel(); + + get getCurrentYear => DateTime.now().year; + + calculateDatesFromRange() { + _toDate = DateTime.now().provideDateOnly(); + switch (_currentlySelectedRange) { + case Range.WEEKLY: + _fromDate = _toDate!.subtract(Duration(days: 7)); + case Range.LAST_MONTH: + _fromDate = _toDate!.subtract(Duration(days: 30)); + case Range.LAST_6MONTH: + _fromDate = _toDate!.subtract(Duration(days: (30 * 6))); + case Range.THIS_YEAR: + _toDate = DateTime(_toDate!.year, DateTime.december, 31); + _fromDate = DateTime(_toDate!.year, DateTime.january, 01); + default: + } + notifyListeners(); + } + + getDateString(DateTime? date){ + if(date == null) return "-"; + + String year = date.year.toString().substring(2); + return '${date.day} ${months[date.month-1]},$year'; + } + + flush(){ + toDate = null; + fromDate = null; + currentlySelectedRange = null; + notifyListeners(); + } + + resetCurrentlySelectedRange(){ + currentlySelectedRange = null; + notifyListeners(); + } + +} diff --git a/lib/widgets/datepicker_widget.dart b/lib/widgets/datepicker_widget.dart new file mode 100644 index 0000000..47c4de6 --- /dev/null +++ b/lib/widgets/datepicker_widget.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; + +class DatePickerWidget extends StatelessWidget { + final String labelText; + final String hintText; + final String? selectedValue; + final Function(String?)? onChange; + final Function(bool)? onCalendarTypeChanged; + final bool isEnable; + final bool isBorderAllowed; + final bool isAllowRadius; + final EdgeInsetsGeometry? padding; + final String lang; + + const DatePickerWidget({ + Key? key, + required this.labelText, + required this.hintText, + this.selectedValue, + this.onChange, + this.onCalendarTypeChanged, + this.isEnable = true, + this.isBorderAllowed = true, + this.isAllowRadius = true, + this.padding, + this.lang = 'en', + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: padding, + alignment: Alignment.center, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: Colors.white, + borderRadius: isAllowRadius ? 15 : null, + side: isBorderAllowed ? BorderSide(color: const Color(0xffefefef), width: 1) : null, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildLabelText(), + _buildDatePicker(context), + ], + ), + ); + } + + Widget _buildLabelText() { + return Text( + labelText, + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + color: Color(0xff898A8D), + letterSpacing: -0.2, + height: 18 / 12, + ), + ); + } + + Widget _buildDatePicker(BuildContext context) { + return GestureDetector( + onTap: isEnable + ? () async { + // bool isGregorian = true; + // final picked = await showHijriGregBottomSheet( + // context, + // switcherIcon: Utils.buildSvgWithAssets(icon: "assets/images/svg/language.svg") + // language: lang, + // fontFamily: "poppins", + // initialShowGregorian: true, + // initialDate: DateTime.now(), + // okWidget: Padding(padding: const EdgeInsets.only(right: 8.0), child: Utils.buildSvgWithAssets(icon: "assets/images/svg/confirm.svg")), + // cancelWidget: Padding(padding: const EdgeInsets.only(right: 8.0), child: Utils.buildSvgWithAssets(icon: "assets/images/svg/cancel.svg", iconColor: Colors.white)), + // onCalendarTypeChanged: (bool value) { + // isGregorian = value; + // }, + // ); + // + // if (picked != null && onChange != null) { + // if (onCalendarTypeChanged != null) { + // onCalendarTypeChanged!.call(isGregorian); + // } + // onChange!(picked.toIso8601String()); + // } + } + : null, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Text( + (selectedValue == null || selectedValue!.isEmpty) ? hintText : selectedValue!, + textAlign: TextAlign.left, + textDirection: TextDirection.ltr, + style: TextStyle( + fontSize: 14, + height: 21 / 14, + fontWeight: FontWeight.w500, + color: (selectedValue != null && selectedValue!.isNotEmpty) ? const Color(0xff2E3039) : const Color(0xffB0B0B0), + letterSpacing: -0.2, + ), + ), + ), + const Icon(Icons.keyboard_arrow_down_outlined), + ], + ), + ); + } +} diff --git a/lib/widgets/default_button.dart b/lib/widgets/default_button.dart deleted file mode 100644 index 2b72762..0000000 --- a/lib/widgets/default_button.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:hmg_patient_app_new/theme/colors.dart'; - -extension WithContainer on Widget { - Widget get insideContainer => Container( - color: Colors.white, - padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), - child: this, - ); -} - -class DefaultButton extends StatelessWidget { - final String text; - final VoidCallback? onPress; - final Color textColor; - final Color? color; - final Color? disabledColor; - final IconData? iconData; - final String? svgIcon; - final double? fontSize; - final bool isTextExpanded; - final int count; - final List? colors; - final double height; - final double borderRadius; - - const DefaultButton(this.text, this.onPress, - {Key? key, - this.color, - this.isTextExpanded = true, - this.svgIcon, - this.disabledColor, - this.count = 0, - this.textColor = Colors.white, - this.iconData, - this.fontSize, - this.colors, - this.height = 50, - this.borderRadius = 100}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: onPress, - child: Container( - height: height, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(borderRadius), - gradient: onPress == null - ? LinearGradient( - colors: [ - disabledColor ?? const Color(0xffEAEAEA), - disabledColor ?? const Color(0xffEAEAEA), - ], - ) - : LinearGradient( - transform: const GradientRotation(.83), - begin: Alignment.topRight, - end: Alignment.bottomLeft, - colors: colors ?? - [ - buttonColor, - buttonColor, - ], - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if (iconData != null) Icon(iconData, color: textColor), - if (svgIcon != null) SvgPicture.asset(svgIcon ?? "", color: textColor), - if (!isTextExpanded) - Padding( - padding: EdgeInsets.only( - left: (iconData ?? svgIcon) != null ? 6 : 0, - ), - child: Text( - text, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: fontSize ?? 18.fSize, - fontWeight: FontWeight.w600, - color: textColor, - letterSpacing: -0.48, - ), - ), - ), - if (isTextExpanded) - Expanded( - child: Text( - text, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: fontSize ?? 18.fSize, - fontWeight: FontWeight.w600, - color: textColor, - letterSpacing: -0.48, - ), - ), - ), - if (count > 0) - Align( - alignment: Alignment.topCenter, - child: Container( - margin: const EdgeInsets.only(top: 6, bottom: 6), - padding: const EdgeInsets.only(left: 5, right: 5), - alignment: Alignment.center, - height: 16, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), - color: Colors.white, - ), - child: Text( - "$count", - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.w700, - color: Color(0xffD02127), - letterSpacing: -0.6, - ), - ), - ), - ) - ], - ), - ), - ); - } -} diff --git a/lib/widgets/dialogs/confirm_dialog.dart b/lib/widgets/dialogs/confirm_dialog.dart index 4ee8c38..f753681 100644 --- a/lib/widgets/dialogs/confirm_dialog.dart +++ b/lib/widgets/dialogs/confirm_dialog.dart @@ -3,7 +3,7 @@ import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/widgets/default_button.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/default_button.dart'; import 'package:flutter/material.dart'; import '../../theme/colors.dart'; @@ -35,13 +35,13 @@ class ConfirmDialog extends StatelessWidget { Expanded( child: Text( title ?? LocaleKeys.confirm.tr(), - style: const TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: blackColor, height: 35 / 24, letterSpacing: -0.96), + style: const TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: AppColors.blackColor, height: 35 / 24, letterSpacing: -0.96), ).paddingOnly(top: 16), ), IconButton( padding: EdgeInsets.zero, icon: const Icon(Icons.close), - color: blackColor, + color: AppColors.blackColor, constraints: const BoxConstraints(), onPressed: () => onCloseTap ?? Navigator.pop(context), // onPressed: () => Navigator.pop(context), @@ -49,7 +49,7 @@ class ConfirmDialog extends StatelessWidget { ], ), 14.height, - message.toText16(color: lightGrayColor), + message.toText16(color: AppColors.lightGrayColor), 28.height, DefaultButton( okTitle ?? LocaleKeys.ok.tr(), diff --git a/lib/widgets/dropdown/country_dropdown_widget.dart b/lib/widgets/dropdown/country_dropdown_widget.dart new file mode 100644 index 0000000..b6191ed --- /dev/null +++ b/lib/widgets/dropdown/country_dropdown_widget.dart @@ -0,0 +1,295 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; + +class CustomCountryDropdown extends StatefulWidget { + final List countryList; + final Function(CountryEnum)? onCountryChange; + final Function(String)? onPhoneNumberChanged; + final bool isFromBottomSheet; + final bool isEnableTextField; + final Widget? textField; + + const CustomCountryDropdown({ + super.key, + required this.countryList, + this.onCountryChange, + this.onPhoneNumberChanged, + this.isFromBottomSheet = false, + this.isEnableTextField = false, + this.textField, + }); + + @override + CustomCountryDropdownState createState() => CustomCountryDropdownState(); +} + +class CustomCountryDropdownState extends State { + CountryEnum? selectedCountry; + late OverlayEntry _overlayEntry; + bool _isDropdownOpen = false; + FocusNode textFocusNode = FocusNode(); + + @override + void initState() { + super.initState(); + selectedCountry = CountryEnum.saudiArabia; + + if (widget.isEnableTextField && widget.isFromBottomSheet) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted && textFocusNode.canRequestFocus) { + FocusScope.of(context).requestFocus(textFocusNode); + } + }); + } + } + + @override + void dispose() { + textFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + AppState appState = getIt.get(); + return Row( + children: [ + GestureDetector( + onTap: () { + if (_isDropdownOpen) { + _closeDropdown(); + } else { + _openDropdown(); + } + }, + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: selectedCountry != null ? selectedCountry!.iconPath : AppAssets.ksa, width: 40.h, height: 40.h), + SizedBox(width: 8.h), + Utils.buildSvgWithAssets(icon: _isDropdownOpen ? AppAssets.dropdow_icon : AppAssets.dropdow_icon), + ], + ), + ), + SizedBox(width: 4.h), + if (widget.isFromBottomSheet) + GestureDetector( + onTap: () { + if (widget.isEnableTextField && textFocusNode.canRequestFocus) { + FocusScope.of(context).requestFocus(textFocusNode); + } + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + LocaleKeys.phoneNumber.tr(), + style: TextStyle(fontSize: 12.f, height: 1.5, fontWeight: FontWeight.w500, letterSpacing: -1), + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + selectedCountry!.countryCode, + style: TextStyle(fontSize: 12.f, fontWeight: FontWeight.w600, letterSpacing: -0.4, height: 1.5), + ), + SizedBox(width: 4.h), + if (widget.isEnableTextField) + SizedBox( + height: 20.h, + width: 200.h, + child: Align( + alignment: Alignment.centerLeft, + child: TextField( + focusNode: textFocusNode, + style: TextStyle(fontSize: 12.f, fontWeight: FontWeight.w600, letterSpacing: -0.4, height: 1.5), + decoration: InputDecoration(hintText: "", isDense: true, border: InputBorder.none, contentPadding: EdgeInsets.zero), + keyboardType: TextInputType.phone, + onChanged: widget.onPhoneNumberChanged, + ), + ), + ), + ], + ) + ], + ), + ), + if (!widget.isFromBottomSheet) + Text( + selectedCountry != null + ? appState.getLanguageCode() == "ar" + ? selectedCountry!.nameArabic + : selectedCountry!.displayName + : LocaleKeys.selectCountry.tr(), + style: TextStyle(fontSize: 14.f, height: 21 / 14, fontWeight: FontWeight.w500, letterSpacing: -0.2), + ), + ], + ); + } + + void _openDropdown() { + if (textFocusNode.hasFocus) { + textFocusNode.unfocus(); + // Wait for keyboard to close before calculating position + Future.delayed(Duration(milliseconds: 300), () { + _showDropdown(); + }); + } else { + _showDropdown(); + } + } + + void _showDropdown() { + AppState appState = getIt.get(); + RenderBox renderBox = context.findRenderObject() as RenderBox; + Offset offset = renderBox.localToGlobal(Offset.zero); + + bool isRtl = appState.getLanguageCode() == "ar"; + double leftPosition = isRtl ? offset.dx + 8 + renderBox.size.width - (!widget.isFromBottomSheet ? renderBox.size.width : 60.h) : offset.dx; + + _overlayEntry = OverlayEntry( + builder: (context) => Stack( + children: [ + Positioned.fill( + child: GestureDetector( + onTap: _closeDropdown, + behavior: HitTestBehavior.translucent, + child: Container(), + ), + ), + Positioned( + top: offset.dy + renderBox.size.height, + left: leftPosition, + width: !widget.isFromBottomSheet ? renderBox.size.width : 60.h, + child: Material( + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 12), + child: Column( + children: widget.countryList + .map( + (country) => GestureDetector( + onTap: () { + setState(() { + selectedCountry = country; + }); + widget.onCountryChange?.call(country); + _closeDropdown(); + }, + child: Container( + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 16.h), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: country.iconPath, width: 38.h, height: 38.h), + if (!widget.isFromBottomSheet) SizedBox(width: 12.h), + if (!widget.isFromBottomSheet) + Text(appState.getLanguageCode() == "ar" ? country.nameArabic : country.displayName, + style: TextStyle(fontSize: 14.f, height: 21 / 14, fontWeight: FontWeight.w500, letterSpacing: -0.2)), + ], + ), + )), + ) + .toList(), + ), + ), + ), + ), + ], + ), + ); + + Overlay.of(context)?.insert(_overlayEntry); + setState(() { + _isDropdownOpen = true; + }); + } + + // void _openDropdown() { + // if (textFocusNode.hasFocus) { + // textFocusNode.unfocus(); + // } + // AppState appState = getIt.get(); + // RenderBox renderBox = context.findRenderObject() as RenderBox; + // Offset offset = renderBox.localToGlobal(Offset.zero); + // + // _overlayEntry = OverlayEntry( + // builder: (context) => Stack( + // children: [ + // Positioned.fill( + // child: GestureDetector( + // onTap: _closeDropdown, + // behavior: HitTestBehavior.translucent, + // child: Container(), + // ), + // ), + // Positioned( + // top: offset.dy + renderBox.size.height, + // left: offset.dx, + // width: !widget.isFromBottomSheet ? renderBox.size.width : 60.h, + // child: Material( + // child: Container( + // decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 12), + // child: Column( + // children: widget.countryList + // .map( + // (country) => GestureDetector( + // onTap: () { + // setState(() { + // selectedCountry = country; + // }); + // widget.onCountryChange?.call(country); + // _closeDropdown(); + // }, + // child: Container( + // padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 8.h), + // decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 16.h), + // child: Row( + // children: [ + // Utils.buildSvgWithAssets(icon: country.iconPath, width: 38.h, height: 38.h), + // if (!widget.isFromBottomSheet) SizedBox(width: 12.h), + // if (!widget.isFromBottomSheet) + // Text(appState.getLanguageCode() == "ar" ? country.nameArabic : country.displayName, + // style: TextStyle(fontSize: 14.fSize, height: 21 / 14, fontWeight: FontWeight.w500, letterSpacing: -0.2)), + // ], + // ), + // )), + // ) + // .toList(), + // ), + // ), + // ), + // ), + // ], + // ), + // ); + // + // Overlay.of(context)?.insert(_overlayEntry); + // setState(() { + // _isDropdownOpen = true; + // }); + // } + + void _closeDropdown() { + _overlayEntry.remove(); + setState(() { + _isDropdownOpen = false; + }); + + if (widget.isEnableTextField && widget.isFromBottomSheet) { + Future.delayed(Duration(milliseconds: 100), () { + if (mounted && textFocusNode.canRequestFocus) { + FocusScope.of(context).requestFocus(textFocusNode); + } + }); + } + } +} diff --git a/lib/widgets/dropdown/dropdown_widget.dart b/lib/widgets/dropdown/dropdown_widget.dart new file mode 100644 index 0000000..b4062e4 --- /dev/null +++ b/lib/widgets/dropdown/dropdown_widget.dart @@ -0,0 +1,158 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart' show Icons, PopupMenuItem, showMenu, Colors; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class DropdownWidget extends StatelessWidget { + final String labelText; + final String hintText; + final List dropdownItems; + final String? selectedValue; + final Function(String?)? onChange; + final bool isEnable; + final bool isBorderAllowed; + final bool isAllowRadius; + final EdgeInsetsGeometry? padding; + final bool hasSelectionCustomIcon; + final String? selectionCustomIcon; + final String? leadingIcon; + final Color? labelColor; + + const DropdownWidget( + {Key? key, + required this.labelText, + required this.hintText, + required this.dropdownItems, + this.selectedValue, + this.onChange, + this.isEnable = true, + this.isBorderAllowed = true, + this.isAllowRadius = true, + this.padding, + this.hasSelectionCustomIcon = false, + this.selectionCustomIcon, + this.leadingIcon, + this.labelColor}) + : super(key: key); + + @override + Widget build(BuildContext context) { + Widget content = Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [_buildLabelText(labelColor), _buildDropdown(context)], + ); + + return Container( + padding: padding, + alignment: Alignment.center, // This might need adjustment based on layout + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: Colors.white, + borderRadius: isAllowRadius ? 15.h : null, + side: isBorderAllowed ? BorderSide(color: const Color(0xffefefef), width: 1) : null, + ), + child: Row( + // Wrap with a Row + crossAxisAlignment: CrossAxisAlignment.center, // Align items vertically in the center + children: [ + if (leadingIcon != null) ...[ + _buildLeadingIcon(), + SizedBox(width: 3.h), + ], + Expanded(child: content), + ], + ), + ); + } + + Widget _buildLeadingIcon() { + return Container( + height: 40.h, + width: 40.h, + margin: EdgeInsets.only(right: 10.h), + padding: EdgeInsets.all(8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 10.h, color: AppColors.greyColor), + child: Utils.buildSvgWithAssets(icon: leadingIcon!)); + } + + Widget _buildLabelText(Color? labelColor) { + return Text( + labelText, + style: TextStyle( + fontSize: 12.f, + fontWeight: FontWeight.w500, + color: labelColor ?? Color(0xff898A8D), + letterSpacing: -0.2, + height: 18 / 12, + ), + ); + } + + Widget _buildDropdown(BuildContext context) { + return GestureDetector( + onTap: isEnable + ? () async { + final renderBox = context.findRenderObject() as RenderBox; + final offset = renderBox.localToGlobal(Offset.zero); + final selected = await showMenu( + context: context, + position: RelativeRect.fromLTRB( + offset.dx, + offset.dy + renderBox.size.height, + offset.dx + renderBox.size.width, + 0, + ), + items: dropdownItems + .map( + (e) => PopupMenuItem( + value: e, + child: Text( + e, + style: TextStyle( + fontSize: 14.f, + height: 21 / 14, + fontWeight: FontWeight.w500, + letterSpacing: -0.2, + ), + ), + ), + ) + .toList(), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + + ), + color: AppColors.scaffoldBgColor + ); + + if (selected != null && onChange != null) { + onChange!(selected); + } + } + : null, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Text( + (selectedValue == null || selectedValue!.isEmpty) ? hintText : selectedValue!, + textAlign: TextAlign.left, + textDirection: TextDirection.ltr, + style: TextStyle( + fontSize: 14.f, + height: 21 / 14, + fontWeight: FontWeight.w500, + color: (selectedValue != null && selectedValue!.isNotEmpty) ? const Color(0xff2E3039) : const Color(0xffB0B0B0), + letterSpacing: -0.2, + ), + ), + ), + if (hasSelectionCustomIcon && selectionCustomIcon != null) Utils.buildSvgWithAssets(icon: selectionCustomIcon!) else const Icon(Icons.keyboard_arrow_down_outlined), + ], + ), + ); + } +} diff --git a/lib/widgets/expandable_bottom_sheet/ExpandableBottomSheet.dart b/lib/widgets/expandable_bottom_sheet/ExpandableBottomSheet.dart new file mode 100644 index 0000000..73a4a47 --- /dev/null +++ b/lib/widgets/expandable_bottom_sheet/ExpandableBottomSheet.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/widgets/expandable_bottom_sheet/model/BottomSheetType.dart'; + +class ExpandableBottomSheet extends StatelessWidget { + final BottomSheetType bottomSheetType; + final Map children; + + const ExpandableBottomSheet( + {super.key, required this.bottomSheetType, required this.children}); + + @override + Widget build(BuildContext context) { + print("the currently selected item is ${bottomSheetType}"); + return AnimatedCrossFade( + duration: const Duration(milliseconds: 600), + firstChild:children[BottomSheetType.FIXED] ?? SizedBox.shrink(), + secondChild: children[BottomSheetType.EXPANDED] ?? const SizedBox.shrink(), + crossFadeState: BottomSheetType.FIXED == bottomSheetType ? CrossFadeState.showFirst : CrossFadeState.showSecond, + ); + // switch (bottomSheetType) { + // case BottomSheetType.EXPANDED: + // return children[BottomSheetType.EXPANDED] ?? + // SizedBox.shrink(); + // case BottomSheetType.FIXED: + // return children[BottomSheetType.FIXED] ?? SizedBox.shrink(); + // } + // return SizedBox.shrink(); + } +} diff --git a/lib/widgets/expandable_bottom_sheet/model/BottomSheetType.dart b/lib/widgets/expandable_bottom_sheet/model/BottomSheetType.dart new file mode 100644 index 0000000..4849de1 --- /dev/null +++ b/lib/widgets/expandable_bottom_sheet/model/BottomSheetType.dart @@ -0,0 +1,4 @@ +enum BottomSheetType { + EXPANDED, + FIXED, +} \ No newline at end of file diff --git a/lib/widgets/family_files/family_file_add_widget.dart b/lib/widgets/family_files/family_file_add_widget.dart new file mode 100644 index 0000000..8e57f91 --- /dev/null +++ b/lib/widgets/family_files/family_file_add_widget.dart @@ -0,0 +1,105 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; +import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/dropdown/country_dropdown_widget.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; + +class FamilyFileAddWidget extends StatelessWidget { + final Function()? onVerificationPress; + final String message; + + const FamilyFileAddWidget(this.onVerificationPress, this.message, {super.key}); + + @override + Widget build(BuildContext context) { + AuthenticationViewModel authVm = getIt.get(); + MedicalFileViewModel? medicalVM = getIt.get(); + // TODO: implement build + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + message.toText16(color: AppColors.textColor, weight: FontWeight.w500), + SizedBox(height: 20.h), + Container( + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(24)), + padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), + child: Column( + children: [ + CustomCountryDropdown( + countryList: CountryEnum.values, + onCountryChange: authVm.onCountryChange, + ).paddingOnly(top: 8.h, bottom: 16.h), + Divider(height: 1.h, color: AppColors.spacerLineColor), + TextInputWidget( + labelText: LocaleKeys.nationalIdNumber.tr(), + hintText: "xxxxxxxxx", + controller: authVm.nationalIdController, + isEnable: true, + prefix: null, + isAllowRadius: true, + isBorderAllowed: false, + isAllowLeadingIcon: true, + autoFocus: true, + keyboardType: TextInputType.number, + padding: EdgeInsets.symmetric(vertical: 8.h), + leadingIcon: AppAssets.student_card, + ).paddingOnly(top: 8.h, bottom: 8.h), + Divider(height: 1.h, color: AppColors.spacerLineColor), + TextInputWidget( + labelText: LocaleKeys.phoneNumber.tr(), + hintText: "", + controller: authVm.phoneNumberController, + isEnable: true, + prefix: authVm.selectedCountrySignup.countryCode, + isAllowRadius: true, + isBorderAllowed: false, + isAllowLeadingIcon: true, + autoFocus: true, + keyboardType: TextInputType.number, + padding: EdgeInsets.symmetric(vertical: 8.h), + leadingIcon: AppAssets.smart_phone, + ).paddingOnly(top: 8.h, bottom: 4.h), + ], + ), + ), + SizedBox(height: 20.h), + CustomButton( + text: "Verify the member".needTranslation, + onPressed: () { + FocusScope.of(context).unfocus(); + if (ValidationUtils.isValidatedIdAndPhoneWithCountryValidation( + nationalId: authVm.nationalIdController.text, + selectedCountry: authVm.selectedCountrySignup, + phoneNumber: authVm.phoneNumberController.text, + onOkPress: () { + Navigator.of(context).pop(); + }, + )) { + // authVm.addFamilyMember(otpTypeEnum: OTPTypeEnum.sms, isExcludedUser: true); + if (onVerificationPress != null) { + onVerificationPress!(); + } + } + }, + icon: AppAssets.add_icon, + height: 56.h, + fontWeight: FontWeight.w600), + SizedBox(height: 20.h), + ], + ); + } +} diff --git a/lib/widgets/graph/custom_graph.dart b/lib/widgets/graph/custom_graph.dart new file mode 100644 index 0000000..7fc1f2a --- /dev/null +++ b/lib/widgets/graph/custom_graph.dart @@ -0,0 +1,278 @@ +import 'package:flutter/material.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:hmg_patient_app_new/core/common_models/data_points.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +/// A customizable line graph widget using `fl_chart`. +/// +/// Displays a line chart with configurable axis labels, colors, and data points. +/// Useful for visualizing time series or other sequential data. +/// +/// **Parameters:** +/// - [dataPoints]: List of `DataPoint` objects to plot. +/// - [leftLabelFormatter]: Function to build left axis labels. +/// - [bottomLabelFormatter]: Function to build bottom axis labels. +/// - [width]: Optional width of the chart. +/// - [height]: Required height of the chart. +/// - [maxY], [maxX], [minX]: Axis bounds. +/// - [spotColor]: Color of the touched spot marker. +/// - [graphColor]: Color of the line. +/// - [graphShadowColor]: Color of the area below the line. +/// - [graphGridColor]: Color of the grid lines. +/// - [bottomLabelColor]: Color of bottom axis labels. +/// - [bottomLabelSize]: Font size for bottom axis labels. +/// - [bottomLabelFontWeight]: Font weight for bottom axis labels. +/// - [leftLabelInterval]: Interval between left axis labels. +/// - [leftLabelReservedSize]: Reserved space for left axis labels. +/// - [scrollDirection]: Axis direction for scrolling. +/// - [showBottomTitleDates]: Whether to show bottom axis labels. +/// - [isFullScreeGraph]: Whether the graph is fullscreen. +/// - [makeGraphBasedOnActualValue]: Use `actualValue` for plotting. +/// +/// Example usage: +/// ```dart +/// CustomGraph( +/// dataPoints: sampleData, +/// leftLabelFormatter: (value) => ..., +/// bottomLabelFormatter: (value, dataPoints) => ..., +/// height: 200, +/// scrollDirection: Axis.horizontal, +/// maxY: 100, +/// maxX: 2.5, +/// ) +class CustomGraph extends StatelessWidget { + final List dataPoints; + final double? width; + final double height; + final double? maxY; + final double? maxX; + final double? minX; + final Color spotColor; + final Color graphColor; + final Color graphShadowColor; + final Color graphGridColor; + final Color bottomLabelColor; + final double? bottomLabelSize; + final FontWeight? bottomLabelFontWeight; + final double? leftLabelInterval; + final double? leftLabelReservedSize; + + ///creates the left label and provide it to the chart as it will be used by other part of the application so the label will be different for every chart + final Widget Function(double) leftLabelFormatter; + final Widget Function(double , List) bottomLabelFormatter; + + + final Axis scrollDirection; + final bool showBottomTitleDates; + final bool isFullScreeGraph; + final bool makeGraphBasedOnActualValue; + + const CustomGraph({ + super.key, + required this.dataPoints, + required this.leftLabelFormatter, + this.width, + required this.scrollDirection, + required this.height, + this.maxY, + this.maxX, + this.showBottomTitleDates = true, + this.isFullScreeGraph = false, + this.spotColor = AppColors.bgGreenColor, + this.graphColor = AppColors.bgGreenColor, + this.graphShadowColor = AppColors.graphGridColor, + this.graphGridColor = AppColors.graphGridColor, + this.bottomLabelColor = AppColors.textColor, + this.bottomLabelFontWeight = FontWeight.w500, + this.bottomLabelSize, + this.leftLabelInterval, + this.leftLabelReservedSize, + this.makeGraphBasedOnActualValue = false, + required this.bottomLabelFormatter, + this.minX, + }); + + @override + Widget build(BuildContext context) { + // var maxY = 0.0; + double interval = 20; + + return Material( + color: Colors.white, + child: SizedBox( + width: width, + height: height, + child: LineChart( + LineChartData( + minY: 0, + // maxY: ((maxY?.ceilToDouble() ?? 0.0) + interval).floorToDouble(), + maxY: maxY, + // minX: dataPoints.first.labelValue - 1, + maxX: maxX, + minX: minX , + lineTouchData: LineTouchData( + getTouchLineEnd: (_, __) => 0, + getTouchedSpotIndicator: (barData, indicators) { + // Only show custom marker for touched spot + return indicators.map((int index) { + return TouchedSpotIndicatorData( + FlLine(color: Colors.transparent), + FlDotData( + show: true, + getDotPainter: (spot, percent, barData, idx) { + return FlDotCirclePainter( + radius: 8, + color: spotColor, + strokeWidth: 2, + strokeColor: Colors.white, + ); + }, + ), + ); + }).toList(); + }, + enabled: true, + touchTooltipData: LineTouchTooltipData( + getTooltipColor: (_) => Colors.white, + getTooltipItems: (touchedSpots) { + if (touchedSpots.isEmpty) return []; + // Only show tooltip for the first touched spot, hide others + return touchedSpots.map((spot) { + if (spot == touchedSpots.first) { + final dataPoint = dataPoints[spot.x.toInt()]; + + return LineTooltipItem( + '${dataPoint.actualValue} ${dataPoint.unitOfMeasurement??""} - ${dataPoint.displayTime}', + TextStyle( + color: Colors.black, + fontSize: 12.f, + fontWeight: FontWeight.w500), + ); + } + return null; // hides the rest + }).toList(); + }, + ), + ), + titlesData: FlTitlesData( + leftTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: leftLabelReservedSize??80, + interval: leftLabelInterval ?? .1, // Let fl_chart handle it + getTitlesWidget: (value, _) { + return leftLabelFormatter(value); + }, + ), + ), + bottomTitles: AxisTitles( + axisNameSize: 20, + sideTitles: SideTitles( + showTitles: showBottomTitleDates, + reservedSize: 20, + getTitlesWidget: (value, _) { + return bottomLabelFormatter(value, dataPoints, ); + }, + interval: 1, // ensures 1:1 mapping with spots + ), + ), + topTitles: AxisTitles(), + rightTitles: AxisTitles(), + ), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide.none, + left: BorderSide(color: Colors.grey, width: .5), + right: BorderSide.none, + top: BorderSide.none, + ), + ), + lineBarsData: _buildColoredLineSegments(dataPoints), + gridData: FlGridData( + show: true, + drawVerticalLine: false, + // horizontalInterval: 40, + checkToShowHorizontalLine: (value) => + value >= 0 && value <= 100, + getDrawingHorizontalLine: (value) { + return FlLine( + color: graphGridColor, + strokeWidth: 1, + dashArray: [5, 5], + ); + }, + ), + ), + ), + )); + } + + List _buildColoredLineSegments(List dataPoints) { + final List allSpots = dataPoints.asMap().entries.map((entry) { + double value = (makeGraphBasedOnActualValue)?double.tryParse(entry.value.actualValue)??0.0:entry.value.value; + debugPrint("the value is $value"); + return FlSpot(entry.key.toDouble(), value); + }).toList(); + + var data = [ + LineChartBarData( + spots: allSpots, + isCurved: true, + isStrokeCapRound: true, + isStrokeJoinRound: true, + barWidth: 4, + gradient: LinearGradient( + colors: [graphColor, graphColor], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient( + colors: [ + graphShadowColor, + Colors.white, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ) + ]; + + return data; + } + + // Widget buildLabel(String label) { + // return Padding( + // padding: const EdgeInsets.only(right: 8), + // child: Text( + // label, + // style: TextStyle( + // fontSize: leftLabelSize ?? 8.fSize, color: leftLabelColor), + // textAlign: TextAlign.right, + // ), + // ); + // } + + +} + +// final List sampleData = [ +// DataPoint( +// value: 20, +// label: 'Jan 2024', +// ), +// DataPoint( +// value: 36, +// label: 'Feb 2024', +// ), +// DataPoint( +// value: 80, +// label: 'This result', +// ), +// ]; diff --git a/lib/widgets/image_picker.dart b/lib/widgets/image_picker.dart index fa9f44b..9444159 100644 --- a/lib/widgets/image_picker.dart +++ b/lib/widgets/image_picker.dart @@ -183,7 +183,7 @@ class _BottomSheetItem extends StatelessWidget { final String title; final Color color; - _BottomSheetItem({Key? key, required this.onTap, required this.title, required this.icon, this.color = mainPurple}) : super(key: key); + _BottomSheetItem({Key? key, required this.onTap, required this.title, required this.icon, this.color = AppColors.mainPurple}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart new file mode 100644 index 0000000..e8370e5 --- /dev/null +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -0,0 +1,489 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/tamara_request_model.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; + +enum _PAYMENT_TYPE { PACKAGES, PHARMACY, PATIENT } + +var _InAppBrowserOptions = InAppBrowserClassOptions( + inAppWebViewGroupOptions: InAppWebViewGroupOptions( + crossPlatform: InAppWebViewOptions(useShouldOverrideUrlLoading: true, transparentBackground: false), + ios: IOSInAppWebViewOptions(applePayAPIEnabled: true, isFraudulentWebsiteWarningEnabled: false)), + crossPlatform: InAppBrowserOptions(hideUrlBar: true, toolbarTopBackgroundColor: Colors.black), + android: AndroidInAppBrowserOptions(), + ios: IOSInAppBrowserOptions( + hideToolbarBottom: true, + toolbarBottomBackgroundColor: Colors.white, + closeButtonColor: Colors.white, + closeButtonCaption: "Close", + presentationStyle: IOSUIModalPresentationStyle.OVER_FULL_SCREEN)); + +class MyInAppBrowser extends InAppBrowser { + _PAYMENT_TYPE? paymentType; + + static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL LIVE + // static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL UAT + + // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT + + // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE + + // static String SERVICE_URL = 'https://uat.hmgwebservices.com/payfortforvidaplus/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL UAT VIDA PLUS + + // static String PRESCRIPTION_PAYMENT_WITH_ORDERID = + // 'https://uat.hmgwebservices.com/epharmacy/checkout/OpcCompleteRedirectionPaymentClientbyOrder?orderID='; + + static String PRESCRIPTION_PAYMENT_WITH_ORDERID = 'https://mdlaboratories.com/exacartapi/checkout/OpcCompleteRedirectionPaymentClientbyOrder?orderID='; //Live + + static List successURLS = ['success?', 'PayFortResponse', 'PayFortSucess', 'mobilepaymentcomplete', 'orderdetails', 'redirectToApplePay', 'mdlaboratories.com/?']; + + static List errorURLS = ['PayfortCancel', 'errorpage', 'Failed', 'orderdetails', 'redirectToApplePay', 'mdlaboratories.com/?', 'cancel', 'canceled']; + + final Function onExitCallback; + final Function? onLoadStartCallback; + final BuildContext? context; + + // AppSharedPreferences sharedPref = AppSharedPreferences(); + // AuthProvider authProvider = new AuthProvider(); + InAppBrowser browser = InAppBrowser(); + + // AuthenticatedUser authUser; + // late AppoitmentAllHistoryResultList? appo; + + String deviceToken = ""; + + double lat = 0.0; + double long = 0.0; + + static bool isPaymentDone = false; + late AppState appState; + + MyInAppBrowser({required this.onExitCallback, this.onLoadStartCallback, this.context}); + + Future onBrowserCreated() async { + print("\n\nBrowser Created!\n\n"); + } + + @override + Future onLoadStart(Uri? url) async { + if (onLoadStartCallback != null) onLoadStartCallback!(url.toString()); + } + + @override + Future onLoadStop(Uri? url) async { + print("\n\nStopped $url\n\n"); + } + + @override + void onLoadError(Uri? url, int code, String message) { + print("Can't load $url.. Error: $message"); + } + + @override + void onProgressChanged(int progress) {} + + @override + void onExit() { + print("\n\nBrowser closed before!\n\n"); + // if (onExitCallback != null) { + try { + onExitCallback(isPaymentDone); + print("\n\nBrowser closed after!\n\n"); + } catch (err) { + print(err.toString()); + } + // } + } + + @override + Future shouldOverrideUrlLoading(NavigationAction navigationAction) { + var url = navigationAction.request.url.toString(); + debugPrint("redirecting/overriding to: $url"); + + // if (paymentType == _PAYMENT_TYPE.PACKAGES && [PACKAGES_PAYMENT_SUCCESS_URL, PACKAGES_PAYMENT_FAIL_URL].contains(url)) { + // isPaymentDone = (url == PACKAGES_PAYMENT_SUCCESS_URL); + // close(); + // } + + return Future.value(NavigationActionPolicy.ALLOW); + } + + // getLanguageID() async { + // return await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + // } + + // getDeviceToken() async { + // String deviceToken = await sharedPref.getString(PUSH_TOKEN); + // this.deviceToken = deviceToken; + // } + + // openPackagesPaymentBrowser({required int customer_id, required int order_id}) { + // paymentType = _PAYMENT_TYPE.PACKAGES; + // var full_url = '$PACKAGES_REQUEST_PAYMENT_URL?customer_id=$customer_id&order_id=$order_id'; + // this.openUrlRequest(urlRequest: URLRequest(url: WebUri.uri(Uri.parse(full_url))), options: _InAppBrowserOptions); + // } + + openPaymentBrowser(num amount, String orderDesc, String transactionID, String projId, String emailId, String paymentMethod, dynamic patientType, String patientName, dynamic patientID, + AuthenticatedUser authenticatedUser, InAppBrowser browser, bool isLiveCareAppo, var servID, var LiveServID, BuildContext context, + [var appoDate, var appoNo, var clinicID, var doctorID, var installments]) async { + appState = getIt.get(); + this.browser = browser; + // await getPatientData(); + if (paymentMethod == "ApplePay") { + MyChromeSafariBrowser safariBrowser = MyChromeSafariBrowser(MyInAppBrowser(onExitCallback: browser.onExit), onExitCallback: browser.onExit, onLoadStartCallback: this.browser.onLoadStart); + + // if (context != null) GifLoaderDialogUtils.showMyDialog(context); + + // LiveCareService service = new LiveCareService(); + // ApplePayInsertRequest applePayInsertRequest = new ApplePayInsertRequest(); + + // applePayInsertRequest.clientRequestID = transactionID; + // applePayInsertRequest.clinicID = (clinicID != null && clinicID != "") ? clinicID : 0; + // applePayInsertRequest.currency = authenticatedUser.outSA == 1 ? "AED" : "SAR"; + // applePayInsertRequest.customerEmail = emailId; + // applePayInsertRequest.customerID = patientID; + // applePayInsertRequest.customerName = patientName; + // applePayInsertRequest.deviceToken = await AppSharedPreferences().getString(PUSH_TOKEN); + // applePayInsertRequest.voipToken = await AppSharedPreferences().getString(ONESIGNAL_APNS_TOKEN); + // applePayInsertRequest.doctorID = (doctorID != null && doctorID != "") ? doctorID : 0; + // applePayInsertRequest.projectID = projId; + // applePayInsertRequest.serviceID = servID; + // applePayInsertRequest.channelID = 3; + // applePayInsertRequest.patientID = patientID; + // applePayInsertRequest.patientTypeID = authenticatedUser.patientType; + // applePayInsertRequest.patientOutSA = authenticatedUser.outSA; + // applePayInsertRequest.appointmentDate = (appoDate != null && appoDate != "") ? appoDate : null; + // applePayInsertRequest.appointmentNo = (appoNo != null && appoNo != "") ? appoNo : 0; + // applePayInsertRequest.orderDescription = orderDesc; + // applePayInsertRequest.liveServiceID = LiveServID.toString() == "" ? "0" : LiveServID.toString(); + // applePayInsertRequest.latitude = this.lat.toString(); + // applePayInsertRequest.longitude = this.long.toString(); + // applePayInsertRequest.amount = amount.toString(); + // applePayInsertRequest.isSchedule = ((appoNo != null && appoNo != "") && (appoDate != null && appoDate != "")) ? "1" : "0"; + // applePayInsertRequest.language = await getLanguageID() == 'ar' ? 'ar' : 'en'; + // applePayInsertRequest.userName = authenticatedUser.patientID; + // applePayInsertRequest.responseContinueURL = "http://hmg.com/Documents/success.html"; + // applePayInsertRequest.backClickUrl = "http://hmg.com/Documents/success.html"; + // applePayInsertRequest.paymentOption = "ApplePay"; + // + // service.applePayInsertRequest(applePayInsertRequest, context).then((res) { + // if (context != null) GifLoaderDialogUtils.hideDialog(context); + // String url = "https://hmgwebservices.com/HMGApplePayLive/applepay/pay?apq=" + res['result']; // Prod + // // String url = "https://uat.hmgwebservices.com/HMGApplePayLive/applepay/pay?apq=" + res['result']; // UAT + // // safariBrowser.open(url: Uri.parse(url)); + // this.browser.openUrlRequest(urlRequest: URLRequest(url: WebUri.uri(Uri.parse(url))), options: _InAppBrowserOptions); + // }).catchError((err) { + // print(err); + // if (context != null) GifLoaderDialogUtils.hideDialog(context); + // AppToast.showErrorToast(message: err); + // }); + } else if (paymentMethod == "TAMARA") { + // LiveCareService service = new LiveCareService(); + TamaraRequestModel tamaraRequestModel = new TamaraRequestModel(); + + // if (context != null) GifLoaderDialogUtils.showMyDialog(context); + + tamaraRequestModel.merchantReference = transactionID; + tamaraRequestModel.merchantIdentifier = "Tamara"; + tamaraRequestModel.clientRequestID = transactionID; + tamaraRequestModel.amount = amount; + tamaraRequestModel.currency = "SR"; + tamaraRequestModel.language = appState.isArabic() ? 'AR' : 'EN'; + tamaraRequestModel.commandType = "PURCHASE"; + tamaraRequestModel.customerEmail = emailId; + tamaraRequestModel.orderDescription = orderDesc; + tamaraRequestModel.isInstallment = true; + tamaraRequestModel.projectID = num.parse(projId); + tamaraRequestModel.accessCode = authenticatedUser.mobileNumber!; + tamaraRequestModel.appointmentNo = (appoNo != null && appoNo != "") ? appoNo.toString() : "0"; + tamaraRequestModel.customerName = patientName; + tamaraRequestModel.fileNumber = patientID.toString(); + tamaraRequestModel.patientOutSA = authenticatedUser.outSa == 1 ? true : false; + tamaraRequestModel.deviceToken = await Utils.getStringFromPrefs(CacheConst.pushToken); + tamaraRequestModel.latitude = appState.userLat.toString(); + tamaraRequestModel.longitude = appState.userLong.toString(); + tamaraRequestModel.serviceID = servID; + tamaraRequestModel.liveServiceID = LiveServID; + tamaraRequestModel.doctorID = (doctorID.toString() != null && doctorID != "") ? doctorID.toString() : ""; + tamaraRequestModel.appointmentDate = (appoDate != null && appoDate != "") ? appoDate : null; + tamaraRequestModel.isSchedule = ((appoNo != null && appoNo != "") && (appoDate != null && appoDate != "")) ? true : false; + + // service.tamaraInsertRequest(tamaraRequestModel, context).then((res) { + // // if (context != null) GifLoaderDialogUtils.hideDialog(context); + generateTamaraURL(amount, orderDesc, transactionID, projId, emailId, paymentMethod, patientType, patientName, patientID, authenticatedUser, isLiveCareAppo, servID, LiveServID, appoDate, appoNo, + clinicID, doctorID, "", installments) + .then((value) { + paymentType = _PAYMENT_TYPE.PATIENT; + this.browser.openUrlRequest(urlRequest: URLRequest(url: WebUri.uri(Uri.parse(value))), options: _InAppBrowserOptions); + }); + // }).catchError((err) { + // print(err); + // // if (context != null) GifLoaderDialogUtils.hideDialog(context); + // // AppToast.showErrorToast(message: err); + // }); + } else { + generateURL(amount, orderDesc, transactionID, projId, emailId, paymentMethod, patientType, patientName, patientID, authenticatedUser, isLiveCareAppo, servID, LiveServID, appoDate, appoNo, + clinicID, doctorID) + .then((value) { + paymentType = _PAYMENT_TYPE.PATIENT; + this.browser.openUrlRequest(urlRequest: URLRequest(url: WebUri.uri(Uri.parse(value))), options: _InAppBrowserOptions); + }); + } + } + + // openPharmacyPaymentBrowser(OrderDetailModel order, double amount, String orderDesc, String transactionID, String emailId, String paymentMethod, String patientName, dynamic patientID, + // AuthenticatedUser authenticatedUser, InAppBrowser browser) { + // this.browser = browser; + // MyChromeSafariBrowser safariBrowser = + // new MyChromeSafariBrowser(new MyInAppBrowser(onExitCallback: browser.onExit), onExitCallback: browser.onExit, onLoadStartCallback: this.browser.onLoadStart, appo: this.appo!); + // // getPatientData(); + // generatePharmacyURL(order, amount, orderDesc, transactionID, emailId, paymentMethod, patientName, patientID, authenticatedUser).then((value) { + // if (order.customValuesXml!.contains("ApplePay")) { + // safariBrowser.open(url: WebUri.uri(Uri.parse(value))); + // } else { + // this.browser.openUrlRequest(urlRequest: URLRequest(url: WebUri.uri(Uri.parse(value))), options: _InAppBrowserOptions); + // } + // }); + // } + + openBrowser(String url) { + this.browser = browser; + this.browser.openUrlRequest(urlRequest: URLRequest(url: WebUri.uri(Uri.parse(url))), options: _InAppBrowserOptions); + } + + Future generateURL(num amount, String orderDesc, String transactionID, String projId, String emailId, String paymentMethod, dynamic patientType, String patientName, dynamic patientID, + AuthenticatedUser authUser, bool isLiveCareAppo, var servID, var LiveServID, + [var appoDate, var appoNo, var clinicID, var doctorID, var patientData]) async { + // getDeviceToken(); + String currentLanguageID = appState.isArabic() ? 'AR' : 'EN'; + String form = isLiveCareAppo ? getLiveCareForm() : getForm(); + + form = form.replaceFirst("EMAIL_VALUE", emailId); + + form = form.replaceFirst('AMOUNT_VALUE', amount.toString()); + form = form.replaceFirst('ORDER_DESCRIPTION_VALUE', orderDesc); + form = form.replaceFirst('ORDER_ID_VALUE', transactionID); + form = form.replaceFirst('REQUEST_ID_VALUE', transactionID); + form = form.replaceFirst('PROJECT_ID_VALUE', projId); + form = form.replaceFirst('PAYMENT_OPTION_VALUE', paymentMethod); + form = form.replaceFirst('LANG_VALUE', currentLanguageID); + form = form.replaceFirst('PATIENT_OUT_SA', authUser.outSa == 0 ? false.toString() : true.toString()); + form = form.replaceFirst('PATIENT_TYPE_ID', patientData == null ? patientType.toString() : "1"); + + Platform.isIOS + ? form = form.replaceFirst('DEVICE_TOKEN', "${await Utils.getStringFromPrefs(CacheConst.pushToken)},${await Utils.getStringFromPrefs(CacheConst.apnsToken)}") + : form = form.replaceFirst('DEVICE_TOKEN', await Utils.getStringFromPrefs(CacheConst.pushToken) ?? ""); + + // form = form.replaceFirst('DEVICE_TOKEN', await AppSharedPreferences().getString(PUSH_TOKEN) + "," + await AppSharedPreferences().getString(ONESIGNAL_APNS_TOKEN)); + // form = form.replaceFirst('DEVICE_TOKEN', await sharedPref.getString(PUSH_TOKEN)); + form = form.replaceFirst('LATITUDE_VALUE', this.lat.toString()); + form = form.replaceFirst('LONGITUDE_VALUE', this.long.toString()); + + // if (servID == "4") + // form = form.replaceFirst('SERVICE_URL_VALUE', MyInAppBrowser.PREAUTH_SERVICE_URL); + // else + form = form.replaceFirst('SERVICE_URL_VALUE', ApiConsts.SERVICE_URL); + + if (servID != null) { + form = form.replaceFirst('SERV_ID', servID); + form = form.replaceFirst('LIVE_SERVICE_ID', LiveServID.toString()); + } else { + form = form.replaceFirst('SERV_ID', "2"); + form = form.replaceFirst('LIVE_SERVICE_ID', "2"); + } + + form = form.replaceFirst('CUSTNAME_VALUE', patientName); + form = form.replaceFirst('CUSTID_VALUE', patientID.toString()); + + if (isLiveCareAppo) { + form = form.replaceFirst('IS_SCHEDULE_VALUE', "true"); + form = form.replaceFirst('APPOINTMENT_DATE_VALUE', appoDate); + form = form.replaceFirst('APPOINTMENT_NO_VALUE', appoNo.toString()); + form = form.replaceFirst('DOCTOR_ID_VALUE', doctorID.toString()); + form = form.replaceFirst('CLINIC_ID_VALUE', clinicID.toString()); + } + + var bytes = utf8.encode(form); + var base64Str = base64.encode(bytes); + return 'data:text/html;base64,' + base64Str; + } + + Future generateTamaraURL(num amount, String orderDesc, String transactionID, String projId, String emailId, String paymentMethod, dynamic patientType, String patientName, dynamic patientID, + AuthenticatedUser authUser, bool isLiveCareAppo, var servID, var LiveServID, + [var appoDate, var appoNo, var clinicID, var doctorID, var patientData, var installments]) async { + // getDeviceToken(); + String currentLanguageID = appState.isArabic() ? 'AR' : 'EN'; + String form = getTamaraForm(); + + form = form.replaceFirst("EMAIL_VALUE", emailId); + + form = form.replaceFirst('AMOUNT_VALUE', amount.toString()); + form = form.replaceFirst('ORDER_DESCRIPTION_VALUE', orderDesc); + form = form.replaceFirst('ORDER_ID_VALUE', transactionID); + form = form.replaceFirst('REQUEST_ID_VALUE', transactionID); + form = form.replaceFirst('PROJECT_ID_VALUE', projId); + form = form.replaceFirst('PAYMENT_OPTION_VALUE', paymentMethod); + form = form.replaceFirst('LANG_VALUE', currentLanguageID); + form = form.replaceFirst('SERVICE_URL_VALUE', ApiConsts.TAMARA_URL); + + form = form.replaceFirst('INSTALLMENTS_VALUE', "3"); + form = form.replaceFirst('CUSTNATIONALID_VALUE', authUser.patientIdentificationNo!); + form = form.replaceFirst('CUSTMOBILE_VALUE', authUser.mobileNumber!); + form = form.replaceFirst('CUSTDOB_VALUE', DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(authUser.dateofBirth!))); + + form = form.replaceFirst('CURRENCY_VALUE', authUser.outSa == 0 ? "SAR" : "AED"); + form = form.replaceFirst('COUNTRY_CODE_VALUE', authUser.outSa == 0 ? "966" : "971"); + form = form.replaceFirst('CUSTNAME_VALUE', patientName); + form = form.replaceFirst('CUSTLASTNAME_VALUE', patientName); + form = form.replaceFirst('CUSTID_VALUE', patientID.toString()); + + var bytes = utf8.encode(form); + var base64Str = base64.encode(bytes); + return 'data:text/html;base64,' + base64Str; + } + + String getForm() { + return ' ' + + '' + + '' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + + '' + + '' + + ''; + } + + String getTamaraForm() { + return ' ' + + '' + + '' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + '
' + + '' + + '' + + ''; + } + + String getLiveCareForm() { + return ' ' + + '' + + '' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + + '' + + '' + + ''; + } + + safariCallBack() { + print("Safari CallBack!!!"); + } +} + +class MyChromeSafariBrowser extends ChromeSafariBrowser { + final Function? onExitCallback; + final Function? onLoadStartCallback; + + // AppoitmentAllHistoryResultList? appo; + + // MyChromeSafariBrowser(browserFallback, {this.onExitCallback, this.onLoadStartCallback, this.appo}); + MyChromeSafariBrowser(browserFallback, {this.onExitCallback, this.onLoadStartCallback}); + + @override + void onOpened() { + print("ChromeSafari browser opened"); + } + + @override + void onCompletedInitialLoad(bool? didLoadSuccessfully) { + print("ChromeSafari browser initial load completed"); + onLoadStartCallback!("ApplePay"); + } + + @override + void onClosed() { + print("ChromeSafari browser closed"); + MyInAppBrowser.isPaymentDone = true; + onExitCallback!(); + } +} diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index 9b200b0..d943731 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -1,164 +1,283 @@ -import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; +import 'package:hijri_gregorian_calendar/hijri_gregorian_calendar.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; -// import 'package:sizer/sizer.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/dropdown/country_dropdown_widget.dart'; + +import '../core/dependencies.dart'; -class CustomTextField extends StatefulWidget { +// TODO: Import AppColors if bgRedColor is defined there +// import 'package:hmg_patient_app_new/core/ui_utils/app_colors.dart'; + +class TextInputWidget extends StatelessWidget { final String labelText; - final String? hintText; - final TextEditingController controller; - final VoidCallback? suffixTap; - final IconData? suffixIcon; + final String hintText; + final TextEditingController? controller; + final Function(String?)? onChange; + final Function(bool)? onCalendarTypeChanged; + final String? prefix; final bool isEnable; - final bool hasSelection; - final int? lines; - final bool isInputTypeNum; - final bool isTextIsPassword; - final bool isBackgroundEnable; - final bool isEnableBorder; - final double verticalPadding; - final double horizontalPadding; - final Function(String)? onChange; - final Function()? onEditComplete; - final Function(String)? onSubmit; - final Function? onClick; + final bool isBorderAllowed; + final bool isAllowRadius; + final bool isReadOnly; + final TextInputType keyboardType; final FocusNode? focusNode; - List? inputFormatters; + final bool autoFocus; + final EdgeInsetsGeometry? padding; + final bool isAllowLeadingIcon; + final String? leadingIcon; + final bool isCountryDropDown; + final bool hasError; + final String? errorMessage; + final Function(CountryEnum)? onCountryChange; + final SelectionTypeEnum? selectionType; + final double? fontSize; + final bool? isWalletAmountInput; + final Widget? suffix; + final Color? labelColor; + final Function(String)? onSubmitted; - CustomTextField( - this.labelText, - this.controller, { - Key? key, - this.isTextIsPassword = false, - this.suffixTap, - this.suffixIcon, - this.hintText, - this.isEnable = true, - this.hasSelection = false, - this.isEnableBorder = true, - this.lines = 1, - this.onChange, - this.onEditComplete, - this.onSubmit, - this.onClick, - this.isInputTypeNum = false, - this.isBackgroundEnable = false, - this.focusNode, - this.verticalPadding = 15, - this.horizontalPadding = 16, - this.inputFormatters, - }) : super(key: key); + // final List countryList; + // final Function(Country)? onCountryChange; - @override - CustomTextFieldState createState() => CustomTextFieldState(); -} - -class CustomTextFieldState extends State { - late bool isObscureText; - late FocusNode focusNode; + TextInputWidget( + {super.key, + required this.labelText, + required this.hintText, + this.controller, + this.onChange, + this.onCalendarTypeChanged, + this.prefix, + this.isEnable = true, + this.isBorderAllowed = true, + this.isAllowRadius = true, + this.isReadOnly = false, + this.keyboardType = TextInputType.number, + this.focusNode, + this.autoFocus = false, + this.padding, + this.isAllowLeadingIcon = false, + this.leadingIcon, + this.isCountryDropDown = false, + this.hasError = false, + this.errorMessage, + this.onCountryChange, + this.selectionType, + this.fontSize, + this.isWalletAmountInput = false, + this.suffix, + this.labelColor, + this.onSubmitted + // this.countryList = const [], + // this.onCountryChange, + }); - @override - void initState() { - super.initState(); - focusNode = FocusNode(); - isObscureText = widget.isTextIsPassword; - } + final FocusNode _focusNode = FocusNode(); - @override - void dispose() { - super.dispose(); - } + // KeyboardActionsConfig get _keyboardActionsConfig { + // return KeyboardActionsConfig( + // keyboardActionsPlatform: KeyboardActionsPlatform.ALL, + // keyboardBarColor: const Color(0xFFCAD1D9), //Apple keyboard color + // actions: [ + // KeyboardActionsItem( + // focusNode: focusNode ?? _focusNode, + // toolbarButtons: [ + // (node) { + // return GestureDetector( + // onTap: () => node.unfocus(), + // child: Container( + // padding: const EdgeInsets.all(12.0), + // child: "Done".toText16(weight: FontWeight.w500, color: AppColors.infoColor), + // ), + // ); + // } + // ], + // ), + // ], + // ); + // } @override Widget build(BuildContext context) { - return InkWell( - onTap: () { - focusNode.requestFocus(); - if (widget.hasSelection) widget.onClick!(); - }, - child: Container( - padding: EdgeInsets.only(left: widget.horizontalPadding, right: widget.horizontalPadding, bottom: widget.verticalPadding, top: widget.verticalPadding), - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - color: widget.isBackgroundEnable ? const Color(0xffF7F7F7) : Colors.white, - border: Border.all(color: widget.isEnableBorder ? Colors.grey.shade300 : Colors.transparent, width: 1), - ), - child: Row( - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - widget.labelText, - style: TextStyle( - fontSize: 12.h, - fontWeight: FontWeight.w600, - color: const Color(0xff2B353E), - letterSpacing: -0.44, - ), - ), - TextField( - focusNode: focusNode, - autofocus: false, - enabled: widget.isEnable, - scrollPadding: EdgeInsets.zero, - keyboardType: widget.isInputTypeNum ? TextInputType.number : TextInputType.text, - controller: widget.controller, - maxLines: widget.lines, - obscuringCharacter: "*", - obscureText: isObscureText, - onChanged: widget.onChange, - onEditingComplete: widget.onEditComplete, - onSubmitted: widget.onSubmit, - inputFormatters: widget.inputFormatters, - style: const TextStyle( - fontSize: 16, - height: 21 / 14, - fontWeight: FontWeight.w400, - color: Color(0xff2B353E), - letterSpacing: -0.44, - ), - decoration: InputDecoration( - isDense: true, - hintText: widget.hintText, - hintStyle: const TextStyle( - fontSize: 14, - height: 21 / 14, - fontWeight: FontWeight.w400, - color: Color(0xff575757), - letterSpacing: -0.56, + AppState appState = getIt.get(); + final errorColor = AppColors.primaryRedColor; + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: padding, + height: 64.h, + alignment: Alignment.center, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: Colors.white, + borderRadius: isAllowRadius ? (12.r) : null, + side: isBorderAllowed ? BorderSide(color: hasError ? errorColor : const Color(0xffefefef), width: 1) : null, + ), + child: Row( + textDirection: Directionality.of(context), + children: [ + if (isAllowLeadingIcon && leadingIcon != null && !isCountryDropDown) _buildLeadingIcon(context), + isCountryDropDown + ? CustomCountryDropdown( + countryList: CountryEnum.values, + onCountryChange: onCountryChange, + isFromBottomSheet: isCountryDropDown, + isEnableTextField: true, + onPhoneNumberChanged: onChange, + // textField: _buildTextField(context), + ) + : Expanded( + child: Row( + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildLabelText(labelColor).paddingOnly(right: (appState.getLanguageCode() == "ar" ? 10 : 0)), + Row( + children: [ + Expanded(child: _buildTextField(context)), + ], + ), + ], + ), + ), + (suffix != null) ? suffix! : SizedBox.shrink() + ], ), - suffixIconConstraints: const BoxConstraints(minWidth: 50), - suffixIcon: widget.suffixTap == null ? null : IconButton(icon: Icon(Icons.mic, color: blackColor), onPressed: widget.suffixTap), - contentPadding: EdgeInsets.zero, - border: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, ), - ), - ], + if (selectionType == SelectionTypeEnum.calendar) _buildTrailingIcon(context), + if (selectionType == SelectionTypeEnum.search) _buildTrailingIconForSearch(context), + ], + ), + ), + if (hasError && errorMessage != null) + Padding( + padding: EdgeInsets.only(top: 4.h, left: 12.h), // Adjust padding as needed + child: Text( + errorMessage!, + style: TextStyle( + color: errorColor, + fontSize: 12.f, ), ), - if (widget.isTextIsPassword) ...[ - 16.width, - Icon(isObscureText ? Icons.visibility_rounded : Icons.visibility_off_rounded).onPress(() { - setState(() { - isObscureText = !isObscureText; - }); - }) - ], - if (widget.hasSelection) const Icon(Icons.keyboard_arrow_down_outlined), - if (widget.suffixIcon != null && widget.suffixTap == null) Icon(widget.suffixIcon!), - ], + ), + ], + ); + } + + Widget _buildLeadingIcon(BuildContext context) { + return Container( + height: 40.h, + width: 40.h, + margin: EdgeInsets.only(right: 10.h), + padding: EdgeInsets.all(8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + borderRadius: 12.r, + color: AppColors.greyColor, ), + child: Utils.buildSvgWithAssets(icon: leadingIcon!)); + } + + Widget _buildTrailingIcon(BuildContext context) { + final AppState appState = getIt.get(); + return Container( + height: 40.h, + width: 40.h, + margin: EdgeInsets.zero, + padding: EdgeInsets.all(8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 12.r, color: AppColors.whiteColor), + child: GestureDetector( + onTap: () async { + bool isGregorian = true; + final picked = await showHijriGregBottomSheet(context, + isShowTimeSlots: true, + switcherIcon: Utils.buildSvgWithAssets(icon: AppAssets.language, width: 24.h, height: 24.h), + language: appState.getLanguageCode()!, + initialDate: DateTime.now(), + fontFamily: appState.getLanguageCode() == "ar" ? "GESSTwo" : "Poppins", + okWidget: Padding(padding: EdgeInsets.only(right: 8.h), child: Utils.buildSvgWithAssets(icon: AppAssets.confirm, width: 24.h, height: 24.h)), + cancelWidget: Padding( + padding: EdgeInsets.only(right: 8.h), + child: Utils.buildSvgWithAssets(icon: AppAssets.cancel, iconColor: Colors.white, width: 24.h, height: 24.h)), + onCalendarTypeChanged: (bool value) { + isGregorian = value; + }); + if (picked != null && onChange != null) { + if (onCalendarTypeChanged != null) { + onCalendarTypeChanged!.call(isGregorian); + } + onChange!(picked.toString()); + } + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.calendar), + ), + ); + } + + Widget _buildLabelText(Color? labelColor) { + return Text( + labelText, + style: TextStyle( + fontSize: 12.f, + fontWeight: FontWeight.w500, + color: labelColor ?? AppColors.inputLabelTextColor, + letterSpacing: -0, ), ); } + + Widget _buildTextField(BuildContext context) { + double fontS = fontSize ?? 14.f; + return TextField( + enabled: isEnable, + scrollPadding: EdgeInsets.zero, + keyboardType: keyboardType, + controller: controller, + readOnly: isReadOnly, + textAlignVertical: TextAlignVertical.top, + textAlign: TextAlign.left, + textDirection: TextDirection.ltr, + onChanged: onChange, + focusNode: focusNode ?? _focusNode, + autofocus: autoFocus, + textInputAction: TextInputAction.done, + cursorHeight: isWalletAmountInput! ? 40.h : 20.h, + onTapOutside: (event) { + FocusManager.instance.primaryFocus?.unfocus(); + }, + onSubmitted: onSubmitted, + style: TextStyle(fontSize: fontS, height: isWalletAmountInput! ? 1 / 4 : 0, fontWeight: FontWeight.w500, color: AppColors.textColor, letterSpacing: -1), + decoration: InputDecoration( + isDense: true, + hintText: hintText, + hintStyle: TextStyle(fontSize: 14.f, height: 21 / 16, fontWeight: FontWeight.w500, color: Color(0xff898A8D), letterSpacing: -0.75), + prefixIconConstraints: BoxConstraints(minWidth: 30.h), + prefixIcon: prefix == null ? null : "+${prefix!}".toText14(letterSpacing: -1, color: AppColors.textColor, weight: FontWeight.w500), + contentPadding: EdgeInsets.zero, + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + ); + } + + _buildTrailingIconForSearch(BuildContext context) { + return Container( + height: 40.h, + width: 40.h, + margin: EdgeInsets.zero, + padding: EdgeInsets.all(8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 12.r, color: AppColors.whiteColor), + child: Utils.buildSvgWithAssets(icon: AppAssets.search_icon), + ); + } } diff --git a/lib/widgets/language_switcher.dart b/lib/widgets/language_switcher.dart new file mode 100644 index 0000000..91e45b2 --- /dev/null +++ b/lib/widgets/language_switcher.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class LanguageSelector extends StatefulWidget { + final String currentLanguage; + final ValueChanged onLanguageChanged; + final List> languages; + final bool showOnlyIcon; + + const LanguageSelector({ + super.key, + required this.currentLanguage, + required this.onLanguageChanged, + required this.languages, + required this.showOnlyIcon, + }); + + @override + State createState() => _LanguageSelectorState(); +} + +class _LanguageSelectorState extends State { + @override + Widget build(BuildContext context) { + final currentLangData = widget.languages.firstWhere( + (lang) => lang['code'] == widget.currentLanguage, + orElse: () => {'code': 'en', 'name': 'English'}, + ); + + if (widget.showOnlyIcon) { + return InkWell( + onTap: () { + final newLanguage = widget.currentLanguage == 'ar' ? 'en' : 'ar'; + widget.onLanguageChanged(newLanguage); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.globe_black)); + } else { + return Stack(clipBehavior: Clip.none, children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular((10.r)), + color: AppColors.secondaryLightRedColor, + ), + child: InkWell( + onTap: () { + final newLanguage = widget.currentLanguage == 'ar' ? 'en' : 'ar'; + widget.onLanguageChanged(newLanguage); + }, + child: Container( + padding: EdgeInsets.all(8.h), + decoration: BoxDecoration(borderRadius: BorderRadius.circular((12.r))), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.language), + SizedBox(width: 6.h), + Text( + currentLangData['name']?.toUpperCase() ?? 'EN', + style: context.dynamicTextStyle( + fontWeight: FontWeight.w500, + fontSize: 14.f, + color: AppColors.primaryRedColor, + letterSpacing: 0.1, + isLanguageSwitcher: true, + ), + ), + ], + ), + ), + ), + ), + ]); + } + } +} diff --git a/lib/widgets/loader/bottomsheet_loader.dart b/lib/widgets/loader/bottomsheet_loader.dart new file mode 100644 index 0000000..813ad5b --- /dev/null +++ b/lib/widgets/loader/bottomsheet_loader.dart @@ -0,0 +1,49 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:get_it/get_it.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; + +class LoaderBottomSheet { + static final NavigationService _navService = GetIt.I(); + static bool _isVisible = false; + + static void showLoader({String? loadingText}) { + if (_isVisible) return; + + _isVisible = true; + + final context = _navService.navigatorKey.currentContext!; + showModalBottomSheet( + context: context, + isDismissible: (ApiConsts.appEnvironmentType == AppEnvironmentTypeEnum.uat || kDebugMode) ? true : false, + enableDrag: false, + constraints: BoxConstraints(minWidth: MediaQuery.of(context).size.width), + backgroundColor: Colors.transparent, + builder: (_) { + return Container( + height: MediaQuery.of(context).size.height * 0.3, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(16)), + ), + child: Center( + child: Utils.getLoadingWidget(loadingText: loadingText), + ), + ); + }, + ).whenComplete(() { + // reset state if dismissed by system + _isVisible = false; + }); + } + + static void hideLoader() { + if (_isVisible) { + Navigator.of(_navService.navigatorKey.currentContext!).pop(); + _isVisible = false; + } + } +} diff --git a/lib/widgets/loading_dialog.dart b/lib/widgets/loading_dialog.dart index b2ea410..3c2440a 100644 --- a/lib/widgets/loading_dialog.dart +++ b/lib/widgets/loading_dialog.dart @@ -37,7 +37,7 @@ class _LoadingDialogState extends State { borderRadius: BorderRadius.circular(16), ), elevation: 0, - backgroundColor: whiteColor, + backgroundColor: AppColors.whiteColor, child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, @@ -49,7 +49,7 @@ class _LoadingDialogState extends State { children: [ Lottie.asset('assets/json/loading_animation.json', repeat: true, reverse: false, frameRate: FrameRate(60)), 24.height, - LocaleKeys.loadingText.tr(context: context).toText16(color: blackColor) + LocaleKeys.loadingText.tr(context: context).toText16(color: AppColors.blackColor) ], ), ), diff --git a/lib/widgets/map/HMSMap.dart b/lib/widgets/map/HMSMap.dart new file mode 100644 index 0000000..f655479 --- /dev/null +++ b/lib/widgets/map/HMSMap.dart @@ -0,0 +1,63 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:huawei_map/huawei_map.dart' ; + +class HMSMap extends StatefulWidget{ + final CameraPosition currentLocation; + final Function(CameraPosition) onCameraMoved; + final VoidCallback onCameraIdle; + final MapType mapType; + final bool compassEnabled; + final bool myLocationEnabled; + final bool showCenterMarker; + final Completer? inputController; + + HMSMap({super.key, required this.currentLocation ,required this.onCameraMoved,required this.onCameraIdle, + this.mapType = MapType.normal,this.compassEnabled = false,this.showCenterMarker = false, + this.myLocationEnabled = true, this.inputController}); + + @override + State createState() => _HMSMapState(); +} + +class _HMSMapState extends State { + Completer? controller; + + @override + void initState() { + HuaweiMapInitializer.initializeMap(); + controller = widget.inputController ?? Completer(); + super.initState(); + } + // @override + @override + Widget build(BuildContext context) => + Stack( + children: [ + HuaweiMap( + mapType: widget.mapType, + zoomControlsEnabled: false, + myLocationEnabled: widget.myLocationEnabled, + myLocationButtonEnabled: false, + compassEnabled: widget.compassEnabled, + onCameraIdle:()=> widget.onCameraIdle(), + initialCameraPosition: widget.currentLocation, + onCameraMove: (value) => widget.onCameraMoved(value), + onMapCreated: (HuaweiMapController controller) { + this.controller?.complete(controller); + }, + ), + Visibility( + visible: widget.showCenterMarker, + child: Align( + alignment: Alignment.center, + child: Utils.buildSvgWithAssets(icon: AppAssets.pin_location, width: 24.w, height: 36.h), + ), + ) + ], + ); +} \ No newline at end of file diff --git a/lib/widgets/map/map.dart b/lib/widgets/map/map.dart new file mode 100644 index 0000000..0c67f1b --- /dev/null +++ b/lib/widgets/map/map.dart @@ -0,0 +1,53 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; + +class GMSMap extends StatelessWidget{ + Completer? controller; + final CameraPosition currentLocation; + final Function(CameraPosition) onCameraMoved; + final VoidCallback onCameraIdle; + final MapType mapType; + final bool compassEnabled; + final bool myLocationEnabled; + final bool showCenterMarker; + + + GMSMap({super.key, required this.currentLocation ,required this.onCameraMoved,required this.onCameraIdle, + this.mapType = MapType.normal,this.compassEnabled = false,this.showCenterMarker = false, + this.myLocationEnabled = true,Completer? inputController}){ + controller = inputController ?? Completer(); + } + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + GoogleMap( + mapType: mapType, + zoomControlsEnabled: false, + myLocationEnabled: myLocationEnabled, + myLocationButtonEnabled: false, + compassEnabled: compassEnabled, + initialCameraPosition: currentLocation, + onCameraMove: (value) => onCameraMoved(value), + onCameraIdle: ()=>onCameraIdle(), + onMapCreated: (GoogleMapController controller) { + this.controller?.complete(controller); + }, + ), + Visibility( + visible: showCenterMarker, + child: Align( + alignment: Alignment.center, + child: Utils.buildSvgWithAssets(icon: AppAssets.pin_location, width: 24.w, height: 36.h), + ), + ) + ], + ); + } +} \ No newline at end of file diff --git a/lib/widgets/nfc/nfc_reader_sheet.dart b/lib/widgets/nfc/nfc_reader_sheet.dart new file mode 100644 index 0000000..b76b36f --- /dev/null +++ b/lib/widgets/nfc/nfc_reader_sheet.dart @@ -0,0 +1,212 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_nfc_kit/flutter_nfc_kit.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +void showNfcReader(BuildContext context, {required Function onNcfScan, required VoidCallback onCancel}) { + showModalBottomSheet( + context: context, + enableDrag: false, + isDismissible: true, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12)), + ), + backgroundColor: Colors.white, + builder: (context) { + return NfcLayout( + onNcfScan: onNcfScan, + onCancel: onCancel, + ); + }); +} + +class NfcLayout extends StatefulWidget { + Function? onNcfScan; + VoidCallback? onCancel; + + NfcLayout({this.onNcfScan, this.onCancel}); + + @override + _NfcLayoutState createState() => _NfcLayoutState(); +} + +class _NfcLayoutState extends State { + bool _reading = false; + Widget? mainWidget; + late String nfcId; + + @override + void initState() { + super.initState(); + readNFC(); + } + + void readNFC() async { + FlutterNfcKit.finish(); + FlutterNfcKit.poll(timeout: Duration(seconds: 10), androidPlatformSound: true, androidCheckNDEF: false, iosMultipleTagMessage: "Multiple tags found!").then((value) async { + setState(() { + _reading = true; + mainWidget = doneNfc(); + }); + Future.delayed(const Duration(milliseconds: 500), () async { + await FlutterNfcKit.finish(); + widget.onNcfScan!(nfcId); + Navigator.pop(context); + }); + nfcId = value.id; + }).catchError((err) { + print(err); + Navigator.of(context).pop(); + }); + } + + @override + Widget build(BuildContext context) { + // return SizedBox(); + (mainWidget == null && !_reading) ? mainWidget = scanNfc() : mainWidget = doneNfc(); + return Platform.isAndroid ? AnimatedSwitcher(duration: Duration(milliseconds: 500), child: mainWidget) : SizedBox.shrink(); + } + + Widget scanNfc() { + return Container( + key: ValueKey(1), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: 30, + ), + Text( + "Ready To Scan", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 24, + ), + ), + SizedBox( + height: 30, + ), + SvgPicture.asset( + "assets/images/nfc/contactless.svg", + height: MediaQuery.of(context).size.width / 3, + ), + SizedBox( + height: 30, + ), + Text( + "Approach an NFC Tag", + style: TextStyle( + fontSize: 18, + ), + ), + SizedBox( + height: 30, + ), + ButtonTheme( + minWidth: MediaQuery.of(context).size.width / 1.2, + height: 45.0, + buttonColor: Colors.grey[300], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6), + ), + child: CustomButton( + text: LocaleKeys.cancel.tr(), + onPressed: () { + widget.onCancel!(); + Navigator.pop(context); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12.h, + height: 40.h, + icon: AppAssets.cancel, + iconColor: AppColors.whiteColor, + iconSize: 16.h, + ), + ), + SizedBox( + height: 30, + ), + ], + ), + ); + } + + Widget doneNfc() { + return Container( + key: ValueKey(2), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: 30, + ), + Text( + "Successfully Scanned", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 24, + ), + ), + SizedBox( + height: 30, + ), + Image.asset( + "assets/images/nfc/ic_done.png", + height: MediaQuery.of(context).size.width / 3, + ), + SizedBox( + height: 30, + ), + Text( + "Approach an NFC Tag", + style: TextStyle( + fontSize: 18, + ), + ), + SizedBox( + height: 30, + ), + ButtonTheme( + minWidth: MediaQuery.of(context).size.width / 1.2, + height: 45.0, + buttonColor: Colors.grey[300], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6), + ), + child: CustomButton( + text: LocaleKeys.done.tr(), + onPressed: () { + widget.onCancel!(); + Navigator.pop(context); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12.h, + height: 40.h, + icon: AppAssets.cancel, + iconColor: AppColors.whiteColor, + iconSize: 16.h, + ), + ), + SizedBox( + height: 30, + ), + ], + ), + ); + } +} diff --git a/lib/widgets/order_tracking/order_tracking_state.dart b/lib/widgets/order_tracking/order_tracking_state.dart new file mode 100644 index 0000000..5389488 --- /dev/null +++ b/lib/widgets/order_tracking/order_tracking_state.dart @@ -0,0 +1,8 @@ +enum OrderTrackingState { + waitingForCall, + dispactched, + returning, + ended, + failed, + cancel +} \ No newline at end of file diff --git a/lib/widgets/order_tracking/request_tracking.dart b/lib/widgets/order_tracking/request_tracking.dart new file mode 100644 index 0000000..c0847f9 --- /dev/null +++ b/lib/widgets/order_tracking/request_tracking.dart @@ -0,0 +1,163 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/order_tracking/order_tracking_state.dart'; + +class OrderTrackingWidget extends StatelessWidget { + final double? height; + final OrderTrackingState? state; + final double parentPaddingValue; + + const OrderTrackingWidget({super.key, this.height, required this.state, required this.parentPaddingValue}); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: MediaQuery + .sizeOf(context) + .width, + height: height, + child: getBarAndDot(state, context, MediaQuery + .sizeOf(context) + .width), + ); + } + + Widget? getBarAndDot(OrderTrackingState? state, BuildContext context, + double width) { + print("the parent padding value is $parentPaddingValue"); + print("the parent padding value is ${(parentPaddingValue+24)}"); + print("the width - (parentPaddingValue+24) ${(width - (parentPaddingValue+24))}"); + double widthOfOneState = (width/4) - (parentPaddingValue+8.h); + print("te width of one state is $widthOfOneState"); + print("the value of${width/4}"); + if(state == null) { + return Row( + children: List.generate(4, (index) { + if (index == 0) { + return oneProgressBar(widthOfOneState, AppColors.primaryRedColor, true); + } else { + return oneProgressBar(widthOfOneState, AppColors.greyLightColor, false); + } + })); + } + switch (state) { + case OrderTrackingState.waitingForCall: + return Row( + children: List.generate(4, (index){ + if(index == 0) { + return oneProgressBar(widthOfOneState, AppColors.primaryRedColor, true); + } else { + return oneProgressBar(widthOfOneState, AppColors.greyLightColor, false); + } + }) + ); + + case OrderTrackingState.dispactched: + return Row( + children: List.generate(4, (index){ + if(index == 1 || index == 0) { + return oneProgressBar(widthOfOneState, AppColors.primaryRedColor, index == 1 ); + } else { + return oneProgressBar(widthOfOneState, AppColors.greyLightColor, false); + } + }) + ); + case OrderTrackingState.returning: + return Row( + children: List.generate(4, (index){ + if(index == 2 || index == 1 || index == 0) { + return oneProgressBar(widthOfOneState, AppColors.primaryRedColor, index == 2); + } else { + return oneProgressBar(widthOfOneState, AppColors.greyLightColor, false); + } + }) + ); + case OrderTrackingState.ended: + return Row( + children: List.generate(4, (index){ + // if(index == 3) { + return oneProgressBar(widthOfOneState, AppColors.successLightColor, index == 3); + // } else { + // return oneProgressBar(widthOfOneState, AppColors.greyLightColor, false); + // } + }) + ); + case OrderTrackingState.failed: + return Row( + children: List.generate(4, (index){ + // if(index == 3) { + return oneProgressBar(widthOfOneState, AppColors.errorColor, index == 3); + // } else { + // return oneProgressBar(widthOfOneState, AppColors.greyLightColor, false); + // } + }) + ); + case OrderTrackingState.cancel: + return Row( + children: List.generate(4, (index){ + // if(index == 3) { + return oneProgressBar(widthOfOneState, AppColors.errorColor, index == 3); + // } else { + // return oneProgressBar(widthOfOneState, AppColors.greyLightColor, false); + // } + }) + ); + } + } + + Widget oneProgressBar(double width, Color color, bool hasThumb) { + return Row( + children: [ + AnimatedSize( + duration: const Duration(seconds:1), + child: SizedBox( + height: 28.h, + width: width, + child: Stack( + clipBehavior: Clip.none, + children: [ + SizedBox( + height: 28.h, + child: Container( + width: width, + height: height, + decoration: BoxDecoration( + color: color, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(30.h) + ), + ), + ), + + Visibility( + visible: hasThumb, + child: Positioned( + top: -6.h, // move thumb above bar center + left: width - 22.h, // move to right end + child: thumb(color), + ), + ) + ], + ), + ), + ), + SizedBox(width: 8.h) + ], + ); + } + + Widget thumb(Color color) { + return Container( + width: 18.h, + height: 18.h, + padding: EdgeInsets.zero, + decoration: BoxDecoration( + color: color, + shape: BoxShape.circle, + border: Border.all(color: Colors.white, width: 2.h) + ), + ); + } + +} \ No newline at end of file diff --git a/lib/widgets/otp_widget.dart b/lib/widgets/otp_widget.dart deleted file mode 100644 index d606090..0000000 --- a/lib/widgets/otp_widget.dart +++ /dev/null @@ -1,377 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/animation.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter/services.dart'; - -typedef OnDone = void Function(String text); - -class ProvidedPinBoxTextAnimation { - static AnimatedSwitcherTransitionBuilder scalingTransition = (child, animation) { - return ScaleTransition( - child: child, - scale: animation, - ); - }; - - static AnimatedSwitcherTransitionBuilder defaultNoTransition = (Widget child, Animation animation) { - return child; - }; -} - -class OTPWidget extends StatefulWidget { - final int maxLength; - late TextEditingController? controller; - - final Color defaultBorderColor; - final Color pinBoxColor; - final double pinBoxBorderWidth; - final double pinBoxRadius; - final bool hideDefaultKeyboard; - - final TextStyle? pinTextStyle; - final double pinBoxHeight; - final double pinBoxWidth; - final OnDone? onDone; - final bool hasError; - final Color errorBorderColor; - final Color textBorderColor; - final Function(String)? onTextChanged; - final bool autoFocus; - final FocusNode? focusNode; - final AnimatedSwitcherTransitionBuilder? pinTextAnimatedSwitcherTransition; - final Duration pinTextAnimatedSwitcherDuration; - final TextDirection textDirection; - final TextInputType keyboardType; - final EdgeInsets pinBoxOuterPadding; - - OTPWidget({ - Key? key, - this.maxLength = 4, - this.controller, - this.pinBoxWidth = 70.0, - this.pinBoxHeight = 70.0, - this.pinTextStyle, - this.onDone, - this.defaultBorderColor = Colors.black, - this.textBorderColor = Colors.black, - this.pinTextAnimatedSwitcherTransition, - this.pinTextAnimatedSwitcherDuration = const Duration(), - this.hasError = false, - this.errorBorderColor = Colors.red, - this.onTextChanged, - this.autoFocus = false, - this.focusNode, - this.textDirection = TextDirection.ltr, - this.keyboardType = TextInputType.number, - this.pinBoxOuterPadding = const EdgeInsets.symmetric(horizontal: 4.0), - this.pinBoxColor = Colors.white, - this.pinBoxBorderWidth = 2.0, - this.pinBoxRadius = 0, - this.hideDefaultKeyboard = false, - }) : super(key: key); - - @override - State createState() { - return OTPWidgetState(); - } -} - -class OTPWidgetState extends State with SingleTickerProviderStateMixin { - late AnimationController _highlightAnimationController; - late FocusNode focusNode; - String text = ""; - int currentIndex = 0; - List strList = []; - bool hasFocus = false; - - @override - void didUpdateWidget(OTPWidget oldWidget) { - super.didUpdateWidget(oldWidget); - focusNode = widget.focusNode ?? focusNode; - - if (oldWidget.maxLength < widget.maxLength) { - setState(() { - currentIndex = text.length; - }); - widget.controller?.text = text; - widget.controller?.selection = TextSelection.collapsed(offset: text.length); - } else if (oldWidget.maxLength > widget.maxLength && widget.maxLength > 0 && text.length > 0 && text.length > widget.maxLength) { - setState(() { - text = text.substring(0, widget.maxLength); - currentIndex = text.length; - }); - widget.controller?.text = text; - widget.controller?.selection = TextSelection.collapsed(offset: text.length); - } - } - - _calculateStrList() { - if (strList.length > widget.maxLength) { - strList.length = widget.maxLength; - } - while (strList.length < widget.maxLength) { - strList.add(""); - } - } - - @override - void initState() { - super.initState(); - focusNode = widget.focusNode ?? FocusNode(); - _highlightAnimationController = AnimationController(vsync: this); - _initTextController(); - _calculateStrList(); - widget.controller!.addListener(_controllerListener); - focusNode.addListener(_focusListener); - } - - void _controllerListener() { - if (mounted == true) { - setState(() { - _initTextController(); - }); - var onTextChanged = widget.onTextChanged; - if (onTextChanged != null) { - onTextChanged(widget.controller?.text ?? ""); - } - } - } - - void _focusListener() { - if (mounted == true) { - setState(() { - hasFocus = focusNode?.hasFocus ?? false; - }); - } - } - - void _initTextController() { - if (widget.controller == null) { - return; - } - strList.clear(); - var text = widget.controller?.text ?? ""; - if (text.isNotEmpty) { - if (text.length > widget.maxLength) { - throw Exception("TextEditingController length exceeded maxLength!"); - } - } - for (var i = 0; i < text.length; i++) { - strList.add(text[i]); - } - } - - double get _width { - var width = 0.0; - for (var i = 0; i < widget.maxLength; i++) { - width += widget.pinBoxWidth; - if (i == 0) { - width += widget.pinBoxOuterPadding.left; - } else if (i + 1 == widget.maxLength) { - width += widget.pinBoxOuterPadding.right; - } else { - width += widget.pinBoxOuterPadding.left; - } - } - return width; - } - - @override - void dispose() { - if (widget.focusNode == null) { - focusNode.dispose(); - } else { - focusNode.removeListener(_focusListener); - } - _highlightAnimationController.dispose(); - widget.controller?.removeListener(_controllerListener); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - _otpTextInput(), - _touchPinBoxRow(), - ], - ); - } - - Widget _touchPinBoxRow() { - return widget.hideDefaultKeyboard - ? _pinBoxRow(context) - : GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - if (hasFocus) { - FocusScope.of(context).requestFocus(FocusNode()); - Future.delayed(Duration(milliseconds: 100), () { - FocusScope.of(context).requestFocus(focusNode); - }); - } else { - FocusScope.of(context).requestFocus(focusNode); - } - }, - child: _pinBoxRow(context), - ); - } - - Widget _otpTextInput() { - var transparentBorder = OutlineInputBorder( - borderSide: BorderSide( - color: Colors.transparent, - width: 0.0, - ), - ); - return Container( - width: _width, - height: widget.pinBoxHeight, - child: TextField( - autofocus: !kIsWeb ? widget.autoFocus : false, - enableInteractiveSelection: false, - focusNode: focusNode, - controller: widget.controller, - keyboardType: widget.keyboardType, - inputFormatters: widget.keyboardType == TextInputType.number ? [FilteringTextInputFormatter.digitsOnly] : null, - style: TextStyle( - height: 0.1, - color: Colors.transparent, - ), - decoration: InputDecoration( - contentPadding: EdgeInsets.all(0), - focusedErrorBorder: transparentBorder, - errorBorder: transparentBorder, - disabledBorder: transparentBorder, - enabledBorder: transparentBorder, - focusedBorder: transparentBorder, - counterText: null, - counterStyle: null, - helperStyle: TextStyle( - height: 0.0, - color: Colors.transparent, - ), - labelStyle: TextStyle(height: 0.1), - fillColor: Colors.transparent, - border: InputBorder.none, - ), - cursorColor: Colors.transparent, - showCursor: false, - maxLength: widget.maxLength, - onChanged: _onTextChanged, - ), - ); - } - - void _onTextChanged(text) { - var onTextChanged = widget.onTextChanged; - if (onTextChanged != null) { - onTextChanged(text); - } - setState(() { - this.text = text; - if (text.length >= currentIndex) { - for (int i = currentIndex; i < text.length; i++) { - strList[i] = text[i]; - } - } - currentIndex = text.length; - }); - if (text.length == widget.maxLength) { - FocusScope.of(context).requestFocus(FocusNode()); - var onDone = widget.onDone; - if (onDone != null) { - onDone(text); - } - } - } - - Widget _pinBoxRow(BuildContext context) { - _calculateStrList(); - List pinCodes = List.generate(widget.maxLength, (int i) { - return _buildPinCode(i, context); - }); - return Row( - children: pinCodes, - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - ); - } - - Widget _buildPinCode(int i, BuildContext context) { - Color borderColor; - Color pinBoxColor = widget.pinBoxColor; - - if (widget.hasError) { - borderColor = widget.errorBorderColor; - } else if (i < text.length) { - borderColor = widget.textBorderColor; - } else { - borderColor = widget.defaultBorderColor; - pinBoxColor = widget.pinBoxColor; - } - - EdgeInsets insets; - if (i == 0) { - insets = EdgeInsets.only( - left: 0, - top: widget.pinBoxOuterPadding.top, - right: widget.pinBoxOuterPadding.right, - bottom: widget.pinBoxOuterPadding.bottom, - ); - } else if (i == strList.length - 1) { - insets = EdgeInsets.only( - left: widget.pinBoxOuterPadding.left, - top: widget.pinBoxOuterPadding.top, - right: 0, - bottom: widget.pinBoxOuterPadding.bottom, - ); - } else { - insets = widget.pinBoxOuterPadding; - } - return Container( - key: ValueKey("container$i"), - alignment: Alignment.center, - padding: EdgeInsets.symmetric(vertical: 4.0, horizontal: 1.0), - margin: insets, - child: _animatedTextBox(strList[i], i), - decoration: BoxDecoration( - border: Border.all( - color: borderColor, - width: widget.pinBoxBorderWidth, - ), - color: pinBoxColor, - borderRadius: BorderRadius.circular(widget.pinBoxRadius), - ), - width: widget.pinBoxWidth, - height: widget.pinBoxHeight, - ); - } - - Widget _animatedTextBox(String text, int i) { - if (widget.pinTextAnimatedSwitcherTransition != null) { - return AnimatedSwitcher( - duration: widget.pinTextAnimatedSwitcherDuration, - transitionBuilder: widget.pinTextAnimatedSwitcherTransition ?? - (Widget child, Animation animation) { - return child; - }, - child: Text( - text, - key: ValueKey("$text$i"), - style: widget.pinTextStyle, - ), - ); - } else { - return Text( - text, - key: ValueKey("${strList[i]}$i"), - style: widget.pinTextStyle, - ); - } - } -} diff --git a/lib/widgets/phone_number_input.dart b/lib/widgets/phone_number_input.dart index 3266998..83ddcf1 100644 --- a/lib/widgets/phone_number_input.dart +++ b/lib/widgets/phone_number_input.dart @@ -62,14 +62,14 @@ class _PhoneNumberInputState extends State { .map( (code) => DropdownMenuItem( value: code, - child: code.toText16(color: mainPurple, isBold: true), + child: code.toText16(color: AppColors.mainPurple, isBold: true), ), ) .toList(), onChanged: _onCountryCodeChanged, icon: const Icon( Icons.keyboard_arrow_down_rounded, - color: mainPurple, + color: AppColors.mainPurple, ), ), ), diff --git a/lib/widgets/radio/custom_radio_button.dart b/lib/widgets/radio/custom_radio_button.dart new file mode 100644 index 0000000..080fcb3 --- /dev/null +++ b/lib/widgets/radio/custom_radio_button.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class CustomRadioOption extends StatelessWidget { + final T value; + final T? groupValue; + final ValueChanged onChanged; + final String text; + + // final Widget child; // The content of your radio option (e.g., Text, Image) + + const CustomRadioOption({ + super.key, + required this.value, + required this.groupValue, + required this.onChanged, + // required this.child, + required this.text, + }); + + @override + Widget build(BuildContext context) { + // bool isSelected = value == groupValue; + bool isSelected = false; + return InkWell( + onTap: () => onChanged(value), + child: Container( + padding: EdgeInsets.all(8.h), + child: Row( + children: [ + Container( + width: 20.h, + height: 20.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: isSelected ? AppColors.primaryRedColor : AppColors.whiteColor, + border: Border.all(color: isSelected ? AppColors.primaryRedColor : AppColors.bottomNAVBorder, width: 2.h), + ), + ), + SizedBox(width: 8.h), + text.toText16(weight: FontWeight.w500), // The provided content + ], + ), + ), + ); + } +} diff --git a/lib/widgets/routes/custom_page_route.dart b/lib/widgets/routes/custom_page_route.dart new file mode 100644 index 0000000..b89d710 --- /dev/null +++ b/lib/widgets/routes/custom_page_route.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/physics.dart'; + +/// Reusable spring route +class CustomPageRoute extends PageRouteBuilder { + final Widget page; + final AxisDirection direction; + final bool fullScreenDialog; + + + CustomPageRoute({required this.page, this.direction = AxisDirection.right, this.fullScreenDialog = false, super.settings}) + : super( + + transitionDuration: const Duration(milliseconds: 1500), + reverseTransitionDuration: const Duration(milliseconds: 500), + fullscreenDialog: fullScreenDialog, + pageBuilder: (_, __, ___) => page, + transitionsBuilder: (context, animation, secondaryAnimation, child) { + final spring = SpringDescription(mass: 1, stiffness: 100, damping: 15); + + // Drive animation with spring + final curvedAnimation = animation.drive( + Tween(begin: 0.0, end: 1.0).chain(CurveTween(curve: _SpringCurve(spring))), + ); + + // Choose offset based on direction + Offset beginOffset; + switch (direction) { + case AxisDirection.left: + beginOffset = const Offset(-1.0, 0.0); + break; + case AxisDirection.right: + beginOffset = const Offset(1.0, 0.0); + break; + case AxisDirection.up: + beginOffset = const Offset(0.0, -1.0); + break; + case AxisDirection.down: + beginOffset = const Offset(0.0, 1.0); + break; + } + + final offsetAnimation = Tween(begin: beginOffset, end: Offset.zero).animate(curvedAnimation); + + return SlideTransition( + position: offsetAnimation, + child: child, + ); + }, + ); +} + +/// Custom spring curve +class _SpringCurve extends Curve { + final SpringDescription spring; + + _SpringCurve(this.spring); + + @override + double transform(double t) { + final sim = SpringSimulation(spring, 0, 1, 0); + return sim.x(t * 1.5); // scaled time + } +} diff --git a/lib/widgets/routes/spring_page_route_builder.dart b/lib/widgets/routes/spring_page_route_builder.dart new file mode 100644 index 0000000..0533408 --- /dev/null +++ b/lib/widgets/routes/spring_page_route_builder.dart @@ -0,0 +1,39 @@ +import 'package:flutter/physics.dart'; +import 'package:flutter/widgets.dart'; + +PageRouteBuilder springPageRoute(Widget page) { + return PageRouteBuilder( + pageBuilder: (_, __, ___) => page, + transitionDuration: const Duration(milliseconds: 1500), + reverseTransitionDuration: const Duration(milliseconds: 500), + transitionsBuilder: (context, animation, secondaryAnimation, child) { + final spring = SpringDescription(mass: 1, stiffness: 100, damping: 15); + + final curvedAnimation = animation.drive( + Tween(begin: 0.0, end: 1.0).chain(CurveTween(curve: _SpringCurve(spring))), + ); + + final offsetAnimation = Tween( + begin: const Offset(-1.0, 0.0), // slide from left + end: Offset.zero, + ).animate(curvedAnimation); + + return SlideTransition( + position: offsetAnimation, + child: child, + ); + }, + ); +} + +class _SpringCurve extends Curve { + final SpringDescription spring; + + _SpringCurve(this.spring); + + @override + double transform(double t) { + final sim = SpringSimulation(spring, 0, 1, 0); + return sim.x(t * 1.5); // scale time so it completes properly + } +} diff --git a/lib/widgets/shimmer/movies_shimmer_widget.dart b/lib/widgets/shimmer/movies_shimmer_widget.dart index 378f0d8..fb1af25 100644 --- a/lib/widgets/shimmer/movies_shimmer_widget.dart +++ b/lib/widgets/shimmer/movies_shimmer_widget.dart @@ -14,7 +14,7 @@ class MoviesShimmerWidget extends StatelessWidget { borderRadius: const BorderRadius.all( Radius.circular(10), ), - border: Border.all(color: lightGreyEFColor, width: 1), + border: Border.all(color: AppColors.lightGreyEFColor, width: 1), boxShadow: [ BoxShadow( color: const Color(0xff000000).withOpacity(.05), diff --git a/pubspec.lock b/pubspec.lock deleted file mode 100644 index 6946082..0000000 --- a/pubspec.lock +++ /dev/null @@ -1,1577 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _flutterfire_internals: - dependency: transitive - description: - name: _flutterfire_internals - sha256: ff0a84a2734d9e1089f8aedd5c0af0061b82fb94e95260d943404e0ef2134b11 - url: "https://pub.dev" - source: hosted - version: "1.3.59" - archive: - dependency: transitive - description: - name: archive - sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" - url: "https://pub.dev" - source: hosted - version: "4.0.7" - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" - async: - dependency: transitive - description: - name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.dev" - source: hosted - version: "2.13.0" - audio_session: - dependency: transitive - description: - name: audio_session - sha256: "2b7fff16a552486d078bfc09a8cde19f426dc6d6329262b684182597bec5b1ac" - url: "https://pub.dev" - source: hosted - version: "0.1.25" - auto_size_text: - dependency: "direct main" - description: - name: auto_size_text - sha256: "3f5261cd3fb5f2a9ab4e2fc3fba84fd9fcaac8821f20a1d4e71f557521b22599" - url: "https://pub.dev" - source: hosted - version: "3.0.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - cached_network_image: - dependency: "direct main" - description: - name: cached_network_image - sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" - url: "https://pub.dev" - source: hosted - version: "3.4.1" - cached_network_image_platform_interface: - dependency: transitive - description: - name: cached_network_image_platform_interface - sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" - url: "https://pub.dev" - source: hosted - version: "4.1.1" - cached_network_image_web: - dependency: transitive - description: - name: cached_network_image_web - sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" - url: "https://pub.dev" - source: hosted - version: "1.3.1" - carp_serializable: - dependency: transitive - description: - name: carp_serializable - sha256: f039f8ea22e9437aef13fe7e9743c3761c76d401288dcb702eadd273c3e4dcef - url: "https://pub.dev" - source: hosted - version: "2.0.1" - characters: - dependency: transitive - description: - name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - connectivity_plus: - dependency: "direct main" - description: - name: connectivity_plus - sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec - url: "https://pub.dev" - source: hosted - version: "6.1.5" - connectivity_plus_platform_interface: - dependency: transitive - description: - name: connectivity_plus_platform_interface - sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" - url: "https://pub.dev" - source: hosted - version: "2.0.1" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.dev" - source: hosted - version: "0.3.4+2" - crypto: - dependency: transitive - description: - name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.dev" - source: hosted - version: "3.0.6" - csslib: - dependency: transitive - description: - name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" - source: hosted - version: "1.0.8" - dbus: - dependency: transitive - description: - name: dbus - sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.dev" - source: hosted - version: "0.7.11" - device_calendar: - dependency: "direct main" - description: - path: "." - ref: HEAD - resolved-ref: "5ea5ed9e2bb499c0633383b53103f2920b634755" - url: "https://github.com/bardram/device_calendar" - source: git - version: "4.3.1" - device_info_plus: - dependency: "direct main" - description: - name: device_info_plus - sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" - url: "https://pub.dev" - source: hosted - version: "11.5.0" - device_info_plus_platform_interface: - dependency: transitive - description: - name: device_info_plus_platform_interface - sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f - url: "https://pub.dev" - source: hosted - version: "7.0.3" - dropdown_search: - dependency: "direct main" - description: - name: dropdown_search - sha256: c29b3e5147a82a06a4a08b3b574c51cb48cc17ad89893d53ee72a6f86643622e - url: "https://pub.dev" - source: hosted - version: "6.0.2" - easy_localization: - dependency: "direct main" - description: - name: easy_localization - sha256: "2ccdf9db8fe4d9c5a75c122e6275674508fd0f0d49c827354967b8afcc56bbed" - url: "https://pub.dev" - source: hosted - version: "3.0.8" - easy_logger: - dependency: transitive - description: - name: easy_logger - sha256: c764a6e024846f33405a2342caf91c62e357c24b02c04dbc712ef232bf30ffb7 - url: "https://pub.dev" - source: hosted - version: "0.0.2" - equatable: - dependency: transitive - description: - name: equatable - sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" - url: "https://pub.dev" - source: hosted - version: "2.0.7" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - ffi: - dependency: transitive - description: - name: ffi - sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - file: - dependency: transitive - description: - name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" - source: hosted - version: "7.0.1" - file_picker: - dependency: "direct main" - description: - name: file_picker - sha256: e7e16c9d15c36330b94ca0e2ad8cb61f93cd5282d0158c09805aed13b5452f22 - url: "https://pub.dev" - source: hosted - version: "10.3.2" - file_selector_linux: - dependency: transitive - description: - name: file_selector_linux - sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" - url: "https://pub.dev" - source: hosted - version: "0.9.3+2" - file_selector_macos: - dependency: transitive - description: - name: file_selector_macos - sha256: "19124ff4a3d8864fdc62072b6a2ef6c222d55a3404fe14893a3c02744907b60c" - url: "https://pub.dev" - source: hosted - version: "0.9.4+4" - file_selector_platform_interface: - dependency: transitive - description: - name: file_selector_platform_interface - sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b - url: "https://pub.dev" - source: hosted - version: "2.6.2" - file_selector_windows: - dependency: transitive - description: - name: file_selector_windows - sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" - url: "https://pub.dev" - source: hosted - version: "0.9.3+4" - firebase_core: - dependency: "direct main" - description: - name: firebase_core - sha256: "7be63a3f841fc9663342f7f3a011a42aef6a61066943c90b1c434d79d5c995c5" - url: "https://pub.dev" - source: hosted - version: "3.15.2" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - sha256: "5dbc900677dcbe5873d22ad7fbd64b047750124f1f9b7ebe2a33b9ddccc838eb" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - sha256: "0ed0dc292e8f9ac50992e2394e9d336a0275b6ae400d64163fdf0a8a8b556c37" - url: "https://pub.dev" - source: hosted - version: "2.24.1" - firebase_messaging: - dependency: "direct main" - description: - name: firebase_messaging - sha256: "60be38574f8b5658e2f22b7e311ff2064bea835c248424a383783464e8e02fcc" - url: "https://pub.dev" - source: hosted - version: "15.2.10" - firebase_messaging_platform_interface: - dependency: transitive - description: - name: firebase_messaging_platform_interface - sha256: "685e1771b3d1f9c8502771ccc9f91485b376ffe16d553533f335b9183ea99754" - url: "https://pub.dev" - source: hosted - version: "4.6.10" - firebase_messaging_web: - dependency: transitive - description: - name: firebase_messaging_web - sha256: "0d1be17bc89ed3ff5001789c92df678b2e963a51b6fa2bdb467532cc9dbed390" - url: "https://pub.dev" - source: hosted - version: "3.10.10" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" - source: hosted - version: "1.1.1" - fl_chart: - dependency: "direct main" - description: - name: fl_chart - sha256: "577aeac8ca414c25333334d7c4bb246775234c0e44b38b10a82b559dd4d764e7" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_cache_manager: - dependency: transitive - description: - name: flutter_cache_manager - sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" - url: "https://pub.dev" - source: hosted - version: "3.4.1" - flutter_callkit_incoming: - dependency: "direct main" - description: - path: "." - ref: dev - resolved-ref: "4b5aa9798a77eaba1c1726c314c5de74cd37ad6d" - url: "https://github.com/hiennguyen92/flutter_callkit_incoming.git" - source: git - version: "2.5.8" - flutter_hooks: - dependency: transitive - description: - name: flutter_hooks - sha256: cde36b12f7188c85286fba9b38cc5a902e7279f36dd676967106c041dc9dde70 - url: "https://pub.dev" - source: hosted - version: "0.20.5" - flutter_inappwebview: - dependency: "direct main" - description: - name: flutter_inappwebview - sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5" - url: "https://pub.dev" - source: hosted - version: "6.1.5" - flutter_inappwebview_android: - dependency: transitive - description: - name: flutter_inappwebview_android - sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba" - url: "https://pub.dev" - source: hosted - version: "1.1.3" - flutter_inappwebview_internal_annotations: - dependency: transitive - description: - name: flutter_inappwebview_internal_annotations - sha256: "787171d43f8af67864740b6f04166c13190aa74a1468a1f1f1e9ee5b90c359cd" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - flutter_inappwebview_ios: - dependency: transitive - description: - name: flutter_inappwebview_ios - sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d" - url: "https://pub.dev" - source: hosted - version: "1.1.2" - flutter_inappwebview_macos: - dependency: transitive - description: - name: flutter_inappwebview_macos - sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1 - url: "https://pub.dev" - source: hosted - version: "1.1.2" - flutter_inappwebview_platform_interface: - dependency: transitive - description: - name: flutter_inappwebview_platform_interface - sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500 - url: "https://pub.dev" - source: hosted - version: "1.3.0+1" - flutter_inappwebview_web: - dependency: transitive - description: - name: flutter_inappwebview_web - sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598" - url: "https://pub.dev" - source: hosted - version: "1.1.2" - flutter_inappwebview_windows: - dependency: transitive - description: - name: flutter_inappwebview_windows - sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055" - url: "https://pub.dev" - source: hosted - version: "0.6.0" - flutter_ios_voip_kit_karmm: - dependency: "direct main" - description: - name: flutter_ios_voip_kit_karmm - sha256: "31a445d78aacacdf128a0354efb9f4e424285dfe4c0af3ea872e64f03e6f6bfc" - url: "https://pub.dev" - source: hosted - version: "0.8.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.dev" - source: hosted - version: "5.0.0" - flutter_local_notifications: - dependency: "direct main" - description: - name: flutter_local_notifications - sha256: a9966c850de5e445331b854fa42df96a8020066d67f125a5964cbc6556643f68 - url: "https://pub.dev" - source: hosted - version: "19.4.1" - flutter_local_notifications_linux: - dependency: transitive - description: - name: flutter_local_notifications_linux - sha256: e3c277b2daab8e36ac5a6820536668d07e83851aeeb79c446e525a70710770a5 - url: "https://pub.dev" - source: hosted - version: "6.0.0" - flutter_local_notifications_platform_interface: - dependency: transitive - description: - name: flutter_local_notifications_platform_interface - sha256: "277d25d960c15674ce78ca97f57d0bae2ee401c844b6ac80fcd972a9c99d09fe" - url: "https://pub.dev" - source: hosted - version: "9.1.0" - flutter_local_notifications_windows: - dependency: transitive - description: - name: flutter_local_notifications_windows - sha256: ed46d7ae4ec9d19e4c8fa2badac5fe27ba87a3fe387343ce726f927af074ec98 - url: "https://pub.dev" - source: hosted - version: "1.0.2" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31 - url: "https://pub.dev" - source: hosted - version: "2.0.30" - flutter_rating_bar: - dependency: "direct main" - description: - name: flutter_rating_bar - sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 - url: "https://pub.dev" - source: hosted - version: "4.0.1" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - sha256: cd57f7969b4679317c17af6fd16ee233c1e60a82ed209d8a475c54fd6fd6f845 - url: "https://pub.dev" - source: hosted - version: "2.2.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_zoom_videosdk: - dependency: "direct main" - description: - name: flutter_zoom_videosdk - sha256: "46a4dea664b1c969099328a499c198a1755adf9ac333dea28bea5187910b3bf9" - url: "https://pub.dev" - source: hosted - version: "2.1.10" - fluttertoast: - dependency: "direct main" - description: - name: fluttertoast - sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1" - url: "https://pub.dev" - source: hosted - version: "8.2.12" - geoclue: - dependency: transitive - description: - name: geoclue - sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f - url: "https://pub.dev" - source: hosted - version: "0.1.1" - geolocator: - dependency: "direct main" - description: - name: geolocator - sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" - url: "https://pub.dev" - source: hosted - version: "14.0.2" - geolocator_android: - dependency: transitive - description: - name: geolocator_android - sha256: "179c3cb66dfa674fc9ccbf2be872a02658724d1c067634e2c427cf6df7df901a" - url: "https://pub.dev" - source: hosted - version: "5.0.2" - geolocator_apple: - dependency: transitive - description: - name: geolocator_apple - sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 - url: "https://pub.dev" - source: hosted - version: "2.3.13" - geolocator_linux: - dependency: transitive - description: - name: geolocator_linux - sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3 - url: "https://pub.dev" - source: hosted - version: "0.2.3" - geolocator_platform_interface: - dependency: transitive - description: - name: geolocator_platform_interface - sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" - url: "https://pub.dev" - source: hosted - version: "4.2.6" - geolocator_web: - dependency: transitive - description: - name: geolocator_web - sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 - url: "https://pub.dev" - source: hosted - version: "4.1.3" - geolocator_windows: - dependency: transitive - description: - name: geolocator_windows - sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" - url: "https://pub.dev" - source: hosted - version: "0.2.5" - google_maps: - dependency: transitive - description: - name: google_maps - sha256: "4d6e199c561ca06792c964fa24b2bac7197bf4b401c2e1d23e345e5f9939f531" - url: "https://pub.dev" - source: hosted - version: "8.1.1" - google_maps_flutter: - dependency: "direct main" - description: - name: google_maps_flutter - sha256: e1805e5a5885bd14a1c407c59229f478af169bf4d04388586b19f53145a5db3a - url: "https://pub.dev" - source: hosted - version: "2.12.3" - google_maps_flutter_android: - dependency: transitive - description: - name: google_maps_flutter_android - sha256: a6c9d43f6a944ff4bae5c3deb34817970ac3d591dcd7f5bd2ea450ab9e9c514a - url: "https://pub.dev" - source: hosted - version: "2.18.2" - google_maps_flutter_ios: - dependency: transitive - description: - name: google_maps_flutter_ios - sha256: ca02463b19a9abc7d31fcaf22631d021d647107467f741b917a69fa26659fd75 - url: "https://pub.dev" - source: hosted - version: "2.15.5" - google_maps_flutter_platform_interface: - dependency: transitive - description: - name: google_maps_flutter_platform_interface - sha256: f4b9b44f7b12a1f6707ffc79d082738e0b7e194bf728ee61d2b3cdf5fdf16081 - url: "https://pub.dev" - source: hosted - version: "2.14.0" - google_maps_flutter_web: - dependency: transitive - description: - name: google_maps_flutter_web - sha256: "9d57993ba29b80bb637bb7b9784159ca93071d5940e4d0383ae2358ad371e375" - url: "https://pub.dev" - source: hosted - version: "0.5.13" - gsettings: - dependency: transitive - description: - name: gsettings - sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" - url: "https://pub.dev" - source: hosted - version: "0.2.8" - health: - dependency: "direct main" - description: - name: health - sha256: "996664904194b8e0a09dfe761e168fdbf9ef43c51e7de39cd075de71c7258ada" - url: "https://pub.dev" - source: hosted - version: "13.1.3" - html: - dependency: transitive - description: - name: html - sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.dev" - source: hosted - version: "0.15.6" - http: - dependency: "direct main" - description: - name: http - sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 - url: "https://pub.dev" - source: hosted - version: "1.5.0" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" - source: hosted - version: "4.1.2" - image_picker: - dependency: "direct main" - description: - name: image_picker - sha256: "736eb56a911cf24d1859315ad09ddec0b66104bc41a7f8c5b96b4e2620cf5041" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - image_picker_android: - dependency: transitive - description: - name: image_picker_android - sha256: "28f3987ca0ec702d346eae1d90eda59603a2101b52f1e234ded62cff1d5cfa6e" - url: "https://pub.dev" - source: hosted - version: "0.8.13+1" - image_picker_for_web: - dependency: transitive - description: - name: image_picker_for_web - sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" - url: "https://pub.dev" - source: hosted - version: "3.1.0" - image_picker_ios: - dependency: transitive - description: - name: image_picker_ios - sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e - url: "https://pub.dev" - source: hosted - version: "0.8.13" - image_picker_linux: - dependency: transitive - description: - name: image_picker_linux - sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" - url: "https://pub.dev" - source: hosted - version: "0.2.2" - image_picker_macos: - dependency: transitive - description: - name: image_picker_macos - sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04 - url: "https://pub.dev" - source: hosted - version: "0.2.2" - image_picker_platform_interface: - dependency: transitive - description: - name: image_picker_platform_interface - sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665" - url: "https://pub.dev" - source: hosted - version: "2.11.0" - image_picker_windows: - dependency: transitive - description: - name: image_picker_windows - sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae - url: "https://pub.dev" - source: hosted - version: "0.2.2" - injector: - dependency: "direct main" - description: - name: injector - sha256: d692c37788872bfd4bd7c01b864b0712190a25ae5a346431ff69949d5728a2e1 - url: "https://pub.dev" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev" - source: hosted - version: "0.20.2" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" - source: hosted - version: "4.9.0" - just_audio: - dependency: "direct main" - description: - name: just_audio - sha256: "679637a3ec5b6e00f36472f5a3663667df00ee4822cbf5dafca0f568c710960a" - url: "https://pub.dev" - source: hosted - version: "0.10.4" - just_audio_platform_interface: - dependency: transitive - description: - name: just_audio_platform_interface - sha256: "2532c8d6702528824445921c5ff10548b518b13f808c2e34c2fd54793b999a6a" - url: "https://pub.dev" - source: hosted - version: "4.6.0" - just_audio_web: - dependency: transitive - description: - name: just_audio_web - sha256: "6ba8a2a7e87d57d32f0f7b42856ade3d6a9fbe0f1a11fabae0a4f00bb73f0663" - url: "https://pub.dev" - source: hosted - version: "0.4.16" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" - url: "https://pub.dev" - source: hosted - version: "10.0.9" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 - url: "https://pub.dev" - source: hosted - version: "3.0.9" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev" - source: hosted - version: "3.0.1" - lints: - dependency: transitive - description: - name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://pub.dev" - source: hosted - version: "5.1.1" - local_auth: - dependency: "direct main" - description: - name: local_auth - sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - local_auth_android: - dependency: transitive - description: - name: local_auth_android - sha256: "48924f4a8b3cc45994ad5993e2e232d3b00788a305c1bf1c7db32cef281ce9a3" - url: "https://pub.dev" - source: hosted - version: "1.0.52" - local_auth_darwin: - dependency: transitive - description: - name: local_auth_darwin - sha256: "0e9706a8543a4a2eee60346294d6a633dd7c3ee60fae6b752570457c4ff32055" - url: "https://pub.dev" - source: hosted - version: "1.6.0" - local_auth_platform_interface: - dependency: transitive - description: - name: local_auth_platform_interface - sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a" - url: "https://pub.dev" - source: hosted - version: "1.0.10" - local_auth_windows: - dependency: transitive - description: - name: local_auth_windows - sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 - url: "https://pub.dev" - source: hosted - version: "1.0.11" - logger: - dependency: "direct main" - description: - name: logger - sha256: "55d6c23a6c15db14920e037fe7e0dc32e7cdaf3b64b4b25df2d541b5b6b81c0c" - url: "https://pub.dev" - source: hosted - version: "2.6.1" - lottie: - dependency: "direct main" - description: - name: lottie - sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950 - url: "https://pub.dev" - source: hosted - version: "3.3.1" - manage_calendar_events: - dependency: "direct main" - description: - name: manage_calendar_events - sha256: f17600fcb7dc7047120c185993045e493d686930237b4e3c2689c26a64513d66 - url: "https://pub.dev" - source: hosted - version: "2.0.3" - matcher: - dependency: transitive - description: - name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.dev" - source: hosted - version: "0.12.17" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" - source: hosted - version: "0.11.1" - meta: - dependency: transitive - description: - name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.dev" - source: hosted - version: "1.16.0" - mime: - dependency: transitive - description: - name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - nm: - dependency: transitive - description: - name: nm - sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" - url: "https://pub.dev" - source: hosted - version: "0.5.0" - octo_image: - dependency: transitive - description: - name: octo_image - sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - package_info_plus: - dependency: transitive - description: - name: package_info_plus - sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" - url: "https://pub.dev" - source: hosted - version: "8.3.1" - package_info_plus_platform_interface: - dependency: transitive - description: - name: package_info_plus_platform_interface - sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - path_provider: - dependency: transitive - description: - name: path_provider - sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev" - source: hosted - version: "2.1.5" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "993381400e94d18469750e5b9dcb8206f15bc09f9da86b9e44a9b0092a0066db" - url: "https://pub.dev" - source: hosted - version: "2.2.18" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd" - url: "https://pub.dev" - source: hosted - version: "2.4.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" - source: hosted - version: "2.2.1" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" - source: hosted - version: "2.3.0" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 - url: "https://pub.dev" - source: hosted - version: "12.0.1" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" - url: "https://pub.dev" - source: hosted - version: "13.0.1" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 - url: "https://pub.dev" - source: hosted - version: "9.4.7" - permission_handler_html: - dependency: transitive - description: - name: permission_handler_html - sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.dev" - source: hosted - version: "0.1.3+5" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 - url: "https://pub.dev" - source: hosted - version: "4.3.0" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.dev" - source: hosted - version: "0.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" - url: "https://pub.dev" - source: hosted - version: "7.0.1" - platform: - dependency: transitive - description: - name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" - source: hosted - version: "3.1.6" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - posix: - dependency: transitive - description: - name: posix - sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" - url: "https://pub.dev" - source: hosted - version: "6.0.3" - provider: - dependency: "direct main" - description: - name: provider - sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" - url: "https://pub.dev" - source: hosted - version: "6.1.5+1" - rrule: - dependency: transitive - description: - name: rrule - sha256: b7425410c594d4b6717c9f17ec8ef83c9d1ff2e513c428a135b5924fc2e8e045 - url: "https://pub.dev" - source: hosted - version: "0.2.17" - rxdart: - dependency: transitive - description: - name: rxdart - sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" - url: "https://pub.dev" - source: hosted - version: "0.28.0" - sanitize_html: - dependency: transitive - description: - name: sanitize_html - sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - share_plus: - dependency: "direct main" - description: - name: share_plus - sha256: d7dc0630a923883c6328ca31b89aa682bacbf2f8304162d29f7c6aaff03a27a1 - url: "https://pub.dev" - source: hosted - version: "11.1.0" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - shared_preferences: - dependency: "direct main" - description: - name: shared_preferences - sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.dev" - source: hosted - version: "2.5.3" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: a2608114b1ffdcbc9c120eb71a0e207c71da56202852d4aab8a5e30a82269e74 - url: "https://pub.dev" - source: hosted - version: "2.4.12" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.dev" - source: hosted - version: "2.5.4" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" - source: hosted - version: "2.4.3" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shimmer: - dependency: "direct main" - description: - name: shimmer - sha256: "5f88c883a22e9f9f299e5ba0e4f7e6054857224976a5d9f839d4ebdc94a14ac9" - url: "https://pub.dev" - source: hosted - version: "3.0.0" - sizer: - dependency: "direct main" - description: - name: sizer - sha256: "9963c89e4d30d7c2108de3eafc0a7e6a4a8009799376ea6be5ef0a9ad87cfbad" - url: "https://pub.dev" - source: hosted - version: "3.1.3" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - source_span: - dependency: transitive - description: - name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.dev" - source: hosted - version: "1.10.1" - sprintf: - dependency: transitive - description: - name: sprintf - sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - sqflite: - dependency: transitive - description: - name: sqflite - sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 - url: "https://pub.dev" - source: hosted - version: "2.4.2" - sqflite_android: - dependency: transitive - description: - name: sqflite_android - sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - sqflite_common: - dependency: transitive - description: - name: sqflite_common - sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" - url: "https://pub.dev" - source: hosted - version: "2.5.6" - sqflite_darwin: - dependency: transitive - description: - name: sqflite_darwin - sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" - url: "https://pub.dev" - source: hosted - version: "2.4.2" - sqflite_platform_interface: - dependency: transitive - description: - name: sqflite_platform_interface - sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.dev" - source: hosted - version: "2.4.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - stream_transform: - dependency: transitive - description: - name: stream_transform - sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.dev" - source: hosted - version: "2.1.1" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - syncfusion_flutter_calendar: - dependency: "direct main" - description: - name: syncfusion_flutter_calendar - sha256: "8e8a4eef01d6a82ae2c17e76d497ff289ded274de014c9f471ffabc12d1e2e71" - url: "https://pub.dev" - source: hosted - version: "30.2.7" - syncfusion_flutter_core: - dependency: transitive - description: - name: syncfusion_flutter_core - sha256: bfd026c0f9822b49ff26fed11cd3334519acb6a6ad4b0c81d9cd18df6af1c4c0 - url: "https://pub.dev" - source: hosted - version: "30.2.7" - syncfusion_flutter_datepicker: - dependency: transitive - description: - name: syncfusion_flutter_datepicker - sha256: b5f35cc808e91b229d41613efe71dadab1549a35bfd493f922fc06ccc2fe908c - url: "https://pub.dev" - source: hosted - version: "30.2.7" - syncfusion_localizations: - dependency: transitive - description: - name: syncfusion_localizations - sha256: bb32b07879b4c1dee5d4c8ad1c57343a4fdae55d65a87f492727c11b68f23164 - url: "https://pub.dev" - source: hosted - version: "30.2.7" - synchronized: - dependency: transitive - description: - name: synchronized - sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 - url: "https://pub.dev" - source: hosted - version: "3.4.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd - url: "https://pub.dev" - source: hosted - version: "0.7.4" - time: - dependency: transitive - description: - name: time - sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" - url: "https://pub.dev" - source: hosted - version: "2.1.5" - timezone: - dependency: transitive - description: - name: timezone - sha256: dd14a3b83cfd7cb19e7888f1cbc20f258b8d71b54c06f79ac585f14093a287d1 - url: "https://pub.dev" - source: hosted - version: "0.10.1" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - url_launcher: - dependency: "direct main" - description: - name: url_launcher - sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 - url: "https://pub.dev" - source: hosted - version: "6.3.2" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - sha256: "69ee86740f2847b9a4ba6cffa74ed12ce500bbe2b07f3dc1e643439da60637b7" - url: "https://pub.dev" - source: hosted - version: "6.3.18" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7 - url: "https://pub.dev" - source: hosted - version: "6.3.4" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f - url: "https://pub.dev" - source: hosted - version: "3.2.3" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" - url: "https://pub.dev" - source: hosted - version: "3.1.4" - uuid: - dependency: "direct main" - description: - name: uuid - sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff - url: "https://pub.dev" - source: hosted - version: "4.5.1" - vector_graphics: - dependency: transitive - description: - name: vector_graphics - sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 - url: "https://pub.dev" - source: hosted - version: "1.1.19" - vector_graphics_codec: - dependency: transitive - description: - name: vector_graphics_codec - sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" - url: "https://pub.dev" - source: hosted - version: "1.1.13" - vector_graphics_compiler: - dependency: transitive - description: - name: vector_graphics_compiler - sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc - url: "https://pub.dev" - source: hosted - version: "1.1.19" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 - url: "https://pub.dev" - source: hosted - version: "15.0.0" - web: - dependency: "direct main" - description: - name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - win32: - dependency: transitive - description: - name: win32 - sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" - url: "https://pub.dev" - source: hosted - version: "5.14.0" - win32_registry: - dependency: transitive - description: - name: win32_registry - sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - xml: - dependency: transitive - description: - name: xml - sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.dev" - source: hosted - version: "6.6.1" -sdks: - dart: ">=3.8.0 <4.0.0" - flutter: ">=3.29.0" diff --git a/pubspec.yaml b/pubspec.yaml index db3d25e..3d6604c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,13 +30,13 @@ dependencies: # firebase_core: ^3.13.1 permission_handler: ^12.0.1 flutter_local_notifications: ^19.4.1 - injector: ^4.0.0 provider: ^6.1.5+1 + get_it: ^8.2.0 just_audio: ^0.10.4 - flutter_callkit_incoming: - git: - url: https://github.com/hiennguyen92/flutter_callkit_incoming.git - ref: dev + # flutter_callkit_incoming: + # git: + # url: https://github.com/hiennguyen92/flutter_callkit_incoming.git + # ref: dev url_launcher: ^6.3.2 logger: ^2.6.1 lottie: ^3.3.1 @@ -55,13 +55,40 @@ dependencies: uuid: ^4.5.1 health: ^13.1.3 # health: 12.0.1 - fl_chart: ^1.0.0 + fl_chart: 1.0.0 geolocator: ^14.0.2 dropdown_search: ^6.0.2 - google_maps_flutter: ^2.12.3 + google_maps_flutter: ^2.13.1 flutter_zoom_videosdk: ^2.1.10 - + dartz: ^0.10.1 + equatable: ^2.0.7 + google_api_availability: ^5.0.1 + firebase_analytics: ^11.5.1 + jiffy: ^6.4.3 + hijri_gregorian_calendar: ^0.1.1 + sms_otp_auto_verify: ^2.2.0 web: any + flutter_staggered_animations: ^1.1.1 + smooth_corner: ^1.1.1 + maps_launcher: ^3.0.0+1 + amazon_payfort: ^1.1.4 + network_info_plus: ^6.1.4 + flutter_nfc_kit: ^3.6.0 + barcode_scan2: ^4.5.1 + keyboard_actions: ^4.2.0 + path_provider: ^2.0.8 + open_filex: ^4.7.0 + flutter_swiper_view: ^1.1.8 + + location: ^8.0.1 + gms_check: ^1.0.4 + huawei_location: ^6.14.2+301 + intl: ^0.20.2 + flutter_widget_from_html: ^0.17.1 + huawei_map: + git: + url: https://github.com/fleoparra/hms-flutter-plugin.git + path: flutter-hms-map dev_dependencies: flutter_test: @@ -73,6 +100,46 @@ flutter: uses-material-design: true assets: - assets/ + - assets/json/ + - assets/fonts/ - assets/langs/ - assets/images/ - - assets/images/new/ + - assets/images/png/body_parts/male/ + - assets/images/png/body_parts/female/ + - assets/images/svg/ + - assets/images/png/ + - assets/animations/ + - assets/animations/lottie/ + + fonts: + - family: Poppins + fonts: + # - asset: assets/fonts/poppins/Poppins-Black.ttf + # weight: 900 + # - asset: assets/fonts/poppins/Poppins-ExtraBold.ttf + # weight: 800 + # - asset: assets/fonts/poppins/Poppins-Bold.ttf + # weight: 700 + - asset: assets/fonts/poppins/Poppins-SemiBold.ttf + weight: 600 + - asset: assets/fonts/poppins/Poppins-Medium.ttf + weight: 500 + - asset: assets/fonts/poppins/Poppins-Regular.ttf + weight: 400 + - asset: assets/fonts/poppins/Poppins-Light.ttf + weight: 300 + # - asset: assets/fonts/poppins/Poppins-ExtraLight.ttf + # weight: 200 + # - asset: assets/fonts/poppins/Poppins-Thin.ttf + # weight: 100 + + + - family: GESSTwo + fonts: + - asset: assets/fonts/gess_two/GE_SS_Two_Bold.otf + weight: 600 + - asset: assets/fonts/gess_two/GE_SS_Two_Medium.otf + weight: 500 + - asset: assets/fonts/gess_two/GE_SS_Two_Light.otf + weight: 400 +